2 * $Id: messages.c,v 1.12 2002-01-03 17:29:10 sibaz Exp $
4 * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
5 * All Rights Reserved. See COPYRIGHT.
10 #endif /* HAVE_CONFIG_H */
14 #include <atalk/afp.h>
18 #endif /* HAVE_UNISTD_H */
22 #define MAXMESGSIZE 199
24 /* this is only used by afpd children, so it's okay. */
25 static char servermesg[MAXMESGSIZE] = "";
27 void setmessage(const char *message)
29 strncpy(servermesg, message, MAXMESGSIZE);
32 void readmessage(void)
34 /* Read server message from file defined as SERVERTEXT */
43 /* Construct file name SERVERTEXT/message.[pid] */
44 filename=malloc(sizeof(SERVERTEXT)+15);
45 sprintf(filename, "%s/message.%d", SERVERTEXT, getpid());
48 syslog(LOG_DEBUG, "Reading file %s ", filename);
51 message=fopen(filename, "r");
53 syslog(LOG_INFO, "Unable to open file %s", filename);
54 sprintf(filename, "%s/message", SERVERTEXT);
55 message=fopen(filename, "r");
58 /* if either message.pid or message exists */
60 /* added while loop to get characters and put in servermesg */
61 while ((( c=fgetc(message)) != EOF) && (i < (MAXMESGSIZE - 1))) {
62 if ( c == '\n') c = ' ';
70 /* Save effective uid and switch to root to delete file. */
71 /* Delete will probably fail otherwise, but let's try anyways */
74 syslog(LOG_ERR, "Could not switch back to root: %m");
77 rc = unlink(filename);
79 /* Drop privs again, failing this is very bad */
80 if (seteuid(euid) < 0) {
81 syslog(LOG_ERR, "Could not switch back to uid %d: %m", euid);
85 syslog(LOG_ERR, "Error deleting %s: %m", filename);
89 syslog(LOG_INFO, "Deleted %s", filename);
92 syslog(LOG_INFO, "Set server message to \"%s\"", servermesg);
96 #endif /* SERVERTEXT */
99 int afp_getsrvrmesg(obj, ibuf, ibuflen, rbuf, rbuflen)
102 int ibuflen, *rbuflen;
105 u_int16_t type, bitmap;
107 memcpy(&type, ibuf + 2, sizeof(type));
108 memcpy(&bitmap, ibuf + 4, sizeof(bitmap));
110 switch (ntohs(type)) {
111 case AFPMESG_LOGIN: /* login */
112 message = obj->options.loginmesg;
114 case AFPMESG_SERVER: /* server */
115 message = servermesg;
119 return AFPERR_BITMAP;
123 * message type: 2 bytes
125 * message length: 1 byte
126 * message: up to 199 bytes
128 memcpy(rbuf, &type, sizeof(type));
129 rbuf += sizeof(type);
130 memcpy(rbuf, &bitmap, sizeof(bitmap));
131 rbuf += sizeof(bitmap);
132 *rbuflen = strlen(message);
133 if (*rbuflen > MAXMESGSIZE)
134 *rbuflen = MAXMESGSIZE;
136 memcpy(rbuf, message, *rbuflen);