# -setuplog "afpdaemon log_maxdebug /var/log/netatalk-afp.log"
# -unsetuplog "default level file"
# -setuplog "default log_maxdebug"
-
+#
+# -signature { user:<text> | host }
+# Specify a server signature. This option is useful while
+# running multiple independent instances of afpd on one
+# machine (eg. in clustered environments, to provide fault
+# isolation etc.). "host" signature type allows afpd generating
+# signature automatically (based on machine primary IP address).
+# "user" signature type allows administrator to set up a signature
+# string manually. Examples: three servers running on one machine:
+# first -signature user:USERS
+# second -signature user:USERS
+# third -signature user:ADMINS
+# First two servers will act as one logical AFP service - if user logs in to
+# first one and then connects to second one, session will be automatically
+# redirected to the first one. But if client connects to first and then to third,
+# will be asked for password twice and will see resources of both servers.
+# Traditional method of signature generation causes two independent afpd instances
+# to have the same signature and thus cause clients to be redirected automatically
+# to server (s)he logged in first.
+
#
# Some examples:
#
/*
- * $Id: afp_options.c,v 1.27 2002-08-24 05:00:07 sibaz Exp $
+ * $Id: afp_options.c,v 1.28 2002-12-07 02:39:57 rlewczuk Exp $
*
* Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
* Copyright (c) 1990,1993 Regents of The University of Michigan.
free(opt->nlspath);
if (opt->passwdfile && (opt->passwdfile != save->passwdfile))
free(opt->passwdfile);
+ if (opt->signature && (opt->signature != save->signature))
+ free(opt->signature);
}
/* initialize options */
options->timeout = 4;
options->server_notif = 1;
options->authprintdir = NULL;
+ options->signature = "host";
options->umask = 0;
#ifdef ADMIN_GRP
options->admingid = 0;
options->port = atoi(c);
if ((c = getoption(buf, "-ddpaddr")))
atalk_aton(c, &options->ddpaddr);
+ if ((c = getoption(buf, "-signature")) && (opt = strdup(c)))
+ options->signature = opt;
/* do a little checking for the domain name. */
if ((c = getoption(buf, "-fqdn"))) {
/*
- * $Id: status.c,v 1.7 2002-02-06 21:58:50 jmarcus Exp $
+ * $Id: status.c,v 1.8 2002-12-07 02:39:57 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 <syslog.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 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) {
+ syslog( LOG_ERR, "Signature %s id not valid. Switching back to hostid.",
+ options->signature);
+ goto server_signature_hostid;
+ }
+ usersign = options->signature + 5;
+ if (strlen(usersign) < 3)
+ syslog( LOG_WARNING, "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;
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->hostname, options);
/* returns length */
c = status_netaddress(status, c, asp, dsi, options->fqdn);