#ifdef UKERNEL
#include "afs/sysincludes.h"
#include "afsincludes.h"
+#include "des/des.h"
+#include "rx/rxkad.h"
+#include <netdb.h>
#else /* UKERNEL */
#include <sys/types.h>
#ifdef AFS_NT40_ENV
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
-#ifdef HAVE_STRING_H
#include <string.h>
-#else
-#ifdef HAVE_STRINGS_H
-#include <strings.h>
-#endif
-#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
+#include <rx/rxkad.h>
+#include <rx/rx.h>
#endif /* UKERNEL */
#include <afs/afsutil.h>
#include "cellconfig.h"
#include "keys.h"
#ifdef AFS_NT40_ENV
#ifdef AFS_AFSDB_ENV
+#include <cm.h>
+#include <cm_config.h>
/* cm_dns.h depends on cellconfig.h */
+#include <cm_nls.h>
#include <cm_dns.h>
#endif /* AFS_AFSDB_ENV */
#endif
+#include <rx/rx.h>
+#include <rx/rxkad.h>
+
static struct afsconf_servPair serviceTable[] = {
{"afs", 7000,},
{"afscb", 7001,},
#if defined(AFS_OSF_ENV)
ts = getservbyname(aname, "");
#else
- ts = getservbyname(aname, NULL);
+ ts = (struct servent *) getservbyname(aname, NULL);
#endif
if (ts) {
/* we found it in /etc/services, so we use this value */
static int
afsconf_Check(register struct afsconf_dir *adir)
{
- char tbuffer[256], *p;
+ char tbuffer[256];
+#ifdef AFS_NT40_ENV
+ char *p;
+#endif
struct stat tstat;
register afs_int32 code;
static int
afsconf_Touch(register struct afsconf_dir *adir)
{
- char tbuffer[256], *p;
+ char tbuffer[256];
#ifndef AFS_NT40_ENV
struct timeval tvp[2];
+#else
+ char *p;
#endif
adir->timeRead = 0; /* just in case */
return GetCellUnix(adir);
}
}
+
+/* The following procedures and structs are used on Windows only
+ * to enumerate the Cell information distributed within the
+ * Windows registry. (See src/WINNT/afsd/cm_config.c)
+ */
+typedef struct _cm_enumCellRegistry {
+ afs_uint32 client; /* non-zero if client query */
+ struct afsconf_dir *adir;
+} cm_enumCellRegistry_t;
+
+static long
+cm_serverConfigProc(void *rockp, struct sockaddr_in *addrp,
+ char *hostNamep, unsigned short rank)
+{
+ struct afsconf_cell *cellInfop = (struct afsconf_cell *)rockp;
+
+ if (cellInfop->numServers == MAXHOSTSPERCELL)
+ return 0;
+
+ cellInfop->hostAddr[cellInfop->numServers] = *addrp;
+ strncpy(cellInfop->hostName[cellInfop->numServers], hostNamep, MAXHOSTCHARS);
+ cellInfop->hostName[cellInfop->numServers][MAXHOSTCHARS-1] = '\0';
+ cellInfop->numServers++;
+
+ return 0;
+}
+
+static long
+cm_enumCellRegistryProc(void *rockp, char * cellNamep)
+{
+ long code;
+ cm_enumCellRegistry_t *enump = (cm_enumCellRegistry_t *)rockp;
+ char linkedName[256] = "";
+ int timeout = 0;
+ struct afsconf_entry *newEntry;
+
+
+ newEntry = malloc(sizeof(struct afsconf_entry));
+ if (newEntry == NULL)
+ return ENOMEM;
+ newEntry->cellInfo.numServers = 0;
+
+ code = cm_SearchCellRegistry(enump->client, cellNamep, NULL, linkedName, cm_serverConfigProc, &newEntry->cellInfo);
+ if (code == CM_ERROR_FORCE_DNS_LOOKUP)
+ code = cm_SearchCellByDNS(cellNamep, NULL, &timeout, cm_serverConfigProc, &newEntry->cellInfo);
+
+ if (code == 0) {
+ strncpy(newEntry->cellInfo.name, cellNamep, MAXCELLCHARS);
+ newEntry->cellInfo.name[MAXCELLCHARS-1];
+ if (linkedName[0])
+ newEntry->cellInfo.linkedCell = strdup(linkedName);
+ else
+ newEntry->cellInfo.linkedCell = NULL;
+ newEntry->cellInfo.timeout = timeout;
+ newEntry->cellInfo.flags = 0;
+
+ newEntry->next = enump->adir->entries;
+ enump->adir->entries = newEntry;
+ } else {
+ free(newEntry);
+ }
+ return code;
+}
#endif /* AFS_NT40_ENV */
afs_int32 i;
char tbuffer[256], tbuf1[256];
struct stat tstat;
+#ifdef AFS_NT40_ENV
+ cm_enumCellRegistry_t enumCellRegistry = {0, 0};
+#endif /* AFS_NT40_ENV */
/* figure out the local cell name */
#ifdef AFS_NT40_ENV
i = GetCellNT(adir);
+ enumCellRegistry.adir = adir;
#else
i = GetCellUnix(adir);
#endif
if (IsClientConfigDirectory(adir->name)) {
/* NT client config dir */
char *p;
+
+ enumCellRegistry.client = 1;
+
if (!afssw_GetClientCellServDBDir(&p)) {
strcompose(tbuffer, sizeof(tbuffer), p, "/",
AFSDIR_CELLSERVDB_FILE_NTCLIENT, NULL);
if (!tf) {
return -1;
}
+
+ /* The CellServDB file is now open.
+ * The following code parses the contents of the
+ * file and creates a list with the first cell entry
+ * in the CellServDB file at the end of the list.
+ *
+ * No checking is performed for duplicates.
+ * The side effects of this process are that duplicate
+ * entries appended to the end of the CellServDB file
+ * take precedence and are found in a shorter period
+ * of time.
+ */
+
while (1) {
tp = fgets(tbuffer, sizeof(tbuffer), tf);
if (!tp)
return -1;
}
i = curEntry->cellInfo.numServers;
- if (cell && !strcmp(cell, curEntry->cellInfo.name))
- code =
- ParseHostLine(tbuffer, &curEntry->cellInfo.hostAddr[i],
- curEntry->cellInfo.hostName[i], &clones[i]);
- else
- code =
- ParseHostLine(tbuffer, &curEntry->cellInfo.hostAddr[i],
- curEntry->cellInfo.hostName[i], 0);
- if (code) {
- if (code == AFSCONF_SYNTAX) {
- for (bp = tbuffer; *bp != '\n'; bp++) { /* Take out the <cr> from the buffer */
- if (!*bp)
- break;
+ if (i < MAXHOSTSPERCELL) {
+ if (cell && !strcmp(cell, curEntry->cellInfo.name))
+ code =
+ ParseHostLine(tbuffer,
+ &curEntry->cellInfo.hostAddr[i],
+ curEntry->cellInfo.hostName[i],
+ &clones[i]);
+ else
+ code =
+ ParseHostLine(tbuffer,
+ &curEntry->cellInfo.hostAddr[i],
+ curEntry->cellInfo.hostName[i], 0);
+
+ if (code) {
+ if (code == AFSCONF_SYNTAX) {
+ for (bp = tbuffer; *bp != '\n'; bp++) { /* Take out the <cr> from the buffer */
+ if (!*bp)
+ break;
+ }
+ *bp = '\0';
+ fprintf(stderr,
+ "Can't properly parse host line \"%s\" in configuration file %s\n",
+ tbuffer, tbuf1);
}
- *bp = '\0';
- fprintf(stderr,
- "Can't properly parse host line \"%s\" in configuration file %s\n",
- tbuffer, tbuf1);
+ free(curEntry);
+ fclose(tf);
+ afsconf_CloseInternal(adir);
+ return -1;
}
- free(curEntry);
- fclose(tf);
- afsconf_CloseInternal(adir);
- return -1;
+ curEntry->cellInfo.numServers = ++i;
+ } else {
+ fprintf(stderr,
+ "Too many hosts for cell %s in configuration file %s\n",
+ curEntry->cellInfo.name, tbuf1);
}
- curEntry->cellInfo.numServers = ++i;
}
}
fclose(tf); /* close the file now */
adir->entries = curEntry;
}
+#ifdef AFS_NT40_ENV
+ /*
+ * Windows maintains a CellServDB list in the Registry
+ * that supercedes the contents of the CellServDB file.
+ * Prepending these entries to the head of the list
+ * is sufficient to enforce the precedence.
+ */
+ cm_EnumerateCellRegistry( enumCellRegistry.client,
+ cm_enumCellRegistryProc,
+ &enumCellRegistry);
+#endif /* AFS_NT40_ENV */
+
/* Read in the alias list */
strcompose(tbuffer, 256, adir->name, "/", AFSDIR_CELLALIAS_FILE, NULL);
/* call aproc(entry, arock, adir) for all cells. Proc must return 0, or we'll stop early and return the code it returns */
int
afsconf_CellApply(struct afsconf_dir *adir,
- int (*aproc) (struct afsconf_cell * cell, char *arock,
- struct afsconf_dir * dir), char *arock)
+ int (*aproc) (struct afsconf_cell * cell, void *arock,
+ struct afsconf_dir * dir), void *arock)
{
register struct afsconf_entry *tde;
register afs_int32 code;
int
afsconf_CellAliasApply(struct afsconf_dir *adir,
int (*aproc) (struct afsconf_cellalias * alias,
- char *arock, struct afsconf_dir * dir),
- char *arock)
+ void *arock, struct afsconf_dir * dir),
+ void *arock)
{
register struct afsconf_aliasentry *tde;
register afs_int32 code;
struct afsconf_entry DNSce;
afs_int32 cellHostAddrs[AFSMAXCELLHOSTS];
char cellHostNames[AFSMAXCELLHOSTS][MAXHOSTCHARS];
+ unsigned short ipRanks[AFSMAXCELLHOSTS];
int numServers;
int rc;
int ttl;
DNSce.cellInfo.numServers = 0;
DNSce.next = NULL;
- rc = getAFSServer(acellName, cellHostAddrs, cellHostNames, &numServers,
+ rc = getAFSServer(acellName, cellHostAddrs, cellHostNames, ipRanks, &numServers,
&ttl);
/* ignore the ttl here since this code is only called by transitory programs
* like klog, etc. */
/* get latest key */
afs_int32
-afsconf_GetLatestKey(struct afsconf_dir * adir, afs_int32 * avno, char *akey)
+afsconf_GetLatestKey(struct afsconf_dir * adir, afs_int32 * avno,
+ struct ktc_encryptionKey *akey)
{
register int i;
int maxa;
/* get a particular key */
int
-afsconf_GetKey(struct afsconf_dir *adir, afs_int32 avno, char *akey)
+afsconf_GetKey(void *rock, int avno, struct ktc_encryptionKey *akey)
{
+ struct afsconf_dir *adir = (struct afsconf_dir *) rock;
register int i, maxa;
register struct afsconf_key *tk;
register afs_int32 code;