]> arthur.barton.de Git - netatalk.git/blob - etc/afpd/messages.c
added new type logtype_afpd
[netatalk.git] / etc / afpd / messages.c
1 /*
2  * $Id: messages.c,v 1.16 2002-03-24 01:23:41 sibaz Exp $
3  *
4  * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
5  * All Rights Reserved.  See COPYRIGHT.
6  */
7
8 #ifdef HAVE_CONFIG_H
9 #include "config.h"
10 #endif /* HAVE_CONFIG_H */
11
12 #include <stdio.h>
13 #include <string.h>
14 #include <errno.h>
15 #include <atalk/afp.h>
16 #include <atalk/logger.h>
17 #ifdef HAVE_UNISTD_H
18 #include <unistd.h>
19 #endif /* HAVE_UNISTD_H */
20 #include "globals.h"
21 #include "misc.h"
22
23 #define MAXMESGSIZE 199
24
25 /* this is only used by afpd children, so it's okay. */
26 static char servermesg[MAXMESGSIZE] = "";
27
28 void setmessage(const char *message)
29 {
30     strncpy(servermesg, message, MAXMESGSIZE);
31 }
32
33 void readmessage(void)
34 {
35     /* Read server message from file defined as SERVERTEXT */
36 #ifdef SERVERTEXT
37     FILE *message;
38     char * filename;
39     int i, rc;
40     static int c;
41     uid_t euid;
42
43     i=0;
44     /* Construct file name SERVERTEXT/message.[pid] */
45     filename=malloc(sizeof(SERVERTEXT)+15);
46     sprintf(filename, "%s/message.%d", SERVERTEXT, getpid());
47
48 #ifdef DEBUG
49     LOG(log_debug, logtype_afpd, "Reading file %s ", filename);
50 #endif /* DEBUG */
51
52     message=fopen(filename, "r");
53     if (message==NULL) {
54         LOG(log_info, logtype_afpd, "Unable to open file %s", filename);
55         sprintf(filename, "%s/message", SERVERTEXT);
56         message=fopen(filename, "r");
57     }
58
59     /* if either message.pid or message exists */
60     if (message!=NULL) {
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 = ' ';
64             servermesg[i++] = c;
65         }
66         servermesg[i] = 0;
67
68         /* cleanup */
69         fclose(message);
70
71         /* Save effective uid and switch to root to delete file. */
72         /* Delete will probably fail otherwise, but let's try anyways */
73         euid = geteuid();
74         if (seteuid(0) < 0) {
75             LOG(log_error, logtype_afpd, "Could not switch back to root: %s",
76                                 strerror(errno));
77         }
78
79         rc = unlink(filename);
80
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));
84         }
85
86         if (rc < 0) {
87             LOG(log_error, logtype_afpd, "Error deleting %s: %s", filename, strerror(rc));
88         }
89 #ifdef DEBUG
90         else {
91             LOG(log_info, logtype_afpd, "Deleted %s", filename);
92         }
93
94         LOG(log_info, logtype_afpd, "Set server message to \"%s\"", servermesg);
95 #endif /* DEBUG */
96     }
97     free(filename);
98 #endif /* SERVERTEXT */
99 }
100
101 int afp_getsrvrmesg(obj, ibuf, ibuflen, rbuf, rbuflen)
102 AFPObj *obj;
103 char *ibuf, *rbuf;
104 int ibuflen, *rbuflen;
105 {
106     char *message;
107     u_int16_t type, bitmap;
108
109     memcpy(&type, ibuf + 2, sizeof(type));
110     memcpy(&bitmap, ibuf + 4, sizeof(bitmap));
111
112     switch (ntohs(type)) {
113     case AFPMESG_LOGIN: /* login */
114         message = obj->options.loginmesg;
115         break;
116     case AFPMESG_SERVER: /* server */
117         message = servermesg;
118         break;
119     default:
120         *rbuflen = 0;
121         return AFPERR_BITMAP;
122     }
123
124     /* output format:
125      * message type:   2 bytes
126      * bitmap:         2 bytes
127      * message length: 1 byte
128      * message:        up to 199 bytes
129      */
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;
137     *rbuf++ = *rbuflen;
138     memcpy(rbuf, message, *rbuflen);
139
140     *rbuflen += 5;
141
142     return AFP_OK;
143 }