]> arthur.barton.de Git - netatalk.git/blob - etc/afpd/messages.c
Renabled unlink call for server messaging to eliminate clutter. See docs for
[netatalk.git] / etc / afpd / messages.c
1 /* 
2  * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
3  * All Rights Reserved.  See COPYRIGHT.
4  */
5
6 #ifdef HAVE_CONFIG_H
7 #include "config.h"
8 #endif
9
10 #include <stdio.h>
11 #include <string.h>
12 #include <atalk/afp.h>
13 #include <syslog.h>
14 #include <unistd.h>
15 #include "globals.h"
16 #include "misc.h"
17
18 #define MAXMESGSIZE 199
19
20 /* this is only used by afpd children, so it's okay. */
21 static char servermesg[MAXMESGSIZE] = "";
22
23 void setmessage(const char *message)
24 {
25   strncpy(servermesg, message, MAXMESGSIZE);
26 }
27
28 void readmessage(void)
29 {
30 /* Read server message from file defined as SERVERTEXT */
31 #ifdef SERVERTEXT
32   FILE *message;
33   char * filename;
34   int i;
35   static int c;
36
37   i=0;
38   // Construct file name SERVERTEXT/message.[pid]
39   filename=malloc(sizeof(SERVERTEXT)+15);
40   sprintf(filename, "%s/message.%d", SERVERTEXT, getpid());
41
42   syslog (LOG_DEBUG, "Reading file %s ", filename);
43   
44   message=fopen(filename, "r");
45   if (message==NULL) {
46     syslog (LOG_INFO, "Unable to open file %s", filename);
47     sprintf(filename, "%s/message", SERVERTEXT);
48     message=fopen(filename, "r");
49   }
50
51   if (message!=NULL) /* if either message.pid or message exists */
52   {
53     /* added while loop to get characters and put in servermesg */
54     while ((( c=fgetc(message)) != EOF) && (i < (MAXMESGSIZE - 1))) {
55       if ( c == '\n')  c = ' ';
56       servermesg[i++] = c;
57       }
58     servermesg[i] = 0;
59
60     /* cleanup */
61     fclose(message);
62 /* Below code can be uncommented if you want to experiment with getting afpd
63 to delete the text file when it's done.  Currently, it doesn't work.  If you 
64 can get it to work, delete this comment and enable the code!  */
65     i=unlink (filename);
66     if (i)
67       syslog (LOG_INFO, "Error deleting %s: %m", filename);
68     else
69       syslog (LOG_DEBUG, "Deleted %s", filename);
70     free (filename);
71  
72     syslog (LOG_DEBUG, "Set server message to \"%s\"", servermesg);
73   }
74   free(filename);
75 #endif
76 }
77
78 int afp_getsrvrmesg(obj, ibuf, ibuflen, rbuf, rbuflen)
79      AFPObj *obj;
80      char *ibuf, *rbuf;
81      int ibuflen, *rbuflen;
82 {
83   char *message;
84   u_int16_t type, bitmap;
85
86   memcpy(&type, ibuf + 2, sizeof(type));
87   memcpy(&bitmap, ibuf + 4, sizeof(bitmap));
88
89   switch (ntohs(type)) {
90   case AFPMESG_LOGIN: /* login */
91     message = obj->options.loginmesg;
92     break;
93   case AFPMESG_SERVER: /* server */
94     message = servermesg;
95     break;
96   default:
97     *rbuflen = 0;
98     return AFPERR_BITMAP;
99   }
100
101   if(strlen(message)==0)
102     return AFP_OK;
103
104   /* output format:
105    * message type:   2 bytes
106    * bitmap:         2 bytes
107    * message length: 1 byte
108    * message:        up to 199 bytes
109    */
110   memcpy(rbuf, &type, sizeof(type));
111   rbuf += sizeof(type);
112   memcpy(rbuf, &bitmap, sizeof(bitmap));
113   rbuf += sizeof(bitmap);
114   *rbuflen = strlen(message);
115   if (*rbuflen > MAXMESGSIZE)
116     *rbuflen = MAXMESGSIZE;
117   *rbuf++ = *rbuflen;
118   memcpy(rbuf, message, *rbuflen);
119
120   *rbuflen += 5;
121
122   return AFP_OK;
123 }