Index: openafs/src/NTMakefile diff -c openafs/src/NTMakefile:1.24.2.1 openafs/src/NTMakefile:1.24.2.2 *** openafs/src/NTMakefile:1.24.2.1 Tue Mar 22 14:48:28 2005 --- openafs/src/NTMakefile Wed May 18 18:57:06 2005 *************** *** 469,531 **** $(NTMAKE) $(CD) ..\..\.. ! afsadmsvr: license echo ***** $@ $(DOCD) $(SRC)\WINNT\$@ $(CD) $(SRC)\WINNT\$@ $(NTMAKE) $(CD) ..\..\.. ! afsusrmgr: afsadmsvr echo ***** $@ $(DOCD) $(SRC)\WINNT\$@ $(CD) $(SRC)\WINNT\$@ $(NTMAKE) $(CD) ..\..\.. ! afssvrmgr: afsusrmgr echo ***** $@ $(DOCD) $(SRC)\WINNT\$@ $(CD) $(SRC)\WINNT\$@ $(NTMAKE) $(CD) ..\..\.. ! afssvrcfg: afssvrmgr echo ***** $@ $(DOCD) $(SRC)\WINNT\$@ $(CD) $(SRC)\WINNT\$@ $(NTMAKE) $(CD) ..\..\.. ! afssvrcpa: afssvrcfg echo ***** $@ $(DOCD) $(SRC)\WINNT\$@ $(CD) $(SRC)\WINNT\$@ $(NTMAKE) $(CD) ..\..\.. ! client_talocale: afssvrcpa echo ***** $@ ! $(DOCD) $(SRC)\WINNT\talocale ! $(CD) $(SRC)\WINNT\talocale $(NTMAKE) $(CD) ..\..\.. ! client_osi: client_talocale echo ***** $@ $(DOCD) $(SRC)\WINNT\$@ $(CD) $(SRC)\WINNT\$@ $(NTMAKE) $(CD) ..\..\.. ! afsd: client_osi echo ***** $@ ! $(DOCD) $(SRC)\WINNT\$@ ! $(CD) $(SRC)\WINNT\$@ $(NTMAKE) $(CD) ..\..\.. ! client_cpa: afsd echo ***** $@ $(DOCD) $(SRC)\WINNT\$@ $(CD) $(SRC)\WINNT\$@ --- 469,531 ---- $(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\$@ $(NTMAKE) $(CD) ..\..\.. ! afsusrmgr: afsadmsvr echo ***** $@ $(DOCD) $(SRC)\WINNT\$@ $(CD) $(SRC)\WINNT\$@ $(NTMAKE) $(CD) ..\..\.. ! afssvrmgr: afsusrmgr echo ***** $@ $(DOCD) $(SRC)\WINNT\$@ $(CD) $(SRC)\WINNT\$@ $(NTMAKE) $(CD) ..\..\.. ! afssvrcfg: afssvrmgr echo ***** $@ ! $(DOCD) $(SRC)\WINNT\$@ ! $(CD) $(SRC)\WINNT\$@ $(NTMAKE) $(CD) ..\..\.. ! afssvrcpa: afssvrcfg echo ***** $@ $(DOCD) $(SRC)\WINNT\$@ $(CD) $(SRC)\WINNT\$@ $(NTMAKE) $(CD) ..\..\.. ! client_talocale: afssvrcpa echo ***** $@ ! $(DOCD) $(SRC)\WINNT\talocale ! $(CD) $(SRC)\WINNT\talocale $(NTMAKE) $(CD) ..\..\.. ! client_cpa: client_talocale echo ***** $@ $(DOCD) $(SRC)\WINNT\$@ $(CD) $(SRC)\WINNT\$@ Index: openafs/src/WINNT/afsapplib/al_admsvr.cpp diff -c openafs/src/WINNT/afsapplib/al_admsvr.cpp:1.2 openafs/src/WINNT/afsapplib/al_admsvr.cpp:1.2.20.1 *** openafs/src/WINNT/afsapplib/al_admsvr.cpp:1.2 Sat Nov 4 05:01:18 2000 --- openafs/src/WINNT/afsapplib/al_admsvr.cpp Wed May 18 18:57:06 2005 *************** *** 25,31 **** { BOOL fUseAdminServer; DWORD idAdminServerClient; ! } l; /* --- 25,31 ---- { BOOL fUseAdminServer; DWORD idAdminServerClient; ! } l = {0, 0}; /* Index: openafs/src/WINNT/afsapplib/al_creds.cpp diff -c openafs/src/WINNT/afsapplib/al_creds.cpp:1.4 openafs/src/WINNT/afsapplib/al_creds.cpp:1.4.2.1 *** openafs/src/WINNT/afsapplib/al_creds.cpp:1.4 Sat Nov 29 17:07:57 2003 --- openafs/src/WINNT/afsapplib/al_creds.cpp Wed May 18 18:57:06 2005 *************** *** 68,74 **** { rc = asc_CredentialsCrack (idClient, hCreds, pszCell, pszUser, pst, &status); } ! else if (OpenClientLibrary()) { char szUserA[ cchRESOURCE ], szUser2A[ cchRESOURCE ]; char szCellA[ cchRESOURCE ]; --- 68,75 ---- { rc = asc_CredentialsCrack (idClient, hCreds, pszCell, pszUser, pst, &status); } ! else ! if (OpenClientLibrary()) { char szUserA[ cchRESOURCE ], szUser2A[ cchRESOURCE ]; char szCellA[ cchRESOURCE ]; *************** *** 102,108 **** { hCreds = asc_CredentialsGet (idClient, pszCell, &status); } ! else if (OpenClientLibrary()) { LPSTR pszCellA = StringToAnsi (pszCell); --- 103,110 ---- { hCreds = asc_CredentialsGet (idClient, pszCell, &status); } ! else ! if (OpenClientLibrary()) { LPSTR pszCellA = StringToAnsi (pszCell); *************** *** 128,134 **** { hCreds = asc_CredentialsSet (idClient, pszCell, pszUser, pszPassword, &status); } ! else if (OpenClientLibrary()) { char szCellA[ cchRESOURCE ]; char szUserA[ cchRESOURCE ]; --- 130,137 ---- { hCreds = asc_CredentialsSet (idClient, pszCell, pszUser, pszPassword, &status); } ! else ! if (OpenClientLibrary()) { char szCellA[ cchRESOURCE ]; char szUserA[ cchRESOURCE ]; *************** *** 903,908 **** --- 906,914 ---- BOOL AfsAppLib_IsUserAdmin (PVOID hCreds, LPTSTR pszUser) { + #ifndef USE_KASERVER + return TRUE; + #else BOOL rc = FALSE; afs_status_t status; *************** *** 969,973 **** --- 975,980 ---- } return rc; + #endif /* USE_KASERVER */ } Index: openafs/src/WINNT/afsapplib/al_misc.cpp diff -c openafs/src/WINNT/afsapplib/al_misc.cpp:1.2 openafs/src/WINNT/afsapplib/al_misc.cpp:1.2.20.1 *** openafs/src/WINNT/afsapplib/al_misc.cpp:1.2 Sat Nov 4 05:01:20 2000 --- openafs/src/WINNT/afsapplib/al_misc.cpp Wed May 18 18:57:06 2005 *************** *** 213,219 **** ULONG status; return asc_ErrorCodeTranslate (idClient, code, idLanguage, pszText, &status); } ! else if (OpenUtilLibrary()) { const char *pszTextA = NULL; afs_status_t status; --- 213,220 ---- ULONG status; return asc_ErrorCodeTranslate (idClient, code, idLanguage, pszText, &status); } ! else ! if (OpenUtilLibrary()) { const char *pszTextA = NULL; afs_status_t status; *************** *** 463,469 **** { rc = asc_LocalCellGet (idClient, szCell, &status); } ! else if (OpenClientLibrary()) { char szCellNameA[ MAX_PATH ]; if ((rc = afsclient_LocalCellGet (szCellNameA, (afs_status_p)&status)) == TRUE) --- 464,471 ---- { rc = asc_LocalCellGet (idClient, szCell, &status); } ! else ! if (OpenClientLibrary()) { char szCellNameA[ MAX_PATH ]; if ((rc = afsclient_LocalCellGet (szCellNameA, (afs_status_p)&status)) == TRUE) Index: openafs/src/WINNT/afsd/NTMakefile diff -c openafs/src/WINNT/afsd/NTMakefile:1.27.2.8 openafs/src/WINNT/afsd/NTMakefile:1.27.2.9 *** openafs/src/WINNT/afsd/NTMakefile:1.27.2.8 Thu Apr 28 08:05:19 2005 --- openafs/src/WINNT/afsd/NTMakefile Sun May 29 23:52:52 2005 *************** *** 282,288 **** $(EXEDIR)\afsdacl.exe \ $(LOGON_DLLFILE) \ $(EXEDIR)\afsshare.exe \ ! $(DESTDIR)\bin\kpasswd.exe $(EXEDIR)\cmdebug.exe install9X: install_headers $(CONF_DLLFILE) \ $(EXEDIR)\klog.exe \ --- 282,288 ---- $(EXEDIR)\afsdacl.exe \ $(LOGON_DLLFILE) \ $(EXEDIR)\afsshare.exe \ ! $(DESTDIR)\bin\kpasswd.exe $(EXEDIR)\cmdebug.exe $(EXEDIR)\afscpcc.exe install9X: install_headers $(CONF_DLLFILE) \ $(EXEDIR)\klog.exe \ *************** *** 354,359 **** --- 354,365 ---- $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib $(EXEPREP) + # afscpcc.exe + $(EXEDIR)\afscpcc.exe: $(OUT)\afscpcc.obj $(OUT)\afscpcc.res $(LOGON_DLLLIBS) + $(EXECONLINK) dnsapi.lib mpr.lib iphlpapi.lib + $(EXEPREP) + + # afsd.exe AFSD_EXEFILE = $(EXEDIR)\afsd.exe *************** *** 472,477 **** --- 478,485 ---- $(OUT)\unlog.res: unlog.rc AFS_component_version_number.h + $(OUT)\afscpcc.res: afscpcc.rc AFS_component_version_number.h + afsd_eventmessages.rc: afsd_eventmessages.h $(OUT)\afsd_service.res: afsd_service.rc afsd_eventmessages.rc AFS_component_version_number.h Index: openafs/src/WINNT/afsd/afscpcc.c diff -c /dev/null openafs/src/WINNT/afsd/afscpcc.c:1.1.2.2 *** /dev/null Wed Jun 1 00:59:55 2005 --- openafs/src/WINNT/afsd/afscpcc.c Sun May 29 23:52:52 2005 *************** *** 0 **** --- 1,21 ---- + /* + * Copyright 2005, Secure Endpoints Inc. + * All Rights Reserved. + * + * This software has been released under the terms of the MIT License. + */ + + #include + #include + + int main(int argc, char *argv[]) + { + if ( argc != 2 ) + return 1; + + KFW_initialize(); + + return KFW_AFS_copy_system_file_to_default_cache(argv[1]); + } + + Index: openafs/src/WINNT/afsd/afscpcc.rc diff -c /dev/null openafs/src/WINNT/afsd/afscpcc.rc:1.1.2.2 *** /dev/null Wed Jun 1 00:59:55 2005 --- openafs/src/WINNT/afsd/afscpcc.rc Sun May 29 23:52:52 2005 *************** *** 0 **** --- 1,15 ---- + /* + * Copyright 2005, Secure Endpoints Inc. + * All Rights Reserved. + * + * This software has been released under the terms of the MIT License. + */ + + /* Define VERSIONINFO resource */ + + #define AFS_VERINFO_FILE_DESCRIPTION "AFS Logon Copy Credentials Command" + #define AFS_VERINFO_NAME "afscpcc" + #define AFS_VERINFO_FILENAME "afscpcc.exe" + + #include "AFS_component_version_number.h" + #include "..\..\config\NTVersioninfo.rc" Index: openafs/src/WINNT/afsd/afsd.h diff -c openafs/src/WINNT/afsd/afsd.h:1.5.2.5 openafs/src/WINNT/afsd/afsd.h:1.5.2.6 *** openafs/src/WINNT/afsd/afsd.h:1.5.2.5 Tue Apr 19 17:07:14 2005 --- openafs/src/WINNT/afsd/afsd.h Wed May 18 18:57:07 2005 *************** *** 147,150 **** --- 147,152 ---- typedef BOOL ( APIENTRY * AfsdStoppingHook )(void); #define AFSD_STOPPED_HOOK "AfsdStoppedHook" typedef BOOL ( APIENTRY * AfsdStoppedHook )(void); + + #define SERVICE_CONTROL_CUSTOM_DUMP 128 #endif /* AFSD_H_ENV */ Index: openafs/src/WINNT/afsd/afsd_init.c diff -c openafs/src/WINNT/afsd/afsd_init.c:1.40.2.18 openafs/src/WINNT/afsd/afsd_init.c:1.40.2.20 *** openafs/src/WINNT/afsd/afsd_init.c:1.40.2.18 Mon Apr 4 22:17:15 2005 --- openafs/src/WINNT/afsd/afsd_init.c Sun May 29 23:52:52 2005 *************** *** 19,24 **** --- 19,25 ---- #include #include #include + #include #include #include "afsd.h" *************** *** 135,141 **** void afsi_start() { ! char wd[100]; char t[100], u[100], *p, *path; int zilch; int code; --- 136,142 ---- void afsi_start() { ! char wd[256]; char t[100], u[100], *p, *path; int zilch; int code; *************** *** 145,155 **** DWORD maxLogSize = 100 * 1024; afsi_file = INVALID_HANDLE_VALUE; ! if (getenv("TEMP")) ! { ! StringCbCopyA(wd, sizeof(wd), getenv("TEMP")); ! } ! else { code = GetWindowsDirectory(wd, sizeof(wd)); if (code == 0) --- 146,153 ---- DWORD maxLogSize = 100 * 1024; afsi_file = INVALID_HANDLE_VALUE; ! code = GetEnvironmentVariable("TEMP", wd, sizeof(wd)); ! if ( code == 0 || code > sizeof(wd) ) { code = GetWindowsDirectory(wd, sizeof(wd)); if (code == 0) *************** *** 185,194 **** WriteFile(afsi_file, t, strlen(t), &zilch, NULL); WriteFile(afsi_file, u, strlen(u), &zilch, NULL); p = "PATH="; ! path = getenv("PATH"); WriteFile(afsi_file, p, strlen(p), &zilch, NULL); WriteFile(afsi_file, path, strlen(path), &zilch, NULL); WriteFile(afsi_file, "\n", 1, &zilch, NULL); /* Initialize C RTL Code Page conversion functions */ /* All of the path info obtained from the SMB client is in the OEM code page */ --- 183,195 ---- WriteFile(afsi_file, t, strlen(t), &zilch, NULL); WriteFile(afsi_file, u, strlen(u), &zilch, NULL); p = "PATH="; ! code = GetEnvironmentVariable("PATH", NULL, 0); ! path = malloc(code); ! code = GetEnvironmentVariable("PATH", path, code); WriteFile(afsi_file, p, strlen(p), &zilch, NULL); WriteFile(afsi_file, path, strlen(path), &zilch, NULL); WriteFile(afsi_file, "\n", 1, &zilch, NULL); + free(path); /* Initialize C RTL Code Page conversion functions */ /* All of the path info obtained from the SMB client is in the OEM code page */ *************** *** 815,827 **** dummyLen = sizeof(traceOnPanic); code = RegQueryValueEx(parmKey, "TrapOnPanic", NULL, NULL, (BYTE *) &traceOnPanic, &dummyLen); ! if (code == ERROR_SUCCESS) ! afsi_log("Set to %s on panic", ! traceOnPanic ? "trap" : "not trap"); ! else { ! traceOnPanic = 0; ! /* Don't log */ ! } dummyLen = sizeof(reportSessionStartups); code = RegQueryValueEx(parmKey, "ReportSessionStartups", NULL, NULL, --- 816,824 ---- dummyLen = sizeof(traceOnPanic); code = RegQueryValueEx(parmKey, "TrapOnPanic", NULL, NULL, (BYTE *) &traceOnPanic, &dummyLen); ! if (code != ERROR_SUCCESS) ! traceOnPanic = 1; /* log */ ! afsi_log("Set to %s on panic", traceOnPanic ? "trap" : "not trap"); dummyLen = sizeof(reportSessionStartups); code = RegQueryValueEx(parmKey, "ReportSessionStartups", NULL, NULL, *************** *** 1390,1401 **** --- 1387,1488 ---- static DWORD afsd_crtDbgBreaks[256]; #endif + static EFaultRepRetVal (WINAPI *pReportFault)(LPEXCEPTION_POINTERS pep, DWORD dwMode) = NULL; + static BOOL (WINAPI *pMiniDumpWriteDump)(HANDLE hProcess,DWORD ProcessId,HANDLE hFile, + MINIDUMP_TYPE DumpType, + PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + PMINIDUMP_CALLBACK_INFORMATION CallbackParam) = NULL; + + + static HANDLE + OpenDumpFile(void) + { + char wd[256]; + DWORD code; + + code = GetEnvironmentVariable("TEMP", wd, sizeof(wd)); + if ( code == 0 || code > sizeof(wd) ) + { + if (!GetWindowsDirectory(wd, sizeof(wd))) + return NULL; + } + StringCbCatA(wd, sizeof(wd), "\\afsd.dmp"); + return CreateFile( wd, GENERIC_WRITE, FILE_SHARE_READ, NULL, + CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, NULL); + } + + void + GenerateMiniDump(PEXCEPTION_POINTERS ep) + { + if (ep == NULL) + { + // Generate exception to get proper context in dump + __try + { + RaiseException(DBG_CONTINUE, 0, 0, NULL); + } + __except(GenerateMiniDump(GetExceptionInformation()), EXCEPTION_CONTINUE_EXECUTION) + { + } + } + else + { + MINIDUMP_EXCEPTION_INFORMATION eInfo; + HANDLE hFile = NULL; + HMODULE hDbgHelp = NULL; + + hDbgHelp = LoadLibrary("Dbghelp.dll"); + if ( hDbgHelp == NULL ) + return; + + (FARPROC) pMiniDumpWriteDump = GetProcAddress(hDbgHelp, "MiniDumpWriteDump"); + if ( pMiniDumpWriteDump == NULL ) { + FreeLibrary(hDbgHelp); + return; + } + + hFile = OpenDumpFile(); + + if ( hFile ) { + HKEY parmKey; + DWORD dummyLen; + DWORD dwValue; + DWORD code; + DWORD dwMiniDumpType = MiniDumpNormal; + + code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, + 0, KEY_QUERY_VALUE, &parmKey); + if (code == ERROR_SUCCESS) { + dummyLen = sizeof(DWORD); + code = RegQueryValueEx(parmKey, "MiniDumpType", NULL, NULL, + (BYTE *) &dwValue, &dummyLen); + if (code == ERROR_SUCCESS) + dwMiniDumpType = dwValue ? 1 : 0; + RegCloseKey (parmKey); + } + + eInfo.ThreadId = GetCurrentThreadId(); + eInfo.ExceptionPointers = ep; + eInfo.ClientPointers = FALSE; + + pMiniDumpWriteDump( GetCurrentProcess(), GetCurrentProcessId(), + hFile, dwMiniDumpType, ep ? &eInfo : NULL, + NULL, NULL); + + CloseHandle(hFile); + } + FreeLibrary(hDbgHelp); + } + } + LONG __stdcall afsd_ExceptionFilter(EXCEPTION_POINTERS *ep) { CONTEXT context; #ifdef _DEBUG BOOL allocRequestBrk = FALSE; #endif + HMODULE hLib = NULL; afsi_log("UnhandledException : code : 0x%x, address: 0x%x\n", ep->ExceptionRecord->ExceptionCode, *************** *** 1414,1420 **** context = *ep->ContextRecord; afsd_printStack(GetCurrentThread(), &context); ! if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT) { afsi_log("\nEXCEPTION_BREAKPOINT - continue execution ...\n"); --- 1501,1517 ---- context = *ep->ContextRecord; afsd_printStack(GetCurrentThread(), &context); ! ! GenerateMiniDump(ep); ! ! hLib = LoadLibrary("Faultrep.dll"); ! if ( hLib ) { ! (FARPROC) pReportFault = GetProcAddress(hLib, "ReportFault"); ! if ( pReportFault ) ! pReportFault(ep, 0); ! FreeLibrary(hLib); ! } ! if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT) { afsi_log("\nEXCEPTION_BREAKPOINT - continue execution ...\n"); Index: openafs/src/WINNT/afsd/afsd_init.h diff -c openafs/src/WINNT/afsd/afsd_init.h:1.5 openafs/src/WINNT/afsd/afsd_init.h:1.5.2.1 *** openafs/src/WINNT/afsd/afsd_init.h:1.5 Sat Apr 3 14:50:37 2004 --- openafs/src/WINNT/afsd/afsd_init.h Wed May 18 18:57:08 2005 *************** *** 12,17 **** --- 12,19 ---- #ifndef DJGPP int afsd_InitCM(char **reasonP); int afsd_InitSMB(char **reasonP, void *aMBfunc); + + void GenerateMiniDump(PEXCEPTION_POINTERS ep); #else /* DJGPP */ int afsd_InitCM(char **reasonP, struct cmd_syndesc *as, char *arock); int afsd_InitSMB(char **reasonP); *************** *** 22,24 **** --- 24,28 ---- extern char cm_HostName[]; extern char cm_NetbiosName[]; + + Index: openafs/src/WINNT/afsd/afsd_service.c diff -c openafs/src/WINNT/afsd/afsd_service.c:1.28.2.15 openafs/src/WINNT/afsd/afsd_service.c:1.28.2.16 *** openafs/src/WINNT/afsd/afsd_service.c:1.28.2.15 Tue Apr 19 17:07:14 2005 --- openafs/src/WINNT/afsd/afsd_service.c Wed May 18 18:57:08 2005 *************** *** 354,359 **** --- 354,367 ---- } } } + break; + case SERVICE_CONTROL_CUSTOM_DUMP: + { + afsi_log("SERVICE_CONTROL_CUSTOM_DUMP"); + GenerateMiniDump(NULL); + dwRet = NO_ERROR; + } + break; } /* end switch(ctrlCode) */ return dwRet; } *************** *** 1050,1056 **** ServiceStatus.dwCheckPoint = 1; ServiceStatus.dwWaitHint = 30000; /* accept Power Events */ ! ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT; SetServiceStatus(StatusHandle, &ServiceStatus); #endif --- 1058,1064 ---- ServiceStatus.dwCheckPoint = 1; ServiceStatus.dwWaitHint = 30000; /* accept Power Events */ ! ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT | SERVICE_ACCEPT_PARAMCHANGE; SetServiceStatus(StatusHandle, &ServiceStatus); #endif *************** *** 1138,1144 **** ServiceStatus.dwCheckPoint = 2; ServiceStatus.dwWaitHint = 20000; /* accept Power Events */ ! ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT; SetServiceStatus(StatusHandle, &ServiceStatus); } } --- 1146,1152 ---- ServiceStatus.dwCheckPoint = 2; ServiceStatus.dwWaitHint = 20000; /* accept Power Events */ ! ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT | SERVICE_ACCEPT_PARAMCHANGE; SetServiceStatus(StatusHandle, &ServiceStatus); } } *************** *** 1241,1247 **** ServiceStatus.dwWaitHint = 0; /* accept Power events */ ! ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT; SetServiceStatus(StatusHandle, &ServiceStatus); #endif { --- 1249,1255 ---- ServiceStatus.dwWaitHint = 0; /* accept Power events */ ! ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT | SERVICE_ACCEPT_PARAMCHANGE; SetServiceStatus(StatusHandle, &ServiceStatus); #endif { Index: openafs/src/WINNT/afsd/afskfw.c diff -c openafs/src/WINNT/afsd/afskfw.c:1.8.2.11 openafs/src/WINNT/afsd/afskfw.c:1.8.2.13 *** openafs/src/WINNT/afsd/afskfw.c:1.8.2.11 Tue Apr 19 01:11:17 2005 --- openafs/src/WINNT/afsd/afskfw.c Tue May 31 10:19:06 2005 *************** *** 1080,1086 **** code = pkrb5_cc_close(ctx,cc); cc = 0; code = pkrb5_cc_close(ctx,oldcc); ! cc = 0; KRB5_error(code, "krb5_cc_copy_creds", 0, NULL, NULL); continue; } --- 1080,1086 ---- code = pkrb5_cc_close(ctx,cc); cc = 0; code = pkrb5_cc_close(ctx,oldcc); ! oldcc = 0; KRB5_error(code, "krb5_cc_copy_creds", 0, NULL, NULL); continue; } *************** *** 1370,1376 **** return 0; if ( IsDebuggerPresent() ) { ! OutputDebugString("KFW_AFS_destroy_ticets_for_cell: "); OutputDebugString(cell); OutputDebugString("\n"); } --- 1370,1376 ---- return 0; if ( IsDebuggerPresent() ) { ! OutputDebugString("KFW_AFS_destroy_tickets_for_cell: "); OutputDebugString(cell); OutputDebugString("\n"); } *************** *** 1422,1427 **** --- 1422,1481 ---- return 0; } + int + KFW_AFS_destroy_tickets_for_principal(char * user) + { + krb5_context ctx = 0; + krb5_error_code code; + int count; + char ** cells = NULL; + krb5_principal princ = 0; + krb5_ccache cc = 0; + + if (!pkrb5_init_context) + return 0; + + if ( IsDebuggerPresent() ) { + OutputDebugString("KFW_AFS_destroy_tickets_for_user: "); + OutputDebugString(user); + OutputDebugString("\n"); + } + + code = pkrb5_init_context(&ctx); + if (code) ctx = 0; + + code = pkrb5_parse_name(ctx, user, &princ); + if (code) goto loop_cleanup; + + code = KFW_get_ccache(ctx, princ, &cc); + if (code) goto loop_cleanup; + + code = pkrb5_cc_destroy(ctx, cc); + if (!code) cc = 0; + + loop_cleanup: + if ( cc ) { + pkrb5_cc_close(ctx, cc); + cc = 0; + } + if ( princ ) { + pkrb5_free_principal(ctx, princ); + princ = 0; + } + + count = KFW_AFS_find_cells_for_princ(ctx, user, &cells, TRUE); + if ( count >= 1 ) { + while ( count-- ) { + KFW_AFS_update_cell_princ_map(ctx, cells[count], user, FALSE); + free(cells[count]); + } + free(cells); + } + + pkrb5_free_context(ctx); + return 0; + } + int KFW_AFS_renew_expiring_tokens(void) { *************** *** 3454,3457 **** if (ctx) pkrb5_free_context(ctx); return success; ! } \ No newline at end of file --- 3508,3638 ---- if (ctx) pkrb5_free_context(ctx); return success; ! } ! ! void ! KFW_AFS_copy_cache_to_system_file(char * user, char * szLogonId) ! { ! char filename[256]; ! DWORD count; ! char cachename[264] = "FILE:"; ! krb5_context ctx = 0; ! krb5_error_code code; ! krb5_principal princ = 0; ! krb5_ccache cc = 0; ! krb5_ccache ncc = 0; ! ! if (!pkrb5_init_context) ! return; ! ! count = GetEnvironmentVariable("TEMP", filename, sizeof(filename)); ! if ( count > sizeof(filename) || count == 0 ) { ! GetWindowsDirectory(filename, sizeof(filename)); ! } ! ! if ( strlen(filename) + strlen(szLogonId) + 2 > sizeof(filename) ) ! return; ! ! strcat(filename, "\\"); ! strcat(filename, szLogonId); ! ! strcat(cachename, filename); ! ! DeleteFile(filename); ! ! code = pkrb5_init_context(&ctx); ! if (code) ctx = 0; ! ! code = pkrb5_parse_name(ctx, user, &princ); ! if (code) goto cleanup; ! ! code = KFW_get_ccache(ctx, princ, &cc); ! if (code) goto cleanup; ! ! code = pkrb5_cc_resolve(ctx, cachename, &ncc); ! if (code) goto cleanup; ! ! code = pkrb5_cc_initialize(ctx, ncc, princ); ! if (code) goto cleanup; ! ! code = pkrb5_cc_copy_creds(ctx,cc,ncc); ! ! cleanup: ! if ( cc ) { ! pkrb5_cc_close(ctx, cc); ! cc = 0; ! } ! if ( ncc ) { ! pkrb5_cc_close(ctx, ncc); ! ncc = 0; ! } ! if ( princ ) { ! pkrb5_free_principal(ctx, princ); ! princ = 0; ! } ! ! if (ctx) ! pkrb5_free_context(ctx); ! } ! ! int ! KFW_AFS_copy_system_file_to_default_cache(char * filename) ! { ! DWORD count; ! char cachename[264] = "FILE:"; ! HANDLE hFile; ! krb5_context ctx = 0; ! krb5_error_code code; ! krb5_principal princ = 0; ! krb5_ccache cc = 0; ! krb5_ccache ncc = 0; ! int retval = 1; ! ! if (!pkrb5_init_context) ! return 1; ! ! if ( strlen(filename) + 6 > sizeof(cachename) ) ! return 1; ! ! strcat(cachename, filename); ! ! code = pkrb5_init_context(&ctx); ! if (code) ctx = 0; ! ! code = pkrb5_cc_resolve(ctx, cachename, &cc); ! if (code) goto cleanup; ! ! code = pkrb5_cc_get_principal(ctx, cc, &princ); ! ! code = pkrb5_cc_default(ctx, &ncc); ! if (!code) { ! code = pkrb5_cc_initialize(ctx, ncc, princ); ! ! if (!code) ! code = pkrb5_cc_copy_creds(ctx,cc,ncc); ! } ! if ( ncc ) { ! pkrb5_cc_close(ctx, ncc); ! ncc = 0; ! } ! ! retval=0; /* success */ ! ! cleanup: ! if ( cc ) { ! pkrb5_cc_close(ctx, cc); ! cc = 0; ! } ! ! DeleteFile(filename); ! ! if ( princ ) { ! pkrb5_free_principal(ctx, princ); ! princ = 0; ! } ! ! if (ctx) ! pkrb5_free_context(ctx); ! ! return 0; ! } Index: openafs/src/WINNT/afsd/afskfw.h diff -c openafs/src/WINNT/afsd/afskfw.h:1.2.2.1 openafs/src/WINNT/afsd/afskfw.h:1.2.2.2 *** openafs/src/WINNT/afsd/afskfw.h:1.2.2.1 Tue Apr 19 01:11:17 2005 --- openafs/src/WINNT/afsd/afskfw.h Sun May 29 23:52:52 2005 *************** *** 47,52 **** --- 47,53 ---- void KFW_cleanup(void); int KFW_is_available(void); int KFW_AFS_destroy_tickets_for_cell(char *); + int KFW_AFS_destroy_tickets_for_principal(char *); int KFW_AFS_renew_expiring_tokens(void); int KFW_AFS_get_cred( char * username, char * cell, *************** *** 62,67 **** --- 63,72 ---- void KFW_import_windows_lsa(void); BOOL KFW_AFS_get_lsa_principal(char *, DWORD *); + /* These functions are only to be used in the afslogon.dll */ + void KFW_AFS_copy_cache_to_system_file(char *, char *); + int KFW_AFS_copy_system_file_to_default_cache(char *); + /* From afs/krb_prot.h */ /* values for kerb error codes */ #define KERB_ERR_OK 0 Index: openafs/src/WINNT/afsd/afslogon.c diff -c openafs/src/WINNT/afsd/afslogon.c:1.24.2.9 openafs/src/WINNT/afsd/afslogon.c:1.24.2.11 *** openafs/src/WINNT/afsd/afslogon.c:1.24.2.9 Tue Apr 19 01:11:17 2005 --- openafs/src/WINNT/afsd/afslogon.c Tue May 31 10:19:06 2005 *************** *** 41,48 **** --- 41,50 ---- void DebugEvent0(char *a) { HANDLE h; char *ptbuf[1]; + if (!ISLOGONTRACE(TraceOption)) return; + h = RegisterEventSource(NULL, AFS_LOGON_EVENT_NAME); ptbuf[0] = a; ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (const char **)ptbuf, NULL); *************** *** 651,660 **** char logonDomain[MAX_DOMAIN_LENGTH]=""; char cell[256]=""; char homePath[MAX_PATH]=""; MSV1_0_INTERACTIVE_LOGON *IL; ! DWORD code; int pw_exp; char *reason; --- 653,663 ---- char logonDomain[MAX_DOMAIN_LENGTH]=""; char cell[256]=""; char homePath[MAX_PATH]=""; + char szLogonId[128] = ""; MSV1_0_INTERACTIVE_LOGON *IL; ! DWORD code, code2; int pw_exp; char *reason; *************** *** 675,689 **** int retryInterval; int sleepInterval; /* Make sure the AFS Libraries are initialized */ AfsLogonInit(); /* Initialize Logon Script to none */ *lpLogonScript=NULL; ! /* TODO: We should check the value of lpAuthentInfoType before assuming that it is ! MSV1_0_INTERACTIVE_LOGON though for our purposes KERB_INTERACTIVE_LOGON is ! co-incidentally equivalent. */ IL = (MSV1_0_INTERACTIVE_LOGON *) lpAuthentInfo; /* Are we interactive? */ --- 678,710 ---- int retryInterval; int sleepInterval; + (void) RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, + 0, KEY_QUERY_VALUE, &NPKey); + LSPsize=sizeof(TraceOption); + RegQueryValueEx(NPKey, REG_CLIENT_TRACE_OPTION_PARM, NULL, + &LSPtype, (LPBYTE)&TraceOption, &LSPsize); + + RegCloseKey (NPKey); + + DebugEvent("NPLogonNotify - LoginId(%d,%d)", lpLogonId->HighPart, lpLogonId->LowPart); + /* Make sure the AFS Libraries are initialized */ AfsLogonInit(); /* Initialize Logon Script to none */ *lpLogonScript=NULL; ! /* MSV1_0_INTERACTIVE_LOGON and KERB_INTERACTIVE_LOGON are equivalent for ! * our purposes */ ! ! if ( wcscmp(lpAuthentInfoType,L"MSV1_0:Interactive") && ! wcscmp(lpAuthentInfoType,L"Kerberos:Interactive") ) ! { ! DebugEvent("Unsupported Authentication Info Type: %S", ! lpAuthentInfoType); ! return 0; ! } ! IL = (MSV1_0_INTERACTIVE_LOGON *) lpAuthentInfo; /* Are we interactive? */ *************** *** 708,721 **** } } - (void) RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, - 0, KEY_QUERY_VALUE, &NPKey); - LSPsize=sizeof(TraceOption); - RegQueryValueEx(NPKey, REG_CLIENT_TRACE_OPTION_PARM, NULL, - &LSPtype, (LPBYTE)&TraceOption, &LSPsize); - - RegCloseKey (NPKey); - /* * Get Logon options */ --- 729,734 ---- *************** *** 804,812 **** p = opt.theseCells; while ( *p ) { ! code = KFW_AFS_get_cred(principal, p, 0, 0, opt.smbName, &reason); DebugEvent("KFW_AFS_get_cred uname=[%s] smbname=[%s] cell=[%s] code=[%d]", ! principal,opt.smbName,p,code); p += strlen(p) + 1; } --- 817,825 ---- p = opt.theseCells; while ( *p ) { ! code2 = KFW_AFS_get_cred(principal, p, 0, 0, opt.smbName, &reason); DebugEvent("KFW_AFS_get_cred uname=[%s] smbname=[%s] cell=[%s] code=[%d]", ! principal,opt.smbName,p,code2); p += strlen(p) + 1; } *************** *** 873,881 **** } DebugEvent("while loop exited"); ! /* remove any kerberos 5 tickets currently held by the SYSTEM account */ ! if ( KFW_is_available() ) ! KFW_AFS_destroy_tickets_for_cell(cell); if (code) { char msg[128]; --- 886,900 ---- } DebugEvent("while loop exited"); ! /* remove any kerberos 5 tickets currently held by the SYSTEM account ! * for this user ! */ ! if ( KFW_is_available() ) { ! sprintf(szLogonId,"%d.%d",lpLogonId->HighPart, lpLogonId->LowPart); ! KFW_AFS_copy_cache_to_system_file(uname, szLogonId); ! ! KFW_AFS_destroy_tickets_for_principal(uname); ! } if (code) { char msg[128]; *************** *** 1040,1059 **** VOID AFS_Logon_Event( PWLX_NOTIFICATION_INFO pInfo ) { - DWORD code; TCHAR profileDir[1024] = TEXT(""); DWORD len = 1024; PTOKEN_USER tokenUser = NULL; DWORD retLen; - HANDLE hToken; - WCHAR szUserW[128] = L""; char szUserA[128] = ""; char szClient[MAX_PATH]; char szPath[MAX_PATH] = ""; NETRESOURCE nr; DWORD res; - DWORD gle; DWORD dwSize; /* Make sure the AFS Libraries are initialized */ --- 1059,1074 ---- *************** *** 1061,1066 **** --- 1076,1083 ---- DebugEvent0("AFS_Logon_Event - Start"); + DebugEvent("AFS_Logon_Event Process ID: %d",GetCurrentProcessId()); + if (!GetTokenInformation(pInfo->hToken, TokenUser, NULL, 0, &retLen)) { if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER ) { *************** *** 1123,1125 **** --- 1140,1256 ---- DebugEvent0("AFS_Logon_Event - End"); } + static BOOL + GetSecurityLogonSessionData(HANDLE hToken, PSECURITY_LOGON_SESSION_DATA * ppSessionData) + { + NTSTATUS Status = 0; + HANDLE TokenHandle; + TOKEN_STATISTICS Stats; + DWORD ReqLen; + BOOL Success; + + if (!ppSessionData) + return FALSE; + *ppSessionData = NULL; + + #if 0 + Success = OpenProcessToken( HANDLE GetCurrentProcess(), TOKEN_QUERY, &TokenHandle ); + if ( !Success ) + return FALSE; + #endif + + Success = GetTokenInformation( hToken, TokenStatistics, &Stats, sizeof(TOKEN_STATISTICS), &ReqLen ); + #if 0 + CloseHandle( TokenHandle ); + #endif + if ( !Success ) + return FALSE; + + Status = LsaGetLogonSessionData( &Stats.AuthenticationId, ppSessionData ); + if ( FAILED(Status) || !ppSessionData ) + return FALSE; + + return TRUE; + } + + VOID KFW_Logon_Event( PWLX_NOTIFICATION_INFO pInfo ) + { + DWORD code; + + WCHAR szUserW[128] = L""; + char szUserA[128] = ""; + char szClient[MAX_PATH]; + char szPath[MAX_PATH] = ""; + char szLogonId[128] = ""; + NETRESOURCE nr; + DWORD res; + DWORD gle; + DWORD dwSize; + DWORD dwDisp; + DWORD dwType; + DWORD count; + VOID * ticketData; + char filename[256]; + char commandline[512]; + STARTUPINFO startupinfo; + PROCESS_INFORMATION procinfo; + + LUID LogonId = {0, 0}; + PSECURITY_LOGON_SESSION_DATA pLogonSessionData = NULL; + + HKEY hKey1 = NULL, hKey2 = NULL; + + /* Make sure the KFW Libraries are initialized */ + AfsLogonInit(); + + DebugEvent0("KFW_Logon_Event - Start"); + + GetSecurityLogonSessionData( pInfo->hToken, &pLogonSessionData ); + + if ( pLogonSessionData ) { + LogonId = pLogonSessionData->LogonId; + DebugEvent("KFW_Logon_Event - LogonId(%d,%d)", LogonId.HighPart, LogonId.LowPart); + + sprintf(szLogonId,"%d.%d",LogonId.HighPart, LogonId.LowPart); + LsaFreeReturnBuffer( pLogonSessionData ); + } else { + DebugEvent0("KFW_Logon_Event - Unable to determine LogonId"); + return; + } + + count = GetEnvironmentVariable("TEMP", filename, sizeof(filename)); + if ( count > sizeof(filename) || count == 0 ) { + GetWindowsDirectory(filename, sizeof(filename)); + } + + if ( strlen(filename) + strlen(szLogonId) + 2 <= sizeof(filename) ) { + strcat(filename, "\\"); + strcat(filename, szLogonId); + + sprintf(commandline, "afscpcc.exe \"%s\"", filename); + + GetStartupInfo(&startupinfo); + if (CreateProcessAsUser( pInfo->hToken, + "afscpcc.exe", + commandline, + NULL, + NULL, + FALSE, + CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, + NULL, + NULL, + &startupinfo, + &procinfo)) + { + WaitForSingleObject(procinfo.hProcess, 30000); + + CloseHandle(procinfo.hThread); + CloseHandle(procinfo.hProcess); + } + } + + DeleteFile(filename); + + DebugEvent0("KFW_Logon_Event - End"); + } + Index: openafs/src/WINNT/afsd/afslogon.def diff -c openafs/src/WINNT/afsd/afslogon.def:1.3.2.1 openafs/src/WINNT/afsd/afslogon.def:1.3.2.2 *** openafs/src/WINNT/afsd/afslogon.def:1.3.2.1 Thu Apr 28 08:05:19 2005 --- openafs/src/WINNT/afsd/afslogon.def Sun May 29 23:52:52 2005 *************** *** 11,15 **** --- 11,17 ---- AFS_Startup_Event AFS_Logoff_Event AFS_Logon_Event + KFW_Logon_Event + Index: openafs/src/WINNT/afsd/cm_buf.c diff -c openafs/src/WINNT/afsd/cm_buf.c:1.13.2.8 openafs/src/WINNT/afsd/cm_buf.c:1.13.2.9 *** openafs/src/WINNT/afsd/cm_buf.c:1.13.2.8 Fri Mar 11 01:58:39 2005 --- openafs/src/WINNT/afsd/cm_buf.c Sun May 29 23:52:52 2005 *************** *** 592,598 **** } /* we better find it */ ! osi_assertx(tbp != NULL, "buf_GetNewLocked: hash table screwup"); *lbpp = bp->hashp; /* hash out */ --- 592,598 ---- } /* we better find it */ ! osi_assertx(tbp != NULL, "buf_Recycle: hash table screwup"); *lbpp = bp->hashp; /* hash out */ *************** *** 806,814 **** pageOffset.HighPart = offsetp->HighPart; pageOffset.LowPart = offsetp->LowPart & ~(cm_data.buf_blockSize-1); while (1) { ! lock_ObtainWrite(&buf_globalLock); ! bp = buf_LockedFind(scp, &pageOffset); ! lock_ReleaseWrite(&buf_globalLock); if (bp) { /* lock it and break out */ lock_ObtainMutex(&bp->mx); --- 806,812 ---- pageOffset.HighPart = offsetp->HighPart; pageOffset.LowPart = offsetp->LowPart & ~(cm_data.buf_blockSize-1); while (1) { ! bp = buf_Find(scp, &pageOffset); if (bp) { /* lock it and break out */ lock_ObtainMutex(&bp->mx); *************** *** 848,853 **** --- 846,852 ---- } /* get a page, returning it held but unlocked. Make sure it is complete */ + /* The scp must be unlocked when passed to this function */ long buf_Get(struct cm_scache *scp, osi_hyper_t *offsetp, cm_buf_t **bufpp) { cm_buf_t *bp; *************** *** 869,877 **** buf_ValidateBufQueues(); #endif /* TESTING */ ! lock_ObtainWrite(&buf_globalLock); ! bp = buf_LockedFind(scp, &pageOffset); ! lock_ReleaseWrite(&buf_globalLock); if (bp) { /* lock it and break out */ lock_ObtainMutex(&bp->mx); --- 868,874 ---- buf_ValidateBufQueues(); #endif /* TESTING */ ! bp = buf_Find(scp, &pageOffset); if (bp) { /* lock it and break out */ lock_ObtainMutex(&bp->mx); Index: openafs/src/WINNT/afsd/cm_config.c diff -c openafs/src/WINNT/afsd/cm_config.c:1.20.2.2 openafs/src/WINNT/afsd/cm_config.c:1.20.2.3 *** openafs/src/WINNT/afsd/cm_config.c:1.20.2.2 Fri Mar 11 01:58:40 2005 --- openafs/src/WINNT/afsd/cm_config.c Sun May 29 23:52:53 2005 *************** *** 201,206 **** --- 201,207 ---- int tracking = 1, partial = 0; #if defined(DJGPP) || defined(AFS_WIN95_ENV) char *afsconf_path; + DWORD dwSize; #endif cm_GetCellServDB(wdir); *************** *** 212,222 **** /* 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. */ ! afsconf_path = getenv("AFSCONF"); if (!afsconf_path) strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); ! else strcpy(wdir, afsconf_path); strcat(wdir, "/"); strcat(wdir, AFS_CELLSERVDB); /*fprintf(stderr, "opening cellservdb file %s\n", wdir);*/ --- 213,227 ---- /* 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);*/ *************** *** 485,501 **** FILE *thisCell; char thisCellPath[256]; char *newline; #ifdef DJGPP strcpy(thisCellPath, cm_confDir); #else /* Win 95 */ char *afsconf_path; ! afsconf_path = getenv("AFSCONF"); if (!afsconf_path) strcpy(thisCellPath, AFSDIR_CLIENT_ETC_DIRPATH); ! else strcpy(thisCellPath, afsconf_path); #endif strcat(thisCellPath,"/"); --- 490,511 ---- 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,"/"); *************** *** 532,542 **** #ifdef DJGPP strcpy(wdir,cm_confDir); #else ! char *afsconf_path = getenv("AFSCONF"); if (!afsconf_path) ! strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); ! else ! strcpy(wdir, afsconf_path); #endif /* !DJGPP */ strcat(wdir,"/"); #endif /* DJGPP || WIN95 */ --- 542,560 ---- #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 */ *************** *** 682,694 **** 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; #endif closeCode = fclose((FILE *)filep); --- 700,713 ---- 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); *************** *** 702,712 **** #ifdef DJGPP strcpy(wdir,cm_confDir); #else ! afsconf_path = getenv("AFSCONF"); if (!afsconf_path) strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); ! else strcpy(wdir, afsconf_path); #endif /* !DJGPP */ strcat(wdir,"/"); #endif /* DJGPP || WIN95 */ --- 721,735 ---- #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 */ *************** *** 739,744 **** --- 762,768 ---- int tlen; #ifdef AFS_WIN95_ENV char *afsconf_path; + DWORD dwSize; #endif #if !defined(DJGPP) && !defined(AFS_WIN95_ENV) *************** *** 751,761 **** #ifdef DJGPP strcpy(wdir,cm_confDir); #else ! afsconf_path = getenv("AFSCONF"); if (!afsconf_path) strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH); ! else strcpy(wdir, afsconf_path); #endif /* !DJGPP */ strcat(wdir,"\\"); #endif /* DJGPP || WIN95 */ --- 775,789 ---- #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 */ Index: openafs/src/WINNT/afsd/cm_conn.c diff -c openafs/src/WINNT/afsd/cm_conn.c:1.25.2.8 openafs/src/WINNT/afsd/cm_conn.c:1.25.2.9 *** openafs/src/WINNT/afsd/cm_conn.c:1.25.2.8 Wed Mar 30 15:50:15 2005 --- openafs/src/WINNT/afsd/cm_conn.c Wed May 18 18:57:08 2005 *************** *** 378,384 **** if ( timeLeft > 2 ) retry = 1; } ! else if (errorCode == RXKADEXPIRED) { if (!dead_session) { lock_ObtainMutex(&userp->mx); ucellp = cm_GetUCell(userp, serverp->cellp); --- 378,385 ---- if ( timeLeft > 2 ) retry = 1; } ! else if (errorCode == RXKADEXPIRED || ! errorCode == RXKADBADTICKET) { if (!dead_session) { lock_ObtainMutex(&userp->mx); ucellp = cm_GetUCell(userp, serverp->cellp); *************** *** 393,400 **** retry = 1; } } else { ! if (errorCode) ! osi_Log1(afsd_logp, "cm_Analyze: ignoring error code 0x%x", errorCode); } if (retry && dead_session) --- 394,419 ---- retry = 1; } } else { ! if (errorCode) { ! char * s = "unknown error"; ! switch ( errorCode ) { ! case RXKADINCONSISTENCY: s = "RXKADINCONSISTENCY"; break; ! case RXKADPACKETSHORT : s = "RXKADPACKETSHORT "; break; ! case RXKADLEVELFAIL : s = "RXKADLEVELFAIL "; break; ! case RXKADTICKETLEN : s = "RXKADTICKETLEN "; break; ! case RXKADOUTOFSEQUENCE: s = "RXKADOUTOFSEQUENCE"; break; ! case RXKADNOAUTH : s = "RXKADNOAUTH "; break; ! case RXKADBADKEY : s = "RXKADBADKEY "; break; ! case RXKADBADTICKET : s = "RXKADBADTICKET "; break; ! case RXKADUNKNOWNKEY : s = "RXKADUNKNOWNKEY "; break; ! case RXKADEXPIRED : s = "RXKADEXPIRED "; break; ! case RXKADSEALEDINCON : s = "RXKADSEALEDINCON "; break; ! case RXKADDATALEN : s = "RXKADDATALEN "; break; ! case RXKADILLEGALLEVEL : s = "RXKADILLEGALLEVEL "; break; ! } ! osi_Log2(afsd_logp, "cm_Analyze: ignoring error code 0x%x (%s)", ! errorCode, s); ! } } if (retry && dead_session) Index: openafs/src/WINNT/afsd/cm_dcache.c diff -c openafs/src/WINNT/afsd/cm_dcache.c:1.11.2.8 openafs/src/WINNT/afsd/cm_dcache.c:1.11.2.11 *** openafs/src/WINNT/afsd/cm_dcache.c:1.11.2.8 Thu Mar 31 01:05:47 2005 --- openafs/src/WINNT/afsd/cm_dcache.c Tue May 31 16:34:26 2005 *************** *** 727,733 **** --- 727,735 ---- break; /* try to lock it, and quit if we can't (simplifies locking) */ + lock_ReleaseMutex(&scp->mx); code = lock_TryMutex(&bufp->mx); + lock_ObtainMutex(&scp->mx); if (code == 0) { buf_Release(bufp); break; *************** *** 781,787 **** --- 783,791 ---- break; /* try to lock it, and quit if we can't (simplifies locking) */ + lock_ReleaseMutex(&scp->mx); code = lock_TryMutex(&bufp->mx); + lock_ObtainMutex(&scp->mx); if (code == 0) { buf_Release(bufp); break; *************** *** 890,916 **** * sequence at a time. */ /* first hold all buffers, since we can't hold any locks in buf_Get */ while (1) { /* stop at chunk boundary */ ! if (collected >= cm_chunkSize) break; /* see if the next page would be past EOF */ ! if (LargeIntegerGreaterThanOrEqualTo(pageBase, fileSize)) break; ! ! lock_ObtainMutex(&cm_bufGetMutex); code = buf_Get(scp, &pageBase, &tbp); if (code) { lock_ReleaseMutex(&cm_bufGetMutex); lock_ObtainMutex(&scp->mx); return code; } buf_Release(tbp); - lock_ReleaseMutex(&cm_bufGetMutex); - toffset.HighPart = 0; toffset.LowPart = cm_data.buf_blockSize; pageBase = LargeIntegerAdd(toffset, pageBase); --- 894,920 ---- * sequence at a time. */ + // lock_ObtainMutex(&cm_bufGetMutex); /* first hold all buffers, since we can't hold any locks in buf_Get */ while (1) { /* stop at chunk boundary */ ! if (collected >= cm_chunkSize) ! break; /* see if the next page would be past EOF */ ! if (LargeIntegerGreaterThanOrEqualTo(pageBase, fileSize)) ! break; code = buf_Get(scp, &pageBase, &tbp); if (code) { lock_ReleaseMutex(&cm_bufGetMutex); lock_ObtainMutex(&scp->mx); + cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); return code; } buf_Release(tbp); toffset.HighPart = 0; toffset.LowPart = cm_data.buf_blockSize; pageBase = LargeIntegerAdd(toffset, pageBase); *************** *** 920,925 **** --- 924,931 ---- /* reserve a chunk's worth of buffers if possible */ reserving = buf_TryReserveBuffers(cm_chunkSize / cm_data.buf_blockSize); + // lock_ReleaseMutex(&cm_bufGetMutex); + pageBase = *offsetp; collected = pageBase.LowPart & (cm_chunkSize - 1); *************** *** 1376,1381 **** --- 1382,1390 ---- code = cm_MapRPCError(code, reqp); lock_ObtainMutex(&scp->mx); + + cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_FETCHSTATUS); + /* we know that no one else has changed the buffer, since we still have * the fetching flag on the buffers, and we have the scp locked again. * Copy in the version # into the buffer if we got code 0 back from the Index: openafs/src/WINNT/afsd/cm_dnlc.c diff -c openafs/src/WINNT/afsd/cm_dnlc.c:1.5.2.2 openafs/src/WINNT/afsd/cm_dnlc.c:1.5.2.3 *** openafs/src/WINNT/afsd/cm_dnlc.c:1.5.2.2 Fri Mar 11 01:58:41 2005 --- openafs/src/WINNT/afsd/cm_dnlc.c Wed May 18 18:57:08 2005 *************** *** 54,59 **** --- 54,60 ---- #define dnlcNotify(x,debug) #endif /* !DJGPP */ + /* Must be called with cm_dnlcLock write locked */ static cm_nc_t * GetMeAnEntry() { *************** *** 332,339 **** tnc->next->prev = tnc->prev; } ! tnc->prev = (cm_nc_t *) 0; /* everything not in hash table has 0 prev */ ! tnc->key = 0; /* just for safety's sake */ return 0; /* success */ } --- 333,340 ---- tnc->next->prev = tnc->prev; } ! memset(tnc, 0, sizeof(cm_nc_t)); ! tnc->magic = CM_DNLC_MAGIC; return 0; /* success */ } *************** *** 368,374 **** if ( (tnc->dirp == adp) && (tnc->key == key) && !strcmp(tnc->name,aname) ) { - tnc->dirp = (cm_scache_t *) 0; /* now it won't match anything */ tmp = tnc->next; error = RemoveEntry(tnc, skey); if ( error ) --- 369,374 ---- *************** *** 376,382 **** tnc->next = cm_data.ncfreelist; /* insert entry into freelist */ cm_data.ncfreelist = tnc; ! found = 1; /* found atleast one entry */ tnc = tmp; /* continue down the linked list */ } --- 376,382 ---- tnc->next = cm_data.ncfreelist; /* insert entry into freelist */ cm_data.ncfreelist = tnc; ! found = 1; /* found at least one entry */ tnc = tmp; /* continue down the linked list */ } *************** *** 426,438 **** { if (cm_data.nameCache[i].dirp == adp ) { ! cm_data.nameCache[i].dirp = cm_data.nameCache[i].vp = (cm_scache_t *) 0; ! if (cm_data.nameCache[i].prev && !err) ! { ! err = RemoveEntry(&cm_data.nameCache[i], cm_data.nameCache[i].key & (NHSIZE-1)); ! cm_data.nameCache[i].next = cm_data.ncfreelist; ! cm_data.ncfreelist = &cm_data.nameCache[i]; ! } } } lock_ReleaseWrite(&cm_dnlcLock); --- 426,441 ---- { if (cm_data.nameCache[i].dirp == adp ) { ! if (cm_data.nameCache[i].prev) { ! err = RemoveEntry(&cm_data.nameCache[i], cm_data.nameCache[i].key & (NHSIZE-1)); ! if (!err) ! { ! cm_data.nameCache[i].next = cm_data.ncfreelist; ! cm_data.ncfreelist = &cm_data.nameCache[i]; ! } ! } else { ! cm_data.nameCache[i].dirp = cm_data.nameCache[i].vp = (cm_scache_t *) 0; ! } } } lock_ReleaseWrite(&cm_dnlcLock); *************** *** 461,475 **** { if (cm_data.nameCache[i].vp == avc) { ! cm_data.nameCache[i].dirp = cm_data.nameCache[i].vp = (cm_scache_t *) 0; ! /* can't simply break; because of hard links -- might be two */ ! /* different entries with same vnode */ ! if (!err && cm_data.nameCache[i].prev) ! { ! err=RemoveEntry(&cm_data.nameCache[i], cm_data.nameCache[i].key & (NHSIZE-1)); ! cm_data.nameCache[i].next = cm_data.ncfreelist; ! cm_data.ncfreelist = &cm_data.nameCache[i]; ! } } } lock_ReleaseWrite(&cm_dnlcLock); --- 464,479 ---- { if (cm_data.nameCache[i].vp == avc) { ! if (cm_data.nameCache[i].prev) { ! err = RemoveEntry(&cm_data.nameCache[i], cm_data.nameCache[i].key & (NHSIZE-1)); ! if (!err) ! { ! cm_data.nameCache[i].next = cm_data.ncfreelist; ! cm_data.ncfreelist = &cm_data.nameCache[i]; ! } ! } else { ! cm_data.nameCache[i].dirp = cm_data.nameCache[i].vp = (cm_scache_t *) 0; ! } } } lock_ReleaseWrite(&cm_dnlcLock); *************** *** 494,503 **** cm_data.ncfreelist = (cm_nc_t *) 0; memset (cm_data.nameCache, 0, sizeof(cm_nc_t) * NCSIZE); memset (cm_data.nameHash, 0, sizeof(cm_nc_t *) * NHSIZE); ! for (i=0; imagic != CM_DNLC_MAGIC) { afsi_log("cm_dnlcValidate failure: cm_data.nameCache[%d].next->magic != CM_DNLC_MAGIC", i); fprintf(stderr, "cm_dnlcValidate failure: cm_data.nameCache[%d].next->magic != CM_DNLC_MAGIC\n", i); ! return -2; } if (cm_data.nameCache[i].prev && cm_data.nameCache[i].prev->magic != CM_DNLC_MAGIC) { afsi_log("cm_dnlcValidate failure: cm_data.nameCache[%d].prev->magic != CM_DNLC_MAGIC", i); fprintf(stderr, "cm_dnlcValidate failure: cm_data.nameCache[%d].prev->magic != CM_DNLC_MAGIC\n", i); ! return -3; } if (cm_data.nameCache[i].dirp && cm_data.nameCache[i].dirp->magic != CM_SCACHE_MAGIC) { afsi_log("cm_dnlcValidate failure: cm_data.nameCache[%d].dirp->magic != CM_SCACHE_MAGIC", i); fprintf(stderr, "cm_dnlcValidate failure: cm_data.nameCache[%d].dirp->magic != CM_SCACHE_MAGIC\n", i); ! return -4; } if (cm_data.nameCache[i].vp && cm_data.nameCache[i].vp->magic != CM_SCACHE_MAGIC) { afsi_log("cm_dnlcValidate failure: cm_data.nameCache[%d].vp->magic != CM_SCACHE_MAGIC", i); fprintf(stderr, "cm_dnlcValidate failure: cm_data.nameCache[%d].vp->magic != CM_SCACHE_MAGIC\n", i); ! return -5; } } --- 524,564 ---- long cm_dnlcValidate(void) { ! int i, purged = 0; cm_nc_t * ncp; ! ! retry: // are all nameCache entries marked with the magic bit? for (i=0; imagic != CM_DNLC_MAGIC) { afsi_log("cm_dnlcValidate failure: cm_data.nameCache[%d].next->magic != CM_DNLC_MAGIC", i); fprintf(stderr, "cm_dnlcValidate failure: cm_data.nameCache[%d].next->magic != CM_DNLC_MAGIC\n", i); ! goto purge; } if (cm_data.nameCache[i].prev && cm_data.nameCache[i].prev->magic != CM_DNLC_MAGIC) { afsi_log("cm_dnlcValidate failure: cm_data.nameCache[%d].prev->magic != CM_DNLC_MAGIC", i); fprintf(stderr, "cm_dnlcValidate failure: cm_data.nameCache[%d].prev->magic != CM_DNLC_MAGIC\n", i); ! goto purge; } if (cm_data.nameCache[i].dirp && cm_data.nameCache[i].dirp->magic != CM_SCACHE_MAGIC) { afsi_log("cm_dnlcValidate failure: cm_data.nameCache[%d].dirp->magic != CM_SCACHE_MAGIC", i); fprintf(stderr, "cm_dnlcValidate failure: cm_data.nameCache[%d].dirp->magic != CM_SCACHE_MAGIC\n", i); ! goto purge; } if (cm_data.nameCache[i].vp && cm_data.nameCache[i].vp->magic != CM_SCACHE_MAGIC) { afsi_log("cm_dnlcValidate failure: cm_data.nameCache[%d].vp->magic != CM_SCACHE_MAGIC", i); fprintf(stderr, "cm_dnlcValidate failure: cm_data.nameCache[%d].vp->magic != CM_SCACHE_MAGIC\n", i); ! goto purge; } } *************** *** 563,616 **** if (ncp->magic != CM_DNLC_MAGIC) { afsi_log("cm_dnlcValidate failure: ncp->magic != CM_DNLC_MAGIC"); fprintf(stderr, "cm_dnlcValidate failure: ncp->magic != CM_DNLC_MAGIC\n"); ! return -6; } if (ncp->prev && ncp->prev->magic != CM_DNLC_MAGIC) { afsi_log("cm_dnlcValidate failure: ncp->prev->magic != CM_DNLC_MAGIC"); fprintf(stderr, "cm_dnlcValidate failure: ncp->prev->magic != CM_DNLC_MAGIC\n"); ! return -7; } if (ncp->dirp && ncp->dirp->magic != CM_SCACHE_MAGIC) { afsi_log("cm_dnlcValidate failure: ncp->dirp->magic != CM_DNLC_MAGIC"); fprintf(stderr, "cm_dnlcValidate failure: ncp->dirp->magic != CM_DNLC_MAGIC\n"); ! return -8; } if (ncp->vp && ncp->vp->magic != CM_SCACHE_MAGIC) { afsi_log("cm_dnlcValidate failure: ncp->vp->magic != CM_DNLC_MAGIC"); fprintf(stderr, "cm_dnlcValidate failure: ncp->vp->magic != CM_DNLC_MAGIC\n"); ! return -9; } } } // is the freelist stable? if ( cm_data.ncfreelist ) { ! for (ncp = cm_data.ncfreelist; ncp; ! ncp = ncp->next != cm_data.ncfreelist ? ncp->next : NULL) { if (ncp->magic != CM_DNLC_MAGIC) { afsi_log("cm_dnlcValidate failure: ncp->magic != CM_DNLC_MAGIC"); fprintf(stderr, "cm_dnlcValidate failure: ncp->magic != CM_DNLC_MAGIC\n"); ! return -10; } ! if (ncp->prev && ncp->prev->magic != CM_DNLC_MAGIC) { ! afsi_log("cm_dnlcValidate failure: ncp->prev->magic != CM_DNLC_MAGIC"); ! fprintf(stderr, "cm_dnlcValidate failure: ncp->prev->magic != CM_DNLC_MAGIC\n"); ! return -11; } ! if (ncp->dirp && ncp->dirp->magic != CM_SCACHE_MAGIC) { ! afsi_log("cm_dnlcValidate failure: ncp->dirp->magic != CM_DNLC_MAGIC"); ! fprintf(stderr, "cm_dnlcValidate failure: ncp->dirp->magic != CM_DNLC_MAGIC\n"); ! return -12; } ! if (ncp->vp && ncp->vp->magic != CM_SCACHE_MAGIC) { ! afsi_log("cm_dnlcValidate failure: ncp->vp->magic != CM_DNLC_MAGIC"); ! fprintf(stderr, "cm_dnlcValidate failure: ncp->vp->magic != CM_DNLC_MAGIC\n"); ! return -13; } } - } return 0; } void --- 569,650 ---- if (ncp->magic != CM_DNLC_MAGIC) { afsi_log("cm_dnlcValidate failure: ncp->magic != CM_DNLC_MAGIC"); fprintf(stderr, "cm_dnlcValidate failure: ncp->magic != CM_DNLC_MAGIC\n"); ! goto purge; } if (ncp->prev && ncp->prev->magic != CM_DNLC_MAGIC) { afsi_log("cm_dnlcValidate failure: ncp->prev->magic != CM_DNLC_MAGIC"); fprintf(stderr, "cm_dnlcValidate failure: ncp->prev->magic != CM_DNLC_MAGIC\n"); ! goto purge; } if (ncp->dirp && ncp->dirp->magic != CM_SCACHE_MAGIC) { afsi_log("cm_dnlcValidate failure: ncp->dirp->magic != CM_DNLC_MAGIC"); fprintf(stderr, "cm_dnlcValidate failure: ncp->dirp->magic != CM_DNLC_MAGIC\n"); ! goto purge; } if (ncp->vp && ncp->vp->magic != CM_SCACHE_MAGIC) { afsi_log("cm_dnlcValidate failure: ncp->vp->magic != CM_DNLC_MAGIC"); fprintf(stderr, "cm_dnlcValidate failure: ncp->vp->magic != CM_DNLC_MAGIC\n"); ! goto purge; } } } // is the freelist stable? if ( cm_data.ncfreelist ) { ! for (ncp = cm_data.ncfreelist, i = 0; ncp && i < NCSIZE; ! ncp = ncp->next != cm_data.ncfreelist ? ncp->next : NULL, i++) { if (ncp->magic != CM_DNLC_MAGIC) { afsi_log("cm_dnlcValidate failure: ncp->magic != CM_DNLC_MAGIC"); fprintf(stderr, "cm_dnlcValidate failure: ncp->magic != CM_DNLC_MAGIC\n"); ! goto purge; } ! if (ncp->prev) { ! afsi_log("cm_dnlcValidate failure: ncp->prev != NULL"); ! fprintf(stderr, "cm_dnlcValidate failure: ncp->prev != NULL\n"); ! goto purge; } ! if (ncp->key) { ! afsi_log("cm_dnlcValidate failure: ncp->key != 0"); ! fprintf(stderr, "cm_dnlcValidate failure: ncp->key != 0\n"); ! goto purge; } ! if (ncp->dirp) { ! afsi_log("cm_dnlcValidate failure: ncp->dirp != NULL"); ! fprintf(stderr, "cm_dnlcValidate failure: ncp->dirp != NULL\n"); ! goto purge; ! } ! if (ncp->vp) { ! afsi_log("cm_dnlcValidate failure: ncp->vp != NULL"); ! fprintf(stderr, "cm_dnlcValidate failure: ncp->vp != NULL\n"); ! goto purge; } } + if ( i == NCSIZE && ncp ) { + afsi_log("cm_dnlcValidate failure: dnlc freeList corrupted"); + fprintf(stderr, "cm_dnlcValidate failure: dnlc freeList corrupted\n"); + goto purge; + } + } return 0; + + purge: + if ( purged ) + return -1; + + afsi_log("cm_dnlcValidate information: purging"); + fprintf(stderr, "cm_dnlcValidate information: purging\n"); + cm_data.ncfreelist = (cm_nc_t *) 0; + memset (cm_data.nameCache, 0, sizeof(cm_nc_t) * NCSIZE); + memset (cm_data.nameHash, 0, sizeof(cm_nc_t *) * NHSIZE); + for (i=0; iinDatap, sizeof(long)); ! if (getenv("TEMP")) ! { ! strncpy(logfileName, getenv("TEMP"), MAX_PATH); ! logfileName[MAX_PATH] = '\0'; ! } ! else { GetWindowsDirectory(logfileName, sizeof(logfileName)); } --- 2326,2333 ---- cm_SkipIoctlPath(ioctlp); memcpy(&inValue, ioctlp->inDatap, sizeof(long)); ! dwSize = GetEnvironmentVariable("TEMP", logfileName, sizeof(logfileName)); ! if ( dwSize == 0 || dwSize > sizeof(logfileName) ) { GetWindowsDirectory(logfileName, sizeof(logfileName)); } Index: openafs/src/WINNT/afsd/cm_memmap.c diff -c openafs/src/WINNT/afsd/cm_memmap.c:1.1.2.2 openafs/src/WINNT/afsd/cm_memmap.c:1.1.2.3 *** openafs/src/WINNT/afsd/cm_memmap.c:1.1.2.2 Tue Apr 19 01:11:17 2005 --- openafs/src/WINNT/afsd/cm_memmap.c Wed May 18 18:57:08 2005 *************** *** 400,412 **** if (!cm_IsCacheValid()) { fprintf(stderr,"Cache file fails validation test\n"); UnmapViewOfFile(config_data_p); - CloseHandle(hm); return CM_ERROR_INVAL; } fprintf(stderr,"Cache passes validation test\n"); UnmapViewOfFile(config_data_p); - CloseHandle(hm); return 0; } --- 400,410 ---- Index: openafs/src/WINNT/afsd/cm_vnodeops.c diff -c openafs/src/WINNT/afsd/cm_vnodeops.c:1.19.2.16 openafs/src/WINNT/afsd/cm_vnodeops.c:1.19.2.18 *** openafs/src/WINNT/afsd/cm_vnodeops.c:1.19.2.16 Tue Apr 19 01:11:17 2005 --- openafs/src/WINNT/afsd/cm_vnodeops.c Tue May 31 13:36:57 2005 *************** *** 1635,1642 **** CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW | CM_FLAG_DIRSEARCH, userp, NULL, reqp, outScpp); ! if (code == CM_ERROR_NOSUCHFILE) ! code = CM_ERROR_NOSUCHPATH; /* this stuff is allocated no matter what happened on the namei call, * so free it */ --- 1635,1642 ---- CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW | CM_FLAG_DIRSEARCH, userp, NULL, reqp, outScpp); ! if (code == CM_ERROR_NOSUCHFILE) ! code = CM_ERROR_NOSUCHPATH; /* this stuff is allocated no matter what happened on the namei call, * so free it */ *************** *** 2599,2606 **** --- 2599,2608 ---- lock_ReleaseMutex(&newDscp->mx); if (code) { /* cleanup first one */ + lock_ObtainMutex(&newDscp->mx); cm_SyncOpDone(oldDscp, NULL, CM_SCACHESYNC_STOREDATA); + lock_ReleaseMutex(&oldDscp->mx); } } } *************** *** 2619,2626 **** --- 2621,2630 ---- lock_ReleaseMutex(&oldDscp->mx); if (code) { /* cleanup first one */ + lock_ObtainMutex(&newDscp->mx); cm_SyncOpDone(newDscp, NULL, CM_SCACHESYNC_STOREDATA); + lock_ReleaseMutex(&newDscp->mx); } } } Index: openafs/src/WINNT/afsd/fs.c diff -c openafs/src/WINNT/afsd/fs.c:1.16.2.6 openafs/src/WINNT/afsd/fs.c:1.16.2.7 *** openafs/src/WINNT/afsd/fs.c:1.16.2.6 Fri Mar 11 01:58:43 2005 --- openafs/src/WINNT/afsd/fs.c Wed May 18 18:57:08 2005 *************** *** 60,65 **** --- 60,66 ---- static int MemDumpCmd(struct cmd_syndesc *asp, char *arock); static int CSCPolicyCmd(struct cmd_syndesc *asp, char *arock); + static int MiniDumpCmd(struct cmd_syndesc *asp, char *arock); extern afs_int32 VL_GetEntryByNameO(); *************** *** 3619,3639 **** { long code; struct ViceIoctl blob; ! long inValue; long outValue; ! if ((asp->parms[0].items && asp->parms[1].items)) { fprintf(stderr, "%s trace: must use at most one of '-begin' or '-end'\n", pn); return EINVAL; } ! /* determine if we're turning this tracing on or off */ - inValue = 0; if (asp->parms[0].items) inValue = 1; /* begin */ ! else if (asp->parms[1].items) inValue = 0; /* end */ ! blob.in_size = sizeof(long); blob.in = (char *) &inValue; blob.out_size = sizeof(long); --- 3620,3645 ---- { long code; struct ViceIoctl blob; ! long inValue = 0; long outValue; ! ! if ( !IsAdmin() ) { ! fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); ! return EACCES; ! } ! if ((asp->parms[0].items && asp->parms[1].items)) { fprintf(stderr, "%s trace: must use at most one of '-begin' or '-end'\n", pn); return EINVAL; } ! /* determine if we're turning this tracing on or off */ if (asp->parms[0].items) inValue = 1; /* begin */ ! else if (asp->parms[1].items) inValue = 0; /* end */ ! ! blob.in_size = sizeof(long); blob.in = (char *) &inValue; blob.out_size = sizeof(long); *************** *** 3645,3654 **** return code; } ! if (outValue) printf("AFS memdump begin.\n"); ! else printf("AFS memdump end.\n"); ! return 0; } static int --- 3651,3705 ---- return code; } ! if (outValue) { ! printf("AFS memdump created.\n"); ! return 0; ! } else { ! printf("AFS memdump failed.\n"); ! return -1; ! } ! } ! static int ! MiniDumpCmd(struct cmd_syndesc *asp, char *arock) ! { ! long code; ! BOOL success = 0; ! SERVICE_STATUS status; ! SC_HANDLE hManager = NULL; ! SC_HANDLE hService = NULL; ! ! if ( !IsAdmin() ) { ! fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); ! return EACCES; ! } ! ! hManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); ! if (!hManager) ! goto failure; ! ! hService = OpenService(hManager, "TransarcAFSDaemon", SERVICE_USER_DEFINED_CONTROL); ! if (!hService) ! goto failure; ! ! success = ControlService(hService, SERVICE_CONTROL_CUSTOM_DUMP, &status); ! ! if (success) { ! CloseServiceHandle(hService); ! CloseServiceHandle(hManager); ! ! printf("AFS minidump generated.\n"); ! return 0; ! } ! ! failure: ! if (hService) ! CloseServiceHandle(hService); ! if (hManager) ! CloseServiceHandle(hManager); ! ! printf("AFS minidump failed.\n"); ! return -1; } static int *************** *** 3658,3663 **** --- 3709,3719 ---- char *share = NULL; HKEY hkCSCPolicy; + if ( !IsAdmin() ) { + fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n"); + return EACCES; + } + for(ti=asp->parms[0].items; ti;ti=ti->next) { share = ti->data; if (share) *************** *** 4352,4357 **** --- 4408,4415 ---- cmd_AddParm(ts, "-documents", CMD_FLAG, CMD_OPTIONAL, "automatic caching of documents"); cmd_AddParm(ts, "-disable", CMD_FLAG, CMD_OPTIONAL, "disable caching"); + ts = cmd_CreateSyntax("minidump", MiniDumpCmd, 0, "Generate MiniDump of current service state"); + code = cmd_Dispatch(argc, argv); #ifndef WIN32 Index: openafs/src/WINNT/afsd/smb.c diff -c openafs/src/WINNT/afsd/smb.c:1.55.2.22 openafs/src/WINNT/afsd/smb.c:1.55.2.23 *** openafs/src/WINNT/afsd/smb.c:1.55.2.22 Tue Apr 19 02:27:57 2005 --- openafs/src/WINNT/afsd/smb.c Wed May 18 18:57:09 2005 *************** *** 1546,1552 **** /* Get the full name for this cell */ code = cm_SearchCellFile(p, temp, 0, 0); #ifdef AFS_AFSDB_ENV ! if (code && cm_dnsEnabled) { int ttl; code = cm_SearchCellByDNS(p, temp, &ttl, 0, 0); } --- 1546,1552 ---- /* Get the full name for this cell */ code = cm_SearchCellFile(p, temp, 0, 0); #ifdef AFS_AFSDB_ENV ! if (code && cm_dnsEnabled) { int ttl; code = cm_SearchCellByDNS(p, temp, &ttl, 0, 0); } *************** *** 1680,1686 **** lock_ReleaseMutex(&dsp->mx); } /* do this now to avoid spurious locking hierarchy creation */ ! if (scp) cm_ReleaseSCache(scp); } void smb_ReleaseDirSearch(smb_dirSearch_t *dsp) --- 1680,1687 ---- lock_ReleaseMutex(&dsp->mx); } /* do this now to avoid spurious locking hierarchy creation */ ! if (scp) ! cm_ReleaseSCache(scp); } void smb_ReleaseDirSearch(smb_dirSearch_t *dsp) *************** *** 4780,4786 **** else code = CM_ERROR_EXISTS; cm_ReleaseSCache(tmpscp2); ! tmpscp2 = NULL; } else { code = CM_ERROR_NOSUCHFILE; } --- 4781,4787 ---- else code = CM_ERROR_EXISTS; cm_ReleaseSCache(tmpscp2); ! tmpscp2 = NULL; } else { code = CM_ERROR_NOSUCHFILE; } Index: openafs/src/WINNT/afsd/smb3.c diff -c openafs/src/WINNT/afsd/smb3.c:1.42.2.25 openafs/src/WINNT/afsd/smb3.c:1.42.2.27 *** openafs/src/WINNT/afsd/smb3.c:1.42.2.25 Tue Apr 19 01:11:18 2005 --- openafs/src/WINNT/afsd/smb3.c Sun May 22 01:54:21 2005 *************** *** 5328,5333 **** --- 5328,5335 ---- fidflags |= SMB_FID_OPENREAD; if (desiredAccess & AFS_ACCESS_WRITE) fidflags |= SMB_FID_OPENWRITE; + if (createOptions & FILE_DELETE_ON_CLOSE) + fidflags |= SMB_FID_DELONCLOSE; code = 0; *************** *** 5472,5479 **** if (!smb_IsLegalFilename(lastNamep)) { if (scp) cm_ReleaseSCache(scp); ! if (dscp) ! cm_ReleaseSCache(dscp); cm_ReleaseUser(userp); free(realPathp); return CM_ERROR_BADNTFILENAME; --- 5474,5481 ---- if (!smb_IsLegalFilename(lastNamep)) { if (scp) cm_ReleaseSCache(scp); ! if (dscp) ! cm_ReleaseSCache(dscp); cm_ReleaseUser(userp); free(realPathp); return CM_ERROR_BADNTFILENAME; *************** *** 5492,5498 **** userp, &req, &scp); } if (code && code != CM_ERROR_NOSUCHFILE) { ! cm_ReleaseSCache(dscp); cm_ReleaseUser(userp); free(realPathp); return code; --- 5494,5501 ---- userp, &req, &scp); } if (code && code != CM_ERROR_NOSUCHFILE) { ! if (dscp) ! cm_ReleaseSCache(dscp); cm_ReleaseUser(userp); free(realPathp); return code; *************** *** 5515,5521 **** /* oops, file shouldn't be there */ if (dscp) cm_ReleaseSCache(dscp); ! cm_ReleaseSCache(scp); cm_ReleaseUser(userp); free(realPathp); return CM_ERROR_EXISTS; --- 5518,5525 ---- /* oops, file shouldn't be there */ if (dscp) cm_ReleaseSCache(dscp); ! if (scp) ! cm_ReleaseSCache(scp); cm_ReleaseUser(userp); free(realPathp); return CM_ERROR_EXISTS; *************** *** 5553,5559 **** if (code) { if (dscp) cm_ReleaseSCache(dscp); ! cm_ReleaseSCache(scp); cm_ReleaseUser(userp); free(realPathp); return code; --- 5557,5564 ---- if (code) { if (dscp) cm_ReleaseSCache(dscp); ! if (scp) ! cm_ReleaseSCache(scp); cm_ReleaseUser(userp); free(realPathp); return code; *************** *** 5562,5569 **** /* don't create if not found */ if (dscp) cm_ReleaseSCache(dscp); ! if (scp) ! cm_ReleaseSCache(scp); cm_ReleaseUser(userp); free(realPathp); return CM_ERROR_NOSUCHFILE; --- 5567,5574 ---- /* don't create if not found */ if (dscp) cm_ReleaseSCache(dscp); ! if (scp) ! cm_ReleaseSCache(scp); cm_ReleaseUser(userp); free(realPathp); return CM_ERROR_NOSUCHFILE; *************** *** 5736,5742 **** /* (only applies to single component case) */ if (realDirFlag == 1 && scp->fileType == CM_SCACHETYPE_FILE) { cm_ReleaseSCache(scp); ! cm_ReleaseSCache(dscp); cm_ReleaseUser(userp); free(realPathp); return CM_ERROR_NOTDIR; --- 5741,5748 ---- /* (only applies to single component case) */ if (realDirFlag == 1 && scp->fileType == CM_SCACHETYPE_FILE) { cm_ReleaseSCache(scp); ! if (dscp) ! cm_ReleaseSCache(dscp); cm_ReleaseUser(userp); free(realPathp); return CM_ERROR_NOTDIR; *************** *** 5985,5990 **** --- 5991,5998 ---- fidflags |= SMB_FID_OPENREAD; if (desiredAccess & AFS_ACCESS_WRITE) fidflags |= SMB_FID_OPENWRITE; + if (createOptions & FILE_DELETE_ON_CLOSE) + fidflags |= SMB_FID_DELONCLOSE; dscp = NULL; code = 0; *************** *** 6111,6117 **** code = cm_CheckNTOpen(scp, desiredAccess, createDisp, userp, &req); if (code) { ! if (dscp) cm_ReleaseSCache(dscp); cm_ReleaseSCache(scp); cm_ReleaseUser(userp); free(realPathp); --- 6119,6126 ---- code = cm_CheckNTOpen(scp, desiredAccess, createDisp, userp, &req); if (code) { ! if (dscp) ! cm_ReleaseSCache(dscp); cm_ReleaseSCache(scp); cm_ReleaseUser(userp); free(realPathp); *************** *** 6120,6126 **** if (createDisp == FILE_CREATE) { /* oops, file shouldn't be there */ ! if (dscp) cm_ReleaseSCache(dscp); cm_ReleaseSCache(scp); cm_ReleaseUser(userp); free(realPathp); --- 6129,6136 ---- if (createDisp == FILE_CREATE) { /* oops, file shouldn't be there */ ! if (dscp) ! cm_ReleaseSCache(dscp); cm_ReleaseSCache(scp); cm_ReleaseUser(userp); free(realPathp); *************** *** 6156,6162 **** } else if (createDisp == FILE_OPEN || createDisp == FILE_OVERWRITE) { /* don't create if not found */ ! if (dscp) cm_ReleaseSCache(dscp); cm_ReleaseUser(userp); free(realPathp); return CM_ERROR_NOSUCHFILE; --- 6166,6173 ---- } else if (createDisp == FILE_OPEN || createDisp == FILE_OVERWRITE) { /* don't create if not found */ ! if (dscp) ! cm_ReleaseSCache(dscp); cm_ReleaseUser(userp); free(realPathp); return CM_ERROR_NOSUCHFILE; *************** *** 6238,6244 **** if (code) { /* something went wrong creating or truncating the file */ ! if (scp) cm_ReleaseSCache(scp); cm_ReleaseUser(userp); free(realPathp); return code; --- 6249,6256 ---- if (code) { /* something went wrong creating or truncating the file */ ! if (scp) ! cm_ReleaseSCache(scp); cm_ReleaseUser(userp); free(realPathp); return code; *************** *** 6297,6303 **** fidp->NTopen_wholepathp = realPathp; /* we don't need this any longer */ ! if (dscp) cm_ReleaseSCache(dscp); cm_Open(scp, 0, userp); --- 6309,6316 ---- fidp->NTopen_wholepathp = realPathp; /* we don't need this any longer */ ! if (dscp) ! cm_ReleaseSCache(dscp); cm_Open(scp, 0, userp); Index: openafs/src/WINNT/afssvrmgr/NTMakefile diff -c openafs/src/WINNT/afssvrmgr/NTMakefile:1.4.2.4 openafs/src/WINNT/afssvrmgr/NTMakefile:1.4.2.5 *** openafs/src/WINNT/afssvrmgr/NTMakefile:1.4.2.4 Fri Mar 11 01:59:32 2005 --- openafs/src/WINNT/afssvrmgr/NTMakefile Wed May 18 18:22:41 2005 *************** *** 7,13 **** # make compiler warnings fatal ! AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -WX # allow the resource compiler to search the dest\include tree --- 7,13 ---- # make compiler warnings fatal ! AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -WX -I..\afsd -I..\client_config -I..\kfw\inc\krb5 # allow the resource compiler to search the dest\include tree *************** *** 93,98 **** --- 93,103 ---- shell32.lib EXELIBS = \ + $(DESTDIR)\lib\afsauthent.lib \ + $(DESTDIR)\lib\libafsconf.lib \ + $(DESTDIR)\lib\afsrxkad.lib \ + $(DESTDIR)\lib\afsdes.lib \ + $(DESTDIR)\lib\afskfw.lib \ $(DESTDIR)\lib\afs\AfsClass.lib \ $(DESTDIR)\lib\afs\TaAfsAppLib.lib Index: openafs/src/WINNT/afssvrmgr/creds.cpp diff -c openafs/src/WINNT/afssvrmgr/creds.cpp:1.3 openafs/src/WINNT/afssvrmgr/creds.cpp:1.3.2.1 *** openafs/src/WINNT/afssvrmgr/creds.cpp:1.3 Thu Apr 1 14:38:37 2004 --- openafs/src/WINNT/afssvrmgr/creds.cpp Wed May 18 18:57:10 2005 *************** *** 18,23 **** --- 18,24 ---- #include "time.h" #include "subset.h" + #include /* * OPENCELL DIALOG ____________________________________________________________ *************** *** 91,118 **** TCHAR szPassword[ cchRESOURCE ]; GetDlgItemText (hDlg, IDC_OPENCELL_PASSWORD, szPassword, cchNAME); ! ULONG status; ! if ((lpp->hCreds = AfsAppLib_SetCredentials (lpp->szCell, szUser, szPassword, &status)) == NULL) ! { ! ErrorDialog (status, IDS_SVR_ERROR_BAD_CREDENTIALS); ! } ! else ! { ! // See if those credentials are sufficient ! // ! CHECKCREDS_PARAMS pp; ! memset (&pp, 0x00, sizeof(pp)); ! memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS)); ! pp.bcdp.hParent = hDlg; ! pp.hCreds = lpp->hCreds; ! pp.fShowWarning = TRUE; ! if ((rc = AfsAppLib_CheckCredentials (&pp)) == FALSE) ! { ! SetDlgItemText (hDlg, IDC_OPENCELL_ID, TEXT("admin")); ! PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_OPENCELL_PASSWORD), TRUE); ! } ! } if (rc) { --- 92,144 ---- TCHAR szPassword[ cchRESOURCE ]; GetDlgItemText (hDlg, IDC_OPENCELL_PASSWORD, szPassword, cchNAME); ! ULONG status; ! if ( KFW_is_available() ) { ! // KFW_AFS_get_cred() parses the szNameA field as complete ! // princial including potentially ! // a different realm then the specified cell name. ! char *Result = NULL; ! ! char szCellA[ 256 ]; ! CopyStringToAnsi (szCellA, lpp->szCell); ! ! char szUserA[ 256 ]; ! CopyStringToAnsi (szUserA, szUser); ! ! char szPasswordA[ 256 ]; ! CopyStringToAnsi (szPasswordA, szPassword); ! ! rc = !KFW_AFS_get_cred(szUserA, szCellA, szPasswordA, 0, NULL, &Result); ! if (rc) { ! if ((lpp->hCreds = AfsAppLib_GetCredentials (lpp->szCell, &status)) == NULL) { ! ErrorDialog (status, IDS_SVR_ERROR_BAD_CREDENTIALS); ! } ! } ! } else { ! if ((lpp->hCreds = AfsAppLib_SetCredentials (lpp->szCell, szUser, szPassword, &status)) == NULL) ! { ! ErrorDialog (status, IDS_SVR_ERROR_BAD_CREDENTIALS); ! } ! else ! { ! // See if those credentials are sufficient ! // ! CHECKCREDS_PARAMS pp; ! memset (&pp, 0x00, sizeof(pp)); ! memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS)); ! pp.bcdp.hParent = hDlg; ! pp.hCreds = lpp->hCreds; ! pp.fShowWarning = TRUE; ! ! if ((rc = AfsAppLib_CheckCredentials (&pp)) == FALSE) ! { ! SetDlgItemText (hDlg, IDC_OPENCELL_ID, TEXT("admin")); ! PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_OPENCELL_PASSWORD), TRUE); ! } ! } ! ! } if (rc) { Index: openafs/src/WINNT/client_config/lang/de_DE/afs_config.rc diff -c openafs/src/WINNT/client_config/lang/de_DE/afs_config.rc:1.3.2.1 openafs/src/WINNT/client_config/lang/de_DE/afs_config.rc:1.3.2.2 *** openafs/src/WINNT/client_config/lang/de_DE/afs_config.rc:1.3.2.1 Fri Mar 11 02:00:03 2005 --- openafs/src/WINNT/client_config/lang/de_DE/afs_config.rc Fri Apr 29 15:56:03 2005 *************** *** 52,62 **** CONTROL "&AFS-Token beim Anmelden bei Windows erhalten", IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,50, 193,10 - CONTROL "&Ein AFS Light Gateway bereitstellen",IDC_GATEWAY, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 CONTROL "Das Symbol fr den AFS Client in der Menleiste &anzeigen", ! IDC_TRAYICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,95, ! 194,10 LTEXT "Hinweis: Diese Steuerelemente sind gesperrt, weil der AFS Client-Service nicht aktiv ist.", IDC_WARN,13,124,193,17 GROUPBOX "Client-Status",IDC_STATIC,7,157,206,61 --- 52,60 ---- CONTROL "&AFS-Token beim Anmelden bei Windows erhalten", IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,50, 193,10 CONTROL "Das Symbol fr den AFS Client in der Menleiste &anzeigen", ! IDC_TRAYICON, ! "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 LTEXT "Hinweis: Diese Steuerelemente sind gesperrt, weil der AFS Client-Service nicht aktiv ist.", IDC_WARN,13,124,193,17 GROUPBOX "Client-Status",IDC_STATIC,7,157,206,61 Index: openafs/src/WINNT/client_config/lang/en_US/afs_config.rc diff -c openafs/src/WINNT/client_config/lang/en_US/afs_config.rc:1.6 openafs/src/WINNT/client_config/lang/en_US/afs_config.rc:1.6.2.1 *** openafs/src/WINNT/client_config/lang/en_US/afs_config.rc:1.6 Sat Jul 31 20:20:34 2004 --- openafs/src/WINNT/client_config/lang/en_US/afs_config.rc Fri Apr 29 15:56:07 2005 *************** *** 52,61 **** EDITTEXT IDC_CELL,59,22,114,13,ES_LOWERCASE | ES_AUTOHSCROLL CONTROL "&Obtain AFS tokens when logging into Windows",IDC_LOGON, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,50,193,10 ! CONTROL "&Provide an AFS Light Gateway",IDC_GATEWAY,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 - CONTROL "S&how the AFS Client icon in the taskbar",IDC_TRAYICON, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,95,193,10 LTEXT "Note: these controls are disabled because the AFS Client service is not running.", IDC_WARN,13,124,193,17 GROUPBOX "Client Status",IDC_STATIC,7,157,206,61 --- 52,59 ---- EDITTEXT IDC_CELL,59,22,114,13,ES_LOWERCASE | ES_AUTOHSCROLL CONTROL "&Obtain AFS tokens when logging into Windows",IDC_LOGON, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,50,193,10 ! CONTROL "S&how the AFS Client icon in the taskbar",IDC_TRAYICON,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 LTEXT "Note: these controls are disabled because the AFS Client service is not running.", IDC_WARN,13,124,193,17 GROUPBOX "Client Status",IDC_STATIC,7,157,206,61 Index: openafs/src/WINNT/client_config/lang/es_ES/afs_config.rc diff -c openafs/src/WINNT/client_config/lang/es_ES/afs_config.rc:1.3.2.1 openafs/src/WINNT/client_config/lang/es_ES/afs_config.rc:1.3.2.2 *** openafs/src/WINNT/client_config/lang/es_ES/afs_config.rc:1.3.2.1 Fri Mar 11 02:00:06 2005 --- openafs/src/WINNT/client_config/lang/es_ES/afs_config.rc Fri Apr 29 15:56:12 2005 *************** *** 52,62 **** CONTROL "&Obtener seales de AFS al iniciar la sesin en Windows", IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,50, 193,10 - CONTROL "&Proporcionar una Pasarela de AFS Light",IDC_GATEWAY, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 CONTROL "&Mostrar el icono AFS Client en la barra de tareas", ! IDC_TRAYICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,95, ! 193,10 LTEXT "Nota: estos controles estn inhabilitados porque el servicio de AFS Client no se est ejecutando. ", IDC_WARN,13,124,193,17 GROUPBOX "Estado de cliente",IDC_STATIC,7,157,206,61 --- 52,60 ---- CONTROL "&Obtener seales de AFS al iniciar la sesin en Windows", IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,50, 193,10 CONTROL "&Mostrar el icono AFS Client en la barra de tareas", ! IDC_TRAYICON, ! "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 LTEXT "Nota: estos controles estn inhabilitados porque el servicio de AFS Client no se est ejecutando. ", IDC_WARN,13,124,193,17 GROUPBOX "Estado de cliente",IDC_STATIC,7,157,206,61 Index: openafs/src/WINNT/client_config/lang/ja_JP/afs_config.rc diff -c openafs/src/WINNT/client_config/lang/ja_JP/afs_config.rc:1.3.2.1 openafs/src/WINNT/client_config/lang/ja_JP/afs_config.rc:1.3.2.2 *** openafs/src/WINNT/client_config/lang/ja_JP/afs_config.rc:1.3.2.1 Fri Mar 11 02:00:09 2005 --- openafs/src/WINNT/client_config/lang/ja_JP/afs_config.rc Fri Apr 29 15:56:16 2005 *************** *** 52,62 **** CONTROL "Windows ւ̃OC AFS g[N擾(&O)", IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,50, 198,10 - CONTROL "AFS Light Q[gEFC(&P)",IDC_GATEWAY,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,11,72,193,10 CONTROL "^XNo[AFSNCAgEACR\(&H)", ! IDC_TRAYICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,95, ! 201,10 LTEXT ": AFS NCAgET[rXsĂȂ߁A͎̐gpł܂B", IDC_WARN,13,124,193,17 GROUPBOX "NCAg",IDC_STATIC,7,157,206,61 --- 52,61 ---- CONTROL "Windows ւ̃OC AFS g[N擾(&O)", IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,50, 198,10 CONTROL "^XNo[AFSNCAgEACR\(&H)", ! IDC_TRAYICON, ! "Button", ! BS_AUTOCHECKBOX | WS_TABSTOP,11,72,193,10 LTEXT ": AFS NCAgET[rXsĂȂ߁A͎̐gpł܂B", IDC_WARN,13,124,193,17 GROUPBOX "NCAg",IDC_STATIC,7,157,206,61 Index: openafs/src/WINNT/client_config/lang/ko_KR/afs_config.rc diff -c openafs/src/WINNT/client_config/lang/ko_KR/afs_config.rc:1.3.2.1 openafs/src/WINNT/client_config/lang/ko_KR/afs_config.rc:1.3.2.2 *** openafs/src/WINNT/client_config/lang/ko_KR/afs_config.rc:1.3.2.1 Fri Mar 11 02:00:12 2005 --- openafs/src/WINNT/client_config/lang/ko_KR/afs_config.rc Fri Apr 29 15:56:19 2005 *************** *** 51,61 **** EDITTEXT IDC_CELL,59,22,114,13,ES_LOWERCASE | ES_AUTOHSCROLL CONTROL "Windows α AFS ū Ȯ(&O)",IDC_LOGON, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,50,193,10 - CONTROL "AFS Ʈ Ʈ (&P)",IDC_GATEWAY,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 CONTROL "۾ ǥٿ AFS Ŭ̾Ʈ ǥ(&H)", ! IDC_TRAYICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,95, ! 193,10 LTEXT ": AFS Ŭ̾Ʈ 񽺰 Ƿ ϴ.", IDC_WARN,13,124,193,17 GROUPBOX "Ŭ̾Ʈ ",IDC_STATIC,7,157,206,61 --- 51,59 ---- EDITTEXT IDC_CELL,59,22,114,13,ES_LOWERCASE | ES_AUTOHSCROLL CONTROL "Windows α AFS ū Ȯ(&O)",IDC_LOGON, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,50,193,10 CONTROL "۾ ǥٿ AFS Ŭ̾Ʈ ǥ(&H)", ! IDC_TRAYICON,"Button", ! BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 LTEXT ": AFS Ŭ̾Ʈ 񽺰 Ƿ ϴ.", IDC_WARN,13,124,193,17 GROUPBOX "Ŭ̾Ʈ ",IDC_STATIC,7,157,206,61 Index: openafs/src/WINNT/client_config/lang/pt_BR/afs_config.rc diff -c openafs/src/WINNT/client_config/lang/pt_BR/afs_config.rc:1.3.2.1 openafs/src/WINNT/client_config/lang/pt_BR/afs_config.rc:1.3.2.2 *** openafs/src/WINNT/client_config/lang/pt_BR/afs_config.rc:1.3.2.1 Fri Mar 11 02:00:15 2005 --- openafs/src/WINNT/client_config/lang/pt_BR/afs_config.rc Fri Apr 29 15:56:22 2005 *************** *** 52,62 **** CONTROL "&Obter tokens do AFS ao efetuar logon no Windows", IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,50, 193,10 - CONTROL "&Fornecer um Gateway do AFS Bsico",IDC_GATEWAY,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 CONTROL "&Mostrar o cone do AFS Client na barra de tarefas", ! IDC_TRAYICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,95, ! 193,10 LTEXT "Nota: estes controles esto desativados porque o servio AFS Client no est sendo executado.", IDC_WARN,13,124,193,17 GROUPBOX "Status do Cliente",IDC_STATIC,7,157,206,61 --- 52,60 ---- CONTROL "&Obter tokens do AFS ao efetuar logon no Windows", IDC_LOGON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,50, 193,10 CONTROL "&Mostrar o cone do AFS Client na barra de tarefas", ! IDC_TRAYICON,"Button", ! BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 LTEXT "Nota: estes controles esto desativados porque o servio AFS Client no est sendo executado.", IDC_WARN,13,124,193,17 GROUPBOX "Status do Cliente",IDC_STATIC,7,157,206,61 Index: openafs/src/WINNT/client_config/lang/zh_CN/afs_config.rc diff -c openafs/src/WINNT/client_config/lang/zh_CN/afs_config.rc:1.4 openafs/src/WINNT/client_config/lang/zh_CN/afs_config.rc:1.4.2.1 *** openafs/src/WINNT/client_config/lang/zh_CN/afs_config.rc:1.4 Thu Feb 26 14:22:47 2004 --- openafs/src/WINNT/client_config/lang/zh_CN/afs_config.rc Fri Apr 29 15:56:24 2005 *************** *** 51,60 **** EDITTEXT IDC_CELL,62,22,114,13,ES_LOWERCASE | ES_AUTOHSCROLL CONTROL "¼ Windows ʱ AFS ",IDC_LOGON,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,50,193,10 - CONTROL "ṩ AFS Light (&P)",IDC_GATEWAY,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 CONTROL "ʾ AFS ͻͼ(&I)",IDC_TRAYICON,"Button", ! BS_AUTOCHECKBOX | WS_TABSTOP,13,95,193,10 LTEXT "ע⣺û AFS ͻ񣬽Щơ", IDC_WARN,13,124,193,17 GROUPBOX "ͻ״̬",IDC_STATIC,7,157,206,61 --- 51,58 ---- EDITTEXT IDC_CELL,62,22,114,13,ES_LOWERCASE | ES_AUTOHSCROLL CONTROL "¼ Windows ʱ AFS ",IDC_LOGON,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,50,193,10 CONTROL "ʾ AFS ͻͼ(&I)",IDC_TRAYICON,"Button", ! BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 LTEXT "ע⣺û AFS ͻ񣬽Щơ", IDC_WARN,13,124,193,17 GROUPBOX "ͻ״̬",IDC_STATIC,7,157,206,61 Index: openafs/src/WINNT/client_config/lang/zh_TW/afs_config.rc diff -c openafs/src/WINNT/client_config/lang/zh_TW/afs_config.rc:1.3.2.1 openafs/src/WINNT/client_config/lang/zh_TW/afs_config.rc:1.3.2.2 *** openafs/src/WINNT/client_config/lang/zh_TW/afs_config.rc:1.3.2.1 Fri Mar 11 02:00:17 2005 --- openafs/src/WINNT/client_config/lang/zh_TW/afs_config.rc Fri Apr 29 15:56:27 2005 *************** *** 51,60 **** EDITTEXT IDC_CELL,68,22,114,13,ES_LOWERCASE | ES_AUTOHSCROLL CONTROL "nJ Windows ɨo AFS O(&O)",IDC_LOGON,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,50,193,10 ! CONTROL " AFS Light hD(&P) ",IDC_GATEWAY,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 - CONTROL "bu@CܡuAFS Τݡvϥ(&H) ",IDC_TRAYICON, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,95,193,10 LTEXT "GѩåuAFS ΤݡvAȡA]wΡC", IDC_WARN,13,124,193,17 GROUPBOX "ΤݪA",IDC_STATIC,7,157,206,61 --- 51,58 ---- EDITTEXT IDC_CELL,68,22,114,13,ES_LOWERCASE | ES_AUTOHSCROLL CONTROL "nJ Windows ɨo AFS O(&O)",IDC_LOGON,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,50,193,10 ! CONTROL "bu@CܡuAFS Τݡvϥ(&H) ",IDC_TRAYICON,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,72,193,10 LTEXT "GѩåuAFS ΤݡvAȡA]wΡC", IDC_WARN,13,124,193,17 GROUPBOX "ΤݪA",IDC_STATIC,7,157,206,61 Index: openafs/src/WINNT/install/NSIS/OpenAFS.nsi diff -c openafs/src/WINNT/install/NSIS/OpenAFS.nsi:1.69.2.8 openafs/src/WINNT/install/NSIS/OpenAFS.nsi:1.69.2.9 *** openafs/src/WINNT/install/NSIS/OpenAFS.nsi:1.69.2.8 Thu Apr 28 08:05:33 2005 --- openafs/src/WINNT/install/NSIS/OpenAFS.nsi Sun May 29 23:58:34 2005 *************** *** 546,551 **** --- 546,552 ---- SetOutPath "$SYSDIR" !insertmacro ReplaceDLL "${AFS_CLIENT_BUILDDIR}\afslogon.dll" "$SYSDIR\afslogon.dll" "$INSTDIR" + File "${AFS_CLIENT_BUILDDIR}\afscpcc.exe" Call AFSLangFiles *************** *** 726,731 **** --- 727,737 ---- WriteRegStr HKLM "Software\Microsoft\Windows NT\CurrentVersion\WinLogon\Notify\AfsLogon" "Logoff" "AFS_Logoff_Event" WriteRegStr HKLM "Software\Microsoft\Windows NT\CurrentVersion\WinLogon\Notify\AfsLogon" "Startup" "AFS_Startup_Event" + WriteRegDWORD HKLM "Software\Microsoft\Windows NT\CurrentVersion\WinLogon\Notify\KFWLogon" "Asynchronous" 0 + WriteRegDWORD HKLM "Software\Microsoft\Windows NT\CurrentVersion\WinLogon\Notify\KFWLogon" "Impersonate" 0 + WriteRegStr HKLM "Software\Microsoft\Windows NT\CurrentVersion\WinLogon\Notify\KFWLogon" "DLLName" "afslogon.dll" + WriteRegStr HKLM "Software\Microsoft\Windows NT\CurrentVersion\WinLogon\Notify\KFWLogon" "Logon" "KFW_Logon_Event" + SetRebootFlag true WriteUninstaller "$INSTDIR\Uninstall.exe" *************** *** 1800,1809 **** --- 1806,1817 ---- Delete /REBOOTOK "$SYSDIR\afsserver.cpl" Delete /REBOOTOK "$SYSDIR\afs_cpa.cpl" Delete /REBOOTOK "$SYSDIR\afslogon.dll" + Delete /REBOOTOK "$SYSDIR\afscpcc.exe" Delete /REBOOTOK "$SYSDIR\afsserver.pdb" Delete /REBOOTOK "$SYSDIR\afs_cpa.pdb" Delete /REBOOTOK "$SYSDIR\afslogon.pdb" + Delete /REBOOTOK "$SYSDIR\afscpcc.pdb" RMDir /r "$INSTDIR\Documentation\html\CmdRef" RMDir /r "$INSTDIR\Documentation\html\InstallGd" Index: openafs/src/WINNT/install/loopback/loopbackutils.cpp diff -c openafs/src/WINNT/install/loopback/loopbackutils.cpp:1.6 openafs/src/WINNT/install/loopback/loopbackutils.cpp:1.6.2.1 *** openafs/src/WINNT/install/loopback/loopbackutils.cpp:1.6 Thu Jul 15 23:38:35 2004 --- openafs/src/WINNT/install/loopback/loopbackutils.cpp Tue May 24 01:13:06 2005 *************** *** 237,242 **** --- 237,246 ---- BOOL found = FALSE; BOOL registered = FALSE; BOOL destroyList = FALSE; + PSP_DRVINFO_DETAIL_DATA pDriverInfoDetail; + DWORD detailBuf[2048]; // for our purposes, 8k buffer is more + // than enough to obtain the hardware ID + // of the loopback driver. HKEY hkey = NULL; DWORD cbSize; *************** *** 294,314 **** destroyList = TRUE; // enumerate the driver info list ! while (SetupDiEnumDriverInfo(hDeviceInfo, &DeviceInfoData, ! SPDIT_CLASSDRIVER, index, &DriverInfoData)) { ! // if the manufacture is microsoft ! if (_tcsicmp(DriverInfoData.MfgName, MANUFACTURE) == 0) ! { ! // case insensitive search for loopback ! _tcscpy(temp, DriverInfoData.Description); ! _tcslwr(temp); ! if( _tcsstr(temp, DRIVER)) ! { ! found = TRUE; ! break; ! } ! } index++; } --- 298,340 ---- destroyList = TRUE; // enumerate the driver info list ! while (TRUE) { ! BOOL ret; ! ! ret = SetupDiEnumDriverInfo(hDeviceInfo, &DeviceInfoData, ! SPDIT_CLASSDRIVER, index, &DriverInfoData); ! ! // if the function failed and GetLastError() returned ! // ERROR_NO_MORE_ITEMS, then we have reached the end of the ! // list. Othewise there was something wrong with this ! // particular driver. ! if(!ret) { ! if(GetLastError() == ERROR_NO_MORE_ITEMS) ! break; ! else { ! index++; ! continue; ! } ! } ! ! pDriverInfoDetail = (PSP_DRVINFO_DETAIL_DATA) detailBuf; ! pDriverInfoDetail->cbSize = sizeof(SP_DRVINFO_DETAIL_DATA); ! ! // if we successfully find the hardware ID and it turns out to ! // be the one for the loopback driver, then we are done. ! if(SetupDiGetDriverInfoDetail(hDeviceInfo, ! &DeviceInfoData, ! &DriverInfoData, ! pDriverInfoDetail, ! sizeof(detailBuf), ! NULL) && ! !_tcsicmp(pDriverInfoDetail->HardwareID, DRIVERHWID)) { ! ! found = TRUE; ! break; ! } ! index++; } Index: openafs/src/WINNT/install/loopback/loopbackutils.h diff -c openafs/src/WINNT/install/loopback/loopbackutils.h:1.2 openafs/src/WINNT/install/loopback/loopbackutils.h:1.2.2.1 *** openafs/src/WINNT/install/loopback/loopbackutils.h:1.2 Thu Jun 24 00:08:57 2004 --- openafs/src/WINNT/install/loopback/loopbackutils.h Tue May 24 01:13:06 2005 *************** *** 41,46 **** --- 41,47 ---- #define DRIVER_DESC "Microsoft Loopback Adapter" #define DRIVER _T("loopback") + #define DRIVERHWID _T("*msloop") #define MANUFACTURE _T("microsoft") #define DEFAULT_NAME _T("AFS") #define DEFAULT_IP _T("10.254.254.253") *************** *** 71,74 **** #define REPORT_IGNORE 3 extern DWORD dwReporterType; ! extern DWORD hMsiHandle; \ No newline at end of file --- 72,75 ---- #define REPORT_IGNORE 3 extern DWORD dwReporterType; ! extern DWORD hMsiHandle; Index: openafs/src/WINNT/install/wix/files.wxi diff -c openafs/src/WINNT/install/wix/files.wxi:1.9.2.5 openafs/src/WINNT/install/wix/files.wxi:1.9.2.6 *** openafs/src/WINNT/install/wix/files.wxi:1.9.2.5 Thu Apr 28 08:05:45 2005 --- openafs/src/WINNT/install/wix/files.wxi Sun May 29 23:58:38 2005 *************** *** 3,8 **** --- 3,9 ---- + *************** *** 11,20 **** --- 12,26 ---- + + + + + Index: openafs/src/afs/afs.h diff -c openafs/src/afs/afs.h:1.48.2.14 openafs/src/afs/afs.h:1.48.2.19 *** openafs/src/afs/afs.h:1.48.2.14 Mon Apr 4 03:43:20 2005 --- openafs/src/afs/afs.h Mon May 30 00:05:40 2005 *************** *** 43,49 **** #if defined(AFS_HPUX102_ENV) #define AFS_FLOCK k_flock #else ! #if defined(AFS_SUN56_ENV) || (defined(AFS_LINUX24_ENV) && !defined(AFS_PPC64_LINUX26_ENV) && !defined(AFS_AMD64_LINUX26_ENV) && !defined(AFS_IA64_LINUX26_ENV) && !defined(AFS_S390X_LINUX26_ENV) && !defined(AFS_ALPHA_LINUX26_ENV)) #define AFS_FLOCK flock64 #else #define AFS_FLOCK flock --- 43,49 ---- #if defined(AFS_HPUX102_ENV) #define AFS_FLOCK k_flock #else ! #if defined(AFS_SUN56_ENV) || (defined(AFS_LINUX24_ENV) && !(defined(AFS_LINUX26_ENV) && defined(AFS_LINUX_64BIT_KERNEL))) #define AFS_FLOCK flock64 #else #define AFS_FLOCK flock *************** *** 580,599 **** extern afs_int32 vmPageHog; /* counter for # of vnodes which are page hogs. */ - /* - * Fast map from vcache to dcache - */ - struct vtodc { - struct dcache *dc; - afs_uint32 stamp; - struct osi_file *f; - afs_offs_t minLoc; /* smallest offset into dc. */ - afs_offs_t len; /* largest offset into dc. */ - }; - - extern afs_uint32 afs_stampValue; /* stamp for pair's usage */ - #define MakeStamp() (++afs_stampValue) - #if defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV) #define VTOAFS(v) ((struct vcache *)(v)->v_data) #define AFSTOV(vc) ((vc)->v) --- 580,585 ---- *************** *** 620,625 **** --- 606,612 ---- struct afs_q vlruq; /* lru q next and prev */ struct vcache *nextfree; /* next on free list (if free) */ struct vcache *hnext; /* Hash next */ + struct vcache *vhnext; /* vol hash next */ struct VenusFid fid; struct mstat { afs_size_t Length; *************** *** 689,700 **** #if defined(AFS_SUN5_ENV) afs_uint32 vstates; /* vstate bits */ #endif /* defined(AFS_SUN5_ENV) */ ! struct vtodc quick; ! afs_uint32 symhintstamp; ! union { ! struct vcache *symhint; ! struct dcache *dchint; ! } h1; #ifdef AFS_LINUX22_ENV u_short mapcnt; /* Number of mappings of this file. */ #endif --- 676,682 ---- #if defined(AFS_SUN5_ENV) afs_uint32 vstates; /* vstate bits */ #endif /* defined(AFS_SUN5_ENV) */ ! struct dcache *dchint; #ifdef AFS_LINUX22_ENV u_short mapcnt; /* Number of mappings of this file. */ #endif *************** *** 722,730 **** #endif }; - #define afs_symhint_inval(avc) - - #define DONT_CHECK_MODE_BITS 0 #define CHECK_MODE_BITS 1 #define CMB_ALLOW_EXEC_AS_READ 2 /* For the NFS xlator */ --- 704,709 ---- *************** *** 784,789 **** --- 763,775 ---- afs_uint32 states; }; + struct vcxstat2 { + afs_int32 callerAccess; + afs_int32 cbExpires; + afs_int32 anyAccess; + char mvstat; + }; + struct sbstruct { int sb_thisfile; int sb_default; *************** *** 828,833 **** --- 814,822 ---- #define NULLIDX (-1) /* null index definition */ /* struct dcache states bits */ + #define DRO 1 + #define DBackup 2 + #define DRW 4 #define DWriting 8 /* file being written (used for cache validation) */ /* dcache data flags */ *************** *** 952,959 **** char dflags; /* Data flags */ char mflags; /* Meta flags */ struct fcache f; /* disk image */ ! afs_int32 stamp; /* used with vtodc struct for hints */ ! /* * Locking rules: * --- 941,947 ---- char dflags; /* Data flags */ char mflags; /* Meta flags */ struct fcache f; /* disk image */ ! afs_int32 bucket; /* which bucket these dcache entries are in */ /* * Locking rules: * *************** *** 972,981 **** * Note that dcache.lock(W) gives you the right to update mflags, * as dcache.mflock(W) can only be held with dcache.lock(R). * - * dcache.stamp is protected by the associated vcache lock, because - * it's only purpose is to establish correspondence between vcache - * and dcache entries. - * * dcache.index, dcache.f.fid, dcache.f.chunk and dcache.f.inode are * write-protected by afs_xdcache and read-protected by refCount. * Once an entry is referenced, these values cannot change, and if --- 960,965 ---- *************** *** 985,992 **** * ensuring noone else has a refCount on it). */ }; - /* this is obsolete and should be removed */ - #define ihint stamp /* afs_memcache.c */ struct memCacheEntry { --- 969,974 ---- *************** *** 1055,1060 **** --- 1037,1044 ---- /* don't hash on the cell, our callback-breaking code sometimes fails to compute the cell correctly, and only scans one hash bucket */ #define VCHash(fid) (((fid)->Fid.Volume + (fid)->Fid.Vnode) & (VCSIZE-1)) + /* Hash only on volume to speed up volume callbacks. */ + #define VCHashV(fid) ((fid)->Fid.Volume & (VCSIZE-1)) extern struct dcache **afs_indexTable; /*Pointers to in-memory dcache entries */ extern afs_int32 *afs_indexUnique; /*dcache entry Fid.Unique */ *************** *** 1064,1069 **** --- 1048,1054 ---- extern afs_int32 afs_cacheBlocks; /*1K blocks in cache */ extern afs_int32 afs_cacheStats; /*Stat entries in cache */ extern struct vcache *afs_vhashT[VCSIZE]; /*Stat cache hash table */ + extern struct vcache *afs_vhashTV[VCSIZE]; /* cache hash table on volume */ extern afs_int32 afs_initState; /*Initialization state */ extern afs_int32 afs_termState; /* Termination state */ extern struct VenusFid afs_rootFid; /*Root for whole file system */ Index: openafs/src/afs/afs_call.c diff -c openafs/src/afs/afs_call.c:1.74.2.7 openafs/src/afs/afs_call.c:1.74.2.9 *** openafs/src/afs/afs_call.c:1.74.2.7 Sun Apr 3 14:15:35 2005 --- openafs/src/afs/afs_call.c Mon May 23 17:16:08 2005 *************** *** 11,17 **** #include "afs/param.h" RCSID ! ("$Header: /cvs/openafs/src/afs/afs_call.c,v 1.74.2.7 2005/04/03 18:15:35 shadow Exp $"); #include "afs/sysincludes.h" /* Standard vendor system headers */ #include "afsincludes.h" /* Afs-based standard headers */ --- 11,17 ---- #include "afs/param.h" RCSID ! ("$Header: /cvs/openafs/src/afs/afs_call.c,v 1.74.2.9 2005/05/23 21:16:08 shadow Exp $"); #include "afs/sysincludes.h" /* Standard vendor system headers */ #include "afsincludes.h" /* Afs-based standard headers */ *************** *** 517,522 **** --- 517,534 ---- DInit(temp); afs_rootFid.Fid.Volume = 0; code = 0; + } else if (parm == AFSOP_BUCKETPCT) { + /* need to enable this now, will disable again before GO + if we don't have 100% */ + splitdcache = 1; + switch (parm2) { + case 1: + afs_tpct1 = parm3; + break; + case 2: + afs_tpct2 = parm3; + break; + } } else if (parm == AFSOP_ADDCELL) { /* add a cell. Parameter 2 is 8 hosts (in net order), parm 3 is the null-terminated * name. Parameter 4 is the length of the name, including the null. Parm 5 is the *************** *** 693,698 **** --- 705,717 ---- afs_osi_Sleep(&afs_initState); afs_initState = 101; afs_setTime = parm2; + if (afs_tpct1 + afs_tpct2 != 100) { + afs_tpct1 = 0; + afs_tpct2 = 0; + splitdcache = 0; + } else { + splitdcache = 1; + } afs_osi_Wakeup(&afs_initState); #if (!defined(AFS_NONFSTRANS)) || defined(AFS_AIX_IAUTH_ENV) afs_nfsclient_init(); *************** *** 1148,1154 **** #if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV) struct iparam32 dst32; ! #ifdef AFS_SPARC64_LINUX24_ENV if (current->thread.flags & SPARC_FLAG_32BIT) #elif defined(AFS_SPARC64_LINUX20_ENV) if (current->tss.flags & SPARC_FLAG_32BIT) --- 1167,1175 ---- #if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV) struct iparam32 dst32; ! #ifdef AFS_SPARC64_LINUX26_ENV ! if (test_thread_flag(TIF_32BIT)) ! #elif AFS_SPARC64_LINUX24_ENV if (current->thread.flags & SPARC_FLAG_32BIT) #elif defined(AFS_SPARC64_LINUX20_ENV) if (current->tss.flags & SPARC_FLAG_32BIT) *************** *** 1326,1332 **** }) ! if (current->thread.flags & SPARC_FLAG_32BIT) { AFS_COPYIN((char *)parm4, (char *)eparm32, sizeof(eparm32), code); eparm[0] = AA(eparm32[0]); eparm[1] = AA(eparm32[1]); --- 1347,1358 ---- }) ! #ifdef AFS_SPARC64_LINUX26_ENV ! if (test_thread_flag(TIF_32BIT)) ! #else ! if (current->thread.flags & SPARC_FLAG_32BIT) ! #endif ! { AFS_COPYIN((char *)parm4, (char *)eparm32, sizeof(eparm32), code); eparm[0] = AA(eparm32[0]); eparm[1] = AA(eparm32[1]); Index: openafs/src/afs/afs_callback.c diff -c openafs/src/afs/afs_callback.c:1.27 openafs/src/afs/afs_callback.c:1.27.2.2 *** openafs/src/afs/afs_callback.c:1.27 Thu Jun 24 12:56:20 2004 --- openafs/src/afs/afs_callback.c Mon May 30 00:05:40 2005 *************** *** 17,23 **** #include "afs/param.h" RCSID ! ("$Header: /cvs/openafs/src/afs/afs_callback.c,v 1.27 2004/06/24 16:56:20 shadow Exp $"); #include "afs/sysincludes.h" /*Standard vendor system headers */ #include "afsincludes.h" /*AFS-based standard headers */ --- 17,23 ---- #include "afs/param.h" RCSID ! ("$Header: /cvs/openafs/src/afs/afs_callback.c,v 1.27.2.2 2005/05/30 04:05:40 shadow Exp $"); #include "afs/sysincludes.h" /*Standard vendor system headers */ #include "afsincludes.h" /*AFS-based standard headers */ *************** *** 388,401 **** * Clear callback for the whole volume. Zip through the * hash chain, nullifying entries whose volume ID matches. */ ! for (i = 0; i < VCSIZE; i++) ! for (tvc = afs_vhashT[i]; tvc; tvc = tvc->hnext) { if (tvc->fid.Fid.Volume == a_fid->Volume) { tvc->callback = NULL; - tvc->quick.stamp = 0; if (!localFid.Cell) localFid.Cell = tvc->fid.Cell; ! tvc->h1.dchint = NULL; /* invalidate hints */ ObtainWriteLock(&afs_xcbhash, 449); afs_DequeueCallback(tvc); tvc->states &= ~(CStatd | CUnique | CBulkFetching); --- 388,400 ---- * Clear callback for the whole volume. Zip through the * hash chain, nullifying entries whose volume ID matches. */ ! i = VCHashV(&localFid); ! for (tvc = afs_vhashTV[i]; tvc; tvc = tvc->vhnext) { if (tvc->fid.Fid.Volume == a_fid->Volume) { tvc->callback = NULL; if (!localFid.Cell) localFid.Cell = tvc->fid.Cell; ! tvc->dchint = NULL; /* invalidate hints */ ObtainWriteLock(&afs_xcbhash, 449); afs_DequeueCallback(tvc); tvc->states &= ~(CStatd | CUnique | CBulkFetching); *************** *** 444,451 **** && tvc->fid.Fid.Volume == a_fid->Volume && tvc->fid.Fid.Unique == a_fid->Unique) { tvc->callback = NULL; ! tvc->quick.stamp = 0; ! tvc->h1.dchint = NULL; /* invalidate hints */ ObtainWriteLock(&afs_xcbhash, 450); afs_DequeueCallback(tvc); tvc->states &= ~(CStatd | CUnique | CBulkFetching); --- 443,449 ---- && tvc->fid.Fid.Volume == a_fid->Volume && tvc->fid.Fid.Unique == a_fid->Unique) { tvc->callback = NULL; ! tvc->dchint = NULL; /* invalidate hints */ ObtainWriteLock(&afs_xcbhash, 450); afs_DequeueCallback(tvc); tvc->states &= ~(CStatd | CUnique | CBulkFetching); Index: openafs/src/afs/afs_cbqueue.c diff -c openafs/src/afs/afs_cbqueue.c:1.9 openafs/src/afs/afs_cbqueue.c:1.9.2.1 *** openafs/src/afs/afs_cbqueue.c:1.9 Tue Jul 15 19:14:11 2003 --- openafs/src/afs/afs_cbqueue.c Mon May 30 00:05:40 2005 *************** *** 75,81 **** #include "afs/param.h" RCSID ! ("$Header: /cvs/openafs/src/afs/afs_cbqueue.c,v 1.9 2003/07/15 23:14:11 shadow Exp $"); #include "afs/sysincludes.h" /*Standard vendor system headers */ #include "afsincludes.h" /*AFS-based standard headers */ --- 75,81 ---- #include "afs/param.h" RCSID ! ("$Header: /cvs/openafs/src/afs/afs_cbqueue.c,v 1.9.2.1 2005/05/30 04:05:40 shadow Exp $"); #include "afs/sysincludes.h" /*Standard vendor system headers */ #include "afsincludes.h" /*AFS-based standard headers */ *************** *** 143,149 **** QRemove(&(avc->callsort)); avc->callsort.prev = avc->callsort.next = NULL; } else; /* must have got dequeued in a race */ - afs_symhint_inval(avc); return; } /* afs_DequeueCallback */ --- 143,148 ---- *************** *** 226,233 **** if ((tvc->fid.Fid.Vnode & 1) || (vType(tvc) == VDIR)) osi_dnlc_purgedp(tvc); ! tvc->quick.stamp = 0; ! tvc->h1.dchint = NULL; /*invalidate em */ afs_ResetVolumeInfo(tvp); break; } --- 225,231 ---- if ((tvc->fid.Fid.Vnode & 1) || (vType(tvc) == VDIR)) osi_dnlc_purgedp(tvc); ! tvc->dchint = NULL; /*invalidate em */ afs_ResetVolumeInfo(tvp); break; } *************** *** 309,316 **** for (i = 0; i < VCSIZE; i++) /* reset all the vnodes */ for (tvc = afs_vhashT[i]; tvc; tvc = tvc->hnext) { tvc->callback = 0; ! tvc->quick.stamp = 0; ! tvc->h1.dchint = NULL; /* invalidate hints */ tvc->states &= ~(CStatd); if ((tvc->fid.Fid.Vnode & 1) || (vType(tvc) == VDIR)) osi_dnlc_purgedp(tvc); --- 307,313 ---- for (i = 0; i < VCSIZE; i++) /* reset all the vnodes */ for (tvc = afs_vhashT[i]; tvc; tvc = tvc->hnext) { tvc->callback = 0; ! tvc->dchint = NULL; /* invalidate hints */ tvc->states &= ~(CStatd); if ((tvc->fid.Fid.Vnode & 1) || (vType(tvc) == VDIR)) osi_dnlc_purgedp(tvc); *************** *** 339,346 **** for (tvc = afs_vhashT[i]; tvc; tvc = tvc->hnext) { if (tvc->callback == srvp) { tvc->callback = 0; ! tvc->quick.stamp = 0; ! tvc->h1.dchint = NULL; /* invalidate hints */ tvc->states &= ~(CStatd); if ((tvc->fid.Fid.Vnode & 1) || (vType(tvc) == VDIR)) { osi_dnlc_purgedp(tvc); --- 336,342 ---- for (tvc = afs_vhashT[i]; tvc; tvc = tvc->hnext) { if (tvc->callback == srvp) { tvc->callback = 0; ! tvc->dchint = NULL; /* invalidate hints */ tvc->states &= ~(CStatd); if ((tvc->fid.Fid.Vnode & 1) || (vType(tvc) == VDIR)) { osi_dnlc_purgedp(tvc); Index: openafs/src/afs/afs_dcache.c diff -c openafs/src/afs/afs_dcache.c:1.42.2.10 openafs/src/afs/afs_dcache.c:1.42.2.12 *** openafs/src/afs/afs_dcache.c:1.42.2.10 Sun Apr 3 14:15:35 2005 --- openafs/src/afs/afs_dcache.c Mon May 30 00:05:40 2005 *************** *** 14,20 **** #include "afs/param.h" RCSID ! ("$Header: /cvs/openafs/src/afs/afs_dcache.c,v 1.42.2.10 2005/04/03 18:15:35 shadow Exp $"); #include "afs/sysincludes.h" /*Standard vendor system headers */ #include "afsincludes.h" /*AFS-based standard headers */ --- 14,20 ---- #include "afs/param.h" RCSID ! ("$Header: /cvs/openafs/src/afs/afs_dcache.c,v 1.42.2.12 2005/05/30 04:05:40 shadow Exp $"); #include "afs/sysincludes.h" /*Standard vendor system headers */ #include "afsincludes.h" /*AFS-based standard headers */ *************** *** 23,36 **** #include "afs/afs_osidnlc.h" /* Forward declarations. */ ! static void afs_GetDownD(int anumber, int *aneedSpace); static void afs_FreeDiscardedDCache(void); static void afs_DiscardDCache(struct dcache *); static void afs_FreeDCache(struct dcache *); /* * --------------------- Exported definitions --------------------- */ afs_lock_t afs_xdcache; /*Lock: alloc new disk cache entries */ afs_int32 afs_freeDCList; /*Free list for disk cache entries */ afs_int32 afs_freeDCCount; /*Count of elts in freeDCList */ --- 23,53 ---- #include "afs/afs_osidnlc.h" /* Forward declarations. */ ! static void afs_GetDownD(int anumber, int *aneedSpace, afs_int32 buckethint); static void afs_FreeDiscardedDCache(void); static void afs_DiscardDCache(struct dcache *); static void afs_FreeDCache(struct dcache *); + /* For split cache */ + static afs_int32 afs_DCGetBucket(struct vcache *); + static void afs_DCAdjustSize(struct dcache *, afs_int32, afs_int32); + static void afs_DCMoveBucket(struct dcache *, afs_int32, afs_int32); + static void afs_DCSizeInit(void); + static afs_int32 afs_DCWhichBucket(afs_int32, afs_int32); + /* * --------------------- Exported definitions --------------------- */ + /* For split cache */ + afs_int32 afs_blocksUsed_0; /*1K blocks in cache - in theory is zero */ + afs_int32 afs_blocksUsed_1; /*1K blocks in cache */ + afs_int32 afs_blocksUsed_2; /*1K blocks in cache */ + afs_int32 afs_pct1 = -1; + afs_int32 afs_pct2 = -1; + afs_uint32 afs_tpct1 = 0; + afs_uint32 afs_tpct2 = 0; + afs_uint32 splitdcache = 0; + afs_lock_t afs_xdcache; /*Lock: alloc new disk cache entries */ afs_int32 afs_freeDCList; /*Free list for disk cache entries */ afs_int32 afs_freeDCCount; /*Count of elts in freeDCList */ *************** *** 119,125 **** --- 136,245 ---- int cacheDiskType; /*Type of backing disk for cache */ struct afs_cacheOps *afs_cacheType; + static afs_int32 + afs_DCGetBucket(struct vcache *avc) + { + /* This should be replaced with some sort of user configurable function */ + if (avc->states & CRO) { + return 2; + } else if (avc->states & CBackup) { + return 1; + } else { + /* RW */ + } + /* main bucket */ + return 1; + } + + static void + afs_DCAdjustSize(struct dcache *adc, afs_int32 oldSize, afs_int32 newSize) + { + afs_int32 adjustSize = newSize - oldSize; + + if (!splitdcache) + return; + + switch (adc->bucket) + { + case 0: + afs_blocksUsed_0 += adjustSize; + afs_stats_cmperf.cacheBucket0_Discarded += oldSize; + break; + case 1: + afs_blocksUsed_1 += adjustSize; + afs_stats_cmperf.cacheBucket1_Discarded += oldSize; + break; + case 2: + afs_blocksUsed_2 += adjustSize; + afs_stats_cmperf.cacheBucket2_Discarded += oldSize; + break; + } + + return; + } + + static void + afs_DCMoveBucket(struct dcache *adc, afs_int32 size, afs_int32 newBucket) + { + if (!splitdcache) + return; + + switch (adc->bucket) + { + case 0: + afs_blocksUsed_0 -= size; + break; + case 1: + afs_blocksUsed_1 -= size; + break; + case 2: + afs_blocksUsed_2 -= size; + break; + } + + adc->bucket = newBucket; + + switch (adc->bucket) + { + case 0: + afs_blocksUsed_0 += size; + break; + case 1: + afs_blocksUsed_1 += size; + break; + case 2: + afs_blocksUsed_2 += size; + break; + } + + return; + } + + static void + afs_DCSizeInit(void) + { + afs_blocksUsed_0 = afs_blocksUsed_1 = afs_blocksUsed_2 = 0; + } + static afs_int32 + afs_DCWhichBucket(afs_int32 phase, afs_int32 bucket) + { + if (!splitdcache) + return 0; + + afs_pct1 = afs_blocksUsed_1*100/afs_cacheBlocks; + afs_pct2 = afs_blocksUsed_2*100/afs_cacheBlocks; + + /* Short cut: if we don't know about it, try to kill it */ + if (phase < 2 && afs_blocksUsed_0) + return 0; + + if (afs_pct1 > afs_tpct1) + return 1; + if (afs_pct2 > afs_tpct2) + return 2; + return 0; /* unlikely */ + } /* *************** *** 245,251 **** afs_blocksUsed - afs_blocksDiscarded - cb_lowat; slots_needed =