]> arthur.barton.de Git - netatalk.git/blob - etc/afpd/messages.c
982a706488e527163adc0e161fdc925a6ae859fd
[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 #include <stdio.h>
6 #include <string.h>
7 #include <atalk/afp.h>
8 #include "globals.h"
9 #include "misc.h"
10
11 #define MAXMESGSIZE 199
12
13 /* this is only used by afpd children, so it's okay. */
14 static char servermesg[MAXMESGSIZE] = "";
15
16 void setmessage(const char *message)
17 {
18   strncpy(servermesg, message, MAXMESGSIZE);
19 }
20
21 int afp_getsrvrmesg(obj, ibuf, ibuflen, rbuf, rbuflen)
22      AFPObj *obj;
23      char *ibuf, *rbuf;
24      int ibuflen, *rbuflen;
25 {
26   char *message;
27   u_int16_t type, bitmap;
28
29   memcpy(&type, ibuf + 2, sizeof(type));
30   memcpy(&bitmap, ibuf + 4, sizeof(bitmap));
31
32   switch (ntohs(type)) {
33   case AFPMESG_LOGIN: /* login */
34     message = obj->options.loginmesg;
35     break;
36   case AFPMESG_SERVER: /* server */
37     message = servermesg;
38     break;
39   default:
40     *rbuflen = 0;
41     return AFPERR_BITMAP;
42   }
43
44   /* output format:
45    * message type:   2 bytes
46    * bitmap:         2 bytes
47    * message length: 1 byte
48    * message:        up to 199 bytes
49    */
50   memcpy(rbuf, &type, sizeof(type));
51   rbuf += sizeof(type);
52   memcpy(rbuf, &bitmap, sizeof(bitmap));
53   rbuf += sizeof(bitmap);
54   *rbuflen = strlen(message);
55   if (*rbuflen > MAXMESGSIZE)
56     *rbuflen = MAXMESGSIZE;
57   *rbuf++ = *rbuflen;
58   memcpy(rbuf, message, *rbuflen);
59
60   *rbuflen += 5;
61
62   return AFP_OK;
63 }