2 * $Id: messages.c,v 1.17 2003-06-02 06:54:23 didg Exp $
4 * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
5 * All Rights Reserved. See COPYRIGHT.
10 #endif /* HAVE_CONFIG_H */
16 #include <atalk/afp.h>
17 #include <atalk/logger.h>
20 #endif /* HAVE_UNISTD_H */
24 #define MAXMESGSIZE 199
26 /* this is only used by afpd children, so it's okay. */
27 static char servermesg[MAXMESGSIZE] = "";
29 void setmessage(const char *message)
31 strncpy(servermesg, message, MAXMESGSIZE);
34 void readmessage(void)
36 /* Read server message from file defined as SERVERTEXT */
45 /* Construct file name SERVERTEXT/message.[pid] */
46 if ( NULL == (filename=(char*) malloc(sizeof(SERVERTEXT)+15)) ) {
47 LOG(log_error, logtype_afpd, "readmessage: malloc: %s", strerror(errno) );
51 sprintf(filename, "%s/message.%d", SERVERTEXT, getpid());
54 LOG(log_debug, logtype_afpd, "Reading file %s ", filename);
57 message=fopen(filename, "r");
59 LOG(log_info, logtype_afpd, "Unable to open file %s", filename);
60 sprintf(filename, "%s/message", SERVERTEXT);
61 message=fopen(filename, "r");
64 /* if either message.pid or message exists */
66 /* added while loop to get characters and put in servermesg */
67 while ((( c=fgetc(message)) != EOF) && (i < (MAXMESGSIZE - 1))) {
68 if ( c == '\n') c = ' ';
76 /* Save effective uid and switch to root to delete file. */
77 /* Delete will probably fail otherwise, but let's try anyways */
80 LOG(log_error, logtype_afpd, "Could not switch back to root: %s",
84 rc = unlink(filename);
86 /* Drop privs again, failing this is very bad */
87 if (seteuid(euid) < 0) {
88 LOG(log_error, logtype_afpd, "Could not switch back to uid %d: %s", euid, strerror(errno));
92 LOG(log_error, logtype_afpd, "Error deleting %s: %s", filename, strerror(rc));
96 LOG(log_info, logtype_afpd, "Deleted %s", filename);
99 LOG(log_info, logtype_afpd, "Set server message to \"%s\"", servermesg);
103 #endif /* SERVERTEXT */
106 int afp_getsrvrmesg(obj, ibuf, ibuflen, rbuf, rbuflen)
109 int ibuflen, *rbuflen;
112 u_int16_t type, bitmap;
114 memcpy(&type, ibuf + 2, sizeof(type));
115 memcpy(&bitmap, ibuf + 4, sizeof(bitmap));
117 switch (ntohs(type)) {
118 case AFPMESG_LOGIN: /* login */
119 message = obj->options.loginmesg;
121 case AFPMESG_SERVER: /* server */
122 message = servermesg;
126 return AFPERR_BITMAP;
130 * message type: 2 bytes
132 * message length: 1 byte
133 * message: up to 199 bytes
135 memcpy(rbuf, &type, sizeof(type));
136 rbuf += sizeof(type);
137 memcpy(rbuf, &bitmap, sizeof(bitmap));
138 rbuf += sizeof(bitmap);
139 *rbuflen = strlen(message);
140 if (*rbuflen > MAXMESGSIZE)
141 *rbuflen = MAXMESGSIZE;
143 memcpy(rbuf, message, *rbuflen);