Index: openafs/src/NTMakefile diff -c openafs/src/NTMakefile:1.27.2.5 openafs/src/NTMakefile:1.27.2.7 *** openafs/src/NTMakefile:1.27.2.5 Wed Oct 10 12:06:30 2007 --- openafs/src/NTMakefile Fri Feb 1 21:48:12 2008 *************** *** 409,415 **** $(NTMAKE) $(CD) ..\.. ! libadmin: tbutc echo ***** $@ $(DOCD) $(SRC)\$@ $(CD) $(SRC)\$@ --- 409,443 ---- $(NTMAKE) $(CD) ..\.. ! talocale: tbutc ! echo ***** $@ ! $(DOCD) $(SRC)\WINNT\$@ ! $(CD) $(SRC)\WINNT\$@ ! $(NTMAKE) ! $(CD) ..\..\.. ! ! license: talocale ! echo ***** $@ ! $(DOCD) $(SRC)\WINNT\$@ ! $(CD) $(SRC)\WINNT\$@ ! $(NTMAKE) ! $(CD) ..\..\.. ! ! client_osi: license ! echo ***** $@ ! $(DOCD) $(SRC)\WINNT\$@ ! $(CD) $(SRC)\WINNT\$@ ! $(NTMAKE) ! $(CD) ..\..\.. ! ! afsd: client_osi ! echo ***** $@ ! $(DOCD) $(SRC)\WINNT\$@ ! $(CD) $(SRC)\WINNT\$@ ! $(NTMAKE) ! $(CD) ..\..\.. ! ! libadmin: afsd echo ***** $@ $(DOCD) $(SRC)\$@ $(CD) $(SRC)\$@ *************** *** 472,506 **** $(NTMAKE) $(CD) ..\..\.. ! talocale: admintest ! echo ***** $@ ! $(DOCD) $(SRC)\WINNT\$@ ! $(CD) $(SRC)\WINNT\$@ ! $(NTMAKE) ! $(CD) ..\..\.. ! ! license: talocale ! echo ***** $@ ! $(DOCD) $(SRC)\WINNT\$@ ! $(CD) $(SRC)\WINNT\$@ ! $(NTMAKE) ! $(CD) ..\..\.. ! ! client_osi: license ! echo ***** $@ ! $(DOCD) $(SRC)\WINNT\$@ ! $(CD) $(SRC)\WINNT\$@ ! $(NTMAKE) ! $(CD) ..\..\.. ! ! afsd: client_osi ! echo ***** $@ ! $(DOCD) $(SRC)\WINNT\$@ ! $(CD) $(SRC)\WINNT\$@ ! $(NTMAKE) ! $(CD) ..\..\.. ! ! afsadmsvr: afsd echo ***** $@ $(DOCD) $(SRC)\WINNT\$@ $(CD) $(SRC)\WINNT\$@ --- 500,506 ---- $(NTMAKE) $(CD) ..\..\.. ! afsadmsvr: admintest echo ***** $@ $(DOCD) $(SRC)\WINNT\$@ $(CD) $(SRC)\WINNT\$@ Index: openafs/src/WINNT/afsd/NTMakefile diff -c openafs/src/WINNT/afsd/NTMakefile:1.46.2.6 openafs/src/WINNT/afsd/NTMakefile:1.46.2.9 *** openafs/src/WINNT/afsd/NTMakefile:1.46.2.6 Thu Aug 23 23:21:49 2007 --- openafs/src/WINNT/afsd/NTMakefile Fri Feb 8 21:32:19 2008 *************** *** 190,196 **** $(DESTDIR)\lib\afs\afsreg.lib $(CONF_DLLFILE): $(CONFOBJS) $(OUT)\libafsconf.res $(CONF_DLLLIBS) ! $(DLLGUILINK) -def:libafsconf.def dnsapi.lib mpr.lib $(_VC_MANIFEST_EMBED_DLL) $(DLLPREP) $(COPY) $*.lib $(ILIBDIR) --- 190,196 ---- $(DESTDIR)\lib\afs\afsreg.lib $(CONF_DLLFILE): $(CONFOBJS) $(OUT)\libafsconf.res $(CONF_DLLLIBS) ! $(DLLGUILINK) -def:libafsconf.def dnsapi.lib mpr.lib shell32.lib $(_VC_MANIFEST_EMBED_DLL) $(DLLPREP) $(COPY) $*.lib $(ILIBDIR) *************** *** 250,256 **** adsiid.lib \ activeds.lib \ user32.lib \ ! userenv.lib $(LOGON_DLLFILE): $(LOGON_DLLOBJS) $(LOGON_DLLLIBS) $(DLLGUILINK) $(LOGONLINKFLAGS) -def:afslogon.def $(LOGON_DLLSDKLIBS) --- 250,257 ---- adsiid.lib \ activeds.lib \ user32.lib \ ! userenv.lib \ ! shell32.lib $(LOGON_DLLFILE): $(LOGON_DLLOBJS) $(LOGON_DLLLIBS) $(DLLGUILINK) $(LOGONLINKFLAGS) -def:afslogon.def $(LOGON_DLLSDKLIBS) *************** *** 358,382 **** # klog.exe $(EXEDIR)\klog.exe: $(OUT)\cklog.obj $(OUT)\klog.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) # tokens.exe $(EXEDIR)\tokens.exe: $(OUT)\ctokens.obj $(OUT)\tokens.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) # unlog.exe $(EXEDIR)\unlog.exe: $(OUT)\cunlog.obj $(OUT)\unlog.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) # afscpcc.exe $(EXEDIR)\afscpcc.exe: $(OUT)\afscpcc.obj $(OUT)\afscpcc.res $(LOGON_DLLLIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib userenv.lib $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) --- 359,383 ---- # klog.exe $(EXEDIR)\klog.exe: $(OUT)\cklog.obj $(OUT)\klog.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib shell32.lib $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) # tokens.exe $(EXEDIR)\tokens.exe: $(OUT)\ctokens.obj $(OUT)\tokens.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib shell32.lib $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) # unlog.exe $(EXEDIR)\unlog.exe: $(OUT)\cunlog.obj $(OUT)\unlog.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib shell32.lib $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) # afscpcc.exe $(EXEDIR)\afscpcc.exe: $(OUT)\afscpcc.obj $(OUT)\afscpcc.res $(LOGON_DLLLIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib shell32.lib userenv.lib $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) *************** *** 396,412 **** secur32.lib \ ole32.lib \ oleaut32.lib \ ! iphlpapi.lib AFSD_EXELIBS =\ $(DESTDIR)\lib\libosi.lib \ - $(DESTDIR)\lib\afsrpc.lib \ - $(DESTDIR)\lib\afsauthent.lib \ $(DESTDIR)\lib\afs\mtafsvldb.lib \ $(DESTDIR)\lib\afs\mtafsint.lib \ $(DESTDIR)\lib\libafsconf.lib \ $(DESTDIR)\lib\afs\afsreg.lib \ - $(DESTDIR)\lib\afs\afsutil.lib \ $(DESTDIR)\lib\afspthread.lib \ $(LANAHELPERLIB) --- 397,413 ---- secur32.lib \ ole32.lib \ oleaut32.lib \ ! iphlpapi.lib shell32.lib AFSD_EXELIBS =\ $(DESTDIR)\lib\libosi.lib \ $(DESTDIR)\lib\afs\mtafsvldb.lib \ $(DESTDIR)\lib\afs\mtafsint.lib \ + $(DESTDIR)\lib\afsrpc.lib \ + $(DESTDIR)\lib\afs\afsutil.lib \ + $(DESTDIR)\lib\afsauthent.lib \ $(DESTDIR)\lib\libafsconf.lib \ $(DESTDIR)\lib\afs\afsreg.lib \ $(DESTDIR)\lib\afspthread.lib \ $(LANAHELPERLIB) *************** *** 423,446 **** # fs.exe $(EXEDIR)\fs.exe: $(FSOBJS) $(OUT)\fs.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) # cmdebug.exe $(EXEDIR)\cmdebug.exe: $(CMDBGOBJS) $(OUT)\cmdebug.res $(EXELIBS2) ! $(EXECONLINK) $(EXELIBS2) dnsapi.lib mpr.lib iphlpapi.lib rpcrt4.lib $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) # symlink.exe $(EXEDIR)\symlink.exe: $(SLOBJS) $(OUT)\symlink.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) # afsshare.exe ! $(EXEDIR)\afsshare.exe: $(OUT)\afsshare.obj $(OUT)\afsshare.res $(EXECONLINK) $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) --- 424,447 ---- # fs.exe $(EXEDIR)\fs.exe: $(FSOBJS) $(OUT)\fs.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib shell32.lib $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) # cmdebug.exe $(EXEDIR)\cmdebug.exe: $(CMDBGOBJS) $(OUT)\cmdebug.res $(EXELIBS2) ! $(EXECONLINK) $(EXELIBS2) dnsapi.lib mpr.lib iphlpapi.lib shell32.lib rpcrt4.lib $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) # symlink.exe $(EXEDIR)\symlink.exe: $(SLOBJS) $(OUT)\symlink.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib shell32.lib $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) # afsshare.exe ! $(EXEDIR)\afsshare.exe: $(OUT)\afsshare.obj $(OUT)\afsshare.res $(EXELIBS) $(EXECONLINK) $(_VC_MANIFEST_EMBED_EXE) $(EXEPREP) Index: openafs/src/WINNT/afsd/afsd_init.c diff -c openafs/src/WINNT/afsd/afsd_init.c:1.79.2.23 openafs/src/WINNT/afsd/afsd_init.c:1.79.2.27 *** openafs/src/WINNT/afsd/afsd_init.c:1.79.2.23 Mon Dec 24 00:24:14 2007 --- openafs/src/WINNT/afsd/afsd_init.c Fri Feb 1 16:39:40 2008 *************** *** 465,471 **** } else /* add a new server without a cell */ { ! tsp = cm_NewServer(&saddr, CM_SERVER_VLDB, NULL); /* refcount = 1 */ tsp->ipRank = (USHORT)dwRank; } } --- 465,471 ---- } else /* add a new server without a cell */ { ! tsp = cm_NewServer(&saddr, CM_SERVER_VLDB, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */ tsp->ipRank = (USHORT)dwRank; } } *************** *** 535,541 **** } else /* add a new server without a cell */ { ! tsp = cm_NewServer(&saddr, CM_SERVER_FILE, NULL); /* refcount = 1 */ tsp->ipRank = (USHORT)dwRank; } } --- 535,541 ---- } else /* add a new server without a cell */ { ! tsp = cm_NewServer(&saddr, CM_SERVER_FILE, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */ tsp->ipRank = (USHORT)dwRank; } } *************** *** 1270,1276 **** code, cm_freelanceEnabled, (code ? "" : rootCellName)); if (code != 0 && !cm_freelanceEnabled) { ! *reasonP = "can't find root cell name in CellServDB"; return -1; } else if (cm_freelanceEnabled) --- 1270,1276 ---- code, cm_freelanceEnabled, (code ? "" : rootCellName)); if (code != 0 && !cm_freelanceEnabled) { ! *reasonP = "can't find root cell name in " AFS_CELLSERVDB; return -1; } else if (cm_freelanceEnabled) *************** *** 1282,1288 **** afsi_log("cm_GetCell addr %x", PtrToUlong(cm_data.rootCellp)); if (cm_data.rootCellp == NULL) { ! *reasonP = "can't find root cell in afsdcell.ini"; return -1; } } --- 1282,1288 ---- afsi_log("cm_GetCell addr %x", PtrToUlong(cm_data.rootCellp)); if (cm_data.rootCellp == NULL) { ! *reasonP = "can't find root cell in " AFS_CELLSERVDB; return -1; } } Index: openafs/src/WINNT/afsd/afsd_service.c diff -c openafs/src/WINNT/afsd/afsd_service.c:1.52.4.21 openafs/src/WINNT/afsd/afsd_service.c:1.52.4.23 *** openafs/src/WINNT/afsd/afsd_service.c:1.52.4.21 Sun Jan 6 01:26:04 2008 --- openafs/src/WINNT/afsd/afsd_service.c Sat Feb 2 17:27:11 2008 *************** *** 344,350 **** powerStateSuspended = 1; if (osVersion.dwMajorVersion >= 6) { cm_SuspendSCache(); ! smb_StopListeners(); } dwRet = NO_ERROR; break; --- 344,350 ---- powerStateSuspended = 1; if (osVersion.dwMajorVersion >= 6) { cm_SuspendSCache(); ! smb_StopListeners(0); } dwRet = NO_ERROR; break; *************** *** 353,366 **** powerStateSuspended = 1; if (osVersion.dwMajorVersion >= 6) { cm_SuspendSCache(); ! smb_StopListeners(); } dwRet = NO_ERROR; break; case PBT_APMRESUMECRITICAL: afsi_log("SERVICE_CONTROL_APMRESUMECRITICAL"); if (osVersion.dwMajorVersion >= 6) ! smb_RestartListeners(); dwRet = NO_ERROR; break; case PBT_APMRESUMESUSPEND: --- 353,366 ---- powerStateSuspended = 1; if (osVersion.dwMajorVersion >= 6) { cm_SuspendSCache(); ! smb_StopListeners(0); } dwRet = NO_ERROR; break; case PBT_APMRESUMECRITICAL: afsi_log("SERVICE_CONTROL_APMRESUMECRITICAL"); if (osVersion.dwMajorVersion >= 6) ! smb_RestartListeners(0); dwRet = NO_ERROR; break; case PBT_APMRESUMESUSPEND: *************** *** 393,400 **** /* This is the message delivered once all devices are up */ afsi_log("SERVICE_CONTROL_APMRESUMEAUTOMATIC"); powerStateSuspended = 0; ! if (osVersion.dwMajorVersion >= 6) ! smb_RestartListeners(); dwRet = NO_ERROR; break; default: --- 393,401 ---- /* This is the message delivered once all devices are up */ afsi_log("SERVICE_CONTROL_APMRESUMEAUTOMATIC"); powerStateSuspended = 0; ! if (osVersion.dwMajorVersion >= 6) { ! smb_SetLanAdapterChangeDetected(); ! } dwRet = NO_ERROR; break; default: *************** *** 441,447 **** dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_QUERY_VALUE, &hKey); if (dwResult != ERROR_SUCCESS) ! return; while (dwIndex < MAX_DRIVES) { dwDriveSize = sizeof(szDriveToMapTo); --- 442,448 ---- dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_QUERY_VALUE, &hKey); if (dwResult != ERROR_SUCCESS) ! return 0; while (dwIndex < MAX_DRIVES) { dwDriveSize = sizeof(szDriveToMapTo); Index: openafs/src/WINNT/afsd/afskfw.c diff -c openafs/src/WINNT/afsd/afskfw.c:1.28.4.12 openafs/src/WINNT/afsd/afskfw.c:1.28.4.15 *** openafs/src/WINNT/afsd/afskfw.c:1.28.4.12 Thu Oct 18 01:21:35 2007 --- openafs/src/WINNT/afsd/afskfw.c Fri Feb 8 21:32:19 2008 *************** *** 497,502 **** --- 497,530 ---- FreeLibrary(hKrb5); } + typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); + static int IsWow64() + { + static int init = TRUE; + static int bIsWow64 = FALSE; + + if (init) { + HMODULE hModule; + LPFN_ISWOW64PROCESS fnIsWow64Process = NULL; + + hModule = GetModuleHandle(TEXT("kernel32")); + if (hModule) { + fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(hModule, "IsWow64Process"); + + if (NULL != fnIsWow64Process) + { + if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64)) + { + // on error, assume FALSE. + // in other words, do nothing. + } + } + FreeLibrary(hModule); + } + init = FALSE; + } + return bIsWow64; + } int KFW_accept_dotted_usernames(void) *************** *** 506,512 **** DWORD value = 1; code = RegOpenKeyEx(HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, ! 0, KEY_QUERY_VALUE, &parmKey); if (code == ERROR_SUCCESS) { len = sizeof(value); code = RegQueryValueEx(parmKey, "AcceptDottedPrincipalNames", NULL, NULL, --- 534,540 ---- DWORD value = 1; code = RegOpenKeyEx(HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, ! 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey); if (code == ERROR_SUCCESS) { len = sizeof(value); code = RegQueryValueEx(parmKey, "AcceptDottedPrincipalNames", NULL, NULL, *************** *** 515,521 **** } if (code != ERROR_SUCCESS) { code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, ! 0, KEY_QUERY_VALUE, &parmKey); if (code == ERROR_SUCCESS) { len = sizeof(value); code = RegQueryValueEx(parmKey, "AcceptDottedPrincipalNames", NULL, NULL, --- 543,549 ---- } if (code != ERROR_SUCCESS) { code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, ! 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey); if (code == ERROR_SUCCESS) { len = sizeof(value); code = RegQueryValueEx(parmKey, "AcceptDottedPrincipalNames", NULL, NULL, *************** *** 535,541 **** DWORD use524 = 0; code = RegOpenKeyEx(HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, ! 0, KEY_QUERY_VALUE, &parmKey); if (code == ERROR_SUCCESS) { len = sizeof(use524); code = RegQueryValueEx(parmKey, "Use524", NULL, NULL, --- 563,569 ---- DWORD use524 = 0; code = RegOpenKeyEx(HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, ! 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey); if (code == ERROR_SUCCESS) { len = sizeof(use524); code = RegQueryValueEx(parmKey, "Use524", NULL, NULL, *************** *** 544,550 **** } if (code != ERROR_SUCCESS) { code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, ! 0, KEY_QUERY_VALUE, &parmKey); if (code == ERROR_SUCCESS) { len = sizeof(use524); code = RegQueryValueEx(parmKey, "Use524", NULL, NULL, --- 572,578 ---- } if (code != ERROR_SUCCESS) { code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, ! 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey); if (code == ERROR_SUCCESS) { len = sizeof(use524); code = RegQueryValueEx(parmKey, "Use524", NULL, NULL, *************** *** 563,569 **** DWORD enableKFW = 1; code = RegOpenKeyEx(HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, ! 0, KEY_QUERY_VALUE, &parmKey); if (code == ERROR_SUCCESS) { len = sizeof(enableKFW); code = RegQueryValueEx(parmKey, "EnableKFW", NULL, NULL, --- 591,597 ---- DWORD enableKFW = 1; code = RegOpenKeyEx(HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, ! 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey); if (code == ERROR_SUCCESS) { len = sizeof(enableKFW); code = RegQueryValueEx(parmKey, "EnableKFW", NULL, NULL, *************** *** 573,579 **** if (code != ERROR_SUCCESS) { code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, ! 0, KEY_QUERY_VALUE, &parmKey); if (code == ERROR_SUCCESS) { len = sizeof(enableKFW); code = RegQueryValueEx(parmKey, "EnableKFW", NULL, NULL, --- 601,607 ---- if (code != ERROR_SUCCESS) { code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, ! 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey); if (code == ERROR_SUCCESS) { len = sizeof(enableKFW); code = RegQueryValueEx(parmKey, "EnableKFW", NULL, NULL, *************** *** 657,662 **** --- 685,691 ---- krb5_principal principal = 0; char * pname = NULL; const char * ccname = NULL; + const char * cctype = NULL; krb5_error_code code = 0; krb5_error_code cc_code = 0; krb5_cc_cursor cur; *************** *** 676,681 **** --- 705,713 ---- ccname = pkrb5_cc_get_name(ctx, cc); if (!ccname) goto cleanup; + cctype = pkrb5_cc_get_type(ctx, cc); + if (!cctype) goto cleanup; + // Search the existing list to see if we have a match if ( next ) { for ( ; next ; next = next->next ) { *************** *** 690,696 **** next->next = princ_cc_data; princ_cc_data = next; next->principal = _strdup(pname); ! next->ccache_name = _strdup(ccname); next->from_lsa = lsa; next->expired = 1; next->expiration_time = 0; --- 722,730 ---- next->next = princ_cc_data; princ_cc_data = next; next->principal = _strdup(pname); ! next->ccache_name = malloc(strlen(ccname) + strlen(cctype) + 2); ! if (next->ccache_name) ! sprintf(next->ccache_name, "%s:%s", cctype, ccname); next->from_lsa = lsa; next->expired = 1; next->expiration_time = 0; *************** *** 2618,2624 **** struct ktc_token *atoken) { static char lastcell[MAXCELLCHARS+1] = { 0 }; ! static char confname[512] = { 0 }; #ifdef AFS_ID_TO_NAME char username_copy[BUFSIZ]; #endif /* AFS_ID_TO_NAME */ --- 2652,2658 ---- struct ktc_token *atoken) { static char lastcell[MAXCELLCHARS+1] = { 0 }; ! static char confdir[512] = { 0 }; #ifdef AFS_ID_TO_NAME char username_copy[BUFSIZ]; #endif /* AFS_ID_TO_NAME */ *************** *** 2628,2641 **** afs_int32 id; #endif /* ALLOW_REGISTER */ ! if (confname[0] == '\0') { ! strncpy(confname, AFSDIR_CLIENT_ETC_DIRPATH, sizeof(confname)); ! confname[sizeof(confname) - 2] = '\0'; ! } strcpy(lastcell, aserver->cell); ! if (!pr_Initialize (0, confname, aserver->cell)) { char sname[PR_MAXNAMELEN]; strncpy(sname, username, PR_MAXNAMELEN); sname[PR_MAXNAMELEN-1] = '\0'; --- 2662,2673 ---- afs_int32 id; #endif /* ALLOW_REGISTER */ ! if (confdir[0] == '\0') ! cm_GetConfigDir(confdir, sizeof(confdir)); strcpy(lastcell, aserver->cell); ! if (!pr_Initialize (0, confdir, aserver->cell)) { char sname[PR_MAXNAMELEN]; strncpy(sname, username, PR_MAXNAMELEN); sname[PR_MAXNAMELEN-1] = '\0'; *************** *** 2678,2684 **** strncpy(aclient->cell, realm_of_user, MAXKTCREALMLEN - 1); if (status = ktc_SetToken(aserver, atoken, aclient, 0)) return status; ! if (status = pr_Initialize(1L, confname, aserver->cell)) return status; status = pr_CreateUser(username, &id); pr_End(); --- 2710,2716 ---- strncpy(aclient->cell, realm_of_user, MAXKTCREALMLEN - 1); if (status = ktc_SetToken(aserver, atoken, aclient, 0)) return status; ! if (status = pr_Initialize(1L, confdir, aserver->cell)) return status; status = pr_CreateUser(username, &id); pr_End(); Index: openafs/src/WINNT/afsd/afskfw.h diff -c openafs/src/WINNT/afsd/afskfw.h:1.4.4.2 openafs/src/WINNT/afsd/afskfw.h:1.4.4.3 *** openafs/src/WINNT/afsd/afskfw.h:1.4.4.2 Mon Jul 24 10:13:17 2006 --- openafs/src/WINNT/afsd/afskfw.h Fri Feb 1 16:39:41 2008 *************** *** 37,42 **** --- 37,43 ---- #include #include #include + #include #include #define MAXCELLCHARS 64 Index: openafs/src/WINNT/afsd/afslogon.c diff -c openafs/src/WINNT/afsd/afslogon.c:1.45.2.12 openafs/src/WINNT/afsd/afslogon.c:1.45.2.13 *** openafs/src/WINNT/afsd/afslogon.c:1.45.2.12 Tue Dec 11 23:25:38 2007 --- openafs/src/WINNT/afsd/afslogon.c Mon Jan 28 14:51:20 2008 *************** *** 29,34 **** --- 29,39 ---- #include "afskfw.h" #include "lanahelper.h" + /* Allocated in Windows Driver Kit */ + #ifndef WNNC_NET_OPENAFS + #define WNNC_NET_OPENAFS 0x00390000 + #endif + #include DWORD TraceOption = 0; *************** *** 217,223 **** switch (index) { case WNNC_NET_TYPE: /* Don't have our own type; use somebody else's. */ ! return WNNC_NET_SUN_PC_NFS; case WNNC_START: /* Say we are already started, even though we might wait after we receive NPLogonNotify */ --- 222,228 ---- switch (index) { case WNNC_NET_TYPE: /* Don't have our own type; use somebody else's. */ ! return WNNC_NET_OPENAFS; case WNNC_START: /* Say we are already started, even though we might wait after we receive NPLogonNotify */ Index: openafs/src/WINNT/afsd/afsshare.c diff -c openafs/src/WINNT/afsd/afsshare.c:1.8 openafs/src/WINNT/afsd/afsshare.c:1.8.4.1 *** openafs/src/WINNT/afsd/afsshare.c:1.8 Sat Nov 5 01:47:46 2005 --- openafs/src/WINNT/afsd/afsshare.c Fri Feb 8 21:32:19 2008 *************** *** 32,38 **** 0, NULL, REG_OPTION_NON_VOLATILE, ! KEY_READ|KEY_WRITE, NULL, &hkSubmounts, NULL) == ERROR_SUCCESS) --- 32,38 ---- 0, NULL, REG_OPTION_NON_VOLATILE, ! (IsWow64()?KEY_WOW64_64KEY:0)|KEY_READ|KEY_WRITE, NULL, &hkSubmounts, NULL) == ERROR_SUCCESS) *************** *** 50,56 **** 0, NULL, REG_OPTION_NON_VOLATILE, ! KEY_READ, NULL, &hkParameters, NULL) == ERROR_SUCCESS) --- 50,56 ---- 0, NULL, REG_OPTION_NON_VOLATILE, ! (IsWow64()?KEY_WOW64_64KEY:0)|KEY_READ, NULL, &hkParameters, NULL) == ERROR_SUCCESS) Index: openafs/src/WINNT/afsd/cm.h diff -c openafs/src/WINNT/afsd/cm.h:1.17.2.7 openafs/src/WINNT/afsd/cm.h:1.17.2.11 *** openafs/src/WINNT/afsd/cm.h:1.17.2.7 Sat Dec 22 23:52:58 2007 --- openafs/src/WINNT/afsd/cm.h Fri Feb 8 21:32:19 2008 *************** *** 14,238 **** #define AFS_PTHREAD_ENV 1 #endif #include - #ifdef DJGPP /* we need these for vldbentry decl., etc. */ #include #include - #endif /* DJGPP */ - - /* from .xg file */ - /* FIXME: these were "long" but Windows NT wants "int" */ - int VL_GetEntryByID(struct rx_connection *, afs_int32, afs_int32, struct vldbentry *); - int VL_GetEntryByNameO(struct rx_connection *, char *, struct vldbentry *); - int VL_ProbeServer(struct rx_connection *); - int VL_GetEntryBYIDN(struct rx_connection *, afs_int32, afs_int32, struct nvldbentry *); - int VL_GetEntryByNameN(struct rx_connection *, char *, struct nvldbentry *); - - /* from .xg file */ - int StartRXAFS_FetchData (struct rx_call *, - struct AFSFid *Fid, - afs_int32 Pos, - afs_int32 Length); - int EndRXAFS_FetchData (struct rx_call *, - struct AFSFetchStatus *OutStatus, - struct AFSCallBack *CallBack, - struct AFSVolSync *Sync); - - int RXAFS_FetchACL(struct rx_connection *, - struct AFSFid *Fid, - struct AFSOpaque *AccessList, - struct AFSFetchStatus *OutStatus, - struct AFSVolSync *Sync); - - int RXAFS_FetchStatus (struct rx_connection *, - struct AFSFid *Fid, - struct AFSFetchStatus *OutStatus, - struct AFSCallBack *CallBack, - struct AFSVolSync *Sync); - - int StartRXAFS_StoreData (struct rx_call *, - struct AFSFid *Fid, - struct AFSStoreStatus *InStatus, - afs_uint32 Pos, - afs_uint32 Length, - afs_uint32 FileLength); - - int EndRXAFS_StoreData(struct rx_call *, - struct AFSFetchStatus *OutStatus, - struct AFSVolSync *Sync); - - int StartRXAFS_FetchData64(struct rx_call *z_call, - struct AFSFid * Fid, - afs_int64 Pos, - afs_int64 Length); - - int EndRXAFS_FetchData64(struct rx_call *z_call, - struct AFSFetchStatus * OutStatus, - struct AFSCallBack * CallBack, - struct AFSVolSync * Sync); - - afs_int32 SRXAFS_FetchData64(struct rx_call *z_call, - struct AFSFid * Fid, - afs_int64 Pos, - afs_int64 Length, - struct AFSFetchStatus * OutStatus, - struct AFSCallBack * CallBack, - struct AFSVolSync * Sync); - - int StartRXAFS_StoreData64(struct rx_call *z_call, - struct AFSFid * Fid, - struct AFSStoreStatus * InStatus, - afs_uint64 Pos, - afs_uint64 Length, - afs_uint64 FileLength); - - int EndRXAFS_StoreData64(struct rx_call *z_call, - struct AFSFetchStatus * OutStatus, - struct AFSVolSync * Sync); - - afs_int32 SRXAFS_StoreData64(struct rx_call *z_call, - struct AFSFid * Fid, - struct AFSStoreStatus * InStatus, - afs_uint64 Pos, - afs_uint64 Length, - afs_uint64 FileLength, - struct AFSFetchStatus * OutStatus, - struct AFSVolSync * Sync); - - int RXAFS_StoreACL (struct rx_connection *, - struct AFSFid *Fid, - struct AFSOpaque *AccessList, - struct AFSFetchStatus *OutStatus, - struct AFSVolSync *Sync); - - int RXAFS_StoreStatus(struct rx_connection *, - struct AFSFid *Fid, - struct AFSStoreStatus *InStatus, - struct AFSFetchStatus *OutStatus, - struct AFSVolSync *Sync); - - int RXAFS_RemoveFile (struct rx_connection *, - struct AFSFid *DirFid, - char *namep, - struct AFSFetchStatus *OutStatus, - struct AFSVolSync *Sync); - - int RXAFS_CreateFile (struct rx_connection *, - struct AFSFid *DirFid, - char *Name, - struct AFSStoreStatus *InStatus, - struct AFSFid *OutFid, - struct AFSFetchStatus *OutFidStatus, - struct AFSFetchStatus *OutDirStatus, - struct AFSCallBack *CallBack, - struct AFSVolSync *Sync); - - int RXAFS_Rename (struct rx_connection *, - struct AFSFid *OldDirFid, - char *OldName, - struct AFSFid *NewDirFid, - char *NewName, - struct AFSFetchStatus *OutOldDirStatus, - struct AFSFetchStatus *OutNewDirStatus, - struct AFSVolSync *Sync); - - int RXAFS_Symlink (struct rx_connection *, - struct AFSFid *DirFid, - char *name, - char *LinkContents, - struct AFSStoreStatus *InStatus, - struct AFSFid *OutFid, - struct AFSFetchStatus *OutFidStatus, - struct AFSFetchStatus *OutDirStatus, - struct AFSVolSync *Sync); - - int RXAFS_Link (struct rx_connection *, - struct AFSFid *DirFid, - char *Name, - struct AFSFid *ExistingFid, - struct AFSFetchStatus *OutFidStatus, - struct AFSFetchStatus *OutDirStatus, - struct AFSVolSync *Sync); - - int RXAFS_MakeDir (struct rx_connection *, - struct AFSFid *DirFid, - char *name, - struct AFSStoreStatus *InStatus, - struct AFSFid *OutFid, - struct AFSFetchStatus *OutFidStatus, - struct AFSFetchStatus *OutDirStatus, - struct AFSCallBack *CallBack, - struct AFSVolSync *Sync); - - int RXAFS_RemoveDir (struct rx_connection *, - struct AFSFid *DirFid, - char *Name, - struct AFSFetchStatus *OutDirStatus, - struct AFSVolSync *Sync); - - int RXAFS_GetStatistics (struct rx_connection *, - struct ViceStatistics *Statistics); - - int RXAFS_GiveUpCallBacks (struct rx_connection *, - struct AFSCBFids *Fids_Array, - struct AFSCBs *CallBacks_Array); - - int RXAFS_GetVolumeInfo (struct rx_connection *, - char *VolumeName, - struct VolumeInfo *Volumeinfo); - - int RXAFS_GetVolumeStatus (struct rx_connection *, - afs_int32 Volumeid, - struct AFSFetchVolumeStatus *Volumestatus, - char **name, - char **offlineMsg, - char **motd); - - int RXAFS_SetVolumeStatus (struct rx_connection *, - afs_int32 Volumeid, - struct AFSStoreVolumeStatus *Volumestatus, - char *name, - char *olm, - char *motd); - - int RXAFS_GetRootVolume (struct rx_connection *, - char **VolumeName); - - int RXAFS_CheckToken (struct rx_connection *, - afs_int32 ViceId, - struct AFSOpaque *token); - - int RXAFS_GetTime (struct rx_connection *, - afs_uint32 *Seconds, - afs_uint32 *USeconds); - - int RXAFS_BulkStatus (struct rx_connection *, - struct AFSCBFids *FidsArray, - struct AFSBulkStats *StatArray, - struct AFSCBs *CBArray, - struct AFSVolSync *Sync); - - int RXAFS_SetLock (struct rx_connection *, - struct AFSFid *Fid, - int Type, - struct AFSVolSync *Sync); - - int RXAFS_ExtendLock (struct rx_connection *, - struct AFSFid *Fid, - struct AFSVolSync *Sync); - - int RXAFS_ReleaseLock (struct rx_connection *, - struct AFSFid *Fid, - struct AFSVolSync *Sync); - - /* This interface is to supported the AFS/DFS Protocol Translator */ - int RXAFS_Lookup (struct rx_connection *, - struct AFSFid *DirFid, - char *Name, - struct AFSFid *OutFid, - struct AFSFetchStatus *OutFidStatus, - struct AFSFetchStatus *OutDirStatus, - struct AFSCallBack *CallBack, - struct AFSVolSync *Sync); #define CM_DEFAULT_CALLBACKPORT 7001 --- 14,21 ---- *************** *** 245,250 **** --- 28,35 ---- #define CM_FLAG_NOMOUNTCHASE 0x20 /* don't follow mount points */ #define CM_FLAG_DIRSEARCH 0x40 /* for directory search */ #define CM_FLAG_CHECKPATH 0x80 /* Path instead of File */ + #define CM_FLAG_NOPROBE 0x100 /* For use with cm_GetCellxxx - do not probe server status */ + #define CM_FLAG_DFS_REFERRAL 0x200 /* The request is a DFS Referral - the last char of the lookup name may be missing */ /* error codes */ #define CM_ERROR_BASE 0x66543200 *************** *** 304,309 **** --- 89,95 ---- #define CM_ERROR_INEXACT_MATCH (CM_ERROR_BASE+54) #define CM_ERROR_BPLUS_NOMATCH (CM_ERROR_BASE+55) #define CM_ERROR_EAS_NOT_SUPPORTED (CM_ERROR_BASE+56) + #define CM_ERROR_RANGE_NOT_LOCKED (CM_ERROR_BASE+57) /* Used by cm_FollowMountPoint and cm_GetVolumeByName */ #define RWVOL 0 Index: openafs/src/WINNT/afsd/cm_aclent.c diff -c openafs/src/WINNT/afsd/cm_aclent.c:1.14.2.2 openafs/src/WINNT/afsd/cm_aclent.c:1.14.2.3 *** openafs/src/WINNT/afsd/cm_aclent.c:1.14.2.2 Thu Oct 25 00:49:00 2007 --- openafs/src/WINNT/afsd/cm_aclent.c Tue Feb 5 12:11:45 2008 *************** *** 80,86 **** for (aclp = scp->randomACLp; aclp; aclp = aclp->nextp) { if (aclp->userp == userp) { ! if (aclp->tgtLifetime && aclp->tgtLifetime <= osi_Time()) { /* ticket expired */ osi_QRemoveHT((osi_queue_t **) &cm_data.aclLRUp, (osi_queue_t **) &cm_data.aclLRUEndp, &aclp->q); CleanupACLEnt(aclp); --- 80,86 ---- for (aclp = scp->randomACLp; aclp; aclp = aclp->nextp) { if (aclp->userp == userp) { ! if (aclp->tgtLifetime && aclp->tgtLifetime <= time(NULL)) { /* ticket expired */ osi_QRemoveHT((osi_queue_t **) &cm_data.aclLRUp, (osi_queue_t **) &cm_data.aclLRUEndp, &aclp->q); CleanupACLEnt(aclp); Index: openafs/src/WINNT/afsd/cm_aclent.h diff -c openafs/src/WINNT/afsd/cm_aclent.h:1.6 openafs/src/WINNT/afsd/cm_aclent.h:1.6.2.1 *** openafs/src/WINNT/afsd/cm_aclent.h:1.6 Sat Apr 22 15:44:28 2006 --- openafs/src/WINNT/afsd/cm_aclent.h Tue Feb 5 12:11:45 2008 *************** *** 26,32 **** struct cm_scache *backp; /* back ptr to vnode */ struct cm_user *userp; /* user whose access is cached */ afs_uint32 randomAccess; /* watch for more rights in acl.h */ ! unsigned long tgtLifetime; /* time this expires */ } cm_aclent_t; extern osi_rwlock_t cm_aclLock; --- 26,32 ---- struct cm_scache *backp; /* back ptr to vnode */ struct cm_user *userp; /* user whose access is cached */ afs_uint32 randomAccess; /* watch for more rights in acl.h */ ! afs_uint32 tgtLifetime; /* time this expires */ } cm_aclent_t; extern osi_rwlock_t cm_aclLock; Index: openafs/src/WINNT/afsd/cm_callback.c diff -c openafs/src/WINNT/afsd/cm_callback.c:1.41.4.28 openafs/src/WINNT/afsd/cm_callback.c:1.41.4.33 *** openafs/src/WINNT/afsd/cm_callback.c:1.41.4.28 Wed Dec 26 11:22:19 2007 --- openafs/src/WINNT/afsd/cm_callback.c Thu Feb 7 16:21:20 2008 *************** *** 361,368 **** cm_server_t *tsp = NULL; cm_cell_t* cellp = NULL; MUTEX_ENTER(&callp->lock); ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); --- 361,369 ---- cm_server_t *tsp = NULL; cm_cell_t* cellp = NULL; + #ifdef HOLD_CALL_MUTEX MUTEX_ENTER(&callp->lock); ! #endif if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); *************** *** 371,377 **** if (tsp) cellp = tsp->cellp; ! if (cellp) osi_Log2(afsd_logp, "SRXAFSCB_CallBack from host 0x%x port %d", ntohl(host), ntohs(port)); --- 372,378 ---- if (tsp) cellp = tsp->cellp; ! if (!cellp) osi_Log2(afsd_logp, "SRXAFSCB_CallBack from host 0x%x port %d", ntohl(host), ntohs(port)); *************** *** 395,402 **** else cm_RevokeCallback(callp, cellp, tfidp); } ! MUTEX_EXIT(&callp->lock); return 0; } --- 396,404 ---- else cm_RevokeCallback(callp, cellp, tfidp); } ! #ifdef HOLD_CALL_MUTEX MUTEX_EXIT(&callp->lock); + #endif return 0; } *************** *** 436,443 **** unsigned long host = 0; unsigned short port = 0; MUTEX_ENTER(&callp->lock); ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); --- 438,446 ---- unsigned long host = 0; unsigned short port = 0; + #ifdef HOLD_CALL_MUTEX MUTEX_ENTER(&callp->lock); ! #endif if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); *************** *** 518,524 **** --- 521,529 ---- cm_PutServer(tsp); } } + #ifdef HOLD_CALL_MUTEX MUTEX_EXIT(&callp->lock); + #endif return 0; } *************** *** 550,557 **** unsigned long host = 0; unsigned short port = 0; MUTEX_ENTER(&callp->lock); ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); --- 555,563 ---- unsigned long host = 0; unsigned short port = 0; + #ifdef HOLD_CALL_MUTEX MUTEX_ENTER(&callp->lock); ! #endif if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); *************** *** 561,567 **** --- 567,575 ---- ntohl(host), ntohs(port)); + #ifdef HOLD_CALL_MUTEX MUTEX_EXIT(&callp->lock); + #endif return 0; } *************** *** 656,663 **** unsigned long host = 0; unsigned short port = 0; MUTEX_ENTER(&callp->lock); ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); --- 664,672 ---- unsigned long host = 0; unsigned short port = 0; + #ifdef HOLD_CALL_MUTEX MUTEX_ENTER(&callp->lock); ! #endif if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); *************** *** 700,706 **** --- 709,717 ---- code = 0; } + #ifdef HOLD_CALL_MUTEX MUTEX_EXIT(&callp->lock); + #endif return code; } *************** *** 716,723 **** unsigned long host = 0; unsigned short port = 0; MUTEX_ENTER(&callp->lock); ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); --- 727,735 ---- unsigned long host = 0; unsigned short port = 0; + #ifdef HOLD_CALL_MUTEX MUTEX_ENTER(&callp->lock); ! #endif if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); *************** *** 809,815 **** --- 821,829 ---- fcnDone: lock_ReleaseRead(&cm_scacheLock); + #ifdef HOLD_CALL_MUTEX MUTEX_EXIT(&callp->lock); + #endif return (code); } *************** *** 825,832 **** unsigned long host = 0; unsigned short port = 0; MUTEX_ENTER(&callp->lock); ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); --- 839,847 ---- unsigned long host = 0; unsigned short port = 0; + #ifdef HOLD_CALL_MUTEX MUTEX_ENTER(&callp->lock); ! #endif if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); *************** *** 923,929 **** --- 938,946 ---- fcnDone: lock_ReleaseRead(&cm_scacheLock); + #ifdef HOLD_CALL_MUTEX MUTEX_EXIT(&callp->lock); + #endif return (code); } *************** *** 936,943 **** unsigned long host = 0; unsigned short port = 0; MUTEX_ENTER(&callp->lock); ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); --- 953,961 ---- unsigned long host = 0; unsigned short port = 0; + #ifdef HOLD_CALL_MUTEX MUTEX_ENTER(&callp->lock); ! #endif if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); *************** *** 947,953 **** --- 965,973 ---- ntohl(host), ntohs(port)); *vp = -1; + #ifdef HOLD_CALL_MUTEX MUTEX_EXIT(&callp->lock); + #endif return RXGEN_OPCODE; } *************** *** 961,968 **** unsigned long host = 0; unsigned short port = 0; MUTEX_ENTER(&callp->lock); ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); --- 981,989 ---- unsigned long host = 0; unsigned short port = 0; + #ifdef HOLD_CALL_MUTEX MUTEX_ENTER(&callp->lock); ! #endif if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); *************** *** 971,977 **** --- 992,1000 ---- osi_Log2(afsd_logp, "SRXAFSCB_GetXStats from host 0x%x port %d - not implemented", ntohl(host), ntohs(port)); + #ifdef HOLD_CALL_MUTEX MUTEX_EXIT(&callp->lock); + #endif return RXGEN_OPCODE; } *************** *** 999,1006 **** unsigned long host = 0; unsigned short port = 0; MUTEX_ENTER(&callp->lock); ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); --- 1022,1030 ---- unsigned long host = 0; unsigned short port = 0; + #ifdef HOLD_CALL_MUTEX MUTEX_ENTER(&callp->lock); ! #endif if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); *************** *** 1026,1032 **** --- 1050,1058 ---- cm_NetMtu[i] : rx_mtu; } + #ifdef HOLD_CALL_MUTEX MUTEX_EXIT(&callp->lock); + #endif return 0; } *************** *** 1036,1042 **** char *p = NULL; if (UuidToString((UUID *)serverUuid, &p) == RPC_S_OK) { ! osi_Log1(afsd_logp, "SRXAFSCB_InitCallBackState3 %s ->",p); RpcStringFree(&p); } else osi_Log0(afsd_logp, "SRXAFSCB_InitCallBackState3 - no server Uuid ->"); --- 1062,1068 ---- char *p = NULL; if (UuidToString((UUID *)serverUuid, &p) == RPC_S_OK) { ! osi_Log1(afsd_logp, "SRXAFSCB_InitCallBackState3 %s ->",osi_LogSaveString(afsd_logp,p)); RpcStringFree(&p); } else osi_Log0(afsd_logp, "SRXAFSCB_InitCallBackState3 - no server Uuid ->"); *************** *** 1055,1062 **** char *p,*q; int code = 0; MUTEX_ENTER(&callp->lock); ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); --- 1081,1089 ---- char *p,*q; int code = 0; + #ifdef HOLD_CALL_MUTEX MUTEX_ENTER(&callp->lock); ! #endif if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); *************** *** 1079,1118 **** ntohl(host), ntohs(port)); MUTEX_EXIT(&callp->lock); return code; } /* debug interface */ ! int ! SRXAFSCB_GetCellByNum(struct rx_call *callp, afs_int32 a_cellnum, ! char **a_name, serverList *a_hosts) { afs_int32 sn; cm_cell_t * cellp; cm_serverRef_t * serverRefp; - struct rx_connection *connp; - struct rx_peer *peerp; - unsigned long host = 0; - unsigned short port = 0; ! MUTEX_ENTER(&callp->lock); ! ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { ! host = rx_HostOf(peerp); ! port = rx_PortOf(peerp); ! } ! ! osi_Log3(afsd_logp, "SRXAFSCB_GetCellByNum(%d) from host 0x%x port %d", ! a_cellnum, ntohl(host), ntohs(port)); ! ! a_hosts->serverList_val = 0; ! a_hosts->serverList_len = 0; ! ! cellp = cm_FindCellByID(a_cellnum); if (!cellp) { *a_name = strdup(""); - MUTEX_EXIT(&callp->lock); return 0; } --- 1106,1128 ---- ntohl(host), ntohs(port)); + #ifdef HOLD_CALL_MUTEX MUTEX_EXIT(&callp->lock); + #endif return code; } /* debug interface */ ! static int ! GetCellCommon(afs_int32 a_cellnum, char **a_name, serverList *a_hosts) { afs_int32 sn; cm_cell_t * cellp; cm_serverRef_t * serverRefp; ! cellp = cm_FindCellByID(a_cellnum, CM_FLAG_NOPROBE); if (!cellp) { *a_name = strdup(""); return 0; } *************** *** 1134,1145 **** } lock_ReleaseRead(&cm_serverLock); - MUTEX_EXIT(&callp->lock); return 0; } /* debug interface */ int SRXAFSCB_TellMeAboutYourself( struct rx_call *callp, struct interfaceAddr *addr, Capabilities * capabilities) --- 1144,1188 ---- } lock_ReleaseRead(&cm_serverLock); return 0; } /* debug interface */ int + SRXAFSCB_GetCellByNum(struct rx_call *callp, afs_int32 a_cellnum, + char **a_name, serverList *a_hosts) + { + struct rx_connection *connp; + struct rx_peer *peerp; + unsigned long host = 0; + unsigned short port = 0; + int rc; + + #ifdef HOLD_CALL_MUTEX + MUTEX_ENTER(&callp->lock); + #endif + if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { + host = rx_HostOf(peerp); + port = rx_PortOf(peerp); + } + + osi_Log3(afsd_logp, "SRXAFSCB_GetCellByNum(%d) from host 0x%x port %d", + a_cellnum, ntohl(host), ntohs(port)); + + a_hosts->serverList_val = 0; + a_hosts->serverList_len = 0; + + + rc = GetCellCommon(a_cellnum, a_name, a_hosts); + + #ifdef HOLD_CALL_MUTEX + MUTEX_EXIT(&callp->lock); + #endif + return rc; + } + + /* debug interface */ + int SRXAFSCB_TellMeAboutYourself( struct rx_call *callp, struct interfaceAddr *addr, Capabilities * capabilities) *************** *** 1158,1165 **** unsigned long host = 0; unsigned short port = 0; MUTEX_ENTER(&callp->lock); ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); --- 1201,1209 ---- unsigned long host = 0; unsigned short port = 0; + #ifdef HOLD_CALL_MUTEX MUTEX_ENTER(&callp->lock); ! #endif if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); *************** *** 1191,1197 **** --- 1235,1243 ---- capabilities->Capabilities_len = dataBytes / sizeof(afs_int32); capabilities->Capabilities_val = dataBuffP; + #ifdef HOLD_CALL_MUTEX MUTEX_EXIT(&callp->lock); + #endif return 0; } *************** *** 1228,1235 **** unsigned long host = 0; unsigned short port = 0; MUTEX_ENTER(&callp->lock); ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); --- 1274,1282 ---- unsigned long host = 0; unsigned short port = 0; + #ifdef HOLD_CALL_MUTEX MUTEX_ENTER(&callp->lock); ! #endif if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); *************** *** 1242,1248 **** --- 1289,1297 ---- *a_srvr_addr = 0xffffffff; *a_srvr_rank = 0xffffffff; + #ifdef HOLD_CALL_MUTEX MUTEX_EXIT(&callp->lock); + #endif return 0; } *************** *** 1271,1284 **** int SRXAFSCB_GetCellServDB(struct rx_call *callp, afs_int32 index, char **a_name, serverList *a_hosts) { - char *t_name; struct rx_connection *connp; struct rx_peer *peerp; unsigned long host = 0; unsigned short port = 0; MUTEX_ENTER(&callp->lock); ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); --- 1320,1334 ---- int SRXAFSCB_GetCellServDB(struct rx_call *callp, afs_int32 index, char **a_name, serverList *a_hosts) { struct rx_connection *connp; struct rx_peer *peerp; unsigned long host = 0; unsigned short port = 0; + int rc; + #ifdef HOLD_CALL_MUTEX MUTEX_ENTER(&callp->lock); ! #endif if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); *************** *** 1287,1298 **** osi_Log2(afsd_logp, "SRXAFSCB_GetCellServDB from host 0x%x port %d - not implemented", ntohl(host), ntohs(port)); ! t_name = (char *)malloc(AFSNAMEMAX); ! t_name[0] = '\0'; ! *a_name = t_name; ! a_hosts->serverList_len = 0; ! ! MUTEX_EXIT(&callp->lock); return 0; } --- 1337,1350 ---- osi_Log2(afsd_logp, "SRXAFSCB_GetCellServDB from host 0x%x port %d - not implemented", ntohl(host), ntohs(port)); ! #ifdef AFS_FREELANCE_CLIENT ! if (cm_freelanceEnabled && index == 0) { ! rc = GetCellCommon(AFS_FAKE_ROOT_CELL_ID, a_name, a_hosts); ! } else ! #endif ! { ! rc = GetCellCommon(index+1, a_name, a_hosts); ! } return 0; } *************** *** 1324,1331 **** unsigned long host = 0; unsigned short port = 0; MUTEX_ENTER(&callp->lock); ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); --- 1376,1384 ---- unsigned long host = 0; unsigned short port = 0; + #ifdef HOLD_CALL_MUTEX MUTEX_ENTER(&callp->lock); ! #endif if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); *************** *** 1343,1349 **** --- 1396,1404 ---- } *a_name = t_name; + #ifdef HOLD_CALL_MUTEX MUTEX_EXIT(&callp->lock); + #endif return 0; } *************** *** 1423,1430 **** unsigned long host = 0; unsigned short port = 0; MUTEX_ENTER(&callp->lock); ! if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); --- 1478,1486 ---- unsigned long host = 0; unsigned short port = 0; + #ifdef HOLD_CALL_MUTEX MUTEX_ENTER(&callp->lock); ! #endif if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); *************** *** 1452,1458 **** --- 1508,1516 ---- config->cacheConfig_val = t_config; config->cacheConfig_len = (*configCount)/sizeof(afs_uint32); + #ifdef HOLD_CALL_MUTEX MUTEX_EXIT(&callp->lock); + #endif return 0; } *************** *** 1874,1881 **** lock_ReleaseMutex(&scp->mx); cm_CallbackNotifyChange(scp); - cm_ReleaseSCacheNoLock(scp); lock_ObtainWrite(&cm_scacheLock); } } } --- 1932,1939 ---- lock_ReleaseMutex(&scp->mx); cm_CallbackNotifyChange(scp); lock_ObtainWrite(&cm_scacheLock); + cm_ReleaseSCacheNoLock(scp); } } } *************** *** 1911,1919 **** lock_ObtainMutex(&tsp->mx); if (!(tsp->flags & CM_SERVERFLAG_DOWN)) { tsp->flags |= CM_SERVERFLAG_DOWN; ! tsp->downTime = osi_Time(); } cm_ForceNewConnections(tsp); /* Now update the volume status */ for (tsrvp = tsp->vols; tsrvp; tsrvp = tsrvp->nextp) { for (i=0; imx); if (!(tsp->flags & CM_SERVERFLAG_DOWN)) { tsp->flags |= CM_SERVERFLAG_DOWN; ! tsp->downTime = time(NULL); } cm_ForceNewConnections(tsp); + /* Now update the volume status */ for (tsrvp = tsp->vols; tsrvp; tsrvp = tsrvp->nextp) { for (i=0; icellp, tsrvp->ids[i], cm_rootUserp, ! &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp); if (code == 0) { cm_UpdateVolumeStatus(volp, tsrvp->ids[i]); cm_PutVolume(volp); --- 1982,1988 ---- cm_InitReq(&req); code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp, ! &req, CM_GETVOL_FLAG_NO_LRU_UPDATE | CM_GETVOL_FLAG_NO_RESET, &volp); if (code == 0) { cm_UpdateVolumeStatus(volp, tsrvp->ids[i]); cm_PutVolume(volp); Index: openafs/src/WINNT/afsd/cm_cell.c diff -c openafs/src/WINNT/afsd/cm_cell.c:1.23.2.9 openafs/src/WINNT/afsd/cm_cell.c:1.23.2.12 *** openafs/src/WINNT/afsd/cm_cell.c:1.23.2.9 Fri Dec 28 02:13:15 2007 --- openafs/src/WINNT/afsd/cm_cell.c Fri Feb 1 16:39:41 2008 *************** *** 35,42 **** cm_server_t *tsp; cm_serverRef_t *tsrp; cm_cell_t *cellp; ! cellp = rockp; /* if this server was previously created by fs setserverprefs */ if ( tsp = cm_FindServer(addrp, CM_SERVER_VLDB)) --- 35,45 ---- cm_server_t *tsp; cm_serverRef_t *tsrp; cm_cell_t *cellp; + cm_cell_rock_t *cellrockp = (cm_cell_rock_t *)rockp; + afs_uint32 probe; ! cellp = cellrockp->cellp; ! probe = !(cellrockp->flags & CM_FLAG_NOPROBE); /* if this server was previously created by fs setserverprefs */ if ( tsp = cm_FindServer(addrp, CM_SERVER_VLDB)) *************** *** 51,57 **** } } else ! tsp = cm_NewServer(addrp, CM_SERVER_VLDB, cellp); /* Insert the vlserver into a sorted list, sorted by server rank */ tsrp = cm_NewServerRef(tsp, 0); --- 54,60 ---- } } else ! tsp = cm_NewServer(addrp, CM_SERVER_VLDB, cellp, probe ? 0 : CM_FLAG_NOPROBE); /* Insert the vlserver into a sorted list, sorted by server rank */ tsrp = cm_NewServerRef(tsp, 0); *************** *** 68,76 **** * and check to make sure we have a valid set of volume servers * this function must be called with a Write Lock on cm_cellLock */ ! cm_cell_t *cm_UpdateCell(cm_cell_t * cp) { long code = 0; if (cp == NULL) return NULL; --- 71,80 ---- * and check to make sure we have a valid set of volume servers * this function must be called with a Write Lock on cm_cellLock */ ! static cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags) { long code = 0; + cm_cell_rock_t rock; if (cp == NULL) return NULL; *************** *** 92,104 **** cp->vlServersp = NULL; } ! code = cm_SearchCellFile(cp->name, NULL, cm_AddCellProc, cp); #ifdef AFS_AFSDB_ENV if (code) { if (cm_dnsEnabled) { int ttl; ! code = cm_SearchCellByDNS(cp->name, NULL, &ttl, cm_AddCellProc, cp); if (code == 0) { /* got cell from DNS */ cp->flags |= CM_CELLFLAG_DNS; cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID; --- 96,110 ---- cp->vlServersp = NULL; } ! rock.cellp = cp; ! rock.flags = flags; ! code = cm_SearchCellFile(cp->name, NULL, cm_AddCellProc, &rock); #ifdef AFS_AFSDB_ENV if (code) { if (cm_dnsEnabled) { int ttl; ! code = cm_SearchCellByDNS(cp->name, NULL, &ttl, cm_AddCellProc, &rock); if (code == 0) { /* got cell from DNS */ cp->flags |= CM_CELLFLAG_DNS; cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID; *************** *** 123,129 **** return code ? NULL : cp; } ! /* load up a cell structure from the cell database, afsdcell.ini */ cm_cell_t *cm_GetCell(char *namep, afs_uint32 flags) { return cm_GetCell_Gen(namep, NULL, flags); --- 129,135 ---- return code ? NULL : cp; } ! /* load up a cell structure from the cell database, AFS_CELLSERVDB */ cm_cell_t *cm_GetCell(char *namep, afs_uint32 flags) { return cm_GetCell_Gen(namep, NULL, flags); *************** *** 136,141 **** --- 142,148 ---- char fullname[200]=""; int hasWriteLock = 0; afs_uint32 hash; + cm_cell_rock_t rock; if (!strcmp(namep,SMB_IOCTL_FILENAME_NOSLASH)) return NULL; *************** *** 162,168 **** lock_ReleaseRead(&cm_cellLock); if (cp) { ! cm_UpdateCell(cp); } else if (flags & CM_FLAG_CREATE) { lock_ObtainWrite(&cm_cellLock); hasWriteLock = 1; --- 169,175 ---- lock_ReleaseRead(&cm_cellLock); if (cp) { ! cm_UpdateCell(cp, flags); } else if (flags & CM_FLAG_CREATE) { lock_ObtainWrite(&cm_cellLock); hasWriteLock = 1; *************** *** 200,206 **** memset(cp, 0, sizeof(cm_cell_t)); cp->magic = CM_CELL_MAGIC; ! code = cm_SearchCellFile(namep, fullname, cm_AddCellProc, cp); if (code) { osi_Log3(afsd_logp,"in cm_GetCell_gen cm_SearchCellFile(%s) returns code= %d fullname= %s", osi_LogSaveString(afsd_logp,namep), code, osi_LogSaveString(afsd_logp,fullname)); --- 207,215 ---- memset(cp, 0, sizeof(cm_cell_t)); cp->magic = CM_CELL_MAGIC; ! rock.cellp = cp; ! rock.flags = flags; ! code = cm_SearchCellFile(namep, fullname, cm_AddCellProc, &rock); if (code) { osi_Log3(afsd_logp,"in cm_GetCell_gen cm_SearchCellFile(%s) returns code= %d fullname= %s", osi_LogSaveString(afsd_logp,namep), code, osi_LogSaveString(afsd_logp,fullname)); *************** *** 209,215 **** if (cm_dnsEnabled) { int ttl; ! code = cm_SearchCellByDNS(namep, fullname, &ttl, cm_AddCellProc, cp); if ( code ) { osi_Log3(afsd_logp,"in cm_GetCell_gen cm_SearchCellByDNS(%s) returns code= %d fullname= %s", osi_LogSaveString(afsd_logp,namep), code, osi_LogSaveString(afsd_logp,fullname)); --- 218,224 ---- if (cm_dnsEnabled) { int ttl; ! code = cm_SearchCellByDNS(namep, fullname, &ttl, cm_AddCellProc, &rock); if ( code ) { osi_Log3(afsd_logp,"in cm_GetCell_gen cm_SearchCellByDNS(%s) returns code= %d fullname= %s", osi_LogSaveString(afsd_logp,namep), code, osi_LogSaveString(afsd_logp,fullname)); *************** *** 288,294 **** return cp; } ! cm_cell_t *cm_FindCellByID(afs_int32 cellID) { cm_cell_t *cp; afs_uint32 hash; --- 297,303 ---- return cp; } ! cm_cell_t *cm_FindCellByID(afs_int32 cellID, afs_uint32 flags) { cm_cell_t *cp; afs_uint32 hash; *************** *** 304,310 **** lock_ReleaseRead(&cm_cellLock); if (cp) ! cm_UpdateCell(cp); return cp; } --- 313,319 ---- lock_ReleaseRead(&cm_cellLock); if (cp) ! cm_UpdateCell(cp, flags); return cp; } Index: openafs/src/WINNT/afsd/cm_cell.h diff -c openafs/src/WINNT/afsd/cm_cell.h:1.7.6.5 openafs/src/WINNT/afsd/cm_cell.h:1.7.6.7 *** openafs/src/WINNT/afsd/cm_cell.h:1.7.6.5 Wed Jun 27 20:34:26 2007 --- openafs/src/WINNT/afsd/cm_cell.h Thu Jan 31 00:49:00 2008 *************** *** 36,41 **** --- 36,47 ---- #define CM_CELLFLAG_IN_NAMEHASH 0x10 #define CM_CELLFLAG_IN_IDHASH 0x20 + typedef struct cm_cell_rock { + cm_cell_t * cellp; + afs_uint32 flags; + } cm_cell_rock_t; + + #define CM_CELL_NAME_HASH(name) (SDBMHash(name) % cm_data.cellHashTableSize) #define CM_CELL_ID_HASH(id) ((unsigned long) id % cm_data.cellHashTableSize) *************** *** 50,56 **** extern cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags); ! extern cm_cell_t *cm_FindCellByID(afs_int32 cellID); extern void cm_ChangeRankCellVLServer(cm_server_t *tsp); --- 56,62 ---- extern cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags); ! extern cm_cell_t *cm_FindCellByID(afs_int32 cellID, afs_uint32 flags); extern void cm_ChangeRankCellVLServer(cm_server_t *tsp); *************** *** 64,67 **** --- 70,75 ---- extern void cm_AddCellToIDHashTable(cm_cell_t * cellp); + extern long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *namep); + #endif /* __CELL_H_ENV_ */ Index: openafs/src/WINNT/afsd/cm_config.c diff -c openafs/src/WINNT/afsd/cm_config.c:1.26.4.1 openafs/src/WINNT/afsd/cm_config.c:1.26.4.3 *** openafs/src/WINNT/afsd/cm_config.c:1.26.4.1 Wed Jun 27 20:34:26 2007 --- openafs/src/WINNT/afsd/cm_config.c Fri Feb 1 21:48:13 2008 *************** *** 7,19 **** * directory or online at http://www.openafs.org/dl/license10.html */ - #ifndef DJGPP #include #include - #else - #include - #include - #endif /* !DJGPP */ #include #include #include --- 7,14 ---- *************** *** 31,57 **** #include #endif - - - /* TODO: these should be pulled in from dirpath.h */ - #if !defined(DJGPP) && !defined(AFS_WIN95_ENV) - #define AFS_THISCELL "ThisCell" - #endif - #define AFS_CELLSERVDB_UNIX "CellServDB" - #define AFS_CELLSERVDB_NT "afsdcell.ini" - #ifndef AFSDIR_CLIENT_ETC_DIRPATH - #define AFSDIR_CLIENT_ETC_DIRPATH "c:/afs" - #endif - #if defined(DJGPP) || defined(AFS_WIN95_ENV) - #define AFS_CELLSERVDB AFS_CELLSERVDB_UNIX - #ifdef DJGPP - extern char cm_confDir[]; - extern int errno; - #endif /* DJGPP */ - #else - #define AFS_CELLSERVDB AFS_CELLSERVDB_UNIX - #endif /* DJGPP || WIN95 */ - static long cm_ParsePair(char *lineBufferp, char *leftp, char *rightp) { char *tp; --- 26,31 ---- *************** *** 152,195 **** int foundCell = 0; long code; int tracking = 1, partial = 0; - #if defined(DJGPP) || defined(AFS_WIN95_ENV) - char *afsconf_path; - DWORD dwSize; - #endif if ( IsWindowsModule(cellNamep) ) return -3; ! cm_GetCellServDB(wdir); tfilep = fopen(wdir, "r"); ! #if defined(DJGPP) || defined(AFS_WIN95_ENV) ! if (!tfilep) { ! /* If we are using DJGPP client, cellservdb will be in afsconf dir. */ ! /* If we are in Win95 here, we are linking with klog etc. and are ! using DJGPP client even though DJGPP is not defined. So we still ! need to check AFSCONF for location. */ ! dwSize = GetEnvironmentVariable("AFSCONF", NULL, 0); ! afsconf_path = malloc(dwSize); ! dwSize = GetEnvironmentVariable("AFSCONF", afsconf_path, dwSize); ! if (!afsconf_path) ! strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); ! else { ! strcpy(wdir, afsconf_path); ! free(afsconf_path); ! } ! strcat(wdir, "/"); ! strcat(wdir, AFS_CELLSERVDB); ! /*fprintf(stderr, "opening cellservdb file %s\n", wdir);*/ ! tfilep = fopen(wdir, "r"); ! if (!tfilep) ! return -2; ! } ! #else ! /* If we are NT or higher, we don't do DJGPP, So just fail */ ! if ( !tfilep ) return -2; - #endif bestp = fopen(wdir, "r"); --- 126,140 ---- int foundCell = 0; long code; int tracking = 1, partial = 0; if ( IsWindowsModule(cellNamep) ) return -3; ! cm_GetCellServDB(wdir, sizeof(wdir)); tfilep = fopen(wdir, "r"); ! if (!tfilep) return -2; bestp = fopen(wdir, "r"); *************** *** 273,279 **** else inRightCell = 0; } else { - #if !defined(DJGPP) && !defined(AFS_WIN95_ENV) valuep = strchr(lineBuffer, '#'); if (valuep == NULL) { fclose(tfilep); --- 218,223 ---- *************** *** 289,297 **** while (valuep[strlen(valuep) - 1] == ' ' || valuep[strlen(valuep) - 1] == '\t') valuep[strlen(valuep) - 1] = '\0'; - #endif /* !DJGPP */ if (inRightCell) { - #if !defined(DJGPP) && !defined(AFS_WIN95_ENV) /* add the server to the VLDB list */ WSASetLastError(0); thp = gethostbyname(valuep); --- 233,239 ---- *************** *** 308,316 **** (*procp)(rockp, &vlSockAddr, valuep); foundCell = 1; } - #else - thp = 0; - #endif /* !DJGPP */ if (!thp) { long ip_addr; int c1, c2, c3, c4; --- 250,255 ---- *************** *** 379,527 **** #endif /* AFS_AFSDB_ENV */ } ! #if !defined(DJGPP) && !defined(AFS_WIN95_ENV) ! /* look up the CellServDBDir's name in the Registry ! * or use the Client Dirpath value to produce a CellServDB ! * filename */ ! long cm_GetCellServDB(char *cellNamep) { - #if !defined(DJGPP) - DWORD code, dummyLen; - HKEY parmKey; int tlen; ! ! code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, ! 0, KEY_QUERY_VALUE, &parmKey); ! if (code != ERROR_SUCCESS) ! goto dirpath; ! ! dummyLen = 256; ! code = RegQueryValueEx(parmKey, "CellServDBDir", NULL, NULL, ! cellNamep, &dummyLen); ! RegCloseKey (parmKey); ! ! dirpath: ! if (code != ERROR_SUCCESS || cellNamep[0] == 0) ! strcpy(cellNamep, AFSDIR_CLIENT_ETC_DIRPATH); /* add trailing backslash, if required */ tlen = (int)strlen(cellNamep); ! if (cellNamep[tlen-1] != '\\') ! strcat(cellNamep, "\\"); ! #else ! strcpy(cellNamep, cm_confDir); ! strcat(cellNamep,"/"); ! #endif /* !DJGPP */ ! strcat(cellNamep, AFS_CELLSERVDB); ! return 0; } /* look up the root cell's name in the Registry */ long cm_GetRootCellName(char *cellNamep) { ! DWORD code, dummyLen; ! HKEY parmKey; ! code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, ! 0, KEY_QUERY_VALUE, &parmKey); ! if (code != ERROR_SUCCESS) ! return -1; ! dummyLen = 256; ! code = RegQueryValueEx(parmKey, "Cell", NULL, NULL, cellNamep, &dummyLen); ! RegCloseKey (parmKey); ! if (code != ERROR_SUCCESS || cellNamep[0] == 0) ! return -1; ! ! return 0; ! } ! #else ! /* look up the root cell's name in the THISCELL file */ ! long cm_GetRootCellName(char *cellNamep) ! { ! FILE *thisCell; ! char thisCellPath[256]; ! char *newline; ! DWORD dwSize; ! ! #ifdef DJGPP ! strcpy(thisCellPath, cm_confDir); ! #else ! /* Win 95 */ ! char *afsconf_path; ! dwSize = GetEnvironmentVariable("AFSCONF", NULL, 0); ! afsconf_path = malloc(dwSize); ! dwSize = GetEnvironmentVariable("AFSCONF", afsconf_path, dwSize); ! if (!afsconf_path) ! strcpy(thisCellPath, AFSDIR_CLIENT_ETC_DIRPATH); ! else { ! strcpy(thisCellPath, afsconf_path); ! free(afsconf_path); ! } ! #endif ! strcat(thisCellPath,"/"); ! ! strcat(thisCellPath, AFS_THISCELL); ! thisCell = fopen(thisCellPath, "r"); ! if (thisCell == NULL) ! return -1; ! ! fgets(cellNamep, 256, thisCell); ! fclose(thisCell); ! ! newline = strrchr(cellNamep,'\n'); ! if (newline) *newline = '\0'; ! newline = strrchr(cellNamep,'\r'); ! if (newline) *newline = '\0'; ! return 0; } - #endif /* !DJGPP */ cm_configFile_t *cm_CommonOpen(char *namep, char *rwp) { char wdir[256]; - long tlen; FILE *tfilep; ! #if !defined(DJGPP) && !defined(AFS_WIN95_ENV) ! strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); ! ! /* add trailing backslash, if required */ ! tlen = (long)(strlen(wdir)); ! if (wdir[tlen-1] != '\\') strcat(wdir, "\\"); ! #else ! #ifdef DJGPP ! strcpy(wdir,cm_confDir); ! #else ! DWORD dwSize; ! char *afsconf_path; ! ! dwSize = GetEnvironmentVariable("AFSCONF", NULL, 0); ! afsconf_path = malloc(dwSize); ! dwSize = GetEnvironmentVariable("AFSCONF", afsconf_path, dwSize); ! ! if (!afsconf_path) ! strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); ! else { ! strcpy(wdir, afsconf_path); ! free(afsconf_path); ! } ! #endif /* !DJGPP */ ! strcat(wdir,"/"); ! #endif /* DJGPP || WIN95 */ ! strcat(wdir, namep); tfilep = fopen(wdir, rwp); return ((cm_configFile_t *) tfilep); } - #ifndef DJGPP long cm_WriteConfigString(char *labelp, char *valuep) { DWORD code, dummyDisp; --- 318,381 ---- #endif /* AFS_AFSDB_ENV */ } ! /* use cm_GetConfigDir() plus AFS_CELLSERVDB to ! * generate the fully qualified name of the CellServDB ! * file. */ ! long cm_GetCellServDB(char *cellNamep, afs_uint32 len) { int tlen; ! ! cm_GetConfigDir(cellNamep, len); /* add trailing backslash, if required */ tlen = (int)strlen(cellNamep); ! if (cellNamep[tlen-1] != '\\') { ! strncat(cellNamep, "\\", len); ! cellNamep[len-1] = '\0'; ! } ! strncat(cellNamep, AFS_CELLSERVDB, len); ! cellNamep[len-1] = '\0'; ! return 0; } /* look up the root cell's name in the Registry */ long cm_GetRootCellName(char *cellNamep) { ! DWORD code, dummyLen; ! HKEY parmKey; ! code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, ! 0, KEY_QUERY_VALUE, &parmKey); ! if (code != ERROR_SUCCESS) ! return -1; ! dummyLen = 256; ! code = RegQueryValueEx(parmKey, "Cell", NULL, NULL, cellNamep, &dummyLen); ! RegCloseKey (parmKey); ! if (code != ERROR_SUCCESS || cellNamep[0] == 0) ! return -1; ! return 0; } cm_configFile_t *cm_CommonOpen(char *namep, char *rwp) { char wdir[256]; FILE *tfilep; ! cm_GetConfigDir(wdir, sizeof(wdir)); ! strncat(wdir, namep, sizeof(wdir)); ! wdir[sizeof(wdir)-1] = '\0'; tfilep = fopen(wdir, rwp); return ((cm_configFile_t *) tfilep); } long cm_WriteConfigString(char *labelp, char *valuep) { DWORD code, dummyDisp; *************** *** 541,707 **** return (long)0; } - #endif /* !DJGPP */ - #ifndef DJGPP long cm_WriteConfigInt(char *labelp, long value) { ! DWORD code, dummyDisp; ! HKEY parmKey; ! code = RegCreateKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, ! 0, "container", 0, KEY_SET_VALUE, NULL, ! &parmKey, &dummyDisp); ! if (code != ERROR_SUCCESS) ! return -1; ! ! code = RegSetValueEx(parmKey, labelp, 0, REG_DWORD, ! (LPBYTE)&value, sizeof(value)); ! RegCloseKey (parmKey); ! if (code != ERROR_SUCCESS) ! return -1; ! return 0; } - #endif /* !DJGPP */ cm_configFile_t *cm_OpenCellFile(void) { ! cm_configFile_t *cfp; ! cfp = cm_CommonOpen("afsdcel2.ini", "w"); ! return cfp; } long cm_AppendPrunedCellList(cm_configFile_t *ofp, char *cellNamep) { ! cm_configFile_t *tfilep; /* input file */ ! char *tp; ! char lineBuffer[256]; ! char *valuep; ! int inRightCell; ! int foundCell; ! ! tfilep = cm_CommonOpen(AFS_CELLSERVDB, "r"); ! if (!tfilep) return -1; ! ! foundCell = 0; ! ! /* have we seen the cell line for the guy we're looking for? */ ! inRightCell = 0; ! while (1) { ! tp = fgets(lineBuffer, sizeof(lineBuffer), (FILE *)tfilep); ! if (tp == NULL) { ! if (feof((FILE *)tfilep)) { ! /* hit EOF */ ! fclose((FILE *)tfilep); ! return 0; ! } ! } ! ! /* turn trailing cr or lf into null */ ! tp = strchr(lineBuffer, '\r'); ! if (tp) *tp = 0; ! tp = strchr(lineBuffer, '\n'); ! if (tp) *tp = 0; ! /* skip blank lines */ ! if (lineBuffer[0] == 0) { ! fprintf((FILE *)ofp, "%s\n", lineBuffer); ! continue; ! } ! if (lineBuffer[0] == '>') { ! /* trim off at white space or '#' chars */ ! tp = strchr(lineBuffer, ' '); ! if (tp) *tp = 0; ! tp = strchr(lineBuffer, '\t'); ! if (tp) *tp = 0; ! tp = strchr(lineBuffer, '#'); ! if (tp) *tp = 0; ! ! /* now see if this is the right cell */ ! if (strcmp(lineBuffer+1, cellNamep) == 0) { ! /* found the cell we're looking for */ ! inRightCell = 1; ! } ! else { ! inRightCell = 0; ! fprintf((FILE *)ofp, "%s\n", lineBuffer); ! } ! } ! else { ! valuep = strchr(lineBuffer, '#'); ! if (valuep == NULL) return -2; ! valuep++; /* skip the "#" */ ! if (!inRightCell) { ! fprintf((FILE *)ofp, "%s\n", lineBuffer); ! } ! } /* a vldb line */ ! } /* while loop processing all lines */ ! } long cm_AppendNewCell(cm_configFile_t *filep, char *cellNamep) { ! fprintf((FILE *)filep, ">%s\n", cellNamep); ! return 0; } long cm_AppendNewCellLine(cm_configFile_t *filep, char *linep) { ! fprintf((FILE *)filep, "%s\n", linep); ! return 0; } long cm_CloseCellFile(cm_configFile_t *filep) { ! char wdir[256]; ! char sdir[256]; long code; long closeCode; ! int tlen; ! #ifdef AFS_WIN95_ENV ! char *afsconf_path; ! DWORD dwSize; ! #endif ! closeCode = fclose((FILE *)filep); ! ! #if !defined(DJGPP) && !defined(AFS_WIN95_ENV) ! strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); ! ! /* add trailing backslash, if required */ ! tlen = (int)strlen(wdir); ! if (wdir[tlen-1] != '\\') strcat(wdir, "\\"); ! #else ! #ifdef DJGPP ! strcpy(wdir,cm_confDir); ! #else ! dwSize = GetEnvironmentVariable("AFSCONF", NULL, 0); ! afsconf_path = malloc(dwSize); ! dwSize = GetEnvironmentVariable("AFSCONF", afsconf_path, dwSize); ! if (!afsconf_path) ! strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); ! else { ! strcpy(wdir, afsconf_path); ! free(afsconf_path); ! } ! #endif /* !DJGPP */ ! strcat(wdir,"/"); ! #endif /* DJGPP || WIN95 */ strcpy(sdir, wdir); ! if (closeCode != 0) { ! /* something went wrong, preserve original database */ ! strcat(wdir, "afsdcel2.ini"); unlink(wdir); return closeCode; } ! strcat(wdir, AFS_CELLSERVDB); ! strcat(sdir, "afsdcel2.ini"); /* new file */ ! unlink(wdir); /* delete old file */ code = rename(sdir, wdir); /* do the rename */ --- 395,535 ---- return (long)0; } long cm_WriteConfigInt(char *labelp, long value) { ! DWORD code, dummyDisp; ! HKEY parmKey; ! code = RegCreateKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, ! 0, "container", 0, KEY_SET_VALUE, NULL, ! &parmKey, &dummyDisp); ! if (code != ERROR_SUCCESS) ! return -1; ! code = RegSetValueEx(parmKey, labelp, 0, REG_DWORD, ! (LPBYTE)&value, sizeof(value)); ! RegCloseKey (parmKey); ! if (code != ERROR_SUCCESS) ! return -1; ! ! return 0; } cm_configFile_t *cm_OpenCellFile(void) { ! cm_configFile_t *cfp; ! cfp = cm_CommonOpen(AFS_CELLSERVDB ".new", "w"); ! return cfp; } long cm_AppendPrunedCellList(cm_configFile_t *ofp, char *cellNamep) { ! cm_configFile_t *tfilep; /* input file */ ! char *tp; ! char lineBuffer[256]; ! char *valuep; ! int inRightCell; ! int foundCell; ! ! tfilep = cm_CommonOpen(AFS_CELLSERVDB, "r"); ! if (!tfilep) ! return -1; ! ! foundCell = 0; ! ! /* have we seen the cell line for the guy we're looking for? */ ! inRightCell = 0; ! while (1) { ! tp = fgets(lineBuffer, sizeof(lineBuffer), (FILE *)tfilep); ! if (tp == NULL) { ! if (feof((FILE *)tfilep)) { ! /* hit EOF */ ! fclose((FILE *)tfilep); ! return 0; ! } ! } ! ! /* turn trailing cr or lf into null */ ! tp = strchr(lineBuffer, '\r'); ! if (tp) *tp = 0; ! tp = strchr(lineBuffer, '\n'); ! if (tp) *tp = 0; ! /* skip blank lines */ ! if (lineBuffer[0] == 0) { ! fprintf((FILE *)ofp, "%s\n", lineBuffer); ! continue; ! } ! if (lineBuffer[0] == '>') { ! /* trim off at white space or '#' chars */ ! tp = strchr(lineBuffer, ' '); ! if (tp) *tp = 0; ! tp = strchr(lineBuffer, '\t'); ! if (tp) *tp = 0; ! tp = strchr(lineBuffer, '#'); ! if (tp) *tp = 0; ! ! /* now see if this is the right cell */ ! if (strcmp(lineBuffer+1, cellNamep) == 0) { ! /* found the cell we're looking for */ ! inRightCell = 1; ! } ! else { ! inRightCell = 0; ! fprintf((FILE *)ofp, "%s\n", lineBuffer); ! } ! } ! else { ! valuep = strchr(lineBuffer, '#'); ! if (valuep == NULL) return -2; ! valuep++; /* skip the "#" */ ! if (!inRightCell) { ! fprintf((FILE *)ofp, "%s\n", lineBuffer); ! } ! } /* a vldb line */ ! } /* while loop processing all lines */ ! } long cm_AppendNewCell(cm_configFile_t *filep, char *cellNamep) { ! fprintf((FILE *)filep, ">%s\n", cellNamep); ! return 0; } long cm_AppendNewCellLine(cm_configFile_t *filep, char *linep) { ! fprintf((FILE *)filep, "%s\n", linep); ! return 0; } long cm_CloseCellFile(cm_configFile_t *filep) { ! char wdir[260]; ! char sdir[260]; long code; long closeCode; ! closeCode = fclose((FILE *)filep); + cm_GetConfigDir(wdir, sizeof(wdir)); strcpy(sdir, wdir); ! if (closeCode != 0) { ! /* something went wrong, preserve original database */ ! strncat(wdir, AFS_CELLSERVDB ".new", sizeof(wdir)); ! wdir[sizeof(wdir)-1] = '\0'; unlink(wdir); return closeCode; } ! strncat(wdir, AFS_CELLSERVDB, sizeof(wdir)); ! wdir[sizeof(wdir)-1] = '\0'; ! strncat(sdir, AFS_CELLSERVDB ".new", sizeof(sdir));/* new file */ ! sdir[sizeof(sdir)-1] = '\0'; ! unlink(sdir); /* delete old file */ code = rename(sdir, wdir); /* do the rename */ *************** *** 711,746 **** return code; } ! void cm_GetConfigDir(char *dir) { ! char wdir[256]; ! int tlen; ! #ifdef AFS_WIN95_ENV ! char *afsconf_path; ! DWORD dwSize; ! #endif ! #if !defined(DJGPP) && !defined(AFS_WIN95_ENV) ! strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); ! ! /* add trailing backslash, if required */ ! tlen = (int)strlen(wdir); ! if (wdir[tlen-1] != '\\') strcat(wdir, "\\"); ! #else ! #ifdef DJGPP ! strcpy(wdir,cm_confDir); ! #else ! dwSize = GetEnvironmentVariable("AFSCONF", NULL, 0); ! afsconf_path = malloc(dwSize); ! dwSize = GetEnvironmentVariable("AFSCONF", afsconf_path, dwSize); ! if (!afsconf_path) ! strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); ! else { ! strcpy(wdir, afsconf_path); ! free(afsconf_path); } - #endif /* !DJGPP */ - strcat(wdir,"\\"); - #endif /* DJGPP || WIN95 */ - strcpy(dir, wdir); } --- 539,553 ---- return code; } ! void cm_GetConfigDir(char *dir, afs_uint32 len) { ! char * dirp = NULL; ! if (!afssw_GetClientCellServDBDir(&dirp)) { ! strncpy(dir, dirp, len); ! dir[len-1] = '\0'; ! free(dirp); ! } else { ! dir[0] = '\0'; } } Index: openafs/src/WINNT/afsd/cm_config.h diff -c openafs/src/WINNT/afsd/cm_config.h:1.8.6.3 openafs/src/WINNT/afsd/cm_config.h:1.8.6.4 *** openafs/src/WINNT/afsd/cm_config.h:1.8.6.3 Fri Dec 28 02:09:11 2007 --- openafs/src/WINNT/afsd/cm_config.h Fri Feb 1 16:39:41 2008 *************** *** 21,29 **** #ifndef __CM_CONFIG_INTERFACES_ONLY__ #include - #ifdef DJGPP - #include - #endif /* DJGPP */ typedef FILE cm_configFile_t; --- 21,26 ---- *************** *** 51,59 **** extern long cm_CloseCellFile(cm_configFile_t *filep); ! extern long cm_GetCellServDB(char *cellNamep); ! extern void cm_GetConfigDir(char *dir); #endif /* __CM_CONFIG_INTERFACES_ONLY__ */ --- 48,61 ---- extern long cm_CloseCellFile(cm_configFile_t *filep); ! extern long cm_GetCellServDB(char *cellNamep, afs_uint32 len); ! extern void cm_GetConfigDir(char *dir, afs_uint32 len); ! ! /* TODO: these should be pulled in from dirpath.h */ ! #define AFS_THISCELL "ThisCell" ! #define AFS_CELLSERVDB_UNIX "CellServDB" ! #define AFS_CELLSERVDB AFS_CELLSERVDB_UNIX #endif /* __CM_CONFIG_INTERFACES_ONLY__ */ Index: openafs/src/WINNT/afsd/cm_conn.c diff -c openafs/src/WINNT/afsd/cm_conn.c:1.49.2.25 openafs/src/WINNT/afsd/cm_conn.c:1.49.2.30 *** openafs/src/WINNT/afsd/cm_conn.c:1.49.2.25 Wed Nov 14 12:19:41 2007 --- openafs/src/WINNT/afsd/cm_conn.c Thu Feb 7 09:48:53 2008 *************** *** 122,128 **** return CM_ERROR_INVAL; } ! cellp = cm_FindCellByID(fidp->cell); if (!cellp) return CM_ERROR_NOSUCHCELL; --- 122,128 ---- return CM_ERROR_INVAL; } ! cellp = cm_FindCellByID(fidp->cell, 0); if (!cellp) return CM_ERROR_NOSUCHCELL; *************** *** 226,232 **** } } if (cellp == NULL && fidp) { ! cellp = cm_FindCellByID(fidp->cell); } } --- 226,232 ---- } } if (cellp == NULL && fidp) { ! cellp = cm_FindCellByID(fidp->cell, 0); } } *************** *** 278,286 **** * background daemon thread as they become available */ if (timeLeft > 7 && fidp) { - cm_volume_t *volp; - cm_vol_state_t *statep; - thrd_Sleep(5000); code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, --- 278,283 ---- *************** *** 394,410 **** else if (fidp->volume == volp->bk.ID) statep = &volp->bk; } - - cm_PutVolume(volp); } break; } } lock_ReleaseWrite(&cm_serverLock); ! if (statep) cm_UpdateVolumeStatus(volp, statep->ID); ! if (free_svr_list) { cm_FreeServerList(&serversp, 0); *serverspp = serversp; --- 391,407 ---- else if (fidp->volume == volp->bk.ID) statep = &volp->bk; } } break; } } lock_ReleaseWrite(&cm_serverLock); ! if (statep) { cm_UpdateVolumeStatus(volp, statep->ID); ! cm_PutVolume(volp); ! } ! if (free_svr_list) { cm_FreeServerList(&serversp, 0); *serverspp = serversp; *************** *** 480,497 **** free_svr_list = 1; } } for (tsrp = serversp; tsrp; tsrp=tsrp->next) { if (tsrp->server == serverp) { /* REDIRECT */ ! if (errorCode == VNOVOL || errorCode == VMOVED) { tsrp->status = srv_deleted; ! if (fidp) { ! cm_ForceUpdateVolume(fidp, userp, reqp); ! } ! } else tsrp->status = srv_offline; } } if (free_svr_list) { cm_FreeServerList(&serversp, 0); *serverspp = serversp; --- 477,517 ---- free_svr_list = 1; } } + lock_ObtainWrite(&cm_serverLock); for (tsrp = serversp; tsrp; tsrp=tsrp->next) { if (tsrp->server == serverp) { /* REDIRECT */ ! if (errorCode == VMOVED) { tsrp->status = srv_deleted; ! } else { tsrp->status = srv_offline; + } + + if (fidp) { /* File Server query */ + code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, + CM_GETVOL_FLAG_NO_LRU_UPDATE, + &volp); + if (code == 0) { + if (fidp->volume == volp->rw.ID) + statep = &volp->rw; + else if (fidp->volume == volp->ro.ID) + statep = &volp->ro; + else if (fidp->volume == volp->bk.ID) + statep = &volp->bk; + } + } } } + lock_ReleaseWrite(&cm_serverLock); + + if (fidp && errorCode == VMOVED) + cm_ForceUpdateVolume(fidp, userp, reqp); + + if (statep) { + cm_UpdateVolumeStatus(volp, statep->ID); + cm_PutVolume(volp); + } + if (free_svr_list) { cm_FreeServerList(&serversp, 0); *serverspp = serversp; *************** *** 563,569 **** if (reqp->flags & CM_REQ_NEW_CONN_FORCED) { if (!(serverp->flags & CM_SERVERFLAG_DOWN)) { serverp->flags |= CM_SERVERFLAG_DOWN; ! serverp->downTime = osi_Time(); } } else { reqp->flags |= CM_REQ_NEW_CONN_FORCED; --- 583,589 ---- if (reqp->flags & CM_REQ_NEW_CONN_FORCED) { if (!(serverp->flags & CM_SERVERFLAG_DOWN)) { serverp->flags |= CM_SERVERFLAG_DOWN; ! serverp->downTime = time(NULL); } } else { reqp->flags |= CM_REQ_NEW_CONN_FORCED; Index: openafs/src/WINNT/afsd/cm_daemon.c diff -c openafs/src/WINNT/afsd/cm_daemon.c:1.16.4.22 openafs/src/WINNT/afsd/cm_daemon.c:1.16.4.25 *** openafs/src/WINNT/afsd/cm_daemon.c:1.16.4.22 Sat Jan 5 12:56:29 2008 --- openafs/src/WINNT/afsd/cm_daemon.c Thu Jan 10 18:00:41 2008 *************** *** 50,55 **** --- 50,56 ---- static int daemon_ShutdownFlag = 0; static int cm_nDaemons = 0; + static time_t lastIPAddrChange = 0; static EVENT_HANDLE cm_Daemon_ShutdownEvent = NULL; static EVENT_HANDLE cm_IPAddrDaemon_ShutdownEvent = NULL; *************** *** 74,90 **** thrd_SetEvent(cm_IPAddrDaemon_ShutdownEvent); Result = NotifyAddrChange(NULL,NULL); if (Result == NO_ERROR && daemon_ShutdownFlag == 0) { ! smb_LanAdapterChange(); thrd_ResetEvent(cm_IPAddrDaemon_ShutdownEvent); - Sleep(2500); - if (daemon_ShutdownFlag == 0) { - osi_Log0(afsd_logp, "cm_IpAddrDaemon CheckDownServers"); - cm_CheckServers(CM_FLAG_CHECKVLDBSERVERS | CM_FLAG_CHECKUPSERVERS | CM_FLAG_CHECKDOWNSERVERS, NULL); - cm_ForceNewConnectionsAllServers(); - cm_CheckServers(CM_FLAG_CHECKFILESERVERS | CM_FLAG_CHECKUPSERVERS | CM_FLAG_CHECKDOWNSERVERS, NULL); - smb_CheckVCs(); - cm_VolStatus_Network_Addr_Change(); - } } } --- 75,83 ---- thrd_SetEvent(cm_IPAddrDaemon_ShutdownEvent); Result = NotifyAddrChange(NULL,NULL); if (Result == NO_ERROR && daemon_ShutdownFlag == 0) { ! lastIPAddrChange = osi_Time(); ! smb_SetLanAdapterChangeDetected(); thrd_ResetEvent(cm_IPAddrDaemon_ShutdownEvent); } } *************** *** 355,360 **** --- 348,354 ---- HMODULE hHookDll; char * name = "cm_Daemon_ShutdownEvent"; int configureFirewall = IsWindowsFirewallPresent(); + int bAddrChangeCheck = 0; cm_Daemon_ShutdownEvent = thrd_CreateEvent(NULL, FALSE, FALSE, name); if ( GetLastError() == ERROR_ALREADY_EXISTS ) *************** *** 401,407 **** /* check to see if the listener threads halted due to network * disconnect or other issues. If so, attempt to restart them. */ ! smb_RestartListeners(); if (daemon_ShutdownFlag == 1) break; --- 395,401 ---- /* check to see if the listener threads halted due to network * disconnect or other issues. If so, attempt to restart them. */ ! smb_RestartListeners(0); if (daemon_ShutdownFlag == 1) break; *************** *** 429,437 **** /* find out what time it is */ now = osi_Time(); /* check down servers */ ! if (now > lastDownServerCheck + cm_daemonCheckDownInterval && daemon_ShutdownFlag == 0) { lastDownServerCheck = now; osi_Log0(afsd_logp, "cm_Daemon CheckDownServers"); --- 423,440 ---- /* find out what time it is */ now = osi_Time(); + + /* Determine whether an address change took place that we need to respond to */ + if (bAddrChangeCheck) + bAddrChangeCheck = 0; + + if (lastIPAddrChange != 0 && lastIPAddrChange + 2500 < now) { + bAddrChangeCheck = 1; + lastIPAddrChange = 0; + } /* check down servers */ ! if ((bAddrChangeCheck || now > lastDownServerCheck + cm_daemonCheckDownInterval) && daemon_ShutdownFlag == 0) { lastDownServerCheck = now; osi_Log0(afsd_logp, "cm_Daemon CheckDownServers"); *************** *** 441,448 **** now = osi_Time(); } /* check up servers */ ! if (now > lastUpServerCheck + cm_daemonCheckUpInterval && daemon_ShutdownFlag == 0) { lastUpServerCheck = now; osi_Log0(afsd_logp, "cm_Daemon CheckUpServers"); --- 444,454 ---- now = osi_Time(); } + if (bAddrChangeCheck) + cm_ForceNewConnectionsAllServers(); + /* check up servers */ ! if ((bAddrChangeCheck || now > lastUpServerCheck + cm_daemonCheckUpInterval) && daemon_ShutdownFlag == 0) { lastUpServerCheck = now; osi_Log0(afsd_logp, "cm_Daemon CheckUpServers"); *************** *** 452,457 **** --- 458,468 ---- now = osi_Time(); } + if (bAddrChangeCheck) { + smb_CheckVCs(); + cm_VolStatus_Network_Addr_Change(); + } + if (now > lastVolCheck + cm_daemonCheckVolInterval && daemon_ShutdownFlag == 0) { lastVolCheck = now; *************** *** 471,477 **** now = osi_Time(); } ! if (now > lastBusyVolCheck + cm_daemonCheckOfflineVolInterval && daemon_ShutdownFlag == 0) { lastVolCheck = now; cm_CheckOfflineVolumes(); --- 482,488 ---- now = osi_Time(); } ! if ((bAddrChangeCheck || now > lastBusyVolCheck + cm_daemonCheckOfflineVolInterval) && daemon_ShutdownFlag == 0) { lastVolCheck = now; cm_CheckOfflineVolumes(); *************** *** 529,535 **** if (daemon_ShutdownFlag == 1) { break; } ! thrd_Sleep(30 * 1000); /* sleep 30 seconds */ } thrd_SetEvent(cm_Daemon_ShutdownEvent); } --- 540,546 ---- if (daemon_ShutdownFlag == 1) { break; } ! thrd_Sleep(10000); /* sleep 10 seconds */ } thrd_SetEvent(cm_Daemon_ShutdownEvent); } Index: openafs/src/WINNT/afsd/cm_freelance.c diff -c openafs/src/WINNT/afsd/cm_freelance.c:1.33.2.4 openafs/src/WINNT/afsd/cm_freelance.c:1.33.2.6 *** openafs/src/WINNT/afsd/cm_freelance.c:1.33.2.4 Sun Nov 4 19:24:46 2007 --- openafs/src/WINNT/afsd/cm_freelance.c Fri Feb 1 16:39:41 2008 *************** *** 477,483 **** char line[512]; char*t, *t2; cm_localMountPoint_t* aLocalMountPoint; ! char hdir[120]; long code; char rootCellName[256]; #if !defined(DJGPP) --- 477,483 ---- char line[512]; char*t, *t2; cm_localMountPoint_t* aLocalMountPoint; ! char hdir[260]; long code; char rootCellName[256]; #if !defined(DJGPP) *************** *** 686,692 **** /* What follows is the old code to read freelance mount points * out of a text file modified to copy the data into the registry */ ! cm_GetConfigDir(hdir); strcat(hdir, AFS_FREELANCE_INI); // open the ini file for reading fp = fopen(hdir, "r"); --- 686,692 ---- /* What follows is the old code to read freelance mount points * out of a text file modified to copy the data into the registry */ ! cm_GetConfigDir(hdir, sizeof(hdir)); strcat(hdir, AFS_FREELANCE_INI); // open the ini file for reading fp = fopen(hdir, "r"); *************** *** 821,827 **** } #if !defined(DJGPP) ! long cm_FreelanceMountPointExists(char * filename) { char* cp; char line[512]; --- 821,827 ---- } #if !defined(DJGPP) ! long cm_FreelanceMountPointExists(char * filename, int prefix_ok) { char* cp; char line[512]; *************** *** 889,894 **** --- 889,899 ---- found = 1; break; } + + if (prefix_ok && strlen(shortname) - strlen(filename) == 1 && !strncmp(shortname, filename, strlen(filename))) { + found = 1; + break; + } } RegCloseKey(hkFreelance); } *************** *** 898,904 **** return found; } ! long cm_FreelanceSymlinkExists(char * filename) { char* cp; char line[512]; --- 903,909 ---- return found; } ! long cm_FreelanceSymlinkExists(char * filename, int prefix_ok) { char* cp; char line[512]; *************** *** 946,951 **** --- 951,961 ---- found = 1; break; } + + if (prefix_ok && strlen(shortname) - strlen(filename) == 1 && !strncmp(shortname, filename, strlen(filename))) { + found = 1; + break; + } } for ( dwIndex = 0; dwIndex < dwSymlinks; dwIndex++ ) { TCHAR szValueName[16]; *************** *** 975,981 **** long cm_FreelanceAddMount(char *filename, char *cellname, char *volume, int rw, cm_fid_t *fidp) { FILE *fp; ! char hfile[120]; char line[512]; char fullname[200]; int n; --- 985,991 ---- long cm_FreelanceAddMount(char *filename, char *cellname, char *volume, int rw, cm_fid_t *fidp) { FILE *fp; ! char hfile[260]; char line[512]; char fullname[200]; int n; *************** *** 1009,1016 **** } #if !defined(DJGPP) ! if ( cm_FreelanceMountPointExists(filename) || ! cm_FreelanceSymlinkExists(filename) ) return -1; #endif --- 1019,1026 ---- } #if !defined(DJGPP) ! if ( cm_FreelanceMountPointExists(filename, 0) || ! cm_FreelanceSymlinkExists(filename, 0) ) return -1; #endif *************** *** 1076,1082 **** } else #endif { ! cm_GetConfigDir(hfile); strcat(hfile, AFS_FREELANCE_INI); fp = fopen(hfile, "r+"); if (!fp) --- 1086,1092 ---- } else #endif { ! cm_GetConfigDir(hfile, sizeof(hfile)); strcat(hfile, AFS_FREELANCE_INI); fp = fopen(hfile, "r+"); if (!fp) *************** *** 1110,1116 **** char* cp; char line[512]; char shortname[200]; ! char hfile[120], hfile2[120]; FILE *fp1, *fp2; int found=0; #if !defined(DJGPP) --- 1120,1126 ---- char* cp; char line[512]; char shortname[200]; ! char hfile[260], hfile2[260]; FILE *fp1, *fp2; int found=0; #if !defined(DJGPP) *************** *** 1165,1171 **** } else #endif { ! cm_GetConfigDir(hfile); strcat(hfile, AFS_FREELANCE_INI); strcpy(hfile2, hfile); strcat(hfile2, "2"); --- 1175,1181 ---- } else #endif { ! cm_GetConfigDir(hfile, sizeof(hfile)); strcat(hfile, AFS_FREELANCE_INI); strcpy(hfile2, hfile); strcat(hfile2, "2"); *************** *** 1246,1253 **** } #if !defined(DJGPP) ! if ( cm_FreelanceMountPointExists(filename) || ! cm_FreelanceSymlinkExists(filename) ) return CM_ERROR_EXISTS; #endif --- 1256,1263 ---- } #if !defined(DJGPP) ! if ( cm_FreelanceMountPointExists(filename, 0) || ! cm_FreelanceSymlinkExists(filename, 0) ) return CM_ERROR_EXISTS; #endif Index: openafs/src/WINNT/afsd/cm_freelance.h diff -c openafs/src/WINNT/afsd/cm_freelance.h:1.12.6.1 openafs/src/WINNT/afsd/cm_freelance.h:1.12.6.2 *** openafs/src/WINNT/afsd/cm_freelance.h:1.12.6.1 Sat Dec 22 22:39:59 2007 --- openafs/src/WINNT/afsd/cm_freelance.h Mon Jan 28 02:23:35 2008 *************** *** 19,24 **** --- 19,26 ---- extern long cm_FreelanceAddMount(char *filename, char *cellname, char *volume, int rw, cm_fid_t *fidp); extern long cm_FreelanceRemoveSymlink(char *toremove); extern long cm_FreelanceAddSymlink(char *filename, char *destination, cm_fid_t *fidp); + extern long cm_FreelanceMountPointExists(char * filename, int prefix_ok); + extern long cm_FreelanceSymlinkExists(char * filename, int prefix_ok); extern int cm_clearLocalMountPointChange(); extern int cm_FakeRootFid(cm_fid_t *fidp); Index: openafs/src/WINNT/afsd/cm_ioctl.c diff -c openafs/src/WINNT/afsd/cm_ioctl.c:1.73.2.29 openafs/src/WINNT/afsd/cm_ioctl.c:1.73.2.35 *** openafs/src/WINNT/afsd/cm_ioctl.c:1.73.2.29 Fri Jan 4 02:58:40 2008 --- openafs/src/WINNT/afsd/cm_ioctl.c Tue Feb 5 15:49:30 2008 *************** *** 211,218 **** /* parse the passed-in file name and do a namei on it. If we fail, * return an error code, otherwise return the vnode located in *scpp. */ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, ! cm_scache_t **scpp) { long code; #ifndef AFSIFS --- 211,220 ---- /* parse the passed-in file name and do a namei on it. If we fail, * return an error code, otherwise return the vnode located in *scpp. */ + #define CM_PARSE_FLAG_LITERAL 1 + long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, ! cm_scache_t **scpp, afs_uint32 flags) { long code; #ifndef AFSIFS *************** *** 221,227 **** #endif char * relativePath; char * lastComponent = NULL; ! afs_uint32 follow = 0; relativePath = ioctlp->inDatap; /* setup the next data value for the caller to use */ --- 223,229 ---- #endif char * relativePath; char * lastComponent = NULL; ! afs_uint32 follow = (flags & CM_PARSE_FLAG_LITERAL ? CM_FLAG_NOMOUNTCHASE : CM_FLAG_FOLLOW); relativePath = ioctlp->inDatap; /* setup the next data value for the caller to use */ *************** *** 236,245 **** * \\netbios-name\submount\path\. * \\netbios-name\submount\path\file */ ! TranslateExtendedChars(relativePath); /* This is usually nothing, but for StatMountPoint it is the file name. */ ! TranslateExtendedChars(ioctlp->inDatap); #ifdef AFSIFS /* we have passed the whole path, including the afs prefix. --- 238,253 ---- * \\netbios-name\submount\path\. * \\netbios-name\submount\path\file */ ! ! /* We do not perform path name translation on the ioctl path data ! * because these paths were not translated by Windows through the ! * file system API. Therefore, they are not OEM characters but ! * whatever the display character set is. ! */ ! // TranslateExtendedChars(relativePath); /* This is usually nothing, but for StatMountPoint it is the file name. */ ! // TranslateExtendedChars(ioctlp->inDatap); #ifdef AFSIFS /* we have passed the whole path, including the afs prefix. *************** *** 247,253 **** and it returns the correct (full) path. therefore, there is no drive letter, and the path is absolute. */ code = cm_NameI(cm_data.rootSCachep, relativePath, ! CM_FLAG_CASEFOLD | follow, userp, "", reqp, scpp); if (code) { --- 255,261 ---- and it returns the correct (full) path. therefore, there is no drive letter, and the path is absolute. */ code = cm_NameI(cm_data.rootSCachep, relativePath, ! CM_FLAG_CASEFOLD, userp, "", reqp, scpp); if (code) { *************** *** 300,306 **** code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, NULL, reqp, &iscp); if (code == 0) ! code = cm_NameI(iscp, lastComponent, CM_FLAG_CASEFOLD | CM_FLAG_NOMOUNTCHASE, userp, NULL, reqp, scpp); if (iscp) cm_ReleaseSCache(iscp); --- 308,314 ---- code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, NULL, reqp, &iscp); if (code == 0) ! code = cm_NameI(iscp, lastComponent, CM_FLAG_CASEFOLD | follow, userp, NULL, reqp, scpp); if (iscp) cm_ReleaseSCache(iscp); *************** *** 347,353 **** code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, NULL, reqp, &iscp); if (code == 0) ! code = cm_NameI(iscp, lastComponent, CM_FLAG_CASEFOLD | CM_FLAG_NOMOUNTCHASE, userp, NULL, reqp, scpp); if (iscp) cm_ReleaseSCache(iscp); --- 355,361 ---- code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, NULL, reqp, &iscp); if (code == 0) ! code = cm_NameI(iscp, lastComponent, CM_FLAG_CASEFOLD | follow, userp, NULL, reqp, scpp); if (iscp) cm_ReleaseSCache(iscp); *************** *** 379,390 **** code = cm_NameI(substRootp, relativePath, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, NULL, reqp, &iscp); if (code == 0) ! code = cm_NameI(iscp, lastComponent, CM_FLAG_CASEFOLD | CM_FLAG_NOMOUNTCHASE, userp, NULL, reqp, scpp); if (iscp) cm_ReleaseSCache(iscp); } else { ! code = cm_NameI(substRootp, relativePath, CM_FLAG_CASEFOLD, userp, NULL, reqp, scpp); } if (code) { --- 387,398 ---- code = cm_NameI(substRootp, relativePath, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, NULL, reqp, &iscp); if (code == 0) ! code = cm_NameI(iscp, lastComponent, CM_FLAG_CASEFOLD | follow, userp, NULL, reqp, scpp); if (iscp) cm_ReleaseSCache(iscp); } else { ! code = cm_NameI(substRootp, relativePath, CM_FLAG_CASEFOLD | follow, userp, NULL, reqp, scpp); } if (code) { *************** *** 405,416 **** void cm_SkipIoctlPath(smb_ioctl_t *ioctlp) { ! long temp; ! temp = (long) strlen(ioctlp->inDatap) + 1; ioctlp->inDatap += temp; } /* format the specified path to look like "/afs//usr", by * adding "/afs" (if necessary) in front, changing any \'s to /'s, and --- 413,454 ---- void cm_SkipIoctlPath(smb_ioctl_t *ioctlp) { ! size_t temp; ! temp = strlen(ioctlp->inDatap) + 1; ioctlp->inDatap += temp; } + /* + * Must be called before cm_ParseIoctlPath or cm_SkipIoctlPath + */ + static cm_ioctlQueryOptions_t * + cm_IoctlGetQueryOptions(struct smb_ioctl *ioctlp, struct cm_user *userp) + { + afs_uint32 pathlen = strlen(ioctlp->inDatap) + 1; + char *p = ioctlp->inDatap + pathlen; + cm_ioctlQueryOptions_t * optionsp = NULL; + + if (ioctlp->inCopied > p - ioctlp->inAllocp) { + optionsp = (cm_ioctlQueryOptions_t *)p; + if (optionsp->size < 12 /* minimum size of struct */) + optionsp = NULL; + } + + return optionsp; + } + + /* + * Must be called after cm_ParseIoctlPath or cm_SkipIoctlPath + * or any other time that ioctlp->inDatap points at the + * cm_ioctlQueryOptions_t object. + */ + static void + cm_IoctlSkipQueryOptions(struct smb_ioctl *ioctlp, struct cm_user *userp) + { + cm_ioctlQueryOptions_t * optionsp = (cm_ioctlQueryOptions_t *)ioctlp->inDatap; + ioctlp->inDatap += optionsp->size; + } /* format the specified path to look like "/afs//usr", by * adding "/afs" (if necessary) in front, changing any \'s to /'s, and *************** *** 576,586 **** int tlen; cm_req_t req; struct rx_connection * callp; cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); ! if (code) return code; /* now make the get acl call */ #ifdef AFS_FREELANCE_CLIENT --- 614,637 ---- int tlen; cm_req_t req; struct rx_connection * callp; + cm_ioctlQueryOptions_t *optionsp; + afs_uint32 flags = 0; cm_InitReq(&req); ! optionsp = cm_IoctlGetQueryOptions(ioctlp, userp); ! if (optionsp && CM_IOCTL_QOPTS_HAVE_LITERAL(optionsp)) ! flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0); ! ! if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) { ! cm_SkipIoctlPath(ioctlp); ! ! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req); ! } else { ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags); ! } ! if (code) ! return code; /* now make the get acl call */ #ifdef AFS_FREELANCE_CLIENT *************** *** 623,633 **** cm_scache_t *scp; cm_cell_t *cellp; cm_req_t req; cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); ! if (code) return code; #ifdef AFS_FREELANCE_CLIENT if ( cm_freelanceEnabled && --- 674,696 ---- cm_scache_t *scp; cm_cell_t *cellp; cm_req_t req; + cm_ioctlQueryOptions_t *optionsp; + afs_uint32 flags = 0; cm_InitReq(&req); ! optionsp = cm_IoctlGetQueryOptions(ioctlp, userp); ! if (optionsp && CM_IOCTL_QOPTS_HAVE_LITERAL(optionsp)) ! flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0); ! ! if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) { ! cm_SkipIoctlPath(ioctlp); ! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req); ! } else { ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags); ! } ! if (code) ! return code; #ifdef AFS_FREELANCE_CLIENT if ( cm_freelanceEnabled && *************** *** 640,646 **** } else #endif /* AFS_FREELANCE_CLIENT */ { ! cellp = cm_FindCellByID(scp->fid.cell); if (cellp) { StringCbCopyA(ioctlp->outDatap, SMB_IOCTL_MAXDATA - (ioctlp->outDatap - ioctlp->outAllocp), cellp->name); ioctlp->outDatap += strlen(ioctlp->outDatap) + 1; --- 703,709 ---- } else #endif /* AFS_FREELANCE_CLIENT */ { ! cellp = cm_FindCellByID(scp->fid.cell, CM_FLAG_NOPROBE); if (cellp) { StringCbCopyA(ioctlp->outDatap, SMB_IOCTL_MAXDATA - (ioctlp->outDatap - ioctlp->outAllocp), cellp->name); ioctlp->outDatap += strlen(ioctlp->outDatap) + 1; *************** *** 668,674 **** cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); if (code) return code; #ifdef AFS_FREELANCE_CLIENT --- 731,737 ---- cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, 0); if (code) return code; #ifdef AFS_FREELANCE_CLIENT *************** *** 715,720 **** --- 778,785 ---- cm_InitReq(&req); + cm_SkipIoctlPath(ioctlp); /* we don't care about the path */ + lock_ObtainWrite(&cm_scacheLock); for (i=0; inextp) { *************** *** 739,750 **** unsigned long volume; unsigned long cell; cm_req_t req; cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); ! if (code) return code; ! #ifdef AFS_FREELANCE_CLIENT if ( scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID ) { code = CM_ERROR_NOACCESS; --- 804,827 ---- unsigned long volume; unsigned long cell; cm_req_t req; + cm_ioctlQueryOptions_t *optionsp; + afs_uint32 flags = 0; cm_InitReq(&req); ! optionsp = cm_IoctlGetQueryOptions(ioctlp, userp); ! if (optionsp && CM_IOCTL_QOPTS_HAVE_LITERAL(optionsp)) ! flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0); ! ! if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) { ! cm_SkipIoctlPath(ioctlp); ! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req); ! } else { ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags); ! } ! if (code) ! return code; ! #ifdef AFS_FREELANCE_CLIENT if ( scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID ) { code = CM_ERROR_NOACCESS; *************** *** 765,776 **** long code; cm_scache_t *scp; cm_req_t req; cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); ! if (code) return code; ! #ifdef AFS_FREELANCE_CLIENT if ( scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID ) { code = CM_ERROR_NOACCESS; --- 842,865 ---- long code; cm_scache_t *scp; cm_req_t req; + cm_ioctlQueryOptions_t *optionsp; + afs_uint32 flags = 0; cm_InitReq(&req); ! optionsp = cm_IoctlGetQueryOptions(ioctlp, userp); ! if (optionsp && CM_IOCTL_QOPTS_HAVE_LITERAL(optionsp)) ! flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0); ! ! if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) { ! cm_SkipIoctlPath(ioctlp); ! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req); ! } else { ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags); ! } ! if (code) ! return code; ! #ifdef AFS_FREELANCE_CLIENT if ( scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID ) { code = CM_ERROR_NOACCESS; *************** *** 802,808 **** cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); if (code) return code; #ifdef AFS_FREELANCE_CLIENT --- 891,897 ---- cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, 0); if (code) return code; #ifdef AFS_FREELANCE_CLIENT *************** *** 811,817 **** } else #endif { ! cellp = cm_FindCellByID(scp->fid.cell); osi_assertx(cellp, "null cm_cell_t"); if (scp->flags & CM_SCACHEFLAG_RO) { --- 900,906 ---- } else #endif { ! cellp = cm_FindCellByID(scp->fid.cell, 0); osi_assertx(cellp, "null cm_cell_t"); if (scp->flags & CM_SCACHEFLAG_RO) { *************** *** 900,910 **** char *MOTD; cm_req_t req; struct rx_connection * callp; cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); ! if (code) return code; #ifdef AFS_FREELANCE_CLIENT if ( scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID ) { --- 989,1011 ---- char *MOTD; cm_req_t req; struct rx_connection * callp; + cm_ioctlQueryOptions_t *optionsp; + afs_uint32 flags = 0; cm_InitReq(&req); ! optionsp = cm_IoctlGetQueryOptions(ioctlp, userp); ! if (optionsp && CM_IOCTL_QOPTS_HAVE_LITERAL(optionsp)) ! flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0); ! ! if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) { ! cm_SkipIoctlPath(ioctlp); ! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req); ! } else { ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags); ! } ! if (code) ! return code; #ifdef AFS_FREELANCE_CLIENT if ( scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID ) { *************** *** 963,975 **** register char *cp; cm_fid_t fid; cm_req_t req; cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); if (code) return code; memset(&fid, 0, sizeof(cm_fid_t)); fid.volume = scp->fid.volume; fid.vnode = scp->fid.vnode; fid.unique = scp->fid.unique; --- 1064,1083 ---- register char *cp; cm_fid_t fid; cm_req_t req; + cm_ioctlQueryOptions_t * optionsp; + afs_uint32 flags = 0; cm_InitReq(&req); ! optionsp = cm_IoctlGetQueryOptions(ioctlp, userp); ! if (optionsp && CM_IOCTL_QOPTS_HAVE_LITERAL(optionsp)) ! flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0); ! ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags); if (code) return code; memset(&fid, 0, sizeof(cm_fid_t)); + fid.cell = scp->fid.cell; fid.volume = scp->fid.volume; fid.vnode = scp->fid.vnode; fid.unique = scp->fid.unique; *************** *** 987,1003 **** return 0; } long cm_IoctlGetOwner(struct smb_ioctl *ioctlp, struct cm_user *userp) { cm_scache_t *scp; register long code; register char *cp; cm_req_t req; cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); ! if (code) return code; /* Copy all this junk into msg->im_data, keeping track of the lengths. */ cp = ioctlp->outDatap; --- 1095,1162 ---- return 0; } + long cm_IoctlGetFileType(struct smb_ioctl *ioctlp, struct cm_user *userp) + { + cm_scache_t *scp; + register long code; + register char *cp; + afs_uint32 fileType = 0; + cm_req_t req; + cm_ioctlQueryOptions_t * optionsp; + afs_uint32 flags = 0; + + cm_InitReq(&req); + + optionsp = cm_IoctlGetQueryOptions(ioctlp, userp); + if (optionsp && CM_IOCTL_QOPTS_HAVE_LITERAL(optionsp)) + flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0); + + if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) { + cm_SkipIoctlPath(ioctlp); + code = cm_GetSCache(&optionsp->fid, &scp, userp, &req); + } else { + code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags); + } + if (code) + return code; + + fileType = scp->fileType; + cm_ReleaseSCache(scp); + + /* Copy all this junk into msg->im_data, keeping track of the lengths. */ + cp = ioctlp->outDatap; + memcpy(cp, (char *)&fileType, sizeof(fileType)); + cp += sizeof(fileType); + + /* return new size */ + ioctlp->outDatap = cp; + + return 0; + } + long cm_IoctlGetOwner(struct smb_ioctl *ioctlp, struct cm_user *userp) { cm_scache_t *scp; register long code; register char *cp; cm_req_t req; + cm_ioctlQueryOptions_t *optionsp; + afs_uint32 flags = 0; cm_InitReq(&req); ! optionsp = cm_IoctlGetQueryOptions(ioctlp, userp); ! if (optionsp && CM_IOCTL_QOPTS_HAVE_LITERAL(optionsp)) ! flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0); ! ! if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) { ! cm_SkipIoctlPath(ioctlp); ! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req); ! } else { ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags); ! } ! if (code) ! return code; /* Copy all this junk into msg->im_data, keeping track of the lengths. */ cp = ioctlp->outDatap; *************** *** 1025,1070 **** unsigned long volume; char *cp; cm_req_t req; cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); ! if (code) return code; ! volume = scp->fid.volume; ! cellp = cm_FindCellByID(scp->fid.cell); cm_ReleaseSCache(scp); if (!cellp) return CM_ERROR_NOSUCHCELL; ! code = cm_GetVolumeByID(cellp, volume, userp, &req, CM_GETVOL_FLAG_CREATE, &tvp); ! if (code) ! return code; ! cp = ioctlp->outDatap; ! lock_ObtainMutex(&tvp->mx); ! tsrpp = cm_GetVolServers(tvp, volume); ! lock_ObtainRead(&cm_serverLock); ! for (current = *tsrpp; current; current = current->next) { ! tsp = current->server; ! memcpy(cp, (char *)&tsp->addr.sin_addr.s_addr, sizeof(long)); ! cp += sizeof(long); ! } ! lock_ReleaseRead(&cm_serverLock); ! cm_FreeServerList(tsrpp, 0); ! lock_ReleaseMutex(&tvp->mx); ! /* still room for terminating NULL, add it on */ ! volume = 0; /* reuse vbl */ ! memcpy(cp, (char *)&volume, sizeof(long)); ! cp += sizeof(long); ! ioctlp->outDatap = cp; ! cm_PutVolume(tvp); return 0; } --- 1184,1265 ---- unsigned long volume; char *cp; cm_req_t req; + cm_ioctlQueryOptions_t *optionsp; + afs_uint32 flags = 0; cm_InitReq(&req); ! optionsp = cm_IoctlGetQueryOptions(ioctlp, userp); ! if (optionsp && CM_IOCTL_QOPTS_HAVE_LITERAL(optionsp)) ! flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0); ! ! if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) { ! cm_SkipIoctlPath(ioctlp); ! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req); ! } else { ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags); ! } ! if (code) ! return code; ! volume = scp->fid.volume; ! cellp = cm_FindCellByID(scp->fid.cell, 0); cm_ReleaseSCache(scp); if (!cellp) return CM_ERROR_NOSUCHCELL; ! #ifdef AFS_FREELANCE_CLIENT ! if ( cellp->cellID == AFS_FAKE_ROOT_CELL_ID) { ! struct in_addr addr; ! ! addr.s_net = 127; ! addr.s_host = 0; ! addr.s_lh = 0; ! addr.s_impno = 1; ! ! cp = ioctlp->outDatap; ! ! memcpy(cp, (char *)&addr, sizeof(addr)); ! cp += sizeof(addr); ! ! /* still room for terminating NULL, add it on */ ! addr.s_addr = 0; ! memcpy(cp, (char *)&addr, sizeof(addr)); ! cp += sizeof(addr); ! ! ioctlp->outDatap = cp; ! } else ! #endif ! { ! code = cm_GetVolumeByID(cellp, volume, userp, &req, CM_GETVOL_FLAG_CREATE, &tvp); ! if (code) ! return code; ! cp = ioctlp->outDatap; ! lock_ObtainMutex(&tvp->mx); ! tsrpp = cm_GetVolServers(tvp, volume); ! lock_ObtainRead(&cm_serverLock); ! for (current = *tsrpp; current; current = current->next) { ! tsp = current->server; ! memcpy(cp, (char *)&tsp->addr.sin_addr.s_addr, sizeof(long)); ! cp += sizeof(long); ! } ! lock_ReleaseRead(&cm_serverLock); ! cm_FreeServerList(tsrpp, 0); ! lock_ReleaseMutex(&tvp->mx); ! /* still room for terminating NULL, add it on */ ! volume = 0; /* reuse vbl */ ! memcpy(cp, (char *)&volume, sizeof(long)); ! cp += sizeof(long); ! ioctlp->outDatap = cp; ! cm_PutVolume(tvp); ! } return 0; } *************** *** 1078,1084 **** cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &dscp); if (code) return code; cp = ioctlp->inDatap; --- 1273,1279 ---- cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &dscp, 0); if (code) return code; cp = ioctlp->inDatap; *************** *** 1119,1125 **** cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &dscp); if (code) return code; cp = ioctlp->inDatap; --- 1314,1320 ---- cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &dscp, 0); if (code) return code; cp = ioctlp->inDatap; *************** *** 1214,1227 **** */ if (haveCell) { /* have cell name, too */ ! cellp = cm_GetCell(cp, 0); if (!cellp) return CM_ERROR_NOSUCHCELL; } else cellp = (cm_cell_t *) 0; if (!cellp && (temp & 2)) { /* use local cell */ ! cellp = cm_FindCellByID(1); } if (!(temp & 1)) { /* if not fast, call server checker routine */ /* check down servers */ --- 1409,1422 ---- */ if (haveCell) { /* have cell name, too */ ! cellp = cm_GetCell(cp, (temp & 1) ? CM_FLAG_NOPROBE : 0); if (!cellp) return CM_ERROR_NOSUCHCELL; } else cellp = (cm_cell_t *) 0; if (!cellp && (temp & 2)) { /* use local cell */ ! cellp = cm_FindCellByID(1, 0); } if (!(temp & 1)) { /* if not fast, call server checker routine */ /* check down servers */ *************** *** 1403,1410 **** return CM_ERROR_NOMORETOKENS; /* mapped to EDOM */ } - extern long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *namep); - long cm_IoctlNewCell(struct smb_ioctl *ioctlp, struct cm_user *userp) { /* NT cache manager will read cell information from CellServDB each time --- 1598,1603 ---- *************** *** 1417,1422 **** --- 1610,1617 ---- */ cm_cell_t *cp; + cm_cell_rock_t rock; + cm_SkipIoctlPath(ioctlp); lock_ObtainWrite(&cm_cellLock); *************** *** 1428,1439 **** /* delete all previous server lists - cm_FreeServerList will ask for write on cm_ServerLock*/ cm_FreeServerList(&cp->vlServersp, CM_FREESERVERLIST_DELETE); cp->vlServersp = NULL; ! code = cm_SearchCellFile(cp->name, cp->name, cm_AddCellProc, cp); #ifdef AFS_AFSDB_ENV if (code) { if (cm_dnsEnabled) { int ttl; ! code = cm_SearchCellByDNS(cp->name, cp->name, &ttl, cm_AddCellProc, cp); if ( code == 0 ) { /* got cell from DNS */ cp->flags |= CM_CELLFLAG_DNS; cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID; --- 1623,1636 ---- /* delete all previous server lists - cm_FreeServerList will ask for write on cm_ServerLock*/ cm_FreeServerList(&cp->vlServersp, CM_FREESERVERLIST_DELETE); cp->vlServersp = NULL; ! rock.cellp = cp; ! rock.flags = 0; ! code = cm_SearchCellFile(cp->name, cp->name, cm_AddCellProc, &rock); #ifdef AFS_AFSDB_ENV if (code) { if (cm_dnsEnabled) { int ttl; ! code = cm_SearchCellByDNS(cp->name, cp->name, &ttl, cm_AddCellProc, &rock); if ( code == 0 ) { /* got cell from DNS */ cp->flags |= CM_CELLFLAG_DNS; cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID; *************** *** 1666,1672 **** } else /* add a new server without a cell */ { ! tsp = cm_NewServer(&tmp, type, NULL); /* refcount = 1 */ tsp->ipRank = rank; } lock_ObtainMutex(&tsp->mx); --- 1863,1869 ---- } else /* add a new server without a cell */ { ! tsp = cm_NewServer(&tmp, type, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */ tsp->ipRank = rank; } lock_ObtainMutex(&tsp->mx); *************** *** 1885,1891 **** cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &dscp); if (code) return code; cp = ioctlp->inDatap; --- 2082,2088 ---- cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &dscp, 0); if (code) return code; cp = ioctlp->inDatap; *************** *** 1943,1949 **** cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &dscp); if (code) return code; cp = ioctlp->inDatap; --- 2140,2146 ---- cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &dscp, 0); if (code) return code; cp = ioctlp->inDatap; *************** *** 1972,1978 **** cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &dscp); if (code) return code; cp = ioctlp->inDatap; --- 2169,2175 ---- cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &dscp, 0); if (code) return code; cp = ioctlp->inDatap; *************** *** 2164,2170 **** tp += sizeof(int); /* cell name */ ! cellp = cm_GetCell(tp, CM_FLAG_CREATE); if (!cellp) return CM_ERROR_NOSUCHCELL; tp += strlen(tp) + 1; --- 2361,2367 ---- tp += sizeof(int); /* cell name */ ! cellp = cm_GetCell(tp, CM_FLAG_CREATE | CM_FLAG_NOPROBE); if (!cellp) return CM_ERROR_NOSUCHCELL; tp += strlen(tp) + 1; *************** *** 2934,2943 **** cm_vol_state_t *statep; afs_uint32 volume; cm_req_t req; cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); if (code) return code; --- 3131,3151 ---- cm_vol_state_t *statep; afs_uint32 volume; cm_req_t req; + cm_ioctlQueryOptions_t *optionsp; + afs_uint32 flags = 0; cm_InitReq(&req); ! optionsp = cm_IoctlGetQueryOptions(ioctlp, userp); ! if (optionsp && CM_IOCTL_QOPTS_HAVE_LITERAL(optionsp)) ! flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0); ! ! if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) { ! cm_SkipIoctlPath(ioctlp); ! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req); ! } else { ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags); ! } if (code) return code; *************** *** 2950,2956 **** { volume = scp->fid.volume; ! cellp = cm_FindCellByID(scp->fid.cell); cm_ReleaseSCache(scp); --- 3158,3164 ---- { volume = scp->fid.volume; ! cellp = cm_FindCellByID(scp->fid.cell, 0); cm_ReleaseSCache(scp); *************** *** 3042,3048 **** } if (testp->fid.cell > 0) { ! cellp = cm_FindCellByID(testp->fid.cell); } if (!cellp) --- 3250,3256 ---- } if (testp->fid.cell > 0) { ! cellp = cm_FindCellByID(testp->fid.cell, 0); } if (!cellp) Index: openafs/src/WINNT/afsd/cm_ioctl.h diff -c openafs/src/WINNT/afsd/cm_ioctl.h:1.14.2.4 openafs/src/WINNT/afsd/cm_ioctl.h:1.14.2.5 *** ope