2 * $Id: messages.c,v 1.16 2002-03-24 01:23:41 sibaz Exp $
4 * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
5 * All Rights Reserved. See COPYRIGHT.
10 #endif /* HAVE_CONFIG_H */
15 #include <atalk/afp.h>
16 #include <atalk/logger.h>
19 #endif /* HAVE_UNISTD_H */
23 #define MAXMESGSIZE 199
25 /* this is only used by afpd children, so it's okay. */
26 static char servermesg[MAXMESGSIZE] = "";
28 void setmessage(const char *message)
30 strncpy(servermesg, message, MAXMESGSIZE);
33 void readmessage(void)
35 /* Read server message from file defined as SERVERTEXT */
44 /* Construct file name SERVERTEXT/message.[pid] */
45 filename=malloc(sizeof(SERVERTEXT)+15);
46 sprintf(filename, "%s/message.%d", SERVERTEXT, getpid());
49 LOG(log_debug, logtype_afpd, "Reading file %s ", filename);
52 message=fopen(filename, "r");
54 LOG(log_info, logtype_afpd, "Unable to open file %s", filename);
55 sprintf(filename, "%s/message", SERVERTEXT);
56 message=fopen(filename, "r");
59 /* if either message.pid or message exists */
61 /* added while loop to get characters and put in servermesg */
62 while ((( c=fgetc(message)) != EOF) && (i < (MAXMESGSIZE - 1))) {
63 if ( c == '\n') c = ' ';
71 /* Save effective uid and switch to root to delete file. */
72 /* Delete will probably fail otherwise, but let's try anyways */
75 LOG(log_error, logtype_afpd, "Could not switch back to root: %s",
79 rc = unlink(filename);
81 /* Drop privs again, failing this is very bad */
82 if (seteuid(euid) < 0) {
83 LOG(log_error, logtype_afpd, "Could not switch back to uid %d: %s", euid, strerror(errno));
87 LOG(log_error, logtype_afpd, "Error deleting %s: %s", filename, strerror(rc));
91 LOG(log_info, logtype_afpd, "Deleted %s", filename);
94 LOG(log_info, logtype_afpd, "Set server message to \"%s\"", servermesg);
98 #endif /* SERVERTEXT */
101 int afp_getsrvrmesg(obj, ibuf, ibuflen, rbuf, rbuflen)
104 int ibuflen, *rbuflen;
107 u_int16_t type, bitmap;
109 memcpy(&type, ibuf + 2, sizeof(type));
110 memcpy(&bitmap, ibuf + 4, sizeof(bitmap));
112 switch (ntohs(type)) {
113 case AFPMESG_LOGIN: /* login */
114 message = obj->options.loginmesg;
116 case AFPMESG_SERVER: /* server */
117 message = servermesg;
121 return AFPERR_BITMAP;
125 * message type: 2 bytes
127 * message length: 1 byte
128 * message: up to 199 bytes
130 memcpy(rbuf, &type, sizeof(type));
131 rbuf += sizeof(type);
132 memcpy(rbuf, &bitmap, sizeof(bitmap));
133 rbuf += sizeof(bitmap);
134 *rbuflen = strlen(message);
135 if (*rbuflen > MAXMESGSIZE)
136 *rbuflen = MAXMESGSIZE;
138 memcpy(rbuf, message, *rbuflen);