]> arthur.barton.de Git - netatalk.git/blob - etc/afpd/messages.c
This adds server notification support beyond "the server will shut down in 5 minutes"
[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     /* sprintf (servermesg, "Server error:  unable to open %s.", filename);
50     */
51   }
52   else
53   {
54     /* added while loop to get characters and put in servermesg */
55     while ((( c=fgetc(message)) != EOF) && (i < (MAXMESGSIZE - 1))) {
56       if ( c == '\n')  c = ' ';
57       servermesg[i++] = c;
58       }
59     servermesg[i] = 0;
60
61     /* cleanup */
62     fclose(message);
63     i=unlink (filename);
64     if (i)
65       syslog (LOG_INFO, "Error deleting %s", filename);
66     else
67       syslog (LOG_DEBUG, "Deleted %s", filename);
68     free (filename);
69  
70     syslog (LOG_DEBUG, "Set server message to \"%s\"", servermesg);
71   }
72   free(filename);
73 #endif
74 }
75
76 int afp_getsrvrmesg(obj, ibuf, ibuflen, rbuf, rbuflen)
77      AFPObj *obj;
78      char *ibuf, *rbuf;
79      int ibuflen, *rbuflen;
80 {
81   char *message;
82   u_int16_t type, bitmap;
83
84   memcpy(&type, ibuf + 2, sizeof(type));
85   memcpy(&bitmap, ibuf + 4, sizeof(bitmap));
86
87   switch (ntohs(type)) {
88   case AFPMESG_LOGIN: /* login */
89     message = obj->options.loginmesg;
90     break;
91   case AFPMESG_SERVER: /* server */
92     message = servermesg;
93     break;
94   default:
95     *rbuflen = 0;
96     return AFPERR_BITMAP;
97   }
98
99   if(strlen(message)==0)
100     return AFP_OK;
101
102   /* output format:
103    * message type:   2 bytes
104    * bitmap:         2 bytes
105    * message length: 1 byte
106    * message:        up to 199 bytes
107    */
108   memcpy(rbuf, &type, sizeof(type));
109   rbuf += sizeof(type);
110   memcpy(rbuf, &bitmap, sizeof(bitmap));
111   rbuf += sizeof(bitmap);
112   *rbuflen = strlen(message);
113   if (*rbuflen > MAXMESGSIZE)
114     *rbuflen = MAXMESGSIZE;
115   *rbuf++ = *rbuflen;
116   memcpy(rbuf, message, *rbuflen);
117
118   *rbuflen += 5;
119
120   return AFP_OK;
121 }