#include<afscred.h>
#include<dynimport.h>
#include<krb5common.h>
+#include<winsock2.h>
+#include<afs/cm.h>
#pragma warning (pop)
+static char *afs_realm_of_cell(afs_conf_cell *, BOOL);
+static long afs_get_cellconfig_callback(void *, struct sockaddr_in *, char *, unsigned short ipRank);
+static int afs_get_cellconfig(char *, afs_conf_cell *, char *);
+
BOOL
afs_is_running(void) {
DWORD CurrentState;
afs_get_cellconfig(char *cell, afs_conf_cell *cellconfig, char *local_cell)
{
int rc;
- int ttl;
+ int ttl = 0;
+ char linkedCell[MAXCELLCHARS]="";
local_cell[0] = (char)0;
memset(cellconfig, 0, sizeof(*cellconfig));
if (strlen(cell) == 0)
StringCbCopyA(cell, (MAXCELLCHARS+1) * sizeof(char), local_cell);
- /* WIN32: cm_SearchCellFile(cell, newcell, pcallback, pdata) */
StringCbCopyA(cellconfig->name, (MAXCELLCHARS+1) * sizeof(char), cell);
- rc = cm_SearchCellFile(cell, NULL, afs_get_cellconfig_callback,
- (void*)cellconfig);
+ rc = cm_SearchCellRegistry(1, cell, NULL, linkedCell,
+ afs_get_cellconfig_callback, (void*) cellconfig);
+ if (rc && rc != CM_ERROR_FORCE_DNS_LOOKUP)
+ rc = cm_SearchCellFileEx(cell, NULL, linkedCell, afs_get_cellconfig_callback,
+ (void*)cellconfig);
if(rc)
rc = cm_SearchCellByDNS(cell, NULL, &ttl,
afs_get_cellconfig_callback,
(void*) cellconfig);
+ if (linkedCell[0])
+ cellconfig->linkedCell = _strdup(linkedCell);
+
return rc;
}
static long
afs_get_cellconfig_callback(void *cellconfig,
struct sockaddr_in *addrp,
- char *namep)
+ char *namep,
+ unsigned short ipRank)
{
afs_conf_cell *cc = (afs_conf_cell *)cellconfig;
realm = afs_realm_of_cell(&cellconfig, FALSE);
if (cellconfig.linkedCell)
free(cellconfig.linkedCell);
- if (realm == NULL)
- return FALSE;
+ if (!realm[0]) /* referral; assume it matches */
+ return TRUE;
AnsiStrToUnicode(wrealm, sizeof(wrealm), realm);