2 * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
3 * All Rights Reserved. See COPYRIGHT.
12 #include <atalk/afp.h>
18 #define MAXMESGSIZE 199
20 /* this is only used by afpd children, so it's okay. */
21 static char servermesg[MAXMESGSIZE] = "";
23 void setmessage(const char *message)
25 strncpy(servermesg, message, MAXMESGSIZE);
28 void readmessage(void)
30 /* Read server message from file defined as SERVERTEXT */
39 // Construct file name SERVERTEXT/message.[pid]
40 filename=malloc(sizeof(SERVERTEXT)+15);
41 sprintf(filename, "%s/message.%d", SERVERTEXT, getpid());
44 syslog (LOG_DEBUG, "Reading file %s ", filename);
47 message=fopen(filename, "r");
49 syslog (LOG_INFO, "Unable to open file %s", filename);
50 sprintf(filename, "%s/message", SERVERTEXT);
51 message=fopen(filename, "r");
54 /* if either message.pid or message exists */
56 /* added while loop to get characters and put in servermesg */
57 while ((( c=fgetc(message)) != EOF) && (i < (MAXMESGSIZE - 1))) {
58 if ( c == '\n') c = ' ';
66 /* Save effective uid and switch to root to delete file. */
67 /* Delete will probably fail otherwise, but let's try anyways */
70 syslog(LOG_ERR, "Could not switch back to root: %m");
73 rc = unlink(filename);
75 /* Drop privs again, failing this is very bad */
76 if (seteuid(euid) < 0) {
77 syslog(LOG_ERR, "Could not switch back to uid %d: %m", euid);
81 syslog (LOG_ERR, "Error deleting %s: %m", filename);
85 syslog (LOG_INFO, "Deleted %s", filename);
88 syslog (LOG_INFO, "Set server message to \"%s\"", servermesg);
95 int afp_getsrvrmesg(obj, ibuf, ibuflen, rbuf, rbuflen)
98 int ibuflen, *rbuflen;
101 u_int16_t type, bitmap;
103 memcpy(&type, ibuf + 2, sizeof(type));
104 memcpy(&bitmap, ibuf + 4, sizeof(bitmap));
106 switch (ntohs(type)) {
107 case AFPMESG_LOGIN: /* login */
108 message = obj->options.loginmesg;
110 case AFPMESG_SERVER: /* server */
111 message = servermesg;
115 return AFPERR_BITMAP;
119 * message type: 2 bytes
121 * message length: 1 byte
122 * message: up to 199 bytes
124 memcpy(rbuf, &type, sizeof(type));
125 rbuf += sizeof(type);
126 memcpy(rbuf, &bitmap, sizeof(bitmap));
127 rbuf += sizeof(bitmap);
128 *rbuflen = strlen(message);
129 if (*rbuflen > MAXMESGSIZE)
130 *rbuflen = MAXMESGSIZE;
132 memcpy(rbuf, message, *rbuflen);