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