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);