static void status_flags(char *data, const int notif, const int ipok,
const unsigned char passwdbits, const int dirsrvcs _U_, int flags)
{
- u_int16_t status;
+ uint16_t status;
+
+ status = AFPSRVRINFO_COPY
+ | AFPSRVRINFO_SRVSIGNATURE
+ | AFPSRVRINFO_SRVMSGS
+ | AFPSRVRINFO_FASTBOZO
+ | AFPSRVRINFO_SRVRDIR
+ | AFPSRVRINFO_SRVUTF8
+ | AFPSRVRINFO_EXTSLEEP;
- status = AFPSRVRINFO_COPY;
if (passwdbits & PASSWD_SET) /* some uams may not allow this. */
status |= AFPSRVRINFO_PASSWD;
if (passwdbits & PASSWD_NOSAVE)
status |= AFPSRVRINFO_NOSAVEPASSWD;
- status |= AFPSRVRINFO_SRVSIGNATURE;
- /* only advertise tcp/ip if we have a valid address */
- if (ipok)
+ if (ipok) /* only advertise tcp/ip if we have a valid address */
status |= AFPSRVRINFO_TCPIP;
- status |= AFPSRVRINFO_SRVMSGS;
- /* Allow the user to decide if we should support server notifications.
- * With this turned off, the clients will poll for directory changes every
- * 10 seconds. This might be too costly to network resources, so make
- * this an optional thing. Default will be to _not_ support server
- * notifications. */
- if (notif) {
+ if (notif) /* Default is yes */
status |= AFPSRVRINFO_SRVNOTIFY;
- }
- status |= AFPSRVRINFO_FASTBOZO;
- status |= AFPSRVRINFO_SRVRDIR; /* AFP 3.1 specs says we need to specify this, but may set the count to 0 */
- /* We don't set the UTF8 name flag here, we don't know whether we have enough space ... */
-
- if (flags & OPTION_UUID) /* 05122008 FIXME: can we set AFPSRVRINFO_UUID here ? see AFPSRVRINFO_SRVRDIR*/
- status |= AFPSRVRINFO_UUID;
+ if (flags & OPTION_UUID)
+ status |= AFPSRVRINFO_UUID;
status = htons(status);
memcpy(data + AFPSTATUS_FLAGOFF, &status, sizeof(status));
data += len;
offset = htons(offset);
memcpy(begin + *nameoffset, &offset, sizeof(u_int16_t));
-
- /* Now set the flag ... */
- memcpy(&status, begin + AFPSTATUS_FLAGOFF, sizeof(status));
- status = ntohs(status);
- status |= AFPSRVRINFO_SRVUTF8;
- status = htons(status);
- memcpy(begin + AFPSTATUS_FLAGOFF, &status, sizeof(status));
}
/* return length of buffer */
char *servername_conf;
int header = 0;
char buf[1024], *p;
- FILE *fp, *randomp;
+ FILE *fp = NULL, *randomp;
size_t len;
char *server_tmp;
server_signature_random:
/* generate signature from random number */
- if ((randomp = fopen("/dev/urandom", "r")) != NULL) { /* generate from /dev/urandom */
- for (i=0 ; i<16 ; i++) {
- (options->signature)[i] = fgetc(randomp);
- }
- LOG(log_note, logtype_afpd,
- "generate %s's signature %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X from /dev/urandom",
- server_tmp,
- (options->signature)[ 0], (options->signature)[ 1],
- (options->signature)[ 2], (options->signature)[ 3],
- (options->signature)[ 4], (options->signature)[ 5],
- (options->signature)[ 6], (options->signature)[ 7],
- (options->signature)[ 8], (options->signature)[ 9],
- (options->signature)[10], (options->signature)[11],
- (options->signature)[12], (options->signature)[13],
- (options->signature)[14], (options->signature)[15]);
-
- } else { /* genarate from random() because cannot open /dev/urandom */
- srandom((unsigned int)time(NULL) + (unsigned int)options + (unsigned int)server_tmp);
- for (i=0 ; i<16 ; i++) {
- (options->signature)[i] = random() & 0xFF;
- }
- LOG(log_note, logtype_afpd,
- "generate %s's signature %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X from random()",
- server_tmp,
- (options->signature)[ 0], (options->signature)[ 1],
- (options->signature)[ 2], (options->signature)[ 3],
- (options->signature)[ 4], (options->signature)[ 5],
- (options->signature)[ 6], (options->signature)[ 7],
- (options->signature)[ 8], (options->signature)[ 9],
- (options->signature)[10], (options->signature)[11],
- (options->signature)[12], (options->signature)[13],
- (options->signature)[14], (options->signature)[15]);
- }
+ randombytes(options->signature, 16);
- if (fp && header) { /* conf file is created or size=0 */
+ if (fp && header) { /* conf file is created or size=0 */
fprintf(fp, "# DON'T TOUCH NOR COPY THOUGHTLESSLY!\n");
fprintf(fp, "# This file is auto-generated by afpd.\n");
fprintf(fp, "# \n");