]> arthur.barton.de Git - netatalk.git/blob - etc/afpd/messages.c
513378313ad4898eee53ee102720d7ef212781b1
[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 #ifdef DEBUG
43   syslog (LOG_DEBUG, "Reading file %s ", filename);
44 #endif
45   
46   message=fopen(filename, "r");
47   if (message==NULL) {
48     syslog (LOG_INFO, "Unable to open file %s", filename);
49     sprintf(filename, "%s/message", SERVERTEXT);
50     message=fopen(filename, "r");
51   }
52
53   if (message!=NULL) /* if either message.pid or message exists */
54   {
55     /* added while loop to get characters and put in servermesg */
56     while ((( c=fgetc(message)) != EOF) && (i < (MAXMESGSIZE - 1))) {
57       if ( c == '\n')  c = ' ';
58       servermesg[i++] = c;
59       }
60     servermesg[i] = 0;
61
62     /* cleanup */
63     fclose(message);
64 /* Below code can be uncommented if you want to experiment with getting afpd
65 to delete the text file when it's done.  Currently, it doesn't work.  If you 
66 can get it to work, delete this comment and enable the code!  */
67     i=unlink (filename);
68     if (i)
69       syslog (LOG_INFO, "Error deleting %s: %m", filename);
70 #ifdef DEBUG
71     else
72       syslog (LOG_INFO, "Deleted %s", filename);
73 #endif DEBUG
74     free (filename);
75 #ifdef DEBUG
76     syslog (LOG_INFO, "Set server message to \"%s\"", servermesg);
77 #endif
78   }
79   free(filename);
80 #endif
81 }
82
83 int afp_getsrvrmesg(obj, ibuf, ibuflen, rbuf, rbuflen)
84      AFPObj *obj;
85      char *ibuf, *rbuf;
86      int ibuflen, *rbuflen;
87 {
88   char *message;
89   u_int16_t type, bitmap;
90
91   memcpy(&type, ibuf + 2, sizeof(type));
92   memcpy(&bitmap, ibuf + 4, sizeof(bitmap));
93
94   switch (ntohs(type)) {
95   case AFPMESG_LOGIN: /* login */
96     message = obj->options.loginmesg;
97     break;
98   case AFPMESG_SERVER: /* server */
99     message = servermesg;
100     break;
101   default:
102     *rbuflen = 0;
103     return AFPERR_BITMAP;
104   }
105
106   if(strlen(message)==0)
107     return AFP_OK;
108
109   /* output format:
110    * message type:   2 bytes
111    * bitmap:         2 bytes
112    * message length: 1 byte
113    * message:        up to 199 bytes
114    */
115   memcpy(rbuf, &type, sizeof(type));
116   rbuf += sizeof(type);
117   memcpy(rbuf, &bitmap, sizeof(bitmap));
118   rbuf += sizeof(bitmap);
119   *rbuflen = strlen(message);
120   if (*rbuflen > MAXMESGSIZE)
121     *rbuflen = MAXMESGSIZE;
122   *rbuf++ = *rbuflen;
123   memcpy(rbuf, message, *rbuflen);
124
125   *rbuflen += 5;
126
127   return AFP_OK;
128 }