/*
- * $Id: status.c,v 1.7 2002-02-06 21:58:50 jmarcus Exp $
+ * $Id: status.c,v 1.9 2002-12-07 02:55:00 rlewczuk Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
+#include <atalk/logger.h>
#ifdef BSD4_4
#include <sys/param.h>
/* server signature is a 16-byte quantity */
static u_int16_t status_signature(char *data, int *servoffset, DSI *dsi,
- const char *hostname)
+ const struct afp_options *options)
{
char *status;
+ char *usersign, *ifaddr;
int i;
u_int16_t offset, sigoff;
long hostid;
/* jump to server signature offset */
data += offset;
+ /* Signature type is user string */
+ if (strncmp(options->signature, "user", 4) == 0) {
+ if (strlen(options->signature) <= 5) {
+ LOG(log_warning, logtype_afpd, "Signature %s id not valid. Switching back to hostid.",
+ options->signature);
+ goto server_signature_hostid;
+ }
+ usersign = options->signature + 5;
+ if (strlen(usersign) < 3)
+ LOG(log_warning, logtype_afpd, "Signature %s is very short !",
+ options->signature);
+
+ memset(data, 0, 16);
+ strncpy(data, usersign, 16);
+ data += 16;
+ goto server_signature_done;
+ } /* signature = user */
+
+ /* If signature type is a standard hostid... */
+server_signature_hostid:
/* 16-byte signature consists of copies of the hostid */
#if defined(BSD4_4) && defined(USE_GETHOSTID)
mib[0] = CTL_KERN;
else {
struct hostent *host;
- if ((host = gethostbyname(hostname)))
+ if ((host = gethostbyname(options->hostname)))
hostid = ((struct in_addr *) host->h_addr)->s_addr;
}
}
for (i = 0; i < 16; i += sizeof(hostid)) {
memcpy(data, &hostid, sizeof(hostid));
data += sizeof(hostid);
- }
+ }
+server_signature_done:
/* calculate net address offset */
*servoffset += sizeof(offset);
offset = htons(data - status);
else
status_icon(status, apple_atalk_icon, sizeof(apple_atalk_icon), c);
- sigoff = status_signature(status, &c, dsi, options->hostname);
+ sigoff = status_signature(status, &c, dsi, options);
/* returns length */
c = status_netaddress(status, c, asp, dsi, options->fqdn);