Index: openafs/src/WINNT/afsd/NTMakefile
diff -c openafs/src/WINNT/afsd/NTMakefile:1.27 openafs/src/WINNT/afsd/NTMakefile:1.27.2.1
*** openafs/src/WINNT/afsd/NTMakefile:1.27	Thu Aug  5 12:31:34 2004
--- openafs/src/WINNT/afsd/NTMakefile	Thu Aug 19 15:50:58 2004
***************
*** 221,227 ****
      $(AFSKFWLIB)
  
  LOGON_DLLSDKLIBS =\
! 	dnsapi.lib mpr.lib \
  	advapi32.lib \
  	secur32.lib \
  	strsafe.lib \
--- 221,229 ----
      $(AFSKFWLIB)
  
  LOGON_DLLSDKLIBS =\
!         dnsapi.lib \
!         netapi32.lib \
!         mpr.lib \
  	advapi32.lib \
  	secur32.lib \
  	strsafe.lib \
Index: openafs/src/WINNT/afsd/afsd_init.c
diff -c openafs/src/WINNT/afsd/afsd_init.c:1.40.2.1 openafs/src/WINNT/afsd/afsd_init.c:1.40.2.2
*** openafs/src/WINNT/afsd/afsd_init.c:1.40.2.1	Mon Aug  9 16:57:11 2004
--- openafs/src/WINNT/afsd/afsd_init.c	Tue Aug 17 00:28:38 2004
***************
*** 46,52 ****
  cm_volume_t *cm_rootVolumep = NULL;
  cm_cell_t *cm_rootCellp = NULL;
  cm_fid_t cm_rootFid;
! cm_scache_t *cm_rootSCachep;
  char cm_mountRoot[1024];
  DWORD cm_mountRootLen;
  int cm_logChunkSize;
--- 46,52 ----
  cm_volume_t *cm_rootVolumep = NULL;
  cm_cell_t *cm_rootCellp = NULL;
  cm_fid_t cm_rootFid;
! cm_scache_t *cm_rootSCachep = NULL;
  char cm_mountRoot[1024];
  DWORD cm_mountRootLen;
  int cm_logChunkSize;
***************
*** 71,77 ****
  
  char cm_NetbiosName[MAX_NB_NAME_LENGTH] = "";
  
! char cm_CachePath[200];
  DWORD cm_CachePathLen;
  
  BOOL isGateway = FALSE;
--- 71,77 ----
  
  char cm_NetbiosName[MAX_NB_NAME_LENGTH] = "";
  
! char cm_CachePath[MAX_PATH];
  DWORD cm_CachePathLen;
  
  BOOL isGateway = FALSE;
***************
*** 553,560 ****
  		code = RegQueryValueEx(parmKey, "LogoffTokenTransferTimeout",
  					NULL, NULL, (BYTE *) &ltto, &dummyLen);
  		if (code == ERROR_SUCCESS)
! 			afsi_log("Logoff token tranfer timeout %d seconds",
! 				 ltto);
  		else {
  			ltto = 10;
  			afsi_log("Default logoff token transfer timeout 10 seconds");
--- 553,559 ----
  		code = RegQueryValueEx(parmKey, "LogoffTokenTransferTimeout",
  					NULL, NULL, (BYTE *) &ltto, &dummyLen);
  		if (code == ERROR_SUCCESS)
!             afsi_log("Logoff token tranfer timeout %d seconds", ltto);
  		else {
  			ltto = 10;
  			afsi_log("Default logoff token transfer timeout 10 seconds");
***************
*** 647,654 ****
      cm_sysName = cm_sysNameList[0];
  
  	dummyLen = MAXSYSNAME;
! 	code = RegQueryValueEx(parmKey, "SysName", NULL, NULL,
! 				cm_sysName, &dummyLen);
  	if (code == ERROR_SUCCESS)
  		afsi_log("Sys name %s", cm_sysName);
  	else {
--- 646,652 ----
      cm_sysName = cm_sysNameList[0];
  
  	dummyLen = MAXSYSNAME;
!     code = RegQueryValueEx(parmKey, "SysName", NULL, NULL, cm_sysName, &dummyLen);
  	if (code == ERROR_SUCCESS)
  		afsi_log("Sys name %s", cm_sysName);
  	else {
***************
*** 943,953 ****
          }
  	}
  
  #ifdef AFS_FREELANCE_CLIENT
  	if (cm_freelanceEnabled)
  	  cm_InitFreelance();
  #endif
- 
  	return 0;
  }
  
--- 941,951 ----
          }
  	}
  
+ 
  #ifdef AFS_FREELANCE_CLIENT
  	if (cm_freelanceEnabled)
  	  cm_InitFreelance();
  #endif
  	return 0;
  }
  
Index: openafs/src/WINNT/afsd/afskfw.c
diff -c openafs/src/WINNT/afsd/afskfw.c:1.8 openafs/src/WINNT/afsd/afskfw.c:1.8.2.1
*** openafs/src/WINNT/afsd/afskfw.c:1.8	Sun Jul 11 17:23:07 2004
--- openafs/src/WINNT/afsd/afskfw.c	Tue Aug 17 00:28:38 2004
***************
*** 62,67 ****
--- 62,68 ----
  
  #include <osilog.h>
  #include <rxkad_prototypes.h>   /* for life_to_time */
+ #include <afs/ptserver.h>
  
  /*
   * TIMING _____________________________________________________________________
***************
*** 2378,2383 ****
--- 2379,2492 ----
      return(0);
  }
  
+ 
+ #define ALLOW_REGISTER 1
+ static int
+ ViceIDToUsername(char *username, 
+                  char *realm_of_user, 
+                  char *realm_of_cell,
+                  char * cell_to_use,
+                  struct ktc_principal *aclient, 
+                  struct ktc_principal *aserver, 
+                  struct ktc_token *atoken)
+ {
+     static char lastcell[MAXCELLCHARS+1] = { 0 };
+     static char confname[512] = { 0 };
+     char username_copy[BUFSIZ];
+     long viceId;			/* AFS uid of user */
+     int  status = 0;
+ #ifdef ALLOW_REGISTER
+     afs_int32 id;
+ #endif /* ALLOW_REGISTER */
+ 
+     if (confname[0] == '\0') {
+         strncpy(confname, AFSDIR_CLIENT_ETC_DIRPATH, sizeof(confname));
+         confname[sizeof(confname) - 2] = '\0';
+     }
+ 
+     /*
+      * Talk about DUMB!  It turns out that there is a bug in
+      * pr_Initialize -- even if you give a different cell name
+      * to it, it still uses a connection to a previous AFS server
+      * if one exists.  The way to fix this is to change the
+      * _filename_ argument to pr_Initialize - that forces it to
+      * re-initialize the connection.  We do this by adding and
+      * removing a "/" on the end of the configuration directory name.
+      */
+ 
+     if (lastcell[0] != '\0' && (strcmp(lastcell, aserver->cell) != 0)) {
+         int i = strlen(confname);
+         if (confname[i - 1] == '/') {
+             confname[i - 1] = '\0';
+         } else {
+             confname[i] = '/';
+             confname[i + 1] = '\0';
+         }
+     }
+ 
+     strcpy(lastcell, aserver->cell);
+ 
+     if (!pr_Initialize (0, confname, aserver->cell))
+         status = pr_SNameToId (username, &viceId);
+ 
+     /*
+      * This is a crock, but it is Transarc's crock, so
+      * we have to play along in order to get the
+      * functionality.  The way the afs id is stored is
+      * as a string in the username field of the token.
+      * Contrary to what you may think by looking at
+      * the code for tokens, this hack (AFS ID %d) will
+      * not work if you change %d to something else.
+      */
+ 
+     /*
+      * This code is taken from cklog -- it lets people
+      * automatically register with the ptserver in foreign cells
+      */
+ 
+ #ifdef ALLOW_REGISTER
+     if (status == 0) {
+         if (viceId != ANONYMOUSID) {
+ #else /* ALLOW_REGISTER */
+             if ((status == 0) && (viceId != ANONYMOUSID))
+ #endif /* ALLOW_REGISTER */
+             {
+ #ifdef AFS_ID_TO_NAME
+                 strncpy(username_copy, username, BUFSIZ);
+                 snprintf (username, BUFSIZ, "%s (AFS ID %d)", username_copy, (int) viceId);
+ #endif /* AFS_ID_TO_NAME */
+             }
+ #ifdef ALLOW_REGISTER
+         } else if (strcmp(realm_of_user, realm_of_cell) != 0) {
+             id = 0;
+             strncpy(aclient->name, username, MAXKTCNAMELEN - 1);
+             strcpy(aclient->instance, "");
+             strncpy(aclient->cell, realm_of_user, MAXKTCREALMLEN - 1);
+             if (status = ktc_SetToken(aserver, atoken, aclient, 0))
+                 return status;
+ 
+             /*                                    
+              * In case you're wondering, we don't need to change the
+              * filename here because we're still connecting to the
+              * same cell -- we're just using a different authentication
+              * level
+              */
+ 
+             if (status = pr_Initialize(1L, confname, aserver->cell, 0))
+                 return status;
+             if (status = pr_CreateUser(username, &id))
+                 return status;
+ #ifdef AFS_ID_TO_NAME
+             strncpy(username_copy, username, BUFSIZ);
+             snprintf (username, BUFSIZ, "%s (AFS ID %d)", username_copy, (int) viceId);
+ #endif /* AFS_ID_TO_NAME */
+         }
+     }
+ #endif /* ALLOW_REGISTER */
+     return status;
+ }
+ 
+ 
  int
  KFW_AFS_klog(
      krb5_context alt_ctx,
***************
*** 2717,2722 ****
--- 2826,2834 ----
              p[len] = '\0';
          }
  
+         ViceIDToUsername(aclient.name, realm_of_user, realm_of_cell, CellName, 
+                          &aclient, &aserver, &atoken);
+ 
          if ( smbname ) {
              strncpy(aclient.smbname, smbname, sizeof(aclient.smbname));
              aclient.smbname[sizeof(aclient.smbname)-1] = '\0';
***************
*** 2835,2840 ****
--- 2947,2955 ----
  
      strcpy(aclient.cell, CellName);
  
+     ViceIDToUsername(aclient.name, realm_of_user, realm_of_cell, CellName, 
+                       &aclient, &aserver, &atoken);
+ 
      if ( smbname ) {
          strncpy(aclient.smbname, smbname, sizeof(aclient.smbname));
          aclient.smbname[sizeof(aclient.smbname)-1] = '\0';
Index: openafs/src/WINNT/afsd/afslogon.c
diff -c openafs/src/WINNT/afsd/afslogon.c:1.24.2.1 openafs/src/WINNT/afsd/afslogon.c:1.24.2.3
*** openafs/src/WINNT/afsd/afslogon.c:1.24.2.1	Mon Aug  9 23:46:24 2004
--- openafs/src/WINNT/afsd/afslogon.c	Fri Aug 20 16:17:00 2004
***************
*** 15,20 ****
--- 15,21 ----
  #include <fcntl.h>
  
  #include <winsock2.h>
+ #include <lm.h>
  
  #include <afs/param.h>
  #include <afs/stds.h>
***************
*** 35,66 ****
  
  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);
! 	DeregisterEventSource(h);
  }
  
  #define MAXBUF_ 512
  void DebugEvent(char *b,...) 
  {
! 	HANDLE h; char *ptbuf[1],buf[MAXBUF_+1];
! 	va_list marker;
  
! 	if (!ISLOGONTRACE(TraceOption))
! 		return;
  
! 	h = RegisterEventSource(NULL, AFS_LOGON_EVENT_NAME);
! 	va_start(marker,b);
! 	StringCbVPrintf(buf, MAXBUF_+1,b,marker);
      buf[MAXBUF_] = '\0';
! 	ptbuf[0] = buf;
! 	ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (const char **)ptbuf, NULL);\
! 	DeregisterEventSource(h);
! 	va_end(marker);
  }
  
  static HANDLE hInitMutex = NULL;
--- 36,67 ----
  
  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);
!     DeregisterEventSource(h);
  }
  
  #define MAXBUF_ 512
  void DebugEvent(char *b,...) 
  {
!     HANDLE h; char *ptbuf[1],buf[MAXBUF_+1];
!     va_list marker;
  
!     if (!ISLOGONTRACE(TraceOption))
!         return;
  
!     h = RegisterEventSource(NULL, AFS_LOGON_EVENT_NAME);
!     va_start(marker,b);
!     StringCbVPrintf(buf, MAXBUF_+1,b,marker);
      buf[MAXBUF_] = '\0';
!     ptbuf[0] = buf;
!     ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (const char **)ptbuf, NULL);
!     DeregisterEventSource(h);
!     va_end(marker);
  }
  
  static HANDLE hInitMutex = NULL;
***************
*** 68,75 ****
  
  BOOLEAN APIENTRY DllEntryPoint(HANDLE dll, DWORD reason, PVOID reserved)
  {
! 	hDLL = dll;
! 	switch (reason) {
      case DLL_PROCESS_ATTACH:
          /* Initialization Mutex */
          hInitMutex = CreateMutex(NULL, FALSE, NULL);
--- 69,76 ----
  
  BOOLEAN APIENTRY DllEntryPoint(HANDLE dll, DWORD reason, PVOID reserved)
  {
!     hDLL = dll;
!     switch (reason) {
      case DLL_PROCESS_ATTACH:
          /* Initialization Mutex */
          hInitMutex = CreateMutex(NULL, FALSE, NULL);
***************
*** 82,199 ****
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      default:
! 		/* Everything else succeeds but does nothing. */
          break;
! 	}
  
! 	return TRUE;
  }
  
  void AfsLogonInit(void)
  {
      if ( bInit == FALSE ) {
!          if ( WaitForSingleObject( hInitMutex, INFINITE ) == WAIT_OBJECT_0 ) {
!              if ( bInit == FALSE ) {
!                  rx_Init(0);
!                  initAFSDirPath();
!                  ka_Init(0);
!                  bInit = TRUE;
!              }
!              ReleaseMutex(hInitMutex);
!          }
      }
  }
  
  CHAR *GenRandomName(CHAR *pbuf)
  {
! 	int i;
! 	srand( (unsigned)time( NULL ) );
! 	for (i=0;i<MAXRANDOMNAMELEN-1;i++)
! 		pbuf[i]='a'+(rand() % 26);
! 	pbuf[MAXRANDOMNAMELEN-1]=0;
! 	return pbuf;
  }
  
  BOOLEAN AFSWillAutoStart(void)
  {
! 	SC_HANDLE scm;
! 	SC_HANDLE svc;
! 	BOOLEAN flag;
! 	BOOLEAN result = FALSE;
! 	LPQUERY_SERVICE_CONFIG pConfig = NULL;
! 	DWORD BufSize;
! 	LONG status;
! 
! 	/* Open services manager */
! 	scm = OpenSCManager(NULL, NULL, GENERIC_READ);
! 	if (!scm) return FALSE;
! 
! 	/* Open AFSD service */
! 	svc = OpenService(scm, "TransarcAFSDaemon", SERVICE_QUERY_CONFIG);
! 	if (!svc)
! 		goto close_scm;
! 
! 	/* Query AFSD service config, first just to get buffer size */
! 	/* Expected to fail, so don't test return value */
! 	(void) QueryServiceConfig(svc, NULL, 0, &BufSize);
! 	status = GetLastError();
! 	if (status != ERROR_INSUFFICIENT_BUFFER)
! 		goto close_svc;
! 
! 	/* Allocate buffer */
! 	pConfig = (LPQUERY_SERVICE_CONFIG)GlobalAlloc(GMEM_FIXED,BufSize);
! 	if (!pConfig)
! 		goto close_svc;
! 
! 	/* Query AFSD service config, this time for real */
! 	flag = QueryServiceConfig(svc, pConfig, BufSize, &BufSize);
! 	if (!flag)
! 		goto free_pConfig;
! 
! 	/* Is it autostart? */
! 	if (pConfig->dwStartType < SERVICE_DEMAND_START)
! 		result = TRUE;
! 
! free_pConfig:
! 	GlobalFree(pConfig);
! close_svc:
! 	CloseServiceHandle(svc);
! close_scm:
! 	CloseServiceHandle(scm);
  
! 	return result;
  }
  
  DWORD MapAuthError(DWORD code)
  {
! 	switch (code) {
! 		/* Unfortunately, returning WN_NO_NETWORK results in the MPR abandoning
! 		 * logon scripts for all credential managers, although they will still
! 		 * receive logon notifications.  Since we don't want this, we return
! 		 * WN_SUCCESS.  This is highly undesirable, but we also don't want to
! 		 * break other network providers.
! 		 */
! /*	case KTC_NOCM:
! 	case KTC_NOCMRPC:
! 		return WN_NO_NETWORK; */
! 	default: return WN_SUCCESS;
! 	}
  }
  
  DWORD APIENTRY NPGetCaps(DWORD index)
  {
! 	switch (index) {
! 		case WNNC_NET_TYPE:
! 			/* Don't have our own type; use somebody else's. */
! 			return WNNC_NET_SUN_PC_NFS;
! 
! 		case WNNC_START:
! 			/* Say we are already started, even though we might wait after we receive NPLogonNotify */
! 			return 1;
! 
! 		default:
! 			return 0;
! 	}
  }
  
  BOOL IsServiceRunning (void)
--- 83,235 ----
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      default:
!         /* Everything else succeeds but does nothing. */
          break;
!     }
  
!     return TRUE;
  }
  
  void AfsLogonInit(void)
  {
      if ( bInit == FALSE ) {
!         if ( WaitForSingleObject( hInitMutex, INFINITE ) == WAIT_OBJECT_0 ) {
!             if ( bInit == FALSE ) {
!                 rx_Init(0);
!                 initAFSDirPath();
!                 ka_Init(0);
!                 bInit = TRUE;
!             }
!             ReleaseMutex(hInitMutex);
!         }
      }
  }
  
  CHAR *GenRandomName(CHAR *pbuf)
  {
!     int i;
!     srand( (unsigned)time( NULL ) );
!     for (i=0;i<MAXRANDOMNAMELEN-1;i++)
!         pbuf[i]='a'+(rand() % 26);
!     pbuf[MAXRANDOMNAMELEN-1]=0;
!     return pbuf;
  }
  
  BOOLEAN AFSWillAutoStart(void)
  {
!     SC_HANDLE scm;
!     SC_HANDLE svc;
!     BOOLEAN flag;
!     BOOLEAN result = FALSE;
!     LPQUERY_SERVICE_CONFIG pConfig = NULL;
!     DWORD BufSize;
!     LONG status;
! 
!     /* Open services manager */
!     scm = OpenSCManager(NULL, NULL, GENERIC_READ);
!     if (!scm) return FALSE;
! 
!     /* Open AFSD service */
!     svc = OpenService(scm, "TransarcAFSDaemon", SERVICE_QUERY_CONFIG);
!     if (!svc)
!         goto close_scm;
! 
!     /* Query AFSD service config, first just to get buffer size */
!     /* Expected to fail, so don't test return value */
!     (void) QueryServiceConfig(svc, NULL, 0, &BufSize);
!     status = GetLastError();
!     if (status != ERROR_INSUFFICIENT_BUFFER)
!         goto close_svc;
! 
!     /* Allocate buffer */
!     pConfig = (LPQUERY_SERVICE_CONFIG)GlobalAlloc(GMEM_FIXED,BufSize);
!     if (!pConfig)
!         goto close_svc;
! 
!     /* Query AFSD service config, this time for real */
!     flag = QueryServiceConfig(svc, pConfig, BufSize, &BufSize);
!     if (!flag)
!         goto free_pConfig;
! 
!     /* Is it autostart? */
!     if (pConfig->dwStartType < SERVICE_DEMAND_START)
!         result = TRUE;
! 
!   free_pConfig:
!     GlobalFree(pConfig);
!   close_svc:
!     CloseServiceHandle(svc);
!   close_scm:
!     CloseServiceHandle(scm);
  
!     return result;
  }
  
  DWORD MapAuthError(DWORD code)
  {
!     switch (code) {
!         /* Unfortunately, returning WN_NO_NETWORK results in the MPR abandoning
!          * logon scripts for all credential managers, although they will still
!          * receive logon notifications.  Since we don't want this, we return
!          * WN_SUCCESS.  This is highly undesirable, but we also don't want to
!          * break other network providers.
!          */
!  /* case KTC_NOCM:
!     case KTC_NOCMRPC:
!     return WN_NO_NETWORK; */
!     default: return WN_SUCCESS;
!   }
  }
  
  DWORD APIENTRY NPGetCaps(DWORD index)
  {
!     switch (index) {
!     case WNNC_NET_TYPE:
!         /* Don't have our own type; use somebody else's. */
!         return WNNC_NET_SUN_PC_NFS;
! 
!     case WNNC_START:
!         /* Say we are already started, even though we might wait after we receive NPLogonNotify */
!         return 1;
! 
!     default:
!         return 0;
!     }
! }       
! 
! NET_API_STATUS 
! NetUserGetProfilePath( LPCWSTR Domain, LPCWSTR UserName, char * profilePath, 
!                        DWORD profilePathLen )
! {
!     NET_API_STATUS code;
!     LPWSTR ServerName = NULL;
!     LPUSER_INFO_3 p3 = NULL;
! 
!     NetGetAnyDCName(NULL, Domain, (LPBYTE *)&ServerName);
!     /* if NetGetAnyDCName fails, ServerName == NULL
!      * NetUserGetInfo will obtain local user information 
!      */
!     code = NetUserGetInfo(ServerName, UserName, 3, (LPBYTE *)&p3);
!     if (code == NERR_Success)
!     {
!         code = NERR_UserNotFound;
!         if (p3) {
!             if (p3->usri3_profile) {
!                 DWORD len = lstrlenW(p3->usri3_profile);
!                 if (len > 0) {
!                     /* Convert From Unicode to ANSI (UTF-8 for future) */
!                     len = len < profilePathLen ? len : profilePathLen - 1;
!                     WideCharToMultiByte(CP_UTF8, 0, p3->usri3_profile, len, profilePath, len, NULL, NULL);
!                     profilePath[len] = '\0';
!                     code = NERR_Success;
!                 }
!             }
!             NetApiBufferFree(p3);
!         }
!     }
!     if (ServerName) 
!         NetApiBufferFree(ServerName);
!     return code;
  }
  
  BOOL IsServiceRunning (void)
***************
*** 251,485 ****
  /* Get domain specific configuration info.  We are returning void because if anything goes wrong
     we just return defaults.
   */
! void GetDomainLogonOptions( PLUID lpLogonId, char * username, char * domain, LogonOptions_t *opt ) {
! 	HKEY hkParm = NULL; /* Service parameter */
! 	HKEY hkNp = NULL;   /* network provider key */
! 	HKEY hkDoms = NULL; /* domains key */
! 	HKEY hkDom = NULL;  /* DOMAINS/domain key */
! 	HKEY hkTemp = NULL;
! 	LONG rv;
! 	DWORD dwSize;
! 	DWORD dwType;
! 	DWORD dwDummy;
! 	char computerName[MAX_COMPUTERNAME_LENGTH + 1];
! 	char *effDomain;
! 
! 	DebugEvent("In GetDomainLogonOptions for user [%s] in domain [%s]", username, domain);
! 	/* If the domain is the same as the Netbios computer name, we use the LOCALHOST domain name*/
! 	opt->flags = LOGON_FLAG_REMOTE;
! 	if(domain) {
! 		dwSize = MAX_COMPUTERNAME_LENGTH;
! 		if(GetComputerName(computerName, &dwSize)) {
! 			if(!stricmp(computerName, domain)) {
! 				effDomain = "LOCALHOST";
! 				opt->flags = LOGON_FLAG_LOCAL;
! 			}
! 			else
! 				effDomain = domain;
! 		}
! 	} else
! 		effDomain = NULL;
! 
! 	rv = RegOpenKeyEx( HKEY_LOCAL_MACHINE, REG_CLIENT_PARMS_KEY, 0, KEY_READ, &hkParm );
! 	if(rv != ERROR_SUCCESS) {
! 		hkParm = NULL;
! 		DebugEvent("GetDomainLogonOption: Can't open parms key [%d]", rv);
! 	}
! 
! 	rv = RegOpenKeyEx( HKEY_LOCAL_MACHINE, REG_CLIENT_PROVIDER_KEY, 0, KEY_READ, &hkNp );
! 	if(rv != ERROR_SUCCESS) {
! 		hkNp = NULL;
! 		DebugEvent("GetDomainLogonOptions: Can't open NP key [%d]", rv);
! 	}
! 
! 	if(hkNp) {
! 		rv = RegOpenKeyEx( hkNp, REG_CLIENT_DOMAINS_SUBKEY, 0, KEY_READ, &hkDoms );
! 		if( rv != ERROR_SUCCESS ) {
! 			hkDoms = NULL;
! 			DebugEvent("GetDomainLogonOptions: Can't open Domains key [%d]", rv);
! 		}
! 	}
! 
! 	if(hkDoms && effDomain) {
! 		rv = RegOpenKeyEx( hkDoms, effDomain, 0, KEY_READ, &hkDom );
! 		if( rv != ERROR_SUCCESS ) {
! 			hkDom = NULL;
! 			DebugEvent("GetDomainLogonOptions: Can't open domain key for [%s] [%d]", effDomain, rv);
! 			/* If none of the domains match, we shouldn't use the domain key either */
! 			RegCloseKey(hkDoms);
! 			hkDoms = NULL;
! 		}
! 	} else
! 		DebugEvent("Not opening domain key for [%s]", effDomain);
! 
! 	/* Each individual can either be specified on the domain key, the domains key or in the
! 	   net provider key.  They fail over in that order.  If none is found, we just use the 
! 	   defaults. */
! 
! 	/* LogonOption */
! 	LOOKUPKEYCHAIN(opt->LogonOption, REG_DWORD, DEFAULT_LOGON_OPTION, REG_CLIENT_LOGON_OPTION_PARM);
! 
! 	/* FailLoginsSilently */
! 	dwSize = sizeof(dwDummy);
! 	rv = RegQueryValueEx(hkParm, REG_CLIENT_FAIL_SILENTLY_PARM, 0, &dwType, (LPBYTE) &dwDummy, &dwSize);
! 	if(rv != ERROR_SUCCESS)
! 		LOOKUPKEYCHAIN(dwDummy, REG_DWORD, DEFAULT_FAIL_SILENTLY, REG_CLIENT_FAIL_SILENTLY_PARM);
      opt->failSilently = !!dwDummy;
  
! 	/* Retry interval */
! 	LOOKUPKEYCHAIN(opt->retryInterval, REG_DWORD, DEFAULT_RETRY_INTERVAL, REG_CLIENT_RETRY_INTERVAL_PARM);
  
! 	/* Sleep interval */
! 	LOOKUPKEYCHAIN(opt->sleepInterval, REG_DWORD, DEFAULT_SLEEP_INTERVAL, REG_CLIENT_SLEEP_INTERVAL_PARM);
  
! 	opt->logonScript = NULL;
! 	opt->smbName = NULL;
  
! 	if(!ISLOGONINTEGRATED(opt->LogonOption)) {
! 		goto cleanup; /* no need to lookup the logon script */
! 	}
  
! 	/* come up with SMB username */
! 	if(ISHIGHSECURITY(opt->LogonOption)) {
          opt->smbName = malloc( MAXRANDOMNAMELEN );
! 		GenRandomName(opt->smbName);
! 	} else {
! 		/* username and domain for logon session is not necessarily the same as
! 		   username and domain passed into network provider. */
! 		PSECURITY_LOGON_SESSION_DATA plsd;
! 		char lsaUsername[MAX_USERNAME_LENGTH];
! 		char lsaDomain[MAX_DOMAIN_LENGTH];
! 		size_t len, tlen;
  
          LsaGetLogonSessionData(lpLogonId, &plsd);
          
! 		UnicodeStringToANSI(plsd->UserName, lsaUsername, MAX_USERNAME_LENGTH);
! 		UnicodeStringToANSI(plsd->LogonDomain, lsaDomain, MAX_DOMAIN_LENGTH);
  
! 		DebugEvent("PLSD username[%s] domain[%s]",lsaUsername,lsaDomain);
  
! 		if(SUCCEEDED(StringCbLength(lsaUsername, MAX_USERNAME_LENGTH, &tlen)))
! 			len = tlen;
! 		else
! 			goto bad_strings;
! 
! 		if(SUCCEEDED(StringCbLength(lsaDomain, MAX_DOMAIN_LENGTH, &tlen)))
! 			len += tlen;
! 		else
! 			goto bad_strings;
! 
! 		len += 2;
! 
! 		opt->smbName = malloc(len);
! 
! 		StringCbCopy(opt->smbName, len, lsaDomain);
! 		StringCbCat(opt->smbName, len, "\\");
! 		StringCbCat(opt->smbName, len, lsaUsername);
! 
! 		strlwr(opt->smbName);
! 
! bad_strings:
! 		LsaFreeReturnBuffer(plsd);
! 	}
! 
! 	DebugEvent("Looking up logon script");
! 	/* Logon script */
! 	/* First find out where the key is */
! 	hkTemp = NULL;
! 	rv = ~ERROR_SUCCESS;
! 	dwType = 0;
! 	if(hkDom)
! 	    rv = RegQueryValueExW(hkDom, REG_CLIENT_LOGON_SCRIPT_PARMW, 0, &dwType, NULL, &dwSize);
! 	if(rv == ERROR_SUCCESS && (dwType == REG_SZ || dwType == REG_EXPAND_SZ)) {
! 		hkTemp = hkDom;
! 		DebugEvent("Located logon script in hkDom");
! 	}
! 	else if(hkDoms)
! 	    rv = RegQueryValueExW(hkDoms, REG_CLIENT_LOGON_SCRIPT_PARMW, 0, &dwType, NULL, &dwSize);
! 	if(rv == ERROR_SUCCESS && !hkTemp && (dwType == REG_SZ || dwType == REG_EXPAND_SZ)) {
! 		hkTemp = hkDoms;
! 		DebugEvent("Located logon script in hkDoms");
! 	}
! 	/* Note that the LogonScript in the NP key is only used if we are doing high security. */
! 	else if(hkNp && ISHIGHSECURITY(opt->LogonOption))
! 	    rv = RegQueryValueExW(hkNp, REG_CLIENT_LOGON_SCRIPT_PARMW, 0, &dwType, NULL, &dwSize);
! 	if(rv == ERROR_SUCCESS && !hkTemp && (dwType == REG_SZ || dwType == REG_EXPAND_SZ)) {
! 		hkTemp = hkNp;
! 		DebugEvent("Located logon script in hkNp");
! 	}
! 
! 	if(hkTemp) {
! 		WCHAR *regscript	= NULL;
! 		WCHAR *regexscript	= NULL;
! 		WCHAR *regexuscript	= NULL;
! 		WCHAR *wuname		= NULL;
! 		HRESULT hr;
  
! 		size_t len;
! 		
! 		StringCbLength(opt->smbName, MAX_USERNAME_LENGTH, &len);
! 		len ++;
  
! 		wuname = malloc(len * sizeof(WCHAR));
! 		MultiByteToWideChar(CP_ACP,0,opt->smbName,-1,wuname,len*sizeof(WCHAR));
  
! 		DebugEvent("Username is set for [%S]", wuname);
  
! 		/* dwSize still has the size of the required buffer in bytes. */
          regscript = malloc(dwSize);
! 		rv = RegQueryValueExW(hkTemp, REG_CLIENT_LOGON_SCRIPT_PARMW, 0, &dwType, (LPBYTE) regscript, &dwSize);
! 		if(rv != ERROR_SUCCESS) {/* what the ..? */
! 			DebugEvent("Can't look up logon script [%d]",rv);
! 			goto doneLogonScript;
! 		}
! 		
! 		DebugEvent("Found logon script [%S]", regscript);
  
! 		if(dwType == REG_EXPAND_SZ) {
! 			DWORD dwReq;
  
! 	   		dwSize += MAX_PATH * sizeof(WCHAR);  /* make room for environment expansion. */
! 			regexscript = malloc(dwSize);
! 			dwReq = ExpandEnvironmentStringsW(regscript, regexscript, dwSize / sizeof(WCHAR));
! 			free(regscript);
! 			regscript = regexscript;
! 			regexscript = NULL;
! 			if(dwReq > (dwSize / sizeof(WCHAR))) {
! 				DebugEvent("Overflow while expanding environment strings.");
! 				goto doneLogonScript;
! 			}
! 		}
! 
! 		DebugEvent("After expanding env strings [%S]", regscript);
! 
! 		if(wcsstr(regscript, L"%s")) {
! 	        dwSize += len * sizeof(WCHAR); /* make room for username expansion */
! 			regexuscript = (WCHAR *) LocalAlloc(LMEM_FIXED, dwSize);
! 			hr = StringCbPrintfW(regexuscript, dwSize, regscript, wuname);
! 		} else {
! 			regexuscript = (WCHAR *) LocalAlloc(LMEM_FIXED, dwSize);
! 			hr = StringCbCopyW(regexuscript, dwSize, regscript);
! 		}
! 
! 		DebugEvent("After expanding username [%S]", regexuscript);
! 
! 		if(hr == S_OK)
! 			opt->logonScript = regexuscript;
! 		else
! 			LocalFree(regexuscript);
! 
! doneLogonScript:
! 		if(wuname) free(wuname);
! 		if(regscript) free(regscript);
! 		if(regexscript) free(regexscript);
! 	}
! 
! cleanup:
! 	if(hkNp) RegCloseKey(hkNp);
! 	if(hkDom) RegCloseKey(hkDom);
! 	if(hkDoms) RegCloseKey(hkDoms);
! 	if(hkParm) RegCloseKey(hkParm);
! }
  
  #undef LOOKUPKEYCHAIN
  
--- 287,522 ----
  /* Get domain specific configuration info.  We are returning void because if anything goes wrong
     we just return defaults.
   */
! void 
! GetDomainLogonOptions( PLUID lpLogonId, char * username, char * domain, LogonOptions_t *opt ) {
!     HKEY hkParm = NULL; /* Service parameter */
!     HKEY hkNp = NULL;   /* network provider key */
!     HKEY hkDoms = NULL; /* domains key */
!     HKEY hkDom = NULL;  /* DOMAINS/domain key */
!     HKEY hkTemp = NULL;
!     LONG rv;
!     DWORD dwSize;
!     DWORD dwType;
!     DWORD dwDummy;
!     char computerName[MAX_COMPUTERNAME_LENGTH + 1];
!     char *effDomain;
! 
!     DebugEvent("In GetDomainLogonOptions for user [%s] in domain [%s]", username, domain);
!     /* If the domain is the same as the Netbios computer name, we use the LOCALHOST domain name*/
!     opt->flags = LOGON_FLAG_REMOTE;
!     if(domain) {
!         dwSize = MAX_COMPUTERNAME_LENGTH;
!         if(GetComputerName(computerName, &dwSize)) {
!             if(!stricmp(computerName, domain)) {
!                 effDomain = "LOCALHOST";
!                 opt->flags = LOGON_FLAG_LOCAL;
!             }
!             else
!                 effDomain = domain;
!         }
!     } else
!         effDomain = NULL;
! 
!     rv = RegOpenKeyEx( HKEY_LOCAL_MACHINE, REG_CLIENT_PARMS_KEY, 0, KEY_READ, &hkParm );
!     if(rv != ERROR_SUCCESS) {
!         hkParm = NULL;
!         DebugEvent("GetDomainLogonOption: Can't open parms key [%d]", rv);
!     }
! 
!     rv = RegOpenKeyEx( HKEY_LOCAL_MACHINE, REG_CLIENT_PROVIDER_KEY, 0, KEY_READ, &hkNp );
!     if(rv != ERROR_SUCCESS) {
!         hkNp = NULL;
!         DebugEvent("GetDomainLogonOptions: Can't open NP key [%d]", rv);
!     }
! 
!     if(hkNp) {
!         rv = RegOpenKeyEx( hkNp, REG_CLIENT_DOMAINS_SUBKEY, 0, KEY_READ, &hkDoms );
!         if( rv != ERROR_SUCCESS ) {
!             hkDoms = NULL;
!             DebugEvent("GetDomainLogonOptions: Can't open Domains key [%d]", rv);
!         }
!     }
! 
!     if(hkDoms && effDomain) {
!         rv = RegOpenKeyEx( hkDoms, effDomain, 0, KEY_READ, &hkDom );
!         if( rv != ERROR_SUCCESS ) {
!             hkDom = NULL;
!             DebugEvent("GetDomainLogonOptions: Can't open domain key for [%s] [%d]", effDomain, rv);
!             /* If none of the domains match, we shouldn't use the domain key either */
!             RegCloseKey(hkDoms);
!             hkDoms = NULL;
!         }
!     } else
!         DebugEvent("Not opening domain key for [%s]", effDomain);
! 
!     /* Each individual can either be specified on the domain key, the domains key or in the
!        net provider key.  They fail over in that order.  If none is found, we just use the 
!        defaults. */
! 
!     /* LogonOption */
!     LOOKUPKEYCHAIN(opt->LogonOption, REG_DWORD, DEFAULT_LOGON_OPTION, REG_CLIENT_LOGON_OPTION_PARM);
! 
!     /* FailLoginsSilently */
!     dwSize = sizeof(dwDummy);
!     rv = RegQueryValueEx(hkParm, REG_CLIENT_FAIL_SILENTLY_PARM, 0, &dwType, (LPBYTE) &dwDummy, &dwSize);
!     if (rv != ERROR_SUCCESS)
!         LOOKUPKEYCHAIN(dwDummy, REG_DWORD, DEFAULT_FAIL_SILENTLY, REG_CLIENT_FAIL_SILENTLY_PARM);
      opt->failSilently = !!dwDummy;
  
!     /* Retry interval */
!     LOOKUPKEYCHAIN(opt->retryInterval, REG_DWORD, DEFAULT_RETRY_INTERVAL, REG_CLIENT_RETRY_INTERVAL_PARM);
  
!     /* Sleep interval */
!     LOOKUPKEYCHAIN(opt->sleepInterval, REG_DWORD, DEFAULT_SLEEP_INTERVAL, REG_CLIENT_SLEEP_INTERVAL_PARM);
  
!     opt->logonScript = NULL;
!     opt->smbName = NULL;
  
!     if(!ISLOGONINTEGRATED(opt->LogonOption)) {
!         goto cleanup; /* no need to lookup the logon script */
!     }
  
!     /* come up with SMB username */
!     if(ISHIGHSECURITY(opt->LogonOption)) {
          opt->smbName = malloc( MAXRANDOMNAMELEN );
!         GenRandomName(opt->smbName);
!     } else {
!         /* username and domain for logon session is not necessarily the same as
!            username and domain passed into network provider. */
!         PSECURITY_LOGON_SESSION_DATA plsd;
!         char lsaUsername[MAX_USERNAME_LENGTH];
!         char lsaDomain[MAX_DOMAIN_LENGTH];
!         size_t len, tlen;
  
          LsaGetLogonSessionData(lpLogonId, &plsd);
          
!         UnicodeStringToANSI(plsd->UserName, lsaUsername, MAX_USERNAME_LENGTH);
!         UnicodeStringToANSI(plsd->LogonDomain, lsaDomain, MAX_DOMAIN_LENGTH);
  
!         DebugEvent("PLSD username[%s] domain[%s]",lsaUsername,lsaDomain);
  
!         if(SUCCEEDED(StringCbLength(lsaUsername, MAX_USERNAME_LENGTH, &tlen)))
!             len = tlen;
!         else
!             goto bad_strings;
  
!         if(SUCCEEDED(StringCbLength(lsaDomain, MAX_DOMAIN_LENGTH, &tlen)))
!             len += tlen;
!         else
!             goto bad_strings;
! 
!         len += 2;
! 
!         opt->smbName = malloc(len);
! 
!         StringCbCopy(opt->smbName, len, lsaDomain);
!         StringCbCat(opt->smbName, len, "\\");
!         StringCbCat(opt->smbName, len, lsaUsername);
  
!         strlwr(opt->smbName);
  
!       bad_strings:
!         LsaFreeReturnBuffer(plsd);
!     }
! 
!     DebugEvent("Looking up logon script");
!     /* Logon script */
!     /* First find out where the key is */
!     hkTemp = NULL;
!     rv = ~ERROR_SUCCESS;
!     dwType = 0;
!     if(hkDom)
!         rv = RegQueryValueExW(hkDom, REG_CLIENT_LOGON_SCRIPT_PARMW, 0, &dwType, NULL, &dwSize);
!     if(rv == ERROR_SUCCESS && (dwType == REG_SZ || dwType == REG_EXPAND_SZ)) {
!         hkTemp = hkDom;
!         DebugEvent("Located logon script in hkDom");
!     }
!     else if(hkDoms)
!         rv = RegQueryValueExW(hkDoms, REG_CLIENT_LOGON_SCRIPT_PARMW, 0, &dwType, NULL, &dwSize);
!     if(rv == ERROR_SUCCESS && !hkTemp && (dwType == REG_SZ || dwType == REG_EXPAND_SZ)) {
!         hkTemp = hkDoms;
!         DebugEvent("Located logon script in hkDoms");
!     }
!     /* Note that the LogonScript in the NP key is only used if we are doing high security. */
!     else if(hkNp && ISHIGHSECURITY(opt->LogonOption))
!         rv = RegQueryValueExW(hkNp, REG_CLIENT_LOGON_SCRIPT_PARMW, 0, &dwType, NULL, &dwSize);
!     if(rv == ERROR_SUCCESS && !hkTemp && (dwType == REG_SZ || dwType == REG_EXPAND_SZ)) {
!         hkTemp = hkNp;
!         DebugEvent("Located logon script in hkNp");
!     }
! 
!     if(hkTemp) {
!         WCHAR *regscript	= NULL;
!         WCHAR *regexscript	= NULL;
!         WCHAR *regexuscript	= NULL;
!         WCHAR *wuname		= NULL;
!         HRESULT hr;
  
!         size_t len;
! 
!         StringCbLength(opt->smbName, MAX_USERNAME_LENGTH, &len);
!         len ++;
! 
!         wuname = malloc(len * sizeof(WCHAR));
!         MultiByteToWideChar(CP_ACP,0,opt->smbName,-1,wuname,len*sizeof(WCHAR));
! 
!         DebugEvent("Username is set for [%S]", wuname);
! 
!         /* dwSize still has the size of the required buffer in bytes. */
          regscript = malloc(dwSize);
!         rv = RegQueryValueExW(hkTemp, REG_CLIENT_LOGON_SCRIPT_PARMW, 0, &dwType, (LPBYTE) regscript, &dwSize);
!         if(rv != ERROR_SUCCESS) {/* what the ..? */
!             DebugEvent("Can't look up logon script [%d]",rv);
!             goto doneLogonScript;
!         }
  
!         DebugEvent("Found logon script [%S]", regscript);
  
!         if(dwType == REG_EXPAND_SZ) {
!             DWORD dwReq;
! 
!             dwSize += MAX_PATH * sizeof(WCHAR);  /* make room for environment expansion. */
!             regexscript = malloc(dwSize);
!             dwReq = ExpandEnvironmentStringsW(regscript, regexscript, dwSize / sizeof(WCHAR));
!             free(regscript);
!             regscript = regexscript;
!             regexscript = NULL;
!             if(dwReq > (dwSize / sizeof(WCHAR))) {
!                 DebugEvent("Overflow while expanding environment strings.");
!                 goto doneLogonScript;
!             }
!         }
! 
!         DebugEvent("After expanding env strings [%S]", regscript);
! 
!         if(wcsstr(regscript, L"%s")) {
!             dwSize += len * sizeof(WCHAR); /* make room for username expansion */
!             regexuscript = (WCHAR *) LocalAlloc(LMEM_FIXED, dwSize);
!             hr = StringCbPrintfW(regexuscript, dwSize, regscript, wuname);
!         } else {
!             regexuscript = (WCHAR *) LocalAlloc(LMEM_FIXED, dwSize);
!             hr = StringCbCopyW(regexuscript, dwSize, regscript);
!         }
! 
!         DebugEvent("After expanding username [%S]", regexuscript);
! 
!         if(hr == S_OK)
!             opt->logonScript = regexuscript;
!         else
!             LocalFree(regexuscript);
! 
!       doneLogonScript:
!         if(wuname) free(wuname);
!         if(regscript) free(regscript);
!         if(regexscript) free(regexscript);
!     }
! 
!   cleanup:
!     if(hkNp) RegCloseKey(hkNp);
!     if(hkDom) RegCloseKey(hkDom);
!     if(hkDoms) RegCloseKey(hkDoms);
!     if(hkParm) RegCloseKey(hkParm);
! }       
  
  #undef LOOKUPKEYCHAIN
  
***************
*** 487,508 ****
     the contents of *cell in case of failure. *cell is assumed to be
     at least cellLen chars */
  DWORD GetFileCellName(char * path, char * cell, size_t cellLen) {
! 	struct ViceIoctl blob;
! 	char tcell[MAX_PATH];
! 	DWORD code;
! 
! 	blob.in_size = 0;
! 	blob.out_size = MAX_PATH;
! 	blob.out = tcell;
! 
! 	code = pioctl(path, VIOC_FILE_CELL_NAME, &blob, 1);
! 
! 	if(!code) {
! 		strncpy(cell, tcell, cellLen);
! 		cell[cellLen - 1] = '\0';
! 	}
! 	return code;
! }
  
  
  static BOOL
--- 524,545 ----
     the contents of *cell in case of failure. *cell is assumed to be
     at least cellLen chars */
  DWORD GetFileCellName(char * path, char * cell, size_t cellLen) {
!     struct ViceIoctl blob;
!     char tcell[MAX_PATH];
!     DWORD code;
! 
!     blob.in_size = 0;
!     blob.out_size = MAX_PATH;
!     blob.out = tcell;
! 
!     code = pioctl(path, VIOC_FILE_CELL_NAME, &blob, 1);
! 
!     if(!code) {
!         strncpy(cell, tcell, cellLen);
!         cell[cellLen - 1] = '\0';
!     }
!     return code;
! }       
  
  
  static BOOL
***************
*** 526,533 ****
          lpszOutputString[min(uInputString.Length/2,nOutStringLen-1)] = '\0';
          return TRUE;
      }
! 	else
! 		lpszOutputString[0] = '\0';
      return FALSE;
  }  // UnicodeStringToANSI
  
--- 563,570 ----
          lpszOutputString[min(uInputString.Length/2,nOutStringLen-1)] = '\0';
          return TRUE;
      }
!     else
!         lpszOutputString[0] = '\0';
      return FALSE;
  }  // UnicodeStringToANSI
  
***************
*** 541,597 ****
  	LPVOID StationHandle,
  	LPWSTR *lpLogonScript)
  {
! 	char uname[MAX_USERNAME_LENGTH]="";
! 	char password[MAX_PASSWORD_LENGTH]="";
! 	char logonDomain[MAX_DOMAIN_LENGTH]="";
! 	char cell[256]="<non-integrated logon>";
! 	char homePath[MAX_PATH]="";
! 
! 	MSV1_0_INTERACTIVE_LOGON *IL;
  
! 	DWORD code;
  
! 	int pw_exp;
! 	char *reason;
! 	char *ctemp;
  
! 	BOOLEAN interactive;
! 	BOOLEAN flag;
! 	DWORD LSPtype, LSPsize;
! 	HKEY NPKey;
  
! 	HWND hwndOwner = (HWND)StationHandle;
  
! 	BOOLEAN afsWillAutoStart;
  
      BOOLEAN uppercased_name = TRUE;
  
! 	LogonOptions_t opt; /* domain specific logon options */
! 	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? */
! 	interactive = (wcscmp(lpStationName, L"WinSta0") == 0);
! 
! 	/* Convert from Unicode to ANSI */
! 
! 	/*TODO: Use SecureZeroMemory to erase passwords */
! 	UnicodeStringToANSI(IL->UserName, uname, MAX_USERNAME_LENGTH);
! 	UnicodeStringToANSI(IL->Password, password, MAX_PASSWORD_LENGTH);
! 	UnicodeStringToANSI(IL->LogonDomainName, logonDomain, MAX_DOMAIN_LENGTH);
  
! 	/* Make sure AD-DOMANS sent from login that is sent to us is striped */
      ctemp = strchr(uname, '@');
      if (ctemp) *ctemp = 0;
  
--- 578,634 ----
  	LPVOID StationHandle,
  	LPWSTR *lpLogonScript)
  {
!     char uname[MAX_USERNAME_LENGTH]="";
!     char password[MAX_PASSWORD_LENGTH]="";
!     char logonDomain[MAX_DOMAIN_LENGTH]="";
!     char cell[256]="<non-integrated logon>";
!     char homePath[MAX_PATH]="";
  
!     MSV1_0_INTERACTIVE_LOGON *IL;
  
!     DWORD code;
  
!     int pw_exp;
!     char *reason;
!     char *ctemp;
! 
!     BOOLEAN interactive;
!     BOOLEAN flag;
!     DWORD LSPtype, LSPsize;
!     HKEY NPKey;
  
!     HWND hwndOwner = (HWND)StationHandle;
  
!     BOOLEAN afsWillAutoStart;
  
      BOOLEAN uppercased_name = TRUE;
  
!     LogonOptions_t opt; /* domain specific logon options */
!     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? */
!     interactive = (wcscmp(lpStationName, L"WinSta0") == 0);
! 
!     /* Convert from Unicode to ANSI */
! 
!     /*TODO: Use SecureZeroMemory to erase passwords */
!     UnicodeStringToANSI(IL->UserName, uname, MAX_USERNAME_LENGTH);
!     UnicodeStringToANSI(IL->Password, password, MAX_PASSWORD_LENGTH);
!     UnicodeStringToANSI(IL->LogonDomainName, logonDomain, MAX_DOMAIN_LENGTH);
  
!     /* Make sure AD-DOMANS sent from login that is sent to us is striped */
      ctemp = strchr(uname, '@');
      if (ctemp) *ctemp = 0;
  
***************
*** 603,662 ****
          }
      }
  
! 	(void) RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_CLIENT_PARMS_KEY,
!                         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
! 	 */
  
! 	GetDomainLogonOptions( lpLogonId, uname, logonDomain, &opt );
! 	retryInterval = opt.retryInterval;
! 	sleepInterval = opt.sleepInterval;
! 	*lpLogonScript = opt.logonScript;
  
! 	DebugEvent("Got logon script: %S",opt.logonScript);
  
! 	afsWillAutoStart = AFSWillAutoStart();
  
! 	DebugEvent("LogonOption[%x], Service AutoStart[%d]",
                  opt.LogonOption,afsWillAutoStart);
      
      /* Check for zero length password if integrated logon*/
! 	if ( ISLOGONINTEGRATED(opt.LogonOption) )  {
          if ( password[0] == 0 ) {
              DebugEvent("Password is the empty string");
              code = GT_PW_NULL;
              reason = "zero length password is illegal";
              code=0;
!         }
  
          /* Get cell name if doing integrated logon.  
! 		   We might overwrite this if we are logging into an AD realm and we find out that
! 		   the user's home dir is in some other cell. */
          DebugEvent("About to call cm_GetRootCellName(%s)",cell);
! 		code = cm_GetRootCellName(cell);
! 		if (code < 0) { 
              DebugEvent("Unable to obtain Root Cell");
! 			code = KTC_NOCELL;
! 			reason = "unknown cell";
! 			code=0;
! 		} else {
              DebugEvent("Cell is %s",cell);
!         }
  
! 		/* We get the user's home directory path, if applicable, though we can't lookup the
! 		   cell right away because the client service may not have started yet. This call
! 		   also sets the AD_REALM flag in opt.flags if applicable. */
! 		if(ISREMOTE(opt.flags)) {
              DebugEvent("Is Remote");
! 			GetAdHomePath(homePath,MAX_PATH,lpLogonId,&opt);
!         }
      }
  
      /* loop until AFS is started. */
--- 640,699 ----
          }
      }
  
!     (void) RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_CLIENT_PARMS_KEY,
!                          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
!      */
  
!     GetDomainLogonOptions( lpLogonId, uname, logonDomain, &opt );
!     retryInterval = opt.retryInterval;
!     sleepInterval = opt.sleepInterval;
!     *lpLogonScript = opt.logonScript;
  
!     DebugEvent("Got logon script: %S",opt.logonScript);
  
!     afsWillAutoStart = AFSWillAutoStart();
  
!     DebugEvent("LogonOption[%x], Service AutoStart[%d]",
                  opt.LogonOption,afsWillAutoStart);
      
      /* Check for zero length password if integrated logon*/
!     if ( ISLOGONINTEGRATED(opt.LogonOption) )  {
          if ( password[0] == 0 ) {
              DebugEvent("Password is the empty string");
              code = GT_PW_NULL;
              reason = "zero length password is illegal";
              code=0;
!         }       
  
          /* Get cell name if doing integrated logon.  
!            We might overwrite this if we are logging into an AD realm and we find out that
!            the user's home dir is in some other cell. */
          DebugEvent("About to call cm_GetRootCellName(%s)",cell);
!         code = cm_GetRootCellName(cell);
!         if (code < 0) { 
              DebugEvent("Unable to obtain Root Cell");
!             code = KTC_NOCELL;
!             reason = "unknown cell";
!             code=0;
!         } else {
              DebugEvent("Cell is %s",cell);
!         }       
  
!         /* We get the user's home directory path, if applicable, though we can't lookup the
!            cell right away because the client service may not have started yet. This call
!            also sets the AD_REALM flag in opt.flags if applicable. */
!         if(ISREMOTE(opt.flags)) {
              DebugEvent("Is Remote");
!             GetAdHomePath(homePath,MAX_PATH,lpLogonId,&opt);
!         }       
      }
  
      /* loop until AFS is started. */
***************
*** 665,694 ****
                      opt.LogonOption,afsWillAutoStart);
  
          if(ISADREALM(opt.flags)) {
! 			code = GetFileCellName(homePath,cell,256);
! 			if(!code) {
! 				DebugEvent("profile path [%s] is in cell [%s]",homePath,cell);
! 			}
! 			/* Don't bail out if GetFileCellName failed.
! 			 * The home dir may not be in AFS after all. 
! 			 */
! 		} else
! 	        code=0;
  		
          /* if Integrated Logon  */
          if (ISLOGONINTEGRATED(opt.LogonOption))
! 		{			
! 			if ( KFW_is_available() ) {
                  code = KFW_AFS_get_cred(uname, cell, password, 0, opt.smbName, &reason);
! 				DebugEvent("KFW_AFS_get_cred  uname=[%s] smbname=[%s] cell=[%s] code=[%d]",uname,opt.smbName,cell,code);
! 			}
! 			else {
                  code = ka_UserAuthenticateGeneral2(KA_USERAUTH_VERSION+KA_USERAUTH_AUTHENT_LOGON,
!                                                 uname, "", cell, password, opt.smbName, 0, &pw_exp, 0,
!                                                 &reason);
! 				DebugEvent("AFS AfsLogon - (INTEGRATED only)ka_UserAuthenticateGeneral2","Code[%x]",
! 							code);
! 			}
              if ( code && code != KTC_NOCM && code != KTC_NOCMRPC && uppercased_name ) {
                  for ( ctemp = uname; *ctemp ; ctemp++) {
                      *ctemp = tolower(*ctemp);
--- 702,731 ----
                      opt.LogonOption,afsWillAutoStart);
  
          if(ISADREALM(opt.flags)) {
!             code = GetFileCellName(homePath,cell,256);
!             if(!code) {
!                 DebugEvent("profile path [%s] is in cell [%s]",homePath,cell);
!             }
!             /* Don't bail out if GetFileCellName failed.
!              * The home dir may not be in AFS after all. 
!              */
!         } else
!             code=0;
  		
          /* if Integrated Logon  */
          if (ISLOGONINTEGRATED(opt.LogonOption))
!         {			
!             if ( KFW_is_available() ) {
                  code = KFW_AFS_get_cred(uname, cell, password, 0, opt.smbName, &reason);
!                 DebugEvent("KFW_AFS_get_cred  uname=[%s] smbname=[%s] cell=[%s] code=[%d]",uname,opt.smbName,cell,code);
!             }
!             else {
                  code = ka_UserAuthenticateGeneral2(KA_USERAUTH_VERSION+KA_USERAUTH_AUTHENT_LOGON,
!                                                     uname, "", cell, password, opt.smbName, 0, &pw_exp, 0,
!                                                     &reason);
!                 DebugEvent("AFS AfsLogon - (INTEGRATED only)ka_UserAuthenticateGeneral2","Code[%x]",
!                             code);
!             }       
              if ( code && code != KTC_NOCM && code != KTC_NOCMRPC && uppercased_name ) {
                  for ( ctemp = uname; *ctemp ; ctemp++) {
                      *ctemp = tolower(*ctemp);
***************
*** 696,722 ****
                  uppercased_name = FALSE;
                  continue;
              }
! 		}
! 		else {  
              /*JUST check to see if its running*/
! 		    if (IsServiceRunning())
                  break;
! 		    code = KTC_NOCM;
! 		    if (!afsWillAutoStart)
                  break;
! 		}
  
! 		/* is service started yet?*/
          DebugEvent("AFS AfsLogon - ka_UserAuthenticateGeneral2","Code[%x] uname[%s] Cell[%s]",
!                    code,uname,cell);
  
! 		/* If we've failed because the client isn't running yet and the
           * client is set to autostart (and therefore it makes sense for
           * us to wait for it to start) then sleep a while and try again. 
           * If the error was something else, then give up. */
! 		if (code != KTC_NOCM && code != KTC_NOCMRPC || !afsWillAutoStart)
! 			break;
! 		
          /* If the retry interval has expired and we still aren't
           * logged in, then just give up if we are not in interactive
           * mode or the failSilently flag is set, otherwise let the
--- 733,759 ----
                  uppercased_name = FALSE;
                  continue;
              }
!         }
!         else {  
              /*JUST check to see if its running*/
!             if (IsServiceRunning())
                  break;
!             code = KTC_NOCM;
!             if (!afsWillAutoStart)
                  break;
!         }
  
!         /* is service started yet?*/
          DebugEvent("AFS AfsLogon - ka_UserAuthenticateGeneral2","Code[%x] uname[%s] Cell[%s]",
!                     code,uname,cell);
  
!         /* If we've failed because the client isn't running yet and the
           * client is set to autostart (and therefore it makes sense for
           * us to wait for it to start) then sleep a while and try again. 
           * If the error was something else, then give up. */
!         if (code != KTC_NOCM && code != KTC_NOCMRPC || !afsWillAutoStart)
!             break;
! 
          /* If the retry interval has expired and we still aren't
           * logged in, then just give up if we are not in interactive
           * mode or the failSilently flag is set, otherwise let the
***************
*** 725,735 ****
              reason = "AFS not running";
              if (!interactive || opt.failSilently)
                  break;
! 			flag = MessageBox(hwndOwner,
                                 "AFS is still starting.  Retry?",
                                 "AFS Logon",
                                 MB_ICONQUESTION | MB_RETRYCANCEL);
! 			if (flag == IDCANCEL)
                  break;
  
              /* Wait just a little while and try again */
--- 762,772 ----
              reason = "AFS not running";
              if (!interactive || opt.failSilently)
                  break;
!             flag = MessageBox(hwndOwner,
                                 "AFS is still starting.  Retry?",
                                 "AFS Logon",
                                 MB_ICONQUESTION | MB_RETRYCANCEL);
!             if (flag == IDCANCEL)
                  break;
  
              /* Wait just a little while and try again */
***************
*** 737,745 ****
          }
  
          if (retryInterval < sleepInterval)
! 			sleepInterval = retryInterval;
  
! 		Sleep(sleepInterval * 1000);
  
          retryInterval -= sleepInterval;
      }
--- 774,782 ----
          }
  
          if (retryInterval < sleepInterval)
!             sleepInterval = retryInterval;
  
!         Sleep(sleepInterval * 1000);
  
          retryInterval -= sleepInterval;
      }
***************
*** 749,763 ****
      if ( KFW_is_available() )
          KFW_AFS_destroy_tickets_for_cell(cell);
  
! 	if (code) {
          char msg[128];
          HANDLE h;
          char *ptbuf[1];
  
! 		StringCbPrintf(msg, sizeof(msg), "Integrated login failed: %s", reason);
  
! 		if (ISLOGONINTEGRATED(opt.LogonOption) && interactive && !opt.failSilently)
! 			MessageBox(hwndOwner, msg, "AFS Logon", MB_OK);
  
          h = RegisterEventSource(NULL, AFS_LOGON_EVENT_NAME);
          ptbuf[0] = msg;
--- 786,800 ----
      if ( KFW_is_available() )
          KFW_AFS_destroy_tickets_for_cell(cell);
  
!     if (code) {
          char msg[128];
          HANDLE h;
          char *ptbuf[1];
  
!         StringCbPrintf(msg, sizeof(msg), "Integrated login failed: %s", reason);
  
!         if (ISLOGONINTEGRATED(opt.LogonOption) && interactive && !opt.failSilently)
!             MessageBox(hwndOwner, msg, "AFS Logon", MB_OK);
  
          h = RegisterEventSource(NULL, AFS_LOGON_EVENT_NAME);
          ptbuf[0] = msg;
***************
*** 766,789 ****
          DeregisterEventSource(h);
  	    
          code = MapAuthError(code);
! 		SetLastError(code);
  
! 		if (ISLOGONINTEGRATED(opt.LogonOption) && (code!=0))
! 		{
! 			if (*lpLogonScript)
! 				LocalFree(*lpLogonScript);
! 			*lpLogonScript = NULL;
! 			if (!afsWillAutoStart)	// its not running, so if not autostart or integrated logon then just skip
! 				code = 0;
  
! 		}
! 	}
  
! 	if(opt.smbName) free(opt.smbName);
  
! 	DebugEvent("AFS AfsLogon - Exit","Return Code[%x]",code);
! 	return code;
! }
  
  DWORD APIENTRY NPPasswordChangeNotify(
  	LPCWSTR lpAuthentInfoType,
--- 803,826 ----
          DeregisterEventSource(h);
  	    
          code = MapAuthError(code);
!         SetLastError(code);
  
!         if (ISLOGONINTEGRATED(opt.LogonOption) && (code!=0))
!         {
!             if (*lpLogonScript)
!                 LocalFree(*lpLogonScript);
!             *lpLogonScript = NULL;
!             if (!afsWillAutoStart)	// its not running, so if not autostart or integrated logon then just skip
!                 code = 0;
  
!         }
!     }
  
!     if(opt.smbName) free(opt.smbName);
  
!     DebugEvent("AFS AfsLogon - Exit","Return Code[%x]",code);
!     return code;
! }       
  
  DWORD APIENTRY NPPasswordChangeNotify(
  	LPCWSTR lpAuthentInfoType,
***************
*** 797,804 ****
      /* Make sure the AFS Libraries are initialized */
      AfsLogonInit();
  
! 	DebugEvent0("AFS AfsLogon - NPPasswordChangeNotify");
! 	return 0;
  }
  
  #include <userenv.h>
--- 834,841 ----
      /* Make sure the AFS Libraries are initialized */
      AfsLogonInit();
  
!     DebugEvent0("AFS AfsLogon - NPPasswordChangeNotify");
!     return 0;
  }
  
  #include <userenv.h>
***************
*** 837,863 ****
  
  VOID AFS_Startup_Event( PWLX_NOTIFICATION_INFO pInfo )
  {
! 	DWORD LSPtype, LSPsize;
! 	HKEY NPKey;
  
      /* Make sure the AFS Libraries are initialized */
      AfsLogonInit();
  
      (void) RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_CLIENT_PARMS_KEY,
                          0, KEY_QUERY_VALUE, &NPKey);
! 	LSPsize=sizeof(TraceOption);
! 	RegQueryValueEx(NPKey, REG_CLIENT_TRACE_OPTION_PARM, NULL,
                       &LSPtype, (LPBYTE)&TraceOption, &LSPsize);
  
! 	RegCloseKey (NPKey);
      DebugEvent0("AFS_Startup_Event");
  }
  
  VOID AFS_Logoff_Event( PWLX_NOTIFICATION_INFO pInfo )
  {
      DWORD code;
!     TCHAR profileDir[256] = TEXT("");
!     DWORD  len = 256;
      PTOKEN_USER  tokenUser = NULL;
      DWORD  retLen;
      HANDLE hToken;
--- 874,900 ----
  
  VOID AFS_Startup_Event( PWLX_NOTIFICATION_INFO pInfo )
  {
!     DWORD LSPtype, LSPsize;
!     HKEY NPKey;
  
      /* Make sure the AFS Libraries are initialized */
      AfsLogonInit();
  
      (void) RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_CLIENT_PARMS_KEY,
                          0, KEY_QUERY_VALUE, &NPKey);
!     LSPsize=sizeof(TraceOption);
!     RegQueryValueEx(NPKey, REG_CLIENT_TRACE_OPTION_PARM, NULL,
                       &LSPtype, (LPBYTE)&TraceOption, &LSPsize);
  
!     RegCloseKey (NPKey);
      DebugEvent0("AFS_Startup_Event");
  }
  
  VOID AFS_Logoff_Event( PWLX_NOTIFICATION_INFO pInfo )
  {
      DWORD code;
!     TCHAR profileDir[1024] = TEXT("");
!     DWORD  len = 1024;
      PTOKEN_USER  tokenUser = NULL;
      DWORD  retLen;
      HANDLE hToken;
***************
*** 885,892 ****
      if (QueryAdHomePathFromSid( profileDir, sizeof(profileDir), tokenUser->User.Sid, pInfo->Domain)) {
          WCHAR Domain[64]=L"";
          GetLocalShortDomain(Domain, sizeof(Domain));
!         if (QueryAdHomePathFromSid( profileDir, sizeof(profileDir), tokenUser->User.Sid, Domain))
!             GetUserProfileDirectory(pInfo->hToken, profileDir, &len);
      }
      
      if (strlen(profileDir)) {
--- 922,931 ----
      if (QueryAdHomePathFromSid( profileDir, sizeof(profileDir), tokenUser->User.Sid, pInfo->Domain)) {
          WCHAR Domain[64]=L"";
          GetLocalShortDomain(Domain, sizeof(Domain));
!         if (QueryAdHomePathFromSid( profileDir, sizeof(profileDir), tokenUser->User.Sid, Domain)) {
!             if (NetUserGetProfilePath(pInfo->Domain, pInfo->UserName, profileDir, len))
!                 GetUserProfileDirectory(pInfo->hToken, profileDir, &len);
!         }
      }
      
      if (strlen(profileDir)) {
Index: openafs/src/WINNT/afsd/cm_access.c
diff -c openafs/src/WINNT/afsd/cm_access.c:1.4 openafs/src/WINNT/afsd/cm_access.c:1.4.2.1
*** openafs/src/WINNT/afsd/cm_access.c:1.4	Sun May  9 00:04:52 2004
--- openafs/src/WINNT/afsd/cm_access.c	Tue Aug 17 00:28:38 2004
***************
*** 101,107 ****
          /* fall through */
          
  done:
! 	if (didLock) lock_ReleaseMutex(&aclScp->mx);
          cm_ReleaseSCache(aclScp);
          return code;
  }
--- 101,108 ----
          /* fall through */
          
  done:
!     if (didLock) 
!         lock_ReleaseMutex(&aclScp->mx);
          cm_ReleaseSCache(aclScp);
          return code;
  }
Index: openafs/src/WINNT/afsd/cm_buf.c
diff -c openafs/src/WINNT/afsd/cm_buf.c:1.13 openafs/src/WINNT/afsd/cm_buf.c:1.13.2.1
*** openafs/src/WINNT/afsd/cm_buf.c:1.13	Thu Jul 29 10:34:21 2004
--- openafs/src/WINNT/afsd/cm_buf.c	Tue Aug 17 00:28:38 2004
***************
*** 491,501 ****
   */
  long buf_SetNBuffers(long nbuffers)
  {
! 	if (nbuffers < 10) return CM_ERROR_INVAL;
!         if (nbuffers == buf_nbuffers) return 0;
          else if (nbuffers > buf_nbuffers)
  		return buf_AddBuffers(nbuffers - buf_nbuffers);
!         else return CM_ERROR_INVAL;
  }
  
  /* release a buffer.  Buffer must be referenced, but unlocked. */
--- 491,504 ----
   */
  long buf_SetNBuffers(long nbuffers)
  {
!     if (nbuffers < 10) 
!         return CM_ERROR_INVAL;
!     if (nbuffers == buf_nbuffers) 
!         return 0;
          else if (nbuffers > buf_nbuffers)
  		return buf_AddBuffers(nbuffers - buf_nbuffers);
!     else 
!         return CM_ERROR_INVAL;
  }
  
  /* release a buffer.  Buffer must be referenced, but unlocked. */
***************
*** 652,659 ****
  	 * have any lock conflicts, so we can grab the buffer lock out of
  	 * order in the locking hierarchy.
  	 */
! 	osi_Log2(buf_logp,
! 		"buf_Recycle recycles 0x%x, off 0x%x",
  		bp, bp->offset.LowPart);
  
  	osi_assert(bp->refCount == 0);
--- 655,661 ----
  	 * have any lock conflicts, so we can grab the buffer lock out of
  	 * order in the locking hierarchy.
  	 */
!     osi_Log2( buf_logp, "buf_Recycle recycles 0x%x, off 0x%x",
  		bp, bp->offset.LowPart);
  
  	osi_assert(bp->refCount == 0);
***************
*** 1296,1302 ****
  			}
  
                          lock_ReleaseWrite(&buf_globalLock);
- 
                  }
  		
                  lock_ReleaseMutex(&scp->mx);
--- 1298,1303 ----
Index: openafs/src/WINNT/afsd/cm_buf.h
diff -c openafs/src/WINNT/afsd/cm_buf.h:1.4 openafs/src/WINNT/afsd/cm_buf.h:1.4.2.1
*** openafs/src/WINNT/afsd/cm_buf.h:1.4	Thu Jul 29 10:34:21 2004
--- openafs/src/WINNT/afsd/cm_buf.h	Tue Aug 17 00:28:38 2004
***************
*** 72,78 ****
  				 */
          struct cm_buf *allp;	/* next in all list */
  	osi_mutex_t mx;		/* mutex protecting structure except refcount */
!         int refCount;		/* reference count */
          long idCounter;		/* counter for softrefs; bumped at each recycle */
          long dirtyCounter;	/* bumped at each dirty->clean transition */
  #ifdef notdef
--- 72,78 ----
  				 */
          struct cm_buf *allp;	/* next in all list */
  	osi_mutex_t mx;		/* mutex protecting structure except refcount */
!     int refCount;		/* reference count (buf_globalLock) */
          long idCounter;		/* counter for softrefs; bumped at each recycle */
          long dirtyCounter;	/* bumped at each dirty->clean transition */
  #ifdef notdef
Index: openafs/src/WINNT/afsd/cm_callback.c
diff -c openafs/src/WINNT/afsd/cm_callback.c:1.20 openafs/src/WINNT/afsd/cm_callback.c:1.20.2.3
*** openafs/src/WINNT/afsd/cm_callback.c:1.20	Tue Aug  3 16:10:36 2004
--- openafs/src/WINNT/afsd/cm_callback.c	Thu Aug 19 15:51:23 2004
***************
*** 90,122 ****
  
  /*
   * When we lose a callback, may have to send change notification replies.
   */
  void cm_CallbackNotifyChange(cm_scache_t *scp)
  {
      osi_Log2(afsd_logp, "CallbackNotifyChange FileType %d Flags %lX",
                scp->fileType, scp->flags);
  
! 	if (scp->fileType == CM_SCACHETYPE_DIRECTORY) {
! 		if (scp->flags & CM_SCACHEFLAG_ANYWATCH)
! 			smb_NotifyChange(0,
! 			 FILE_NOTIFY_GENERIC_DIRECTORY_FILTER,
! 			 scp, NULL, NULL, TRUE);
! 	} else {
! 		cm_fid_t tfid;
! 		cm_scache_t *dscp;
! 
! 		tfid.cell = scp->fid.cell;
! 		tfid.volume = scp->fid.volume;
! 		tfid.vnode = scp->parentVnode;
! 		tfid.unique = scp->parentUnique;
! 		dscp = cm_FindSCache(&tfid);
! 		if (dscp &&
! 			dscp->flags & CM_SCACHEFLAG_ANYWATCH)
! 			smb_NotifyChange(0,
! 			 FILE_NOTIFY_GENERIC_FILE_FILTER,
! 			 dscp, NULL, NULL, TRUE);
! 		if (dscp) cm_ReleaseSCache(dscp);
! 	}
  }
  
  /* called with no locks held for every file ID that is revoked directly by
--- 90,123 ----
  
  /*
   * When we lose a callback, may have to send change notification replies.
+  * Do not call with a lock on the scp.
   */
  void cm_CallbackNotifyChange(cm_scache_t *scp)
  {
      osi_Log2(afsd_logp, "CallbackNotifyChange FileType %d Flags %lX",
                scp->fileType, scp->flags);
  
!     if (scp->fileType == CM_SCACHETYPE_DIRECTORY) {
!         if (scp->flags & CM_SCACHEFLAG_ANYWATCH)
!             smb_NotifyChange(0,
!                              FILE_NOTIFY_GENERIC_DIRECTORY_FILTER,
!                              scp, NULL, NULL, TRUE);
!     } else {
!         cm_fid_t tfid;
!         cm_scache_t *dscp;
! 
!         tfid.cell = scp->fid.cell;
!         tfid.volume = scp->fid.volume;
!         tfid.vnode = scp->parentVnode;
!         tfid.unique = scp->parentUnique;
!         dscp = cm_FindSCache(&tfid);
!         if (dscp &&
!              dscp->flags & CM_SCACHEFLAG_ANYWATCH)
!             smb_NotifyChange( 0,
!                               FILE_NOTIFY_GENERIC_FILE_FILTER,
!                               dscp,   NULL, NULL, TRUE);
!         if (dscp) cm_ReleaseSCache(dscp);
!     }
  }
  
  /* called with no locks held for every file ID that is revoked directly by
***************
*** 635,645 ****
    int fdc, fgc;
  
      if (cm_freelanceEnabled && 
!         scp->fid.cell==AFS_FAKE_ROOT_CELL_ID &&
!         scp->fid.volume==AFS_FAKE_ROOT_VOL_ID) {	// if it's something on /afs
! 	if (!(scp->fid.vnode==0x1 && scp->fid.unique==0x1))  	// if it's not root.afs
  	    return 1;
! 	else {
  	    lock_ObtainMutex(&cm_Freelance_Lock);
  	    fdc = cm_fakeDirCallback;
  	    fgc = cm_fakeGettingCallback;
--- 636,648 ----
    int fdc, fgc;
  
      if (cm_freelanceEnabled && 
!          scp->fid.cell==AFS_FAKE_ROOT_CELL_ID && scp->fid.volume==AFS_FAKE_ROOT_VOL_ID) {
!         /* if it's something on /afs */
!         if (!(scp->fid.vnode==0x1 && scp->fid.unique==0x1)) {
!             /* if it's not root.afs */
  	    return 1;
!         }
! 
  	    lock_ObtainMutex(&cm_Freelance_Lock);
  	    fdc = cm_fakeDirCallback;
  	    fgc = cm_fakeGettingCallback;
***************
*** 659,670 ****
  	    }
  	    return 0;
  	}
-     }
  #endif
  
      if (scp->cbServerp != NULL)
  	return 1;
!     else return 0;
  }
  
  /* need to detect a broken callback that races with our obtaining a callback.
--- 662,673 ----
  	    }
  	    return 0;
  	}
  #endif
  
      if (scp->cbServerp != NULL)
  	return 1;
!     else 
!         return 0;
  }
  
  /* need to detect a broken callback that races with our obtaining a callback.
***************
*** 708,713 ****
--- 711,717 ----
  	cm_racingRevokes_t *revp;		/* where we are */
  	cm_racingRevokes_t *nrevp;		/* where we'll be next */
          int freeFlag;
+     cm_server_t * serverp = 0;
  
  	lock_ObtainWrite(&cm_callbackLock);
  	if (flags & CM_CALLBACK_MAINTAINCOUNT) {
***************
*** 716,728 ****
  	else {
  		osi_assert(cm_activeCallbackGrantingCalls-- > 0);
  	}
!         if (cm_activeCallbackGrantingCalls == 0) freeFlag = 1;
!         else freeFlag = 0;
  
  	/* record the callback; we'll clear it below if we really lose it */
  	if (scp) {
  	        scp->cbServerp = cbrp->serverp;
  	        scp->cbExpires = cbrp->startTime + cbp->ExpirationTime;
  	}
  
  	/* a callback was actually revoked during our granting call, so
--- 720,742 ----
  	else {
  		osi_assert(cm_activeCallbackGrantingCalls-- > 0);
  	}
!     if (cm_activeCallbackGrantingCalls == 0) 
!         freeFlag = 1;
!     else 
!         freeFlag = 0;
  
  	/* record the callback; we'll clear it below if we really lose it */
+     if (cbrp) {
  	if (scp) {
+             if (scp->cbServerp != cbrp->serverp) {
+                 serverp = scp->cbServerp;
+             }
  	        scp->cbServerp = cbrp->serverp;
  	        scp->cbExpires = cbrp->startTime + cbp->ExpirationTime;
+         } else {
+             serverp = cbrp->serverp;
+         }
+         cbrp->serverp = NULL;
  	}
  
  	/* a callback was actually revoked during our granting call, so
***************
*** 737,743 ****
                   * callback-granting call, and if this fid is the right fid,
                   * then clear the callback.
                   */
!                 if (scp && cbrp->callbackCount != cm_callbackCount
                         	&& revp->callbackCount > cbrp->callbackCount
               && (( scp->fid.volume == revp->fid.volume &&
                                   scp->fid.vnode == revp->fid.vnode &&
--- 751,757 ----
                   * callback-granting call, and if this fid is the right fid,
                   * then clear the callback.
                   */
!         if (scp && cbrp && cbrp->callbackCount != cm_callbackCount
                         	&& revp->callbackCount > cbrp->callbackCount
               && (( scp->fid.volume == revp->fid.volume &&
                                   scp->fid.vnode == revp->fid.vnode &&
***************
*** 769,774 ****
--- 783,794 ----
  	if (freeFlag) cm_racingRevokesp = NULL;
  
  	lock_ReleaseWrite(&cm_callbackLock);
+ 
+     if ( serverp ) {
+         lock_ObtainWrite(&cm_serverLock);
+         cm_FreeServer(serverp);
+         lock_ReleaseWrite(&cm_serverLock);
+     }
  }
  
  /* if flags is 1, we want to force the code to make one call, anyway.
***************
*** 799,808 ****
               scp->fid.volume==AFS_FAKE_ROOT_VOL_ID &&
               scp->fid.unique==0x1 &&
               scp->fid.vnode==0x1) {
              // Start by indicating that we're in the process
              // of fetching the callback
- 
              lock_ObtainMutex(&cm_Freelance_Lock);
              cm_fakeGettingCallback = 1;
              lock_ReleaseMutex(&cm_Freelance_Lock);
  
--- 819,829 ----
               scp->fid.volume==AFS_FAKE_ROOT_VOL_ID &&
               scp->fid.unique==0x1 &&
               scp->fid.vnode==0x1) {
+             
              // Start by indicating that we're in the process
              // of fetching the callback
              lock_ObtainMutex(&cm_Freelance_Lock);
+             osi_Log0(afsd_logp,"cm_getGetCallback fakeGettingCallback=1");
              cm_fakeGettingCallback = 1;
              lock_ReleaseMutex(&cm_Freelance_Lock);
  
***************
*** 811,818 ****
--- 832,842 ----
  
              // Indicate that the callback is not done
              lock_ObtainMutex(&cm_Freelance_Lock);
+             osi_Log0(afsd_logp,"cm_getGetCallback fakeDirCallback=2");
              cm_fakeDirCallback = 2;
+ 
              // Indicate that we're no longer fetching the callback
+             osi_Log0(afsd_logp,"cm_getGetCallback fakeGettingCallback=0");
              cm_fakeGettingCallback = 0;
              lock_ReleaseMutex(&cm_Freelance_Lock);
  
***************
*** 861,867 ****
              cm_MergeStatus(scp, &afsStatus, &volSync, userp, 0);
  		}   
          else
!             cm_EndCallbackGrantingCall(NULL, NULL, NULL, 0);
  
          /* now check to see if we got an error */
          if (code) return code;
--- 885,891 ----
              cm_MergeStatus(scp, &afsStatus, &volSync, userp, 0);
  		}   
          else
!             cm_EndCallbackGrantingCall(NULL, &cbr, NULL, 0);
  
          /* now check to see if we got an error */
          if (code) return code;
***************
*** 871,899 ****
  /* called periodically by cm_daemon to shut down use of expired callbacks */
  void cm_CheckCBExpiration(void)
  {
! 	int i;
!         cm_scache_t *scp;
!         long now;
          
      osi_Log0(afsd_logp, "CheckCBExpiration");
  
! 	now = osi_Time();
! 	lock_ObtainWrite(&cm_scacheLock);
!         for(i=0; i<cm_hashTableSize; i++) {
! 		for(scp = cm_hashTablep[i]; scp; scp=scp->nextp) {
! 			scp->refCount++;
! 			lock_ReleaseWrite(&cm_scacheLock);
! 			lock_ObtainMutex(&scp->mx);
! 			if (scp->cbServerp && now > scp->cbExpires) {
!                 osi_Log1(afsd_logp, "Discarding SCache scp %x", scp);
! 				cm_DiscardSCache(scp);
!                         }
! 			lock_ReleaseMutex(&scp->mx);
! 			lock_ObtainWrite(&cm_scacheLock);
!                         osi_assert(scp->refCount-- > 0);
!                 }
          }
!         lock_ReleaseWrite(&cm_scacheLock);
  }
  
  /* debug interface: not implemented */
--- 895,924 ----
  /* called periodically by cm_daemon to shut down use of expired callbacks */
  void cm_CheckCBExpiration(void)
  {
!     int i;
!     cm_scache_t *scp;
!     long now;
          
      osi_Log0(afsd_logp, "CheckCBExpiration");
  
!     now = osi_Time();
!     lock_ObtainWrite(&cm_scacheLock);
!     for(i=0; i<cm_hashTableSize; i++) {
!         for(scp = cm_hashTablep[i]; scp; scp=scp->nextp) {
!             scp->refCount++;
!             lock_ReleaseWrite(&cm_scacheLock);
!             if (scp->cbExpires > 0 && (scp->cbServerp == NULL || now > scp->cbExpires)) {
!                 osi_Log1(afsd_logp, "Callback Expiration Discarding SCache scp %x", scp);
!                 cm_CallbackNotifyChange(scp);
!                 lock_ObtainMutex(&scp->mx);
!                 cm_DiscardSCache(scp);
!                 lock_ReleaseMutex(&scp->mx);
!             }
!             lock_ObtainWrite(&cm_scacheLock);
!             osi_assert(scp->refCount-- > 0);
          }
!     }
!     lock_ReleaseWrite(&cm_scacheLock);
  }
  
  /* debug interface: not implemented */
Index: openafs/src/WINNT/afsd/cm_callback.h
diff -c openafs/src/WINNT/afsd/cm_callback.h:1.3 openafs/src/WINNT/afsd/cm_callback.h:1.3.16.1
*** openafs/src/WINNT/afsd/cm_callback.h:1.3	Mon Apr 30 02:48:03 2001
--- openafs/src/WINNT/afsd/cm_callback.h	Tue Aug 17 00:28:38 2004
***************
*** 64,67 ****
--- 64,69 ----
  
  extern void cm_CheckCBExpiration(void);
  
+ extern osi_rwlock_t cm_callbackLock;
+ 
  #endif /*  _CM_CALLBACK_H_ENV__ */
Index: openafs/src/WINNT/afsd/cm_cell.c
diff -c openafs/src/WINNT/afsd/cm_cell.c:1.14 openafs/src/WINNT/afsd/cm_cell.c:1.14.2.1
*** openafs/src/WINNT/afsd/cm_cell.c:1.14	Wed Aug  4 11:52:56 2004
--- openafs/src/WINNT/afsd/cm_cell.c	Tue Aug 17 13:16:02 2004
***************
*** 105,118 ****
  
          code = cm_SearchCellFile(namep, fullname, cm_AddCellProc, cp);
  		if (code) {
!             afsi_log("in cm_GetCell_gen cm_SearchCellFile(%s) returns code= %d fullname= %s", 
                        namep, code, fullname);
  
  #ifdef AFS_AFSDB_ENV
              if (cm_dnsEnabled /*&& cm_DomainValid(namep)*/) {
                  code = cm_SearchCellByDNS(namep, fullname, &ttl, cm_AddCellProc, cp);
                  if ( code ) {
!                     afsi_log("in cm_GetCell_gen cm_SearchCellByDNS(%s) returns code= %d fullname= %s", 
                               namep, code, fullname);
                      if (dns_expired) {
                          cp->flags |= CM_CELLFLAG_VLSERVER_INVALID;
--- 105,118 ----
  
          code = cm_SearchCellFile(namep, fullname, cm_AddCellProc, cp);
  		if (code) {
!             osi_Log3(afsd_logp,"in cm_GetCell_gen cm_SearchCellFile(%s) returns code= %d fullname= %s", 
                        namep, code, fullname);
  
  #ifdef AFS_AFSDB_ENV
              if (cm_dnsEnabled /*&& cm_DomainValid(namep)*/) {
                  code = cm_SearchCellByDNS(namep, fullname, &ttl, cm_AddCellProc, cp);
                  if ( code ) {
!                     osi_Log3(afsd_logp,"in cm_GetCell_gen cm_SearchCellByDNS(%s) returns code= %d fullname= %s", 
                               namep, code, fullname);
                      if (dns_expired) {
                          cp->flags |= CM_CELLFLAG_VLSERVER_INVALID;
Index: openafs/src/WINNT/afsd/cm_conn.c
diff -c openafs/src/WINNT/afsd/cm_conn.c:1.25 openafs/src/WINNT/afsd/cm_conn.c:1.25.2.1
*** openafs/src/WINNT/afsd/cm_conn.c:1.25	Wed Aug  4 11:52:56 2004
--- openafs/src/WINNT/afsd/cm_conn.c	Tue Aug 17 00:28:38 2004
***************
*** 94,100 ****
  #else
          gettimeofday(&reqp->startTime, NULL);
  #endif
-  
  }
  
  static long cm_GetServerList(struct cm_fid *fidp, struct cm_user *userp,
--- 94,99 ----
***************
*** 144,150 ****
  	cm_serverRef_t * serversp,
  	cm_callbackRequest_t *cbrp, long errorCode)
  {
! 	cm_server_t *serverp;
      cm_serverRef_t **serverspp = 0;
  	cm_serverRef_t *tsrp;
  	cm_ucell_t *ucellp;
--- 143,149 ----
  	cm_serverRef_t * serversp,
  	cm_callbackRequest_t *cbrp, long errorCode)
  {
!     cm_server_t *serverp = 0;
      cm_serverRef_t **serverspp = 0;
  	cm_serverRef_t *tsrp;
  	cm_ucell_t *ucellp;
***************
*** 163,170 ****
  		serverp = connp->serverp;
  
  	/* Update callback pointer */
!     if (cbrp && errorCode == 0) 
!         cbrp->serverp = connp->serverp;
  
  	/* If not allowed to retry, don't */
  	if (reqp->flags & CM_REQ_NORETRY)
--- 162,182 ----
  		serverp = connp->serverp;
  
  	/* Update callback pointer */
!     if (cbrp && serverp && errorCode == 0) {
!         if (cbrp->serverp) {
!             if ( cbrp->serverp != serverp ) {
!                 lock_ObtainWrite(&cm_serverLock);
!                 cm_PutServerNoLock(cbrp->serverp);
!                 cm_GetServerNoLock(serverp);
!                 lock_ReleaseWrite(&cm_serverLock);
!             }
!         } else {
!             cm_GetServer(serverp);
!         }
!         lock_ObtainWrite(&cm_callbackLock);
!         cbrp->serverp = serverp;
!         lock_ReleaseWrite(&cm_callbackLock);
!     }
  
  	/* If not allowed to retry, don't */
  	if (reqp->flags & CM_REQ_NORETRY)
***************
*** 398,404 ****
  	lock_ObtainWrite(&cm_serverLock);
      for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
          tsp = tsrp->server;
!         tsp->refCount++;
          lock_ReleaseWrite(&cm_serverLock);
          if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
              allDown = 0;
--- 410,416 ----
  	lock_ObtainWrite(&cm_serverLock);
      for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
          tsp = tsrp->server;
!         cm_GetServerNoLock(tsp);
          lock_ReleaseWrite(&cm_serverLock);
          if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
              allDown = 0;
***************
*** 422,428 ****
                      rx_SetConnDeadTime((*connpp)->callp, timeLeft);
                      rx_SetConnHardDeadTime((*connpp)->callp, (u_short) hardTimeLeft);
                      lock_ReleaseMutex(&(*connpp)->mx);
- 
                      return 0;
                  }
                  if (firstError == 0) 
--- 434,439 ----
***************
*** 430,436 ****
              }
  		} 
          lock_ObtainWrite(&cm_serverLock);
!         osi_assert(tsp->refCount-- > 0);
      }   
  
  	lock_ReleaseWrite(&cm_serverLock);
--- 441,447 ----
              }
  		} 
          lock_ObtainWrite(&cm_serverLock);
!         cm_PutServerNoLock(tsp);
      }   
  
  	lock_ReleaseWrite(&cm_serverLock);
***************
*** 462,467 ****
--- 473,479 ----
  		userp = tcp->userp;
  		if (userp && tcp->refCount == 0 && (userp->vcRefs == 0)) {
  			/* do the deletion of this guy */
+             cm_PutServer(tcp->serverp);
              cm_ReleaseUser(userp);
              *lcpp = tcp->nextp;
  			rx_DestroyConnection(tcp->callp);
***************
*** 532,542 ****
  	lock_ObtainMutex(&userp->mx);
  	lock_ObtainWrite(&cm_connLock);
  	for(tcp = serverp->connsp; tcp; tcp=tcp->nextp) {
! 		if (tcp->userp == userp) break;
      }
  	/* find ucell structure */
      ucellp = cm_GetUCell(userp, serverp->cellp);
  	if (!tcp) {
  		tcp = malloc(sizeof(*tcp));
          memset(tcp, 0, sizeof(*tcp));
          tcp->nextp = serverp->connsp;
--- 544,557 ----
  	lock_ObtainMutex(&userp->mx);
  	lock_ObtainWrite(&cm_connLock);
  	for(tcp = serverp->connsp; tcp; tcp=tcp->nextp) {
!         if (tcp->userp == userp) 
!             break;
      }
+     
  	/* find ucell structure */
      ucellp = cm_GetUCell(userp, serverp->cellp);
  	if (!tcp) {
+         cm_GetServer(serverp);
  		tcp = malloc(sizeof(*tcp));
          memset(tcp, 0, sizeof(*tcp));
          tcp->nextp = serverp->connsp;
Index: openafs/src/WINNT/afsd/cm_daemon.c
diff -c openafs/src/WINNT/afsd/cm_daemon.c:1.4 openafs/src/WINNT/afsd/cm_daemon.c:1.4.2.1
*** openafs/src/WINNT/afsd/cm_daemon.c:1.4	Sun Apr  4 22:16:11 2004
--- openafs/src/WINNT/afsd/cm_daemon.c	Tue Aug 17 00:28:39 2004
***************
*** 95,109 ****
  /* periodic check daemon */
  void cm_Daemon(long parm)
  {
!     long now;
! 	long lastLockCheck;
!     long lastVolCheck;
!     long lastCBExpirationCheck;
! 	long lastDownServerCheck;
! 	long lastUpServerCheck;
! 	long lastTokenCacheCheck;
  	char thostName[200];
! 	long code;
  	struct hostent *thp;
  
  	/* ping all file servers, up or down, with unauthenticated connection,
--- 95,109 ----
  /* periodic check daemon */
  void cm_Daemon(long parm)
  {
!     unsigned long now;
! 	unsigned long lastLockCheck;
!     unsigned long lastVolCheck;
!     unsigned long lastCBExpirationCheck;
! 	unsigned long lastDownServerCheck;
! 	unsigned long lastUpServerCheck;
! 	unsigned long lastTokenCacheCheck;
  	char thostName[200];
! 	unsigned long code;
  	struct hostent *thp;
  
  	/* ping all file servers, up or down, with unauthenticated connection,
Index: openafs/src/WINNT/afsd/cm_dcache.c
diff -c openafs/src/WINNT/afsd/cm_dcache.c:1.11 openafs/src/WINNT/afsd/cm_dcache.c:1.11.2.1
*** openafs/src/WINNT/afsd/cm_dcache.c:1.11	Sat Aug  7 01:44:05 2004
--- openafs/src/WINNT/afsd/cm_dcache.c	Tue Aug 17 00:28:39 2004
***************
*** 15,21 ****
--- 15,23 ----
  #include <winsock2.h>
  #include <nb30.h>
  #endif /* !DJGPP */
+ #ifdef COMMENT
  #include <malloc.h>
+ #endif
  #include <string.h>
  #include <stdlib.h>
  #include <osi.h>
***************
*** 407,414 ****
      while(length > 0) {
  		/* get callback so we can do a meaningful dataVersion comparison */
          code = cm_SyncOp(scp, NULL, up, reqp, 0,
!                          CM_SCACHESYNC_NEEDCALLBACK
!                          | CM_SCACHESYNC_GETSTATUS);
  		if (code) {
  			scp->flags &= ~CM_SCACHEFLAG_PREFETCHING;
  			lock_ReleaseMutex(&scp->mx);
--- 409,415 ----
      while(length > 0) {
  		/* get callback so we can do a meaningful dataVersion comparison */
          code = cm_SyncOp(scp, NULL, up, reqp, 0,
!                          CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
  		if (code) {
  			scp->flags &= ~CM_SCACHEFLAG_PREFETCHING;
  			lock_ReleaseMutex(&scp->mx);
***************
*** 836,843 ****
  	biop->reserved = 0;
  
  	/* first lookup the file's length, so we know when to stop */
!     code = cm_SyncOp(scp, NULL, up, reqp, 0, CM_SCACHESYNC_NEEDCALLBACK
!                      | CM_SCACHESYNC_GETSTATUS);
      if (code) 
          return code;
          
--- 837,844 ----
  	biop->reserved = 0;
  
  	/* first lookup the file's length, so we know when to stop */
!     code = cm_SyncOp(scp, NULL, up, reqp, 0, 
!                      CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) 
          return code;
          
***************
*** 1073,1080 ****
              if (bufp->flags & CM_BUF_WAITING) {
  				osi_Wakeup((long) bufp);
              }
! 			bufp->flags &= ~(CM_BUF_WAITING | CM_BUF_WRITING
!                              | CM_BUF_DIRTY);
          }
  
          lock_ReleaseMutex(&bufp->mx);
--- 1074,1080 ----
              if (bufp->flags & CM_BUF_WAITING) {
  				osi_Wakeup((long) bufp);
              }
!             bufp->flags &= ~(CM_BUF_WAITING | CM_BUF_WRITING | CM_BUF_DIRTY);
          }
  
          lock_ReleaseMutex(&bufp->mx);
Index: openafs/src/WINNT/afsd/cm_dir.h
diff -c openafs/src/WINNT/afsd/cm_dir.h:1.2 openafs/src/WINNT/afsd/cm_dir.h:1.2.20.1
*** openafs/src/WINNT/afsd/cm_dir.h:1.2	Sat Nov  4 05:01:38 2000
--- openafs/src/WINNT/afsd/cm_dir.h	Tue Aug 17 00:28:39 2004
***************
*** 11,17 ****
  #define __CM_DIR_ENV__ 1
  
  #define CM_DIR_PAGESIZE		2048		/* bytes per page */
! #define CM_DIR_NHASHENT		128		/* entries in the hash tbl */
  #define CM_DIR_MAXPAGES		128		/* max pages in a dir */
  #define CM_DIR_BIGMAXPAGES	1023		/* new big max pages */
  #define CM_DIR_EPP		64		/* dir entries per page */
--- 11,17 ----
  #define __CM_DIR_ENV__ 1
  
  #define CM_DIR_PAGESIZE		2048		/* bytes per page */
! #define CM_DIR_NHASHENT		256		/* entries in the hash tbl == NHSIZE */
  #define CM_DIR_MAXPAGES		128		/* max pages in a dir */
  #define CM_DIR_BIGMAXPAGES	1023		/* new big max pages */
  #define CM_DIR_EPP		64		/* dir entries per page */
***************
*** 63,68 ****
--- 63,69 ----
  	char name[16];
  } cm_dirEntry_t;
  
+ #ifdef UNUSED
  typedef struct cm_dirXEntry {
  	/* A directory extension entry. */
  	char name[32];
***************
*** 79,84 ****
--- 80,86 ----
  	cm_pageHeader_t header;
  	cm_dirEntry_t entry[1];
  } cm_dirPage1_t;
+ #endif /* UNUSED */
  
  extern int cm_NameEntries(char *namep, size_t *lenp);
  
Index: openafs/src/WINNT/afsd/cm_dnlc.c
diff -c openafs/src/WINNT/afsd/cm_dnlc.c:1.5 openafs/src/WINNT/afsd/cm_dnlc.c:1.5.2.1
*** openafs/src/WINNT/afsd/cm_dnlc.c:1.5	Thu May  6 11:17:29 2004
--- openafs/src/WINNT/afsd/cm_dnlc.c	Tue Aug 17 00:28:39 2004
***************
*** 27,47 ****
  #include <osi.h>
  #include "afsd.h"
  
! osi_rwlock_t cm_dnlcLock;
  
! cm_dnlcstats_t dnlcstats;	/* dnlc statistics */
! int cm_useDnlc = 1; 		/* yes, start using the dnlc */
! int cm_debugDnlc = 0;		/* debug dnlc */
  
  
  /* Hash table invariants:
   *     1.  If nameHash[i] is NULL, list is empty
   *     2.  A single element in a hash bucket has itself as prev and next.
   */
! struct nc 	*ncfreelist = (struct nc *)0;
  static struct nc nameCache[NCSIZE];
! struct nc*	nameHash[NHSIZE];
! 
  
  #ifndef DJGPP
  #define dnlcNotify(x,debug){                    \
--- 27,46 ----
  #include <osi.h>
  #include "afsd.h"
  
! static osi_rwlock_t cm_dnlcLock;
  
! static cm_dnlcstats_t dnlcstats;	/* dnlc statistics */
! static int cm_useDnlc = 1; 	/* yes, start using the dnlc */
! static int cm_debugDnlc = 0;	/* debug dnlc */
  
  
  /* Hash table invariants:
   *     1.  If nameHash[i] is NULL, list is empty
   *     2.  A single element in a hash bucket has itself as prev and next.
   */
! static struct nc *ncfreelist = (struct nc *)0;
  static struct nc nameCache[NCSIZE];
! static struct nc *nameHash[NHSIZE];
  
  #ifndef DJGPP
  #define dnlcNotify(x,debug){                    \
***************
*** 59,65 ****
  #define dnlcNotify(x,debug)
  #endif /* !DJGPP */
  
- 
  static struct nc * 
  GetMeAnEntry() 
  {
--- 58,63 ----
Index: openafs/src/WINNT/afsd/cm_dnlc.h
diff -c openafs/src/WINNT/afsd/cm_dnlc.h:1.2 openafs/src/WINNT/afsd/cm_dnlc.h:1.2.20.1
*** openafs/src/WINNT/afsd/cm_dnlc.h:1.2	Sat Nov  4 05:01:38 2000
--- openafs/src/WINNT/afsd/cm_dnlc.h	Tue Aug 17 00:28:39 2004
***************
*** 9,17 ****
  
  #include <ctype.h>
  
! #define 	CM_AFSNCNAMESIZE 	36 /* multiple of 4 */
! #define         NCSIZE 			300
! #define         NHSIZE 			256 /* must be power of 2== NHASHENT */
  
  
  struct nc {
--- 9,17 ----
  
  #include <ctype.h>
  
! #define 	CM_AFSNCNAMESIZE 	40  /* multiple of 8 (for 64-bit) */
! #define         NCSIZE 			512
! #define         NHSIZE 			256 /* must be power of 2 == CM_DIR_NHASHENT */
  
  
  struct nc {
Index: openafs/src/WINNT/afsd/cm_freelance.c
diff -c openafs/src/WINNT/afsd/cm_freelance.c:1.15 openafs/src/WINNT/afsd/cm_freelance.c:1.15.2.1
*** openafs/src/WINNT/afsd/cm_freelance.c:1.15	Sat Aug  7 01:44:05 2004
--- openafs/src/WINNT/afsd/cm_freelance.c	Tue Aug 17 00:28:39 2004
***************
*** 272,277 ****
--- 272,278 ----
  	}
  	
  	// we know the fakeDir is setup properly, so we claim that we have callback
+     osi_Log0(afsd_logp,"cm_InitFakeRootDir fakeDirCallback=1");
  	cm_fakeDirCallback=1;
  
  	// when we get here, we've set up everything! done!
***************
*** 512,518 ****
              fprintf(fp,"%s#%s:root.cell.\n",rootCellName,rootCellName);
              fprintf(fp,".%s%%%s:root.cell.\n",rootCellName,rootCellName);
              fclose(fp);
!             fopen(hdir, "r");
          } else {
              fputs("0\n", fp);
              fclose(fp);
--- 513,519 ----
              fprintf(fp,"%s#%s:root.cell.\n",rootCellName,rootCellName);
              fprintf(fp,".%s%%%s:root.cell.\n",rootCellName,rootCellName);
              fclose(fp);
!             fp = fopen(hdir, "r");
          } else {
              fputs("0\n", fp);
              fclose(fp);
Index: openafs/src/WINNT/afsd/cm_ioctl.c
diff -c openafs/src/WINNT/afsd/cm_ioctl.c:1.33 openafs/src/WINNT/afsd/cm_ioctl.c:1.33.2.1
*** openafs/src/WINNT/afsd/cm_ioctl.c:1.33	Wed Aug  4 11:52:56 2004
--- openafs/src/WINNT/afsd/cm_ioctl.c	Tue Aug 17 00:28:39 2004
***************
*** 1060,1067 ****
  		ioctlp->outDatap = cp;
  	}
  
! 	if (tcellp) return 0;
! 	else return CM_ERROR_NOMORETOKENS;	/* mapped to EDOM */
  }
  
  extern long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *namep);
--- 1060,1069 ----
  		ioctlp->outDatap = cp;
  	}
  
!     if (tcellp) 
!         return 0;
!     else 
!         return CM_ERROR_NOMORETOKENS;	/* mapped to EDOM */
  }
  
  extern long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *namep);
Index: openafs/src/WINNT/afsd/cm_scache.c
diff -c openafs/src/WINNT/afsd/cm_scache.c:1.14 openafs/src/WINNT/afsd/cm_scache.c:1.14.2.1
*** openafs/src/WINNT/afsd/cm_scache.c:1.14	Sat Aug  7 01:44:05 2004
--- openafs/src/WINNT/afsd/cm_scache.c	Tue Aug 17 00:28:39 2004
***************
*** 56,62 ****
  		cm_scacheLRULastp = (cm_scache_t *) osi_QPrev(&scp->q);
  	osi_QRemove((osi_queue_t **) &cm_scacheLRUFirstp, &scp->q);
  	osi_QAdd((osi_queue_t **) &cm_scacheLRUFirstp, &scp->q);
! 	if (!cm_scacheLRULastp) cm_scacheLRULastp = scp;
  }
  
  /* called with cm_scacheLock write-locked; find a vnode to recycle.
--- 56,63 ----
  		cm_scacheLRULastp = (cm_scache_t *) osi_QPrev(&scp->q);
  	osi_QRemove((osi_queue_t **) &cm_scacheLRUFirstp, &scp->q);
  	osi_QAdd((osi_queue_t **) &cm_scacheLRUFirstp, &scp->q);
!     if (!cm_scacheLRULastp) 
!         cm_scacheLRULastp = scp;
  }
  
  /* called with cm_scacheLock write-locked; find a vnode to recycle.
***************
*** 73,79 ****
       	        for (scp = cm_scacheLRULastp;
       		     scp;
       		     scp = (cm_scache_t *) osi_QPrev(&scp->q)) {
! 		  if (scp->refCount == 0) break;
  	        }
                  
                  if (scp) {
--- 74,81 ----
       	        for (scp = cm_scacheLRULastp;
       		     scp;
       		     scp = (cm_scache_t *) osi_QPrev(&scp->q)) {
!             if (scp->refCount == 0) 
!                 break;
  	        }
                  
                  if (scp) {
***************
*** 85,91 ****
  				for (tscp = *lscpp;
       				     tscp;
       				     lscpp = &tscp->nextp, tscp = *lscpp) {
! 				  if (tscp == scp) break;
                                  }
                                  osi_assertx(tscp, "afsd: scache hash screwup");
                                  *lscpp = scp->nextp;
--- 87,94 ----
  				for (tscp = *lscpp;
       				     tscp;
       				     lscpp = &tscp->nextp, tscp = *lscpp) {
!                     if (tscp == scp) 
!                         break;
                                  }
                                  osi_assertx(tscp, "afsd: scache hash screwup");
                                  *lscpp = scp->nextp;
***************
*** 108,114 ****
--- 111,120 ----
  			scp->bulkStatProgress = hzero;
  
                          /* discard callback */
+             if (scp->cbServerp) {
+                 cm_PutServer(scp->cbServerp);
                          scp->cbServerp = NULL;
+             }
                          scp->cbExpires = 0;
  
  			/* remove from dnlc */
***************
*** 164,170 ****
  	
          /* and put it in the LRU queue */
          osi_QAdd((osi_queue_t **) &cm_scacheLRUFirstp, &scp->q);
!         if (!cm_scacheLRULastp) cm_scacheLRULastp = scp;
          cm_currentSCaches++;
  	cm_dnlcPurgedp(scp); /* make doubly sure that this is not in dnlc */
  	cm_dnlcPurgevp(scp); 
--- 170,177 ----
  	
          /* and put it in the LRU queue */
          osi_QAdd((osi_queue_t **) &cm_scacheLRUFirstp, &scp->q);
!     if (!cm_scacheLRULastp) 
!         cm_scacheLRULastp = scp;
          cm_currentSCaches++;
  	cm_dnlcPurgedp(scp); /* make doubly sure that this is not in dnlc */
  	cm_dnlcPurgevp(scp); 
***************
*** 174,183 ****
  /* like strcmp, only for fids */
  int cm_FidCmp(cm_fid_t *ap, cm_fid_t *bp)
  {
!         if (ap->vnode != bp->vnode) return 1;
! 	if (ap->volume != bp->volume) return 1;
!         if (ap->unique != bp->unique) return 1;
!         if (ap->cell != bp->cell) return 1;
          return 0;
  }
  
--- 181,194 ----
  /* like strcmp, only for fids */
  int cm_FidCmp(cm_fid_t *ap, cm_fid_t *bp)
  {
!     if (ap->vnode != bp->vnode) 
!         return 1;
!     if (ap->volume != bp->volume) 
!         return 1;
!     if (ap->unique != bp->unique) 
!         return 1;
!     if (ap->cell != bp->cell) 
!         return 1;
          return 0;
  }
  
***************
*** 240,255 ****
  	long hash;
      cm_scache_t *scp;
      long code;
!     cm_volume_t *volp;
      cm_cell_t *cellp;
! 	char* mp;
  	int special; // yj: boolean variable to test if file is on root.afs
  	int isRoot;
          
      hash = CM_SCACHE_HASH(fidp);
          
  	osi_assert(fidp->cell != 0);
  
  	// yj: check if we have the scp, if so, we don't need
  	// to do anything else
      lock_ObtainWrite(&cm_scacheLock);
--- 251,274 ----
  	long hash;
      cm_scache_t *scp;
      long code;
!     cm_volume_t *volp = 0;
      cm_cell_t *cellp;
!     char* mp = 0;
  	int special; // yj: boolean variable to test if file is on root.afs
  	int isRoot;
+     extern cm_fid_t cm_rootFid;
          
      hash = CM_SCACHE_HASH(fidp);
          
  	osi_assert(fidp->cell != 0);
  
+     if (fidp->cell== cm_rootFid.cell && 
+          fidp->volume==cm_rootFid.volume &&
+          fidp->vnode==0x0 && fidp->unique==0x0)
+     {
+         osi_Log0(afsd_logp,"cm_getSCache called with root cell/volume and vnode=0 and unique=0");
+     }
+ 
  	// yj: check if we have the scp, if so, we don't need
  	// to do anything else
      lock_ObtainWrite(&cm_scacheLock);
***************
*** 281,296 ****
  	if (cm_freelanceEnabled && isRoot) {
  		osi_Log0(afsd_logp,"cm_getSCache Freelance and isRoot");
            /* freelance: if we are trying to get the root scp for the first
!              time, we will just put in a place holder entry. */
  		volp = NULL;
  	}
  	  
  	if (cm_freelanceEnabled && special) {
  		osi_Log0(afsd_logp,"cm_getSCache Freelance and special");
  	    lock_ObtainMutex(&cm_Freelance_Lock);
  		mp =(cm_localMountPoints+fidp->vnode-2)->mountPointStringp;
  		lock_ReleaseMutex(&cm_Freelance_Lock);
! 		
  		scp = cm_GetNewSCache();
  		
  		scp->fid = *fidp;
--- 300,319 ----
  	if (cm_freelanceEnabled && isRoot) {
  		osi_Log0(afsd_logp,"cm_getSCache Freelance and isRoot");
            /* freelance: if we are trying to get the root scp for the first
!          * time, we will just put in a place holder entry. 
!          */
  		volp = NULL;
  	}
  	  
  	if (cm_freelanceEnabled && special) {
  		osi_Log0(afsd_logp,"cm_getSCache Freelance and special");
+         if (fidp->vnode > 1) {
  	    lock_ObtainMutex(&cm_Freelance_Lock);
  		mp =(cm_localMountPoints+fidp->vnode-2)->mountPointStringp;
  		lock_ReleaseMutex(&cm_Freelance_Lock);
!         } else {
!             mp = "";
!         }
  		scp = cm_GetNewSCache();
  		
  		scp->fid = *fidp;
***************
*** 326,332 ****
  		lock_ReleaseWrite(&cm_scacheLock);
  		/*afsi_log("   getscache done");*/
  		return 0;
- 
  	}
  	// end of yj code
  #endif /* AFS_FREELANCE_CLIENT */
--- 349,354 ----
***************
*** 352,357 ****
--- 374,380 ----
  			scp->refCount++;
              cm_AdjustLRU(scp);
              lock_ReleaseWrite(&cm_scacheLock);
+             if (volp)
              cm_PutVolume(volp);
              *outScpp = scp;
  			return 0;
***************
*** 384,389 ****
--- 407,419 ----
  	cm_hashTablep[hash] = scp;
      scp->flags |= CM_SCACHEFLAG_INHASH;
  	scp->refCount = 1;
+ 
+ 	/* XXX - The following fields in the cm_scache are 
+ 	 * uninitialized:
+ 	 *   fileType
+ 	 *   parentVnode
+ 	 *   parentUnique
+ 	 */
      lock_ReleaseWrite(&cm_scacheLock);
          
      /* now we have a held scache entry; just return it */
***************
*** 590,601 ****
  
  		// yj: modified this so that callback only checked if we're
  		// not checking something on /afs
  		if (  (flags & CM_SCACHESYNC_NEEDCALLBACK)
  #ifdef AFS_FREELANCE_CLIENT
! 			&& (!cm_freelanceEnabled || !(!(scp->fid.vnode==0x1 &&
! 				                         scp->fid.unique==0x1) &&
! 				                         scp->fid.cell==AFS_FAKE_ROOT_CELL_ID &&
! 				                         scp->fid.volume==AFS_FAKE_ROOT_VOL_ID))
  #endif /* AFS_FREELANCE_CLIENT */
  		    ) {
  			if (!cm_HaveCallback(scp)) {
--- 620,633 ----
  
  		// yj: modified this so that callback only checked if we're
  		// not checking something on /afs
+         /* fix the conditional to match the one in cm_HaveCallback */
  		if (  (flags & CM_SCACHESYNC_NEEDCALLBACK)
  #ifdef AFS_FREELANCE_CLIENT
!              && (!cm_freelanceEnabled || 
!                   !(scp->fid.vnode==0x1 && scp->fid.unique==0x1) ||
!                   scp->fid.cell!=AFS_FAKE_ROOT_CELL_ID ||
!                   scp->fid.volume!=AFS_FAKE_ROOT_VOL_ID ||
! 				  cm_fakeDirCallback < 2)
  #endif /* AFS_FREELANCE_CLIENT */
  		    ) {
  			if (!cm_HaveCallback(scp)) {
***************
*** 656,662 ****
  		if (bufLocked) lock_ReleaseMutex(&bufp->mx);
          osi_SleepM((long) &scp->flags, &scp->mx);
          osi_Log0(afsd_logp, "CM SyncOp woke!");
!         if (bufLocked) lock_ObtainMutex(&bufp->mx);
          lock_ObtainMutex(&scp->mx);
          } /* big while loop */
          
--- 688,695 ----
  		if (bufLocked) lock_ReleaseMutex(&bufp->mx);
          osi_SleepM((long) &scp->flags, &scp->mx);
          osi_Log0(afsd_logp, "CM SyncOp woke!");
!         if (bufLocked) 
!             lock_ObtainMutex(&bufp->mx);
          lock_ObtainMutex(&scp->mx);
          } /* big while loop */
          
***************
*** 807,813 ****
  	if (cm_freelanceEnabled && scp == cm_rootSCachep) {
  		osi_Log0(afsd_logp,"cm_MergeStatus Freelance cm_rootSCachep");
  		statusp->InterfaceVersion = 0x1;
! 		statusp->FileType = 0x2;
  		statusp->LinkCount = scp->linkCount;
  		statusp->Length = cm_fakeDirSize;
  		statusp->DataVersion = cm_fakeDirVersion;
--- 840,846 ----
  	if (cm_freelanceEnabled && scp == cm_rootSCachep) {
  		osi_Log0(afsd_logp,"cm_MergeStatus Freelance cm_rootSCachep");
  		statusp->InterfaceVersion = 0x1;
!         statusp->FileType = CM_SCACHETYPE_DIRECTORY;
  		statusp->LinkCount = scp->linkCount;
  		statusp->Length = cm_fakeDirSize;
  		statusp->DataVersion = cm_fakeDirVersion;
***************
*** 900,907 ****
  		else
                  	scp->fileType = CM_SCACHETYPE_SYMLINK;
          }
!         else scp->fileType = 0;	/* invalid */
! 
          /* and other stuff */
          scp->parentVnode = statusp->ParentVnode;
          scp->parentUnique = statusp->ParentUnique;
--- 933,942 ----
  		else
                  	scp->fileType = CM_SCACHETYPE_SYMLINK;
          }
!     else {
!         osi_Log1(afsd_logp, "Merge, Invalid File Type, scp %x", scp);
!         scp->fileType = 0;	/* invalid */
!     }
          /* and other stuff */
          scp->parentVnode = statusp->ParentVnode;
          scp->parentUnique = statusp->ParentUnique;
***************
*** 927,933 ****
--- 962,971 ----
  void cm_DiscardSCache(cm_scache_t *scp)
  {
  	lock_AssertMutex(&scp->mx);
+     if (scp->cbServerp) {
+         cm_PutServer(scp->cbServerp);
  	scp->cbServerp = NULL;
+     }
          scp->cbExpires = 0;
  	cm_dnlcPurgedp(scp);
          cm_FreeAllACLEnts(scp);
Index: openafs/src/WINNT/afsd/cm_scache.h
diff -c openafs/src/WINNT/afsd/cm_scache.h:1.4 openafs/src/WINNT/afsd/cm_scache.h:1.4.2.1
*** openafs/src/WINNT/afsd/cm_scache.h:1.4	Sat Jul 31 20:16:37 2004
--- openafs/src/WINNT/afsd/cm_scache.h	Wed Aug 18 13:11:22 2004
***************
*** 72,79 ****
  
  	/* file status */
  	int fileType;			/* file type */
! 	unsigned long clientModTime;	/* mtime */
!         unsigned long serverModTime;	/* at server, for concurrent call
  					 * comparisons */
          osi_hyper_t length;		/* file length */
  	cm_prefetch_t prefetch;		/* prefetch info structure */
--- 72,79 ----
  
  	/* file status */
  	int fileType;			/* file type */
! 	time_t clientModTime;	/* mtime */
!         time_t serverModTime;	/* at server, for concurrent call
  					 * comparisons */
          osi_hyper_t length;		/* file length */
  	cm_prefetch_t prefetch;		/* prefetch info structure */
***************
*** 97,108 ****
  					 * the link contents here.
                                           */
  	cm_fid_t *mountRootFidp;	/* mounted on root */
! 	unsigned int mountRootGen;	/* time to update mountRootFidp? */
  	cm_fid_t *dotdotFidp;		/* parent of volume root */
  
  	/* callback info */
          struct cm_server *cbServerp;	/* server granting callback */
!         long cbExpires;			/* time callback expires */
  
  	/* access cache */
          long anyAccess;			/* anonymous user's access */
--- 97,108 ----
  					 * the link contents here.
                                           */
  	cm_fid_t *mountRootFidp;	/* mounted on root */
! 	time_t    mountRootGen;	        /* time to update mountRootFidp? */
  	cm_fid_t *dotdotFidp;		/* parent of volume root */
  
  	/* callback info */
          struct cm_server *cbServerp;	/* server granting callback */
!         time_t cbExpires;		/* time callback expires */
  
  	/* access cache */
          long anyAccess;			/* anonymous user's access */
Index: openafs/src/WINNT/afsd/cm_server.c
diff -c openafs/src/WINNT/afsd/cm_server.c:1.13 openafs/src/WINNT/afsd/cm_server.c:1.13.2.2
*** openafs/src/WINNT/afsd/cm_server.c:1.13	Sat Aug  7 10:12:11 2004
--- openafs/src/WINNT/afsd/cm_server.c	Tue Aug 17 11:26:04 2004
***************
*** 53,59 ****
  
          lock_ObtainWrite(&cm_serverLock);
  	for(tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
! 		tsp->refCount++;
                  lock_ReleaseWrite(&cm_serverLock);
  
  		/* now process the server */
--- 53,59 ----
  
          lock_ObtainWrite(&cm_serverLock);
  	for(tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
!         cm_GetServerNoLock(tsp);
                  lock_ReleaseWrite(&cm_serverLock);
  
  		/* now process the server */
***************
*** 120,126 ****
  		cm_GCConnections(tsp);
  
                  lock_ObtainWrite(&cm_serverLock);
!                 osi_assert(tsp->refCount-- > 0);
          }
          lock_ReleaseWrite(&cm_serverLock);
  }
--- 120,126 ----
  		cm_GCConnections(tsp);
  
                  lock_ObtainWrite(&cm_serverLock);
!         cm_PutServerNoLock(tsp);
          }
          lock_ReleaseWrite(&cm_serverLock);
  }
***************
*** 135,140 ****
--- 135,152 ----
          }
  }
  
+ void cm_GetServer(cm_server_t *serverp)
+ {
+     lock_ObtainWrite(&cm_serverLock);
+     serverp->refCount++;
+     lock_ReleaseWrite(&cm_serverLock);
+ }
+ 
+ void cm_GetServerNoLock(cm_server_t *serverp)
+ {
+     serverp->refCount++;
+ }
+ 
  void cm_PutServer(cm_server_t *serverp)
  {
  	lock_ObtainWrite(&cm_serverLock);
***************
*** 195,201 ****
  		serverp->ipRank += min(serverp->ipRank, rand() % 0x000f);
  	    } /* and of for loop */
  	}
! 	else	serverp->ipRank = 10000 + (rand() % 0x00ff); /* VL server */
  }
  
  cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cellp) {
--- 207,214 ----
  		serverp->ipRank += min(serverp->ipRank, rand() % 0x000f);
  	    } /* and of for loop */
  	}
!     else 
!         serverp->ipRank = 10000 + (rand() % 0x00ff); /* VL server */
  }
  
  cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cellp) {
***************
*** 235,241 ****
          }
  
  	/* bump ref count if we found the server */
! 	if (tsp) tsp->refCount++;
  
  	/* drop big table lock */
          lock_ReleaseWrite(&cm_serverLock);
--- 248,255 ----
          }
  
  	/* bump ref count if we found the server */
!     if (tsp) 
!         cm_GetServerNoLock(tsp);
  
  	/* drop big table lock */
          lock_ReleaseWrite(&cm_serverLock);
***************
*** 248,256 ****
  {
  	cm_serverRef_t *tsrp;
  
!     lock_ObtainWrite(&cm_serverLock);
! 	serverp->refCount++;
!     lock_ReleaseWrite(&cm_serverLock);
  	tsrp = malloc(sizeof(*tsrp));
  	tsrp->server = serverp;
  	tsrp->status = not_busy;
--- 262,268 ----
  {
  	cm_serverRef_t *tsrp;
  
!     cm_GetServer(serverp);
  	tsrp = malloc(sizeof(*tsrp));
  	tsrp->server = serverp;
  	tsrp->status = not_busy;
***************
*** 404,428 ****
  }
  
  /* call cm_FreeServer while holding a write lock on cm_serverLock */
! void cm_FreeServer(cm_server_t* server)
  {
!     if (--(server->refCount) == 0)
      {
          /* we need to check to ensure that all of the connections
           * for this server have a 0 refCount; otherwise, they will
           * not be garbage collected 
           */
!         cm_GCConnections(server);  /* connsp */
  
!         lock_FinalizeMutex(&server->mx);
!         if ( cm_allServersp == server )
!             cm_allServersp = server->allNextp;
          else {
              cm_server_t *tsp;
  
              for(tsp = cm_allServersp; tsp->allNextp; tsp=tsp->allNextp) {
!                 if ( tsp->allNextp == server ) {
!                     tsp->allNextp = server->allNextp;
                      break;
                  }
              }
--- 416,441 ----
  }
  
  /* call cm_FreeServer while holding a write lock on cm_serverLock */
! void cm_FreeServer(cm_server_t* serverp)
  {
!     cm_PutServerNoLock(serverp);
!     if (serverp->refCount == 0)
      {
          /* we need to check to ensure that all of the connections
           * for this server have a 0 refCount; otherwise, they will
           * not be garbage collected 
           */
!         cm_GCConnections(serverp);  /* connsp */
  
!         lock_FinalizeMutex(&serverp->mx);
!         if ( cm_allServersp == serverp )
!             cm_allServersp = serverp->allNextp;
          else {
              cm_server_t *tsp;
  
              for(tsp = cm_allServersp; tsp->allNextp; tsp=tsp->allNextp) {
!                 if ( tsp->allNextp == serverp ) {
!                     tsp->allNextp = serverp->allNextp;
                      break;
                  }
              }
Index: openafs/src/WINNT/afsd/cm_server.h
diff -c openafs/src/WINNT/afsd/cm_server.h:1.5 openafs/src/WINNT/afsd/cm_server.h:1.5.2.1
*** openafs/src/WINNT/afsd/cm_server.h:1.5	Fri Jul 30 16:02:58 2004
--- openafs/src/WINNT/afsd/cm_server.h	Tue Aug 17 00:28:39 2004
***************
*** 74,79 ****
--- 74,83 ----
  
  extern long cm_ChecksumServerList(cm_serverRef_t *serversp);
  
+ extern void cm_GetServer(cm_server_t *);
+ 
+ extern void cm_GetServerNoLock(cm_server_t *);
+ 
  extern void cm_PutServer(cm_server_t *);
  
  extern void cm_PutServerNoLock(cm_server_t *);
Index: openafs/src/WINNT/afsd/cm_vnodeops.c
diff -c openafs/src/WINNT/afsd/cm_vnodeops.c:1.19 openafs/src/WINNT/afsd/cm_vnodeops.c:1.19.2.1
*** openafs/src/WINNT/afsd/cm_vnodeops.c:1.19	Fri Jul 30 16:02:58 2004
--- openafs/src/WINNT/afsd/cm_vnodeops.c	Tue Aug 17 00:28:39 2004
***************
*** 1380,1386 ****
                          psp = tempsp;
                          tp = psp->data;
                          cm_ReleaseSCache(tscp);
!                         tscp = linkScp;	/* already held
                                           * by AssembleLink */
                          /* now, if linkScp is null, that's
                           * AssembleLink's way of telling us that
--- 1380,1387 ----
                          psp = tempsp;
                          tp = psp->data;
                          cm_ReleaseSCache(tscp);
!                     tscp = linkScp;	
!                     /* already held
                                           * by AssembleLink */
                          /* now, if linkScp is null, that's
                           * AssembleLink's way of telling us that
***************
*** 1679,1685 ****
                  } /* all files in the response */
  		/* now tell it to drop the count,
  		 * after doing the vnode processing above */
!                 cm_EndCallbackGrantingCall(NULL, NULL, NULL, 0);
                  
                  filex += filesThisCall;
          }	/* while there are still more files to process */
--- 1680,1686 ----
                  } /* all files in the response */
  		/* now tell it to drop the count,
  		 * after doing the vnode processing above */
!         cm_EndCallbackGrantingCall(NULL, &cbReq, NULL, 0);
                  
                  filex += filesThisCall;
          }	/* while there are still more files to process */
***************
*** 1959,1965 ****
  	
          /* make sure we end things properly */
          if (!didEnd)
!         	cm_EndCallbackGrantingCall(NULL, NULL, NULL, 0);
  
          return code;
  }
--- 1960,1966 ----
  	
          /* make sure we end things properly */
          if (!didEnd)
!         	cm_EndCallbackGrantingCall(NULL, &cbReq, NULL, 0);
  
          return code;
  }
***************
*** 2075,2081 ****
  	
          /* make sure we end things properly */
          if (!didEnd)
!         	cm_EndCallbackGrantingCall(NULL, NULL, NULL, 0);
  	
          /* and return error code */
          return code;
--- 2076,2082 ----
  	
          /* make sure we end things properly */
          if (!didEnd)
!         	cm_EndCallbackGrantingCall(NULL, &cbReq, NULL, 0);
  	
          /* and return error code */
          return code;
Index: openafs/src/WINNT/afsd/cm_volume.c
diff -c openafs/src/WINNT/afsd/cm_volume.c:1.8 openafs/src/WINNT/afsd/cm_volume.c:1.8.2.1
*** openafs/src/WINNT/afsd/cm_volume.c:1.8	Wed Aug  4 11:52:56 2004
--- openafs/src/WINNT/afsd/cm_volume.c	Tue Aug 17 00:28:39 2004
***************
*** 175,181 ****
          }
  
  	/* hold the volume if we found it */
!         if (volp) volp->refCount++;
          lock_ReleaseWrite(&cm_volumeLock);
          
  	/* return it held */
--- 175,182 ----
          }
  
  	/* hold the volume if we found it */
!     if (volp) 
!         volp->refCount++;
          lock_ReleaseWrite(&cm_volumeLock);
          
  	/* return it held */
***************
*** 316,322 ****
          serverspp = &volp->roServersp;
  	else if (volume == volp->bkID)
          serverspp = &volp->bkServersp;
! 	else osi_panic("bad volume ID in cm_GetVolServers", __FILE__, __LINE__);
          
      for (current = *serverspp; current; current = current->next)
          current->refCount++;
--- 317,324 ----
          serverspp = &volp->roServersp;
  	else if (volume == volp->bkID)
          serverspp = &volp->bkServersp;
!     else 
!         osi_panic("bad volume ID in cm_GetVolServers", __FILE__, __LINE__);
          
      for (current = *serverspp; current; current = current->next)
          current->refCount++;
***************
*** 370,376 ****
          lock_ReleaseWrite(&cm_volumeLock);
  
  	/* We should also refresh cached mount points */
- 
  }
  
  /*
--- 372,377 ----
Index: openafs/src/WINNT/afsd/fs.c
diff -c openafs/src/WINNT/afsd/fs.c:1.16 openafs/src/WINNT/afsd/fs.c:1.16.2.1
*** openafs/src/WINNT/afsd/fs.c:1.16	Tue Jul 13 23:28:42 2004
--- openafs/src/WINNT/afsd/fs.c	Mon Aug 23 11:55:02 2004
***************
*** 583,588 ****
--- 583,590 ----
      return mydata;
  }
  
+ #define AFSCLIENT_ADMIN_GROUPNAME "AFS Client Admins"
+ 
  BOOL IsAdmin (void)
  {
      static BOOL fAdmin = FALSE;
***************
*** 590,609 ****
  
      if (!fTested)
      {
!         /* Obtain the SID for BUILTIN\Administrators. If this is Windows NT,
!          * expect this call to succeed; if it does not, we can presume that
!          * it's not NT and therefore the user always has administrative
!          * privileges.
           */
          PSID psidAdmin = NULL;
!         SID_IDENTIFIER_AUTHORITY auth = SECURITY_NT_AUTHORITY;
  
          fTested = TRUE;
  
!         if (!AllocateAndInitializeSid (&auth, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &psidAdmin))
              fAdmin = TRUE;
!         else
!         {
              /* Then open our current ProcessToken */
              HANDLE hToken;
  
--- 592,645 ----
  
      if (!fTested)
      {
!         /* Obtain the SID for the AFS client admin group.  If the group does
!          * not exist, then assume we have AFS client admin privileges.
           */
          PSID psidAdmin = NULL;
!         DWORD dwSize, dwSize2;
!         char pszAdminGroup[ MAX_COMPUTERNAME_LENGTH + sizeof(AFSCLIENT_ADMIN_GROUPNAME) + 2 ];
!         char *pszRefDomain = NULL;
!         SID_NAME_USE snu = SidTypeGroup;
! 
!         dwSize = sizeof(pszAdminGroup);
! 
!         if (!GetComputerName(pszAdminGroup, &dwSize)) {
!             /* Can't get computer name.  We return false in this case.
!                Retain fAdmin and fTested. This shouldn't happen.*/
!             return FALSE;
!         }
  
          fTested = TRUE;
  
!         dwSize = 0;
!         dwSize2 = 0;
! 
!         strcat(pszAdminGroup,"\\");
!         strcat(pszAdminGroup, AFSCLIENT_ADMIN_GROUPNAME);
! 
!         LookupAccountName(NULL, pszAdminGroup, NULL, &dwSize, NULL, &dwSize2, &snu);
!         /* that should always fail. */
! 
!         if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
!             /* if we can't find the group, then we allow the operation */
              fAdmin = TRUE;
!             return TRUE;
!         }
! 
!         if (dwSize == 0 || dwSize2 == 0) {
!             /* Paranoia */
!             fAdmin = TRUE;
!             return TRUE;
!         }
! 
!         psidAdmin = (PSID)malloc(dwSize); memset(psidAdmin,0,dwSize);
!         pszRefDomain = (char *)malloc(dwSize2);
! 
!         if (!LookupAccountName(NULL, pszAdminGroup, psidAdmin, &dwSize, pszRefDomain, &dwSize2, &snu)) {
!             /* We can't lookup the group now even though we looked it up earlier.  
!                Could this happen? */
!             fAdmin = TRUE;
!         } else {
              /* Then open our current ProcessToken */
              HANDLE hToken;
  
***************
*** 624,636 ****
                  if (GetTokenInformation (hToken, TokenGroups, pGroups, dwSize, &dwSize))
                  {
                      /* Look through the list of group SIDs and see if any of them
!                      * matches the Administrator group SID.
                       */
                      size_t iGroup = 0;
                      for (; (!fAdmin) && (iGroup < pGroups->GroupCount); ++iGroup)
                      {
!                         if (EqualSid (psidAdmin, pGroups->Groups[ iGroup ].Sid))
                              fAdmin = TRUE;
                      }
                  }
  
--- 660,673 ----
                  if (GetTokenInformation (hToken, TokenGroups, pGroups, dwSize, &dwSize))
                  {
                      /* Look through the list of group SIDs and see if any of them
!                      * matches the AFS Client Admin group SID.
                       */
                      size_t iGroup = 0;
                      for (; (!fAdmin) && (iGroup < pGroups->GroupCount); ++iGroup)
                      {
!                         if (EqualSid (psidAdmin, pGroups->Groups[ iGroup ].Sid)) {
                              fAdmin = TRUE;
+                         }
                      }
                  }
  
***************
*** 639,646 ****
              }
          }
  
!         if (psidAdmin)
!             FreeSid (psidAdmin);
      }
  
      return fAdmin;
--- 676,683 ----
              }
          }
  
!         free(psidAdmin);
!         free(pszRefDomain);
      }
  
      return fAdmin;
***************
*** 1657,1663 ****
      if ( checkserv.tinterval != 0 ) {
  #ifdef WIN32
          if ( !IsAdmin() ) {
!             fprintf (stderr,"Permission denied: requires Administrator access.\n");
              return EACCES;
          }
  #else /* WIN32 */
--- 1694,1700 ----
      if ( checkserv.tinterval != 0 ) {
  #ifdef WIN32
          if ( !IsAdmin() ) {
!             fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n");
              return EACCES;
          }
  #else /* WIN32 */
***************
*** 1769,1775 ****
      
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
--- 1806,1812 ----
      
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
***************
*** 1883,1889 ****
  
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
--- 1920,1926 ----
  
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
***************
*** 2104,2110 ****
      if (ti) {
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
--- 2141,2147 ----
      if (ti) {
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
***************
*** 2171,2177 ****
      
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
--- 2208,2214 ----
      
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
***************
*** 2311,2317 ****
  
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
--- 2348,2354 ----
  
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
***************
*** 2567,2573 ****
  
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
--- 2604,2610 ----
  
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
***************
*** 2724,2730 ****
      
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
--- 2761,2767 ----
      
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
***************
*** 2780,2786 ****
      
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
--- 2817,2823 ----
      
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n");  
          return EACCES;
      }
  #else /* WIN32 */
***************
*** 2845,2851 ****
   
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
--- 2882,2888 ----
   
  #ifdef WIN32
      if ( !IsAdmin() ) {
!         fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n");
          return EACCES;
      }
  #else /* WIN32 */
***************
*** 3239,3258 ****
  
  static CSCPolicyCmd(struct cmd_syndesc *asp)
  {
! 	struct cmd_item *ti;
! 	char *share = NULL;
      HKEY hkCSCPolicy;
  
! 	for(ti=asp->parms[0].items; ti;ti=ti->next) {
! 		share = ti->data;
! 		if (share)
! 		{
! 			break;
! 		}
! 	}
  
! 	if (share)
! 	{
          char *policy;
  
          RegCreateKeyEx( HKEY_LOCAL_MACHINE, 
--- 3276,3295 ----
  
  static CSCPolicyCmd(struct cmd_syndesc *asp)
  {
!     struct cmd_item *ti;
!     char *share = NULL;
      HKEY hkCSCPolicy;
  
!     for(ti=asp->parms[0].items; ti;ti=ti->next) {
!         share = ti->data;
!         if (share)
!         {
!             break;
!         }
!     }
  
!     if (share)
!     {
          char *policy;
  
          RegCreateKeyEx( HKEY_LOCAL_MACHINE, 
***************
*** 3265,3304 ****
                          &hkCSCPolicy,
                          NULL );
  
!         if ( !IsAdmin() || hkCSCPolicy == NULL ) {
              fprintf (stderr,"Permission denied: requires Administrator access.\n");
!             if ( hkCSCPolicy )
!                 RegCloseKey(hkCSCPolicy);
              return EACCES;
          }
  
          policy = "manual";
  		
! 		if (asp->parms[1].items)
! 			policy = "manual";
! 		if (asp->parms[2].items)
! 			policy = "programs";
! 		if (asp->parms[3].items)
! 			policy = "documents";
! 		if (asp->parms[4].items)
! 			policy = "disable";
  		
          RegSetValueEx( hkCSCPolicy, share, 0, REG_SZ, policy, strlen(policy)+1);
  		
! 		printf("CSC policy on share \"%s\" changed to \"%s\".\n\n", share, policy);
! 		printf("Close all applications that accessed files on this share or restart AFS Client for the change to take effect.\n"); 
! 	}
! 	else
! 	{
          DWORD dwIndex, dwPolicies;
! 		char policyName[256];
! 		DWORD policyNameLen;
          char policy[256];
          DWORD policyLen;
          DWORD dwType;
  
! 		/* list current csc policies */
! 		
          RegCreateKeyEx( HKEY_LOCAL_MACHINE, 
                          "SOFTWARE\\OpenAFS\\Client\\CSCPolicy",
                          0, 
--- 3302,3345 ----
                          &hkCSCPolicy,
                          NULL );
  
!         if ( hkCSCPolicy == NULL ) {
              fprintf (stderr,"Permission denied: requires Administrator access.\n");
!             return EACCES;
!         }
! 
!         if ( !IsAdmin() ) {
!             fprintf (stderr,"Permission denied: requires AFS Client Administrator access.\n");
!             RegCloseKey(hkCSCPolicy);
              return EACCES;
          }
  
          policy = "manual";
  		
!         if (asp->parms[1].items)
!             policy = "manual";
!         if (asp->parms[2].items)
!             policy = "programs";
!         if (asp->parms[3].items)
!             policy = "documents";
!         if (asp->parms[4].items)
!             policy = "disable";
  		
          RegSetValueEx( hkCSCPolicy, share, 0, REG_SZ, policy, strlen(policy)+1);
  		
!         printf("CSC policy on share \"%s\" changed to \"%s\".\n\n", share, policy);
!         printf("Close all applications that accessed files on this share or restart AFS Client for the change to take effect.\n"); 
!     }
!     else
!     {
          DWORD dwIndex, dwPolicies;
!         char policyName[256];
!         DWORD policyNameLen;
          char policy[256];
          DWORD policyLen;
          DWORD dwType;
  
!         /* list current csc policies */
! 
          RegCreateKeyEx( HKEY_LOCAL_MACHINE, 
                          "SOFTWARE\\OpenAFS\\Client\\CSCPolicy",
                          0, 
***************
*** 3323,3329 ****
                           NULL   /* lpftLastWriteTime */
                           );
  		
! 		printf("Current CSC policies:\n");
          for ( dwIndex = 0; dwIndex < dwPolicies; dwIndex ++ ) {
  
              policyNameLen = sizeof(policyName);
--- 3364,3370 ----
                           NULL   /* lpftLastWriteTime */
                           );
  		
!         printf("Current CSC policies:\n");
          for ( dwIndex = 0; dwIndex < dwPolicies; dwIndex ++ ) {
  
              policyNameLen = sizeof(policyName);
***************
*** 3331,3340 ****
              RegEnumValue( hkCSCPolicy, dwIndex, policyName, &policyNameLen, NULL,
                            &dwType, policy, &policyLen);
  
! 			printf("  %s = %s\n", policyName, policy);
! 		}
! 	}
  
      RegCloseKey(hkCSCPolicy);
! 	return (0);
  }
--- 3372,3381 ----
              RegEnumValue( hkCSCPolicy, dwIndex, policyName, &policyNameLen, NULL,
                            &dwType, policy, &policyLen);
  
!             printf("  %s = %s\n", policyName, policy);
!         }
!     }
  
      RegCloseKey(hkCSCPolicy);
!     return (0);
  }
Index: openafs/src/WINNT/afsd/smb.c
diff -c openafs/src/WINNT/afsd/smb.c:1.55 openafs/src/WINNT/afsd/smb.c:1.55.2.1
*** openafs/src/WINNT/afsd/smb.c:1.55	Sun Aug  8 12:55:28 2004
--- openafs/src/WINNT/afsd/smb.c	Wed Aug 18 13:11:22 2004
***************
*** 43,54 ****
  /* TODO; logout mechanism needs to be thread-safe */
  char *loggedOutName = NULL;
  smb_user_t *loggedOutUserp = NULL;
! unsigned long loggedOutTime;
  int loggedOut = 0;
  int smbShutdownFlag = 0;
  
  int smb_LogoffTokenTransfer;
! unsigned long smb_LogoffTransferTimeout;
  
  DWORD last_msg_time = 0;
  
--- 43,54 ----
  /* TODO; logout mechanism needs to be thread-safe */
  char *loggedOutName = NULL;
  smb_user_t *loggedOutUserp = NULL;
! time_t loggedOutTime;
  int loggedOut = 0;
  int smbShutdownFlag = 0;
  
  int smb_LogoffTokenTransfer;
! time_t smb_LogoffTransferTimeout;
  
  DWORD last_msg_time = 0;
  
***************
*** 432,438 ****
  }
  
  #ifndef DJGPP
! void ShowUnixTime(char *FuncName, afs_uint32 unixTime)
  {
  	FILETIME ft;
  	WORD wDate, wTime;
--- 432,438 ----
  }
  
  #ifndef DJGPP
! void ShowUnixTime(char *FuncName, time_t unixTime)
  {
  	FILETIME ft;
  	WORD wDate, wTime;
***************
*** 583,594 ****
  }
  
  #ifndef DJGPP
! void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, afs_uint32 unixTime)
  {
  	struct tm *ltp;
  	SYSTEMTIME stm;
  	struct tm localJunk;
! 	long ersatz_unixTime;
  
  	/*
  	 * Must use kludge-GMT instead of real GMT.
--- 583,594 ----
  }
  
  #ifndef DJGPP
! void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, time_t unixTime)
  {
  	struct tm *ltp;
  	SYSTEMTIME stm;
  	struct tm localJunk;
! 	time_t ersatz_unixTime;
  
  	/*
  	 * Must use kludge-GMT instead of real GMT.
***************
*** 623,629 ****
  	SystemTimeToFileTime(&stm, largeTimep);
  }
  #else /* DJGPP */
! void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, afs_uint32 unixTime)
  {
  	/* unixTime: seconds since 1/1/1970 00:00:00 GMT */
  	/* FILETIME: 100ns intervals since 1/1/1601 00:00:00 ??? */
--- 623,629 ----
  	SystemTimeToFileTime(&stm, largeTimep);
  }
  #else /* DJGPP */
! void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, time_t unixTime)
  {
  	/* unixTime: seconds since 1/1/1970 00:00:00 GMT */
  	/* FILETIME: 100ns intervals since 1/1/1601 00:00:00 ??? */
***************
*** 645,651 ****
  #endif /* !DJGPP */
  
  #ifndef DJGPP
! void smb_UnixTimeFromLargeSearchTime(afs_uint32 *unixTimep, FILETIME *largeTimep)
  {
  	SYSTEMTIME stm;
  	struct tm lt;
--- 645,651 ----
  #endif /* !DJGPP */
  
  #ifndef DJGPP
! void smb_UnixTimeFromLargeSearchTime(time_t *unixTimep, FILETIME *largeTimep)
  {
  	SYSTEMTIME stm;
  	struct tm lt;
***************
*** 668,674 ****
  	_timezone = save_timezone;
  }
  #else /* DJGPP */
! void smb_UnixTimeFromLargeSearchTime(afs_uint32 *unixTimep, FILETIME *largeTimep)
  {
  	/* unixTime: seconds since 1/1/1970 00:00:00 GMT */
  	/* FILETIME: 100ns intervals since 1/1/1601 00:00:00 GMT? */
--- 668,674 ----
  	_timezone = save_timezone;
  }
  #else /* DJGPP */
! void smb_UnixTimeFromLargeSearchTime(time_t *unixTimep, FILETIME *largeTimep)
  {
  	/* unixTime: seconds since 1/1/1970 00:00:00 GMT */
  	/* FILETIME: 100ns intervals since 1/1/1601 00:00:00 GMT? */
***************
*** 689,720 ****
  }
  #endif /* !DJGPP */
  
! void smb_SearchTimeFromUnixTime(long *dosTimep, afs_uint32 unixTime)
  {
! 	struct tm *ltp;
! 	int dosDate;
! 	int dosTime;
! 	struct tm localJunk;
! 
! 	ltp = localtime((time_t*) &unixTime);
! 
! 	/* if we fail, make up something */
! 	if (!ltp) {
! 		ltp = &localJunk;
! 		localJunk.tm_year = 89 - 20;
! 		localJunk.tm_mon = 4;
! 		localJunk.tm_mday = 12;
! 		localJunk.tm_hour = 0;
! 		localJunk.tm_min = 0;
! 		localJunk.tm_sec = 0;
! 	}	
! 
! 	dosDate = ((ltp->tm_year-80)<<9) | ((ltp->tm_mon+1) << 5) | (ltp->tm_mday);
! 	dosTime = (ltp->tm_hour<<11) | (ltp->tm_min << 5) | (ltp->tm_sec / 2);
! 	*dosTimep = (dosDate<<16) | dosTime;
  }	
  
! void smb_UnixTimeFromSearchTime(afs_uint32 *unixTimep, long searchTime)
  {
  	unsigned short dosDate;
  	unsigned short dosTime;
--- 689,721 ----
  }
  #endif /* !DJGPP */
  
! void smb_SearchTimeFromUnixTime(long *dosTimep, time_t unixTime)
  {
!     struct tm *ltp;
!     int dosDate;
!     int dosTime;
!     struct tm localJunk;
!     time_t t = unixTime;
! 
!     ltp = localtime((time_t*) &t);
! 
!     /* if we fail, make up something */
!     if (!ltp) {
!         ltp = &localJunk;
!         localJunk.tm_year = 89 - 20;
!         localJunk.tm_mon = 4;
!         localJunk.tm_mday = 12;
!         localJunk.tm_hour = 0;
!         localJunk.tm_min = 0;
!         localJunk.tm_sec = 0;
!     }	
! 
!     dosDate = ((ltp->tm_year-80)<<9) | ((ltp->tm_mon+1) << 5) | (ltp->tm_mday);
!     dosTime = (ltp->tm_hour<<11) | (ltp->tm_min << 5) | (ltp->tm_sec / 2);
!     *dosTimep = (dosDate<<16) | dosTime;
  }	
  
! void smb_UnixTimeFromSearchTime(time_t *unixTimep, time_t searchTime)
  {
  	unsigned short dosDate;
  	unsigned short dosTime;
***************
*** 734,745 ****
  	*unixTimep = mktime(&localTm);
  }
  
! void smb_DosUTimeFromUnixTime(afs_uint32 *dosUTimep, afs_uint32 unixTime)
  {
  	*dosUTimep = unixTime - smb_localZero;
  }
  
! void smb_UnixTimeFromDosUTime(afs_uint32 *unixTimep, afs_uint32 dosTime)
  {
  #ifndef DJGPP
  	*unixTimep = dosTime + smb_localZero;
--- 735,746 ----
  	*unixTimep = mktime(&localTm);
  }
  
! void smb_DosUTimeFromUnixTime(time_t *dosUTimep, time_t unixTime)
  {
  	*dosUTimep = unixTime - smb_localZero;
  }
  
! void smb_UnixTimeFromDosUTime(time_t *unixTimep, time_t dosTime)
  {
  #ifndef DJGPP
  	*unixTimep = dosTime + smb_localZero;
***************
*** 2592,2598 ****
  	char protocol_array[10][1024];  /* protocol signature of the client */
      int caps;                       /* capabilities */
      time_t unixTime;
! 	long dosTime;
  	TIME_ZONE_INFORMATION tzi;
  
      osi_Log1(smb_logp, "SMB receive negotiate; %d + 1 ongoing ops",
--- 2593,2599 ----
  	char protocol_array[10][1024];  /* protocol signature of the client */
      int caps;                       /* capabilities */
      time_t unixTime;
! 	time_t dosTime;
  	TIME_ZONE_INFORMATION tzi;
  
      osi_Log1(smb_logp, "SMB receive negotiate; %d + 1 ongoing ops",
***************
*** 3169,3175 ****
  	long code = 0;
  	cm_scache_t *scp;
  	char *dptr;
! 	long dosTime;
  	u_short shortTemp;
  	char attr;
  	smb_dirListPatch_t *patchp;
--- 3170,3176 ----
  	long code = 0;
  	cm_scache_t *scp;
  	char *dptr;
! 	time_t dosTime;
  	u_short shortTemp;
  	char attr;
  	smb_dirListPatch_t *patchp;
***************
*** 3801,3807 ****
  	unsigned short attribute;
  	cm_attr_t attr;
  	cm_scache_t *newScp;
! 	long dosTime;
  	cm_user_t *userp;
  	int caseFold;
  	char *tidPathp;
--- 3802,3808 ----
  	unsigned short attribute;
  	cm_attr_t attr;
  	cm_scache_t *newScp;
! 	time_t dosTime;
  	cm_user_t *userp;
  	int caseFold;
  	char *tidPathp;
***************
*** 3900,3906 ****
  	long code = 0;
  	cm_scache_t *rootScp;
  	cm_scache_t *newScp, *dscp;
! 	long dosTime;
  	int attrs;
  	cm_user_t *userp;
  	int caseFold;
--- 3901,3907 ----
  	long code = 0;
  	cm_scache_t *rootScp;
  	cm_scache_t *newScp, *dscp;
! 	time_t dosTime;
  	int attrs;
  	cm_user_t *userp;
  	int caseFold;
***************
*** 4062,4068 ****
  	long code = 0;
      cm_user_t *userp;
      cm_scache_t *scp;
!     long dosTime;
      int caseFold;
  	cm_space_t *spacep;
  	char *tidPathp;
--- 4063,4069 ----
  	long code = 0;
      cm_user_t *userp;
      cm_scache_t *scp;
!     time_t dosTime;
      int caseFold;
  	cm_space_t *spacep;
  	char *tidPathp;
Index: openafs/src/WINNT/afsd/smb.h
diff -c openafs/src/WINNT/afsd/smb.h:1.14 openafs/src/WINNT/afsd/smb.h:1.14.2.2
*** openafs/src/WINNT/afsd/smb.h:1.14	Sat Aug  7 01:44:05 2004
--- openafs/src/WINNT/afsd/smb.h	Wed Aug 18 13:11:22 2004
***************
*** 153,159 ****
      struct smb_user *usersp;	/* the first child in the user session list */
      struct smb_fid *fidsp;		/* the first child in the open file list */
  	struct smb_user *justLoggedOut;	/* ready for profile upload? */
! 	unsigned long logoffTime;	/* tick count when logged off */
  	/*struct cm_user *logonDLLUser;	/* integrated logon user */
  	unsigned char errorCount;
      char rname[17];
--- 153,159 ----
      struct smb_user *usersp;	/* the first child in the user session list */
      struct smb_fid *fidsp;		/* the first child in the open file list */
  	struct smb_user *justLoggedOut;	/* ready for profile upload? */
! 	time_t logoffTime;	/* tick count when logged off */
  	/*struct cm_user *logonDLLUser;	/* integrated logon user */
  	unsigned char errorCount;
      char rname[17];
***************
*** 316,322 ****
          int refCount;			/* reference count */
          long cookie;			/* value returned to the caller */
          struct cm_scache *scp;		/* vnode of the dir we're searching */
!         long lastTime;			/* last time we used this */
          long flags;			/* flags (see below);
  					 * locked by smb_globalLock */
          unsigned short attribute;	/* search attribute
--- 316,322 ----
          int refCount;			/* reference count */
          long cookie;			/* value returned to the caller */
          struct cm_scache *scp;		/* vnode of the dir we're searching */
!         time_t lastTime;		/* last time we used this */
          long flags;			/* flags (see below);
  					 * locked by smb_globalLock */
          unsigned short attribute;	/* search attribute
***************
*** 339,346 ****
  } smb_dirListPatch_t;
  
  /* dirListPatch Flags */
! #define SMB_DIRLISTPATCH_DOTFILE 1  /* the file referenced is a dot file 
! 									   Note: will not be set if smb_hideDotFiles is false */
  
  /* waiting lock list elements */
  typedef struct smb_waitingLock {
--- 339,348 ----
  } smb_dirListPatch_t;
  
  /* dirListPatch Flags */
! #define SMB_DIRLISTPATCH_DOTFILE 1  
! /* the file referenced is a dot file
!  * Note: will not be set if smb_hideDotFiles is false 
!  */
  
  /* waiting lock list elements */
  typedef struct smb_waitingLock {
***************
*** 348,354 ****
  	smb_vc_t *vcp;
  	smb_packet_t *inp;
  	smb_packet_t *outp;
! 	u_long timeRemaining;
  	void *lockp;
  } smb_waitingLock_t;
  
--- 350,356 ----
  	smb_vc_t *vcp;
  	smb_packet_t *inp;
  	smb_packet_t *outp;
! 	time_t timeRemaining;
  	void *lockp;
  } smb_waitingLock_t;
  
***************
*** 378,394 ****
  #endif
    );
  
! extern void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, afs_uint32 unixTime);
  
! extern void smb_UnixTimeFromLargeSearchTime(afs_uint32 *unixTimep, FILETIME *largeTimep);
  
! extern void smb_SearchTimeFromUnixTime(long *dosTimep, afs_uint32 unixTime);
  
! extern void smb_UnixTimeFromSearchTime(afs_uint32 *unixTimep, long searchTime);
  
! extern void smb_DosUTimeFromUnixTime(afs_uint32 *dosUTimep, afs_uint32 unixTime);
  
! extern void smb_UnixTimeFromDosUTime(afs_uint32 *unixTimep, afs_uint32 dosUTime);
  
  extern smb_vc_t *smb_FindVC(unsigned short lsn, int flags, int lana);
  
--- 380,396 ----
  #endif
    );
  
! extern void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, time_t unixTime);
  
! extern void smb_UnixTimeFromLargeSearchTime(time_t *unixTimep, FILETIME *largeTimep);
  
! extern void smb_SearchTimeFromUnixTime(time_t *dosTimep, time_t unixTime);
  
! extern void smb_UnixTimeFromSearchTime(time_t *unixTimep, time_t searchTime);
  
! extern void smb_DosUTimeFromUnixTime(time_t *dosUTimep, time_t unixTime);
  
! extern void smb_UnixTimeFromDosUTime(time_t *unixTimep, time_t dosUTime);
  
  extern smb_vc_t *smb_FindVC(unsigned short lsn, int flags, int lana);
  
***************
*** 474,480 ****
  /* some globals, too */
  extern char *smb_localNamep;
  extern int loggedOut;
! extern unsigned long loggedOutTime;
  extern char *loggedOutName;
  extern smb_user_t *loggedOutUserp;
  
--- 476,482 ----
  /* some globals, too */
  extern char *smb_localNamep;
  extern int loggedOut;
! extern time_t loggedOutTime;
  extern char *loggedOutName;
  extern smb_user_t *loggedOutUserp;
  
***************
*** 485,491 ****
  extern osi_rwlock_t smb_rctLock;
  
  extern int smb_LogoffTokenTransfer;
! extern unsigned long smb_LogoffTransferTimeout;
  
  extern int smb_maxVCPerServer; /* max # of VCs per server */
  extern int smb_maxMpxRequests; /* max # of mpx requests */
--- 487,493 ----
  extern osi_rwlock_t smb_rctLock;
  
  extern int smb_LogoffTokenTransfer;
! extern time_t smb_LogoffTransferTimeout;
  
  extern int smb_maxVCPerServer; /* max # of VCs per server */
  extern int smb_maxMpxRequests; /* max # of mpx requests */
Index: openafs/src/WINNT/afsd/smb3.c
diff -c openafs/src/WINNT/afsd/smb3.c:1.42.2.3 openafs/src/WINNT/afsd/smb3.c:1.42.2.5
*** openafs/src/WINNT/afsd/smb3.c:1.42.2.3	Tue Aug 10 00:10:47 2004
--- openafs/src/WINNT/afsd/smb3.c	Thu Aug 19 15:51:23 2004
***************
*** 3029,3035 ****
  			        *((u_long *)dptr) = SMB_ATTR_HIDDEN;
                  }
  			    dptr += 4;
- 
              } else {
                  /* 1969-12-31 23:59:58 +00*/
                  dosTime = 0xEBBFBF7D;
--- 3029,3034 ----
***************
*** 3066,3076 ****
  
                  /* merge in hidden (dot file) attribute */
                  if ( patchp->flags & SMB_DIRLISTPATCH_DOTFILE ) {
!                     attr == SMB_ATTR_HIDDEN;
  			        *dptr++ = attr & 0xff;
  			        *dptr++ = (attr >> 8) & 0xff;
                  }
- 
              }
  			continue;
          }
--- 3065,3074 ----
  
                  /* merge in hidden (dot file) attribute */
                  if ( patchp->flags & SMB_DIRLISTPATCH_DOTFILE ) {
!                     attr = SMB_ATTR_HIDDEN;
  			        *dptr++ = attr & 0xff;
  			        *dptr++ = (attr >> 8) & 0xff;
                  }
              }
  			continue;
          }
***************
*** 5863,6073 ****
  	cm_scache_t *dscp, char *filename, char *otherFilename,
  	BOOL isDirectParent)
  {
! 	smb_packet_t *watch, *lastWatch, *nextWatch;
! 	ULONG parmSlot, parmCount, parmOffset, dataOffset, nameLen;
! 	char *outData, *oldOutData;
! 	ULONG filter;
! 	USHORT fid, wtree;
! 	ULONG maxLen;
! 	BOOL twoEntries = FALSE;
! 	ULONG otherNameLen, oldParmCount = 0;
! 	DWORD otherAction;
! 	smb_vc_t *vcp;
! 	smb_fid_t *fidp;
  
! 	/* Get ready for rename within directory */
! 	if (action == FILE_ACTION_RENAMED_OLD_NAME && otherFilename != NULL) {
! 		twoEntries = TRUE;
! 		otherAction = FILE_ACTION_RENAMED_NEW_NAME;
! 	}
  
      osi_Log2(smb_logp,"in smb_NotifyChange for file [%s] dscp [%x]",
!               osi_LogSaveString(smb_logp,filename),dscp);
  
! 	lock_ObtainMutex(&smb_Dir_Watch_Lock);
! 	watch = smb_Directory_Watches;
! 	while (watch) {
! 		filter = smb_GetSMBParm(watch, 19)
! 				| (smb_GetSMBParm(watch, 20) << 16);
! 		fid = smb_GetSMBParm(watch, 21);
! 		wtree = smb_GetSMBParm(watch, 22) & 0xffff;  /* TODO: should this be 0xff ? */
! 		maxLen = smb_GetSMBOffsetParm(watch, 5, 1)
! 				| (smb_GetSMBOffsetParm(watch, 6, 1) << 16);
! 		vcp = watch->vcp;
! 
! 		/*
! 		 * Strange hack - bug in NT Client and NT Server that we
! 		 * must emulate?
! 		 */
! 		if (filter == 3 && wtree)
! 			filter = 0x17;
  
! 		fidp = smb_FindFID(vcp, fid, 0);
          if (!fidp) {
              osi_Log1(smb_logp," no fidp for fid[%d]",fid);
!         	lastWatch = watch;
!         	watch = watch->nextp;
!         	continue;
!         }
! 		if (fidp->scp != dscp
! 		    || (filter & notifyFilter) == 0
! 		    || (!isDirectParent && !wtree)) {
              osi_Log1(smb_logp," passing fidp->scp[%x]", fidp->scp);
              smb_ReleaseFID(fidp);
! 			lastWatch = watch;
! 			watch = watch->nextp;
! 			continue;
! 		}
! 		smb_ReleaseFID(fidp);
  
! 		osi_Log4(smb_logp,
! 			 "Sending Change Notification for fid %d filter 0x%x wtree %d file %s",
! 			 fid, filter, wtree, osi_LogSaveString(smb_logp, filename));
! 
! 		nextWatch = watch->nextp;
! 		if (watch == smb_Directory_Watches)
! 			smb_Directory_Watches = nextWatch;
! 		else
! 			lastWatch->nextp = nextWatch;
! 
! 		/* Turn off WATCHED flag in dscp */
! 		lock_ObtainMutex(&dscp->mx);
! 		if (wtree)
! 			dscp->flags &= ~CM_SCACHEFLAG_WATCHEDSUBTREE;
! 		else
! 			dscp->flags &= ~CM_SCACHEFLAG_WATCHED;
! 		lock_ReleaseMutex(&dscp->mx);
! 
! 		/* Convert to response packet */
! 		((smb_t *) watch)->reb = 0x80;
! 		((smb_t *) watch)->wct = 0;
  
! 		/* out parms */
! 		if (filename == NULL)
! 			parmCount = 0;
! 		else {
! 			nameLen = strlen(filename);
! 			parmCount = 3*4 + nameLen*2;
! 			parmCount = (parmCount + 3) & ~3;	/* pad to 4 */
! 			if (twoEntries) {
! 				otherNameLen = strlen(otherFilename);
! 				oldParmCount = parmCount;
! 				parmCount += 3*4 + otherNameLen*2;
! 				parmCount = (parmCount + 3) & ~3; /* pad to 4 */
! 			}
! 			if (maxLen < parmCount)
! 				parmCount = 0;	/* not enough room */
! 		}
! 		parmOffset = 8*4 + 39;
! 		parmOffset += 1;			/* pad to 4 */
! 		dataOffset = parmOffset + parmCount;
! 
! 		parmSlot = 1;
! 		watch->oddByte = 1;
! 		/* Total Parameter Count */
! 		smb_SetSMBParmLong(watch, parmSlot, parmCount); parmSlot += 2;
! 		/* Total Data Count */
! 		smb_SetSMBParmLong(watch, parmSlot, 0); parmSlot += 2;
! 		/* Parameter Count */
! 		smb_SetSMBParmLong(watch, parmSlot, parmCount); parmSlot += 2;
! 		/* Parameter Offset */
! 		smb_SetSMBParmLong(watch, parmSlot, parmOffset); parmSlot += 2;
! 		/* Parameter Displacement */
! 		smb_SetSMBParmLong(watch, parmSlot, 0); parmSlot += 2;
! 		/* Data Count */
! 		smb_SetSMBParmLong(watch, parmSlot, 0); parmSlot += 2;
! 		/* Data Offset */
! 		smb_SetSMBParmLong(watch, parmSlot, dataOffset); parmSlot += 2;
! 		/* Data Displacement */
! 		smb_SetSMBParmLong(watch, parmSlot, 0); parmSlot += 2;
! 		smb_SetSMBParmByte(watch, parmSlot, 0);	/* Setup Count */
! 		smb_SetSMBDataLength(watch, parmCount + 1);
! 
! 		if (parmCount != 0) {
! 			outData = smb_GetSMBData(watch, NULL);
! 			outData++;	/* round to get to parmOffset */
! 			oldOutData = outData;
! 			*((DWORD *)outData) = oldParmCount; outData += 4;
! 					/* Next Entry Offset */
! 			*((DWORD *)outData) = action; outData += 4;
! 					/* Action */
! 			*((DWORD *)outData) = nameLen*2; outData += 4;
! 					/* File Name Length */
! 			mbstowcs((WCHAR *)outData, filename, nameLen);
! 					/* File Name */
! 			if (twoEntries) {
! 				outData = oldOutData + oldParmCount;
! 				*((DWORD *)outData) = 0; outData += 4;
! 					/* Next Entry Offset */
! 				*((DWORD *)outData) = otherAction; outData += 4;
! 					/* Action */
! 				*((DWORD *)outData) = otherNameLen*2;
! 				outData += 4;	/* File Name Length */
! 				mbstowcs((WCHAR *)outData, otherFilename,
! 					 otherNameLen);	/* File Name */
! 			}
! 		}
  
! 		/*
! 		 * If filename is null, we don't know the cause of the
! 		 * change notification.  We return zero data (see above),
! 		 * and set error code to NT_STATUS_NOTIFY_ENUM_DIR
! 		 * (= 0x010C).  We set the error code here by hand, without
! 		 * modifying wct and bcc.
! 		 */
! 		if (filename == NULL) {
! 			((smb_t *) watch)->rcls = 0x0C;
! 			((smb_t *) watch)->reh = 0x01;
! 			((smb_t *) watch)->errLow = 0;
! 			((smb_t *) watch)->errHigh = 0;
! 			/* Set NT Status codes flag */
! 			((smb_t *) watch)->flg2 |= 0x4000;
! 		}
  
! 		smb_SendPacket(vcp, watch);
          smb_ReleaseVC(vcp);
! 		smb_FreePacket(watch);
! 		watch = nextWatch;
! 	}
! 	lock_ReleaseMutex(&smb_Dir_Watch_Lock);
! }
  
  long smb_ReceiveNTCancel(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
  {
! 	unsigned char *replyWctp;
! 	smb_packet_t *watch, *lastWatch;
! 	USHORT fid, watchtree;
! 	smb_fid_t *fidp;
! 	cm_scache_t *scp;
  
! 	osi_Log0(smb_logp, "SMB3 receive NT cancel");
  
! 	lock_ObtainMutex(&smb_Dir_Watch_Lock);
! 	watch = smb_Directory_Watches;
! 	while (watch) {
! 		if (((smb_t *)watch)->uid == ((smb_t *)inp)->uid
! 		    && ((smb_t *)watch)->pid == ((smb_t *)inp)->pid
! 		    && ((smb_t *)watch)->mid == ((smb_t *)inp)->mid
! 		    && ((smb_t *)watch)->tid == ((smb_t *)inp)->tid) {
! 			if (watch == smb_Directory_Watches)
! 				smb_Directory_Watches = watch->nextp;
! 			else
! 				lastWatch->nextp = watch->nextp;
! 			lock_ReleaseMutex(&smb_Dir_Watch_Lock);
  
! 			/* Turn off WATCHED flag in scp */
! 			fid = smb_GetSMBParm(watch, 21);
! 			watchtree = smb_GetSMBParm(watch, 22) & 0xffff;
  
              if (vcp != watch->vcp)
                  osi_Log2(smb_logp, "smb_ReceiveNTCancel: vcp %x not equal to watch vcp %x", 
!                          vcp, watch->vcp);
  
! 			fidp = smb_FindFID(vcp, fid, 0);
              if (fidp) {
                  osi_Log3(smb_logp, "Cancelling change notification for fid %d wtree %d file %s", 
!                          fid, watchtree,
!                          osi_LogSaveString(smb_logp, (fidp)?fidp->NTopen_wholepathp:""));
  
                  scp = fidp->scp;
                  lock_ObtainMutex(&scp->mx);
--- 5861,6071 ----
  	cm_scache_t *dscp, char *filename, char *otherFilename,
  	BOOL isDirectParent)
  {
!     smb_packet_t *watch, *lastWatch, *nextWatch;
!     ULONG parmSlot, parmCount, parmOffset, dataOffset, nameLen;
!     char *outData, *oldOutData;
!     ULONG filter;
!     USHORT fid, wtree;
!     ULONG maxLen;
!     BOOL twoEntries = FALSE;
!     ULONG otherNameLen, oldParmCount = 0;
!     DWORD otherAction;
!     smb_vc_t *vcp;
!     smb_fid_t *fidp;
  
!     /* Get ready for rename within directory */
!     if (action == FILE_ACTION_RENAMED_OLD_NAME && otherFilename != NULL) {
!         twoEntries = TRUE;
!         otherAction = FILE_ACTION_RENAMED_NEW_NAME;
!     }
  
      osi_Log2(smb_logp,"in smb_NotifyChange for file [%s] dscp [%x]",
!              osi_LogSaveString(smb_logp,filename),dscp);
  
!     lock_ObtainMutex(&smb_Dir_Watch_Lock);
!     watch = smb_Directory_Watches;
!     while (watch) {
!         filter = smb_GetSMBParm(watch, 19)
!             | (smb_GetSMBParm(watch, 20) << 16);
!         fid = smb_GetSMBParm(watch, 21);
!         wtree = smb_GetSMBParm(watch, 22) & 0xffff;  /* TODO: should this be 0xff ? */
!         maxLen = smb_GetSMBOffsetParm(watch, 5, 1)
!             | (smb_GetSMBOffsetParm(watch, 6, 1) << 16);
!         vcp = watch->vcp;
! 
!         /*
!          * Strange hack - bug in NT Client and NT Server that we
!          * must emulate?
!          */
!         if (filter == 3 && wtree)
!             filter = 0x17;
  
!         fidp = smb_FindFID(vcp, fid, 0);
          if (!fidp) {
              osi_Log1(smb_logp," no fidp for fid[%d]",fid);
!             lastWatch = watch;
!             watch = watch->nextp;
!             continue;
!         }       
!         if (fidp->scp != dscp
!              || (filter & notifyFilter) == 0
!              || (!isDirectParent && !wtree)) {
              osi_Log1(smb_logp," passing fidp->scp[%x]", fidp->scp);
              smb_ReleaseFID(fidp);
!             lastWatch = watch;
!             watch = watch->nextp;
!             continue;
!         }
!         smb_ReleaseFID(fidp);
  
!         osi_Log4(smb_logp,
!                   "Sending Change Notification for fid %d filter 0x%x wtree %d file %s",
!                   fid, filter, wtree, osi_LogSaveString(smb_logp, filename));
! 
!         nextWatch = watch->nextp;
!         if (watch == smb_Directory_Watches)
!             smb_Directory_Watches = nextWatch;
!         else
!             lastWatch->nextp = nextWatch;
! 
!         /* Turn off WATCHED flag in dscp */
!         lock_ObtainMutex(&dscp->mx);
!         if (wtree)
!             dscp->flags &= ~CM_SCACHEFLAG_WATCHEDSUBTREE;
!         else
!             dscp->flags &= ~CM_SCACHEFLAG_WATCHED;
!         lock_ReleaseMutex(&dscp->mx);
! 
!         /* Convert to response packet */
!         ((smb_t *) watch)->reb = 0x80;
!         ((smb_t *) watch)->wct = 0;
  
!         /* out parms */
!         if (filename == NULL)
!             parmCount = 0;
!         else {
!             nameLen = strlen(filename);
!             parmCount = 3*4 + nameLen*2;
!             parmCount = (parmCount + 3) & ~3;	/* pad to 4 */
!             if (twoEntries) {
!                 otherNameLen = strlen(otherFilename);
!                 oldParmCount = parmCount;
!                 parmCount += 3*4 + otherNameLen*2;
!                 parmCount = (parmCount + 3) & ~3; /* pad to 4 */
!             }
!             if (maxLen < parmCount)
!                 parmCount = 0;	/* not enough room */
!         }
!         parmOffset = 8*4 + 39;
!         parmOffset += 1;			/* pad to 4 */
!         dataOffset = parmOffset + parmCount;
  
!         parmSlot = 1;
!         watch->oddByte = 1;
!         /* Total Parameter Count */
!         smb_SetSMBParmLong(watch, parmSlot, parmCount); parmSlot += 2;
!         /* Total Data Count */
!         smb_SetSMBParmLong(watch, parmSlot, 0); parmSlot += 2;
!         /* Parameter Count */
!         smb_SetSMBParmLong(watch, parmSlot, parmCount); parmSlot += 2;
!         /* Parameter Offset */
!         smb_SetSMBParmLong(watch, parmSlot, parmOffset); parmSlot += 2;
!         /* Parameter Displacement */
!         smb_SetSMBParmLong(watch, parmSlot, 0); parmSlot += 2;
!         /* Data Count */
!         smb_SetSMBParmLong(watch, parmSlot, 0); parmSlot += 2;
!         /* Data Offset */
!         smb_SetSMBParmLong(watch, parmSlot, dataOffset); parmSlot += 2;
!         /* Data Displacement */
!         smb_SetSMBParmLong(watch, parmSlot, 0); parmSlot += 2;
!         smb_SetSMBParmByte(watch, parmSlot, 0);	/* Setup Count */
!         smb_SetSMBDataLength(watch, parmCount + 1);
! 
!         if (parmCount != 0) {
!             outData = smb_GetSMBData(watch, NULL);
!             outData++;	/* round to get to parmOffset */
!             oldOutData = outData;
!             *((DWORD *)outData) = oldParmCount; outData += 4;
!             /* Next Entry Offset */
!             *((DWORD *)outData) = action; outData += 4;
!             /* Action */
!             *((DWORD *)outData) = nameLen*2; outData += 4;
!             /* File Name Length */
!             mbstowcs((WCHAR *)outData, filename, nameLen);
!             /* File Name */
!             if (twoEntries) {
!                 outData = oldOutData + oldParmCount;
!                 *((DWORD *)outData) = 0; outData += 4;
!                 /* Next Entry Offset */
!                 *((DWORD *)outData) = otherAction; outData += 4;
!                 /* Action */
!                 *((DWORD *)outData) = otherNameLen*2;
!                 outData += 4;	/* File Name Length */
!                 mbstowcs((WCHAR *)outData, otherFilename,
!                           otherNameLen);	/* File Name */
!             }       
!         }       
! 
!         /*
!          * If filename is null, we don't know the cause of the
!          * change notification.  We return zero data (see above),
!          * and set error code to NT_STATUS_NOTIFY_ENUM_DIR
!          * (= 0x010C).  We set the error code here by hand, without
!          * modifying wct and bcc.
!          */
!         if (filename == NULL) {
!             ((smb_t *) watch)->rcls = 0x0C;
!             ((smb_t *) watch)->reh = 0x01;
!             ((smb_t *) watch)->errLow = 0;
!             ((smb_t *) watch)->errHigh = 0;
!             /* Set NT Status codes flag */
!             ((smb_t *) watch)->flg2 |= 0x4000;
!         }
  
!         smb_SendPacket(vcp, watch);
          smb_ReleaseVC(vcp);
!         smb_FreePacket(watch);
!         watch = nextWatch;
!     }
!     lock_ReleaseMutex(&smb_Dir_Watch_Lock);
! }       
  
  long smb_ReceiveNTCancel(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
  {
!     unsigned char *replyWctp;
!     smb_packet_t *watch, *lastWatch;
!     USHORT fid, watchtree;
!     smb_fid_t *fidp;
!     cm_scache_t *scp;
  
!     osi_Log0(smb_logp, "SMB3 receive NT cancel");
  
!     lock_ObtainMutex(&smb_Dir_Watch_Lock);
!     watch = smb_Directory_Watches;
!     while (watch) {
!         if (((smb_t *)watch)->uid == ((smb_t *)inp)->uid
!              && ((smb_t *)watch)->pid == ((smb_t *)inp)->pid
!              && ((smb_t *)watch)->mid == ((smb_t *)inp)->mid
!              && ((smb_t *)watch)->tid == ((smb_t *)inp)->tid) {
!             if (watch == smb_Directory_Watches)
!                 smb_Directory_Watches = watch->nextp;
!             else
!                 lastWatch->nextp = watch->nextp;
!             lock_ReleaseMutex(&smb_Dir_Watch_Lock);
  
!             /* Turn off WATCHED flag in scp */
!             fid = smb_GetSMBParm(watch, 21);
!             watchtree = smb_GetSMBParm(watch, 22) & 0xffff;
  
              if (vcp != watch->vcp)
                  osi_Log2(smb_logp, "smb_ReceiveNTCancel: vcp %x not equal to watch vcp %x", 
!                           vcp, watch->vcp);
  
!             fidp = smb_FindFID(vcp, fid, 0);
              if (fidp) {
                  osi_Log3(smb_logp, "Cancelling change notification for fid %d wtree %d file %s", 
!                           fid, watchtree,
!                           osi_LogSaveString(smb_logp, (fidp)?fidp->NTopen_wholepathp:""));
  
                  scp = fidp->scp;
                  lock_ObtainMutex(&scp->mx);
***************
*** 6081,6108 ****
                  osi_Log2(smb_logp,"NTCancel unable to resolve fid [%d] in vcp[%x]", fid,vcp);
              }
  
! 			/* assume STATUS32; return 0xC0000120 (CANCELED) */
! 			replyWctp = watch->wctp;
! 			*replyWctp++ = 0;
! 			*replyWctp++ = 0;
! 			*replyWctp++ = 0;
! 			((smb_t *)watch)->rcls = 0x20;
! 			((smb_t *)watch)->reh = 0x1;
! 			((smb_t *)watch)->errLow = 0;
! 			((smb_t *)watch)->errHigh = 0xC0;
! 			((smb_t *)watch)->flg2 |= 0x4000;
! 			smb_SendPacket(vcp, watch);
              if (watch->vcp)
                  smb_ReleaseVC(watch->vcp);
! 			smb_FreePacket(watch);
! 			return 0;
! 		}
! 		lastWatch = watch;
! 		watch = watch->nextp;
! 	}
! 	lock_ReleaseMutex(&smb_Dir_Watch_Lock);
  
! 	return 0;
  }
  
  void smb3_Init()
--- 6079,6106 ----
                  osi_Log2(smb_logp,"NTCancel unable to resolve fid [%d] in vcp[%x]", fid,vcp);
              }
  
!             /* assume STATUS32; return 0xC0000120 (CANCELED) */
!             replyWctp = watch->wctp;
!             *replyWctp++ = 0;
!             *replyWctp++ = 0;
!             *replyWctp++ = 0;
!             ((smb_t *)watch)->rcls = 0x20;
!             ((smb_t *)watch)->reh = 0x1;
!             ((smb_t *)watch)->errLow = 0;
!             ((smb_t *)watch)->errHigh = 0xC0;
!             ((smb_t *)watch)->flg2 |= 0x4000;
!             smb_SendPacket(vcp, watch);
              if (watch->vcp)
                  smb_ReleaseVC(watch->vcp);
!             smb_FreePacket(watch);
!             return 0;
!         }
!         lastWatch = watch;
!         watch = watch->nextp;
!     }
!     lock_ReleaseMutex(&smb_Dir_Watch_Lock);
  
!     return 0;
  }
  
  void smb3_Init()
Index: openafs/src/WINNT/aklog/aklog.c
diff -c openafs/src/WINNT/aklog/aklog.c:1.5 openafs/src/WINNT/aklog/aklog.c:1.5.2.1
*** openafs/src/WINNT/aklog/aklog.c:1.5	Tue Aug  3 13:27:57 2004
--- openafs/src/WINNT/aklog/aklog.c	Tue Aug 17 00:28:41 2004
***************
*** 181,186 ****
--- 181,187 ----
  {
      static char lastcell[MAXCELLCHARS+1] = { 0 };
      static char confname[512] = { 0 };
+     char username_copy[BUFSIZ];
  	long viceId;			/* AFS uid of user */
  #ifdef ALLOW_REGISTER
      afs_int32 id;
***************
*** 248,254 ****
  #else /* ALLOW_REGISTER */
              if ((*status == 0) && (viceId != ANONYMOUSID))
  #endif /* ALLOW_REGISTER */
!                 sprintf (username, "AFS ID %d", (int) viceId);
  #ifdef ALLOW_REGISTER
              } else if (strcmp(realm_of_user, realm_of_cell) != 0) {
                  if (dflag) {
--- 249,260 ----
  #else /* ALLOW_REGISTER */
              if ((*status == 0) && (viceId != ANONYMOUSID))
  #endif /* ALLOW_REGISTER */
!             {
! #ifdef AFS_ID_TO_NAME
!                 strncpy(username_copy, username, BUFSIZ);
!                 snprintf (username, BUFSIZ, "%s (AFS ID %d)", username_copy, (int) viceId);
! #endif /* AFS_ID_TO_NAME */
!             }
  #ifdef ALLOW_REGISTER
              } else if (strcmp(realm_of_user, realm_of_cell) != 0) {
                  if (dflag) {
***************
*** 263,268 ****
--- 269,275 ----
                      printf("%s: unable to obtain tokens for cell %s "
                              "(status: %d).\n", progname, cell_to_use, status);
                      *status = AKLOG_TOKEN;
+                 return ;
                  }
  
                  /*
***************
*** 274,279 ****
--- 281,287 ----
  
                  if ((*status = pr_Initialize(1L, confname, aserver->cell, 0))) {
                      printf("Error %d\n", status);
+                 return;
                  }
  
                  if ((*status = pr_CreateUser(username, &id))) {
***************
*** 283,289 ****
                  } else {
                      printf("created cross-cell entry for %s at %s\n",
                              username, cell_to_use);
!                     sprintf(username, "AFS ID %d", (int) id);
                  }
              }
          }
--- 291,300 ----
                  } else {
                      printf("created cross-cell entry for %s at %s\n",
                              username, cell_to_use);
! #ifdef AFS_ID_TO_NAME
!                 strncpy(username_copy, username, BUFSIZ);
!                 snprintf (username, BUFSIZ, "%s (AFS ID %d)", username_copy, (int) viceId);
! #endif /* AFS_ID_TO_NAME */
                  }
              }
          }
***************
*** 432,438 ****
  			*s++ = c;
  		}
  		*s++ = 0;
- 
  	}
  	return krbrlm;
  }
--- 443,448 ----
***************
*** 690,697 ****
          memcpy(&atoken.sessionKey, v5cred->keyblock.contents, v5cred->keyblock.length);
          atoken.ticketLen = v5cred->ticket.length;
          memcpy(atoken.ticket, v5cred->ticket.data, atoken.ticketLen);
!     } else 
!     {
          strcpy (username, c.pname);
          if (c.pinst[0])
          {
--- 700,706 ----
          memcpy(&atoken.sessionKey, v5cred->keyblock.contents, v5cred->keyblock.length);
          atoken.ticketLen = v5cred->ticket.length;
          memcpy(atoken.ticket, v5cred->ticket.data, atoken.ticketLen);
!     } else {
          strcpy (username, c.pname);
          if (c.pinst[0])
          {
***************
*** 734,741 ****
  					progname, status);
  				return(AKLOG_KERBEROS);
  			}
! 		} else 
! 		{
  			if ((status = krb_get_tf_realm(TKT_FILE, realm_of_user)) != KSUCCESS)
  			{
  				fprintf(stderr, "%s: Couldn't determine realm of user: %s)",
--- 743,749 ----
  					progname, status);
  				return(AKLOG_KERBEROS);
  			}
!         } else {
  			if ((status = krb_get_tf_realm(TKT_FILE, realm_of_user)) != KSUCCESS)
  			{
  				fprintf(stderr, "%s: Couldn't determine realm of user: %s)",
***************
*** 762,767 ****
--- 770,776 ----
  	*/
  	strncpy(aclient.name, username, MAXKTCNAMELEN - 1);
  	strcpy(aclient.instance, "");
+     
      if (usev5) {
          int len = min(v5cred->client->realm.length,MAXKTCNAMELEN - 1);
          strncpy(aclient.cell, v5cred->client->realm.data, len);
***************
*** 1222,1229 ****
  		for (cur_node = cells.first; cur_node; cur_node = cur_node->next)
  		{
  			memcpy(&cellinfo, cur_node->data, sizeof(cellinfo));
! 			if (status = auth_to_cell(
! 				context, 
  				cellinfo.cell, cellinfo.realm))
  				somethingswrong++;
  		}
--- 1231,1237 ----
  		for (cur_node = cells.first; cur_node; cur_node = cur_node->next)
  		{
  			memcpy(&cellinfo, cur_node->data, sizeof(cellinfo));
!             if (status = auth_to_cell(context, 
  				cellinfo.cell, cellinfo.realm))
  				somethingswrong++;
  		}
***************
*** 1231,1238 ****
  		/* Then, log to all paths in the paths list */
  		for (cur_node = paths.first; cur_node; cur_node = cur_node->next)
  		{
! 			if (status = auth_to_path(
! 				context, 
  				cur_node->data))
  				somethingswrong++;
  		}
--- 1239,1245 ----
  		/* Then, log to all paths in the paths list */
  		for (cur_node = paths.first; cur_node; cur_node = cur_node->next)
  		{
!             if (status = auth_to_path(context, 
  				cur_node->data))
  				somethingswrong++;
  		}
Index: openafs/src/WINNT/client_config/drivemap.cpp
diff -c openafs/src/WINNT/client_config/drivemap.cpp:1.27 openafs/src/WINNT/client_config/drivemap.cpp:1.27.2.1
*** openafs/src/WINNT/client_config/drivemap.cpp:1.27	Tue Aug  3 13:27:57 2004
--- openafs/src/WINNT/client_config/drivemap.cpp	Mon Aug 23 15:38:36 2004
***************
*** 447,453 ****
  {
      HKEY hkMappings;
      RegCreateKeyEx( HKEY_CURRENT_USER,
!                     "SOFTWARE\\OpenAFS\\Client\\Mappings",
                      0, 
                      "AFS", 
                      REG_OPTION_NON_VOLATILE,
--- 447,453 ----
  {
      HKEY hkMappings;
      RegCreateKeyEx( HKEY_CURRENT_USER,
!                     cszSECTION_MAPPINGS,
                      0, 
                      "AFS", 
                      REG_OPTION_NON_VOLATILE,
***************
*** 480,492 ****
  
          RegEnumValue( hkMappings, dwIndex, drive, &driveLen, NULL,
                        &dwType, (LPBYTE)mapping, &mappingLen);
  
!        DRIVEMAP DriveMap;
!        memset (&DriveMap, 0x00, sizeof(DRIVEMAP));
!        DriveMap.chDrive = toupper(*drive);
!        DriveMap.fPersistent = TRUE;
!        if ((DriveMap.chDrive < chDRIVE_A) || (DriveMap.chDrive > chDRIVE_Z))
!            continue;
  
         if (mapping[0] != TEXT('\0'))
         {
--- 480,499 ----
  
          RegEnumValue( hkMappings, dwIndex, drive, &driveLen, NULL,
                        &dwType, (LPBYTE)mapping, &mappingLen);
+         if ( dwType == REG_EXPAND_SZ ) {
+             TCHAR buf[MAX_PATH];
+             DWORD dummyLen = ExpandEnvironmentStrings(buf, mapping, MAX_PATH);
+             if (dummyLen > MAX_PATH)
+                 continue;
+             _tcsncpy(mapping, buf, MAX_PATH);
+         }
  
!         DRIVEMAP DriveMap;
!         memset (&DriveMap, 0x00, sizeof(DRIVEMAP));
!         DriveMap.chDrive = toupper(*drive);
!         DriveMap.fPersistent = TRUE;
!         if ((DriveMap.chDrive < chDRIVE_A) || (DriveMap.chDrive > chDRIVE_Z))
!             continue;
  
         if (mapping[0] != TEXT('\0'))
         {
***************
*** 541,547 ****
  {
      HKEY hkMappings;
      RegCreateKeyEx( HKEY_CURRENT_USER, 
!                     "SOFTWARE\\OpenAFS\\Client\\Mappings",
                      0, 
                      "AFS", 
                      REG_OPTION_NON_VOLATILE,
--- 548,554 ----
  {
      HKEY hkMappings;
      RegCreateKeyEx( HKEY_CURRENT_USER, 
!                     cszSECTION_MAPPINGS,
                      0, 
                      "AFS", 
                      REG_OPTION_NON_VOLATILE,
***************
*** 587,593 ****
             if (!pList->aDriveMap[iDrive].fPersistent)
                 lstrcat (szRHS, TEXT("*"));
  
!            RegSetValueEx( hkMappings, szLHS, 0, REG_SZ, (const BYTE *)szRHS, lstrlen(szRHS) + 1);
         }
     }
     RegCloseKey( hkMappings );
--- 594,600 ----
             if (!pList->aDriveMap[iDrive].fPersistent)
                 lstrcat (szRHS, TEXT("*"));
  
!            RegSetValueEx( hkMappings, szLHS, 0, REG_EXPAND_SZ, (const BYTE *)szRHS, lstrlen(szRHS) + 1);
         }
     }
     RegCloseKey( hkMappings );
Index: openafs/src/WINNT/client_config/isadmin.cpp
diff -c openafs/src/WINNT/client_config/isadmin.cpp:1.2 openafs/src/WINNT/client_config/isadmin.cpp:1.2.20.1
*** openafs/src/WINNT/client_config/isadmin.cpp:1.2	Sat Nov  4 05:02:38 2000
--- openafs/src/WINNT/client_config/isadmin.cpp	Mon Aug 23 11:55:06 2004
***************
*** 50,112 ****
   *
   */
  
  BOOL IsAdmin (void)
  {
!    static BOOL fAdmin = FALSE;
!    static BOOL fTested = FALSE;
!    if (!fTested)
!       {
!       fTested = TRUE;
! 
!       // Obtain the SID for BUILTIN\Administrators. If this is Windows NT,
!       // expect this call to succeed; if it does not, we can presume that
!       // it's not NT and therefore the user always has administrative
!       // privileges.
!       //
!       PSID psidAdmin = NULL;
!       SID_IDENTIFIER_AUTHORITY auth = SECURITY_NT_AUTHORITY;
!       if (!AllocateAndInitializeSid (&auth, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &psidAdmin))
!          fAdmin = TRUE;
!       else
!          {
! 
!          // Then open our current ProcessToken
!          //
!          HANDLE hToken;
!          if (OpenProcessToken (GetCurrentProcess(), TOKEN_QUERY, &hToken))
!             {
  
!             // We'll have to allocate a chunk of memory to store the list of
!             // groups to which this user belongs; find out how much memory
!             // we'll need.
!             //
!             DWORD dwSize = 0;
!             GetTokenInformation (hToken, TokenGroups, NULL, dwSize, &dwSize);
              
!             // Allocate that buffer, and read in the list of groups.
!             //
!             PTOKEN_GROUPS pGroups = (PTOKEN_GROUPS)Allocate (dwSize);
!             if (GetTokenInformation (hToken, TokenGroups, pGroups, dwSize, &dwSize))
!                {
!                // Look through the list of group SIDs and see if any of them
!                // matches the Administrator group SID.
!                //
!                for (size_t iGroup = 0; (!fAdmin) && (iGroup < pGroups->GroupCount); ++iGroup)
!                   {
!                   if (EqualSid (psidAdmin, pGroups->Groups[ iGroup ].Sid))
!                      fAdmin = TRUE;
!                   }
!                }
  
!             if (pGroups)
!                Free (pGroups);
              }
!          }
  
!       if (psidAdmin)
!          FreeSid (psidAdmin);
!       }
  
!    return fAdmin;
  }
  
--- 50,152 ----
   *
   */
  
+ #define AFSCLIENT_ADMIN_GROUPNAME "AFS Client Admins"
+ 
  BOOL IsAdmin (void)
  {
!     static BOOL fAdmin = FALSE;
!     static BOOL fTested = FALSE;
  
!     if (!fTested)
!     {
!         /* Obtain the SID for the AFS client admin group.  If the group does
!          * not exist, then assume we have AFS client admin privileges.
!          */
!         PSID psidAdmin = NULL;
!         DWORD dwSize, dwSize2;
!         char pszAdminGroup[ MAX_COMPUTERNAME_LENGTH + sizeof(AFSCLIENT_ADMIN_GROUPNAME) + 2 ];
!         char *pszRefDomain = NULL;
!         SID_NAME_USE snu = SidTypeGroup;
! 
!         dwSize = sizeof(pszAdminGroup);
! 
!         if (!GetComputerName(pszAdminGroup, &dwSize)) {
!             /* Can't get computer name.  We return false in this case.
!                Retain fAdmin and fTested. This shouldn't happen.*/
!             return FALSE;
!         }
! 
!         fTested = TRUE;
! 
!         dwSize = 0;
!         dwSize2 = 0;
! 
!         strcat(pszAdminGroup,"\\");
!         strcat(pszAdminGroup, AFSCLIENT_ADMIN_GROUPNAME);
! 
!         LookupAccountName(NULL, pszAdminGroup, NULL, &dwSize, NULL, &dwSize2, &snu);
!         /* that should always fail. */
! 
!         if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
!             /* if we can't find the group, then we allow the operation */
!             fAdmin = TRUE;
!             return TRUE;
!         }
! 
!         if (dwSize == 0 || dwSize2 == 0) {
!             /* Paranoia */
!             fAdmin = TRUE;
!             return TRUE;
!         }
! 
!         psidAdmin = (PSID) malloc(dwSize); memset(psidAdmin,0,dwSize);
!         pszRefDomain = (char *)malloc(dwSize2);
! 
!         if (!LookupAccountName(NULL, pszAdminGroup, psidAdmin, &dwSize, pszRefDomain, &dwSize2, &snu)) {
!             /* We can't lookup the group now even though we looked it up earlier.  
!                Could this happen? */
!             fAdmin = TRUE;
!         } else {
!             /* Then open our current ProcessToken */
!             HANDLE hToken;
! 
!             if (OpenProcessToken (GetCurrentProcess(), TOKEN_QUERY, &hToken))
!             {
!                 /* We'll have to allocate a chunk of memory to store the list of
!                  * groups to which this user belongs; find out how much memory
!                  * we'll need.
!                  */
!                 DWORD dwSize = 0;
!                 PTOKEN_GROUPS pGroups;
!                 
!                 GetTokenInformation (hToken, TokenGroups, NULL, dwSize, &dwSize);
              
!                 pGroups = (PTOKEN_GROUPS)malloc(dwSize);
!                 
!                 /* Allocate that buffer, and read in the list of groups. */
!                 if (GetTokenInformation (hToken, TokenGroups, pGroups, dwSize, &dwSize))
!                 {
!                     /* Look through the list of group SIDs and see if any of them
!                      * matches the AFS Client Admin group SID.
!                      */
!                     size_t iGroup = 0;
!                     for (; (!fAdmin) && (iGroup < pGroups->GroupCount); ++iGroup)
!                     {
!                         if (EqualSid (psidAdmin, pGroups->Groups[ iGroup ].Sid)) {
!                             fAdmin = TRUE;
!                         }
!                     }
!                 }
  
!                 if (pGroups)
!                     free(pGroups);
              }
!         }
  
!         free(psidAdmin);
!         free(pszRefDomain);
!     }
  
!     return fAdmin;
  }
  
Index: openafs/src/WINNT/client_creds/ipaddrchg.c
diff -c openafs/src/WINNT/client_creds/ipaddrchg.c:1.1 openafs/src/WINNT/client_creds/ipaddrchg.c:1.1.2.1
*** openafs/src/WINNT/client_creds/ipaddrchg.c:1.1	Thu May  6 10:21:44 2004
--- openafs/src/WINNT/client_creds/ipaddrchg.c	Wed Aug 18 13:11:25 2004
***************
*** 305,329 ****
      strcpy(aserver.cell, rootcell);
  
      rc = ktc_GetToken(&aserver, &atoken, sizeof(atoken), &aclient);
  
!     GetLocalTime (&stNow);
!     SystemTimeToFileTime (&stNow, &ftNow);
!     llNow = (((LONGLONG)ftNow.dwHighDateTime) << 32) + (LONGLONG)(ftNow.dwLowDateTime);
!     llNow /= c100ns1SECOND;
! 
!     TimeToSystemTime (&stExpires, atoken.endTime);
!     SystemTimeToFileTime (&stExpires, &ftExpires);
!     llExpires = (((LONGLONG)ftExpires.dwHighDateTime) << 32) + (LONGLONG)(ftExpires.dwLowDateTime);
!     llExpires /= c100ns1SECOND;
  
!     if (!rc && (llNow < llExpires))
!         goto cleanup;
  
!     if ( IsDebuggerPresent() ) {
!         char message[256];
!         sprintf(message,"ObtainTokensFromUserIfNeeded: %d  now = %ul  endTime = %ul\n",
!                  rc, llNow, llExpires);
!         OutputDebugString(message);
      }
  
  #ifdef USE_FSPROBE
--- 305,330 ----
      strcpy(aserver.cell, rootcell);
  
      rc = ktc_GetToken(&aserver, &atoken, sizeof(atoken), &aclient);
+     if ( rc == 0 ) {
+         GetLocalTime (&stNow);
+         SystemTimeToFileTime (&stNow, &ftNow);
+         llNow = (((LONGLONG)ftNow.dwHighDateTime) << 32) + (LONGLONG)(ftNow.dwLowDateTime);
+         llNow /= c100ns1SECOND;
  
!         TimeToSystemTime (&stExpires, atoken.endTime);
!         SystemTimeToFileTime (&stExpires, &ftExpires);
!         llExpires = (((LONGLONG)ftExpires.dwHighDateTime) << 32) + (LONGLONG)(ftExpires.dwLowDateTime);
!         llExpires /= c100ns1SECOND;
  
!         if (llNow < llExpires)
!             goto cleanup;
  
!         if ( IsDebuggerPresent() ) {
!             char message[256];
!             sprintf(message,"ObtainTokensFromUserIfNeeded: %d  now = %ul  endTime = %ul\n",
!                      rc, llNow, llExpires);
!             OutputDebugString(message);
!         }
      }
  
  #ifdef USE_FSPROBE
Index: openafs/src/WINNT/client_exp/gui2fs.cpp
diff -c openafs/src/WINNT/client_exp/gui2fs.cpp:1.10.2.1 openafs/src/WINNT/client_exp/gui2fs.cpp:1.10.2.2
*** openafs/src/WINNT/client_exp/gui2fs.cpp:1.10.2.1	Mon Aug  9 16:57:13 2004
--- openafs/src/WINNT/client_exp/gui2fs.cpp	Wed Aug 18 13:52:30 2004
***************
*** 1477,1483 ****
  {
  	int cellNum;
  	int rc;
! 	int current_time;
  	time_t tokenExpireTime;
  	char *expireString;
  	char userName[100];
--- 1477,1483 ----
  {
  	int cellNum;
  	int rc;
! 	time_t current_time;
  	time_t tokenExpireTime;
  	char *expireString;
  	char userName[100];
Index: openafs/src/WINNT/client_osi/osiutils.c
diff -c openafs/src/WINNT/client_osi/osiutils.c:1.3 openafs/src/WINNT/client_osi/osiutils.c:1.3.2.1
*** openafs/src/WINNT/client_osi/osiutils.c:1.3	Wed May 28 14:34:40 2003
--- openafs/src/WINNT/client_osi/osiutils.c	Tue Aug 17 00:28:42 2004
***************
*** 104,110 ****
      if (b == 0) { return result; }
      if (b == 1) { *remainder = 0; return a; }
  
! 	a1=(a.HighPart << 32) | a.LowPart;
  	q1=a1/b;
  	r1=a1-(q1*b);
  	if (r1 > ULONG_MAX) /*XXX */;
--- 104,112 ----
      if (b == 0) { return result; }
      if (b == 1) { *remainder = 0; return a; }
  
!     a1 = a.HighPart;
!     a1 <<= 32;
!     a1 |= a.LowPart;
  	q1=a1/b;
  	r1=a1-(q1*b);
  	if (r1 > ULONG_MAX) /*XXX */;
***************
*** 127,134 ****
  		return a; 
  	}
  
! 	a1=(a.HighPart << 32) | a.LowPart;
! 	b1=(b.HighPart << 32) | a.LowPart;
  	q1=a1/b1;
  	r1=a1-(q1*b1);
  	result.HighPart=q1 >> 32;
--- 129,140 ----
  		return a; 
  	}
  
!     a1 = a.HighPart;
!     a1 <<= 32;
!     a1 |= a.LowPart;
!     b1 = b.HighPart;
!     b1 <<= 32;
!     b1 |= b.LowPart;
  	q1=a1/b1;
  	r1=a1-(q1*b1);
  	result.HighPart=q1 >> 32;
Index: openafs/src/WINNT/install/NSIS/AdminGroup.cpp
diff -c /dev/null openafs/src/WINNT/install/NSIS/AdminGroup.cpp:1.1.2.1
*** /dev/null	Wed Aug 25 03:47:52 2004
--- openafs/src/WINNT/install/NSIS/AdminGroup.cpp	Mon Aug 23 11:55:07 2004
***************
*** 0 ****
--- 1,89 ----
+ #include<windows.h>
+ #include<string.h>
+ #include<stdio.h>
+ #include<lm.h>
+ 
+ #pragma comment(lib,"netapi32.lib")
+ 
+ #define AFSCLIENT_ADMIN_GROUPNAMEW L"AFS Client Admins"
+ #define AFSCLIENT_ADMIN_COMMENTW L"AFS Client Administrators"
+ 
+ UINT createAfsAdminGroup(void) {
+     LOCALGROUP_INFO_1 gInfo;
+     DWORD dwError;
+     NET_API_STATUS status;
+ 
+     gInfo.lgrpi1_name = AFSCLIENT_ADMIN_GROUPNAMEW;
+     gInfo.lgrpi1_comment = AFSCLIENT_ADMIN_COMMENTW;
+     status = NetLocalGroupAdd(NULL, 1, (LPBYTE) &gInfo, &dwError);
+ 
+     return status;
+ }
+ 
+ UINT initializeAfsAdminGroup(void) {
+     PSID psidAdmin = NULL;
+     SID_IDENTIFIER_AUTHORITY auth = SECURITY_NT_AUTHORITY;
+     NET_API_STATUS status;
+     LOCALGROUP_MEMBERS_INFO_0 *gmAdmins = NULL;
+     DWORD dwNEntries, dwTEntries;
+ 
+     status = NetLocalGroupGetMembers(NULL, L"Administrators", 0, (LPBYTE *) &gmAdmins, MAX_PREFERRED_LENGTH, &dwNEntries, &dwTEntries, NULL);
+     if(status)
+         return status;
+ 
+     status = NetLocalGroupAddMembers(NULL, AFSCLIENT_ADMIN_GROUPNAMEW, 0, (LPBYTE) gmAdmins, dwNEntries);
+ 
+     NetApiBufferFree( gmAdmins );
+ 
+     return status;
+ }
+ 
+ UINT removeAfsAdminGroup(void) {
+     NET_API_STATUS status;
+     status = NetLocalGroupDel(NULL, AFSCLIENT_ADMIN_GROUPNAMEW);
+     return status;
+ }
+ 
+ void showUsage(char * progname) {
+     printf(
+         "Usage: %s [-create | -remove]\n"
+         "  -create : Create AFS Client Admins group and populate it with\n"
+         "            the members of the Administrators group\n"
+         "  -remove : Remove the AFS Client Admins group\n"
+         , progname);
+ }
+ 
+ int main(int argc, char ** argv) {
+ 
+     UINT rv = 0;
+ 
+     if(argc < 2) {
+         showUsage(argv[0]);
+         return 1;
+     }
+ 
+     if(stricmp(argv[1], "-create")) {
+         rv = createAfsAdminGroup();
+         if(rv) {
+             if(rv != ERROR_ALIAS_EXISTS) {
+             fprintf(stderr, "%s: Can't create AFS Client Admin group. NetApi error %u\n", rv);
+             } else {
+                 /* The group already exists. (Preserved config from a
+                    prior install). */
+                 rv = 0;
+             }
+         } else {
+             rv = initializeAfsAdminGroup();
+             if(rv)
+                 fprintf(stderr, "%s: Can't populate AFS Client Admin group. NetApi error %u\n", rv);
+         }
+     } else if(stricmp(argv[1], "-remove")) {
+         removeAfsAdminGroup();
+         rv = 0;
+     } else {
+         showUsage(argv[0]);
+         rv = 0;
+     }
+ 
+     return rv;
+ }
\ No newline at end of file
Index: openafs/src/WINNT/install/NSIS/CellServDB
diff -c openafs/src/WINNT/install/NSIS/CellServDB:1.2 openafs/src/WINNT/install/NSIS/CellServDB:1.2.2.1
*** openafs/src/WINNT/install/NSIS/CellServDB:1.2	Thu Jul 15 23:38:34 2004
--- openafs/src/WINNT/install/NSIS/CellServDB	Tue Aug 17 16:17:16 2004
***************
*** 1,4 ****
! >grand.central.org      #GCO Public CellServDB 29 Jun 2004
  18.7.14.88                      #grand-opening.mit.edu
  128.2.191.224                   #penn.central.org
  >wu-wien.ac.at          #University of Economics, Vienna, Austria
--- 1,4 ----
! >grand.central.org      #GCO Public CellServDB 17 Aug 2004
  18.7.14.88                      #grand-opening.mit.edu
  128.2.191.224                   #penn.central.org
  >wu-wien.ac.at          #University of Economics, Vienna, Austria
***************
*** 116,121 ****
--- 116,123 ----
  >physik.uni-wuppertal.de #Physics department of Bergische Universität Wuppertal
  132.195.104.3                   #afs1.physik.uni-wuppertal.de
  132.195.104.230                 #afs2.physik.uni-wuppertal.de
+ >s-et.aau.dk            #Aalborg Univ., The Student Society, Denmark
+ 130.225.196.22                  #afs.s-et.aau.dk
  >ies.auc.dk             #Aalborg Univ., Inst. of Electronic Systems, Denmark
  130.225.51.73                   #afsdb1.kom.auc.dk
  130.225.51.74                   #afsdb2.kom.auc.dk
***************
*** 152,157 ****
--- 154,162 ----
  >qatar.cmu.edu          #Carnegie Mellon University - Qatar Campus Cell
  204.194.25.7                    #afs1.qatar.cmu.edu
  204.194.25.8                    #afs2.qatar.cmu.edu
+ >sbp.ri.cmu.edu         #Carnegie Mellon University - Sensor Based Planning Lab
+ 128.2.105.174                   #voronoi.sbp.ri.cmu.edu
+ 128.2.105.175                   #nihao.sbp.ri.cmu.edu
  >msc.cornell.edu        #Cornell University Materials Science Center
  128.84.231.242                  #miranda.ccmr.cornell.edu
  128.84.241.35                   #co.ccmr.cornell.edu
***************
*** 250,261 ****
  130.85.24.101                   #db1.afs.umbc.edu
  >glue.umd.edu           #University of Maryland - Project Glue
  128.8.70.11                     #olmec.umd.edu
! 128.8.73.3                      #babylon.umd.edu
! 129.2.128.53                    #egypt.umd.edu
  >wam.umd.edu            #University of Maryland Network WAM Project
  128.8.70.9                      #csc-srv.wam.umd.edu
! 128.8.73.9                      #pg2-srv.wam.umd.edu
! 129.2.128.54                    #avw-srv.wam.umd.edu
  >umich.edu              #University of Michigan - Campus
  141.211.1.32                    #fear.ifs.umich.edu
  141.211.1.33                    #surprise.ifs.umich.edu
--- 255,266 ----
  130.85.24.101                   #db1.afs.umbc.edu
  >glue.umd.edu           #University of Maryland - Project Glue
  128.8.70.11                     #olmec.umd.edu
! 128.8.236.4                     #egypt.umd.edu
! 128.8.236.230                   #babylon.umd.edu
  >wam.umd.edu            #University of Maryland Network WAM Project
  128.8.70.9                      #csc-srv.wam.umd.edu
! 128.8.236.5                     #avw-srv.wam.umd.edu
! 128.8.236.231                   #ptx-srv.wam.umd.edu
  >umich.edu              #University of Michigan - Campus
  141.211.1.32                    #fear.ifs.umich.edu
  141.211.1.33                    #surprise.ifs.umich.edu
Index: openafs/src/WINNT/install/NSIS/NTMakefile
diff -c openafs/src/WINNT/install/NSIS/NTMakefile:1.13 openafs/src/WINNT/install/NSIS/NTMakefile:1.13.2.1
*** openafs/src/WINNT/install/NSIS/NTMakefile:1.13	Wed Jun 23 03:37:57 2004
--- openafs/src/WINNT/install/NSIS/NTMakefile	Mon Aug 23 11:55:07 2004
***************
*** 22,27 ****
--- 22,33 ----
  $(EXEDIR)\Killer.exe: $(OUT)\Killer.obj
        $(EXECONLINK) $(OUT)\Killer.obj
  
+ $(OUT)\AdminGroup.obj: AdminGroup.cpp
+       $(C2OBJ) AdminGroup.cpp
+ 
+ $(EXEDIR)\AdminGroup.exe: $(OUT)\AdminGroup.obj
+       $(EXECONLINK) $(OUT)\AdminGroup.obj
+ 
  prebuild:
  !IF ("$(AFSDEV_BUILDTYPE)" == "FREE")
  !IF ("$(AFSVER_CL)"=="1310")
***************
*** 81,87 ****
  build: prebuild
     "C:\Program Files\NSIS\makensis.exe" /DINCLUDEDIR=$(OUT) OpenAFS.nsi
  
! install: $(OUT)\Service.obj $(EXEDIR)\Service.exe $(OUT)\Killer.obj $(EXEDIR)\Killer.exe build
  
  #clean:
  #   $(DEL) $(OUT)\Service.obj
--- 87,93 ----
  build: prebuild
     "C:\Program Files\NSIS\makensis.exe" /DINCLUDEDIR=$(OUT) OpenAFS.nsi
  
! install: $(OUT)\Service.obj $(EXEDIR)\Service.exe $(OUT)\Killer.obj $(EXEDIR)\Killer.exe $(EXEDIR)\AdminGroup.exe build
  
  #clean:
  #   $(DEL) $(OUT)\Service.obj
Index: openafs/src/WINNT/install/NSIS/OpenAFS.nsi
diff -c openafs/src/WINNT/install/NSIS/OpenAFS.nsi:1.69.2.2 openafs/src/WINNT/install/NSIS/OpenAFS.nsi:1.69.2.3
*** openafs/src/WINNT/install/NSIS/OpenAFS.nsi:1.69.2.2	Tue Aug 10 00:10:48 2004
--- openafs/src/WINNT/install/NSIS/OpenAFS.nsi	Mon Aug 23 11:55:07 2004
***************
*** 550,555 ****
--- 550,559 ----
    ; Get AFS CellServDB file
    Call afs.GetCellServDB
  
+   GetTempFileName $R0
+   File /oname=$R0 "${AFS_WININSTALL_DIR}\AdminGroup.exe"
+   nsExec::Exec '$R0 -create'
+ 
  !ifdef INSTALL_KFW
    ; Include Kerberos for Windows files in the installer...
    SetOutPath "$INSTDIR\kfw\bin\"
***************
*** 625,631 ****
    ReadINIStr $R1 $2 "Field 13" "State"
    StrCmp $R1 "1" +1 +2
    StrCpy $R2 "$R2-S"
!   
    WriteRegStr HKLM "SOFTWARE\OpenAFS\Client" "AfscredsShortcutParams" "$R2"
    
    CreateShortCut "$SMPROGRAMS\OpenAFS\Client\Authentication.lnk" "$INSTDIR\Client\Program\afscreds.exe" "$R2"
--- 629,635 ----
    ReadINIStr $R1 $2 "Field 13" "State"
    StrCmp $R1 "1" +1 +2
    StrCpy $R2 "$R2-S"
!  
    WriteRegStr HKLM "SOFTWARE\OpenAFS\Client" "AfscredsShortcutParams" "$R2"
    
    CreateShortCut "$SMPROGRAMS\OpenAFS\Client\Authentication.lnk" "$INSTDIR\Client\Program\afscreds.exe" "$R2"
***************
*** 1699,1704 ****
--- 1703,1712 ----
  !ENDIF
    Delete "$INSTDIR\Client\afsdns.ini"
    
+   GetTempFileName $R0
+   File /oname=$R0 "${AFS_WININSTALL_DIR}\AdminGroup.exe"
+   nsExec::Exec '$R0 -remove'
+ 
    SkipDel:
    Delete "$WINDIR\afsd_init.log"
    Delete "$INSTDIR\Uninstall.exe"
Index: openafs/src/WINNT/install/Win9x/CellServDB
diff -c openafs/src/WINNT/install/Win9x/CellServDB:1.2 openafs/src/WINNT/install/Win9x/CellServDB:1.2.2.1
*** openafs/src/WINNT/install/Win9x/CellServDB:1.2	Tue May 11 18:33:42 2004
--- openafs/src/WINNT/install/Win9x/CellServDB	Tue Aug 17 16:17:19 2004
***************
*** 1,4 ****
! >grand.central.org      #GCO Public CellServDB 11 May 2004
  18.7.14.88                      #grand-opening.mit.edu
  128.2.191.224                   #penn.central.org
  >wu-wien.ac.at          #University of Economics, Vienna, Austria
--- 1,4 ----
! >grand.central.org      #GCO Public CellServDB 17 Aug 2004
  18.7.14.88                      #grand-opening.mit.edu
  128.2.191.224                   #penn.central.org
  >wu-wien.ac.at          #University of Economics, Vienna, Austria
***************
*** 75,84 ****
  134.109.200.7                   #aetius.hrz.tu-chemnitz.de
  >e18.ph.tum.de          #Experimental Physics, TU Munich, Germany
  129.187.154.223                 #hamlet.e18.physik.tu-muenchen.de
! >uni-bonn.de            #Cell name
  131.220.14.198                  #work15-eth.rhrz.uni-bonn.de
- 131.220.14.203                  #node03-en2.rhrz.uni-bonn.de
  131.220.14.205                  #node05.rhrz.uni-bonn.de
  >uni-freiburg.de        #Albert-Ludwigs-Universitat Freiburg
  132.230.6.235                   #sv6.ruf.uni-freiburg.de
  132.230.6.236                   #sv7.ruf.uni-freiburg.de
--- 75,86 ----
  134.109.200.7                   #aetius.hrz.tu-chemnitz.de
  >e18.ph.tum.de          #Experimental Physics, TU Munich, Germany
  129.187.154.223                 #hamlet.e18.physik.tu-muenchen.de
! >uni-bonn.de            #University of Bonn, Computing Center
  131.220.14.198                  #work15-eth.rhrz.uni-bonn.de
  131.220.14.205                  #node05.rhrz.uni-bonn.de
+ 131.220.15.197                  #afs-db1.rhrz.uni-bonn.de
+ >atlass01.physik.uni-bonn.de #Bonn ATLAS
+ 131.220.165.43                  #atlass01.physik.uni-bonn.de
  >uni-freiburg.de        #Albert-Ludwigs-Universitat Freiburg
  132.230.6.235                   #sv6.ruf.uni-freiburg.de
  132.230.6.236                   #sv7.ruf.uni-freiburg.de
***************
*** 108,123 ****
  >physik.uni-mainz.de    #institute of physics, university Mainz, Germany
  134.93.130.93                   #hardy.physik.uni-mainz.de
  >uni-mannheim.de        #Uni Mannheim (Rechenzentrum)
! 134.155.50.165                  #afsdbx.uni-mannheim.de
! 134.155.50.166                  #afsdby.uni-mannheim.de
! 134.155.50.167                  #afsdbz.uni-mannheim.de
  >physik.uni-wuppertal.de #Physics department of Bergische Universität Wuppertal
  132.195.104.3                   #afs1.physik.uni-wuppertal.de
  132.195.104.230                 #afs2.physik.uni-wuppertal.de
  >ies.auc.dk             #Aalborg Univ., Inst. of Electronic Systems, Denmark
  130.225.51.73                   #afsdb1.kom.auc.dk
  130.225.51.74                   #afsdb2.kom.auc.dk
  130.225.51.85                   #afsdb3.kom.auc.dk
  >hep.caltech.edu        #CalTech High Energy Physics
  131.215.126.150                 #afs.hep.caltech.edu
  >andrew.cmu.edu         #Carnegie Mellon University - Computing Services Cell
--- 110,132 ----
  >physik.uni-mainz.de    #institute of physics, university Mainz, Germany
  134.93.130.93                   #hardy.physik.uni-mainz.de
  >uni-mannheim.de        #Uni Mannheim (Rechenzentrum)
! 134.155.97.204                  #afsdb1.uni-mannheim.de
! 134.155.97.205                  #afsdb2.uni-mannheim.de
! 134.155.97.206                  #afsdb3.uni-mannheim.de
  >physik.uni-wuppertal.de #Physics department of Bergische Universität Wuppertal
  132.195.104.3                   #afs1.physik.uni-wuppertal.de
  132.195.104.230                 #afs2.physik.uni-wuppertal.de
+ >s-et.aau.dk            #Aalborg Univ., The Student Society, Denmark
+ 130.225.196.22                  #afs.s-et.aau.dk
  >ies.auc.dk             #Aalborg Univ., Inst. of Electronic Systems, Denmark
  130.225.51.73                   #afsdb1.kom.auc.dk
  130.225.51.74                   #afsdb2.kom.auc.dk
  130.225.51.85                   #afsdb3.kom.auc.dk
+ >asu.edu                #Arizona State University
+ 129.219.10.69                   #authen2.asu.edu
+ 129.219.10.70                   #authen1.asu.edu
+ 129.219.10.72                   #authen3.asu.edu
+ 129.219.100.16                  #authen4.asu.edu
  >hep.caltech.edu        #CalTech High Energy Physics
  131.215.126.150                 #afs.hep.caltech.edu
  >andrew.cmu.edu         #Carnegie Mellon University - Computing Services Cell
***************
*** 142,147 ****
--- 151,162 ----
  128.2.129.9                     #e-xing.ece.cmu.edu
  >scotch.ece.cmu.edu     #CMU ECE CALCM research group
  128.2.134.82                    #lagavulin.ece.cmu.edu
+ >qatar.cmu.edu          #Carnegie Mellon University - Qatar Campus Cell
+ 204.194.25.7                    #afs1.qatar.cmu.edu
+ 204.194.25.8                    #afs2.qatar.cmu.edu
+ >sbp.ri.cmu.edu         #Carnegie Mellon University - Sensor Based Planning Lab
+ 128.2.105.174                   #voronoi.sbp.ri.cmu.edu
+ 128.2.105.175                   #nihao.sbp.ri.cmu.edu
  >msc.cornell.edu        #Cornell University Materials Science Center
  128.84.231.242                  #miranda.ccmr.cornell.edu
  128.84.241.35                   #co.ccmr.cornell.edu
***************
*** 233,251 ****
  >ncsa.uiuc.edu          #University of Illinois
  141.142.3.5                     #congo.ncsa.uiuc.edu
  141.142.3.8                     #nile.ncsa.uiuc.edu
! 141.142.230.19                  #jinx.ncsa.uiuc.edu
  >umbc.edu               #University of Maryland, Baltimore County
  130.85.24.23                    #db2.afs.umbc.edu
  130.85.24.87                    #db3.afs.umbc.edu
  130.85.24.101                   #db1.afs.umbc.edu
  >glue.umd.edu           #University of Maryland - Project Glue
  128.8.70.11                     #olmec.umd.edu
! 128.8.73.3                      #babylon.umd.edu
! 129.2.128.53                    #egypt.umd.edu
  >wam.umd.edu            #University of Maryland Network WAM Project
  128.8.70.9                      #csc-srv.wam.umd.edu
! 128.8.73.9                      #pg2-srv.wam.umd.edu
! 129.2.128.54                    #avw-srv.wam.umd.edu
  >umich.edu              #University of Michigan - Campus
  141.211.1.32                    #fear.ifs.umich.edu
  141.211.1.33                    #surprise.ifs.umich.edu
--- 248,266 ----
  >ncsa.uiuc.edu          #University of Illinois
  141.142.3.5                     #congo.ncsa.uiuc.edu
  141.142.3.8                     #nile.ncsa.uiuc.edu
! 141.142.3.9                     #kaskaskia.ncsa.uiuc.edu
  >umbc.edu               #University of Maryland, Baltimore County
  130.85.24.23                    #db2.afs.umbc.edu
  130.85.24.87                    #db3.afs.umbc.edu
  130.85.24.101                   #db1.afs.umbc.edu
  >glue.umd.edu           #University of Maryland - Project Glue
  128.8.70.11                     #olmec.umd.edu
! 128.8.236.4                     #egypt.umd.edu
! 128.8.236.230                   #babylon.umd.edu
  >wam.umd.edu            #University of Maryland Network WAM Project
  128.8.70.9                      #csc-srv.wam.umd.edu
! 128.8.236.5                     #avw-srv.wam.umd.edu
! 128.8.236.231                   #ptx-srv.wam.umd.edu
  >umich.edu              #University of Michigan - Campus
  141.211.1.32                    #fear.ifs.umich.edu
  141.211.1.33                    #surprise.ifs.umich.edu
***************
*** 258,265 ****
  141.211.133.5                   #babylon.citi.umich.edu
  >lsa.umich.edu          #University of Michigan - College of LS&A
  141.211.54.132                  #curtis.admin.lsa.umich.edu
! 141.211.61.23                   #zee.admin.lsa.umich.edu
! 141.211.68.15                   #marshall.lsa.umich.edu
  >math.lsa.umich.edu     #University of Michigan - Math Department
  141.211.61.40                   #ike.math.lsa.umich.edu
  141.211.61.41                   #clark.math.lsa.umich.edu
--- 273,281 ----
  141.211.133.5                   #babylon.citi.umich.edu
  >lsa.umich.edu          #University of Michigan - College of LS&A
  141.211.54.132                  #curtis.admin.lsa.umich.edu
! 141.211.211.53                  #gerow.lsa.umich.edu
! 141.211.211.72                  #collines.lsa.umich.edu
! 141.211.211.153                 #hodges.lsa.umich.edu
  >math.lsa.umich.edu     #University of Michigan - Math Department
  141.211.61.40                   #ike.math.lsa.umich.edu
  141.211.61.41                   #clark.math.lsa.umich.edu
***************
*** 406,411 ****
--- 422,430 ----
  >dementia.org           #Dementia Unlimited
  128.2.12.45                     #alycia.dementia.org
  128.2.120.216                   #meredith.dementia.org
+ >hackish.org            #Hackish.org
+ 24.167.65.213                   #avatar.sys.hackish.org
+ 128.2.120.138                   #kurma.sys.hackish.org
  >idahofuturetruck.org   #University of Idaho hybrid vehicle development
  12.18.238.210                   #dsle210.fsr.net
  >nimlabs.org            #Nimlabs, Ink. Cell.
***************
*** 413,418 ****
--- 432,438 ----
  18.238.1.105                    #caerbanog.nimlabs.org
  >nomh.org               #nomh.org
  204.29.154.12                   #iota.nomh.org
+ 204.29.154.32                   #adversity.xi.nomh.org
  >oc7.org                #The OC7 Project
  128.2.6.107                     #vice3.oc7.org
  128.2.122.140                   #vice2.oc7.org
***************
*** 442,448 ****
  130.237.57.72                   #morpheus.md.kth.se
  130.237.67.230                  #neo.speech.kth.se
  >mech.kth.se            #Royal Institute of Technology, MECH
- 130.237.233.142                 #matterhorn.mech.kth.se
  130.237.233.143                 #castor.mech.kth.se
  130.237.233.144                 #pollux.mech.kth.se
  >nada.kth.se            #Royal Institute of Technology, NADA
--- 462,467 ----
***************
*** 469,474 ****
--- 488,494 ----
  >su.se                  #Stockholm University
  130.237.162.81                  #afsdb1.su.se
  130.237.162.82                  #afsdb2.su.se
+ 130.237.162.230                 #afsdb3.su.se
  >f9.ijs.si              #F9, Jozef Stefan Institue
  194.249.156.1                   #brenta.ijs.si
  >p-ng.si                #Nova Gorica Polytechnic
Index: openafs/src/WINNT/install/wix/CellServDB
diff -c openafs/src/WINNT/install/wix/CellServDB:1.2 openafs/src/WINNT/install/wix/CellServDB:1.2.2.1
*** openafs/src/WINNT/install/wix/CellServDB:1.2	Thu Jul 15 23:38:36 2004
--- openafs/src/WINNT/install/wix/CellServDB	Tue Aug 17 16:17:20 2004
***************
*** 1,4 ****
! >grand.central.org      #GCO Public CellServDB 29 Jun 2004
  18.7.14.88                      #grand-opening.mit.edu
  128.2.191.224                   #penn.central.org
  >wu-wien.ac.at          #University of Economics, Vienna, Austria
--- 1,4 ----
! >grand.central.org      #GCO Public CellServDB 17 Aug 2004
  18.7.14.88                      #grand-opening.mit.edu
  128.2.191.224                   #penn.central.org
  >wu-wien.ac.at          #University of Economics, Vienna, Austria
***************
*** 116,121 ****
--- 116,123 ----
  >physik.uni-wuppertal.de #Physics department of Bergische Universität Wuppertal
  132.195.104.3                   #afs1.physik.uni-wuppertal.de
  132.195.104.230                 #afs2.physik.uni-wuppertal.de
+ >s-et.aau.dk            #Aalborg Univ., The Student Society, Denmark
+ 130.225.196.22                  #afs.s-et.aau.dk
  >ies.auc.dk             #Aalborg Univ., Inst. of Electronic Systems, Denmark
  130.225.51.73                   #afsdb1.kom.auc.dk
  130.225.51.74                   #afsdb2.kom.auc.dk
***************
*** 152,157 ****
--- 154,162 ----
  >qatar.cmu.edu          #Carnegie Mellon University - Qatar Campus Cell
  204.194.25.7                    #afs1.qatar.cmu.edu
  204.194.25.8                    #afs2.qatar.cmu.edu
+ >sbp.ri.cmu.edu         #Carnegie Mellon University - Sensor Based Planning Lab
+ 128.2.105.174                   #voronoi.sbp.ri.cmu.edu
+ 128.2.105.175                   #nihao.sbp.ri.cmu.edu
  >msc.cornell.edu        #Cornell University Materials Science Center
  128.84.231.242                  #miranda.ccmr.cornell.edu
  128.84.241.35                   #co.ccmr.cornell.edu
***************
*** 250,261 ****
  130.85.24.101                   #db1.afs.umbc.edu
  >glue.umd.edu           #University of Maryland - Project Glue
  128.8.70.11                     #olmec.umd.edu
! 128.8.73.3                      #babylon.umd.edu
! 129.2.128.53                    #egypt.umd.edu
  >wam.umd.edu            #University of Maryland Network WAM Project
  128.8.70.9                      #csc-srv.wam.umd.edu
! 128.8.73.9                      #pg2-srv.wam.umd.edu
! 129.2.128.54                    #avw-srv.wam.umd.edu
  >umich.edu              #University of Michigan - Campus
  141.211.1.32                    #fear.ifs.umich.edu
  141.211.1.33                    #surprise.ifs.umich.edu
--- 255,266 ----
  130.85.24.101                   #db1.afs.umbc.edu
  >glue.umd.edu           #University of Maryland - Project Glue
  128.8.70.11                     #olmec.umd.edu
! 128.8.236.4                     #egypt.umd.edu
! 128.8.236.230                   #babylon.umd.edu
  >wam.umd.edu            #University of Maryland Network WAM Project
  128.8.70.9                      #csc-srv.wam.umd.edu
! 128.8.236.5                     #avw-srv.wam.umd.edu
! 128.8.236.231                   #ptx-srv.wam.umd.edu
  >umich.edu              #University of Michigan - Campus
  141.211.1.32                    #fear.ifs.umich.edu
  141.211.1.33                    #surprise.ifs.umich.edu
Index: openafs/src/WINNT/install/wix/NTMakefile
diff -c openafs/src/WINNT/install/wix/NTMakefile:1.2 openafs/src/WINNT/install/wix/NTMakefile:1.2.2.1
*** openafs/src/WINNT/install/wix/NTMakefile:1.2	Thu Jul 15 23:56:50 2004
--- openafs/src/WINNT/install/wix/NTMakefile	Fri Aug 20 16:15:19 2004
***************
*** 16,22 ****
  	registry.wxi \
  	lang\$(LANG)\ui.wxi
  
! WIXOBJ = $(OJT)\openafs-$(LANG).wixobj
  
  LANGUAGES=en_US de_DE es_ES ja_JP ko_KR pt_BR zh_CN zh_TW
  
--- 16,22 ----
  	registry.wxi \
  	lang\$(LANG)\ui.wxi
  
! WIXOBJ = $(OUT)\openafs-$(LANG).wixobj
  
  LANGUAGES=en_US de_DE es_ES ja_JP ko_KR pt_BR zh_CN zh_TW
  
***************
*** 53,58 ****
--- 53,59 ----
  		-dVersionMajor=$(AFSPRODUCT_VER_MAJOR)	\
  		-dVersionMinor=$(AFSPRODUCT_VER_MINOR)	\
  		-dVersionPatch=$(AFSPRODUCT_VER_PATCH)	\
+ 		-dProductCode=$(AFSPRODUCT_VER_GUID)	\
  		"-dDestDir=$(DESTDIR)\\" \
  		-dCellDbFile=CellServDB \
  		-v0 \
Index: openafs/src/WINNT/install/wix/feature.wxi
diff -c openafs/src/WINNT/install/wix/feature.wxi:1.5 openafs/src/WINNT/install/wix/feature.wxi:1.5.2.1
*** openafs/src/WINNT/install/wix/feature.wxi:1.5	Wed Aug  4 12:36:15 2004
--- openafs/src/WINNT/install/wix/feature.wxi	Fri Aug 20 16:15:19 2004
***************
*** 92,98 ****
                  <ComponentRef Id="cmf_rxdebug_EXE" />
                  <ComponentRef Id="cmf_backup_EXE" />
                  <ComponentRef Id="cmf_aklog_EXE" />
! 
                  <!-- Runtime -->
                  <?include runtime.wxi?>
              </Feature>
--- 92,98 ----
                  <ComponentRef Id="cmf_rxdebug_EXE" />
                  <ComponentRef Id="cmf_backup_EXE" />
                  <ComponentRef Id="cmf_aklog_EXE" />
!                 
                  <!-- Runtime -->
                  <?include runtime.wxi?>
              </Feature>
Index: openafs/src/WINNT/install/wix/files.wxi
diff -c openafs/src/WINNT/install/wix/files.wxi:1.9.2.1 openafs/src/WINNT/install/wix/files.wxi:1.9.2.2
*** openafs/src/WINNT/install/wix/files.wxi:1.9.2.1	Tue Aug 10 00:10:50 2004
--- openafs/src/WINNT/install/wix/files.wxi	Fri Aug 20 16:15:19 2004
***************
*** 1,6 ****
  <?xml version="1.0"?>
  <Include>
!     <Directory Id="SystemFolder">
          <Component Id="cmf_afslogon_DLL" Guid="123197FE-4F53-4035-8D51-FCFB6B50A777">
              <File Id="fileafslogon_DLL" Name="afslogon.dll" LongName="afslogon.dll" KeyPath="yes" DiskId="1" src="$(var.ClientDir)afslogon.dll" />
              <Registry Id="reg_afslogon01" Root="HKLM" Key="SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon\Notify\AfsLogon" Action="createKeyAndRemoveKeyOnUninstall" />
--- 1,6 ----
  <?xml version="1.0"?>
  <Include>
!     <Directory Id="SystemFolder" SourceName="System" LongSource="System">
          <Component Id="cmf_afslogon_DLL" Guid="123197FE-4F53-4035-8D51-FCFB6B50A777">
              <File Id="fileafslogon_DLL" Name="afslogon.dll" LongName="afslogon.dll" KeyPath="yes" DiskId="1" src="$(var.ClientDir)afslogon.dll" />
              <Registry Id="reg_afslogon01" Root="HKLM" Key="SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon\Notify\AfsLogon" Action="createKeyAndRemoveKeyOnUninstall" />
***************
*** 17,25 ****
          </Component>
      <?endif?>
      </Directory>
!     <Directory Id="ProgramFilesFolder" Name=".">
          <Directory Id="AFSDIR" Name="OpenAFS" SourceName=".">
!             <Directory Id="dirCommon" Name="Common" LongName="Common" SourceName=".">
                  <Component Id="cmp_CommonDir" Guid="C86B03A1-AE97-48B1-A77B-1B2395F1E117" KeyPath="yes">
                      <Environment Id="envCommon" Name="PATH" Action="create" System="yes" Permanent="no" Part="last" Separator=";" Value="[AFSDIR]Common" />
                      <CreateFolder />
--- 17,25 ----
          </Component>
      <?endif?>
      </Directory>
!     <Directory Id="ProgramFilesFolder">
          <Directory Id="AFSDIR" Name="OpenAFS" SourceName=".">
!             <Directory Id="dirCommon" Name="Common" LongName="Common" SourceName="Common">
                  <Component Id="cmp_CommonDir" Guid="C86B03A1-AE97-48B1-A77B-1B2395F1E117" KeyPath="yes">
                      <Environment Id="envCommon" Name="PATH" Action="create" System="yes" Permanent="no" Part="last" Separator=";" Value="[AFSDIR]Common" />
                      <CreateFolder />
***************
*** 119,125 ****
                      <File Id="fileafs_shl_ext_1033_DLL" Name="ashl1033.dll" LongName="afs_shl_ext_1033.dll" KeyPath="yes" DiskId="1" src="$(var.ClientDir)\afs_shl_ext_1033.dll"/>
                  </Component>
  
!                 <Directory Id="dirCommon_en_US" Name="en_US" LongName="en_US" SourceName="." src="$(var.SrcDir)\WINNT\doc\help\en_US\">
                      <Component Id="cmf_afs_nt_HLP_en_US" Guid="A59FF1E3-984F-47E0-8A65-590A01B6E1C4">
                          <File Id="fileafs_nt_HLP_en_US" Name="afs-nt.hlp" LongName="afs-nt.hlp" KeyPath="yes" DiskId="1">
  							<Shortcut Id="scClientHelp_en_US" Directory="dirShortCut" Name="CliHelp.lnk" LongName="Client Help.lnk" Description="$(loc.StrHlpFileDesc)" Icon="ico_Help" IconIndex="0" Show="normal" WorkingDirectory="dirCommon" />
--- 119,125 ----
                      <File Id="fileafs_shl_ext_1033_DLL" Name="ashl1033.dll" LongName="afs_shl_ext_1033.dll" KeyPath="yes" DiskId="1" src="$(var.ClientDir)\afs_shl_ext_1033.dll"/>
                  </Component>
  
!                 <Directory Id="dirCommon_en_US" Name="en_US" LongName="en_US" SourceName="en_US" src="$(var.SrcDir)\WINNT\doc\help\en_US\">
                      <Component Id="cmf_afs_nt_HLP_en_US" Guid="A59FF1E3-984F-47E0-8A65-590A01B6E1C4">
                          <File Id="fileafs_nt_HLP_en_US" Name="afs-nt.hlp" LongName="afs-nt.hlp" KeyPath="yes" DiskId="1">
  							<Shortcut Id="scClientHelp_en_US" Directory="dirShortCut" Name="CliHelp.lnk" LongName="Client Help.lnk" Description="$(loc.StrHlpFileDesc)" Icon="ico_Help" IconIndex="0" Show="normal" WorkingDirectory="dirCommon" />
***************
*** 289,295 ****
            <?endif?>
              </Directory> <!-- /common -->
              
!             <Directory Id="dirControl_Center" Name="Contr" LongName="Control Center" SourceName=".">
                  <Component Id="cmf_TaAfsServerManager_EXE" Guid="B890FB93-2EFD-44B6-8CB3-7A6AFABFF029">
                      <File Id="fileTaAfsServerManager_EXE" Name="TaAfsSvM.exe" LongName="TaAfsServerManager.exe" KeyPath="yes" DiskId="1" src="$(var.ServerDir)\TaAfsServerManager.exe">
  						<Shortcut Id="scServerManager" Directory="dirShortCut" Name="SvrMgr.lnk" LongName="Server Manager.lnk" Description="$(loc.StrSvrMgrDesc)" Icon="ico_ServerManager" IconIndex="0" Show="normal" WorkingDirectory="dirCommon" />
--- 289,295 ----
            <?endif?>
              </Directory> <!-- /common -->
              
!             <Directory Id="dirControl_Center" Name="Contr" LongName="Control Center" SourceName="ControlC" LongSource="Control Center">
                  <Component Id="cmf_TaAfsServerManager_EXE" Guid="B890FB93-2EFD-44B6-8CB3-7A6AFABFF029">
                      <File Id="fileTaAfsServerManager_EXE" Name="TaAfsSvM.exe" LongName="TaAfsServerManager.exe" KeyPath="yes" DiskId="1" src="$(var.ServerDir)\TaAfsServerManager.exe">
  						<Shortcut Id="scServerManager" Directory="dirShortCut" Name="SvrMgr.lnk" LongName="Server Manager.lnk" Description="$(loc.StrSvrMgrDesc)" Icon="ico_ServerManager" IconIndex="0" Show="normal" WorkingDirectory="dirCommon" />
***************
*** 360,369 ****
              </Component>
           <?endif?>
  
!             <Directory Id="dirDocumentation" Name="Docum" LongName="Documentation" SourceName=".">
  				<!-- The following directory and everything below it is language dependent. -->
!                 <Directory Id="dirDoc_$(var.Language)" Name="$(var.Language)" LongName="$(var.Language)" SourceName=".">
!                     <Directory Id="dirHtml_$(var.Language)" Name="Html" LongName="Html" SourceName="." src="$(var.SrcDir)\WINNT\doc\install\Documentation\$(var.Language)\html\">
                          <Component Id="cmf_index2_HTM_$(var.Language)" Guid="$(var.DocHtmlIndexGuid)">
                              <File Id="fileindex2_HTM_$(var.Language)" Name="index.htm" LongName="index.htm" KeyPath="yes" DiskId="1">
  								<Shortcut Id="scDoc_$(var.Language)" Directory="dirShortCut" Name="Doc$(var.Language).lnk" LongName="Documentation ($(var.Language)).lnk" Description="$(loc.StrDocLnkDesc)" Icon="ico_Help" IconIndex="0" Show="normal" WorkingDirectory="dirCommon" />
--- 360,369 ----
              </Component>
           <?endif?>
  
!             <Directory Id="dirDocumentation" Name="Docum" LongName="Documentation" SourceName="Docs">
  				<!-- The following directory and everything below it is language dependent. -->
!                 <Directory Id="dirDoc_$(var.Language)" Name="$(var.Language)" LongName="$(var.Language)" SourceName="$(var.Language)">
!                     <Directory Id="dirHtml_$(var.Language)" Name="Html" LongName="Html" SourceName="html" src="$(var.SrcDir)\WINNT\doc\install\Documentation\$(var.Language)\html\">
                          <Component Id="cmf_index2_HTM_$(var.Language)" Guid="$(var.DocHtmlIndexGuid)">
                              <File Id="fileindex2_HTM_$(var.Language)" Name="index.htm" LongName="index.htm" KeyPath="yes" DiskId="1">
  								<Shortcut Id="scDoc_$(var.Language)" Directory="dirShortCut" Name="Doc$(var.Language).lnk" LongName="Documentation ($(var.Language)).lnk" Description="$(loc.StrDocLnkDesc)" Icon="ico_Help" IconIndex="0" Show="normal" WorkingDirectory="dirCommon" />
***************
*** 380,386 ****
                              <File Id="filetop_GIF_$(var.Language)" Name="top.gif" LongName="top.gif" DiskId="1" />
                              <File Id="file$(var.Language)_RTF" Name="$(var.Language).rtf" LongName="$(var.Language).rtf" KeyPath="yes" DiskId="1" src="$(var.SrcDir)\WINNT\license\lang\$(var.Language).rtf"/>
                          </Component>
!                         <Directory Id="dirCmdRef_$(var.Language)" Name="CmdRef" LongName="CmdRef" SourceName="." src="$(var.SrcDir)\WINNT\doc\install\Documentation\$(var.Language)\html\CmdRef\">
                              <Component Id="cmp_Cmd_Ref_$(var.Language)" Guid="$(var.DocHtmlCmdRefGuid)">
                                  <File Id="fileauarf000_HTM_$(var.Language)" Name="auarf000.htm" LongName="auarf000.htm" KeyPath="yes" DiskId="1" />
                                  <File Id="fileauarf002_HTM_$(var.Language)" Name="auarf002.htm" LongName="auarf002.htm" DiskId="1" />
--- 380,386 ----
                              <File Id="filetop_GIF_$(var.Language)" Name="top.gif" LongName="top.gif" DiskId="1" />
                              <File Id="file$(var.Language)_RTF" Name="$(var.Language).rtf" LongName="$(var.Language).rtf" KeyPath="yes" DiskId="1" src="$(var.SrcDir)\WINNT\license\lang\$(var.Language).rtf"/>
                          </Component>
!                         <Directory Id="dirCmdRef_$(var.Language)" Name="CmdRef" LongName="CmdRef" SourceName="CmdRef" src="$(var.SrcDir)\WINNT\doc\install\Documentation\$(var.Language)\html\CmdRef\">
                              <Component Id="cmp_Cmd_Ref_$(var.Language)" Guid="$(var.DocHtmlCmdRefGuid)">
                                  <File Id="fileauarf000_HTM_$(var.Language)" Name="auarf000.htm" LongName="auarf000.htm" KeyPath="yes" DiskId="1" />
                                  <File Id="fileauarf002_HTM_$(var.Language)" Name="auarf002.htm" LongName="auarf002.htm" DiskId="1" />
***************
*** 668,674 ****
                                  <File Id="fileauarf284_HTM_$(var.Language)" Name="auarf284.htm" LongName="auarf284.htm" DiskId="1" />
                              </Component>
                          </Directory> <!-- CmdRef -->
!                         <Directory Id="dirInstallGd_$(var.Language)" Name="InstalGd" LongName="InstallGd" SourceName="." src="$(var.SrcDir)\WINNT\doc\install\Documentation\$(var.Language)\html\InstallGd\">
                              <Component Id="cmp_Install_Guide_$(var.Language)" Guid="$(var.DocHtmlInstallGuid)">
                                  <File Id="fileawqbg000_HTM_$(var.Language)" Name="awqbg000.htm" LongName="awqbg000.htm" KeyPath="yes" DiskId="1" />
                                  <File Id="fileawqbg002_HTM_$(var.Language)" Name="awqbg002.htm" LongName="awqbg002.htm" DiskId="1" />
--- 668,674 ----
                                  <File Id="fileauarf284_HTM_$(var.Language)" Name="auarf284.htm" LongName="auarf284.htm" DiskId="1" />
                              </Component>
                          </Directory> <!-- CmdRef -->
!                         <Directory Id="dirInstallGd_$(var.Language)" Name="InstalGd" LongName="InstallGd" SourceName="InstGd" LongSource="InstallGuide" src="$(var.SrcDir)\WINNT\doc\install\Documentation\$(var.Language)\html\InstallGd\">
                              <Component Id="cmp_Install_Guide_$(var.Language)" Guid="$(var.DocHtmlInstallGuid)">
                                  <File Id="fileawqbg000_HTM_$(var.Language)" Name="awqbg000.htm" LongName="awqbg000.htm" KeyPath="yes" DiskId="1" />
                                  <File Id="fileawqbg002_HTM_$(var.Language)" Name="awqbg002.htm" LongName="awqbg002.htm" DiskId="1" />
***************
*** 676,682 ****
                                  <File Id="fileawqbg004_HTM_$(var.Language)" Name="awqbg004.htm" LongName="awqbg004.htm" DiskId="1" />
                              </Component>
                          </Directory> <!-- InstallGd -->
!                         <Directory Id="dirSysAdminGd_$(var.Language)" Name="SysAd" LongName="SysAdminGd" SourceName="." src="$(var.SrcDir)\WINNT\doc\install\Documentation\$(var.Language)\html\SysAdminGd\">
                              <Component Id="cmp_Sys_Admin_Guide_$(var.Language)" Guid="$(var.DocHtmlSysAdminGuid)">
                                  <File Id="fileauagd000_HTM_$(var.Language)" Name="auagd.htm" LongName="auagd000.htm" KeyPath="yes" DiskId="1" />
                                  <File Id="fileauagd002_HTM_$(var.Language)" Name="auagd~2.htm" LongName="auagd002.htm" DiskId="1" />
--- 676,682 ----
                                  <File Id="fileawqbg004_HTM_$(var.Language)" Name="awqbg004.htm" LongName="awqbg004.htm" DiskId="1" />
                              </Component>
                          </Directory> <!-- InstallGd -->
!                         <Directory Id="dirSysAdminGd_$(var.Language)" Name="SysAd" LongName="SysAdminGd" SourceName="SysAdm" LongSource="SysAdminGd" src="$(var.SrcDir)\WINNT\doc\install\Documentation\$(var.Language)\html\SysAdminGd\">
                              <Component Id="cmp_Sys_Admin_Guide_$(var.Language)" Guid="$(var.DocHtmlSysAdminGuid)">
                                  <File Id="fileauagd000_HTM_$(var.Language)" Name="auagd.htm" LongName="auagd000.htm" KeyPath="yes" DiskId="1" />
                                  <File Id="fileauagd002_HTM_$(var.Language)" Name="auagd~2.htm" LongName="auagd002.htm" DiskId="1" />
***************
*** 715,721 ****
                                  <File Id="filecachmgr_GIF_$(var.Language)" Name="cachm.gif" LongName="cachmgr.gif" DiskId="1" />
                              </Component>
                          </Directory> <!-- Sys Admin guide -->
!                         <Directory Id="dirReleaseNotes_$(var.Language)" Name="Relea" LongName="ReleaseNotes" SourceName="." src="$(var.SrcDir)\WINNT\doc\install\Documentation\$(var.Language)\html\ReleaseNotes\">
                              <Component Id="cmp_Release_Notes_$(var.Language)" Guid="$(var.DocHtmlRelNotesGuid)">
                                  <File Id="fileawrns000_HTM_$(var.Language)" Name="awrns.htm" LongName="awrns000.htm" KeyPath="yes" DiskId="1" />
                                  <File Id="fileawrns002_HTM_$(var.Language)" Name="awrns~2.htm" LongName="awrns002.htm" DiskId="1" />
--- 715,721 ----
                                  <File Id="filecachmgr_GIF_$(var.Language)" Name="cachm.gif" LongName="cachmgr.gif" DiskId="1" />
                              </Component>
                          </Directory> <!-- Sys Admin guide -->
!                         <Directory Id="dirReleaseNotes_$(var.Language)" Name="Relea" LongName="ReleaseNotes" SourceName="Relea" LongSource="ReleaseNotes" src="$(var.SrcDir)\WINNT\doc\install\Documentation\$(var.Language)\html\ReleaseNotes\">
                              <Component Id="cmp_Release_Notes_$(var.Language)" Guid="$(var.DocHtmlRelNotesGuid)">
                                  <File Id="fileawrns000_HTM_$(var.Language)" Name="awrns.htm" LongName="awrns000.htm" KeyPath="yes" DiskId="1" />
                                  <File Id="fileawrns002_HTM_$(var.Language)" Name="awrns~2.htm" LongName="awrns002.htm" DiskId="1" />
***************
*** 730,736 ****
                  </Directory> <!-- $(var.Language) -->
              </Directory> <!-- Documentation -->
  
!             <Directory Id="dirClient" Name="Client" LongName="Client" SourceName=".">
                  <Component Id="efl_CellServDB" Guid="8E69FDAB-08C5-4927-B1AA-57FCEEB065F2" NeverOverwrite="yes" Permanent="yes">
                      <File Id="file_CellServDB" Name="CelSrvDB" LongName="CellServDB" KeyPath="yes" DiskId="1" src="$(var.CellDbFile)"/>
                      <Condition>OLDCELLSERVDB = ""</Condition>
--- 730,736 ----
                  </Directory> <!-- $(var.Language) -->
              </Directory> <!-- Documentation -->
  
!             <Directory Id="dirClient" Name="Client" LongName="Client" SourceName="Client">
                  <Component Id="efl_CellServDB" Guid="8E69FDAB-08C5-4927-B1AA-57FCEEB065F2" NeverOverwrite="yes" Permanent="yes">
                      <File Id="file_CellServDB" Name="CelSrvDB" LongName="CellServDB" KeyPath="yes" DiskId="1" src="$(var.CellDbFile)"/>
                      <Condition>OLDCELLSERVDB = ""</Condition>
***************
*** 740,746 ****
                      <CopyFile Id="copy_CellServDB" Delete="yes" DestinationDirectory="dirClient" DestinationName="CellServ|CellServDB" SourceDirectory="WindowsFolder" SourceName="afsdcell.ini" />
                      <Condition>OLDCELLSERVDB &lt;&gt; ""</Condition>
                  </Component>
!                 <Directory Id="dirProgram" Name="Program" LongName="Program" SourceName="." src="$(var.ClientDir)">
                      <Component Id="cmf_afsshare_EXE" Guid="E972DA35-E950-4736-AE48-E6DDCE8C97D0">
                          <File Id="fileafsshare_EXE" Name="afsshare.exe" LongName="afsshare.exe" KeyPath="yes" DiskId="1" />
                      </Component>
--- 740,746 ----
                      <CopyFile Id="copy_CellServDB" Delete="yes" DestinationDirectory="dirClient" DestinationName="CellServ|CellServDB" SourceDirectory="WindowsFolder" SourceName="afsdcell.ini" />
                      <Condition>OLDCELLSERVDB &lt;&gt; ""</Condition>
                  </Component>
!                 <Directory Id="dirProgram" Name="Program" LongName="Program" SourceName="Program" src="$(var.ClientDir)">
                      <Component Id="cmf_afsshare_EXE" Guid="E972DA35-E950-4736-AE48-E6DDCE8C97D0">
                          <File Id="fileafsshare_EXE" Name="afsshare.exe" LongName="afsshare.exe" KeyPath="yes" DiskId="1" />
                      </Component>
***************
*** 783,789 ****
                      <Component Id="cmf_afsd_service_EXE" Guid="37A90054-505D-4C57-B489-7EF4D97B86F6">
                          <File Id="fileafsd_service_EXE" Name="afsd_svc.exe" LongName="afsd_service.exe" KeyPath="yes" DiskId="1" />
                          <ServiceControl Id="TransarcAFSDaemon" Name="TransarcAFSDaemon" Stop="both" Remove="both" Wait="yes" />
!                         <ServiceInstall Id="svc_Client" Name="TransarcAFSDaemon" DisplayName="OpenAFS Client" Type="ownProcess" Start="auto" ErrorControl="normal" Description="Provides access to files and directories stored in AFS">
  							<!-- ServiceConfig doesn't currently do what you think it does.
  							     We instead use a custom action to set the service failure actions.
                              <ServiceConfig FirstFailureActionType="restart" RestartServiceDelayInSeconds="10" SecondFailureActionType="restart" ThirdFailureActionType="none"/>
--- 783,789 ----
                      <Component Id="cmf_afsd_service_EXE" Guid="37A90054-505D-4C57-B489-7EF4D97B86F6">
                          <File Id="fileafsd_service_EXE" Name="afsd_svc.exe" LongName="afsd_service.exe" KeyPath="yes" DiskId="1" />
                          <ServiceControl Id="TransarcAFSDaemon" Name="TransarcAFSDaemon" Stop="both" Remove="both" Wait="yes" />
!                         <ServiceInstall Id="svc_Client" Name="TransarcAFSDaemon" DisplayName="OpenAFS Client" Type="ownProcess" Start="auto" ErrorControl="normal" Description="Provides access to files and directories stored in AFS" Interactive="yes">
  							<!-- ServiceConfig doesn't currently do what you think it does.
  							     We instead use a custom action to set the service failure actions.
                              <ServiceConfig FirstFailureActionType="restart" RestartServiceDelayInSeconds="10" SecondFailureActionType="restart" ThirdFailureActionType="none"/>
***************
*** 860,871 ****
                      </Component>
                  <?endif?>
                      
!                     <Directory Id="dirSample" Name="Sampl" LongName="Sample" SourceName=".">
                          <Component Id="cmp_SDK_Sample" Guid="F9373E95-F410-4AA5-AA79-07C11EE00334">
                              <File Id="filetoken_C" Name="token.c" LongName="token.c" KeyPath="yes" DiskId="1" src="$(var.SrcDir)WINNT\afsd\sample\token.c"/>
                          </Component>
                      </Directory>
!                     <Directory Id="dirInclude" Name="Include" LongName="Include" SourceName=".">
                          <Component Id="cmp_SDK_Include" Guid="9B12B216-B104-4E49-BE31-4042F2CBD318">
                              <File Id="filebasic_H" Name="basic.h" LongName="basic.h" DiskId="1" src="$(var.IncDir)basic.h" /> 
                              <File Id="filecrypt_H" Name="crypt.h" LongName="crypt.h" DiskId="1" src="$(var.IncDir)crypt.h" /> 
--- 860,871 ----
                      </Component>
                  <?endif?>
                      
!                     <Directory Id="dirSample" Name="Sampl" LongName="Sample" SourceName="Sample">
                          <Component Id="cmp_SDK_Sample" Guid="F9373E95-F410-4AA5-AA79-07C11EE00334">
                              <File Id="filetoken_C" Name="token.c" LongName="token.c" KeyPath="yes" DiskId="1" src="$(var.SrcDir)WINNT\afsd\sample\token.c"/>
                          </Component>
                      </Directory>
!                     <Directory Id="dirInclude" Name="Include" LongName="Include" SourceName="Include">
                          <Component Id="cmp_SDK_Include" Guid="9B12B216-B104-4E49-BE31-4042F2CBD318">
                              <File Id="filebasic_H" Name="basic.h" LongName="basic.h" DiskId="1" src="$(var.IncDir)basic.h" /> 
                              <File Id="filecrypt_H" Name="crypt.h" LongName="crypt.h" DiskId="1" src="$(var.IncDir)crypt.h" /> 
***************
*** 898,904 ****
                              <File Id="fileubik_H" Name="ubik.h" LongName="ubik.h" DiskId="1" src="$(var.IncDir)ubik.h" /> 
                              <File Id="fileubik_int_H" Name="ubik_int.h" LongName="ubik_int.h" DiskId="1" src="$(var.IncDir)ubik_int.h" /> 
                          </Component>
!                         <Directory Id="dirIncludeAfs" Name="afs" LongName="afs" SourceName=".">
                              <Component Id="cmp_SDK_Include_afs" Guid="692D18AD-4901-4124-8B1F-5D414E65A7D0">
                                  <File Id="fileacl_H" Name="acl.h" LongName="acl.h" DiskId="1" src="$(var.IncDir)afs\acl.h" /> 
                                  <File Id="fileafscbint_H" Name="afscbint.h" LongName="afscbint.h" DiskId="1" src="$(var.IncDir)afs\afscbint.h" /> 
--- 898,904 ----
                              <File Id="fileubik_H" Name="ubik.h" LongName="ubik.h" DiskId="1" src="$(var.IncDir)ubik.h" /> 
                              <File Id="fileubik_int_H" Name="ubik_int.h" LongName="ubik_int.h" DiskId="1" src="$(var.IncDir)ubik_int.h" /> 
                          </Component>
!                         <Directory Id="dirIncludeAfs" Name="afs" LongName="afs" SourceName="afs">
                              <Component Id="cmp_SDK_Include_afs" Guid="692D18AD-4901-4124-8B1F-5D414E65A7D0">
                                  <File Id="fileacl_H" Name="acl.h" LongName="acl.h" DiskId="1" src="$(var.IncDir)afs\acl.h" /> 
                                  <File Id="fileafscbint_H" Name="afscbint.h" LongName="afscbint.h" DiskId="1" src="$(var.IncDir)afs\afscbint.h" /> 
***************
*** 1034,1040 ****
                                  <File Id="filevolume_H" Name="volume.h" LongName="volume.h" DiskId="1" src="$(var.IncDir)afs\volume.h" />
                              </Component>
                          </Directory>
!                         <Directory Id="dirIncludeRx" Name="rx" LongName="rx" SourceName=".">
                              <Component Id="cmp_SDK_Include_rx" Guid="2E215D10-C080-42A3-B692-AFF94C7A1A2B">
                                  <File Id="fileasn1_err_H" Name="asn1_err.h" LongName="asn1_err.h" DiskId="1" src="$(var.IncDir)rx\asn1_err.h" /> 
                                  <File Id="filefcrypt_H" Name="fcrypt.h" LongName="fcrypt.h" DiskId="1" src="$(var.IncDir)rx\fcrypt.h" /> 
--- 1034,1040 ----
                                  <File Id="filevolume_H" Name="volume.h" LongName="volume.h" DiskId="1" src="$(var.IncDir)afs\volume.h" />
                              </Component>
                          </Directory>
!                         <Directory Id="dirIncludeRx" Name="rx" LongName="rx" SourceName="rx">
                              <Component Id="cmp_SDK_Include_rx" Guid="2E215D10-C080-42A3-B692-AFF94C7A1A2B">
                                  <File Id="fileasn1_err_H" Name="asn1_err.h" LongName="asn1_err.h" DiskId="1" src="$(var.IncDir)rx\asn1_err.h" /> 
                                  <File Id="filefcrypt_H" Name="fcrypt.h" LongName="fcrypt.h" DiskId="1" src="$(var.IncDir)rx\fcrypt.h" /> 
***************
*** 1063,1069 ****
                                  <File Id="filexdr_prototypes_H" Name="XDR_PR~1.h" LongName="xdr_prototypes.h" DiskId="1" src="$(var.IncDir)rx\xdr_prototypes.h" /> 
                              </Component>
                          </Directory>
!                         <Directory Id="dirIncludeWinnt" Name="WINNT" LongName="WINNT" SourceName=".">
                              <Component Id="cmp_SDK_Include_Winnt" Guid="BAAF0193-5C33-4EC1-9D40-DD4595F176E6">
                                  <File Id="fileafsapplib_H" Name="AFSAPP~1.h" LongName="afsapplib.h" DiskId="1" src="$(var.IncDir)WINNT\afsapplib.h" /> 
                                  <File Id="fileafsclass_H" Name="afsclass.h" LongName="afsclass.h" DiskId="1" src="$(var.IncDir)WINNT\afsclass.h" /> 
--- 1063,1069 ----
                                  <File Id="filexdr_prototypes_H" Name="XDR_PR~1.h" LongName="xdr_prototypes.h" DiskId="1" src="$(var.IncDir)rx\xdr_prototypes.h" /> 
                              </Component>
                          </Directory>
!                         <Directory Id="dirIncludeWinnt" Name="WINNT" LongName="WINNT" SourceName="WINNT">
                              <Component Id="cmp_SDK_Include_Winnt" Guid="BAAF0193-5C33-4EC1-9D40-DD4595F176E6">
                                  <File Id="fileafsapplib_H" Name="AFSAPP~1.h" LongName="afsapplib.h" DiskId="1" src="$(var.IncDir)WINNT\afsapplib.h" /> 
                                  <File Id="fileafsclass_H" Name="afsclass.h" LongName="afsclass.h" DiskId="1" src="$(var.IncDir)WINNT\afsclass.h" /> 
***************
*** 1115,1121 ****
                              </Component>
                          </Directory>
                      </Directory>
!                     <Directory Id="dirLib" Name="lib" LongName="lib" SourceName=".">
                          <Component Id="cmp_SDK_Lib" Guid="71BC1B4E-4C4C-4FF8-8DDA-C6AB2BE22142">
                              <File Id="fileafsauthent_LIB" Name="AFSAUT~1.lib" LongName="afsauthent.lib" DiskId="1" src="$(var.LibDir)afsauthent.lib" /> 
                              <File Id="fileafsdes_LIB" Name="afsdes.lib" LongName="afsdes.lib" DiskId="1" src="$(var.LibDir)afsdes.lib" /> 
--- 1115,1121 ----
                              </Component>
                          </Directory>
                      </Directory>
!                     <Directory Id="dirLib" Name="lib" LongName="lib" SourceName="lib">
                          <Component Id="cmp_SDK_Lib" Guid="71BC1B4E-4C4C-4FF8-8DDA-C6AB2BE22142">
                              <File Id="fileafsauthent_LIB" Name="AFSAUT~1.lib" LongName="afsauthent.lib" DiskId="1" src="$(var.LibDir)afsauthent.lib" /> 
                              <File Id="fileafsdes_LIB" Name="afsdes.lib" LongName="afsdes.lib" DiskId="1" src="$(var.LibDir)afsdes.lib" /> 
***************
*** 1134,1140 ****
                              <File Id="filecm_config_OBJ" Name="CM_CON~1.obj" LongName="cm_config.obj" DiskId="1" src="$(var.LibDir)cm_config.obj" /> 
                              <File Id="filecm_dns_OBJ" Name="cm_dns.obj" LongName="cm_dns.obj" DiskId="1" src="$(var.LibDir)cm_dns.obj" /> 
                          </Component>
!                         <Directory Id="dirLibAfs" Name="afs" LongName="afs" SourceName=".">
                              <Component Id="cmp_SDK_Lib_Afs" Guid="CD671A64-D491-4363-A7AD-645482B481BE">
                                  <File Id="fileafsacl_LIB" Name="afsacl.lib" LongName="afsacl.lib" DiskId="1" src="$(var.LibDir)afs\afsacl.lib" /> 
                                  <File Id="fileafsadminutil_LIB" Name="AFSADM~1.lib" LongName="afsadminutil.lib" DiskId="1" src="$(var.LibDir)afs\afsadminutil.lib" /> 
--- 1134,1140 ----
                              <File Id="filecm_config_OBJ" Name="CM_CON~1.obj" LongName="cm_config.obj" DiskId="1" src="$(var.LibDir)cm_config.obj" /> 
                              <File Id="filecm_dns_OBJ" Name="cm_dns.obj" LongName="cm_dns.obj" DiskId="1" src="$(var.LibDir)cm_dns.obj" /> 
                          </Component>
!                         <Directory Id="dirLibAfs" Name="afs" LongName="afs" SourceName="afs">
                              <Component Id="cmp_SDK_Lib_Afs" Guid="CD671A64-D491-4363-A7AD-645482B481BE">
                                  <File Id="fileafsacl_LIB" Name="afsacl.lib" LongName="afsacl.lib" DiskId="1" src="$(var.LibDir)afs\afsacl.lib" /> 
                                  <File Id="fileafsadminutil_LIB" Name="AFSADM~1.lib" LongName="afsadminutil.lib" DiskId="1" src="$(var.LibDir)afs\afsadminutil.lib" /> 
***************
*** 1178,1187 ****
                      </Directory>
                  </Directory> <!-- /Program -->
              </Directory> <!-- /Client -->
!             <Directory Id="dirServer" Name="Server" LongName="Server" SourceName=".">
!                 <Directory Id="dirusr" Name="usr" LongName="usr" SourceName=".">
!                     <Directory Id="dirafs" Name="afs" LongName="afs" SourceName=".">
!                         <Directory Id="dirbin" Name="bin" LongName="bin" SourceName="." src="$(var.ServerDir)">
                              <Component Id="cmf_vlserver_EXE" Guid="F6A43B78-EE17-4483-AA81-4B6C6957977D">
                                  <File Id="filevlserver_EXE" Name="vlser.exe" LongName="vlserver.exe" KeyPath="yes" DiskId="1" />
                              </Component>
--- 1178,1187 ----
                      </Directory>
                  </Directory> <!-- /Program -->
              </Directory> <!-- /Client -->
!             <Directory Id="dirServer" Name="Server" LongName="Server" SourceName="Server">
!                 <Directory Id="dirusr" Name="usr" LongName="usr" SourceName="usr">
!                     <Directory Id="dirafs" Name="afs" LongName="afs" SourceName="afs">
!                         <Directory Id="dirbin" Name="bin" LongName="bin" SourceName="bin" src="$(var.ServerDir)">
                              <Component Id="cmf_vlserver_EXE" Guid="F6A43B78-EE17-4483-AA81-4B6C6957977D">
                                  <File Id="filevlserver_EXE" Name="vlser.exe" LongName="vlserver.exe" KeyPath="yes" DiskId="1" />
                              </Component>
***************
*** 1202,1208 ****
                              <Component Id="cmf_bosctlsvc_EXE" Guid="8F6F62A8-BB6D-46C1-BA80-4F207AA24F0D">
                                  <File Id="filebosctlsvc_EXE" Name="bosct.exe" LongName="bosctlsvc.exe" KeyPath="yes" DiskId="1" />
                                  <ServiceControl Id="TransarcAFSServer" Name="TransarcAFSServer" Stop="both" Remove="both" Wait="yes" />
!                                 <ServiceInstall Id="svc_Server" Name="TransarcAFSServer" DisplayName="OpenAFS Server" Type="ownProcess" Start="auto" ErrorControl="normal" Description="Manages AFS server processes">
  									<!-- ServiceConfig does nothing 
                                      <ServiceConfig FirstFailureActionType="restart" RestartServiceDelayInSeconds="5" SecondFailureActionType="restart" ThirdFailureActionType="none"/>
                                      -->
--- 1202,1208 ----
                              <Component Id="cmf_bosctlsvc_EXE" Guid="8F6F62A8-BB6D-46C1-BA80-4F207AA24F0D">
                                  <File Id="filebosctlsvc_EXE" Name="bosct.exe" LongName="bosctlsvc.exe" KeyPath="yes" DiskId="1" />
                                  <ServiceControl Id="TransarcAFSServer" Name="TransarcAFSServer" Stop="both" Remove="both" Wait="yes" />
!                                 <ServiceInstall Id="svc_Server" Name="TransarcAFSServer" DisplayName="OpenAFS Server" Type="ownProcess" Start="auto" ErrorControl="normal" Description="Manages AFS server processes" Interactive="yes">
  									<!-- ServiceConfig does nothing 
                                      <ServiceConfig FirstFailureActionType="restart" RestartServiceDelayInSeconds="5" SecondFailureActionType="restart" ThirdFailureActionType="none"/>
                                      -->
Index: openafs/src/WINNT/install/wix/language_config.wxi
diff -c openafs/src/WINNT/install/wix/language_config.wxi:1.1 openafs/src/WINNT/install/wix/language_config.wxi:1.1.2.1
*** openafs/src/WINNT/install/wix/language_config.wxi:1.1	Mon Jun 21 01:21:44 2004
--- openafs/src/WINNT/install/wix/language_config.wxi	Fri Aug 20 16:15:19 2004
***************
*** 27,33 ****
      <?define ProductName="OpenAFS for Windows"?>
      
      <!-- Localized packages should have different product codes -->
!     <?define ProductCode="CCAF9E14-976E-46C0-8A1B-A218EAB7ADC5"?>
      
      <!-- Same goes for localized components -->
      <?define DocHtmlIndexGuid="B656CA5A-5179-42D8-8972-2F128AEDE751"?>
--- 27,36 ----
      <?define ProductName="OpenAFS for Windows"?>
      
      <!-- Localized packages should have different product codes -->
!     <!-- Each product release should have a different product code -->
!     <?ifndef ProductCode?>
!         <?define ProductCode="????????-????-????-????-????????????"?>
!     <?endif?>
      
      <!-- Same goes for localized components -->
      <?define DocHtmlIndexGuid="B656CA5A-5179-42D8-8972-2F128AEDE751"?>
Index: openafs/src/WINNT/install/wix/openafs.wxs
diff -c openafs/src/WINNT/install/wix/openafs.wxs:1.6 openafs/src/WINNT/install/wix/openafs.wxs:1.6.2.2
*** openafs/src/WINNT/install/wix/openafs.wxs:1.6	Wed Aug  4 12:36:15 2004
--- openafs/src/WINNT/install/wix/openafs.wxs	Mon Aug 23 11:55:09 2004
***************
*** 38,47 ****
           />
          
          <!-- Launch conditions -->
!         <Condition
!          Message="$(loc.StrLaunchCond)">
           <![CDATA[VersionNT >= 500]]>
          </Condition>
          
          <!-- Global Properties -->
          <?include property.wxi?>
--- 38,48 ----
           />
          
          <!-- Launch conditions -->
!         <Condition Message="$(loc.StrLaunchCond)">
           <![CDATA[VersionNT >= 500]]>
          </Condition>
+         <Condition Message="$(loc.AdminRequired)">Privileged</Condition>
+         
          
          <!-- Global Properties -->
          <?include property.wxi?>
***************
*** 152,157 ****
--- 153,176 ----
  		 BinaryKey="BIN_afsCustom"
  		 DllEntry="UninstallNsisInstallation"
  		 Execute="immediate" />
+  		<CustomAction
+ 		 Id="CreateAFSAdminGroup"
+ 		 BinaryKey="BIN_afsCustom"
+ 		 DllEntry="CreateAFSClientAdminGroup"
+ 		 Impersonate="no"
+ 		 Execute="deferred" />
+ 		<CustomAction
+ 		 Id="RemoveAFSAdminGroup"
+ 		 BinaryKey="BIN_afsCustom"
+ 		 DllEntry="RemoveAFSClientAdminGroup"
+ 		 Impersonate="no"
+ 		 Execute="deferred" />
+ 		<CustomAction
+ 		 Id="RollbackAFSAdminGroup"
+ 		 BinaryKey="BIN_afsCustom"
+ 		 DllEntry="RemoveAFSClientAdminGroup"
+ 		 Impersonate="no"
+ 		 Execute="rollback" />
  		<CustomAction
  		 Id="AbortInstallationA"
  		 BinaryKey="BIN_afsCustom"
***************
*** 186,191 ****
--- 205,213 ----
  			<Custom Action="RemoveNetProvider" After="InstallNetProvider">&amp;feaClient=2</Custom>
  			<Custom Action="ConfigureClient" After="InstallServices">&amp;feaClient=3</Custom>
  			<Custom Action="ConfigureServer" After="ConfigureClient">&amp;feaServer=3</Custom>
+ 			<!-- <Custom Action="RemoveAFSAdminGroup" Before="">&amp;feaClient=2</Custom> -->
+ 			<Custom Action="RollbackAFSAdminGroup" Before="CreateAFSAdminGroup">&amp;feaClient=3</Custom>
+ 			<Custom Action="CreateAFSAdminGroup" Before="CreateFolders">&amp;feaClient=3</Custom>
              <ScheduleReboot After="PublishProduct">&amp;feaClient=3 OR &amp;feaServer=3 OR &amp;feaClient=2 OR &amp;feaServer=2</ScheduleReboot>
          </InstallExecuteSequence>
  
Index: openafs/src/WINNT/install/wix/property.wxi
diff -c openafs/src/WINNT/install/wix/property.wxi:1.6 openafs/src/WINNT/install/wix/property.wxi:1.6.2.1
*** openafs/src/WINNT/install/wix/property.wxi:1.6	Wed Aug  4 12:36:15 2004
--- openafs/src/WINNT/install/wix/property.wxi	Fri Aug 20 16:15:19 2004
***************
*** 114,120 ****
      </Property>
      
      <Property Id="ABORTREASON">$(loc.StrNsisAbortReason)</Property>
! 
      <Property Id="OLDCELLSERVDB">
        <DirectorySearch Id="dsOldCellServDB" Path="[WindowsFolder]" >
          <FileSearch Id="fsOldCellServDB" Name="afsdcell.ini" />
--- 114,120 ----
      </Property>
      
      <Property Id="ABORTREASON">$(loc.StrNsisAbortReason)</Property>
!     
      <Property Id="OLDCELLSERVDB">
        <DirectorySearch Id="dsOldCellServDB" Path="[WindowsFolder]" >
          <FileSearch Id="fsOldCellServDB" Name="afsdcell.ini" />
Index: openafs/src/WINNT/install/wix/registry.wxi
diff -c openafs/src/WINNT/install/wix/registry.wxi:1.5 openafs/src/WINNT/install/wix/registry.wxi:1.5.2.1
*** openafs/src/WINNT/install/wix/registry.wxi:1.5	Wed Aug  4 12:36:15 2004
--- openafs/src/WINNT/install/wix/registry.wxi	Fri Aug 20 16:15:19 2004
***************
*** 194,200 ****
  	     empty.  Due to a bug in Windows Installer, when a feature is empty (i.e. contains no components)
  	     its install state is set as NULL, instead of Local or Absent.  This prevents the feature from
  	     being removed when the product is uninstalled. This is just a flag component to add to the
! 	     loopback feature so that it is not empty. -->    
      <Component Id="rcm_Loopback" Guid="9F9BBDA3-208C-4F93-B81F-313E031B6DDA">
          <Registry Root="HKLM" Key="SOFTWARE\OpenAFS\Client" Name="LoopbackInstalled" Type="integer" Value="1" Id="reg_Loopback1" KeyPath="yes" />
      </Component>
--- 194,200 ----
  	     empty.  Due to a bug in Windows Installer, when a feature is empty (i.e. contains no components)
  	     its install state is set as NULL, instead of Local or Absent.  This prevents the feature from
  	     being removed when the product is uninstalled. This is just a flag component to add to the
! 	     loopback feature so that it is not empty. -->
      <Component Id="rcm_Loopback" Guid="9F9BBDA3-208C-4F93-B81F-313E031B6DDA">
          <Registry Root="HKLM" Key="SOFTWARE\OpenAFS\Client" Name="LoopbackInstalled" Type="integer" Value="1" Id="reg_Loopback1" KeyPath="yes" />
      </Component>
Index: openafs/src/WINNT/install/wix/custom/NTMakefile
diff -c openafs/src/WINNT/install/wix/custom/NTMakefile:1.2 openafs/src/WINNT/install/wix/custom/NTMakefile:1.2.2.1
*** openafs/src/WINNT/install/wix/custom/NTMakefile:1.2	Wed Jun 23 03:48:23 2004
--- openafs/src/WINNT/install/wix/custom/NTMakefile	Mon Aug 23 11:55:09 2004
***************
*** 1,4 ****
! # rcsid : $Id: NTMakefile,v 1.2 2004/06/23 07:48:23 jaltman Exp $
  
  RELDIR=WINNT\install\wix\custom
  !INCLUDE ..\..\..\..\config\NTMakefile.$(SYS_NAME)
--- 1,4 ----
! # rcsid : $Id: NTMakefile,v 1.2.2.1 2004/08/23 15:55:09 jaltman Exp $
  
  RELDIR=WINNT\install\wix\custom
  !INCLUDE ..\..\..\..\config\NTMakefile.$(SYS_NAME)
***************
*** 14,23 ****
  	-EXPORT:ConfigureClientService \
  	-EXPORT:ConfigureServerService \
  	-EXPORT:AbortMsiImmediate \
! 	-EXPORT:UninstallNsisInstallation
  
  DLLLIBFILES=\
! 	msi.lib advapi32.lib
  
  LINK=link
  
--- 14,25 ----
  	-EXPORT:ConfigureClientService \
  	-EXPORT:ConfigureServerService \
  	-EXPORT:AbortMsiImmediate \
! 	-EXPORT:UninstallNsisInstallation \
!         -EXPORT:CreateAFSClientAdminGroup \
!         -EXPORT:RemoveAFSClientAdminGroup
  
  DLLLIBFILES=\
! 	msi.lib advapi32.lib netapi32.lib
  
  LINK=link
  
Index: openafs/src/WINNT/install/wix/custom/afscustom.cpp
diff -c openafs/src/WINNT/install/wix/custom/afscustom.cpp:1.2 openafs/src/WINNT/install/wix/custom/afscustom.cpp:1.2.2.1
*** openafs/src/WINNT/install/wix/custom/afscustom.cpp:1.2	Tue Jun 22 23:55:13 2004
--- openafs/src/WINNT/install/wix/custom/afscustom.cpp	Mon Aug 23 11:55:09 2004
***************
*** 31,37 ****
  *         are noted in the comments section of each of the
  *         functions.
  *
! * rcsid: $Id: afscustom.cpp,v 1.2 2004/06/23 03:55:13 jaltman Exp $
  **************************************************************/
  
  // Only works for Win2k and above
--- 31,37 ----
  *         are noted in the comments section of each of the
  *         functions.
  *
! * rcsid: $Id: afscustom.cpp,v 1.2.2.1 2004/08/23 15:55:09 jaltman Exp $
  **************************************************************/
  
  // Only works for Win2k and above
***************
*** 376,378 ****
--- 376,446 ----
  	}
  	return rv;
  }
+ 
+ /* Create or remove the 'AFS Client Admins' group.  Initially
+    it will hold members of the Administrator group. */
+ 
+ MSIDLLEXPORT CreateAFSClientAdminGroup( MSIHANDLE hInstall ) {
+     UINT rv;
+     rv = createAfsAdminGroup();
+     if(rv) {
+         if(rv == ERROR_ALIAS_EXISTS) {
+             /* The group already exists, probably from a previous
+                installation.  We let things be. */
+             return ERROR_SUCCESS;
+         }
+ 
+         ShowMsiError( hInstall, ERR_GROUP_CREATE_FAILED, rv );
+         return rv;
+     }
+ 
+     rv = initializeAfsAdminGroup();
+     if(rv)
+         ShowMsiError( hInstall, ERR_GROUP_MEMBER_FAILED, rv );
+     return rv;
+ }
+ 
+ MSIDLLEXPORT RemoveAFSClientAdminGroup( MSIHANDLE hInstall ) {
+     removeAfsAdminGroup();
+     return ERROR_SUCCESS;
+ }
+ 
+ #define AFSCLIENT_ADMIN_GROUPNAMEW L"AFS Client Admins"
+ #define AFSCLIENT_ADMIN_COMMENTW L"AFS Client Administrators"
+ 
+ UINT createAfsAdminGroup(void) {
+     LOCALGROUP_INFO_1 gInfo;
+     DWORD dwError;
+     NET_API_STATUS status;
+ 
+     gInfo.lgrpi1_name = AFSCLIENT_ADMIN_GROUPNAMEW;
+     gInfo.lgrpi1_comment = AFSCLIENT_ADMIN_COMMENTW;
+     status = NetLocalGroupAdd(NULL, 1, (LPBYTE) &gInfo, &dwError);
+ 
+     return status;
+ }
+ 
+ UINT initializeAfsAdminGroup(void) {
+     PSID psidAdmin = NULL;
+     SID_IDENTIFIER_AUTHORITY auth = SECURITY_NT_AUTHORITY;
+     NET_API_STATUS status;
+     LOCALGROUP_MEMBERS_INFO_0 *gmAdmins = NULL;
+     DWORD dwNEntries, dwTEntries;
+ 
+     status = NetLocalGroupGetMembers(NULL, L"Administrators", 0, (LPBYTE *) &gmAdmins, MAX_PREFERRED_LENGTH, &dwNEntries, &dwTEntries, NULL);
+     if(status)
+         return status;
+ 
+     status = NetLocalGroupAddMembers(NULL, AFSCLIENT_ADMIN_GROUPNAMEW, 0, (LPBYTE) gmAdmins, dwNEntries);
+ 
+     NetApiBufferFree( gmAdmins );
+ 
+     return status;
+ }
+ 
+ UINT removeAfsAdminGroup(void) {
+     NET_API_STATUS status;
+     status = NetLocalGroupDel(NULL, AFSCLIENT_ADMIN_GROUPNAMEW);
+     return status;
+ }
+ 
Index: openafs/src/WINNT/install/wix/custom/afscustom.h
diff -c openafs/src/WINNT/install/wix/custom/afscustom.h:1.2 openafs/src/WINNT/install/wix/custom/afscustom.h:1.2.2.1
*** openafs/src/WINNT/install/wix/custom/afscustom.h:1.2	Tue Jun 22 23:55:13 2004
--- openafs/src/WINNT/install/wix/custom/afscustom.h	Mon Aug 23 11:55:09 2004
***************
*** 27,33 ****
   *
   * Declarations for OpenAFS MSI setup tools
   *
!  * rcsid : $Id: afscustom.h,v 1.2 2004/06/23 03:55:13 jaltman Exp $
   */
  
  #ifndef __afsMsiTools_H__
--- 27,33 ----
   *
   * Declarations for OpenAFS MSI setup tools
   *
!  * rcsid : $Id: afscustom.h,v 1.2.2.1 2004/08/23 15:55:09 jaltman Exp $
   */
  
  #ifndef __afsMsiTools_H__
***************
*** 38,43 ****
--- 38,44 ----
  #include<msiquery.h>
  #include<stdio.h>
  #include<string.h>
+ #include<lm.h>
  
  #define MSIDLLEXPORT UINT __stdcall
  
***************
*** 63,74 ****
--- 64,80 ----
  #define ERR_SCS_FAILED 4003
  #define ERR_ABORT 4004
  #define ERR_NSS_FAILED 4005
+ #define ERR_GROUP_CREATE_FAILED 4006
+ #define ERR_GROUP_MEMBER_FAILED 4007
  
  /* non-exported */
  int npi_CheckAndAddRemove( LPTSTR, LPTSTR, int );
  DWORD InstNetProvider(MSIHANDLE, int);
  void ShowMsiError(MSIHANDLE, DWORD, DWORD);
  DWORD ConfigService(int);
+ UINT createAfsAdminGroup(void);
+ UINT initializeAfsAdminGroup(void);
+ UINT removeAfsAdminGroup(void);
  
  /* exported */
  MSIDLLEXPORT InstallNetProvider( MSIHANDLE );
***************
*** 77,81 ****
--- 83,89 ----
  MSIDLLEXPORT ConfigureServerService( MSIHANDLE );
  MSIDLLEXPORT AbortMsiImmediate( MSIHANDLE );
  MSIDLLEXPORT UninstallNsisInstallation( MSIHANDLE hInstall );
+ MSIDLLEXPORT CreateAFSClientAdminGroup( MSIHANDLE hInstall );
+ MSIDLLEXPORT RemoveAFSClientAdminGroup( MSIHANDLE hInstall );
  
  #endif /*__afsMsiTools_H__*/
Index: openafs/src/WINNT/install/wix/lang/en_US/strings.wxl
diff -c openafs/src/WINNT/install/wix/lang/en_US/strings.wxl:1.1 openafs/src/WINNT/install/wix/lang/en_US/strings.wxl:1.1.2.2
*** openafs/src/WINNT/install/wix/lang/en_US/strings.wxl:1.1	Mon Jun 21 01:21:50 2004
--- openafs/src/WINNT/install/wix/lang/en_US/strings.wxl	Mon Aug 23 11:55:10 2004
***************
*** 35,46 ****
--- 35,49 ----
      <String Id="StrCfgWzdDesc">Server Configuration Wizard</String>
  
      <String Id="StrLaunchCond">OpenAFS for Windows is currently only packaged for Windows 2000,XP and 2003</String>
+     <String Id="AdminRequired">Installation of OpenAFS for Windows requires administrative privileges</String>
  
  	<String Id="ErrNPIFailed">Installation of Network Provider failed.  System error [2]</String>
  	<String Id="ErrSCCFailed">Configuration of client service failed.  System error [2]</String>
  	<String Id="ErrSCSFailed">Configuration of server service failed.  System error [2]</String>
  	<String Id="ErrAbort">Installation aborted : [2]</String>
  	<String Id="ErrNsisFailed">Uninstallation of the NSIS installation of OpenAFS failed with code [2]</String>
+ 	<String Id="ErrCantCreateGroup">Can't create AFS Client Admin group.  NET_API_Error [2]</String>
+ 	<String Id="ErrCantAddMembers">Can't add members to AFS Client Admin group. NET_API_Error [2]</String>
  	
  	<String Id="ActInstallLoopback">Installing loopback adapter</String>
  	<String Id="ActRemoveLoopback">Removing existing loopback adapter</String>
Index: openafs/src/WINNT/install/wix/lang/en_US/ui.wxi
diff -c openafs/src/WINNT/install/wix/lang/en_US/ui.wxi:1.6 openafs/src/WINNT/install/wix/lang/en_US/ui.wxi:1.6.2.2
*** openafs/src/WINNT/install/wix/lang/en_US/ui.wxi:1.6	Sun Jul 25 16:53:20 2004
--- openafs/src/WINNT/install/wix/lang/en_US/ui.wxi	Mon Aug 23 11:55:10 2004
***************
*** 130,136 ****
        <Dialog Id="AdminWelcomeDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
          <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_Next]">
            <Publish Property="InstallMode" Value="Server Image">1</Publish>
!           <Publish Event="NewDialog" Value="AdminRegistrationDlg">1</Publish>
          </Control>
          <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
            <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
--- 130,136 ----
        <Dialog Id="AdminWelcomeDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
          <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_Next]">
            <Publish Property="InstallMode" Value="Server Image">1</Publish>
!           <Publish Event="NewDialog" Value="AdminInstallPointDlg">1</Publish>
          </Control>
          <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
            <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
***************
*** 1037,1042 ****
--- 1037,1044 ----
  	  <Error Id="4003">$(loc.ErrSCSFailed)</Error>
  	  <Error Id="4004">$(loc.ErrAbort)</Error>
  	  <Error Id="4005">$(loc.ErrNsisFailed)</Error>
+ 	  <Error Id="4006">$(loc.ErrCantCreateGroup)</Error>
+ 	  <Error Id="4007">$(loc.ErrCantAddMembers)</Error>
  	  <ProgressText Action="RemoveLoopback" Template="[1]:([2])([3])([4])">$(loc.ActRemoveLoopback)</ProgressText>
  	  <ProgressText Action="InstallLoopback" Template="[1]:([2])([3])([4])">$(loc.ActInstallLoopback)</ProgressText>
  	  <ProgressText Action="RemoveNetProvider">$(loc.ActRemoveNetProvider)</ProgressText>
Index: openafs/src/WINNT/win9xpanel/CellServDB
diff -c openafs/src/WINNT/win9xpanel/CellServDB:1.1 openafs/src/WINNT/win9xpanel/CellServDB:1.1.18.1
*** openafs/src/WINNT/win9xpanel/CellServDB:1.1	Mon Apr 30 02:51:28 2001
--- openafs/src/WINNT/win9xpanel/CellServDB	Tue Aug 17 16:17:22 2004
***************
*** 1,40 ****
! >andrew.cmu.edu		#Carnegie Mellon University - Computing Services
! 128.2.10.11			#vice11.fs.andrew.cmu.edu
! 128.2.10.12			#vice12.fs.andrew.cmu.edu
! 128.2.10.2			#vice2.fs.andrew.cmu.edu
! 128.2.10.28			#vice28.fs.andrew.cmu.edu
! 128.2.10.7			#vice7.fs.andrew.cmu.edu
! >cs.cmu.edu		#Carnegie Mellon University - School of Comp. Sci.
! 128.2.206.130			#cucumber.srv.cs.cmu.edu
! 128.2.222.199			#papaya.srv.cs.cmu.edu
! 128.2.242.86			#lemon.srv.cs.cmu.edu
! >ece.cmu.edu		#Carnegie Mellon University - Elec. Comp. Eng. Dept.
! 128.2.129.7			#porok.ece.cmu.edu
! 128.2.129.8			#vicio.ece.cmu.edu
! 128.2.129.9			#e-xing.ece.cmu.edu
! >athena.mit.edu		#MIT/Athena cell
! 18.70.0.6			#prill.mit.edu.
! 18.145.0.25			#agamemnon.mit.edu.
! 18.159.0.34			#chimera.mit.edu.
! >dev.mit.edu		#MIT/IS Development cell
! 18.86.0.28			#wham.mit.edu.
! 18.86.0.50			#hum.mit.edu.
! 18.86.0.51			#rattle.mit.edu.
! >net.mit.edu		#MIT/Network Group cell
! 18.72.1.38			#gracie.mit.edu.
! 18.72.0.26			#cetus.mit.edu.
! >sipb.mit.edu		#MIT/SIPB cell
! 18.181.0.19			#reynelda.mit.edu.
! 18.181.0.23			#ronald-ann.mit.edu.
! 18.181.0.22			#rosebud.mit.edu.
! >ir.stanford.edu	#Stanford University
! 171.64.7.222			#afsdb1.stanford.edu
! 171.64.7.234			#afsdb2.stanford.edu
! 171.64.7.246			#afsdb3.stanford.edu
! >umr.edu		#University of Missouri - Rolla
! 131.151.1.59			#afs1.umr.edu
! 131.151.1.70			#afs6.umr.edu
! 131.151.1.146			#afs5.umr.edu
! >dementia.org		#Dementia Unlimited
! 128.2.35.149			#alycia.dementia.org
! 128.2.120.216			#meredith.dementia.org
--- 1,503 ----
! >grand.central.org      #GCO Public CellServDB 17 Aug 2004
! 18.7.14.88                      #grand-opening.mit.edu
! 128.2.191.224                   #penn.central.org
! >wu-wien.ac.at          #University of Economics, Vienna, Austria
! 137.208.3.33                    #afsdb1.wu-wien.ac.at
! 137.208.7.4                     #afsdb2.wu-wien.ac.at
! 137.208.7.7                     #afsdb3.wu-wien.ac.at
! >hephy.at               #hephy-vienna
! 193.170.243.10                  #mowgli.oeaw.ac.at
! 193.170.243.12                  #baloo.oeaw.ac.at
! 193.170.243.14                  #akela.oeaw.ac.at
! >itp.tugraz.at          #Institute for Theoretical Physics, TU Graz, Austria
! 129.27.157.6                    #fubphsv2.tu-graz.ac.at
! 129.27.161.7                    #faepsv01.tu-graz.ac.at
! 129.27.161.15                   #faepsv02.tu-graz.ac.at
! >cern.ch                #European Laboratory for Particle Physics, Geneva
! 137.138.128.148                 #afsdb1.cern.ch
! 137.138.246.50                  #afsdb3.cern.ch
! 137.138.246.51                  #afsdb2.cern.ch
! >ams.cern.ch            #AMS Experiment
! 137.138.206.77                  #pcamsf2.cern.ch
! 137.138.206.123                 #pcamsf4.cern.ch
! >ethz.ch                #Swiss Federal Inst. of Tech. - Zurich, Switzerland
! 129.132.97.19                   #amalthea.ethz.ch
! 129.132.97.27                   #nethzafs-001.ethz.ch
! 129.132.115.3                   #himalia.ethz.ch
! 129.132.115.37                  #nethzafs-005.ethz.ch
! 129.132.115.38                  #nethzafs-006.ethz.ch
! >psi.ch                 #Paul Scherrer Institut - Villigen, Switzerland
! 129.129.16.10                   #afs1.psi.ch
! 129.129.16.11                   #afs2.psi.ch
! >extundo.com            #Simon Josefsson's cell
! 195.42.214.241                  #slipsten.extundo.com
! >mekinok.com            #Mekinok, Inc.
! 4.36.43.98                      #loggerhead.mekinok.com
! >membrain.com           #membrain.com
! 66.93.118.125                   #stormy
! 130.85.24.11                    #weasel
! 130.85.24.13                    #straykitten
! >midnightlinux.com      #Midnight Linux, Pittsburgh PA
! 66.93.62.18                     #romulus.midnihtlinux.com
! 66.93.62.20                     #yar.midnightlinux.com
! >setfilepointer.com     #SetFilePointer.com
! 63.224.10.2                     #hamlet.SetFilePointer.com
! 63.224.10.4                     #troilus.SetFilePointer.com
! >sodre.cx               #Sodre.cx
! 128.8.140.165                   #greed.sodre.cx
! >desy.de                #Deutsches Elektronen-Synchrotron
! 131.169.40.62                   #vayu.desy.de
! 131.169.244.60                  #solar00.desy.de
! >gppc.de                #GPP Chemnitz mbH
! 213.187.92.33                   #gpp1.gppc.de
! 213.187.92.34                   #paulchen.gppc.de
! 213.187.92.35                   #lotus.gppc.de
! >ifh.de                 #DESY Zeuthen
! 141.34.22.10                    #romulus.ifh.de
! 141.34.22.11                    #remus.ifh.de
! 141.34.22.29                    #hekate.ifh.de
! >lrz-muenchen.de        #Leibniz Computing Centre, Germany
! 129.187.10.36                   #afs1.lrz-muenchen.de
! 129.187.10.56                   #afs3.lrz-muenchen.de
! 129.187.10.57                   #afs2.lrz-muenchen.de
! >ipp-garching.mpg.de    #Institut fuer Plasmaphysik
! 130.183.9.5                     #afs-db1.rzg.mpg.de
! 130.183.100.10                  #afs-db2.aug.ipp-garching.mpg.de
! 130.183.100.23                  #afs-db3.aug.ipp-garching.mpg.de
! >mpe.mpg.de             #MPE cell
! 130.183.130.7                   #irafs1.mpe-garching.mpg.de
! 130.183.134.20                  #irafs2.mpe-garching.mpg.de
! >i1.informatik.rwth-aachen.de #Informatik I, RWTH Aachen
! 137.226.244.79                  #remus.informatik.rwth-aachen.de
! >tu-chemnitz.de         #Technische Universitaet Chemnitz, Germany
! 134.109.2.1                     #zuse.hrz.tu-chemnitz.de
! 134.109.2.15                    #phoenix.hrz.tu-chemnitz.de
! 134.109.200.7                   #aetius.hrz.tu-chemnitz.de
! >e18.ph.tum.de          #Experimental Physics, TU Munich, Germany
! 129.187.154.223                 #hamlet.e18.physik.tu-muenchen.de
! >uni-bonn.de            #University of Bonn, Computing Center
! 131.220.14.198                  #work15-eth.rhrz.uni-bonn.de
! 131.220.14.205                  #node05.rhrz.uni-bonn.de
! 131.220.15.197                  #afs-db1.rhrz.uni-bonn.de
! >atlass01.physik.uni-bonn.de #Bonn ATLAS
! 131.220.165.43                  #atlass01.physik.uni-bonn.de
! >uni-freiburg.de        #Albert-Ludwigs-Universitat Freiburg
! 132.230.6.235                   #sv6.ruf.uni-freiburg.de
! 132.230.6.236                   #sv7.ruf.uni-freiburg.de
! 132.230.6.237                   #sv8.ruf.uni-freiburg.de
! >physik.uni-freiburg.de #institute of physics, university Freiburg, Germany
! 132.230.77.16                   #hepafs.physik.uni-freiburg.de
! >urz.uni-heidelberg.de  #Uni Heidelberg (Rechenzentrum)
! 129.206.119.10                  #afsdb.urz.uni-heidelberg.de
! 129.206.119.16                  #afsdb1.urz.uni-heidelberg.de
! 129.206.119.17                  #afsdb2.urz.uni-heidelberg.de
! >uni-hohenheim.de       #University of Hohenheim
! 144.41.2.2                      #rs13.serv.uni-hohenheim.de
! 144.41.2.3                      #rs14.serv.uni-hohenheim.de
! 144.41.2.4                      #rs15.serv.uni-hohenheim.de
! >rz.uni-jena.de         #Rechenzentrum University of Jena, Germany
! 141.35.2.160                    #lc00.rz.uni-jena.de
! 141.35.7.9                      #fsuj01.rz.uni-jena.de
! 141.35.7.10                     #zaphod.rz.uni-jena
! >meteo.uni-koeln.de     #Univ. of Cologne - Inst. for Geophysics & Meteorology
! 134.95.144.22                   #afs1.meteo.uni-koeln.de
! 134.95.144.24                   #afs2.meteo.uni-koeln.de
! >rrz.uni-koeln.de       #University of Cologne - Reg Comp Center
! 134.95.19.3                     #afsdb1.rrz.uni-koeln.de
! 134.95.19.30                    #fileserv3.rrz.uni-koeln.de
! 134.95.67.97                    #afs.thp.uni-koeln.de
! 134.95.140.190                  #rzkbserv.rrz.uni-koeln.de
! >physik.uni-mainz.de    #institute of physics, university Mainz, Germany
! 134.93.130.93                   #hardy.physik.uni-mainz.de
! >uni-mannheim.de        #Uni Mannheim (Rechenzentrum)
! 134.155.97.204                  #afsdb1.uni-mannheim.de
! 134.155.97.205                  #afsdb2.uni-mannheim.de
! 134.155.97.206                  #afsdb3.uni-mannheim.de
! >physik.uni-wuppertal.de #Physics department of Bergische Universität Wuppertal
! 132.195.104.3                   #afs1.physik.uni-wuppertal.de
! 132.195.104.230                 #afs2.physik.uni-wuppertal.de
! >s-et.aau.dk            #Aalborg Univ., The Student Society, Denmark
! 130.225.196.22                  #afs.s-et.aau.dk
! >ies.auc.dk             #Aalborg Univ., Inst. of Electronic Systems, Denmark
! 130.225.51.73                   #afsdb1.kom.auc.dk
! 130.225.51.74                   #afsdb2.kom.auc.dk
! 130.225.51.85                   #afsdb3.kom.auc.dk
! >asu.edu                #Arizona State University
! 129.219.10.69                   #authen2.asu.edu
! 129.219.10.70                   #authen1.asu.edu
! 129.219.10.72                   #authen3.asu.edu
! 129.219.100.16                  #authen4.asu.edu
! >hep.caltech.edu        #CalTech High Energy Physics
! 131.215.126.150                 #afs.hep.caltech.edu
! >andrew.cmu.edu         #Carnegie Mellon University - Computing Services Cell
! 128.2.10.2                      #vice2.fs.andrew.cmu.edu
! 128.2.10.7                      #vice7.fs.andrew.cmu.edu
! 128.2.10.11                     #vice11.fs.andrew.cmu.edu
! 128.2.10.28                     #vice28.fs.andrew.cmu.edu
! 128.2.32.44                     #new-vice12.fs.andrew.cmu.edu
! >club.cc.cmu.edu        #Carnegie Mellon University Computer Club
! 128.2.4.131                     #yttrium.club.cc.cmu.edu
! 128.2.4.132                     #zirconium.club.cc.cmu.edu
! >chem.cmu.edu           #Carnegie Mellon University - Chemistry Dept.
! 128.2.40.134                    #afs.chem.cmu.edu
! 128.2.40.140                    #afs2.chem.cmu.edu
! >cs.cmu.edu             #Carnegie Mellon University - School of Comp. Sci.
! 128.2.194.178                   #cherry.srv.cs.cmu.edu
! 128.2.194.179                   #pumpkin.srv.cs.cmu.edu
! 128.2.194.180                   #strawberry.srv.cs.cmu.edu
! >ece.cmu.edu            #Carnegie Mellon University - Elec. Comp. Eng. Dept.
! 128.2.129.7                     #porok.ece.cmu.edu
! 128.2.129.8                     #vicio.ece.cmu.edu
! 128.2.129.9                     #e-xing.ece.cmu.edu
! >scotch.ece.cmu.edu     #CMU ECE CALCM research group
! 128.2.134.82                    #lagavulin.ece.cmu.edu
! >qatar.cmu.edu          #Carnegie Mellon University - Qatar Campus Cell
! 204.194.25.7                    #afs1.qatar.cmu.edu
! 204.194.25.8                    #afs2.qatar.cmu.edu
! >sbp.ri.cmu.edu         #Carnegie Mellon University - Sensor Based Planning Lab
! 128.2.105.174                   #voronoi.sbp.ri.cmu.edu
! 128.2.105.175                   #nihao.sbp.ri.cmu.edu
! >msc.cornell.edu        #Cornell University Materials Science Center
! 128.84.231.242                  #miranda.ccmr.cornell.edu
! 128.84.241.35                   #co.ccmr.cornell.edu
! 128.84.249.78                   #dax.ccmr.cornell.edu
! >dbic.dartmouth.edu     #Dartmouth Brain Imaging Center
! 129.170.30.143                  #dbicafs1.dartmouth.edu
! 129.170.30.144                  #dbicafs2.dartmouth.edu
! 129.170.30.145                  #dbicafs3.dartmouth.edu
! >northstar.dartmouth.edu #Dartmouth College Research Computing
! 129.170.16.22                   #halley.dartmouth.edu
! 129.170.16.42                   #oort.dartmouth.edu
! 129.170.16.43                   #cygnusx1.dartmouth.edu
! >iastate.edu            #Iowa State University
! 129.186.1.243                   #afsdb-1.iastate.edu
! 129.186.6.243                   #afsdb-2.iastate.edu
! 129.186.142.243                 #afsdb-3.iastate.edu
! >athena.mit.edu         #MIT/Athena cell
! 18.7.1.66                       #paris.mit.edu.
! 18.7.1.74                       #chimera.mit.edu.
! 18.158.0.37                     #prill.mit.edu.
! >dev.mit.edu            #MIT/IS Development cell
! 18.7.1.70                       #wham.mit.edu.
! 18.7.15.89                      #rattle.mit.edu.
! 18.7.15.93                      #hum.mit.edu.
! >net.mit.edu            #MIT/Network Group cell
! 18.7.7.73                       #gracie.mit.edu
! 18.7.21.95                      #george.mit.edu
! >sipb.mit.edu           #MIT/SIPB cell
! 18.181.0.19                     #reynelda.mit.edu.
! 18.181.0.22                     #rosebud.mit.edu.
! 18.181.0.23                     #ronald-ann.mit.edu.
! >msu.edu                #Michigan State University Main Cell
! 35.9.7.10                       #afsdb0.cl.msu.edu
! >nd.edu                 #University of Notre Dame
! 129.74.223.17                   #john.helios.nd.edu
! 129.74.223.33                   #lizardo.helios.nd.edu
! 129.74.223.65                   #buckaroo.helios.nd.edu
! >pitt.edu               #University of Pittsburgh
! 136.142.8.15                    #afs09.srv.cis.pitt.edu
! 136.142.8.20                    #afs10.srv.cis.pitt.edu
! 136.142.8.21                    #afs11.srv.cis.pitt.edu
! >cs.pitt.edu            #University of Pittsburgh - Computer Science
! 130.49.220.11                   #afs01.cs.pitt.edu
! 130.49.220.12                   #afs02.cs.pitt.edu
! 130.49.220.13                   #afs03.cs.pitt.edu
! >psc.edu                #PSC (Pittsburgh Supercomputing Center)
! 128.182.59.182                  #shaggy.psc.edu
! 128.182.66.184                  #velma.psc.edu
! 128.182.66.185                  #daphne.psc.edu
! >scoobydoo.psc.edu      #PSC Test Cell
! 128.182.59.181                  #scooby.psc.edu
! >cede.psu.edu           #Penn State - Center for Engr. Design & Entrepeneurship
! 146.186.218.10                  #greenly.cede.psu.edu
! 146.186.218.60                  #b50.cede.psu.edu
! 146.186.218.246                 #stalin.cede.psu.edu
! >rose-hulman.edu        #Rose-Hulman Institute of Technology
! 137.112.7.11                    #afs1.rose-hulman.edu
! 137.112.7.12                    #afs2.rose-hulman.edu
! 137.112.7.13                    #afs3.rose-hulman.edu
! >cs.rose-hulman.edu     #Rose-Hulman CS Department
! 137.112.40.10                   #galaxy.cs.rose-hulman.edu
! >rpi.edu                #Rensselaer Polytechnic Institute
! 128.113.22.11                   #saul.server.rpi.edu
! 128.113.22.12                   #joab.server.rpi.edu
! 128.113.22.13                   #korah.server.rpi.edu
! 128.113.22.14                   #achan.server.rpi.edu
! >hep.sc.edu             #University of South Carolina, Dept. of Physics
! 129.252.78.77                   #cpeven.physics.sc.edu
! >cs.stanford.edu        #Stanford University Computer Science Department
! 171.64.64.10                    #cs-afs-1.Stanford.EDU
! 171.64.64.66                    #cs-afs-2.stanford.edu
! 171.64.64.69                    #cs-afs-3.stanford.edu
! >ir.stanford.edu        #Stanford University
! 171.64.7.222                    #afsdb1.stanford.edu
! 171.64.7.234                    #afsdb2.stanford.edu
! 171.64.7.246                    #afsdb3.stanford.edu
! >slac.stanford.edu      #Stanford Linear Accelerator Center
! 134.79.18.25                    #afsdb1.slac.stanford.edu
! 134.79.18.26                    #afsdb2.slac.stanford.edu
! 134.79.18.27                    #afsdb3.slac.stanford.edu
! >cats.ucsc.edu          #UC Santa Cruz, Comm. and Tech. Services, California U.S.A
! 128.114.129.14                  #elan.ucsc.edu
! 128.114.129.15                  #ichabod.ucsc.edu
! 128.114.129.18                  #maneki.ucsc.edu
! >acm.uiuc.edu           #ACM at the University of Illinois
! 128.174.251.8                   #alnitak.acm.uiuc.edu
! 128.174.251.9                   #alnilam.acm.uiuc.edu
! 128.174.251.10                  #mintaka.acm.uiuc.edu
! >ncsa.uiuc.edu          #University of Illinois
! 141.142.3.5                     #congo.ncsa.uiuc.edu
! 141.142.3.8                     #nile.ncsa.uiuc.edu
! 141.142.3.9                     #kaskaskia.ncsa.uiuc.edu
! >umbc.edu               #University of Maryland, Baltimore County
! 130.85.24.23                    #db2.afs.umbc.edu
! 130.85.24.87                    #db3.afs.umbc.edu
! 130.85.24.101                   #db1.afs.umbc.edu
! >glue.umd.edu           #University of Maryland - Project Glue
! 128.8.70.11                     #olmec.umd.edu
! 128.8.236.4                     #egypt.umd.edu
! 128.8.236.230                   #babylon.umd.edu
! >wam.umd.edu            #University of Maryland Network WAM Project
! 128.8.70.9                      #csc-srv.wam.umd.edu
! 128.8.236.5                     #avw-srv.wam.umd.edu
! 128.8.236.231                   #ptx-srv.wam.umd.edu
! >umich.edu              #University of Michigan - Campus
! 141.211.1.32                    #fear.ifs.umich.edu
! 141.211.1.33                    #surprise.ifs.umich.edu
! 141.211.1.34                    #ruthless.ifs.umich.edu
! >atlas.umich.edu        #ATLAS group cell in physics at University of Michigan
! 141.211.43.102                  #linat02.grid.umich.edu
! 141.211.43.106                  #linat06.grid.umich.edu
! 141.211.43.109                  #atgrid.grid.umich.edu
! >citi.umich.edu         #Center for Information Technology Integration
! 141.211.133.5                   #babylon.citi.umich.edu
! >lsa.umich.edu          #University of Michigan - College of LS&A
! 141.211.54.132                  #curtis.admin.lsa.umich.edu
! 141.211.211.53                  #gerow.lsa.umich.edu
! 141.211.211.72                  #collines.lsa.umich.edu
! 141.211.211.153                 #hodges.lsa.umich.edu
! >math.lsa.umich.edu     #University of Michigan - Math Department
! 141.211.61.40                   #ike.math.lsa.umich.edu
! 141.211.61.41                   #clark.math.lsa.umich.edu
! 141.211.61.42                   #nimitz.math.lsa.umich.edu
! >umr.edu                #University of Missouri - Rolla
! 131.151.1.59                    #afsdb1.umr.edu
! 131.151.1.70                    #afsdb3.umr.edu
! 131.151.1.146                   #afsdb2.umr.edu
! >physics.unc.edu        #Univ. of NC at Chapel Hill, Dept. of Physics
! 152.2.5.2                       #valerian.physics.unc.edu
! 152.2.5.3                       #augustus.physics.unc.edu
! 152.2.7.67                      #nerva.astro.unc.edu
! >uncc.edu               #University of NC at Charlotte Mosaic AFS Cell
! 152.15.10.70                    #as-sm1.uncc.edu
! 152.15.13.7                     #as-sm2.uncc.edu
! 152.15.30.27                    #fs-kenn3.uncc.edu
! >eng.utah.edu           #University of Utah - Engineering
! 155.99.222.9                    #lenny.eng.utah.edu
! 155.99.222.10                   #carl.eng.utah.edu
! >cs.uwm.edu             #University of Wisconsin--Milwaukee
! 129.89.38.124                   #solomons.cs.uwm.edu
! >cs.wisc.edu            #Univ. of Wisconsin-Madison, Computer Sciences Dept.
! 128.105.132.14                  #timon.cs.wisc.edu
! 128.105.132.15                  #pumbaa.cs.wisc.edu
! 128.105.132.16                  #zazu.cs.wisc.edu
! >engr.wisc.edu          #University of Wisconsin-Madison, College of Engineering
! 144.92.13.14                    #larry.cae.wisc.edu
! 144.92.13.15                    #curly.cae.wisc.edu
! 144.92.13.16                    #moe.cae.wisc.edu
! >hep.wisc.edu           #University of Wisconsin -- High Energy Physics
! 128.104.28.219                  #anise.physics.wisc.edu
! >physics.wisc.edu       #Univ. of Wisconsin-Madison, Physics Department
! 128.104.220.51                  #bubbles.physics.wisc.edu
! 128.104.220.52                  #buttercup.physics.wisc.edu
! 128.104.220.53                  #blossom.physics.wisc.edu
! >ifca.unican.es         #Instituto de Fisica de Cantabria (IFCA), Santander, Spain
! 193.144.209.20                  #gridwall.ifca.unican.es
! >ific.uv.es             #Instituto de Fisica Corpuscular, Valencia, Spain
! 147.156.163.11                  #alpha.ific.uv.es
! >biocenter.helsinki.fi  #University of Helsinki, Institute of Biotechnology
! 128.214.58.174                  #afsdb1.biocenter.helsinki.fi
! 128.214.88.114                  #afsdb2.biocenter.helsinki.fi
! >dapnia.saclay.cea.fr   #CEA DAPNIA
! 132.166.32.7                    #dphrsg.saclay.cea.fr
! 132.166.32.12                   #dphrsl.saclay.cea.fr
! >in2p3.fr               #IN2P3 production cell
! 134.158.232.11                  #ccafsdb1.in2p3.fr
! 134.158.232.12                  #ccafsdb2.in2p3.fr
! 134.158.232.13                  #ccafsdb3.in2p3.fr
! >anl.gov                #Argonne National Laboratory
! 146.137.96.33                   #arteus.ctd.anl.gov
! 146.137.162.88                  #agamemnon.ctd.anl.gov
! 146.137.194.80                  #antenor.ctd.anl.gov
! >rhic.bnl.gov           #Relativistic Heavy Ion Collider
! 130.199.6.51                    #rafs03.rcf.bnl.gov
! 130.199.6.52                    #rafs02.rcf.bnl.gov
! 130.199.6.69                    #rafs01.rcf.bnl.gov
! >usatlas.bnl.gov        #US Atlas Tier 1 Facility at BNL
! 130.199.48.32                   #aafs01.usatlas.bnl.gov
! 130.199.48.33                   #aafs02.usatlas.bnl.gov
! 130.199.48.34                   #aafs03.usatlas.bnl.gov
! >fnal.gov               #Fermi National Acclerator Laboratory
! 131.225.68.1                    #fsus01.fnal.gov
! 131.225.68.4                    #fsus03.fnal.gov
! 131.225.68.14                   #fsus04.fnal.gov
! >ic-afs.arc.nasa.gov    #Code IC, Ames Research Center
! 128.102.105.62                  #udanax.arc.nasa.gov
! >nersc.gov              #National Energy Research Supercomputer Center
! 128.55.128.250                  #mars.nersc.gov
! 128.55.128.252                  #alfred.nersc.gov
! 128.55.128.254                  #lurch.nersc.gov
! >caspur.it              #CASPUR Inter-University Computing Consortium, Rome
! 193.204.5.45                    #pomodoro.caspur.it
! 193.204.5.46                    #banana.caspur.it
! 193.204.5.50                    #maslo.caspur.it
! >fusione.it             #Assoz. FUSIONE/Euratom, ENEA, Frascati-Italy
! 192.107.90.2                    #fusafs1.frascati.enea.it
! 192.107.90.3                    #fusafs2.frascati.enea.it
! 192.107.90.4                    #fusafs3.frascati.enea.it
! >icemb.it               #ICEMB, Universita' La Sapienza - Rome - Italy
! 193.204.6.130                   #icembfs.caspur.it
! >infn.it                #Istituto Nazionale di Fisica Nucleare (INFN), Italia
! 131.154.1.7                     #afs3.infn.it
! 141.108.3.252                   #afs1.infn.it
! 192.84.134.75                   #afs2.infn.it
! >kloe.infn.it           #INFN, KLOE experiment at Laboratori di Frascati
! 192.135.25.111                  #kloeafs1.lnf.infn.it
! 192.135.25.112                  #kloeafs2.lnf.infn.it
! >le.infn.it             #INFN, Sezione di Lecce
! 192.84.152.40                   #afs01.le.infn.it
! 192.84.152.148                  #afs02.le.infn.it
! >lnf.infn.it            #INFN, Laboratori Nazionali di Frascati
! 193.206.84.121                  #afs1.lnf.infn.it
! 193.206.84.122                  #afs2.lnf.infn.it
! 193.206.84.123                  #afs3.lnf.infn.it
! >lngs.infn.it           #INFN, Laboratori Nazionali di Gran Sasso
! 192.84.135.21                   #rsgs05.lngs.infn.it
! >pi.infn.it             #INFN, Sezione di Pisa
! 131.114.134.26                  #unknownhost.pi.infn.it
! 192.84.133.50                   #aix1.pi.infn.it
! >psm.it                 #Progetto San Marco, Universita' di Roma-1
! 151.100.1.65                    #atlante.psm.uniroma1.it
! >tgrid.it               #CASPUR-CILEA-CINECA Grid Cell
! 193.204.5.33                    #cccgrid.caspur.it
! >ictp.trieste.it        #The Abdus Salam International Centre for Theoretical Physics (IC
! 140.105.16.8                    #fs1.ictp.trieste.it
! 140.105.16.9                    #fs2.ictp.trieste.it
! >ing.uniroma1.it        #Universita' La Sapienza, Fac. Ingeneria
! 151.100.85.253                  #alfa.ing.uniroma1.it
! >vn.uniroma3.it         #University of Rome 3, Area Vasca Navale
! 193.204.161.136                 #alfa.dia.uniroma3.it
! 193.204.161.137                 #beta.dia.uniroma3.it
! 193.204.161.138                 #gamma.dia.uniroma3.it
! >italia                 #Italian public AFS cell
! 193.204.5.9                     #afs.caspur.it
! >cmf.nrl.navy.mil       #Naval Research Lab - CCS
! 134.207.10.68                   #picard.cmf.nrl.navy.mil
! 134.207.10.69                   #riker.cmf.nrl.navy.mil
! 134.207.10.70                   #kirk.cmf.nrl.navy.mil
! >lcp.nrl.navy.mil       #Naval Research Lab - Lab for Computational Physics
! 132.250.114.2                   #afs1.lcp.nrl.navy.mil
! 132.250.114.4                   #afs2.lcp.nrl.navy.mil
! 132.250.114.6                   #afs3.lcp.nrl.navy.mil
! >es.net                 #Energy Sciences Net
! 198.128.3.21                    #fs1.es.net
! 198.128.3.22                    #fs2.es.net
! 198.128.3.23                    #fs3.es.net
! >laroia.net             #Laroia Networks
! 66.66.102.254                   #supercore.laroia.net
! >sinenomine.net         #Sine Nomine Associates
! 66.92.236.139                   #afs.sinenomine.net
! >slackers.net           #The Slackers' Network
! 63.201.48.27                    #alexandria.slackers.net
! >nikhef.nl              #The Dutch National Institute for High Energy Physics
! 192.16.185.26                   #afs1.nikhef.nl
! 192.16.185.27                   #afs2.nikhef.nl
! >1ts.org                #KCR/private Karl Ramm, Cambridge, MA
! 4.36.43.102                     #dol-guldur.1ts.org
! >bazquux.org            #Baz Quux Organization
! 66.207.142.196                  #baxquux.org
! >coed.org               #Adam Pennington's Cell
! 66.93.61.184                    #vice1.coed.org
! 128.2.4.163                     #vice3.coed.org
! >dementia.org           #Dementia Unlimited
! 128.2.12.45                     #alycia.dementia.org
! 128.2.120.216                   #meredith.dementia.org
! >hackish.org            #Hackish.org
! 24.167.65.213                   #avatar.sys.hackish.org
! 128.2.120.138                   #kurma.sys.hackish.org
! >idahofuturetruck.org   #University of Idaho hybrid vehicle development
! 12.18.238.210                   #dsle210.fsr.net
! >nimlabs.org            #Nimlabs, Ink. Cell.
! 18.238.1.103                    #olfin.nimlabs.org
! 18.238.1.105                    #caerbanog.nimlabs.org
! >nomh.org               #nomh.org
! 204.29.154.12                   #iota.nomh.org
! 204.29.154.32                   #adversity.xi.nomh.org
! >oc7.org                #The OC7 Project
! 128.2.6.107                     #vice3.oc7.org
! 128.2.122.140                   #vice2.oc7.org
! >openafs.org            #OpenAFS Project
! 128.2.13.199                    #new-virtue.openafs.org
! 128.2.121.218                   #virtue.openafs.org
! 130.237.48.87                   #andrew.e.kth.se
! 130.237.48.107                  #onyx.e.kth.se
! >e.kth.se               #Royal Institute of Technology, Elektro
! 130.237.32.145                  #sonen.e.kth.se
! 130.237.48.7                    #anden.e.kth.se
! 130.237.48.244                  #fadern.e.kth.se
! >hallf.kth.se           #Royal Institute of Technology, HALLF
! 130.237.24.141                  #rasmus13.hallf.kth.se
! 130.237.24.152                  #rasmus3.hallf.kth.se
! 130.237.24.177                  #rasmus29.hallf.kth.se
! >isk.kth.se             #Royal Institute of Technology, ISK
! 130.237.202.12                  #afsdb2.isk.kth.se
! 130.237.206.13                  #afsdb1.isk.kth.se
! 130.237.209.141                 #afsdb3.isk.kth.se
! >it.kth.se              #Royal Institute of Technology, IT
! 130.237.212.15                  #ptah.it.kth.se
! 130.237.212.16                  #toth.it.kth.se
! 130.237.215.7                   #isis.it.kth.se
! >md.kth.se              #Royal Institute of Technology, MMK
! 130.237.57.68                   #trinity.md.kth.se
! 130.237.57.72                   #morpheus.md.kth.se
! 130.237.67.230                  #neo.speech.kth.se
! >mech.kth.se            #Royal Institute of Technology, MECH
! 130.237.233.143                 #castor.mech.kth.se
! 130.237.233.144                 #pollux.mech.kth.se
! >nada.kth.se            #Royal Institute of Technology, NADA
! 130.237.222.20                  #kosmos.nada.kth.se
! 130.237.223.12                  #sputnik.nada.kth.se
! 130.237.224.78                  #mir.nada.kth.se
! 130.237.227.23                  #gagarin.nada.kth.se
! 130.237.228.28                  #laika.nada.kth.se
! >pdc.kth.se             #Royal Institute of Technology, PDC
! 130.237.232.29                  #crab.pdc.kth.se
! 130.237.232.112                 #anna.pdc.kth.se
! 130.237.232.114                 #hokkigai.pdc.kth.se
! >stacken.kth.se         #Stacken Computer Club
! 130.237.234.3                   #milko.stacken.kth.se
! 130.237.234.43                  #hot.stacken.kth.se
! 130.237.237.230                 #fishburger.stacken.kth.se
! >syd.kth.se             #Royal Institute of Technology, KTH-Syd
! 130.237.83.23                   #afs.haninge.kth.se
! >physto.se              #Physics department Stockholm University
! 130.237.205.36                  #sysafs1.physto.se
! 130.237.205.72                  #sysafs2.physto.se
! >sanchin.se             #Sanchin Consulting AB, Sweden
! 192.195.148.10                  #sesan.sanchin.se
! >su.se                  #Stockholm University
! 130.237.162.81                  #afsdb1.su.se
! 130.237.162.82                  #afsdb2.su.se
! 130.237.162.230                 #afsdb3.su.se
! >f9.ijs.si              #F9, Jozef Stefan Institue
! 194.249.156.1                   #brenta.ijs.si
! >p-ng.si                #Nova Gorica Polytechnic
! 193.2.120.2                     #solkan.p-ng.si
! >phy.bris.ac.uk         #Bristol University - phyics
! 137.222.58.9                    #afs1.phy.bris.ac.uk
! >hep.man.ac.uk          #Manchester HEP
! 194.36.2.3                      #afs1.hep.man.ac.uk
! 194.36.2.4                      #afs2.hep.man.ac.uk
! 194.36.2.5                      #afs3.hep.man.ac.uk
! >rl.ac.uk               #Rutherford Appleton Lab, England
! 130.246.183.164                 #wallace.cc.rl.ac.uk
Index: openafs/src/afs/afs.h
diff -c openafs/src/afs/afs.h:1.48 openafs/src/afs/afs.h:1.48.2.1
*** openafs/src/afs/afs.h:1.48	Wed May 19 16:31:18 2004
--- openafs/src/afs/afs.h	Wed Aug 25 03:03:35 2004
***************
*** 900,906 ****
   */
  #define afs_inode_t ino64_t
  #else
! #if defined(AFS_LINUX_64BIT_KERNEL)
  #define afs_inode_t long
  #else
  #if defined(AFS_AIX51_ENV) || defined(AFS_HPUX1123_ENV)
--- 900,906 ----
   */
  #define afs_inode_t ino64_t
  #else
! #if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_S390X_LINUX24_ENV)
  #define afs_inode_t long
  #else
  #if defined(AFS_AIX51_ENV) || defined(AFS_HPUX1123_ENV)
Index: openafs/src/afs/afs_call.c
diff -c openafs/src/afs/afs_call.c:1.74 openafs/src/afs/afs_call.c:1.74.2.2
*** openafs/src/afs/afs_call.c:1.74	Wed Jul 28 23:32:56 2004
--- openafs/src/afs/afs_call.c	Wed Aug 25 03:16:11 2004
***************
*** 11,17 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_call.c,v 1.74 2004/07/29 03:32:56 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.2 2004/08/25 07:16:11 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 1148,1153 ****
--- 1148,1155 ----
      if (current->thread.flags & THREAD_IA32)
  #elif defined(AFS_PPC64_LINUX20_ENV)
      if (current->thread.flags & PPC_FLAG_32BIT) 
+ #elif defined(AFS_S390X_LINUX20_ENV)
+     if (current->thread.flags & S390_FLAG_31BIT) 
  #else
  #error Not done for this linux version
  #endif
***************
*** 1526,1531 ****
--- 1528,1536 ----
  
      afs_termState = AFSOP_STOP_RXCALLBACK;
      rx_WakeupServerProcs();
+ #ifdef AFS_AIX51_ENV
+     shutdown_rxkernel();
+ #endif
      /* shutdown_rxkernel(); */
      while (afs_termState == AFSOP_STOP_RXCALLBACK)
  	afs_osi_Sleep(&afs_termState);
***************
*** 1596,1602 ****
--- 1601,1611 ----
      shutdown_rx();
      afs_shutdown_BKG();
      shutdown_bufferpackage();
+ #endif
+ #ifdef AFS_AIX51_ENV
      shutdown_daemons();
+ #endif
+ #ifdef notdef
      shutdown_cache();
      shutdown_osi();
      shutdown_osinet();
Index: openafs/src/afs/afs_daemons.c
diff -c openafs/src/afs/afs_daemons.c:1.28 openafs/src/afs/afs_daemons.c:1.28.2.1
*** openafs/src/afs/afs_daemons.c:1.28	Thu Mar 11 14:14:46 2004
--- openafs/src/afs/afs_daemons.c	Wed Aug 25 03:16:11 2004
***************
*** 11,17 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_daemons.c,v 1.28 2004/03/11 19:14:46 rees Exp $");
  
  #ifdef AFS_AIX51_ENV
  #define __FULL_PROTO
--- 11,17 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_daemons.c,v 1.28.2.1 2004/08/25 07:16:11 shadow Exp $");
  
  #ifdef AFS_AIX51_ENV
  #define __FULL_PROTO
***************
*** 1338,1344 ****
  #ifdef AFS_AIX41_ENV
  	lock_free(&afs_asyncbuf_lock);
  	unpin(&afs_asyncbuf, sizeof(struct buf *));
! 	pin(&afs_asyncbuf_cv, sizeof(afs_int32));
  #else /* AFS_AIX41_ENV */
  	afs_busyq = NULL;
  	afs_biodcnt = 0;
--- 1338,1344 ----
  #ifdef AFS_AIX41_ENV
  	lock_free(&afs_asyncbuf_lock);
  	unpin(&afs_asyncbuf, sizeof(struct buf *));
! 	unpin(&afs_asyncbuf_cv, sizeof(afs_int32));
  #else /* AFS_AIX41_ENV */
  	afs_busyq = NULL;
  	afs_biodcnt = 0;
Index: openafs/src/afs/afs_dcache.c
diff -c openafs/src/afs/afs_dcache.c:1.42 openafs/src/afs/afs_dcache.c:1.42.2.1
*** openafs/src/afs/afs_dcache.c:1.42	Sat May  8 00:33:07 2004
--- openafs/src/afs/afs_dcache.c	Wed Aug 25 03:09:32 2004
***************
*** 14,20 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_dcache.c,v 1.42 2004/05/08 04:33:07 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.1 2004/08/25 07:09:32 shadow Exp $");
  
  #include "afs/sysincludes.h"	/*Standard vendor system headers */
  #include "afsincludes.h"	/*AFS-based standard headers */
***************
*** 1535,1541 ****
      int doReallyAdjustSize = 0;
      int overWriteWholeChunk = 0;
  
!     XSTATS_DECLS
  #ifndef AFS_NOSTATS
      struct afs_stats_xferData *xferP;	/* Ptr to this op's xfer struct */
      osi_timeval_t xferStartTime,	/*FS xfer start time */
--- 1535,1541 ----
      int doReallyAdjustSize = 0;
      int overWriteWholeChunk = 0;
  
!     XSTATS_DECLS;
  #ifndef AFS_NOSTATS
      struct afs_stats_xferData *xferP;	/* Ptr to this op's xfer struct */
      osi_timeval_t xferStartTime,	/*FS xfer start time */
***************
*** 2618,2624 ****
  #define DQTODC(q)	((struct dcache *)(((char *) (q)) - sizeof(struct afs_q)))
  
      for (tq = DirtyQ.prev; tq != &DirtyQ; tq = QPrev(tq)) {
!         tdc = DQTODC(tq);
  	if (tdc->dflags & DFEntryMod) {
  	    int wrLock;
  
--- 2618,2624 ----
  #define DQTODC(q)	((struct dcache *)(((char *) (q)) - sizeof(struct afs_q)))
  
      for (tq = DirtyQ.prev; tq != &DirtyQ; tq = QPrev(tq)) {
! 	tdc = DQTODC(tq);
  	if (tdc->dflags & DFEntryMod) {
  	    int wrLock;
  
Index: openafs/src/afs/afs_pioctl.c
diff -c openafs/src/afs/afs_pioctl.c:1.81 openafs/src/afs/afs_pioctl.c:1.81.2.1
*** openafs/src/afs/afs_pioctl.c:1.81	Tue Jun  8 13:27:46 2004
--- openafs/src/afs/afs_pioctl.c	Wed Aug 25 03:03:35 2004
***************
*** 11,17 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_pioctl.c,v 1.81 2004/06/08 17:27:46 rees Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #ifdef AFS_OBSD_ENV
--- 11,17 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_pioctl.c,v 1.81.2.1 2004/08/25 07:03:35 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #ifdef AFS_OBSD_ENV
***************
*** 269,274 ****
--- 269,276 ----
      if (current->thread.flags & THREAD_IA32)
  #elif defined(AFS_PPC64_LINUX20_ENV)
      if (current->thread.flags & PPC_FLAG_32BIT)
+ #elif defined(AFS_S390X_LINUX20_ENV)
+     if (current->thread.flags & S390_FLAG_31BIT)
  #else
  #error Not done for this linux type
  #endif
Index: openafs/src/afs/afs_segments.c
diff -c openafs/src/afs/afs_segments.c:1.16 openafs/src/afs/afs_segments.c:1.16.2.1
*** openafs/src/afs/afs_segments.c:1.16	Tue Jul 15 19:14:13 2003
--- openafs/src/afs/afs_segments.c	Wed Aug 25 03:09:32 2004
***************
*** 14,20 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_segments.c,v 1.16 2003/07/15 23:14:13 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_segments.c,v 1.16.2.1 2004/08/25 07:09:32 shadow Exp $");
  
  #include "afs/sysincludes.h"	/*Standard vendor system headers */
  #include "afsincludes.h"	/*AFS-based standard headers */
***************
*** 47,53 ****
      register afs_int32 code;
      register struct rx_call *tcall;
      afs_size_t tlen, xlen = 0;
!     XSTATS_DECLS AFS_STATCNT(afs_StoreMini);
      afs_Trace2(afs_iclSetp, CM_TRACE_STOREMINI, ICL_TYPE_POINTER, avc,
  	       ICL_TYPE_INT32, avc->m.Length);
      tlen = avc->m.Length;
--- 47,54 ----
      register afs_int32 code;
      register struct rx_call *tcall;
      afs_size_t tlen, xlen = 0;
!     XSTATS_DECLS;
!     AFS_STATCNT(afs_StoreMini);
      afs_Trace2(afs_iclSetp, CM_TRACE_STOREMINI, ICL_TYPE_POINTER, avc,
  	       ICL_TYPE_INT32, avc->m.Length);
      tlen = avc->m.Length;
***************
*** 305,311 ****
  	    struct conn *tc;
  	    struct osi_file *tfile;
  	    struct rx_call *tcall;
! 	    XSTATS_DECLS for (bytes = 0, j = 0; !code && j <= high; j++) {
  		if (dcList[j]) {
  		    ObtainSharedLock(&(dcList[j]->lock), 629);
  		    if (!bytes)
--- 306,313 ----
  	    struct conn *tc;
  	    struct osi_file *tfile;
  	    struct rx_call *tcall;
! 	    XSTATS_DECLS;
! 	    for (bytes = 0, j = 0; !code && j <= high; j++) {
  		if (dcList[j]) {
  		    ObtainSharedLock(&(dcList[j]->lock), 629);
  		    if (!bytes)
Index: openafs/src/afs/afs_server.c
diff -c openafs/src/afs/afs_server.c:1.33 openafs/src/afs/afs_server.c:1.33.2.1
*** openafs/src/afs/afs_server.c:1.33	Thu Jun 24 13:38:23 2004
--- openafs/src/afs/afs_server.c	Wed Aug 25 03:07:53 2004
***************
*** 33,39 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_server.c,v 1.33 2004/06/24 17:38:23 shadow Exp $");
  
  #include "afs/stds.h"
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
--- 33,39 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_server.c,v 1.33.2.1 2004/08/25 07:07:53 shadow Exp $");
  
  #include "afs/stds.h"
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
***************
*** 1178,1185 ****
  #ifdef  IFF_POINTTOPOINT
      /* check for case #4 -- point-to-point link */
      if ((ifa->ia_ifp->if_flags & IFF_POINTOPOINT)
! 	&& (myDstaddr == serverAddr))
! 	) {
  	if (ifa->ia_ifp->if_metric >= (MAXDEFRANK - MED) / PPWEIGHT)
  	    t = MAXDEFRANK;
  	else
--- 1178,1184 ----
  #ifdef  IFF_POINTTOPOINT
      /* check for case #4 -- point-to-point link */
      if ((ifa->ia_ifp->if_flags & IFF_POINTOPOINT)
! 	&& (myDstaddr == serverAddr)) {
  	if (ifa->ia_ifp->if_metric >= (MAXDEFRANK - MED) / PPWEIGHT)
  	    t = MAXDEFRANK;
  	else
Index: openafs/src/afs/afs_vcache.c
diff -c openafs/src/afs/afs_vcache.c:1.65 openafs/src/afs/afs_vcache.c:1.65.2.3
*** openafs/src/afs/afs_vcache.c:1.65	Wed Jul 14 00:21:54 2004
--- openafs/src/afs/afs_vcache.c	Wed Aug 25 03:16:11 2004
***************
*** 39,45 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_vcache.c,v 1.65 2004/07/14 04:21:54 shadow Exp $");
  
  #include "afs/sysincludes.h"	/*Standard vendor system headers */
  #include "afsincludes.h"	/*AFS-based standard headers */
--- 39,45 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_vcache.c,v 1.65.2.3 2004/08/25 07:16:11 shadow Exp $");
  
  #include "afs/sysincludes.h"	/*Standard vendor system headers */
  #include "afsincludes.h"	/*AFS-based standard headers */
***************
*** 82,88 ****
   * Generate an index into the hash table for a given Fid.
   */
  static int
! afs_HashCBRFid(struct AFSFid *fid) {
      return (fid->Volume + fid->Vnode + fid->Unique) % CBRSIZE;
  }
  
--- 82,89 ----
   * Generate an index into the hash table for a given Fid.
   */
  static int
! afs_HashCBRFid(struct AFSFid *fid)
! {
      return (fid->Volume + fid->Vnode + fid->Unique) % CBRSIZE;
  }
  
***************
*** 93,99 ****
   * Must be called with afs_xvcb held.
   */
  static void
! afs_InsertHashCBR(struct afs_cbr *cbr) {
      int slot = afs_HashCBRFid(&cbr->fid);
  
      cbr->hash_next = afs_cbrHashT[slot];
--- 94,101 ----
   * Must be called with afs_xvcb held.
   */
  static void
! afs_InsertHashCBR(struct afs_cbr *cbr)
! {
      int slot = afs_HashCBRFid(&cbr->fid);
  
      cbr->hash_next = afs_cbrHashT[slot];
***************
*** 371,377 ****
      struct vrequest treq;
      struct conn *tc;
      int safety1, safety2, safety3;
!     XSTATS_DECLS if ((code = afs_InitReq(&treq, afs_osi_credp)))
  	return code;
      treq.flags |= O_NONBLOCK;
      tfids = afs_osi_Alloc(sizeof(struct AFSFid) * AFS_MAXCBRSCALL);
--- 373,380 ----
      struct vrequest treq;
      struct conn *tc;
      int safety1, safety2, safety3;
!     XSTATS_DECLS;
!     if ((code = afs_InitReq(&treq, afs_osi_credp)))
  	return code;
      treq.flags |= O_NONBLOCK;
      tfids = afs_osi_Alloc(sizeof(struct AFSFid) * AFS_MAXCBRSCALL);
***************
*** 545,551 ****
  	ncbr = cbr->hash_next;
  
  	if (afid->Fid.Volume == cbr->fid.Volume &&
! 	    afid->Fid.Vnode  == cbr->fid.Vnode  &&
  	    afid->Fid.Unique == cbr->fid.Unique) {
  	    afs_FreeCBR(cbr);
  	}
--- 548,554 ----
  	ncbr = cbr->hash_next;
  
  	if (afid->Fid.Volume == cbr->fid.Volume &&
! 	    afid->Fid.Vnode == cbr->fid.Vnode &&
  	    afid->Fid.Unique == cbr->fid.Unique) {
  	    afs_FreeCBR(cbr);
  	}
***************
*** 656,670 ****
      while ((cur = cur->next) != head) {
  	dentry = list_entry(cur, struct dentry, d_alias);
  
- 	if (ICL_SETACTIVE(afs_iclSetp)) {
- 	    AFS_GLOCK();
- 	    afs_Trace3(afs_iclSetp, CM_TRACE_TRYFLUSHDCACHECHILDREN,
- 		   ICL_TYPE_POINTER, ip, ICL_TYPE_STRING,
- 		   dentry->d_parent->d_name.name, ICL_TYPE_STRING,
- 		   dentry->d_name.name);
- 	    AFS_GUNLOCK();
- 	}
- 
  	if (!list_empty(&dentry->d_hash) && !list_empty(&dentry->d_subdirs))
  	    __shrink_dcache_parent(dentry);
  
--- 659,664 ----
***************
*** 826,839 ****
  		refpanic("VLRU inconsistent");
  	    }
  #ifdef AFS_DARWIN_ENV
! 	    if ((VREFCOUNT(tvc) < DARWIN_REFBASE) || 
! 		(VREFCOUNT(tvc) < 1+DARWIN_REFBASE && 
  		 UBCINFOEXISTS(&tvc->v))) {
!               VREFCOUNT_SET(tvc, 
!                             DARWIN_REFBASE + (UBCINFOEXISTS(&tvc->v) ? 1 : 0));
  	    }
  	    if (tvc->opens == 0 && ((tvc->states & CUnlinkedDel) == 0)
! 		&& VREFCOUNT(tvc) == DARWIN_REFBASE+1 
  		&& UBCINFOEXISTS(&tvc->v)) {
  		osi_VM_TryReclaim(tvc, &fv_slept);
  		if (fv_slept) {
--- 820,834 ----
  		refpanic("VLRU inconsistent");
  	    }
  #ifdef AFS_DARWIN_ENV
! 	    if ((VREFCOUNT(tvc) < DARWIN_REFBASE) ||
! 		(VREFCOUNT(tvc) < 1 + DARWIN_REFBASE &&
  		 UBCINFOEXISTS(&tvc->v))) {
! 		VREFCOUNT_SET(tvc,
! 			      DARWIN_REFBASE +
! 			      (UBCINFOEXISTS(&tvc->v) ? 1 : 0));
  	    }
  	    if (tvc->opens == 0 && ((tvc->states & CUnlinkedDel) == 0)
! 		&& VREFCOUNT(tvc) == DARWIN_REFBASE + 1
  		&& UBCINFOEXISTS(&tvc->v)) {
  		osi_VM_TryReclaim(tvc, &fv_slept);
  		if (fv_slept) {
***************
*** 854,867 ****
  	    }
  #endif
  
! 	    if (VREFCOUNT(tvc) == 
  #ifdef AFS_DARWIN_ENV
  		DARWIN_REFBASE
  #else
! 		0 
  #endif
! 		&& tvc->opens == 0
! 		&& (tvc->states & CUnlinkedDel) == 0) {
  #if defined(AFS_XBSD_ENV)
  		/*
  		 * vgone() reclaims the vnode, which calls afs_FlushVCache(),
--- 849,861 ----
  	    }
  #endif
  
! 	    if (VREFCOUNT(tvc) ==
  #ifdef AFS_DARWIN_ENV
  		DARWIN_REFBASE
  #else
! 		0
  #endif
! 		&& tvc->opens == 0 && (tvc->states & CUnlinkedDel) == 0) {
  #if defined(AFS_XBSD_ENV)
  		/*
  		 * vgone() reclaims the vnode, which calls afs_FlushVCache(),
***************
*** 972,985 ****
  	AFS_GLOCK();
  	if (tvc->v != NULL) {
  	    /* I'd like to know if this ever happens...
! 	       We don't drop global for the rest of this function,
! 	       so if we do lose the race, the other thread should
! 	       have found the same vnode and finished initializing
! 	       the vcache entry.  Is it conceivable that this vcache
! 	       entry could be recycled during this interval?  If so,
! 	       then there probably needs to be some sort of additional
! 	       mutual exclusion (an Embryonic flag would suffice).
! 		-GAW */
  	    printf("afs_NewVCache: lost the race\n");
  	    return (tvc);
  	}
--- 966,979 ----
  	AFS_GLOCK();
  	if (tvc->v != NULL) {
  	    /* I'd like to know if this ever happens...
! 	     * We don't drop global for the rest of this function,
! 	     * so if we do lose the race, the other thread should
! 	     * have found the same vnode and finished initializing
! 	     * the vcache entry.  Is it conceivable that this vcache
! 	     * entry could be recycled during this interval?  If so,
! 	     * then there probably needs to be some sort of additional
! 	     * mutual exclusion (an Embryonic flag would suffice).
! 	     * -GAW */
  	    printf("afs_NewVCache: lost the race\n");
  	    return (tvc);
  	}
***************
*** 1009,1083 ****
      tvc->truncPos = AFS_NOTRUNC;	/* don't truncate until we need to */
      hzero(tvc->m.DataVersion);	/* in case we copy it into flushDV */
  #if defined(AFS_LINUX22_ENV)
! {
!     struct inode *ip = AFSTOI(tvc);
!     struct address_space *mapping = &ip->i_data;
  
  #if defined(AFS_LINUX26_ENV)
!     inode_init_once(ip);
  #else
!     sema_init(&ip->i_sem, 1);
!     INIT_LIST_HEAD(&ip->i_hash);
!     INIT_LIST_HEAD(&ip->i_dentry);
  #if defined(AFS_LINUX24_ENV)
!     sema_init(&ip->i_zombie, 1);
!     init_waitqueue_head(&ip->i_wait);
!     spin_lock_init(&ip->i_data.i_shared_lock);
  #ifdef STRUCT_ADDRESS_SPACE_HAS_PAGE_LOCK
!     spin_lock_init(&ip->i_data.page_lock);
  #endif
!     INIT_LIST_HEAD(&ip->i_data.clean_pages);
!     INIT_LIST_HEAD(&ip->i_data.dirty_pages);
!     INIT_LIST_HEAD(&ip->i_data.locked_pages);
!     INIT_LIST_HEAD(&ip->i_dirty_buffers);
  #ifdef STRUCT_INODE_HAS_I_DIRTY_DATA_BUFFERS
!     INIT_LIST_HEAD(&ip->i_dirty_data_buffers);
  #endif
  #ifdef STRUCT_INODE_HAS_I_DEVICES
!     INIT_LIST_HEAD(&ip->i_devices);
  #endif
  #ifdef STRUCT_INODE_HAS_I_TRUNCATE_SEM
!     init_rwsem(&ip->i_truncate_sem);
  #endif
  #ifdef STRUCT_INODE_HAS_I_ALLOC_SEM
!     init_rwsem(&ip->i_alloc_sem);
! #endif 
  
  #else /* AFS_LINUX22_ENV */
!     sema_init(&ip->i_atomic_write, 1);
!     init_waitqueue(&ip->i_wait);
  #endif
  #endif
  
  #if defined(AFS_LINUX24_ENV)
!     mapping->host = ip;
!     ip->i_mapping = mapping;
  #ifdef STRUCT_ADDRESS_SPACE_HAS_GFP_MASK
!     ip->i_data.gfp_mask = GFP_HIGHUSER;
  #endif
  #if defined(AFS_LINUX26_ENV)
!     mapping_set_gfp_mask(mapping, GFP_HIGHUSER);
! {
!     extern struct backing_dev_info afs_backing_dev_info;
  
!     mapping->backing_dev_info = &afs_backing_dev_info;
! }
  #endif
  #endif
  
  #if !defined(AFS_LINUX26_ENV)
!     if (afs_globalVFS)
! 	ip->i_dev = afs_globalVFS->s_dev;
  #else
  #ifdef STRUCT_INODE_HAS_I_SECURITY
!     ip->i_security = NULL;
!     if (security_inode_alloc(ip))
!         panic("Cannot allocate inode security");
  #endif
  #endif
!     ip->i_sb = afs_globalVFS;
!     put_inode_on_dummy_list(ip);
! }
  #endif
  
  #ifdef	AFS_OSF_ENV
--- 1003,1077 ----
      tvc->truncPos = AFS_NOTRUNC;	/* don't truncate until we need to */
      hzero(tvc->m.DataVersion);	/* in case we copy it into flushDV */
  #if defined(AFS_LINUX22_ENV)
!     {
! 	struct inode *ip = AFSTOI(tvc);
! 	struct address_space *mapping = &ip->i_data;
  
  #if defined(AFS_LINUX26_ENV)
! 	inode_init_once(ip);
  #else
! 	sema_init(&ip->i_sem, 1);
! 	INIT_LIST_HEAD(&ip->i_hash);
! 	INIT_LIST_HEAD(&ip->i_dentry);
  #if defined(AFS_LINUX24_ENV)
! 	sema_init(&ip->i_zombie, 1);
! 	init_waitqueue_head(&ip->i_wait);
! 	spin_lock_init(&ip->i_data.i_shared_lock);
  #ifdef STRUCT_ADDRESS_SPACE_HAS_PAGE_LOCK
! 	spin_lock_init(&ip->i_data.page_lock);
  #endif
! 	INIT_LIST_HEAD(&ip->i_data.clean_pages);
! 	INIT_LIST_HEAD(&ip->i_data.dirty_pages);
! 	INIT_LIST_HEAD(&ip->i_data.locked_pages);
! 	INIT_LIST_HEAD(&ip->i_dirty_buffers);
  #ifdef STRUCT_INODE_HAS_I_DIRTY_DATA_BUFFERS
! 	INIT_LIST_HEAD(&ip->i_dirty_data_buffers);
  #endif
  #ifdef STRUCT_INODE_HAS_I_DEVICES
! 	INIT_LIST_HEAD(&ip->i_devices);
  #endif
  #ifdef STRUCT_INODE_HAS_I_TRUNCATE_SEM
! 	init_rwsem(&ip->i_truncate_sem);
  #endif
  #ifdef STRUCT_INODE_HAS_I_ALLOC_SEM
! 	init_rwsem(&ip->i_alloc_sem);
! #endif
  
  #else /* AFS_LINUX22_ENV */
! 	sema_init(&ip->i_atomic_write, 1);
! 	init_waitqueue(&ip->i_wait);
  #endif
  #endif
  
  #if defined(AFS_LINUX24_ENV)
! 	mapping->host = ip;
! 	ip->i_mapping = mapping;
  #ifdef STRUCT_ADDRESS_SPACE_HAS_GFP_MASK
! 	ip->i_data.gfp_mask = GFP_HIGHUSER;
  #endif
  #if defined(AFS_LINUX26_ENV)
! 	mapping_set_gfp_mask(mapping, GFP_HIGHUSER);
! 	{
! 	    extern struct backing_dev_info afs_backing_dev_info;
  
! 	    mapping->backing_dev_info = &afs_backing_dev_info;
! 	}
  #endif
  #endif
  
  #if !defined(AFS_LINUX26_ENV)
! 	if (afs_globalVFS)
! 	    ip->i_dev = afs_globalVFS->s_dev;
  #else
  #ifdef STRUCT_INODE_HAS_I_SECURITY
! 	ip->i_security = NULL;
! 	if (security_inode_alloc(ip))
! 	    panic("Cannot allocate inode security");
  #endif
  #endif
! 	ip->i_sb = afs_globalVFS;
! 	put_inode_on_dummy_list(ip);
!     }
  #endif
  
  #ifdef	AFS_OSF_ENV
***************
*** 1165,1171 ****
      /* VLISTNONE(&tvc->v); */
      tvc->v.v_freelist.tqe_next = 0;
      tvc->v.v_freelist.tqe_prev = (struct vnode **)0xdeadb;
!     tvc->vrefCount+=DARWIN_REFBASE;
  #endif
      /*
       * The proper value for mvstat (for root fids) is setup by the caller.
--- 1159,1165 ----
      /* VLISTNONE(&tvc->v); */
      tvc->v.v_freelist.tqe_next = 0;
      tvc->v.v_freelist.tqe_prev = (struct vnode **)0xdeadb;
!     tvc->vrefCount += DARWIN_REFBASE;
  #endif
      /*
       * The proper value for mvstat (for root fids) is setup by the caller.
***************
*** 1266,1272 ****
      struct vrequest treq, ureq;
      struct AFSVolSync tsync;
      int didCore;
!     XSTATS_DECLS AFS_STATCNT(afs_FlushActiveVcaches);
      ObtainReadLock(&afs_xvcache);
      for (i = 0; i < VCSIZE; i++) {
  	for (tvc = afs_vhashT[i]; tvc; tvc = tvc->hnext) {
--- 1260,1267 ----
      struct vrequest treq, ureq;
      struct AFSVolSync tsync;
      int didCore;
!     XSTATS_DECLS;
!     AFS_STATCNT(afs_FlushActiveVcaches);
      ObtainReadLock(&afs_xvcache);
      for (i = 0; i < VCSIZE; i++) {
  	for (tvc = afs_vhashT[i]; tvc; tvc = tvc->hnext) {
***************
*** 1378,1384 ****
  		}
  	    }
  #ifdef AFS_DARWIN_ENV
! 	    if (VREFCOUNT(tvc) == 1+DARWIN_REFBASE 
  		&& UBCINFOEXISTS(&tvc->v)) {
  		if (tvc->opens)
  		    panic("flushactive open, hasubc, but refcnt 1");
--- 1373,1379 ----
  		}
  	    }
  #ifdef AFS_DARWIN_ENV
! 	    if (VREFCOUNT(tvc) == 1 + DARWIN_REFBASE
  		&& UBCINFOEXISTS(&tvc->v)) {
  		if (tvc->opens)
  		    panic("flushactive open, hasubc, but refcnt 1");
***************
*** 1579,1585 ****
      struct conn *tc;
      struct AFSFetchStatus OutStatus;
      struct AFSVolSync tsync;
!     XSTATS_DECLS AFS_STATCNT(afs_WriteVCache);
      afs_Trace2(afs_iclSetp, CM_TRACE_WVCACHE, ICL_TYPE_POINTER, avc,
  	       ICL_TYPE_OFFSET, ICL_HANDLE_OFFSET(avc->m.Length));
  
--- 1574,1581 ----
      struct conn *tc;
      struct AFSFetchStatus OutStatus;
      struct AFSVolSync tsync;
!     XSTATS_DECLS;
!     AFS_STATCNT(afs_WriteVCache);
      afs_Trace2(afs_iclSetp, CM_TRACE_WVCACHE, ICL_TYPE_POINTER, avc,
  	       ICL_TYPE_OFFSET, ICL_HANDLE_OFFSET(avc->m.Length));
  
***************
*** 1743,1750 ****
      afs_uint32 start;
      register struct conn *tc;
      struct AFSFetchStatus OutDirStatus;
!     XSTATS_DECLS if (!name)
! 	  name = "";		/* XXX */
      do {
  	tc = afs_Conn(afid, areq, SHARED_LOCK);
  	if (tc) {
--- 1739,1747 ----
      afs_uint32 start;
      register struct conn *tc;
      struct AFSFetchStatus OutDirStatus;
!     XSTATS_DECLS;
!     if (!name)
! 	name = "";		/* XXX */
      do {
  	tc = afs_Conn(afid, areq, SHARED_LOCK);
  	if (tc) {
***************
*** 2198,2213 ****
  #endif /* AFS_OSF_ENV */
  #ifdef AFS_DARWIN14_ENV
  	    /* It'd really suck if we allowed duplicate vcaches for the 
! 	       same fid to happen. Wonder if this will work? */
  	    struct vnode *vp = AFSTOV(tvc);
! 	    if (vp->v_flag & (VXLOCK|VORECLAIM|VTERMINATE)) {
! 	        printf("precluded FindVCache on %x (%d:%d:%d)\n", 
  		       vp, tvc->fid.Fid.Volume, tvc->fid.Fid.Vnode,
  		       tvc->fid.Fid.Unique);
  		simple_lock(&vp->v_interlock);
  		SET(vp->v_flag, VTERMWANT);
  		simple_unlock(&vp->v_interlock);
! 		(void)tsleep((caddr_t)&vp->v_ubcinfo, PINOD, "vget1", 0);
  		printf("VTERMWANT ended on %x\n", vp);
  		continue;
  	    }
--- 2195,2210 ----
  #endif /* AFS_OSF_ENV */
  #ifdef AFS_DARWIN14_ENV
  	    /* It'd really suck if we allowed duplicate vcaches for the 
! 	     * same fid to happen. Wonder if this will work? */
  	    struct vnode *vp = AFSTOV(tvc);
! 	    if (vp->v_flag & (VXLOCK | VORECLAIM | VTERMINATE)) {
! 		printf("precluded FindVCache on %x (%d:%d:%d)\n",
  		       vp, tvc->fid.Fid.Volume, tvc->fid.Fid.Vnode,
  		       tvc->fid.Fid.Unique);
  		simple_lock(&vp->v_interlock);
  		SET(vp->v_flag, VTERMWANT);
  		simple_unlock(&vp->v_interlock);
! 		(void)tsleep((caddr_t) & vp->v_ubcinfo, PINOD, "vget1", 0);
  		printf("VTERMWANT ended on %x\n", vp);
  		continue;
  	    }
***************
*** 2378,2384 ****
      struct AFSCallBack CallBack;
      struct AFSVolSync tsync;
      struct volume *volp;
!     XSTATS_DECLS
      do {
  	tc = afs_Conn(afid, areq, SHARED_LOCK);
  	avc->quick.stamp = 0;
--- 2375,2381 ----
      struct AFSCallBack CallBack;
      struct AFSVolSync tsync;
      struct volume *volp;
!     XSTATS_DECLS;
      do {
  	tc = afs_Conn(afid, areq, SHARED_LOCK);
  	avc->quick.stamp = 0;
***************
*** 3013,3025 ****
      }
      afs_cbrSpace = 0;
  
- #if	!defined(AFS_OSF_ENV)
-     afs_osi_Free(Initial_freeVCList, afs_cacheStats * sizeof(struct vcache));
- #endif
  #ifdef  KERNEL_HAVE_PIN
      unpin(Initial_freeVCList, afs_cacheStats * sizeof(struct vcache));
  #endif
  #if	!defined(AFS_OSF_ENV)
      freeVCList = Initial_freeVCList = 0;
  #endif
      RWLOCK_INIT(&afs_xvcache, "afs_xvcache");
--- 3010,3022 ----
      }
      afs_cbrSpace = 0;
  
  #ifdef  KERNEL_HAVE_PIN
      unpin(Initial_freeVCList, afs_cacheStats * sizeof(struct vcache));
  #endif
  #if	!defined(AFS_OSF_ENV)
+     afs_osi_Free(Initial_freeVCList, afs_cacheStats * sizeof(struct vcache));
+ #endif
+ #if	!defined(AFS_OSF_ENV)
      freeVCList = Initial_freeVCList = 0;
  #endif
      RWLOCK_INIT(&afs_xvcache, "afs_xvcache");
Index: openafs/src/afs/AIX/osi_config.c
diff -c openafs/src/afs/AIX/osi_config.c:1.8 openafs/src/afs/AIX/osi_config.c:1.8.2.1
*** openafs/src/afs/AIX/osi_config.c:1.8	Tue Jul 15 19:14:16 2003
--- openafs/src/afs/AIX/osi_config.c	Wed Aug 25 03:16:15 2004
***************
*** 37,43 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/AIX/osi_config.c,v 1.8 2003/07/15 23:14:16 shadow Exp $");
  
  #include "sys/limits.h"
  #include "sys/types.h"
--- 37,43 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/AIX/osi_config.c,v 1.8.2.1 2004/08/25 07:16:15 shadow Exp $");
  
  #include "sys/limits.h"
  #include "sys/types.h"
***************
*** 147,153 ****
  	 */
  	if (err == ENOENT)
  	    err = 0;
! 	else if (!err) {
  	    if (err = unpincode(afs_config))
  		err = 0;
  
--- 147,160 ----
  	 */
  	if (err == ENOENT)
  	    err = 0;
! #ifndef AFS_AIX51_ENV
! 	else
! #endif
! 	if (!err) {
! #ifdef AFS_AIX51_ENV
! 	    if (err = unpin(&afs_callout_lock))
! 		err = 0;
! #endif
  	    if (err = unpincode(afs_config))
  		err = 0;
  
Index: openafs/src/afs/AIX/osi_inode.c
diff -c openafs/src/afs/AIX/osi_inode.c:1.8 openafs/src/afs/AIX/osi_inode.c:1.8.2.1
*** openafs/src/afs/AIX/osi_inode.c:1.8	Tue Jul 15 19:14:17 2003
--- openafs/src/afs/AIX/osi_inode.c	Wed Aug 25 03:16:15 2004
***************
*** 17,23 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/AIX/osi_inode.c,v 1.8 2003/07/15 23:14:17 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/AIX/osi_inode.c,v 1.8.2.1 2004/08/25 07:16:15 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 236,248 ****
  	ip = 0;
  	goto out;
      }
-     IREAD_UNLOCK(ip);
      if (vpp) {
  	if (nvfsp)
  	    *vpp = ip->i_gnode.gn_vnode;
  	else
  	    setuerror(iptovp(vfsp, ip, vpp));
      }
    out:
      return ip;
  }
--- 236,248 ----
  	ip = 0;
  	goto out;
      }
      if (vpp) {
  	if (nvfsp)
  	    *vpp = ip->i_gnode.gn_vnode;
  	else
  	    setuerror(iptovp(vfsp, ip, vpp));
      }
+     IREAD_UNLOCK(ip);
    out:
      return ip;
  }
Index: openafs/src/afs/AIX/osi_vfsops.c
diff -c openafs/src/afs/AIX/osi_vfsops.c:1.11 openafs/src/afs/AIX/osi_vfsops.c:1.11.2.1
*** openafs/src/afs/AIX/osi_vfsops.c:1.11	Tue Jul 15 19:14:17 2003
--- openafs/src/afs/AIX/osi_vfsops.c	Wed Aug 25 03:16:15 2004
***************
*** 14,20 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/AIX/osi_vfsops.c,v 1.11 2003/07/15 23:14:17 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/AIX/osi_vfsops.c,v 1.11.2.1 2004/08/25 07:16:15 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 34,39 ****
--- 34,40 ----
  struct vfs *afs_globalVFS = 0;
  struct vcache *afs_globalVp = 0;
  
+ extern int afs_cold_shutdown;
  
  static int afs_root_nolock(struct vfs *afsp, struct vnode **avpp);
  
***************
*** 81,86 ****
--- 82,91 ----
      afsp->vfs_mntdover->v_mvfsp = afsp;
      afsp->vfs_mdata->vmt_flags |= MNT_REMOTE;
  
+ #ifdef AFS_AIX51_ENV
+     afsp->vfs_count = 1;
+     afsp->vfs_mntd->v_count = 1;
+ #endif
  #ifdef AFS_AIX_IAUTH_ENV
      if (afs_iauth_register() < 0)
  	afs_warn("Can't register AFS iauth interface.\n");
***************
*** 97,102 ****
--- 102,108 ----
      AFS_STATCNT(afs_unmount);
  
      afs_globalVFS = 0;
+     afs_cold_shutdown = 1;
      afs_shutdown();
  
      AFS_VFSUNLOCK();
Index: openafs/src/afs/IRIX/osi_idbg.c
diff -c openafs/src/afs/IRIX/osi_idbg.c:1.6 openafs/src/afs/IRIX/osi_idbg.c:1.6.2.1
*** openafs/src/afs/IRIX/osi_idbg.c:1.6	Tue Jul 15 19:14:23 2003
--- openafs/src/afs/IRIX/osi_idbg.c	Wed Aug 25 03:09:34 2004
***************
*** 14,20 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/IRIX/osi_idbg.c,v 1.6 2003/07/15 23:14:23 shadow Exp $");
  
  #ifdef	AFS_SGI62_ENV
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
--- 14,20 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/IRIX/osi_idbg.c,v 1.6.2.1 2004/08/25 07:09:34 shadow Exp $");
  
  #ifdef	AFS_SGI62_ENV
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
***************
*** 55,63 ****
  int
  idbg_prafsnode(OSI_VC_DECL(avc))
  {
!     OSI_VC_CONVERT(avc)
  
! 	AFS_GLOCK();
      qprintf("   Len %d DV %d Date %d Own %d Grp %d Mode 0%o Lnk %d\n",
  	    avc->m.Length, avc->m.DataVersion, avc->m.Date, avc->m.Owner,
  	    avc->m.Group, avc->m.Mode, avc->m.LinkCount);
--- 55,63 ----
  int
  idbg_prafsnode(OSI_VC_DECL(avc))
  {
!     OSI_VC_CONVERT(avc);
  
!     AFS_GLOCK();
      qprintf("   Len %d DV %d Date %d Own %d Grp %d Mode 0%o Lnk %d\n",
  	    avc->m.Length, avc->m.DataVersion, avc->m.Date, avc->m.Owner,
  	    avc->m.Group, avc->m.Mode, avc->m.LinkCount);
Index: openafs/src/afs/IRIX/osi_machdep.h
diff -c openafs/src/afs/IRIX/osi_machdep.h:1.7 openafs/src/afs/IRIX/osi_machdep.h:1.7.2.1
*** openafs/src/afs/IRIX/osi_machdep.h:1.7	Wed Jul 28 23:13:47 2004
--- openafs/src/afs/IRIX/osi_machdep.h	Wed Aug 25 03:09:34 2004
***************
*** 374,392 ****
  #undef OSI_VN_DECL
  #define OSI_VN_DECL(V)  bhv_desc_t *bhv_##V
  #undef OSI_VN_CONVERT
! #define OSI_VN_CONVERT(V) struct vnode * V = (struct vnode*)BHV_TO_VNODE(bhv_##V);
  #undef OSI_VC_ARG
  #define OSI_VC_ARG(V) bhv_##V
  #undef OSI_VC_DECL
  #define OSI_VC_DECL(V)  bhv_desc_t *bhv_##V
  #undef OSI_VC_CONVERT
! #define OSI_VC_CONVERT(V) struct vcache * V = VTOAFS(BHV_TO_VNODE(bhv_##V));
  #undef OSI_VFS_ARG
  #define OSI_VFS_ARG(V) bhv_##V
  #undef OSI_VFS_DECL
  #define OSI_VFS_DECL(V)  bhv_desc_t *bhv_##V
  #undef OSI_VFS_CONVERT
! #define OSI_VFS_CONVERT(V) struct vfs * V = (struct vfs*)bhvtovfs(bhv_##V);
  #endif /* AFS_SGI64_ENV */
  
  
--- 374,392 ----
  #undef OSI_VN_DECL
  #define OSI_VN_DECL(V)  bhv_desc_t *bhv_##V
  #undef OSI_VN_CONVERT
! #define OSI_VN_CONVERT(V) struct vnode * V = (struct vnode*)BHV_TO_VNODE(bhv_##V)
  #undef OSI_VC_ARG
  #define OSI_VC_ARG(V) bhv_##V
  #undef OSI_VC_DECL
  #define OSI_VC_DECL(V)  bhv_desc_t *bhv_##V
  #undef OSI_VC_CONVERT
! #define OSI_VC_CONVERT(V) struct vcache * V = VTOAFS(BHV_TO_VNODE(bhv_##V))
  #undef OSI_VFS_ARG
  #define OSI_VFS_ARG(V) bhv_##V
  #undef OSI_VFS_DECL
  #define OSI_VFS_DECL(V)  bhv_desc_t *bhv_##V
  #undef OSI_VFS_CONVERT
! #define OSI_VFS_CONVERT(V) struct vfs * V = (struct vfs*)bhvtovfs(bhv_##V)
  #endif /* AFS_SGI64_ENV */
  
  
Index: openafs/src/afs/IRIX/osi_vfsops.c
diff -c openafs/src/afs/IRIX/osi_vfsops.c:1.13 openafs/src/afs/IRIX/osi_vfsops.c:1.13.2.1
*** openafs/src/afs/IRIX/osi_vfsops.c:1.13	Tue Jul 15 19:14:23 2003
--- openafs/src/afs/IRIX/osi_vfsops.c	Wed Aug 25 03:09:34 2004
***************
*** 14,20 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/IRIX/osi_vfsops.c,v 1.13 2003/07/15 23:14:23 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/IRIX/osi_vfsops.c,v 1.13.2.1 2004/08/25 07:09:34 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 213,221 ****
      register struct afs_q *tq;
      struct afs_q *uq;
      int error, fv_slept;
!     OSI_VFS_CONVERT(afsp)
  
! 	AFS_STATCNT(afs_unmount);
  
      if (!suser())
  	return EPERM;
--- 213,221 ----
      register struct afs_q *tq;
      struct afs_q *uq;
      int error, fv_slept;
!     OSI_VFS_CONVERT(afsp);
  
!     AFS_STATCNT(afs_unmount);
  
      if (!suser())
  	return EPERM;
***************
*** 272,280 ****
      register afs_int32 code = 0;
      struct vrequest treq;
      register struct vcache *tvp = 0;
!     OSI_VFS_CONVERT(afsp)
  
! 	AFS_STATCNT(afs_root);
      if (afs_globalVp && (afs_globalVp->states & CStatd)) {
  	tvp = afs_globalVp;
      } else {
--- 272,280 ----
      register afs_int32 code = 0;
      struct vrequest treq;
      register struct vcache *tvp = 0;
!     OSI_VFS_CONVERT(afsp);
  
!     AFS_STATCNT(afs_root);
      if (afs_globalVp && (afs_globalVp->states & CStatd)) {
  	tvp = afs_globalVp;
      } else {
***************
*** 314,322 ****
       struct statvfs *abp;
       struct vnode *avp;		/* unused */
  {
!     OSI_VFS_CONVERT(afsp)
  
! 	AFS_STATCNT(afs_statfs);
      abp->f_bsize = afsp->vfs_bsize;
      abp->f_frsize = afsp->vfs_bsize;
      /* Fake a high number below to satisfy programs that use the statfs
--- 314,322 ----
       struct statvfs *abp;
       struct vnode *avp;		/* unused */
  {
!     OSI_VFS_CONVERT(afsp);
  
!     AFS_STATCNT(afs_statfs);
      abp->f_bsize = afsp->vfs_bsize;
      abp->f_frsize = afsp->vfs_bsize;
      /* Fake a high number below to satisfy programs that use the statfs
***************
*** 379,387 ****
      register struct afs_q *tq;
      struct afs_q *uq;
      int s;
!     OSI_VFS_CONVERT(afsp)
  
! 	error = lasterr = 0;
      /*
       * if not interested in vnodes, skip all this
       */
--- 379,387 ----
      register struct afs_q *tq;
      struct afs_q *uq;
      int s;
!     OSI_VFS_CONVERT(afsp);
  
!     error = lasterr = 0;
      /*
       * if not interested in vnodes, skip all this
       */
***************
*** 528,536 ****
      afs_fid2_t *afid2;
  #endif
  
!     OSI_VFS_CONVERT(afsp)
  
! 	AFS_STATCNT(afs_vget);
  
      *avcp = NULL;
  
--- 528,536 ----
      afs_fid2_t *afid2;
  #endif
  
!     OSI_VFS_CONVERT(afsp);
  
!     AFS_STATCNT(afs_vget);
  
      *avcp = NULL;
  
Index: openafs/src/afs/IRIX/osi_vnodeops.c
diff -c openafs/src/afs/IRIX/osi_vnodeops.c:1.14 openafs/src/afs/IRIX/osi_vnodeops.c:1.14.2.1
*** openafs/src/afs/IRIX/osi_vnodeops.c:1.14	Tue Jul 15 19:14:23 2003
--- openafs/src/afs/IRIX/osi_vnodeops.c	Wed Aug 25 03:09:34 2004
***************
*** 14,20 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/IRIX/osi_vnodeops.c,v 1.14 2003/07/15 23:14:23 shadow Exp $");
  
  #ifdef	AFS_SGI62_ENV
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
--- 14,20 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/IRIX/osi_vnodeops.c,v 1.14.2.1 2004/08/25 07:09:34 shadow Exp $");
  
  #ifdef	AFS_SGI62_ENV
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
***************
*** 158,164 ****
  	   cred_t * cr)
  {
      int error;
!     OSI_VN_CONVERT(vp)
  #ifdef AFS_SGI65_ENV
      struct flid flid;
      int pid;
--- 158,164 ----
  	   cred_t * cr)
  {
      int error;
!     OSI_VN_CONVERT(vp);
  #ifdef AFS_SGI65_ENV
      struct flid flid;
      int pid;
***************
*** 276,284 ****
       struct cred *cr;
  {
      int code;
!     OSI_VC_CONVERT(avc)
  
! 	osi_Assert(avc->v.v_count > 0);
      if (avc->v.v_type != VREG)
  	return EISDIR;
  
--- 276,284 ----
       struct cred *cr;
  {
      int code;
!     OSI_VC_CONVERT(avc);
  
!     osi_Assert(avc->v.v_count > 0);
      if (avc->v.v_type != VREG)
  	return EISDIR;
  
***************
*** 313,321 ****
       struct cred *cr;
  {
      int code;
!     OSI_VC_CONVERT(avc)
  
! 	osi_Assert(avc->v.v_count > 0);
      if (avc->v.v_type != VREG)
  	return EISDIR;
  
--- 313,321 ----
       struct cred *cr;
  {
      int code;
!     OSI_VC_CONVERT(avc);
  
!     osi_Assert(avc->v.v_count > 0);
      if (avc->v.v_type != VREG)
  	return EISDIR;
  
***************
*** 712,720 ****
      int bsize;			/* server's block size in bytes */
      off_t off;
      size_t rem, cnt;
!     OSI_VC_CONVERT(avc)
  
! 	bsize = AFSBSIZE;
      off = offset % bsize;	/* offset into block */
      bmv->bn = BTOBBT(offset - off);
      bmv->offset = bmv->bn;
--- 712,720 ----
      int bsize;			/* server's block size in bytes */
      off_t off;
      size_t rem, cnt;
!     OSI_VC_CONVERT(avc);
  
!     bsize = AFSBSIZE;
      off = offset % bsize;	/* offset into block */
      bmv->bn = BTOBBT(offset - off);
      bmv->offset = bmv->bn;
***************
*** 765,771 ****
      iovec_t aiovec;
      int error;
      struct cred *cr;
!     OSI_VC_CONVERT(avc)
      vnode_t *vp = (vnode_t *) avc;
  
      /*
--- 765,771 ----
      iovec_t aiovec;
      int error;
      struct cred *cr;
!     OSI_VC_CONVERT(avc);
      vnode_t *vp = (vnode_t *) avc;
  
      /*
***************
*** 892,898 ****
       u_int flags;
       struct cred *cr;
  {
!     OSI_VC_CONVERT(avc)
      struct vnode *vp = AFSTOV(avc);
  
      if (vp->v_flag & VNOMAP)
--- 892,898 ----
       u_int flags;
       struct cred *cr;
  {
!     OSI_VC_CONVERT(avc);
      struct vnode *vp = AFSTOV(avc);
  
      if (vp->v_flag & VNOMAP)
***************
*** 923,929 ****
       u_int flags;
       struct cred *acred;
  {
!     OSI_VC_CONVERT(avc)
      struct vnode *vp = AFSTOV(avc);
      register struct brequest *tb;
      struct vrequest treq;
--- 923,929 ----
       u_int flags;
       struct cred *acred;
  {
!     OSI_VC_CONVERT(avc);
      struct vnode *vp = AFSTOV(avc);
      register struct brequest *tb;
      struct vrequest treq;
***************
*** 1019,1025 ****
       struct cred *cr;
  #endif
  {
!     OSI_VC_CONVERT(avc)
      struct vnode *vp = AFSTOV(avc);
      struct vrequest treq;
      int error;
--- 1019,1025 ----
       struct cred *cr;
  #endif
  {
!     OSI_VC_CONVERT(avc);
      struct vnode *vp = AFSTOV(avc);
      struct vrequest treq;
      int error;
***************
*** 1077,1083 ****
       struct ucred *acred;
  {
      int s;
!     OSI_VC_CONVERT(avc)
      vnode_t *vp = (vnode_t *) avc;
      int mapcnt = avc->mapcnt;	/* We just clear off this many. */
  
--- 1077,1083 ----
       struct ucred *acred;
  {
      int s;
!     OSI_VC_CONVERT(avc);
      vnode_t *vp = (vnode_t *) avc;
      int mapcnt = avc->mapcnt;	/* We just clear off this many. */
  
***************
*** 1217,1223 ****
  void
  afs_rwlock(OSI_VN_DECL(vp), AFS_RWLOCK_T flag)
  {
!     OSI_VN_CONVERT(vp)
      struct vcache *avc = VTOAFS(vp);
  
      if (OSI_GET_LOCKID() == avc->vc_rwlockid) {
--- 1217,1223 ----
  void
  afs_rwlock(OSI_VN_DECL(vp), AFS_RWLOCK_T flag)
  {
!     OSI_VN_CONVERT(vp);
      struct vcache *avc = VTOAFS(vp);
  
      if (OSI_GET_LOCKID() == avc->vc_rwlockid) {
***************
*** 1233,1239 ****
  void
  afs_rwunlock(OSI_VN_DECL(vp), AFS_RWLOCK_T flag)
  {
!     OSI_VN_CONVERT(vp)
      struct vcache *avc = VTOAFS(vp);
  
      AFS_ASSERT_GLOCK();
--- 1233,1239 ----
  void
  afs_rwunlock(OSI_VN_DECL(vp), AFS_RWLOCK_T flag)
  {
!     OSI_VN_CONVERT(vp);
      struct vcache *avc = VTOAFS(vp);
  
      AFS_ASSERT_GLOCK();
***************
*** 1275,1283 ****
  {
      struct cell *tcell;
      afs_fid2_t *afid = (afs_fid2_t *) fidp;
!     OSI_VC_CONVERT(avc)
  
! 	osi_Assert(sizeof(fid_t) >= sizeof(afs_fid2_t));
      afid->af_len = sizeof(afs_fid2_t) - sizeof(afid->af_len);
  
      tcell = afs_GetCell(avc->fid.Cell, READ_LOCK);
--- 1275,1283 ----
  {
      struct cell *tcell;
      afs_fid2_t *afid = (afs_fid2_t *) fidp;
!     OSI_VC_CONVERT(avc);
  
!     osi_Assert(sizeof(fid_t) >= sizeof(afs_fid2_t));
      afid->af_len = sizeof(afs_fid2_t) - sizeof(afid->af_len);
  
      tcell = afs_GetCell(avc->fid.Cell, READ_LOCK);
Index: openafs/src/afs/LINUX/osi_module.c
diff -c openafs/src/afs/LINUX/osi_module.c:1.52 openafs/src/afs/LINUX/osi_module.c:1.52.2.1
*** openafs/src/afs/LINUX/osi_module.c:1.52	Mon Jun 21 17:46:17 2004
--- openafs/src/afs/LINUX/osi_module.c	Wed Aug 25 03:03:36 2004
***************
*** 15,21 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_module.c,v 1.52 2004/06/21 21:46:17 shadow Exp $");
  
  #include "afs/sysincludes.h"
  #include "afsincludes.h"
--- 15,21 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_module.c,v 1.52.2.1 2004/08/25 07:03:36 shadow Exp $");
  
  #include "afs/sysincludes.h"
  #include "afsincludes.h"
***************
*** 47,64 ****
  #endif
  asmlinkage long (*sys_setgroupsp) (int gidsetsize, gid_t * grouplist);
  #ifdef EXPORTED_SYS_CALL_TABLE
! #ifdef AFS_SPARC64_LINUX20_ENV
! extern unsigned int sys_call_table[];	/* changed to uint because SPARC64 has syscaltable of 32bit items */
  #else
  extern void *sys_call_table[];	/* safer for other linuces */
  #endif
  #else /* EXPORTED_SYS_CALL_TABLE */
! #ifdef AFS_SPARC64_LINUX20_ENV
! static unsigned int *sys_call_table;	/* changed to uint because SPARC64 has syscaltable of 32bit items */
  #else
  static void **sys_call_table;	/* safer for other linuces */
  #endif
  #endif
  extern struct file_system_type afs_fs_type;
  
  static long get_page_offset(void);
--- 47,71 ----
  #endif
  asmlinkage long (*sys_setgroupsp) (int gidsetsize, gid_t * grouplist);
  #ifdef EXPORTED_SYS_CALL_TABLE
! #if defined(AFS_SPARC64_LINUX20_ENV) || defined(AFS_S390X_LINUX24_ENV)
! extern unsigned int sys_call_table[];	/* changed to uint because SPARC64 and S390X have syscalltable of 32bit items */
  #else
  extern void *sys_call_table[];	/* safer for other linuces */
  #endif
  #else /* EXPORTED_SYS_CALL_TABLE */
! #if defined(AFS_SPARC64_LINUX20_ENV) || defined(AFS_S390X_LINUX24_ENV)
! static unsigned int *sys_call_table;	/* changed to uint because SPARC64 and S390X have syscalltable of 32bit items */
  #else
  static void **sys_call_table;	/* safer for other linuces */
  #endif
  #endif
+ 
+ #if defined(AFS_S390X_LINUX24_ENV)
+ #define _S(x) ((x)<<1)
+ #else
+ #define _S(x) x
+ #endif
+ 
  extern struct file_system_type afs_fs_type;
  
  static long get_page_offset(void);
***************
*** 76,82 ****
  /* Since sys_ni_syscall is not exported, I need to cache it in order to restore
   * it.
   */
! #ifdef AFS_SPARC64_LINUX20_ENV
  static unsigned int afs_ni_syscall = 0;
  #else
  static void *afs_ni_syscall = 0;
--- 83,89 ----
  /* Since sys_ni_syscall is not exported, I need to cache it in order to restore
   * it.
   */
! #if defined(AFS_SPARC64_LINUX20_ENV) || defined(AFS_S390X_LINUX24_ENV)
  static unsigned int afs_ni_syscall = 0;
  #else
  static void *afs_ni_syscall = 0;
***************
*** 208,214 ****
  				    __kernel_gid32_t * grouplist);
  #endif /* AFS_LINUX24_ENV */
  
! #ifdef AFS_SPARC64_LINUX20_ENV
  #define POINTER2SYSCALL (unsigned int)(unsigned long)
  #define SYSCALL2POINTER (void *)(long)
  #else
--- 215,221 ----
  				    __kernel_gid32_t * grouplist);
  #endif /* AFS_LINUX24_ENV */
  
! #if defined(AFS_SPARC64_LINUX20_ENV) || defined(AFS_S390X_LINUX24_ENV)
  #define POINTER2SYSCALL (unsigned int)(unsigned long)
  #define SYSCALL2POINTER (void *)(long)
  #else
***************
*** 365,371 ****
  	printf("Failed to find address of sys_call_table\n");
      } else {
  	printf("Found sys_call_table at %x\n", sys_call_table);
! #ifdef AFS_SPARC64_LINUX20_ENV
  	error cant support this yet.;
  #endif /* AFS_SPARC64_LINUX20_ENV */
  #endif /* EXPORTED_SYS_CALL_TABLE */
--- 372,378 ----
  	printf("Failed to find address of sys_call_table\n");
      } else {
  	printf("Found sys_call_table at %x\n", sys_call_table);
! #if defined(AFS_SPARC64_LINUX20_ENV) || defined(AFS_S390X_LINUX24_ENV)
  	error cant support this yet.;
  #endif /* AFS_SPARC64_LINUX20_ENV */
  #endif /* EXPORTED_SYS_CALL_TABLE */
***************
*** 435,441 ****
  
  	/* Initialize pointers to kernel syscalls. */
  #if !defined(AFS_LINUX24_ENV)
! 	sys_settimeofdayp = SYSCALL2POINTER sys_call_table[__NR_settimeofday];
  #endif /* AFS_IA64_LINUX20_ENV */
  
  	/* setup AFS entry point. */
--- 442,448 ----
  
  	/* Initialize pointers to kernel syscalls. */
  #if !defined(AFS_LINUX24_ENV)
! 	sys_settimeofdayp = SYSCALL2POINTER sys_call_table[_S(__NR_settimeofday)];
  #endif /* AFS_IA64_LINUX20_ENV */
  
  	/* setup AFS entry point. */
***************
*** 443,449 ****
  #if defined(AFS_IA64_LINUX20_ENV)
  		SYSCALL2POINTER sys_call_table[__NR_afs_syscall - 1024]
  #else
! 		SYSCALL2POINTER sys_call_table[__NR_afs_syscall]
  #endif
  		== afs_syscall) {
  	    printf("AFS syscall entry point already in use!\n");
--- 450,456 ----
  #if defined(AFS_IA64_LINUX20_ENV)
  		SYSCALL2POINTER sys_call_table[__NR_afs_syscall - 1024]
  #else
! 		SYSCALL2POINTER sys_call_table[_S(__NR_afs_syscall)]
  #endif
  		== afs_syscall) {
  	    printf("AFS syscall entry point already in use!\n");
***************
*** 454,461 ****
  	sys_call_table[__NR_afs_syscall - 1024] =
  		POINTER2SYSCALL((struct fptr *)afs_syscall_stub)->ip;
  #else /* AFS_IA64_LINUX20_ENV */
! 	afs_ni_syscall = sys_call_table[__NR_afs_syscall];
! 	sys_call_table[__NR_afs_syscall] = POINTER2SYSCALL afs_syscall;
  #ifdef AFS_SPARC64_LINUX20_ENV
  	afs_ni_syscall32 = sys_call_table32[__NR_afs_syscall];
  	sys_call_table32[__NR_afs_syscall] = POINTER2SYSCALL afs_syscall32;
--- 461,468 ----
  	sys_call_table[__NR_afs_syscall - 1024] =
  		POINTER2SYSCALL((struct fptr *)afs_syscall_stub)->ip;
  #else /* AFS_IA64_LINUX20_ENV */
! 	afs_ni_syscall = sys_call_table[_S(__NR_afs_syscall)];
! 	sys_call_table[_S(__NR_afs_syscall)] = POINTER2SYSCALL afs_syscall;
  #ifdef AFS_SPARC64_LINUX20_ENV
  	afs_ni_syscall32 = sys_call_table32[__NR_afs_syscall];
  	sys_call_table32[__NR_afs_syscall] = POINTER2SYSCALL afs_syscall32;
***************
*** 486,493 ****
      sys_call_table[__NR_setgroups - 1024] =
  	POINTER2SYSCALL((struct fptr *)afs_xsetgroups_stub)->ip;
  #else /* AFS_IA64_LINUX20_ENV */
!     sys_setgroupsp = SYSCALL2POINTER sys_call_table[__NR_setgroups];
!     sys_call_table[__NR_setgroups] = POINTER2SYSCALL afs_xsetgroups;
  #ifdef AFS_SPARC64_LINUX20_ENV
      sys32_setgroupsp = SYSCALL2POINTER sys_call_table32[__NR_setgroups];
      sys_call_table32[__NR_setgroups] = POINTER2SYSCALL afs32_xsetgroups;
--- 493,500 ----
      sys_call_table[__NR_setgroups - 1024] =
  	POINTER2SYSCALL((struct fptr *)afs_xsetgroups_stub)->ip;
  #else /* AFS_IA64_LINUX20_ENV */
!     sys_setgroupsp = SYSCALL2POINTER sys_call_table[_S(__NR_setgroups)];
!     sys_call_table[_S(__NR_setgroups)] = POINTER2SYSCALL afs_xsetgroups;
  #ifdef AFS_SPARC64_LINUX20_ENV
      sys32_setgroupsp = SYSCALL2POINTER sys_call_table32[__NR_setgroups];
      sys_call_table32[__NR_setgroups] = POINTER2SYSCALL afs32_xsetgroups;
***************
*** 548,555 ****
  	POINTER2SYSCALL((struct fptr *)sys_setgroupsp)->ip;
      sys_call_table[__NR_afs_syscall - 1024] = afs_ni_syscall;
  #else /* AFS_IA64_LINUX20_ENV */
!     sys_call_table[__NR_setgroups] = POINTER2SYSCALL sys_setgroupsp;
!     sys_call_table[__NR_afs_syscall] = afs_ni_syscall;
  # ifdef AFS_SPARC64_LINUX20_ENV
      sys_call_table32[__NR_setgroups] = POINTER2SYSCALL sys32_setgroupsp;
      sys_call_table32[__NR_afs_syscall] = afs_ni_syscall32;
--- 555,562 ----
  	POINTER2SYSCALL((struct fptr *)sys_setgroupsp)->ip;
      sys_call_table[__NR_afs_syscall - 1024] = afs_ni_syscall;
  #else /* AFS_IA64_LINUX20_ENV */
!     sys_call_table[_S(__NR_setgroups)] = POINTER2SYSCALL sys_setgroupsp;
!     sys_call_table[_S(__NR_afs_syscall)] = afs_ni_syscall;
  # ifdef AFS_SPARC64_LINUX20_ENV
      sys_call_table32[__NR_setgroups] = POINTER2SYSCALL sys32_setgroupsp;
      sys_call_table32[__NR_afs_syscall] = afs_ni_syscall32;
Index: openafs/src/afs/LINUX/osi_vnodeops.c
diff -c openafs/src/afs/LINUX/osi_vnodeops.c:1.81 openafs/src/afs/LINUX/osi_vnodeops.c:1.81.2.2
*** openafs/src/afs/LINUX/osi_vnodeops.c:1.81	Wed Jul 21 18:23:38 2004
--- openafs/src/afs/LINUX/osi_vnodeops.c	Wed Aug 25 03:10:39 2004
***************
*** 22,34 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_vnodeops.c,v 1.81 2004/07/21 22:23:38 shadow Exp $");
  
  #include "afs/sysincludes.h"
  #include "afsincludes.h"
  #include "afs/afs_stats.h"
  #include "afs/afs_osidnlc.h"
  #include "h/mm.h"
  #include "h/pagemap.h"
  #if defined(AFS_LINUX24_ENV)
  #include "h/smp_lock.h"
--- 22,37 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_vnodeops.c,v 1.81.2.2 2004/08/25 07:10:39 shadow Exp $");
  
  #include "afs/sysincludes.h"
  #include "afsincludes.h"
  #include "afs/afs_stats.h"
  #include "afs/afs_osidnlc.h"
  #include "h/mm.h"
+ #ifdef HAVE_MM_INLINE_H
+ #include "h/mm_inline.h"
+ #endif
  #include "h/pagemap.h"
  #if defined(AFS_LINUX24_ENV)
  #include "h/smp_lock.h"
***************
*** 1085,1090 ****
--- 1088,1099 ----
  	    printk
  		("afs_linux_lookup: ip->i_mode 0x%x  dp->d_name.name %s  code %d\n",
  		 ip->i_mode, dp->d_name.name, code);
+ #ifdef STRUCT_INODE_HAS_I_SECURITY
+        if (ip->i_security == NULL) {
+            if (security_inode_alloc(ip))
+                panic("afs_linux_lookup: Cannot allocate inode security");
+        }
+ #endif
  #else
  	if (S_ISDIR(ip->i_mode))
  	    ip->i_op = &afs_dir_iops;
Index: openafs/src/afs/UKERNEL/afs_usrops.c
diff -c openafs/src/afs/UKERNEL/afs_usrops.c:1.27 openafs/src/afs/UKERNEL/afs_usrops.c:1.27.2.1
*** openafs/src/afs/UKERNEL/afs_usrops.c:1.27	Thu May 20 15:15:04 2004
--- openafs/src/afs/UKERNEL/afs_usrops.c	Wed Aug 25 03:15:34 2004
***************
*** 15,21 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/UKERNEL/afs_usrops.c,v 1.27 2004/05/20 19:15:04 kolya Exp $");
  
  
  #ifdef	UKERNEL
--- 15,21 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/UKERNEL/afs_usrops.c,v 1.27.2.1 2004/08/25 07:15:34 shadow Exp $");
  
  
  #ifdef	UKERNEL
***************
*** 1702,1708 ****
      {
  	/* parse multihomed address files */
  	char reason[1024];
! 	st = parseNetFiles(buffer, maskbuffer, mtubuffer, MAXIPADDRS, reason,
  			   AFSDIR_CLIENT_NETINFO_FILEPATH,
  			   AFSDIR_CLIENT_NETRESTRICT_FILEPATH);
  	if (st > 0)
--- 1702,1708 ----
      {
  	/* parse multihomed address files */
  	char reason[1024];
! 	st = parseNetFiles((afs_uint32*)buffer,(afs_uint32*) maskbuffer, (afs_uint32*)mtubuffer, MAXIPADDRS, reason,
  			   AFSDIR_CLIENT_NETINFO_FILEPATH,
  			   AFSDIR_CLIENT_NETRESTRICT_FILEPATH);
  	if (st > 0)
***************
*** 2265,2271 ****
  	    /*
  	     * We need execute permission to search a directory
  	     */
! 	    code = afs_access(vp, VEXEC, u.u_cred);
  	    if (code != 0) {
  		VN_RELE(vp);
  		afs_osi_Free(tmpPath, strlen(path) + 1);
--- 2265,2271 ----
  	    /*
  	     * We need execute permission to search a directory
  	     */
! 	    code = afs_access(VTOAFS(vp), VEXEC, u.u_cred);
  	    if (code != 0) {
  		VN_RELE(vp);
  		afs_osi_Free(tmpPath, strlen(path) + 1);
***************
*** 2638,2643 ****
--- 2638,2645 ----
      struct usr_vattr attrs;
      char *nameP;
  
+     struct vcache* vc;
+ 
      if (uafs_IsRoot(path)) {
  	fileP = afs_RootVnode;
  	VN_HOLD(fileP);
***************
*** 2680,2689 ****
  		attrs.va_size = 0;
  	    }
  	    fileP = NULL;
  	    code =
! 		afs_create(dirP, nameP, &attrs,
  			   (flags & O_EXCL) ? usr_EXCL : usr_NONEXCL, mode,
! 			   &fileP, u.u_cred);
  	    VN_RELE(dirP);
  	    if (code != 0) {
  		errno = code;
--- 2682,2692 ----
  		attrs.va_size = 0;
  	    }
  	    fileP = NULL;
+ 	    vc=VTOAFS(fileP);
  	    code =
! 		afs_create(VTOAFS(dirP), nameP, &attrs,
  			   (flags & O_EXCL) ? usr_EXCL : usr_NONEXCL, mode,
! 			   &vc, u.u_cred);
  	    VN_RELE(dirP);
  	    if (code != 0) {
  		errno = code;
***************
*** 2710,2716 ****
  	    }
  	    if (!fileMode)
  		fileMode = VREAD;	/* since O_RDONLY is 0 */
! 	    code = afs_access(fileP, fileMode, u.u_cred);
  	    if (code != 0) {
  		VN_RELE(fileP);
  		errno = code;
--- 2713,2719 ----
  	    }
  	    if (!fileMode)
  		fileMode = VREAD;	/* since O_RDONLY is 0 */
! 	    code = afs_access(VTOAFS(fileP), fileMode, u.u_cred);
  	    if (code != 0) {
  		VN_RELE(fileP);
  		errno = code;
***************
*** 2720,2726 ****
  	    /*
  	     * Get the file attributes, all we need is the size
  	     */
! 	    code = afs_getattr(fileP, &attrs, u.u_cred);
  	    if (code != 0) {
  		VN_RELE(fileP);
  		errno = code;
--- 2723,2729 ----
  	    /*
  	     * Get the file attributes, all we need is the size
  	     */
! 	    code = afs_getattr(VTOAFS(fileP), &attrs, u.u_cred);
  	    if (code != 0) {
  		VN_RELE(fileP);
  		errno = code;
***************
*** 2762,2768 ****
      if ((flags & O_TRUNC) && (attrs.va_size != 0)) {
  	usr_vattr_null(&attrs);
  	attrs.va_size = 0;
! 	code = afs_setattr(fileP, &attrs, u.u_cred);
  	if (code != 0) {
  	    VN_RELE(fileP);
  	    errno = code;
--- 2765,2771 ----
      if ((flags & O_TRUNC) && (attrs.va_size != 0)) {
  	usr_vattr_null(&attrs);
  	attrs.va_size = 0;
! 	code = afs_setattr(VTOAFS(fileP), &attrs, u.u_cred);
  	if (code != 0) {
  	    VN_RELE(fileP);
  	    errno = code;
***************
*** 2770,2779 ****
  	}
      }
  
      /*
       * do the open
       */
!     code = afs_open(&fileP, openFlags, u.u_cred);
      if (code != 0) {
  	VN_RELE(fileP);
  	errno = code;
--- 2773,2783 ----
  	}
      }
  
+     vc=VTOAFS(fileP);	
      /*
       * do the open
       */
!     code = afs_open(&vc, openFlags, u.u_cred);
      if (code != 0) {
  	VN_RELE(fileP);
  	errno = code;
***************
*** 2869,2875 ****
       * do the write
       */
  
!     code = afs_write(fileP, &uio, afs_FileFlags[fd], u.u_cred, 0);
      if (code) {
  	errno = code;
  	return -1;
--- 2873,2879 ----
       * do the write
       */
  
!     code = afs_write(VTOAFS(fileP), &uio, afs_FileFlags[fd], u.u_cred, 0);
      if (code) {
  	errno = code;
  	return -1;
***************
*** 2925,2931 ****
      /*
       * do the read
       */
!     code = afs_read(fileP, &uio, u.u_cred, 0, &bufP, 0);
      if (code) {
  	errno = code;
  	return -1;
--- 2929,2935 ----
      /*
       * do the read
       */
!     code = afs_read(VTOAFS(fileP), &uio, u.u_cred, 0, &bufP, 0);
      if (code) {
  	errno = code;
  	return -1;
***************
*** 2951,2957 ****
      /*
       * Get the attributes
       */
!     code = afs_getattr(vp, &attrs, u.u_cred);
      if (code != 0) {
  	return code;
      }
--- 2955,2961 ----
      /*
       * Get the attributes
       */
!     code = afs_getattr(VTOAFS(vp), &attrs, u.u_cred);
      if (code != 0) {
  	return code;
      }
***************
*** 3102,3108 ****
      }
      usr_vattr_null(&attrs);
      attrs.va_mode = mode;
!     code = afs_setattr(vp, &attrs, u.u_cred);
      VN_RELE(vp);
      if (code != 0) {
  	errno = code;
--- 3106,3112 ----
      }
      usr_vattr_null(&attrs);
      attrs.va_mode = mode;
!     code = afs_setattr(VTOAFS(vp), &attrs, u.u_cred);
      VN_RELE(vp);
      if (code != 0) {
  	errno = code;
***************
*** 3138,3144 ****
      }
      usr_vattr_null(&attrs);
      attrs.va_mode = mode;
!     code = afs_setattr(vp, &attrs, u.u_cred);
      if (code != 0) {
  	errno = code;
  	return -1;
--- 3142,3148 ----
      }
      usr_vattr_null(&attrs);
      attrs.va_mode = mode;
!     code = afs_setattr(VTOAFS(vp), &attrs, u.u_cred);
      if (code != 0) {
  	errno = code;
  	return -1;
***************
*** 3173,3179 ****
      }
      usr_vattr_null(&attrs);
      attrs.va_size = length;
!     code = afs_setattr(vp, &attrs, u.u_cred);
      VN_RELE(vp);
      if (code != 0) {
  	errno = code;
--- 3177,3183 ----
      }
      usr_vattr_null(&attrs);
      attrs.va_size = length;
!     code = afs_setattr(VTOAFS(vp), &attrs, u.u_cred);
      VN_RELE(vp);
      if (code != 0) {
  	errno = code;
***************
*** 3209,3215 ****
      }
      usr_vattr_null(&attrs);
      attrs.va_size = length;
!     code = afs_setattr(vp, &attrs, u.u_cred);
      if (code != 0) {
  	errno = code;
  	return -1;
--- 3213,3219 ----
      }
      usr_vattr_null(&attrs);
      attrs.va_size = length;
!     code = afs_setattr(VTOAFS(vp), &attrs, u.u_cred);
      if (code != 0) {
  	errno = code;
  	return -1;
***************
*** 3251,3257 ****
  	newpos = offset;
  	break;
      case SEEK_END:
! 	code = afs_getattr(vp, &attrs, u.u_cred);
  	if (code != 0) {
  	    errno = code;
  	    return -1;
--- 3255,3261 ----
  	newpos = offset;
  	break;
      case SEEK_END:
! 	code = afs_getattr(VTOAFS(vp), &attrs, u.u_cred);
  	if (code != 0) {
  	    errno = code;
  	    return -1;
Index: openafs/src/afs/UKERNEL/osi_vfsops.c
diff -c openafs/src/afs/UKERNEL/osi_vfsops.c:1.10 openafs/src/afs/UKERNEL/osi_vfsops.c:1.10.2.1
*** openafs/src/afs/UKERNEL/osi_vfsops.c:1.10	Tue Jul 15 19:14:29 2003
--- openafs/src/afs/UKERNEL/osi_vfsops.c	Wed Aug 25 03:09:34 2004
***************
*** 11,17 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/UKERNEL/osi_vfsops.c,v 1.10 2003/07/15 23:14:29 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/UKERNEL/osi_vfsops.c,v 1.10.2.1 2004/08/25 07:09:34 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 75,83 ****
      register afs_int32 code = 0;
      struct vrequest treq;
      register struct vcache *tvp = 0;
!     OSI_VFS_CONVERT(afsp)
  
! 	AFS_STATCNT(afs_root);
      if (afs_globalVp && (afs_globalVp->states & CStatd)) {
  	tvp = afs_globalVp;
      } else {
--- 75,83 ----
      register afs_int32 code = 0;
      struct vrequest treq;
      register struct vcache *tvp = 0;
!     OSI_VFS_CONVERT(afsp);
  
!     AFS_STATCNT(afs_root);
      if (afs_globalVp && (afs_globalVp->states & CStatd)) {
  	tvp = afs_globalVp;
      } else {
Index: openafs/src/afs/VNOPS/afs_vnop_access.c
diff -c openafs/src/afs/VNOPS/afs_vnop_access.c:1.10 openafs/src/afs/VNOPS/afs_vnop_access.c:1.10.2.1
*** openafs/src/afs/VNOPS/afs_vnop_access.c:1.10	Tue Jul 15 19:14:29 2003
--- openafs/src/afs/VNOPS/afs_vnop_access.c	Wed Aug 25 03:09:35 2004
***************
*** 23,29 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_access.c,v 1.10 2003/07/15 23:14:29 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 23,29 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_access.c,v 1.10.2.1 2004/08/25 07:09:35 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 189,197 ****
      register afs_int32 code;
      struct vrequest treq;
      struct afs_fakestat_state fakestate;
!     OSI_VC_CONVERT(avc)
  
! 	AFS_STATCNT(afs_access);
      afs_Trace3(afs_iclSetp, CM_TRACE_ACCESS, ICL_TYPE_POINTER, avc,
  	       ICL_TYPE_INT32, amode, ICL_TYPE_OFFSET,
  	       ICL_HANDLE_OFFSET(avc->m.Length));
--- 189,197 ----
      register afs_int32 code;
      struct vrequest treq;
      struct afs_fakestat_state fakestate;
!     OSI_VC_CONVERT(avc);
  
!     AFS_STATCNT(afs_access);
      afs_Trace3(afs_iclSetp, CM_TRACE_ACCESS, ICL_TYPE_POINTER, avc,
  	       ICL_TYPE_INT32, amode, ICL_TYPE_OFFSET,
  	       ICL_HANDLE_OFFSET(avc->m.Length));
***************
*** 314,322 ****
  {
      register afs_int32 code;
      struct vrequest treq;
!     OSI_VC_CONVERT(avc)
  
! 	if (code = afs_InitReq(&treq, acred))
  	return code;
  
      code = afs_VerifyVCache(avc, &treq);
--- 314,322 ----
  {
      register afs_int32 code;
      struct vrequest treq;
!     OSI_VC_CONVERT(avc);
  
!     if (code = afs_InitReq(&treq, acred))
  	return code;
  
      code = afs_VerifyVCache(avc, &treq);
Index: openafs/src/afs/VNOPS/afs_vnop_attrs.c
diff -c openafs/src/afs/VNOPS/afs_vnop_attrs.c:1.27 openafs/src/afs/VNOPS/afs_vnop_attrs.c:1.27.2.1
*** openafs/src/afs/VNOPS/afs_vnop_attrs.c:1.27	Fri Oct 24 02:26:04 2003
--- openafs/src/afs/VNOPS/afs_vnop_attrs.c	Wed Aug 25 03:09:35 2004
***************
*** 24,30 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_attrs.c,v 1.27 2003/10/24 06:26:04 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 24,30 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_attrs.c,v 1.27.2.1 2004/08/25 07:09:35 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 71,77 ****
      }
  #if defined(AFS_DARWIN_ENV)
      {
!         extern u_int32_t afs_darwin_realmodes;
  	if (!afs_darwin_realmodes) {
  	    /* Mac OS X uses the mode bits to determine whether a file or
  	     * directory is accessible, and believes them, even though under
--- 71,77 ----
      }
  #if defined(AFS_DARWIN_ENV)
      {
! 	extern u_int32_t afs_darwin_realmodes;
  	if (!afs_darwin_realmodes) {
  	    /* Mac OS X uses the mode bits to determine whether a file or
  	     * directory is accessible, and believes them, even though under
***************
*** 80,92 ****
  	     * conservatively.
  	     */
  	    if (S_ISDIR(attrs->va_mode)) {
! 	        /* all access bits need to be set for directories, since even
  		 * a mode 0 directory can still be used normally.
  		 */
! 	        attrs->va_mode |= ACCESSPERMS;
  	    } else {
! 	        /* for other files, replicate the user bits to group and other */
! 	        mode_t ubits = (attrs->va_mode & S_IRWXU) >> 6;
  		attrs->va_mode |= ubits | (ubits << 3);
  	    }
  	}
--- 80,92 ----
  	     * conservatively.
  	     */
  	    if (S_ISDIR(attrs->va_mode)) {
! 		/* all access bits need to be set for directories, since even
  		 * a mode 0 directory can still be used normally.
  		 */
! 		attrs->va_mode |= ACCESSPERMS;
  	    } else {
! 		/* for other files, replicate the user bits to group and other */
! 		mode_t ubits = (attrs->va_mode & S_IRWXU) >> 6;
  		attrs->va_mode |= ubits | (ubits << 3);
  	    }
  	}
***************
*** 105,111 ****
      attrs->va_fsid = avc->v.v_mount->m_stat.f_fsid.val[0];
  #else
  #ifdef AFS_DARWIN70_ENV
!     attrs->va_fsid = avc->v.v_mount->mnt_stat.f_fsid.val[0]; 
  #else /* ! AFS_DARWIN70_ENV */
      attrs->va_fsid = 1;
  #endif /* AFS_DARWIN70_ENV */
--- 105,111 ----
      attrs->va_fsid = avc->v.v_mount->m_stat.f_fsid.val[0];
  #else
  #ifdef AFS_DARWIN70_ENV
!     attrs->va_fsid = avc->v.v_mount->mnt_stat.f_fsid.val[0];
  #else /* ! AFS_DARWIN70_ENV */
      attrs->va_fsid = 1;
  #endif /* AFS_DARWIN70_ENV */
***************
*** 242,250 ****
      extern struct unixuser *afs_FindUser();
      struct unixuser *au;
      int inited = 0;
!     OSI_VC_CONVERT(avc)
  
! 	AFS_STATCNT(afs_getattr);
      afs_Trace2(afs_iclSetp, CM_TRACE_GETATTR, ICL_TYPE_POINTER, avc,
  	       ICL_TYPE_OFFSET, ICL_HANDLE_OFFSET(avc->m.Length));
  
--- 242,250 ----
      extern struct unixuser *afs_FindUser();
      struct unixuser *au;
      int inited = 0;
!     OSI_VC_CONVERT(avc);
  
!     AFS_STATCNT(afs_getattr);
      afs_Trace2(afs_iclSetp, CM_TRACE_GETATTR, ICL_TYPE_POINTER, avc,
  	       ICL_TYPE_OFFSET, ICL_HANDLE_OFFSET(avc->m.Length));
  
***************
*** 474,482 ****
      struct AFSStoreStatus astat;
      register afs_int32 code;
      struct afs_fakestat_state fakestate;
!     OSI_VC_CONVERT(avc)
  
! 	AFS_STATCNT(afs_setattr);
  #if defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV) || defined(AFS_LINUX22_ENV)
      afs_Trace4(afs_iclSetp, CM_TRACE_SETATTR, ICL_TYPE_POINTER, avc,
  	       ICL_TYPE_INT32, attrs->va_mask, ICL_TYPE_OFFSET,
--- 474,482 ----
      struct AFSStoreStatus astat;
      register afs_int32 code;
      struct afs_fakestat_state fakestate;
!     OSI_VC_CONVERT(avc);
  
!     AFS_STATCNT(afs_setattr);
  #if defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV) || defined(AFS_LINUX22_ENV)
      afs_Trace4(afs_iclSetp, CM_TRACE_SETATTR, ICL_TYPE_POINTER, avc,
  	       ICL_TYPE_INT32, attrs->va_mask, ICL_TYPE_OFFSET,
Index: openafs/src/afs/VNOPS/afs_vnop_create.c
diff -c openafs/src/afs/VNOPS/afs_vnop_create.c:1.16 openafs/src/afs/VNOPS/afs_vnop_create.c:1.16.2.1
*** openafs/src/afs/VNOPS/afs_vnop_create.c:1.16	Tue Jul 15 19:14:30 2003
--- openafs/src/afs/VNOPS/afs_vnop_create.c	Wed Aug 25 03:09:35 2004
***************
*** 17,23 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_create.c,v 1.16 2003/07/15 23:14:30 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/VNOPS/afs_vnop_create.c,v 1.16.2.1 2004/08/25 07:09:35 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 71,80 ****
      struct vcache *tvc;
      struct volume *volp = 0;
      struct afs_fakestat_state fakestate;
!     XSTATS_DECLS OSI_VC_CONVERT(adp)
  
  
!       AFS_STATCNT(afs_create);
      if ((code = afs_InitReq(&treq, acred)))
  	goto done2;
  
--- 71,81 ----
      struct vcache *tvc;
      struct volume *volp = 0;
      struct afs_fakestat_state fakestate;
!     XSTATS_DECLS;
!     OSI_VC_CONVERT(adp);
  
  
!     AFS_STATCNT(afs_create);
      if ((code = afs_InitReq(&treq, acred)))
  	goto done2;
  
Index: openafs/src/afs/VNOPS/afs_vnop_dirops.c
diff -c openafs/src/afs/VNOPS/afs_vnop_dirops.c:1.14 openafs/src/afs/VNOPS/afs_vnop_dirops.c:1.14.2.1
*** openafs/src/afs/VNOPS/afs_vnop_dirops.c:1.14	Fri Aug 29 18:00:04 2003
--- openafs/src/afs/VNOPS/afs_vnop_dirops.c	Wed Aug 25 03:09:35 2004
***************
*** 21,27 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_dirops.c,v 1.14 2003/08/29 22:00:04 rees Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 21,27 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_dirops.c,v 1.14.2.1 2004/08/25 07:09:35 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 47,53 ****
      struct ucred *acred = ndp->ni_cred;
  #else /* AFS_OSF_ENV */
  afs_mkdir(OSI_VC_ARG(adp), aname, attrs, avcp, acred)
!     OSI_VC_DECL(adp);
       register struct vcache **avcp;
       char *aname;
       struct vattr *attrs;
--- 47,53 ----
      struct ucred *acred = ndp->ni_cred;
  #else /* AFS_OSF_ENV */
  afs_mkdir(OSI_VC_ARG(adp), aname, attrs, avcp, acred)
!      OSI_VC_DECL(adp);
       register struct vcache **avcp;
       char *aname;
       struct vattr *attrs;
***************
*** 67,75 ****
      struct AFSVolSync tsync;
      afs_int32 now;
      struct afs_fakestat_state fakestate;
!     XSTATS_DECLS OSI_VC_CONVERT(adp)
  
!       AFS_STATCNT(afs_mkdir);
      afs_Trace2(afs_iclSetp, CM_TRACE_MKDIR, ICL_TYPE_POINTER, adp,
  	       ICL_TYPE_STRING, aname);
  
--- 67,76 ----
      struct AFSVolSync tsync;
      afs_int32 now;
      struct afs_fakestat_state fakestate;
!     XSTATS_DECLS;
!     OSI_VC_CONVERT(adp);
  
!     AFS_STATCNT(afs_mkdir);
      afs_Trace2(afs_iclSetp, CM_TRACE_MKDIR, ICL_TYPE_POINTER, adp,
  	       ICL_TYPE_STRING, aname);
  
***************
*** 194,200 ****
  #else
  afs_rmdir(adp, aname, acred)
  #endif
!     OSI_VC_DECL(adp);
       char *aname;
       struct AFS_UCRED *acred;
  {
--- 195,201 ----
  #else
  afs_rmdir(adp, aname, acred)
  #endif
!      OSI_VC_DECL(adp);
       char *aname;
       struct AFS_UCRED *acred;
  {
***************
*** 208,216 ****
      struct AFSFetchStatus OutDirStatus;
      struct AFSVolSync tsync;
      struct afs_fakestat_state fakestate;
!     XSTATS_DECLS OSI_VC_CONVERT(adp)
  
!       AFS_STATCNT(afs_rmdir);
  
      afs_Trace2(afs_iclSetp, CM_TRACE_RMDIR, ICL_TYPE_POINTER, adp,
  	       ICL_TYPE_STRING, aname);
--- 209,218 ----
      struct AFSFetchStatus OutDirStatus;
      struct AFSVolSync tsync;
      struct afs_fakestat_state fakestate;
!     XSTATS_DECLS;
!     OSI_VC_CONVERT(adp);
  
!     AFS_STATCNT(afs_rmdir);
  
      afs_Trace2(afs_iclSetp, CM_TRACE_RMDIR, ICL_TYPE_POINTER, adp,
  	       ICL_TYPE_STRING, aname);
Index: openafs/src/afs/VNOPS/afs_vnop_fid.c
diff -c openafs/src/afs/VNOPS/afs_vnop_fid.c:1.11 openafs/src/afs/VNOPS/afs_vnop_fid.c:1.11.2.1
*** openafs/src/afs/VNOPS/afs_vnop_fid.c:1.11	Tue Jul 15 19:14:30 2003
--- openafs/src/afs/VNOPS/afs_vnop_fid.c	Wed Aug 25 03:09:35 2004
***************
*** 18,24 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_fid.c,v 1.11 2003/07/15 23:14:30 shadow Exp $");
  
  #if !defined(AFS_DUX40_ENV) && !defined(AFS_LINUX20_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_OBSD_ENV)
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
--- 18,24 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_fid.c,v 1.11.2.1 2004/08/25 07:09:35 shadow Exp $");
  
  #if !defined(AFS_DUX40_ENV) && !defined(AFS_LINUX20_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_OBSD_ENV)
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
***************
*** 75,81 ****
  #else
  afs_fid(OSI_VC_ARG(avc), fidpp)
  #endif				/* AFS_AIX41_ENV */
! OSI_VC_DECL(avc);
  #if	defined(AFS_AIX_ENV) || defined(AFS_OSF_ENV) || defined(AFS_SUN54_ENV)
       struct fid *fidpp;
  #else
--- 75,81 ----
  #else
  afs_fid(OSI_VC_ARG(avc), fidpp)
  #endif				/* AFS_AIX41_ENV */
!      OSI_VC_DECL(avc);
  #if	defined(AFS_AIX_ENV) || defined(AFS_OSF_ENV) || defined(AFS_SUN54_ENV)
       struct fid *fidpp;
  #else
***************
*** 88,96 ****
      extern struct vcache *afs_globalVp;
      int SizeOfSmallFid = SIZEOF_SMALLFID;
      int rootvp = 0;
!     OSI_VC_CONVERT(avc)
  
! 	AFS_STATCNT(afs_fid);
  
      if (afs_shuttingdown)
  	return EIO;
--- 88,96 ----
      extern struct vcache *afs_globalVp;
      int SizeOfSmallFid = SIZEOF_SMALLFID;
      int rootvp = 0;
!     OSI_VC_CONVERT(avc);
  
!     AFS_STATCNT(afs_fid);
  
      if (afs_shuttingdown)
  	return EIO;
Index: openafs/src/afs/VNOPS/afs_vnop_flock.c
diff -c openafs/src/afs/VNOPS/afs_vnop_flock.c:1.24 openafs/src/afs/VNOPS/afs_vnop_flock.c:1.24.2.1
*** openafs/src/afs/VNOPS/afs_vnop_flock.c:1.24	Tue Jul 15 19:14:30 2003
--- openafs/src/afs/VNOPS/afs_vnop_flock.c	Wed Aug 25 03:09:35 2004
***************
*** 16,22 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_flock.c,v 1.24 2003/07/15 23:14:30 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 16,22 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_flock.c,v 1.24.2.1 2004/08/25 07:09:35 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 226,232 ****
      struct AFSVolSync tsync;
      afs_int32 lockType;
      struct AFS_FLOCK flock;
!     XSTATS_DECLS AFS_STATCNT(HandleFlock);
      code = 0;			/* default when we don't make any network calls */
      lockIdSet(&flock, NULL, clid);
  
--- 226,233 ----
      struct AFSVolSync tsync;
      afs_int32 lockType;
      struct AFS_FLOCK flock;
!     XSTATS_DECLS;
!     AFS_STATCNT(HandleFlock);
      code = 0;			/* default when we don't make any network calls */
      lockIdSet(&flock, NULL, clid);
  
***************
*** 804,810 ****
      struct AFSCallBack CallBack;
      struct AFSVolSync tsync;
      int temp;
!     XSTATS_DECLS temp = areq->flags & O_NONBLOCK;
      areq->flags |= O_NONBLOCK;
  
      do {
--- 805,812 ----
      struct AFSCallBack CallBack;
      struct AFSVolSync tsync;
      int temp;
!     XSTATS_DECLS;
!     temp = areq->flags & O_NONBLOCK;
      areq->flags |= O_NONBLOCK;
  
      do {
Index: openafs/src/afs/VNOPS/afs_vnop_link.c
diff -c openafs/src/afs/VNOPS/afs_vnop_link.c:1.15 openafs/src/afs/VNOPS/afs_vnop_link.c:1.15.2.1
*** openafs/src/afs/VNOPS/afs_vnop_link.c:1.15	Fri Aug 29 18:00:04 2003
--- openafs/src/afs/VNOPS/afs_vnop_link.c	Wed Aug 25 03:09:35 2004
***************
*** 17,23 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_link.c,v 1.15 2003/08/29 22:00:04 rees 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/VNOPS/afs_vnop_link.c,v 1.15.2.1 2004/08/25 07:09:35 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 46,52 ****
  #else
  afs_link(avc, OSI_VC_ARG(adp), aname, acred)
  #endif
!     OSI_VC_DECL(adp);
       struct vcache *avc;
       char *aname;
       struct AFS_UCRED *acred;
--- 46,52 ----
  #else
  afs_link(avc, OSI_VC_ARG(adp), aname, acred)
  #endif
!      OSI_VC_DECL(adp);
       struct vcache *avc;
       char *aname;
       struct AFS_UCRED *acred;
***************
*** 60,68 ****
      struct AFSFetchStatus OutFidStatus, OutDirStatus;
      struct AFSVolSync tsync;
      struct afs_fakestat_state vfakestate, dfakestate;
!     XSTATS_DECLS OSI_VC_CONVERT(adp)
  
!       AFS_STATCNT(afs_link);
      afs_Trace3(afs_iclSetp, CM_TRACE_LINK, ICL_TYPE_POINTER, adp,
  	       ICL_TYPE_POINTER, avc, ICL_TYPE_STRING, aname);
      /* create a hard link; new entry is aname in dir adp */
--- 60,69 ----
      struct AFSFetchStatus OutFidStatus, OutDirStatus;
      struct AFSVolSync tsync;
      struct afs_fakestat_state vfakestate, dfakestate;
!     XSTATS_DECLS;
!     OSI_VC_CONVERT(adp);
  
!     AFS_STATCNT(afs_link);
      afs_Trace3(afs_iclSetp, CM_TRACE_LINK, ICL_TYPE_POINTER, adp,
  	       ICL_TYPE_POINTER, avc, ICL_TYPE_STRING, aname);
      /* create a hard link; new entry is aname in dir adp */
Index: openafs/src/afs/VNOPS/afs_vnop_lookup.c
diff -c openafs/src/afs/VNOPS/afs_vnop_lookup.c:1.50 openafs/src/afs/VNOPS/afs_vnop_lookup.c:1.50.2.1
*** openafs/src/afs/VNOPS/afs_vnop_lookup.c:1.50	Wed Mar 17 01:43:36 2004
--- openafs/src/afs/VNOPS/afs_vnop_lookup.c	Wed Aug 25 03:09:35 2004
***************
*** 18,24 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_lookup.c,v 1.50 2004/03/17 06:43:36 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 18,24 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_lookup.c,v 1.50.2.1 2004/08/25 07:09:35 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 402,408 ****
  
  static int
  afs_getsysname(register struct vrequest *areq, register struct vcache *adp,
!                register char *bufp, int *num, char **sysnamelist[])
  {
      register struct unixuser *au;
      register afs_int32 error;
--- 402,408 ----
  
  static int
  afs_getsysname(register struct vrequest *areq, register struct vcache *adp,
! 	       register char *bufp, int *num, char **sysnamelist[])
  {
      register struct unixuser *au;
      register afs_int32 error;
***************
*** 411,439 ****
  
      *sysnamelist = afs_sysnamelist;
  
!     if (!afs_nfsexporter) 
!        strcpy(bufp, (*sysnamelist)[0]);
      else {
!        au = afs_GetUser(areq->uid, adp->fid.Cell, 0);
!        if (au->exporter) {
!            error = EXP_SYSNAME(au->exporter, (char *)0, sysnamelist, num);
!            if (error) {
!                strcpy(bufp, "@sys");
!                afs_PutUser(au, 0);   
!                return -1;
!            } else {
!                strcpy(bufp, (*sysnamelist)[0]);
!            }
!        } else 
!            strcpy(bufp, afs_sysname);
!        afs_PutUser(au, 0);       
      }
      return 0;
  }
  
  void
! Check_AtSys(register struct vcache *avc, char *aname, 
!             struct sysname_info *state, struct vrequest *areq)
  {
      int num = 0;
      char **sysnamelist[MAXSYSNAME];
--- 411,439 ----
  
      *sysnamelist = afs_sysnamelist;
  
!     if (!afs_nfsexporter)
! 	strcpy(bufp, (*sysnamelist)[0]);
      else {
! 	au = afs_GetUser(areq->uid, adp->fid.Cell, 0);
! 	if (au->exporter) {
! 	    error = EXP_SYSNAME(au->exporter, (char *)0, sysnamelist, num);
! 	    if (error) {
! 		strcpy(bufp, "@sys");
! 		afs_PutUser(au, 0);
! 		return -1;
! 	    } else {
! 		strcpy(bufp, (*sysnamelist)[0]);
! 	    }
! 	} else
! 	    strcpy(bufp, afs_sysname);
! 	afs_PutUser(au, 0);
      }
      return 0;
  }
  
  void
! Check_AtSys(register struct vcache *avc, char *aname,
! 	    struct sysname_info *state, struct vrequest *areq)
  {
      int num = 0;
      char **sysnamelist[MAXSYSNAME];
***************
*** 442,448 ****
  	state->offset = 0;
  	state->name = (char *)osi_AllocLargeSpace(AFS_SMALLOCSIZ);
  	state->allocked = 1;
! 	state->index = afs_getsysname(areq, avc, state->name, &num, sysnamelist);
      } else {
  	state->offset = -1;
  	state->allocked = 0;
--- 442,449 ----
  	state->offset = 0;
  	state->name = (char *)osi_AllocLargeSpace(AFS_SMALLOCSIZ);
  	state->allocked = 1;
! 	state->index =
! 	    afs_getsysname(areq, avc, state->name, &num, sysnamelist);
      } else {
  	state->offset = -1;
  	state->allocked = 0;
***************
*** 453,506 ****
  
  int
  Next_AtSys(register struct vcache *avc, struct vrequest *areq,
!            struct sysname_info *state)
  {
      int num = afs_sysnamecount;
      char **sysnamelist[MAXSYSNAME];
  
      if (state->index == -1)
!        return 0;       /* No list */
  
!     /* Check for the initial state of aname != "@sys" in Check_AtSys*/
      if (state->offset == -1 && state->allocked == 0) {
!        register char *tname;
  
!        /* Check for .*@sys */
!        for (tname=state->name; *tname; tname++)
!            /*Move to the end of the string*/;
! 
!        if ((tname > state->name + 4) && (AFS_EQ_ATSYS(tname-4))) {
!            state->offset = (tname - 4) - state->name;
!            tname = (char *) osi_AllocLargeSpace(AFS_LRALLOCSIZ);
!            strncpy(tname, state->name, state->offset);
!            state->name = tname;
!            state->allocked = 1;
!             num = 0;
!             state->index = afs_getsysname(areq, avc, state->name+state->offset,
!                                           &num, sysnamelist);
!            return 1;
!        } else
!            return 0; /* .*@sys doesn't match either */
      } else {
!        register struct unixuser *au;
!        register afs_int32 error;
!       
!        *sysnamelist = afs_sysnamelist;
! 
!        if (afs_nfsexporter) {
!            au = afs_GetUser(areq->uid, avc->fid.Cell, 0);
!            if (au->exporter) {
!                error = EXP_SYSNAME(au->exporter, (char *)0, sysnamelist, num);
!                if (error) {
!                    return 0;
!                }
!            } 
!            afs_PutUser(au, 0); 
!        }
!        if (++(state->index) >= num || !(*sysnamelist)[state->index])
!            return 0;   /* end of list */
      }
!     strcpy(state->name+state->offset, (*sysnamelist)[state->index]);
      return 1;
  }
  
--- 454,509 ----
  
  int
  Next_AtSys(register struct vcache *avc, struct vrequest *areq,
! 	   struct sysname_info *state)
  {
      int num = afs_sysnamecount;
      char **sysnamelist[MAXSYSNAME];
  
      if (state->index == -1)
! 	return 0;		/* No list */
  
!     /* Check for the initial state of aname != "@sys" in Check_AtSys */
      if (state->offset == -1 && state->allocked == 0) {
! 	register char *tname;
  
! 	/* Check for .*@sys */
! 	for (tname = state->name; *tname; tname++)
! 	    /*Move to the end of the string */ ;
! 
! 	if ((tname > state->name + 4) && (AFS_EQ_ATSYS(tname - 4))) {
! 	    state->offset = (tname - 4) - state->name;
! 	    tname = (char *)osi_AllocLargeSpace(AFS_LRALLOCSIZ);
! 	    strncpy(tname, state->name, state->offset);
! 	    state->name = tname;
! 	    state->allocked = 1;
! 	    num = 0;
! 	    state->index =
! 		afs_getsysname(areq, avc, state->name + state->offset, &num,
! 			       sysnamelist);
! 	    return 1;
! 	} else
! 	    return 0;		/* .*@sys doesn't match either */
      } else {
! 	register struct unixuser *au;
! 	register afs_int32 error;
! 
! 	*sysnamelist = afs_sysnamelist;
! 
! 	if (afs_nfsexporter) {
! 	    au = afs_GetUser(areq->uid, avc->fid.Cell, 0);
! 	    if (au->exporter) {
! 		error =
! 		    EXP_SYSNAME(au->exporter, (char *)0, sysnamelist, num);
! 		if (error) {
! 		    return 0;
! 		}
! 	    }
! 	    afs_PutUser(au, 0);
! 	}
! 	if (++(state->index) >= num || !(*sysnamelist)[state->index])
! 	    return 0;		/* end of list */
      }
!     strcpy(state->name + state->offset, (*sysnamelist)[state->index]);
      return 1;
  }
  
***************
*** 509,515 ****
  #else
  #if defined(AFS_HPUX1123_ENV)
  /* DEE should use the new afs_inode_t  for all */
! extern int BlobScan(ino_t *afile, afs_int32 ablob);
  #else
  #if defined AFS_LINUX_64BIT_KERNEL
  extern int BlobScan(long *afile, afs_int32 ablob);
--- 512,518 ----
  #else
  #if defined(AFS_HPUX1123_ENV)
  /* DEE should use the new afs_inode_t  for all */
! extern int BlobScan(ino_t * afile, afs_int32 ablob);
  #else
  #if defined AFS_LINUX_64BIT_KERNEL
  extern int BlobScan(long *afile, afs_int32 ablob);
***************
*** 577,589 ****
      struct VenusFid dotdot;
      int flagIndex;		/* First file with bulk fetch flag set */
      int inlinebulk = 0;		/* Did we use InlineBulk RPC or not? */
!     XSTATS_DECLS
! 	/* first compute some basic parameters.  We dont want to prefetch more
! 	 * than a fraction of the cache in any given call, and we want to preserve
! 	 * a portion of the LRU queue in any event, so as to avoid thrashing
! 	 * the entire stat cache (we will at least leave some of it alone).
! 	 * presently dont stat more than 1/8 the cache in any one call.      */
! 	nentries = afs_cacheStats / 8;
  
      /* dont bother prefetching more than one calls worth of info */
      if (nentries > AFSCBMAX)
--- 580,592 ----
      struct VenusFid dotdot;
      int flagIndex;		/* First file with bulk fetch flag set */
      int inlinebulk = 0;		/* Did we use InlineBulk RPC or not? */
!     XSTATS_DECLS;
!     /* first compute some basic parameters.  We dont want to prefetch more
!      * than a fraction of the cache in any given call, and we want to preserve
!      * a portion of the LRU queue in any event, so as to avoid thrashing
!      * the entire stat cache (we will at least leave some of it alone).
!      * presently dont stat more than 1/8 the cache in any one call.      */
!     nentries = afs_cacheStats / 8;
  
      /* dont bother prefetching more than one calls worth of info */
      if (nentries > AFSCBMAX)
***************
*** 1111,1117 ****
  afs_lookup(adp, aname, avcp, acred)
  #endif				/* UKERNEL */
  #endif				/* SUN5 || SGI */
! OSI_VC_DECL(adp);
       struct vcache **avcp;
       char *aname;
       struct AFS_UCRED *acred;
--- 1114,1120 ----
  afs_lookup(adp, aname, avcp, acred)
  #endif				/* UKERNEL */
  #endif				/* SUN5 || SGI */
!      OSI_VC_DECL(adp);
       struct vcache **avcp;
       char *aname;
       struct AFS_UCRED *acred;
***************
*** 1125,1131 ****
      int pass = 0, hit = 0;
      long dirCookie;
      extern afs_int32 afs_mariner;	/*Writing activity to log? */
!     OSI_VC_CONVERT(adp)
      afs_hyper_t versionNo;
      int no_read_access = 0;
      struct sysname_info sysState;	/* used only for @sys checking */
--- 1128,1134 ----
      int pass = 0, hit = 0;
      long dirCookie;
      extern afs_int32 afs_mariner;	/*Writing activity to log? */
!     OSI_VC_CONVERT(adp);
      afs_hyper_t versionNo;
      int no_read_access = 0;
      struct sysname_info sysState;	/* used only for @sys checking */
Index: openafs/src/afs/VNOPS/afs_vnop_readdir.c
diff -c openafs/src/afs/VNOPS/afs_vnop_readdir.c:1.24 openafs/src/afs/VNOPS/afs_vnop_readdir.c:1.24.2.1
*** openafs/src/afs/VNOPS/afs_vnop_readdir.c:1.24	Sun Aug  8 20:54:05 2004
--- openafs/src/afs/VNOPS/afs_vnop_readdir.c	Wed Aug 25 03:09:35 2004
***************
*** 23,29 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_readdir.c,v 1.24 2004/08/09 00:54:05 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 23,29 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_readdir.c,v 1.24.2.1 2004/08/25 07:09:35 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 72,79 ****
  #else
  #if defined(AFS_HPUX1123_ENV)
  /*DEE should use afs_inode_t for all */
! int 
! BlobScan(ino_t *afile, afs_int32 ablob)
  #else
  #ifdef AFS_LINUX_64BIT_KERNEL
  int
--- 72,79 ----
  #else
  #if defined(AFS_HPUX1123_ENV)
  /*DEE should use afs_inode_t for all */
! int
! BlobScan(ino_t * afile, afs_int32 ablob)
  #else
  #ifdef AFS_LINUX_64BIT_KERNEL
  int
***************
*** 509,515 ****
  afs_readdir(OSI_VC_ARG(avc), auio, acred)
  #endif
  #endif
!     OSI_VC_DECL(avc);
       struct uio *auio;
       struct AFS_UCRED *acred;
  {
--- 509,515 ----
  afs_readdir(OSI_VC_ARG(avc), auio, acred)
  #endif
  #endif
!      OSI_VC_DECL(avc);
       struct uio *auio;
       struct AFS_UCRED *acred;
  {
***************
*** 525,537 ****
  #if defined(AFS_SGI53_ENV)
      afs_int32 use64BitDirent, dirsiz;
  #endif /* defined(AFS_SGI53_ENV) */
!     OSI_VC_CONVERT(avc)
  #ifdef	AFS_HPUX_ENV
! 	/*
! 	 * XXX All the hacks for alloced sdirEntry and inlining of afs_readdir_move instead of calling
! 	 * it is necessary for hpux due to stack problems that seem to occur when coming thru the nfs
! 	 * translator side XXX
! 	 */
      struct min_direct *sdirEntry =
  	(struct min_direct *)osi_AllocSmallSpace(sizeof(struct min_direct));
      afs_int32 rlen;
--- 525,537 ----
  #if defined(AFS_SGI53_ENV)
      afs_int32 use64BitDirent, dirsiz;
  #endif /* defined(AFS_SGI53_ENV) */
!     OSI_VC_CONVERT(avc);
  #ifdef	AFS_HPUX_ENV
!     /*
!      * XXX All the hacks for alloced sdirEntry and inlining of afs_readdir_move instead of calling
!      * it is necessary for hpux due to stack problems that seem to occur when coming thru the nfs
!      * translator side XXX
!      */
      struct min_direct *sdirEntry =
  	(struct min_direct *)osi_AllocSmallSpace(sizeof(struct min_direct));
      afs_int32 rlen;
Index: openafs/src/afs/VNOPS/afs_vnop_remove.c
diff -c openafs/src/afs/VNOPS/afs_vnop_remove.c:1.31 openafs/src/afs/VNOPS/afs_vnop_remove.c:1.31.2.1
*** openafs/src/afs/VNOPS/afs_vnop_remove.c:1.31	Wed Jun 23 18:25:06 2004
--- openafs/src/afs/VNOPS/afs_vnop_remove.c	Wed Aug 25 03:09:35 2004
***************
*** 23,29 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_remove.c,v 1.31 2004/06/23 22:25:06 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 23,29 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_remove.c,v 1.31.2.1 2004/08/25 07:09:35 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 110,116 ****
      register struct conn *tc;
      struct AFSFetchStatus OutDirStatus;
      struct AFSVolSync tsync;
!     XSTATS_DECLS
      do {
  	tc = afs_Conn(&adp->fid, treqp, SHARED_LOCK);
  	if (tc) {
--- 110,116 ----
      register struct conn *tc;
      struct AFSFetchStatus OutDirStatus;
      struct AFSVolSync tsync;
!     XSTATS_DECLS;
      do {
  	tc = afs_Conn(&adp->fid, treqp, SHARED_LOCK);
  	if (tc) {
***************
*** 228,234 ****
      struct ucred *acred = ndp->ni_cred;
  #else				/* AFS_OSF_ENV */
  afs_remove(OSI_VC_ARG(adp), aname, acred)
! OSI_VC_DECL(adp);
       char *aname;
       struct AFS_UCRED *acred;
  {
--- 228,234 ----
      struct ucred *acred = ndp->ni_cred;
  #else				/* AFS_OSF_ENV */
  afs_remove(OSI_VC_ARG(adp), aname, acred)
!      OSI_VC_DECL(adp);
       char *aname;
       struct AFS_UCRED *acred;
  {
***************
*** 240,248 ****
      register struct vcache *tvc;
      afs_size_t offset, len;
      struct afs_fakestat_state fakestate;
!     OSI_VC_CONVERT(adp)
  
! 	AFS_STATCNT(afs_remove);
      afs_Trace2(afs_iclSetp, CM_TRACE_REMOVE, ICL_TYPE_POINTER, adp,
  	       ICL_TYPE_STRING, aname);
  
--- 240,248 ----
      register struct vcache *tvc;
      afs_size_t offset, len;
      struct afs_fakestat_state fakestate;
!     OSI_VC_CONVERT(adp);
  
!     AFS_STATCNT(afs_remove);
      afs_Trace2(afs_iclSetp, CM_TRACE_REMOVE, ICL_TYPE_POINTER, adp,
  	       ICL_TYPE_STRING, aname);
  
***************
*** 279,290 ****
  #endif
  	return code;
      }
- 
  #if 0
      if (adp->mvstat == 2) {
  	afs_PutFakeStat(&fakestate);
  #ifdef  AFS_OSF_ENV
!         afs_PutVCache(adp);
  	afs_PutVCache(tvc);
  #endif
  	return EISDIR;
--- 279,289 ----
  #endif
  	return code;
      }
  #if 0
      if (adp->mvstat == 2) {
  	afs_PutFakeStat(&fakestate);
  #ifdef  AFS_OSF_ENV
! 	afs_PutVCache(adp);
  	afs_PutVCache(tvc);
  #endif
  	return EISDIR;
***************
*** 402,414 ****
  	Ttvcr = VREFCOUNT(tvc);
  #ifdef	AFS_AIX_ENV
      if (tvc && (VREFCOUNT(tvc) > 2) && tvc->opens > 0
! 	&& !(tvc->states & CUnlinked)) 
  #else
  #ifdef AFS_DARWIN14_ENV
!     if (tvc && (VREFCOUNT(tvc) > 1 + DARWIN_REFBASE) && tvc->opens > 0 && !(tvc->states & CUnlinked)) 
  #else
      if (tvc && (VREFCOUNT(tvc) > 1) && tvc->opens > 0
! 	&& !(tvc->states & CUnlinked)) 
  #endif
  #endif
      {
--- 401,414 ----
  	Ttvcr = VREFCOUNT(tvc);
  #ifdef	AFS_AIX_ENV
      if (tvc && (VREFCOUNT(tvc) > 2) && tvc->opens > 0
! 	&& !(tvc->states & CUnlinked))
  #else
  #ifdef AFS_DARWIN14_ENV
!     if (tvc && (VREFCOUNT(tvc) > 1 + DARWIN_REFBASE) && tvc->opens > 0
! 	&& !(tvc->states & CUnlinked))
  #else
      if (tvc && (VREFCOUNT(tvc) > 1) && tvc->opens > 0
! 	&& !(tvc->states & CUnlinked))
  #endif
  #endif
      {
***************
*** 495,504 ****
  	    avc->states &= ~(CUnlinked | CUnlinkedDel);
  
  #ifdef AFS_DARWIN14_ENV
!            if (VREFCOUNT(avc) < 4) {
!                oldref = 4 - VREFCOUNT(avc);
!                VREFCOUNT_SET(avc, 4);
!            }
  #endif
  	    ReleaseWriteLock(&avc->lock);
  
--- 495,504 ----
  	    avc->states &= ~(CUnlinked | CUnlinkedDel);
  
  #ifdef AFS_DARWIN14_ENV
! 	    if (VREFCOUNT(avc) < 4) {
! 		oldref = 4 - VREFCOUNT(avc);
! 		VREFCOUNT_SET(avc, 4);
! 	    }
  #endif
  	    ReleaseWriteLock(&avc->lock);
  
***************
*** 529,535 ****
  	    VREFCOUNT_SET(avc, 0);
  #else
  	    if (oldref) {
! 	        int newref = VREFCOUNT(avc) - oldref;
  		VREFCOUNT_SET(avc, newref);
  	    }
  #endif
--- 529,535 ----
  	    VREFCOUNT_SET(avc, 0);
  #else
  	    if (oldref) {
! 		int newref = VREFCOUNT(avc) - oldref;
  		VREFCOUNT_SET(avc, newref);
  	    }
  #endif
Index: openafs/src/afs/VNOPS/afs_vnop_rename.c
diff -c openafs/src/afs/VNOPS/afs_vnop_rename.c:1.16 openafs/src/afs/VNOPS/afs_vnop_rename.c:1.16.2.1
*** openafs/src/afs/VNOPS/afs_vnop_rename.c:1.16	Fri Aug 29 18:00:04 2003
--- openafs/src/afs/VNOPS/afs_vnop_rename.c	Wed Aug 25 03:09:35 2004
***************
*** 18,24 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_rename.c,v 1.16 2003/08/29 22:00:04 rees Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 18,24 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_rename.c,v 1.16.2.1 2004/08/25 07:09:35 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 46,52 ****
      struct dcache *tdc1, *tdc2;
      struct AFSFetchStatus OutOldDirStatus, OutNewDirStatus;
      struct AFSVolSync tsync;
!     XSTATS_DECLS AFS_STATCNT(afs_rename);
      afs_Trace4(afs_iclSetp, CM_TRACE_RENAME, ICL_TYPE_POINTER, aodp,
  	       ICL_TYPE_STRING, aname1, ICL_TYPE_POINTER, andp,
  	       ICL_TYPE_STRING, aname2);
--- 46,53 ----
      struct dcache *tdc1, *tdc2;
      struct AFSFetchStatus OutOldDirStatus, OutNewDirStatus;
      struct AFSVolSync tsync;
!     XSTATS_DECLS;
!     AFS_STATCNT(afs_rename);
      afs_Trace4(afs_iclSetp, CM_TRACE_RENAME, ICL_TYPE_POINTER, aodp,
  	       ICL_TYPE_STRING, aname1, ICL_TYPE_POINTER, andp,
  	       ICL_TYPE_STRING, aname2);
***************
*** 370,380 ****
  #else /* AFS_OSF_ENV */
  #if defined(AFS_SGI_ENV)
  afs_rename(OSI_VC_ARG(aodp), aname1, andp, aname2, npnp, acred)
!      struct pathname *npnp;
  #else
  afs_rename(OSI_VC_ARG(aodp), aname1, andp, aname2, acred)
  #endif
!     OSI_VC_DECL(aodp);
       struct vcache *andp;
       char *aname1, *aname2;
       struct AFS_UCRED *acred;
--- 371,381 ----
  #else /* AFS_OSF_ENV */
  #if defined(AFS_SGI_ENV)
  afs_rename(OSI_VC_ARG(aodp), aname1, andp, aname2, npnp, acred)
!     struct pathname *npnp;
  #else
  afs_rename(OSI_VC_ARG(aodp), aname1, andp, aname2, acred)
  #endif
!      OSI_VC_DECL(aodp);
       struct vcache *andp;
       char *aname1, *aname2;
       struct AFS_UCRED *acred;
***************
*** 384,392 ****
      struct afs_fakestat_state ofakestate;
      struct afs_fakestat_state nfakestate;
      struct vrequest treq;
!     OSI_VC_CONVERT(aodp)
  
! 	code = afs_InitReq(&treq, acred);
      if (code)
  	return code;
      afs_InitFakeStat(&ofakestate);
--- 385,393 ----
      struct afs_fakestat_state ofakestate;
      struct afs_fakestat_state nfakestate;
      struct vrequest treq;
!     OSI_VC_CONVERT(aodp);
  
!     code = afs_InitReq(&treq, acred);
      if (code)
  	return code;
      afs_InitFakeStat(&ofakestate);
Index: openafs/src/afs/VNOPS/afs_vnop_symlink.c
diff -c openafs/src/afs/VNOPS/afs_vnop_symlink.c:1.19 openafs/src/afs/VNOPS/afs_vnop_symlink.c:1.19.2.1
*** openafs/src/afs/VNOPS/afs_vnop_symlink.c:1.19	Tue Aug 26 11:09:28 2003
--- openafs/src/afs/VNOPS/afs_vnop_symlink.c	Wed Aug 25 03:09:35 2004
***************
*** 22,28 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_symlink.c,v 1.19 2003/08/26 15:09:28 rees Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 22,28 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_symlink.c,v 1.19.2.1 2004/08/25 07:09:35 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 41,48 ****
  
  
  /* don't set CDirty in here because RPC is called synchronously */
! int
! afs_symlink
  #ifdef	AFS_OSF_ENV
    (ndp, attrs, atargetName)
       struct nameidata *ndp;
--- 41,47 ----
  
  
  /* don't set CDirty in here because RPC is called synchronously */
! int afs_symlink
  #ifdef	AFS_OSF_ENV
    (ndp, attrs, atargetName)
       struct nameidata *ndp;
***************
*** 77,83 ****
      struct AFSVolSync tsync;
      struct volume *volp = 0;
      struct afs_fakestat_state fakestate;
!     XSTATS_DECLS OSI_VC_CONVERT(adp)
  
      AFS_STATCNT(afs_symlink);
      afs_Trace2(afs_iclSetp, CM_TRACE_SYMLINK, ICL_TYPE_POINTER, adp,
--- 76,83 ----
      struct AFSVolSync tsync;
      struct volume *volp = 0;
      struct afs_fakestat_state fakestate;
!     XSTATS_DECLS;
!     OSI_VC_CONVERT(adp);
  
      AFS_STATCNT(afs_symlink);
      afs_Trace2(afs_iclSetp, CM_TRACE_SYMLINK, ICL_TYPE_POINTER, adp,
***************
*** 355,361 ****
      struct vrequest treq;
      register char *tp;
      struct afs_fakestat_state fakestat;
!     OSI_VC_CONVERT(avc)
  
      AFS_STATCNT(afs_readlink);
      afs_Trace1(afs_iclSetp, CM_TRACE_READLINK, ICL_TYPE_POINTER, avc);
--- 355,361 ----
      struct vrequest treq;
      register char *tp;
      struct afs_fakestat_state fakestat;
!     OSI_VC_CONVERT(avc);
  
      AFS_STATCNT(afs_readlink);
      afs_Trace1(afs_iclSetp, CM_TRACE_READLINK, ICL_TYPE_POINTER, avc);
Index: openafs/src/afs/VNOPS/afs_vnop_write.c
diff -c openafs/src/afs/VNOPS/afs_vnop_write.c:1.36 openafs/src/afs/VNOPS/afs_vnop_write.c:1.36.2.1
*** openafs/src/afs/VNOPS/afs_vnop_write.c:1.36	Thu Jun 24 13:38:25 2004
--- openafs/src/afs/VNOPS/afs_vnop_write.c	Wed Aug 25 03:09:35 2004
***************
*** 21,27 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_write.c,v 1.36 2004/06/24 17:38:25 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 21,27 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_write.c,v 1.36.2.1 2004/08/25 07:09:35 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 824,830 ****
  #else
  afs_close(OSI_VC_ARG(avc), aflags, acred)
  #endif
! OSI_VC_DECL(avc);
       afs_int32 aflags;
       struct AFS_UCRED *acred;
  {
--- 824,830 ----
  #else
  afs_close(OSI_VC_ARG(avc), aflags, acred)
  #endif
!      OSI_VC_DECL(avc);
       afs_int32 aflags;
       struct AFS_UCRED *acred;
  {
***************
*** 835,843 ****
      struct flid flid;
  #endif
      struct afs_fakestat_state fakestat;
!     OSI_VC_CONVERT(avc)
  
! 	AFS_STATCNT(afs_close);
      afs_Trace2(afs_iclSetp, CM_TRACE_CLOSE, ICL_TYPE_POINTER, avc,
  	       ICL_TYPE_INT32, aflags);
      code = afs_InitReq(&treq, acred);
--- 835,843 ----
      struct flid flid;
  #endif
      struct afs_fakestat_state fakestat;
!     OSI_VC_CONVERT(avc);
  
!     AFS_STATCNT(afs_close);
      afs_Trace2(afs_iclSetp, CM_TRACE_CLOSE, ICL_TYPE_POINTER, avc,
  	       ICL_TYPE_INT32, aflags);
      code = afs_InitReq(&treq, acred);
***************
*** 1018,1026 ****
  {
      register afs_int32 code;
      struct vrequest treq;
!     OSI_VC_CONVERT(avc)
  
! 	if (avc->vc_error)
  	return avc->vc_error;
  
  #if defined(AFS_SUN5_ENV)
--- 1018,1026 ----
  {
      register afs_int32 code;
      struct vrequest treq;
!     OSI_VC_CONVERT(avc);
  
!     if (avc->vc_error)
  	return avc->vc_error;
  
  #if defined(AFS_SUN5_ENV)
Index: openafs/src/auth/authcon.c
diff -c openafs/src/auth/authcon.c:1.13 openafs/src/auth/authcon.c:1.13.2.1
*** openafs/src/auth/authcon.c:1.13	Tue Jul 15 19:14:41 2003
--- openafs/src/auth/authcon.c	Wed Aug 25 03:09:36 2004
***************
*** 15,21 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/auth/authcon.c,v 1.13 2003/07/15 23:14:41 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "afs/sysincludes.h"
--- 15,21 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/auth/authcon.c,v 1.13.2.1 2004/08/25 07:09:36 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "afs/sysincludes.h"
***************
*** 72,85 ****
  {
      register struct rx_securityClass *tclass;
  
!     LOCK_GLOBAL_MUTEX tclass = (struct rx_securityClass *)
  	rxkad_NewServerSecurityObject(0, adir, afsconf_GetKey, NULL);
      if (tclass) {
  	*astr = tclass;
  	*aindex = 2;		/* kerberos security index */
! 	UNLOCK_GLOBAL_MUTEX return 0;
      } else {
! 	UNLOCK_GLOBAL_MUTEX return 2;
      }
  }
  #endif /* !defined(UKERNEL) */
--- 72,88 ----
  {
      register struct rx_securityClass *tclass;
  
!     LOCK_GLOBAL_MUTEX;
!     tclass = (struct rx_securityClass *)
  	rxkad_NewServerSecurityObject(0, adir, afsconf_GetKey, NULL);
      if (tclass) {
  	*astr = tclass;
  	*aindex = 2;		/* kerberos security index */
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 0;
      } else {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 2;
      }
  }
  #endif /* !defined(UKERNEL) */
***************
*** 145,152 ****
  {
      afs_int32 rc;
  
!     LOCK_GLOBAL_MUTEX rc = GenericAuth(adir, astr, aindex, rxkad_clear);
!     UNLOCK_GLOBAL_MUTEX return rc;
  }
  
  /* build a fake ticket for 'afs' using keys from adir, returning an
--- 148,157 ----
  {
      afs_int32 rc;
  
!     LOCK_GLOBAL_MUTEX;
!     rc = GenericAuth(adir, astr, aindex, rxkad_clear);
!     UNLOCK_GLOBAL_MUTEX;
!     return rc;
  }
  
  /* build a fake ticket for 'afs' using keys from adir, returning an
***************
*** 161,166 ****
  {
      afs_int32 rc;
  
!     LOCK_GLOBAL_MUTEX rc = GenericAuth(adir, astr, aindex, rxkad_crypt);
!     UNLOCK_GLOBAL_MUTEX return rc;
  }
--- 166,173 ----
  {
      afs_int32 rc;
  
!     LOCK_GLOBAL_MUTEX;
!     rc = GenericAuth(adir, astr, aindex, rxkad_crypt);
!     UNLOCK_GLOBAL_MUTEX;
!     return rc;
  }
Index: openafs/src/auth/cellconfig.c
diff -c openafs/src/auth/cellconfig.c:1.40 openafs/src/auth/cellconfig.c:1.40.2.1
*** openafs/src/auth/cellconfig.c:1.40	Thu Jul 22 05:42:40 2004
--- openafs/src/auth/cellconfig.c	Wed Aug 25 03:09:36 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/auth/cellconfig.c,v 1.40 2004/07/22 09:42:40 jaltman Exp $");
  
  #include <afs/stds.h>
  #include <afs/pthread_glock.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/auth/cellconfig.c,v 1.40.2.1 2004/08/25 07:09:36 shadow Exp $");
  
  #include <afs/stds.h>
  #include <afs/pthread_glock.h>
***************
*** 211,230 ****
  #ifdef AFS_NT40_ENV
      /* NT client CellServDB has different file name than NT server or Unix */
      if (IsClientConfigDirectory(adir->name)) {
!         if ( !afssw_GetClientCellServDBDir(&p) ) {
!             strcompose(tbuffer, sizeof(tbuffer), p, "/",
!                         AFSDIR_CELLSERVDB_FILE_NTCLIENT, NULL);
!             free(p);
!         } else {
!             int len;
! 			strncpy(tbuffer, adir->name, sizeof(tbuffer));
! 			len = strlen(tbuffer);
!             if ( tbuffer[len-1] != '\\' && tbuffer[len-1] != '/' ) {
!                 strncat(tbuffer, "\\", sizeof(tbuffer));
!             }
!             strncat(tbuffer, AFSDIR_CELLSERVDB_FILE_NTCLIENT, sizeof(tbuffer));
!             tbuffer[sizeof(tbuffer)-1] = '\0';
!         }
      } else {
  	strcompose(tbuffer, 256, adir->name, "/", AFSDIR_CELLSERVDB_FILE,
  		   NULL);
--- 211,231 ----
  #ifdef AFS_NT40_ENV
      /* NT client CellServDB has different file name than NT server or Unix */
      if (IsClientConfigDirectory(adir->name)) {
! 	if (!afssw_GetClientCellServDBDir(&p)) {
! 	    strcompose(tbuffer, sizeof(tbuffer), p, "/",
! 		       AFSDIR_CELLSERVDB_FILE_NTCLIENT, NULL);
! 	    free(p);
! 	} else {
! 	    int len;
! 	    strncpy(tbuffer, adir->name, sizeof(tbuffer));
! 	    len = strlen(tbuffer);
! 	    if (tbuffer[len - 1] != '\\' && tbuffer[len - 1] != '/') {
! 		strncat(tbuffer, "\\", sizeof(tbuffer));
! 	    }
! 	    strncat(tbuffer, AFSDIR_CELLSERVDB_FILE_NTCLIENT,
! 		    sizeof(tbuffer));
! 	    tbuffer[sizeof(tbuffer) - 1] = '\0';
! 	}
      } else {
  	strcompose(tbuffer, 256, adir->name, "/", AFSDIR_CELLSERVDB_FILE,
  		   NULL);
***************
*** 260,277 ****
      /* NT client CellServDB has different file name than NT server or Unix */
  
      if (IsClientConfigDirectory(adir->name)) {
!         if ( !afssw_GetClientCellServDBDir(&p) ) {
!             strcompose(tbuffer, sizeof(tbuffer), p, "/",
!                         AFSDIR_CELLSERVDB_FILE_NTCLIENT, NULL);
!             free(p);
!         } else {
!             int len = strlen(tbuffer);
!             if ( tbuffer[len-1] != '\\' && tbuffer[len-1] != '/' ) {
!                 strncat(tbuffer, "\\", sizeof(tbuffer));
!             }
!             strncat(tbuffer, AFSDIR_CELLSERVDB_FILE_NTCLIENT, sizeof(tbuffer));
!             tbuffer[sizeof(tbuffer)-1] = '\0';
!         }
      } else {
  	strcompose(tbuffer, 256, adir->name, "/", AFSDIR_CELLSERVDB_FILE,
  		   NULL);
--- 261,279 ----
      /* NT client CellServDB has different file name than NT server or Unix */
  
      if (IsClientConfigDirectory(adir->name)) {
! 	if (!afssw_GetClientCellServDBDir(&p)) {
! 	    strcompose(tbuffer, sizeof(tbuffer), p, "/",
! 		       AFSDIR_CELLSERVDB_FILE_NTCLIENT, NULL);
! 	    free(p);
! 	} else {
! 	    int len = strlen(tbuffer);
! 	    if (tbuffer[len - 1] != '\\' && tbuffer[len - 1] != '/') {
! 		strncat(tbuffer, "\\", sizeof(tbuffer));
! 	    }
! 	    strncat(tbuffer, AFSDIR_CELLSERVDB_FILE_NTCLIENT,
! 		    sizeof(tbuffer));
! 	    tbuffer[sizeof(tbuffer) - 1] = '\0';
! 	}
      } else {
  	strcompose(tbuffer, 256, adir->name, "/", AFSDIR_CELLSERVDB_FILE,
  		   NULL);
***************
*** 293,301 ****
      register struct afsconf_dir *tdir;
      register afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX
! 	/* zero structure and fill in name; rest is done by internal routine */
! 	tdir = (struct afsconf_dir *)malloc(sizeof(struct afsconf_dir));
      memset(tdir, 0, sizeof(struct afsconf_dir));
      tdir->name = (char *)malloc(strlen(adir) + 1);
      strcpy(tdir->name, adir);
--- 295,303 ----
      register struct afsconf_dir *tdir;
      register afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX;
!     /* zero structure and fill in name; rest is done by internal routine */
!     tdir = (struct afsconf_dir *)malloc(sizeof(struct afsconf_dir));
      memset(tdir, 0, sizeof(struct afsconf_dir));
      tdir->name = (char *)malloc(strlen(adir) + 1);
      strcpy(tdir->name, adir);
***************
*** 317,323 ****
  		fp = fopen("/.AFSCONF", "r");
  		if (fp == 0) {
  		    free(tdir);
! 		    UNLOCK_GLOBAL_MUTEX return (struct afsconf_dir *)0;
  		}
  		fgets(afs_confdir, 128, fp);
  		fclose(fp);
--- 319,326 ----
  		fp = fopen("/.AFSCONF", "r");
  		if (fp == 0) {
  		    free(tdir);
! 		    UNLOCK_GLOBAL_MUTEX;
! 		    return (struct afsconf_dir *)0;
  		}
  		fgets(afs_confdir, 128, fp);
  		fclose(fp);
***************
*** 331,337 ****
  		    fp = fopen("/.AFSCONF", "r");
  		    if (fp == 0) {
  			free(tdir);
! 			UNLOCK_GLOBAL_MUTEX return (struct afsconf_dir *)0;
  		    }
  		}
  		fgets(afs_confdir, 128, fp);
--- 334,341 ----
  		    fp = fopen("/.AFSCONF", "r");
  		    if (fp == 0) {
  			free(tdir);
! 			UNLOCK_GLOBAL_MUTEX;
! 			return (struct afsconf_dir *)0;
  		    }
  		}
  		fgets(afs_confdir, 128, fp);
***************
*** 340,346 ****
  	    len = strlen(afs_confdir);
  	    if (len == 0) {
  		free(tdir);
! 		UNLOCK_GLOBAL_MUTEX return (struct afsconf_dir *)0;
  	    }
  	    if (afs_confdir[len - 1] == '\n') {
  		afs_confdir[len - 1] = 0;
--- 344,351 ----
  	    len = strlen(afs_confdir);
  	    if (len == 0) {
  		free(tdir);
! 		UNLOCK_GLOBAL_MUTEX;
! 		return (struct afsconf_dir *)0;
  	    }
  	    if (afs_confdir[len - 1] == '\n') {
  		afs_confdir[len - 1] = 0;
***************
*** 353,362 ****
  	if (code) {
  	    free(tdir->name);
  	    free(tdir);
! 	    UNLOCK_GLOBAL_MUTEX return (struct afsconf_dir *)0;
  	}
      }
!     UNLOCK_GLOBAL_MUTEX return tdir;
  }
  
  
--- 358,369 ----
  	if (code) {
  	    free(tdir->name);
  	    free(tdir);
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return (struct afsconf_dir *)0;
  	}
      }
!     UNLOCK_GLOBAL_MUTEX;
!     return tdir;
  }
  
  
***************
*** 434,454 ****
       */
      if (IsClientConfigDirectory(adir->name)) {
  	/* NT client config dir */
!         char * p;
!         if ( !afssw_GetClientCellServDBDir(&p) ) {
!             strcompose(tbuffer, sizeof(tbuffer), p, "/",
!                         AFSDIR_CELLSERVDB_FILE_NTCLIENT, NULL);
!             free(p);
!         } else {
!             int len;
! 			strncpy(tbuffer, adir->name, sizeof(tbuffer));
! 			len = strlen(tbuffer);
!             if ( tbuffer[len-1] != '\\' && tbuffer[len-1] != '/' ) {
!                 strncat(tbuffer, "\\", sizeof(tbuffer));
!             }
!             strncat(tbuffer, AFSDIR_CELLSERVDB_FILE_NTCLIENT, sizeof(tbuffer));
!             tbuffer[sizeof(tbuffer)-1] = '\0';
!         }
      } else {
  	/* NT server config dir */
  	strcompose(tbuffer, 256, adir->name, "/", AFSDIR_CELLSERVDB_FILE,
--- 441,462 ----
       */
      if (IsClientConfigDirectory(adir->name)) {
  	/* NT client config dir */
! 	char *p;
! 	if (!afssw_GetClientCellServDBDir(&p)) {
! 	    strcompose(tbuffer, sizeof(tbuffer), p, "/",
! 		       AFSDIR_CELLSERVDB_FILE_NTCLIENT, NULL);
! 	    free(p);
! 	} else {
! 	    int len;
! 	    strncpy(tbuffer, adir->name, sizeof(tbuffer));
! 	    len = strlen(tbuffer);
! 	    if (tbuffer[len - 1] != '\\' && tbuffer[len - 1] != '/') {
! 		strncat(tbuffer, "\\", sizeof(tbuffer));
! 	    }
! 	    strncat(tbuffer, AFSDIR_CELLSERVDB_FILE_NTCLIENT,
! 		    sizeof(tbuffer));
! 	    tbuffer[sizeof(tbuffer) - 1] = '\0';
! 	}
      } else {
  	/* NT server config dir */
  	strcompose(tbuffer, 256, adir->name, "/", AFSDIR_CELLSERVDB_FILE,
***************
*** 663,675 ****
  {
      register struct afsconf_entry *tde;
      register afs_int32 code;
!     LOCK_GLOBAL_MUTEX for (tde = adir->entries; tde; tde = tde->next) {
  	code = (*aproc) (&tde->cellInfo, arock, adir);
  	if (code) {
! 	    UNLOCK_GLOBAL_MUTEX return code;
  	}
      }
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  /* call aproc(entry, arock, adir) for all cell aliases.
--- 671,686 ----
  {
      register struct afsconf_entry *tde;
      register afs_int32 code;
!     LOCK_GLOBAL_MUTEX;
!     for (tde = adir->entries; tde; tde = tde->next) {
  	code = (*aproc) (&tde->cellInfo, arock, adir);
  	if (code) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return code;
  	}
      }
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  /* call aproc(entry, arock, adir) for all cell aliases.
***************
*** 683,695 ****
  {
      register struct afsconf_aliasentry *tde;
      register afs_int32 code;
!     LOCK_GLOBAL_MUTEX for (tde = adir->alias_entries; tde; tde = tde->next) {
  	code = (*aproc) (&tde->aliasInfo, arock, adir);
  	if (code) {
! 	    UNLOCK_GLOBAL_MUTEX return code;
  	}
      }
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  afs_int32 afsconf_SawCell = 0;
--- 694,709 ----
  {
      register struct afsconf_aliasentry *tde;
      register afs_int32 code;
!     LOCK_GLOBAL_MUTEX;
!     for (tde = adir->alias_entries; tde; tde = tde->next) {
  	code = (*aproc) (&tde->aliasInfo, arock, adir);
  	if (code) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return code;
  	}
      }
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  afs_int32 afsconf_SawCell = 0;
***************
*** 735,744 ****
       * replaced with a more fine-grained lock just for the resolver
       * operations.
       */
!     LOCK_GLOBAL_MUTEX len =
! 	res_search(acellName, C_IN, T_AFSDB, answer, sizeof(answer));
!     UNLOCK_GLOBAL_MUTEX if (len < 0)
! 	  return AFSCONF_NOTFOUND;
  
      p = answer + sizeof(HEADER);	/* Skip header */
      code = dn_expand(answer, answer + len, p, host, sizeof(host));
--- 749,759 ----
       * replaced with a more fine-grained lock just for the resolver
       * operations.
       */
!     LOCK_GLOBAL_MUTEX;
!     len = res_search(acellName, C_IN, T_AFSDB, answer, sizeof(answer));
!     UNLOCK_GLOBAL_MUTEX;
!     if (len < 0)
! 	return AFSCONF_NOTFOUND;
  
      p = answer + sizeof(HEADER);	/* Skip header */
      code = dn_expand(answer, answer + len, p, host, sizeof(host));
***************
*** 830,843 ****
      int tservice;
      struct afsconf_entry DNSce;
      afs_int32 cellHostAddrs[AFSMAXCELLHOSTS];
! 	char      cellHostNames[AFSMAXCELLHOSTS][MAXHOSTCHARS];
      int numServers;
      int rc;
      int ttl;
  
      DNSce.cellInfo.numServers = 0;
      DNSce.next = NULL;
!     rc = getAFSServer(acellName, cellHostAddrs, cellHostNames, &numServers, &ttl);
      /* ignore the ttl here since this code is only called by transitory programs
       * like klog, etc. */
      if (rc < 0)
--- 845,859 ----
      int tservice;
      struct afsconf_entry DNSce;
      afs_int32 cellHostAddrs[AFSMAXCELLHOSTS];
!     char cellHostNames[AFSMAXCELLHOSTS][MAXHOSTCHARS];
      int numServers;
      int rc;
      int ttl;
  
      DNSce.cellInfo.numServers = 0;
      DNSce.next = NULL;
!     rc = getAFSServer(acellName, cellHostAddrs, cellHostNames, &numServers,
! 		      &ttl);
      /* ignore the ttl here since this code is only called by transitory programs
       * like klog, etc. */
      if (rc < 0)
***************
*** 857,864 ****
      acellInfo->numServers = numServers;
      strcpy(acellInfo->name, acellName);
      if (aservice) {
! 	LOCK_GLOBAL_MUTEX tservice = afsconf_FindService(aservice);
! 	UNLOCK_GLOBAL_MUTEX if (tservice < 0) {
  	    return AFSCONF_NOTFOUND;	/* service not found */
  	}
  	for (i = 0; i < acellInfo->numServers; i++) {
--- 873,882 ----
      acellInfo->numServers = numServers;
      strcpy(acellInfo->name, acellName);
      if (aservice) {
! 	LOCK_GLOBAL_MUTEX;
! 	tservice = afsconf_FindService(aservice);
! 	UNLOCK_GLOBAL_MUTEX;
! 	if (tservice < 0) {
  	    return AFSCONF_NOTFOUND;	/* service not found */
  	}
  	for (i = 0; i < acellInfo->numServers; i++) {
***************
*** 886,893 ****
      int ambig;
      char tbuffer[64];
  
!     LOCK_GLOBAL_MUTEX if (adir)
! 	  afsconf_Check(adir);
      if (acellName) {
  	tcell = acellName;
  	cnLen = strlen(tcell) + 1;
--- 904,912 ----
      int ambig;
      char tbuffer[64];
  
!     LOCK_GLOBAL_MUTEX;
!     if (adir)
! 	afsconf_Check(adir);
      if (acellName) {
  	tcell = acellName;
  	cnLen = strlen(tcell) + 1;
***************
*** 897,903 ****
      } else {
  	i = afsconf_GetLocalCell(adir, tbuffer, sizeof(tbuffer));
  	if (i) {
! 	    UNLOCK_GLOBAL_MUTEX return i;
  	}
  	tcell = tbuffer;
      }
--- 916,923 ----
      } else {
  	i = afsconf_GetLocalCell(adir, tbuffer, sizeof(tbuffer));
  	if (i) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return i;
  	}
  	tcell = tbuffer;
      }
***************
*** 905,911 ****
      bestce = (struct afsconf_entry *)0;
      ambig = 0;
      if (!adir) {
! 	UNLOCK_GLOBAL_MUTEX return 0;
      }
  
      /* Look through the list of aliases */
--- 925,932 ----
      bestce = (struct afsconf_entry *)0;
      ambig = 0;
      if (!adir) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 0;
      }
  
      /* Look through the list of aliases */
***************
*** 936,955 ****
  	if (aservice) {
  	    tservice = afsconf_FindService(aservice);
  	    if (tservice < 0) {
! 		UNLOCK_GLOBAL_MUTEX return AFSCONF_NOTFOUND;	/* service not found */
  	    }
  	    for (i = 0; i < acellInfo->numServers; i++) {
  		acellInfo->hostAddr[i].sin_port = tservice;
  	    }
  	}
  	acellInfo->timeout = 0;
! 	UNLOCK_GLOBAL_MUTEX return 0;
      } else {
! 	UNLOCK_GLOBAL_MUTEX
  #ifdef AFS_AFSDB_ENV
! 	    return afsconf_GetAfsdbInfo(tcell, aservice, acellInfo);
  #else
! 	    return AFSCONF_NOTFOUND;
  #endif /* AFS_AFSDB_ENV */
      }
  }
--- 957,978 ----
  	if (aservice) {
  	    tservice = afsconf_FindService(aservice);
  	    if (tservice < 0) {
! 		UNLOCK_GLOBAL_MUTEX;
! 		return AFSCONF_NOTFOUND;	/* service not found */
  	    }
  	    for (i = 0; i < acellInfo->numServers; i++) {
  		acellInfo->hostAddr[i].sin_port = tservice;
  	    }
  	}
  	acellInfo->timeout = 0;
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 0;
      } else {
! 	UNLOCK_GLOBAL_MUTEX;
  #ifdef AFS_AFSDB_ENV
! 	return afsconf_GetAfsdbInfo(tcell, aservice, acellInfo);
  #else
! 	return AFSCONF_NOTFOUND;
  #endif /* AFS_AFSDB_ENV */
      }
  }
***************
*** 962,975 ****
      char *afscell_path;
      afs_int32 code = 0;
  
!     LOCK_GLOBAL_MUTEX
! 	/*
! 	 * If a cell switch was specified in a command, then it should override the 
! 	 * AFSCELL variable.  If a cell was specified, then the afsconf_SawCell flag
! 	 * is set and the cell name in the adir structure is used.
! 	 * Read the AFSCELL var each time: in case it changes (unsetenv AFSCELL).
! 	 */
! 	if (!afsconf_SawCell && (afscell_path = getenv("AFSCELL"))) {
  	if (!afsconf_showcell) {
  	    fprintf(stderr, "Note: Operation is performed on cell %s\n",
  		    afscell_path);
--- 985,998 ----
      char *afscell_path;
      afs_int32 code = 0;
  
!     LOCK_GLOBAL_MUTEX;
!     /*
!      * If a cell switch was specified in a command, then it should override the 
!      * AFSCELL variable.  If a cell was specified, then the afsconf_SawCell flag
!      * is set and the cell name in the adir structure is used.
!      * Read the AFSCELL var each time: in case it changes (unsetenv AFSCELL).
!      */
!     if (!afsconf_SawCell && (afscell_path = getenv("AFSCELL"))) {
  	if (!afsconf_showcell) {
  	    fprintf(stderr, "Note: Operation is performed on cell %s\n",
  		    afscell_path);
***************
*** 984,1000 ****
  	    code = AFSCONF_UNKNOWN;
      }
  
!     UNLOCK_GLOBAL_MUTEX return (code);
  }
  
  int
  afsconf_Close(struct afsconf_dir *adir)
  {
!     LOCK_GLOBAL_MUTEX afsconf_CloseInternal(adir);
      if (adir->name)
  	free(adir->name);
      free(adir);
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  static int
--- 1007,1026 ----
  	    code = AFSCONF_UNKNOWN;
      }
  
!     UNLOCK_GLOBAL_MUTEX;
!     return (code);
  }
  
  int
  afsconf_Close(struct afsconf_dir *adir)
  {
!     LOCK_GLOBAL_MUTEX;
!     afsconf_CloseInternal(adir);
      if (adir->name)
  	free(adir->name);
      free(adir);
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  static int
***************
*** 1060,1068 ****
      }
  #endif /* AFS_NT40_ENV */
  
!     LOCK_GLOBAL_MUTEX
! 	/* compute the key name and other setup */
! 	strcompose(tbuffer, 256, adir->name, "/", AFSDIR_KEY_FILE, NULL);
      tstr = (struct afsconf_keys *)malloc(sizeof(struct afsconf_keys));
      adir->keystr = tstr;
  
--- 1086,1094 ----
      }
  #endif /* AFS_NT40_ENV */
  
!     LOCK_GLOBAL_MUTEX;
!     /* compute the key name and other setup */
!     strcompose(tbuffer, 256, adir->name, "/", AFSDIR_KEY_FILE, NULL);
      tstr = (struct afsconf_keys *)malloc(sizeof(struct afsconf_keys));
      adir->keystr = tstr;
  
***************
*** 1070,1082 ****
      fd = open(tbuffer, O_RDONLY);
      if (fd < 0) {
  	tstr->nkeys = 0;
! 	UNLOCK_GLOBAL_MUTEX return 0;
      }
      code = read(fd, tstr, sizeof(struct afsconf_keys));
      close(fd);
      if (code < sizeof(afs_int32)) {
  	tstr->nkeys = 0;
! 	UNLOCK_GLOBAL_MUTEX return 0;
      }
  
      /* convert key structure to host order */
--- 1096,1110 ----
      fd = open(tbuffer, O_RDONLY);
      if (fd < 0) {
  	tstr->nkeys = 0;
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 0;
      }
      code = read(fd, tstr, sizeof(struct afsconf_keys));
      close(fd);
      if (code < sizeof(afs_int32)) {
  	tstr->nkeys = 0;
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 0;
      }
  
      /* convert key structure to host order */
***************
*** 1084,1090 ****
      for (fd = 0; fd < tstr->nkeys; fd++)
  	tstr->key[fd].kvno = ntohl(tstr->key[fd].kvno);
  
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  /* get keys structure */
--- 1112,1119 ----
      for (fd = 0; fd < tstr->nkeys; fd++)
  	tstr->key[fd].kvno = ntohl(tstr->key[fd].kvno);
  
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  /* get keys structure */
***************
*** 1093,1104 ****
  {
      register afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX code = afsconf_Check(adir);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return AFSCONF_FAILURE;
      }
      memcpy(astr, adir->keystr, sizeof(struct afsconf_keys));
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  /* get latest key */
--- 1122,1136 ----
  {
      register afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX;
!     code = afsconf_Check(adir);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return AFSCONF_FAILURE;
      }
      memcpy(astr, adir->keystr, sizeof(struct afsconf_keys));
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  /* get latest key */
***************
*** 1112,1120 ****
      struct afsconf_key *bestk;
      register afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX code = afsconf_Check(adir);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return AFSCONF_FAILURE;
      }
      maxa = adir->keystr->nkeys;
  
--- 1144,1154 ----
      struct afsconf_key *bestk;
      register afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX;
!     code = afsconf_Check(adir);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return AFSCONF_FAILURE;
      }
      maxa = adir->keystr->nkeys;
  
***************
*** 1133,1141 ****
  	    memcpy(akey, bestk->key, 8);	/* copy out latest key */
  	if (avno)
  	    *avno = bestk->kvno;	/* and kvno to caller */
! 	UNLOCK_GLOBAL_MUTEX return 0;
      }
!     UNLOCK_GLOBAL_MUTEX return AFSCONF_NOTFOUND;	/* didn't find any keys */
  }
  
  /* get a particular key */
--- 1167,1177 ----
  	    memcpy(akey, bestk->key, 8);	/* copy out latest key */
  	if (avno)
  	    *avno = bestk->kvno;	/* and kvno to caller */
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 0;
      }
!     UNLOCK_GLOBAL_MUTEX;
!     return AFSCONF_NOTFOUND;	/* didn't find any keys */
  }
  
  /* get a particular key */
***************
*** 1146,1165 ****
      register struct afsconf_key *tk;
      register afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX code = afsconf_Check(adir);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return AFSCONF_FAILURE;
      }
      maxa = adir->keystr->nkeys;
  
      for (tk = adir->keystr->key, i = 0; i < maxa; i++, tk++) {
  	if (tk->kvno == avno) {
  	    memcpy(akey, tk->key, 8);
! 	    UNLOCK_GLOBAL_MUTEX return 0;
  	}
      }
  
!     UNLOCK_GLOBAL_MUTEX return AFSCONF_NOTFOUND;
  }
  
  /* save the key structure in the appropriate file */
--- 1182,1205 ----
      register struct afsconf_key *tk;
      register afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX;
!     code = afsconf_Check(adir);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return AFSCONF_FAILURE;
      }
      maxa = adir->keystr->nkeys;
  
      for (tk = adir->keystr->key, i = 0; i < maxa; i++, tk++) {
  	if (tk->kvno == avno) {
  	    memcpy(akey, tk->key, 8);
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return 0;
  	}
      }
  
!     UNLOCK_GLOBAL_MUTEX;
!     return AFSCONF_NOTFOUND;
  }
  
  /* save the key structure in the appropriate file */
***************
*** 1202,1219 ****
      register afs_int32 i;
      int foundSlot;
  
!     LOCK_GLOBAL_MUTEX tk = adir->keystr;
  
      if (akvno != 999) {
  	if (akvno < 0 || akvno > 255) {
! 	    UNLOCK_GLOBAL_MUTEX return ERANGE;
  	}
      }
      foundSlot = 0;
      for (i = 0, tkey = tk->key; i < tk->nkeys; i++, tkey++) {
  	if (tkey->kvno == akvno) {
  	    if (!overwrite) {
! 		UNLOCK_GLOBAL_MUTEX return AFSCONF_KEYINUSE;
  	    }
  	    foundSlot = 1;
  	    break;
--- 1242,1262 ----
      register afs_int32 i;
      int foundSlot;
  
!     LOCK_GLOBAL_MUTEX;
!     tk = adir->keystr;
  
      if (akvno != 999) {
  	if (akvno < 0 || akvno > 255) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return ERANGE;
  	}
      }
      foundSlot = 0;
      for (i = 0, tkey = tk->key; i < tk->nkeys; i++, tkey++) {
  	if (tkey->kvno == akvno) {
  	    if (!overwrite) {
! 		UNLOCK_GLOBAL_MUTEX;
! 		return AFSCONF_KEYINUSE;
  	    }
  	    foundSlot = 1;
  	    break;
***************
*** 1221,1227 ****
      }
      if (!foundSlot) {
  	if (tk->nkeys >= AFSCONF_MAXKEYS) {
! 	    UNLOCK_GLOBAL_MUTEX return AFSCONF_FULL;
  	}
  	tkey = &tk->key[tk->nkeys++];
      }
--- 1264,1271 ----
      }
      if (!foundSlot) {
  	if (tk->nkeys >= AFSCONF_MAXKEYS) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return AFSCONF_FULL;
  	}
  	tkey = &tk->key[tk->nkeys++];
      }
***************
*** 1229,1235 ****
      memcpy(tkey->key, akey, 8);
      i = SaveKeys(adir);
      afsconf_Touch(adir);
!     UNLOCK_GLOBAL_MUTEX return i;
  }
  
  /* this proc works by sliding the other guys down, rather than using a funny
--- 1273,1280 ----
      memcpy(tkey->key, akey, 8);
      i = SaveKeys(adir);
      afsconf_Touch(adir);
!     UNLOCK_GLOBAL_MUTEX;
!     return i;
  }
  
  /* this proc works by sliding the other guys down, rather than using a funny
***************
*** 1243,1249 ****
      register int i;
      int foundFlag = 0;
  
!     LOCK_GLOBAL_MUTEX tk = adir->keystr;
  
      for (i = 0, tkey = tk->key; i < tk->nkeys; i++, tkey++) {
  	if (tkey->kvno == akvno) {
--- 1288,1295 ----
      register int i;
      int foundFlag = 0;
  
!     LOCK_GLOBAL_MUTEX;
!     tk = adir->keystr;
  
      for (i = 0, tkey = tk->key; i < tk->nkeys; i++, tkey++) {
  	if (tkey->kvno == akvno) {
***************
*** 1252,1258 ****
  	}
      }
      if (!foundFlag) {
! 	UNLOCK_GLOBAL_MUTEX return AFSCONF_NOTFOUND;
      }
  
      /* otherwise slide the others down.  i and tkey point at the guy to delete */
--- 1298,1305 ----
  	}
      }
      if (!foundFlag) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return AFSCONF_NOTFOUND;
      }
  
      /* otherwise slide the others down.  i and tkey point at the guy to delete */
***************
*** 1263,1267 ****
      tk->nkeys--;
      i = SaveKeys(adir);
      afsconf_Touch(adir);
!     UNLOCK_GLOBAL_MUTEX return i;
  }
--- 1310,1315 ----
      tk->nkeys--;
      i = SaveKeys(adir);
      afsconf_Touch(adir);
!     UNLOCK_GLOBAL_MUTEX;
!     return i;
  }
Index: openafs/src/auth/ktc.c
diff -c openafs/src/auth/ktc.c:1.15 openafs/src/auth/ktc.c:1.15.2.1
*** openafs/src/auth/ktc.c:1.15	Wed Apr 14 19:26:13 2004
--- openafs/src/auth/ktc.c	Wed Aug 25 03:09:36 2004
***************
*** 17,23 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/auth/ktc.c,v 1.15 2004/04/14 23:26:13 jaltman Exp $");
  
  #if defined(UKERNEL)
  #include "afs/sysincludes.h"
--- 17,23 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/auth/ktc.c,v 1.15.2.1 2004/08/25 07:09:36 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "afs/sysincludes.h"
***************
*** 424,432 ****
  {
      int ncode, ocode;
  
!     LOCK_GLOBAL_MUTEX
  #ifdef AFS_KERBEROS_ENV
! 	if (!lcell[0])
  	ktc_LocalCell();
  
      if (			/*!strcmp(aclient->cell, lcell) && this would only store local creds */
--- 424,432 ----
  {
      int ncode, ocode;
  
!     LOCK_GLOBAL_MUTEX;
  #ifdef AFS_KERBEROS_ENV
!     if (!lcell[0])
  	ktc_LocalCell();
  
      if (			/*!strcmp(aclient->cell, lcell) && this would only store local creds */
***************
*** 453,459 ****
  	}
  	afs_tf_close();
  #ifdef NO_AFS_CLIENT
! 	UNLOCK_GLOBAL_MUTEX return ncode;
  #endif /* NO_AFS_CLIENT */
      }
  #endif
--- 453,460 ----
  	}
  	afs_tf_close();
  #ifdef NO_AFS_CLIENT
! 	UNLOCK_GLOBAL_MUTEX;
! 	return ncode;
  #endif /* NO_AFS_CLIENT */
      }
  #endif
***************
*** 466,472 ****
      } else
  	ocode = 0;
      if (ncode && ocode) {
! 	UNLOCK_GLOBAL_MUTEX if (ocode == -1)
  	    ocode = errno;
  	else if (ocode == KTC_PIOCTLFAIL)
  	    ocode = errno;
--- 467,474 ----
      } else
  	ocode = 0;
      if (ncode && ocode) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	if (ocode == -1)
  	    ocode = errno;
  	else if (ocode == KTC_PIOCTLFAIL)
  	    ocode = errno;
***************
*** 479,485 ****
  	return KTC_PIOCTLFAIL;
      }
  #endif /* NO_AFS_CLIENT */
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  /* get token, given server we need and token buffer.  aclient will eventually
--- 481,488 ----
  	return KTC_PIOCTLFAIL;
      }
  #endif /* NO_AFS_CLIENT */
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  /* get token, given server we need and token buffer.  aclient will eventually
***************
*** 502,510 ****
      int tktLen;			/* server ticket length */
      char found = 0;
  
!     LOCK_GLOBAL_MUTEX
  #ifndef NO_AFS_CLIENT
! 	TRY_KERNEL(KTC_GETTOKEN_OP, aserver, aclient, atoken, atokenLen);
  #endif /* NO_AFS_CLIENT */
  
  #ifdef AFS_KERBEROS_ENV
--- 505,513 ----
      int tktLen;			/* server ticket length */
      char found = 0;
  
!     LOCK_GLOBAL_MUTEX;
  #ifndef NO_AFS_CLIENT
!     TRY_KERNEL(KTC_GETTOKEN_OP, aserver, aclient, atoken, atokenLen);
  #endif /* NO_AFS_CLIENT */
  
  #ifdef AFS_KERBEROS_ENV
***************
*** 527,533 ****
  		       min(atokenLen, sizeof(struct ktc_token)));
  		if (aclient)
  		    *aclient = local_tokens[i].client;
! 		UNLOCK_GLOBAL_MUTEX return 0;
  	    }
  #ifdef AFS_KERBEROS_ENV
  	if (!afs_tf_init(ktc_tkt_string(), R_TKT_FIL)) {
--- 530,537 ----
  		       min(atokenLen, sizeof(struct ktc_token)));
  		if (aclient)
  		    *aclient = local_tokens[i].client;
! 		UNLOCK_GLOBAL_MUTEX;
! 		return 0;
  	    }
  #ifdef AFS_KERBEROS_ENV
  	if (!afs_tf_init(ktc_tkt_string(), R_TKT_FIL)) {
***************
*** 557,569 ****
  			   min(atokenLen, sizeof(struct ktc_token)));
  
  		    afs_tf_close();
! 		    UNLOCK_GLOBAL_MUTEX return 0;
  		}
  	    }
  	}
  	afs_tf_close();
  #endif
! 	UNLOCK_GLOBAL_MUTEX return KTC_NOENT;
      }
  #ifndef NO_AFS_CLIENT
      for (index = 0; index < 200; index++) {	/* sanity check in case pioctl fails */
--- 561,575 ----
  			   min(atokenLen, sizeof(struct ktc_token)));
  
  		    afs_tf_close();
! 		    UNLOCK_GLOBAL_MUTEX;
! 		    return 0;
  		}
  	    }
  	}
  	afs_tf_close();
  #endif
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KTC_NOENT;
      }
  #ifndef NO_AFS_CLIENT
      for (index = 0; index < 200; index++) {	/* sanity check in case pioctl fails */
***************
*** 577,583 ****
  	if (code) {
  	    /* failed to retrieve specified token */
  	    if (code < 0 && errno == EDOM) {
! 		UNLOCK_GLOBAL_MUTEX return KTC_NOENT;
  	    }
  	} else {
  	    /* token retrieved; parse buffer */
--- 583,590 ----
  	if (code) {
  	    /* failed to retrieve specified token */
  	    if (code < 0 && errno == EDOM) {
! 		UNLOCK_GLOBAL_MUTEX;
! 		return KTC_NOENT;
  	    }
  	} else {
  	    /* token retrieved; parse buffer */
***************
*** 595,601 ****
  	    /* get size of clear token and verify */
  	    memcpy(&temp, tp, sizeof(afs_int32));
  	    if (temp != sizeof(struct ClearToken)) {
! 		UNLOCK_GLOBAL_MUTEX return KTC_ERROR;
  	    }
  	    tp += sizeof(afs_int32);
  
--- 602,609 ----
  	    /* get size of clear token and verify */
  	    memcpy(&temp, tp, sizeof(afs_int32));
  	    if (temp != sizeof(struct ClearToken)) {
! 		UNLOCK_GLOBAL_MUTEX;
! 		return KTC_ERROR;
  	    }
  	    tp += sizeof(afs_int32);
  
***************
*** 618,624 ****
  		maxLen =
  		    atokenLen - sizeof(struct ktc_token) + MAXKTCTICKETLEN;
  		if (maxLen < tktLen) {
! 		    UNLOCK_GLOBAL_MUTEX return KTC_TOOBIG;
  		}
  
  		/* set return values */
--- 626,633 ----
  		maxLen =
  		    atokenLen - sizeof(struct ktc_token) + MAXKTCTICKETLEN;
  		if (maxLen < tktLen) {
! 		    UNLOCK_GLOBAL_MUTEX;
! 		    return KTC_TOOBIG;
  		}
  
  		/* set return values */
***************
*** 645,657 ****
  			sprintf(aclient->name, "Unix UID %d", ct.ViceId);
  		    }
  		}
! 		UNLOCK_GLOBAL_MUTEX return 0;
  	    }
  	}
      }
  #endif /* NO_AFS_CLIENT */
  
!     UNLOCK_GLOBAL_MUTEX if ((code < 0) && (errno == EINVAL))
  	return KTC_NOPIOCTL;
      return KTC_PIOCTLFAIL;	/* probable cause */
  }
--- 654,668 ----
  			sprintf(aclient->name, "Unix UID %d", ct.ViceId);
  		    }
  		}
! 		UNLOCK_GLOBAL_MUTEX;
! 		return 0;
  	    }
  	}
      }
  #endif /* NO_AFS_CLIENT */
  
!     UNLOCK_GLOBAL_MUTEX;
!     if ((code < 0) && (errno == EINVAL))
  	return KTC_NOPIOCTL;
      return KTC_PIOCTLFAIL;	/* probable cause */
  }
***************
*** 666,675 ****
  {
      int rc;
  
!     LOCK_GLOBAL_MUTEX TRY_KERNEL(KTC_FORGETTOKEN_OP, aserver, 0, 0, 0);
  
      rc = ktc_ForgetAllTokens();	/* bogus, but better */
!     UNLOCK_GLOBAL_MUTEX return rc;
  }
  #endif /* NO_AFS_CLIENT */
  
--- 677,688 ----
  {
      int rc;
  
!     LOCK_GLOBAL_MUTEX;
!     TRY_KERNEL(KTC_FORGETTOKEN_OP, aserver, 0, 0, 0);
  
      rc = ktc_ForgetAllTokens();	/* bogus, but better */
!     UNLOCK_GLOBAL_MUTEX;
!     return rc;
  }
  #endif /* NO_AFS_CLIENT */
  
***************
*** 689,697 ****
  
      memset(tbuffer, 0, sizeof(tbuffer));
  
!     LOCK_GLOBAL_MUTEX
  #ifndef NO_AFS_CLIENT
! 	TRY_KERNEL(KTC_LISTTOKENS_OP, aserver, aprevIndex, aindex, 0);
  #endif /* NO_AFS_CLIENT */
  
      index = aprevIndex;
--- 702,710 ----
  
      memset(tbuffer, 0, sizeof(tbuffer));
  
!     LOCK_GLOBAL_MUTEX;
  #ifndef NO_AFS_CLIENT
!     TRY_KERNEL(KTC_LISTTOKENS_OP, aserver, aprevIndex, aindex, 0);
  #endif /* NO_AFS_CLIENT */
  
      index = aprevIndex;
***************
*** 708,727 ****
  	if (afs_tf_init(ktc_tkt_string(), R_TKT_FIL)
  	    || afs_tf_get_pname(tbuffer) || afs_tf_get_pinst(tbuffer)) {
  	    afs_tf_close();
! 	    UNLOCK_GLOBAL_MUTEX return KTC_NOENT;
  	}
  
  	for (i = 214; i < index; i++) {
  	    if (afs_tf_get_cred(&cprincipal, &ctoken)) {
  		afs_tf_close();
! 		UNLOCK_GLOBAL_MUTEX return KTC_NOENT;
  	    }
  	}
  
        again:
  	if (afs_tf_get_cred(&cprincipal, &ctoken)) {
  	    afs_tf_close();
! 	    UNLOCK_GLOBAL_MUTEX return KTC_NOENT;
  	}
  	index++;
  
--- 721,743 ----
  	if (afs_tf_init(ktc_tkt_string(), R_TKT_FIL)
  	    || afs_tf_get_pname(tbuffer) || afs_tf_get_pinst(tbuffer)) {
  	    afs_tf_close();
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return KTC_NOENT;
  	}
  
  	for (i = 214; i < index; i++) {
  	    if (afs_tf_get_cred(&cprincipal, &ctoken)) {
  		afs_tf_close();
! 		UNLOCK_GLOBAL_MUTEX;
! 		return KTC_NOENT;
  	    }
  	}
  
        again:
  	if (afs_tf_get_cred(&cprincipal, &ctoken)) {
  	    afs_tf_close();
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return KTC_NOENT;
  	}
  	index++;
  
***************
*** 743,749 ****
  	*aserver = cprincipal;
  	*aindex = index;
  	afs_tf_close();
! 	UNLOCK_GLOBAL_MUTEX return 0;
      }
  #endif
  
--- 759,766 ----
  	*aserver = cprincipal;
  	*aindex = index;
  	afs_tf_close();
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 0;
      }
  #endif
  
***************
*** 753,767 ****
  	    if (local_tokens[index - 123].valid) {
  		*aserver = local_tokens[index - 123].server;
  		*aindex = index + 1;
! 		UNLOCK_GLOBAL_MUTEX return 0;
  	    }
  	    index++;
  	}
! 	UNLOCK_GLOBAL_MUTEX
  #ifdef AFS_KERBEROS_ENV
! 	    return ktc_ListTokens(214, aindex, aserver);
  #else
! 	    return KTC_NOENT;
  #endif
      }
  
--- 770,785 ----
  	    if (local_tokens[index - 123].valid) {
  		*aserver = local_tokens[index - 123].server;
  		*aindex = index + 1;
! 		UNLOCK_GLOBAL_MUTEX;
! 		return 0;
  	    }
  	    index++;
  	}
! 	UNLOCK_GLOBAL_MUTEX;
  #ifdef AFS_KERBEROS_ENV
! 	return ktc_ListTokens(214, aindex, aserver);
  #else
! 	return KTC_NOENT;
  #endif
      }
  
***************
*** 776,784 ****
  	    if (index < 123) {
  		int rc;
  		rc = ktc_ListTokens(123, aindex, aserver);
! 		UNLOCK_GLOBAL_MUTEX return rc;
  	    } else {
! 		UNLOCK_GLOBAL_MUTEX return KTC_NOENT;
  	    }
  	}
  	if (code == 0)
--- 794,804 ----
  	    if (index < 123) {
  		int rc;
  		rc = ktc_ListTokens(123, aindex, aserver);
! 		UNLOCK_GLOBAL_MUTEX;
! 		return rc;
  	    } else {
! 		UNLOCK_GLOBAL_MUTEX;
! 		return KTC_NOENT;
  	    }
  	}
  	if (code == 0)
***************
*** 787,793 ****
  	index++;
      }
      if (code < 0) {
! 	UNLOCK_GLOBAL_MUTEX if (errno == EINVAL)
  	    return KTC_NOPIOCTL;
  	return KTC_PIOCTLFAIL;
      }
--- 807,814 ----
  	index++;
      }
      if (code < 0) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	if (errno == EINVAL)
  	    return KTC_NOPIOCTL;
  	return KTC_PIOCTLFAIL;
      }
***************
*** 803,809 ****
      tp += temp;			/* skip ticket for now */
      memcpy(&temp, tp, sizeof(afs_int32));	/* get size of clear token */
      if (temp != sizeof(struct ClearToken)) {
! 	UNLOCK_GLOBAL_MUTEX return KTC_ERROR;
      }
      tp += sizeof(afs_int32);	/* skip length */
      tp += temp;			/* skip clear token itself */
--- 824,831 ----
      tp += temp;			/* skip ticket for now */
      memcpy(&temp, tp, sizeof(afs_int32));	/* get size of clear token */
      if (temp != sizeof(struct ClearToken)) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KTC_ERROR;
      }
      tp += sizeof(afs_int32);	/* skip length */
      tp += temp;			/* skip clear token itself */
***************
*** 813,819 ****
      aserver->instance[0] = 0;
      strcpy(aserver->name, "afs");
  #endif /* NO_AFS_CLIENT */
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  /* discard all tokens from this user's cache */
--- 835,842 ----
      aserver->instance[0] = 0;
      strcpy(aserver->name, "afs");
  #endif /* NO_AFS_CLIENT */
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  /* discard all tokens from this user's cache */
***************
*** 854,862 ****
  {
      int ncode, ocode;
  
!     LOCK_GLOBAL_MUTEX
  #ifdef AFS_KERBEROS_ENV
!     (void) afs_tf_dest_tkt();
  #endif
  
      ncode = NewForgetAll();
--- 877,885 ----
  {
      int ncode, ocode;
  
!     LOCK_GLOBAL_MUTEX;
  #ifdef AFS_KERBEROS_ENV
!     (void)afs_tf_dest_tkt();
  #endif
  
      ncode = NewForgetAll();
***************
*** 866,876 ****
  	    ocode = errno;
  	else if (ocode == KTC_PIOCTLFAIL)
  	    ocode = errno;
! 	UNLOCK_GLOBAL_MUTEX if (ocode == EINVAL)
  	    return KTC_NOPIOCTL;
  	return KTC_PIOCTLFAIL;
      }
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  /* ktc_OldPioctl - returns a boolean true if the kernel supports only the old
--- 889,901 ----
  	    ocode = errno;
  	else if (ocode == KTC_PIOCTLFAIL)
  	    ocode = errno;
! 	UNLOCK_GLOBAL_MUTEX;
! 	if (ocode == EINVAL)
  	    return KTC_NOPIOCTL;
  	return KTC_PIOCTLFAIL;
      }
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  /* ktc_OldPioctl - returns a boolean true if the kernel supports only the old
***************
*** 879,892 ****
  ktc_OldPioctl()
  {
      int rc;
!     LOCK_GLOBAL_MUTEX
  #ifdef	KERNEL_KTC_COMPAT
! 	CHECK_KERNEL;
      rc = (kernelKTC != 1);	/* old style interface */
  #else
! 	rc = 1;
  #endif
!     UNLOCK_GLOBAL_MUTEX return rc;
  }
  
  
--- 904,918 ----
  ktc_OldPioctl()
  {
      int rc;
!     LOCK_GLOBAL_MUTEX;
  #ifdef	KERNEL_KTC_COMPAT
!     CHECK_KERNEL;
      rc = (kernelKTC != 1);	/* old style interface */
  #else
!     rc = 1;
  #endif
!     UNLOCK_GLOBAL_MUTEX;
!     return rc;
  }
  
  
***************
*** 1415,1421 ****
  {
      char *env;
  
!     LOCK_GLOBAL_MUTEX if (!*krb_ticket_string) {
  	if (env = getenv("KRBTKFILE")) {
  	    (void)strncpy(krb_ticket_string, env,
  			  sizeof(krb_ticket_string) - 1);
--- 1441,1448 ----
  {
      char *env;
  
!     LOCK_GLOBAL_MUTEX;
!     if (!*krb_ticket_string) {
  	if (env = getenv("KRBTKFILE")) {
  	    (void)strncpy(krb_ticket_string, env,
  			  sizeof(krb_ticket_string) - 1);
***************
*** 1426,1432 ****
  	    (void)sprintf(krb_ticket_string, "%s%d", TKT_ROOT, getuid());
  	}
      }
!     UNLOCK_GLOBAL_MUTEX return krb_ticket_string;
  }
  
  /*
--- 1453,1460 ----
  	    (void)sprintf(krb_ticket_string, "%s%d", TKT_ROOT, getuid());
  	}
      }
!     UNLOCK_GLOBAL_MUTEX;
!     return krb_ticket_string;
  }
  
  /*
***************
*** 1445,1454 ****
       char *val;
  {
  
!     LOCK_GLOBAL_MUTEX(void) strncpy(krb_ticket_string, val,
! 				    sizeof(krb_ticket_string) - 1);
      krb_ticket_string[sizeof(krb_ticket_string) - 1] = '\0';
!     UNLOCK_GLOBAL_MUTEX return;
  }
  
  /*
--- 1473,1483 ----
       char *val;
  {
  
!     LOCK_GLOBAL_MUTEX;
!     (void)strncpy(krb_ticket_string, val, sizeof(krb_ticket_string) - 1);
      krb_ticket_string[sizeof(krb_ticket_string) - 1] = '\0';
!     UNLOCK_GLOBAL_MUTEX;
!     return;
  }
  
  /*
***************
*** 1615,1621 ****
      int numenv;
      char **newenv, **senv, **denv;
  
!     LOCK_GLOBAL_MUTEX if (stat("/ticket", &sbuf) == -1) {
  	prefix = "/tmp/tkt";
      }
  
--- 1644,1651 ----
      int numenv;
      char **newenv, **senv, **denv;
  
!     LOCK_GLOBAL_MUTEX;
!     if (stat("/ticket", &sbuf) == -1) {
  	prefix = "/tmp/tkt";
      }
  
***************
*** 1641,1647 ****
      strcat(*denv, fname);
      *++denv = 0;
      environ = newenv;
! UNLOCK_GLOBAL_MUTEX}
  
  /*
   * BLETCH!  We have to invoke the entire afsconf package just to
--- 1671,1678 ----
      strcat(*denv, fname);
      *++denv = 0;
      environ = newenv;
!     UNLOCK_GLOBAL_MUTEX;
! }
  
  /*
   * BLETCH!  We have to invoke the entire afsconf package just to
Index: openafs/src/auth/ktc_nt.c
diff -c openafs/src/auth/ktc_nt.c:1.17 openafs/src/auth/ktc_nt.c:1.17.2.1
*** openafs/src/auth/ktc_nt.c:1.17	Thu Jul  8 09:24:00 2004
--- openafs/src/auth/ktc_nt.c	Wed Aug 25 03:09:36 2004
***************
*** 13,19 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/auth/ktc_nt.c,v 1.17 2004/07/08 13:24:00 jaltman Exp $");
  
  #include <afs/stds.h>
  #include <stdio.h>
--- 13,19 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/auth/ktc_nt.c,v 1.17.2.1 2004/08/25 07:09:36 shadow Exp $");
  
  #include <afs/stds.h>
  #include <stdio.h>
***************
*** 49,55 ****
      "SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters";
  
  static char AFSGlobalKTCMutexName[] = "Global\\AFS_KTC_Mutex";
! static char AFSKTCMutexName[]       = "AFS_KTC_Mutex";
  
  /*
   * Support for RPC's to send and receive session keys
--- 49,55 ----
      "SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters";
  
  static char AFSGlobalKTCMutexName[] = "Global\\AFS_KTC_Mutex";
! static char AFSKTCMutexName[] = "AFS_KTC_Mutex";
  
  /*
   * Support for RPC's to send and receive session keys
***************
*** 351,385 ****
  
  #ifndef AFS_WIN95_ENV
      ktcMutex = CreateMutex(NULL, TRUE, AFSGlobalKTCMutexName);
!     if ( ktcMutex == NULL )
!         return KTC_PIOCTLFAIL;
!     if ( GetLastError() == ERROR_ALREADY_EXISTS ) {
!         if ( WaitForSingleObject( ktcMutex, INFINITE) != WAIT_OBJECT_0 ) {
!             CloseHandle(ktcMutex);
!             return KTC_PIOCTLFAIL;
!         }
      }
  
      /* RPC to send session key */
      status = send_key(uuid, token->sessionKey.data);
      if (status != RPC_S_OK) {
!         if (status == 1)
!             strcpy(rpcErr, "RPC failure in AFS gateway");
!         else
!             DceErrorInqText(status, rpcErr);
!         if (status == RPC_S_SERVER_UNAVAILABLE ||
!             status == EPT_S_NOT_REGISTERED) 
!         {
!             ReleaseMutex(ktcMutex);
!             CloseHandle(ktcMutex);
!             return KTC_NOCMRPC;
!         }
!         else 
!         {
!             ReleaseMutex(ktcMutex);
!             CloseHandle(ktcMutex);
!             return KTC_RPC;
!         }
      }
  #endif /* AFS_WIN95_ENV */
  
--- 351,382 ----
  
  #ifndef AFS_WIN95_ENV
      ktcMutex = CreateMutex(NULL, TRUE, AFSGlobalKTCMutexName);
!     if (ktcMutex == NULL)
! 	return KTC_PIOCTLFAIL;
!     if (GetLastError() == ERROR_ALREADY_EXISTS) {
! 	if (WaitForSingleObject(ktcMutex, INFINITE) != WAIT_OBJECT_0) {
! 	    CloseHandle(ktcMutex);
! 	    return KTC_PIOCTLFAIL;
! 	}
      }
  
      /* RPC to send session key */
      status = send_key(uuid, token->sessionKey.data);
      if (status != RPC_S_OK) {
! 	if (status == 1)
! 	    strcpy(rpcErr, "RPC failure in AFS gateway");
! 	else
! 	    DceErrorInqText(status, rpcErr);
! 	if (status == RPC_S_SERVER_UNAVAILABLE ||
! 	    status == EPT_S_NOT_REGISTERED) {
! 	    ReleaseMutex(ktcMutex);
! 	    CloseHandle(ktcMutex);
! 	    return KTC_NOCMRPC;
! 	} else {
! 	    ReleaseMutex(ktcMutex);
! 	    CloseHandle(ktcMutex);
! 	    return KTC_RPC;
! 	}
      }
  #endif /* AFS_WIN95_ENV */
  
***************
*** 397,413 ****
  #endif /* AFS_WIN95_ENV */
  
      if (code) {
!         if (code == -1) {
!             if (errno == ESRCH)
!                 return KTC_NOCELL;
!             else if (errno == ENODEV)
!                 return KTC_NOCM;
!             else if (errno == EINVAL)
!                 return KTC_INVAL;
!             else
!                 return KTC_PIOCTLFAIL;
!         } else
!             return KTC_PIOCTLFAIL;
      }
  
      return 0;
--- 394,410 ----
  #endif /* AFS_WIN95_ENV */
  
      if (code) {
! 	if (code == -1) {
! 	    if (errno == ESRCH)
! 		return KTC_NOCELL;
! 	    else if (errno == ENODEV)
! 		return KTC_NOCM;
! 	    else if (errno == EINVAL)
! 		return KTC_INVAL;
! 	    else
! 		return KTC_PIOCTLFAIL;
! 	} else
! 	    return KTC_PIOCTLFAIL;
      }
  
      return 0;
***************
*** 454,493 ****
      iob.out = tbuffer;
      iob.out_size = sizeof(tbuffer);
  
! #ifndef AFS_WIN95_ENV		
      ktcMutex = CreateMutex(NULL, TRUE, AFSGlobalKTCMutexName);
!     if ( ktcMutex == NULL )
!         return KTC_PIOCTLFAIL;
!     if ( GetLastError() == ERROR_ALREADY_EXISTS ) {
!         if ( WaitForSingleObject( ktcMutex, INFINITE) != WAIT_OBJECT_0 ) {
!             CloseHandle(ktcMutex);
!             return KTC_PIOCTLFAIL;
!         }
      }
  #endif /* AFS_WIN95_ENV */
  
      code = pioctl(0, VIOCNEWGETTOK, &iob, 0);
      if (code) {
  #ifndef AFS_WIN95_ENV
!         ReleaseMutex(ktcMutex);
!         CloseHandle(ktcMutex);
  #endif /* AFS_WIN95_ENV */
!         if (code == -1) {
!             if (errno == ESRCH)
!                 return KTC_NOCELL;
!             else if (errno == ENODEV)
!                 return KTC_NOCM;
!             else if (errno == EINVAL)
!                 return KTC_INVAL;
!             else if (errno == EDOM)
!                 return KTC_NOENT;
!             else
!                 return KTC_PIOCTLFAIL;
!         } else
!             return KTC_PIOCTLFAIL;
!     }                                                             
! 
! #ifndef AFS_WIN95_ENV		
      /* get rid of RPC for win95 build */
      /* RPC to receive session key */
      status = receive_key(uuid, token->sessionKey.data);
--- 451,489 ----
      iob.out = tbuffer;
      iob.out_size = sizeof(tbuffer);
  
! #ifndef AFS_WIN95_ENV
      ktcMutex = CreateMutex(NULL, TRUE, AFSGlobalKTCMutexName);
!     if (ktcMutex == NULL)
! 	return KTC_PIOCTLFAIL;
!     if (GetLastError() == ERROR_ALREADY_EXISTS) {
! 	if (WaitForSingleObject(ktcMutex, INFINITE) != WAIT_OBJECT_0) {
! 	    CloseHandle(ktcMutex);
! 	    return KTC_PIOCTLFAIL;
! 	}
      }
  #endif /* AFS_WIN95_ENV */
  
      code = pioctl(0, VIOCNEWGETTOK, &iob, 0);
      if (code) {
  #ifndef AFS_WIN95_ENV
! 	ReleaseMutex(ktcMutex);
! 	CloseHandle(ktcMutex);
  #endif /* AFS_WIN95_ENV */
! 	if (code == -1) {
! 	    if (errno == ESRCH)
! 		return KTC_NOCELL;
! 	    else if (errno == ENODEV)
! 		return KTC_NOCM;
! 	    else if (errno == EINVAL)
! 		return KTC_INVAL;
! 	    else if (errno == EDOM)
! 		return KTC_NOENT;
! 	    else
! 		return KTC_PIOCTLFAIL;
! 	} else
! 	    return KTC_PIOCTLFAIL;
!     }
! #ifndef AFS_WIN95_ENV
      /* get rid of RPC for win95 build */
      /* RPC to receive session key */
      status = receive_key(uuid, token->sessionKey.data);
***************
*** 496,510 ****
      CloseHandle(ktcMutex);
  
      if (status != RPC_S_OK) {
!         if (status == 1)
!             strcpy(rpcErr, "RPC failure in AFS gateway");
!         else
!             DceErrorInqText(status, rpcErr);
!         if (status == RPC_S_SERVER_UNAVAILABLE
!              || status == EPT_S_NOT_REGISTERED)
!             return KTC_NOCMRPC;
!         else 
!             return KTC_RPC;
      }
  #endif /* AFS_WIN95_ENV */
  
--- 492,506 ----
      CloseHandle(ktcMutex);
  
      if (status != RPC_S_OK) {
! 	if (status == 1)
! 	    strcpy(rpcErr, "RPC failure in AFS gateway");
! 	else
! 	    DceErrorInqText(status, rpcErr);
! 	if (status == RPC_S_SERVER_UNAVAILABLE
! 	    || status == EPT_S_NOT_REGISTERED)
! 	    return KTC_NOCMRPC;
! 	else
! 	    return KTC_RPC;
      }
  #endif /* AFS_WIN95_ENV */
  
***************
*** 539,550 ****
      /* user name is here */
  
      /* check that ticket will fit 
! 	 * this compares the size of the ktc_token allocated by the app
! 	 * which might be smaller than the current definition of MAXKTCTICKETLEN
! 	 */
! 	maxLen = tokenLen - sizeof(struct ktc_token) + MAXKTCTICKETLEN;
! 	if (maxLen < ticketLen)
! 		return KTC_TOOBIG;
  
      /* set return values */
      memcpy(token->ticket, ticketP, ticketLen);
--- 535,546 ----
      /* user name is here */
  
      /* check that ticket will fit 
!      * this compares the size of the ktc_token allocated by the app
!      * which might be smaller than the current definition of MAXKTCTICKETLEN
!      */
!     maxLen = tokenLen - sizeof(struct ktc_token) + MAXKTCTICKETLEN;
!     if (maxLen < ticketLen)
! 	return KTC_TOOBIG;
  
      /* set return values */
      memcpy(token->ticket, ticketP, ticketLen);
***************
*** 580,594 ****
      int code;
      HANDLE ktcMutex = NULL;
  
! #ifndef AFS_WIN95_ENV		
      ktcMutex = CreateMutex(NULL, TRUE, AFSGlobalKTCMutexName);
!     if ( ktcMutex == NULL )
!         return KTC_PIOCTLFAIL;
!     if ( GetLastError() == ERROR_ALREADY_EXISTS ) {
!         if ( WaitForSingleObject( ktcMutex, INFINITE) != WAIT_OBJECT_0 ) {
!             CloseHandle(ktcMutex);
!             return KTC_PIOCTLFAIL;
!         }
      }
  #endif /* AFS_WIN95_ENV */
  
--- 576,590 ----
      int code;
      HANDLE ktcMutex = NULL;
  
! #ifndef AFS_WIN95_ENV
      ktcMutex = CreateMutex(NULL, TRUE, AFSGlobalKTCMutexName);
!     if (ktcMutex == NULL)
! 	return KTC_PIOCTLFAIL;
!     if (GetLastError() == ERROR_ALREADY_EXISTS) {
! 	if (WaitForSingleObject(ktcMutex, INFINITE) != WAIT_OBJECT_0) {
! 	    CloseHandle(ktcMutex);
! 	    return KTC_PIOCTLFAIL;
! 	}
      }
  #endif /* AFS_WIN95_ENV */
  
***************
*** 607,614 ****
      code = pioctl(0, VIOCGETTOK, &iob, 0);
  
  #ifndef AFS_WIN95_ENV
!         ReleaseMutex(ktcMutex);
!         CloseHandle(ktcMutex);
  #endif /* AFS_WIN95_ENV */
  
      if (code) {
--- 603,610 ----
      code = pioctl(0, VIOCGETTOK, &iob, 0);
  
  #ifndef AFS_WIN95_ENV
!     ReleaseMutex(ktcMutex);
!     CloseHandle(ktcMutex);
  #endif /* AFS_WIN95_ENV */
  
      if (code) {
***************
*** 675,690 ****
      if (strcmp(server->name, "afs")) {
  	return ForgetOneLocalToken(server);
      }
! 
! #ifndef AFS_WIN95_ENV		
      ktcMutex = CreateMutex(NULL, TRUE, AFSGlobalKTCMutexName);
!     if ( ktcMutex == NULL )
!         return KTC_PIOCTLFAIL;
!     if ( GetLastError() == ERROR_ALREADY_EXISTS ) {
!         if ( WaitForSingleObject( ktcMutex, INFINITE) != WAIT_OBJECT_0 ) {
!             CloseHandle(ktcMutex);
!             return KTC_PIOCTLFAIL;
!         }
      }
  #endif /* AFS_WIN95_ENV */
  
--- 671,685 ----
      if (strcmp(server->name, "afs")) {
  	return ForgetOneLocalToken(server);
      }
! #ifndef AFS_WIN95_ENV
      ktcMutex = CreateMutex(NULL, TRUE, AFSGlobalKTCMutexName);
!     if (ktcMutex == NULL)
! 	return KTC_PIOCTLFAIL;
!     if (GetLastError() == ERROR_ALREADY_EXISTS) {
! 	if (WaitForSingleObject(ktcMutex, INFINITE) != WAIT_OBJECT_0) {
! 	    CloseHandle(ktcMutex);
! 	    return KTC_PIOCTLFAIL;
! 	}
      }
  #endif /* AFS_WIN95_ENV */
  
***************
*** 731,745 ****
  
      (void)ForgetLocalTokens();
  
! #ifndef AFS_WIN95_ENV		
      ktcMutex = CreateMutex(NULL, TRUE, AFSGlobalKTCMutexName);
!     if ( ktcMutex == NULL )
!         return KTC_PIOCTLFAIL;
!     if ( GetLastError() == ERROR_ALREADY_EXISTS ) {
!         if ( WaitForSingleObject( ktcMutex, INFINITE) != WAIT_OBJECT_0 ) {
!             CloseHandle(ktcMutex);
!             return KTC_PIOCTLFAIL;
!         }
      }
  #endif /* AFS_WIN95_ENV */
  
--- 726,740 ----
  
      (void)ForgetLocalTokens();
  
! #ifndef AFS_WIN95_ENV
      ktcMutex = CreateMutex(NULL, TRUE, AFSGlobalKTCMutexName);
!     if (ktcMutex == NULL)
! 	return KTC_PIOCTLFAIL;
!     if (GetLastError() == ERROR_ALREADY_EXISTS) {
! 	if (WaitForSingleObject(ktcMutex, INFINITE) != WAIT_OBJECT_0) {
! 	    CloseHandle(ktcMutex);
! 	    return KTC_PIOCTLFAIL;
! 	}
      }
  #endif /* AFS_WIN95_ENV */
  
***************
*** 790,796 ****
      int found = -1;
      int i;
  
!     LOCK_GLOBAL_MUTEX for (i = 0; i < MAXLOCALTOKENS; i++)
  	if (local_tokens[i].valid) {
  	    if ((strcmp(local_tokens[i].server.name, aserver->name) == 0)
  		&& (strcmp(local_tokens[i].server.instance, aserver->instance)
--- 785,792 ----
      int found = -1;
      int i;
  
!     LOCK_GLOBAL_MUTEX;
!     for (i = 0; i < MAXLOCALTOKENS; i++)
  	if (local_tokens[i].valid) {
  	    if ((strcmp(local_tokens[i].server.name, aserver->name) == 0)
  		&& (strcmp(local_tokens[i].server.instance, aserver->instance)
***************
*** 802,808 ****
  	} else if (found == -1)
  	    found = i;		/* remember empty slot but keep looking for a match */
      if (found == -1) {
! 	UNLOCK_GLOBAL_MUTEX return KTC_NOENT;
      }
      memcpy(&local_tokens[found].token, atoken, sizeof(struct ktc_token));
      memcpy(&local_tokens[found].server, aserver,
--- 798,805 ----
  	} else if (found == -1)
  	    found = i;		/* remember empty slot but keep looking for a match */
      if (found == -1) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KTC_NOENT;
      }
      memcpy(&local_tokens[found].token, atoken, sizeof(struct ktc_token));
      memcpy(&local_tokens[found].server, aserver,
***************
*** 810,816 ****
      memcpy(&local_tokens[found].client, aclient,
  	   sizeof(struct ktc_principal));
      local_tokens[found].valid = 1;
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  
--- 807,814 ----
      memcpy(&local_tokens[found].client, aclient,
  	   sizeof(struct ktc_principal));
      local_tokens[found].valid = 1;
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  
***************
*** 820,826 ****
  {
      int i;
  
!     LOCK_GLOBAL_MUTEX for (i = 0; i < MAXLOCALTOKENS; i++)
  	if (local_tokens[i].valid
  	    && (strcmp(local_tokens[i].server.name, aserver->name) == 0)
  	    && (strcmp(local_tokens[i].server.instance, aserver->instance) ==
--- 818,825 ----
  {
      int i;
  
!     LOCK_GLOBAL_MUTEX;
!     for (i = 0; i < MAXLOCALTOKENS; i++)
  	if (local_tokens[i].valid
  	    && (strcmp(local_tokens[i].server.name, aserver->name) == 0)
  	    && (strcmp(local_tokens[i].server.instance, aserver->instance) ==
***************
*** 830,838 ****
  		   min(atokenLen, sizeof(struct ktc_token)));
  	    memcpy(aclient, &local_tokens[i].client,
  		   sizeof(struct ktc_principal));
! 	    UNLOCK_GLOBAL_MUTEX return 0;
  	}
!     UNLOCK_GLOBAL_MUTEX return KTC_NOENT;
  }
  
  
--- 829,839 ----
  		   min(atokenLen, sizeof(struct ktc_token)));
  	    memcpy(aclient, &local_tokens[i].client,
  		   sizeof(struct ktc_principal));
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return 0;
  	}
!     UNLOCK_GLOBAL_MUTEX;
!     return KTC_NOENT;
  }
  
  
***************
*** 841,852 ****
  {
      int i;
  
!     LOCK_GLOBAL_MUTEX for (i = 0; i < MAXLOCALTOKENS; i++) {
  	local_tokens[i].valid = 0;
  	memset(&local_tokens[i].token.sessionKey, 0,
  	       sizeof(struct ktc_encryptionKey));
      }
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  
--- 842,855 ----
  {
      int i;
  
!     LOCK_GLOBAL_MUTEX;
!     for (i = 0; i < MAXLOCALTOKENS; i++) {
  	local_tokens[i].valid = 0;
  	memset(&local_tokens[i].token.sessionKey, 0,
  	       sizeof(struct ktc_encryptionKey));
      }
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  
***************
*** 855,861 ****
  {
      int i;
  
!     LOCK_GLOBAL_MUTEX for (i = 0; i < MAXLOCALTOKENS; i++) {
  	if (local_tokens[i].valid
  	    && (strcmp(local_tokens[i].server.name, aserver->name) == 0)
  	    && (strcmp(local_tokens[i].server.instance, aserver->instance) ==
--- 858,865 ----
  {
      int i;
  
!     LOCK_GLOBAL_MUTEX;
!     for (i = 0; i < MAXLOCALTOKENS; i++) {
  	if (local_tokens[i].valid
  	    && (strcmp(local_tokens[i].server.name, aserver->name) == 0)
  	    && (strcmp(local_tokens[i].server.instance, aserver->instance) ==
***************
*** 864,871 ****
  	    local_tokens[i].valid = 0;
  	    memset(&local_tokens[i].token.sessionKey, 0,
  		   sizeof(struct ktc_encryptionKey));
! 	    UNLOCK_GLOBAL_MUTEX return 0;
  	}
      }
!     UNLOCK_GLOBAL_MUTEX return KTC_NOENT;
  }
--- 868,877 ----
  	    local_tokens[i].valid = 0;
  	    memset(&local_tokens[i].token.sessionKey, 0,
  		   sizeof(struct ktc_encryptionKey));
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return 0;
  	}
      }
!     UNLOCK_GLOBAL_MUTEX;
!     return KTC_NOENT;
  }
Index: openafs/src/auth/userok.c
diff -c openafs/src/auth/userok.c:1.12 openafs/src/auth/userok.c:1.12.2.1
*** openafs/src/auth/userok.c:1.12	Sun Dec  7 17:49:17 2003
--- openafs/src/auth/userok.c	Wed Aug 25 03:09:36 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/auth/userok.c,v 1.12 2003/12/07 22:49:17 jaltman Exp $");
  
  #include <afs/stds.h>
  #include <afs/pthread_glock.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/auth/userok.c,v 1.12.2.1 2004/08/25 07:09:36 shadow Exp $");
  
  #include <afs/stds.h>
  #include <afs/pthread_glock.h>
***************
*** 54,62 ****
       register struct rx_call *acall;
       register struct afsconf_dir *adir;
  {
!     LOCK_GLOBAL_MUTEX return ((afsconf_SuperUser(adir, acall, NULL) == 0) ?
! 			      10029 : 0);
! UNLOCK_GLOBAL_MUTEX}
  #endif /* !defined(UKERNEL) */
  
  static int
--- 54,63 ----
       register struct rx_call *acall;
       register struct afsconf_dir *adir;
  {
!     LOCK_GLOBAL_MUTEX;
!     return ((afsconf_SuperUser(adir, acall, NULL) == 0) ? 10029 : 0);
!     UNLOCK_GLOBAL_MUTEX;
! }
  #endif /* !defined(UKERNEL) */
  
  static int
***************
*** 77,84 ****
  {
      int rc;
  
!     LOCK_GLOBAL_MUTEX rc = GetNoAuthFlag(adir);
!     UNLOCK_GLOBAL_MUTEX return rc;
  }
  
  void
--- 78,87 ----
  {
      int rc;
  
!     LOCK_GLOBAL_MUTEX;
!     rc = GetNoAuthFlag(adir);
!     UNLOCK_GLOBAL_MUTEX;
!     return rc;
  }
  
  void
***************
*** 88,94 ****
  {
      register afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX if (aflag == 0) {
  	/* turn off noauth flag */
  	code = (unlink(AFSDIR_SERVER_NOAUTH_FILEPATH) ? errno : 0);
  	osi_audit(NoAuthDisableEvent, code, AUD_END);
--- 91,98 ----
  {
      register afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX;
!     if (aflag == 0) {
  	/* turn off noauth flag */
  	code = (unlink(AFSDIR_SERVER_NOAUTH_FILEPATH) ? errno : 0);
  	osi_audit(NoAuthDisableEvent, code, AUD_END);
***************
*** 103,109 ****
  	} else
  	    osi_audit(NoAuthEnableEvent, errno, AUD_END);
      }
! UNLOCK_GLOBAL_MUTEX}
  
  /* deletes a user from the UserList file */
  int
--- 107,114 ----
  	} else
  	    osi_audit(NoAuthEnableEvent, errno, AUD_END);
      }
!     UNLOCK_GLOBAL_MUTEX;
! }
  
  /* deletes a user from the UserList file */
  int
***************
*** 122,129 ****
      struct stat tstat;
      register afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX strcompose(tbuffer, sizeof tbuffer, adir->name, "/",
! 				 AFSDIR_ULIST_FILE, NULL);
  #ifndef AFS_NT40_ENV
      {
  	/*
--- 127,135 ----
      struct stat tstat;
      register afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX;
!     strcompose(tbuffer, sizeof tbuffer, adir->name, "/",
! 	       AFSDIR_ULIST_FILE, NULL);
  #ifndef AFS_NT40_ENV
      {
  	/*
***************
*** 140,157 ****
  #endif /* AFS_NT40_ENV */
      tf = fopen(tbuffer, "r");
      if (!tf) {
! 	UNLOCK_GLOBAL_MUTEX return -1;
      }
      code = stat(tbuffer, &tstat);
      if (code < 0) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
      strcpy(nbuffer, tbuffer);
      strcat(nbuffer, ".NXX");
      nf = fopen(nbuffer, "w+");
      if (!nf) {
  	fclose(tf);
! 	UNLOCK_GLOBAL_MUTEX return EIO;
      }
      flag = 0;
      found = 0;
--- 146,166 ----
  #endif /* AFS_NT40_ENV */
      tf = fopen(tbuffer, "r");
      if (!tf) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return -1;
      }
      code = stat(tbuffer, &tstat);
      if (code < 0) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
      strcpy(nbuffer, tbuffer);
      strcat(nbuffer, ".NXX");
      nf = fopen(nbuffer, "w+");
      if (!nf) {
  	fclose(tf);
! 	UNLOCK_GLOBAL_MUTEX;
! 	return EIO;
      }
      flag = 0;
      found = 0;
***************
*** 185,192 ****
  	unlink(nbuffer);
  
      /* finally, decide what to return to the caller */
!     UNLOCK_GLOBAL_MUTEX if (flag)
! 	  return EIO;		/* something mysterious went wrong */
      if (!found)
  	return ENOENT;		/* entry wasn't found, no changes made */
      return 0;			/* everything was fine */
--- 194,202 ----
  	unlink(nbuffer);
  
      /* finally, decide what to return to the caller */
!     UNLOCK_GLOBAL_MUTEX;
!     if (flag)
! 	return EIO;		/* something mysterious went wrong */
      if (!found)
  	return ENOENT;		/* entry wasn't found, no changes made */
      return 0;			/* everything was fine */
***************
*** 207,217 ****
      register int flag;
      register afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX strcompose(tbuffer, sizeof tbuffer, adir->name, "/",
! 				 AFSDIR_ULIST_FILE, NULL);
      tf = fopen(tbuffer, "r");
      if (!tf) {
! 	UNLOCK_GLOBAL_MUTEX return 1;
      }
      flag = 1;
      while (1) {
--- 217,229 ----
      register int flag;
      register afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX;
!     strcompose(tbuffer, sizeof tbuffer, adir->name, "/",
! 	       AFSDIR_ULIST_FILE, NULL);
      tf = fopen(tbuffer, "r");
      if (!tf) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 1;
      }
      flag = 1;
      while (1) {
***************
*** 228,234 ****
      if (flag == 0)
  	strcpy(abuffer, tname);
      fclose(tf);
!     UNLOCK_GLOBAL_MUTEX return flag;
  }
  
  /* returns true iff user is in the UserList file */
--- 240,247 ----
      if (flag == 0)
  	strcpy(abuffer, tname);
      fclose(tf);
!     UNLOCK_GLOBAL_MUTEX;
!     return flag;
  }
  
  /* returns true iff user is in the UserList file */
***************
*** 275,289 ****
      register afs_int32 code;
      char tbuffer[256];
  
!     LOCK_GLOBAL_MUTEX if (FindUser(adir, aname)) {
! 	UNLOCK_GLOBAL_MUTEX return EEXIST;	/* already in the list */
      }
  
      strcompose(tbuffer, sizeof tbuffer, adir->name, "/", AFSDIR_ULIST_FILE,
  	       NULL);
      tf = fopen(tbuffer, "a+");
      if (!tf) {
! 	UNLOCK_GLOBAL_MUTEX return EIO;
      }
      fprintf(tf, "%s\n", aname);
      code = 0;
--- 288,305 ----
      register afs_int32 code;
      char tbuffer[256];
  
!     LOCK_GLOBAL_MUTEX;
!     if (FindUser(adir, aname)) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return EEXIST;		/* already in the list */
      }
  
      strcompose(tbuffer, sizeof tbuffer, adir->name, "/", AFSDIR_ULIST_FILE,
  	       NULL);
      tf = fopen(tbuffer, "a+");
      if (!tf) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return EIO;
      }
      fprintf(tf, "%s\n", aname);
      code = 0;
***************
*** 291,297 ****
  	code = EIO;
      if (fclose(tf))
  	code = EIO;
!     UNLOCK_GLOBAL_MUTEX return code;
  }
  
  /* special CompFindUser routine that builds up a princ and then
--- 307,314 ----
  	code = EIO;
      if (fclose(tf))
  	code = EIO;
!     UNLOCK_GLOBAL_MUTEX;
!     return code;
  }
  
  /* special CompFindUser routine that builds up a princ and then
***************
*** 352,374 ****
      register afs_int32 code;
      int flag;
  
!     LOCK_GLOBAL_MUTEX if (!adir) {
! 	UNLOCK_GLOBAL_MUTEX return 0;
      }
  
      if (afsconf_GetNoAuthFlag(adir)) {
  	if (namep)
  	    strcpy(namep, "<NoAuth>");
! 	UNLOCK_GLOBAL_MUTEX return 1;
      }
  
      tconn = rx_ConnectionOf(acall);
      code = rx_SecurityClassOf(tconn);
      if (code == 0) {
! 	UNLOCK_GLOBAL_MUTEX return 0;	/* not authenticated at all, answer is no */
      } else if (code == 1) {
  	/* bcrypt tokens */
! 	UNLOCK_GLOBAL_MUTEX return 0;	/* not supported any longer */
      } else if (code == 2) {
  	char tname[MAXKTCNAMELEN];	/* authentication from ticket */
  	char tinst[MAXKTCNAMELEN];
--- 369,396 ----
      register afs_int32 code;
      int flag;
  
!     LOCK_GLOBAL_MUTEX;
!     if (!adir) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 0;
      }
  
      if (afsconf_GetNoAuthFlag(adir)) {
  	if (namep)
  	    strcpy(namep, "<NoAuth>");
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 1;
      }
  
      tconn = rx_ConnectionOf(acall);
      code = rx_SecurityClassOf(tconn);
      if (code == 0) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 0;		/* not authenticated at all, answer is no */
      } else if (code == 1) {
  	/* bcrypt tokens */
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 0;		/* not supported any longer */
      } else if (code == 2) {
  	char tname[MAXKTCNAMELEN];	/* authentication from ticket */
  	char tinst[MAXKTCNAMELEN];
***************
*** 388,394 ****
  	    rxkad_GetServerInfo(acall->conn, NULL, &exp, tname, tinst, tcell,
  				NULL);
  	if (code) {
! 	    UNLOCK_GLOBAL_MUTEX return 0;	/* bogus connection/other error */
  	}
  
  	/* don't bother checking anything else if tix have expired */
--- 410,417 ----
  	    rxkad_GetServerInfo(acall->conn, NULL, &exp, tname, tinst, tcell,
  				NULL);
  	if (code) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return 0;		/* bogus connection/other error */
  	}
  
  	/* don't bother checking anything else if tix have expired */
***************
*** 397,403 ****
  #else
  	if (exp < FT_ApproxTime()) {
  #endif
! 	    UNLOCK_GLOBAL_MUTEX return 0;	/* expired tix */
  	}
  
  	/* generate lowercased version of cell name */
--- 420,427 ----
  #else
  	if (exp < FT_ApproxTime()) {
  #endif
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return 0;		/* expired tix */
  	}
  
  	/* generate lowercased version of cell name */
***************
*** 467,474 ****
  
  	if (namep)
  	    strcpy(namep, uname);
! 	UNLOCK_GLOBAL_MUTEX return flag;
      } else {			/* some other auth type */
! 	UNLOCK_GLOBAL_MUTEX return 0;	/* mysterious, just say no */
      }
  }
--- 491,500 ----
  
  	if (namep)
  	    strcpy(namep, uname);
! 	UNLOCK_GLOBAL_MUTEX;
! 	return flag;
      } else {			/* some other auth type */
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 0;		/* mysterious, just say no */
      }
  }
Index: openafs/src/auth/writeconfig.c
diff -c openafs/src/auth/writeconfig.c:1.10 openafs/src/auth/writeconfig.c:1.10.2.1
*** openafs/src/auth/writeconfig.c:1.10	Sun Dec  7 17:49:17 2003
--- openafs/src/auth/writeconfig.c	Wed Aug 25 03:09:36 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/auth/writeconfig.c,v 1.10 2003/12/07 22:49:17 jaltman Exp $");
  
  #include <afs/pthread_glock.h>
  #include <afs/afsutil.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/auth/writeconfig.c,v 1.10.2.1 2004/08/25 07:09:36 shadow Exp $");
  
  #include <afs/pthread_glock.h>
  #include <afs/afsutil.h>
***************
*** 115,149 ****
      register FILE *tf;
      register afs_int32 i;
  
!     LOCK_GLOBAL_MUTEX
! 	/* write ThisCell file */
! 	strcompose(tbuffer, 1024, apath, "/", AFSDIR_THISCELL_FILE, NULL);
  
      fd = open(tbuffer, O_RDWR | O_CREAT | O_TRUNC, 0666);
      if (fd < 0) {
! 	UNLOCK_GLOBAL_MUTEX return errno;
      }
      i = strlen(acellInfo->name);
      code = write(fd, acellInfo->name, i);
      if (code != i) {
! 	UNLOCK_GLOBAL_MUTEX return AFSCONF_FAILURE;
      }
      if (close(fd) < 0) {
! 	UNLOCK_GLOBAL_MUTEX return errno;
      }
  
      /* make sure we have both name and address for each host, looking up other
       * if need be */
      code = VerifyEntries(acellInfo);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
  
      /* write CellServDB */
      strcompose(tbuffer, 1024, apath, "/", AFSDIR_CELLSERVDB_FILE, NULL);
      tf = fopen(tbuffer, "w");
      if (!tf) {
! 	UNLOCK_GLOBAL_MUTEX return AFSCONF_NOTFOUND;
      }
      fprintf(tf, ">%s	#Cell name\n", acellInfo->name);
      for (i = 0; i < acellInfo->numServers; i++) {
--- 115,154 ----
      register FILE *tf;
      register afs_int32 i;
  
!     LOCK_GLOBAL_MUTEX;
!     /* write ThisCell file */
!     strcompose(tbuffer, 1024, apath, "/", AFSDIR_THISCELL_FILE, NULL);
  
      fd = open(tbuffer, O_RDWR | O_CREAT | O_TRUNC, 0666);
      if (fd < 0) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return errno;
      }
      i = strlen(acellInfo->name);
      code = write(fd, acellInfo->name, i);
      if (code != i) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return AFSCONF_FAILURE;
      }
      if (close(fd) < 0) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return errno;
      }
  
      /* make sure we have both name and address for each host, looking up other
       * if need be */
      code = VerifyEntries(acellInfo);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
  
      /* write CellServDB */
      strcompose(tbuffer, 1024, apath, "/", AFSDIR_CELLSERVDB_FILE, NULL);
      tf = fopen(tbuffer, "w");
      if (!tf) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return AFSCONF_NOTFOUND;
      }
      fprintf(tf, ">%s	#Cell name\n", acellInfo->name);
      for (i = 0; i < acellInfo->numServers; i++) {
***************
*** 162,168 ****
      }
      if (ferror(tf)) {
  	fclose(tf);
! 	UNLOCK_GLOBAL_MUTEX return AFSCONF_FAILURE;
      }
      code = fclose(tf);
  
--- 167,174 ----
      }
      if (ferror(tf)) {
  	fclose(tf);
! 	UNLOCK_GLOBAL_MUTEX;
! 	return AFSCONF_FAILURE;
      }
      code = fclose(tf);
  
***************
*** 173,179 ****
      if (adir)
  	adir->timeRead = 0;
  
!     UNLOCK_GLOBAL_MUTEX if (code == EOF)
  	return AFSCONF_FAILURE;
      return 0;
  }
--- 179,186 ----
      if (adir)
  	adir->timeRead = 0;
  
!     UNLOCK_GLOBAL_MUTEX;
!     if (code == EOF)
  	return AFSCONF_FAILURE;
      return 0;
  }
Index: openafs/src/bozo/bos.c
diff -c openafs/src/bozo/bos.c:1.20 openafs/src/bozo/bos.c:1.20.2.1
*** openafs/src/bozo/bos.c:1.20	Sun Dec  7 17:49:18 2003
--- openafs/src/bozo/bos.c	Wed Aug 25 03:03:36 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bozo/bos.c,v 1.20 2003/12/07 22:49:18 jaltman Exp $");
  
  #include <afs/stds.h>
  #include <stdlib.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bozo/bos.c,v 1.20.2.1 2004/08/25 07:03:36 shadow Exp $");
  
  #include <afs/stds.h>
  #include <stdlib.h>
***************
*** 145,151 ****
  {
      static char tbuffer[30];
      register char *tp;
!     tp = ctime((time_t *) & atime);
      if (tp) {
  	strcpy(tbuffer, tp);
  	tbuffer[24] = 0;	/* get rid of new line */
--- 145,152 ----
  {
      static char tbuffer[30];
      register char *tp;
!     time_t t = (time_t) atime;
!     tp = ctime(&t);
      if (tp) {
  	strcpy(tbuffer, tp);
  	tbuffer[24] = 0;	/* get rid of new line */
Index: openafs/src/butc/butc_xbsa.h
diff -c openafs/src/butc/butc_xbsa.h:1.4 openafs/src/butc/butc_xbsa.h:1.4.2.1
*** openafs/src/butc/butc_xbsa.h:1.4	Tue Jul 15 19:14:48 2003
--- openafs/src/butc/butc_xbsa.h	Wed Aug 25 03:12:37 2004
***************
*** 123,126 ****
--- 123,148 ----
  				   char *objectSpaceName, char *pathName);
  
  #endif /*xbsa */
+ 
+ 
+ /* XBSA Global Parameters */
+ 
+ #ifdef XBSA_TCMAIN
+ #define XBSA_EXT
+ #else
+ #define XBSA_EXT extern
+ #endif
+ 
+ XBSA_EXT afs_int32 xbsaType;
+ #ifdef xbsa
+ XBSA_EXT struct butx_transactionInfo butxInfo;
+ 
+ #define rpc_c_protect_level_default 0
+ XBSA_EXT afs_uint32 dumpRestAuthnLevel;
+ XBSA_EXT char *xbsaObjectOwner;
+ XBSA_EXT char *appObjectOwner;
+ XBSA_EXT char *adsmServerName;
+ XBSA_EXT char *xbsaSecToken;
+ XBSA_EXT char *xbsalGName;
+ #endif /*xbsa*/
  #endif /* OPENAFS_BUTC_XBSA_H */
Index: openafs/src/butc/tcmain.c
diff -c openafs/src/butc/tcmain.c:1.14 openafs/src/butc/tcmain.c:1.14.2.1
*** openafs/src/butc/tcmain.c:1.14	Sat Nov 29 16:37:56 2003
--- openafs/src/butc/tcmain.c	Wed Aug 25 03:12:37 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/tcmain.c,v 1.14 2003/11/29 21:37:56 jaltman Exp $");
  
  #include <sys/types.h>
  #include <sys/stat.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/tcmain.c,v 1.14.2.1 2004/08/25 07:12:37 shadow Exp $");
  
  #include <sys/types.h>
  #include <sys/stat.h>
***************
*** 55,60 ****
--- 55,61 ----
  #include "error_macros.h"
  #include <afs/budb_errs.h>
  #include "afs/butx.h"
+ #define XBSA_TCMAIN
  #include "butc_xbsa.h"
  
  #define N_SECURITY_OBJECTS 3
***************
*** 92,111 ****
  char *restoretofile;
  int forcemultiple;
  
- /* XBSA Global Parameters */
- afs_int32 xbsaType;
- #ifdef xbsa
- struct butx_transactionInfo butxInfo;
- 
- #define rpc_c_protect_level_default 0
- afs_uint32 dumpRestAuthnLevel = rpc_c_protect_level_default;
- char *xbsaObjectOwner;
- char *appObjectOwner;
- char *adsmServerName;
- char *xbsaSecToken;
- char *xbsalGName;
- #endif
- 
  int maxpass;
  #define PASSESMIN  1
  #define PASSESMAX  10
--- 93,98 ----
Index: openafs/src/butc/tcprocs.c
diff -c openafs/src/butc/tcprocs.c:1.12 openafs/src/butc/tcprocs.c:1.12.2.1
*** openafs/src/butc/tcprocs.c:1.12	Tue Jul 13 01:52:46 2004
--- openafs/src/butc/tcprocs.c	Wed Aug 25 03:12:37 2004
***************
*** 13,19 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/tcprocs.c,v 1.12 2004/07/13 05:52:46 shadow Exp $");
  
  #include <sys/types.h>
  #include <errno.h>
--- 13,19 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/tcprocs.c,v 1.12.2.1 2004/08/25 07:12:37 shadow Exp $");
  
  #include <sys/types.h>
  #include <errno.h>
***************
*** 51,70 ****
      return 1;
  }
  
- /* XBSA Global Parameters */
- afs_int32 xbsaType;
- #ifdef xbsa
- struct butx_transactionInfo butxInfo;
- 
- #define rpc_c_protect_level_default 0
- afs_uint32 dumpRestAuthnLevel = rpc_c_protect_level_default;
- char *xbsaObjectOwner;
- char *appObjectOwner;
- char *adsmServerName;
- char *xbsaSecToken;
- char *xbsalGName;
- #endif
- 
  /* -------------------------
   * butc - interface routines - alphabetic order
   * -------------------------
--- 51,56 ----
Index: openafs/src/cf/osconf.m4
diff -c openafs/src/cf/osconf.m4:1.51.2.1 openafs/src/cf/osconf.m4:1.51.2.3
*** openafs/src/cf/osconf.m4:1.51.2.1	Mon Aug  9 05:19:26 2004
--- openafs/src/cf/osconf.m4	Wed Aug 25 03:15:37 2004
***************
*** 421,426 ****
--- 421,427 ----
  		AIX64="#"
  		;;
  
+ 
  	rs_aix51)
  		DBG=""
  		LEX="lex"
***************
*** 436,445 ****
  		AIX64=""
  		;;
  
  	s390_linux22)
  		CC="gcc"
  		CCOBJ="gcc"
! 		LD="gcc"
  		KERN_OPTMZ=-O2
  		LEX="flex -l"
  		MT_CC="$CC"
--- 437,460 ----
  		AIX64=""
  		;;
  
+ 	rs_aix52)	
+ 		DBG=""
+ 		LEX="lex"
+ 		LIBSYS_AIX_EXP="afsl.exp"
+ 		MT_CC="xlc_r"
+ 		MT_CFLAGS='-DAFS_PTHREAD_ENV ${XCFLAGS}'
+ 		MT_LIBS="-lpthreads"
+ 		SHLIB_SUFFIX="o"
+ 		TXLIBS="-lcurses"
+ 		XCFLAGS="-K -D_NO_PROTO -D_NONSTD_TYPES -D_MBI=void"
+ 		XLIBS="${LIB_AFSDB} -ldl"
+ 		SHLIB_LINKER="${MT_CC} -bM:SRE -berok"
+ 		AIX64=""
+ 		;;
  	s390_linux22)
  		CC="gcc"
  		CCOBJ="gcc"
! 		LD="ld"
  		KERN_OPTMZ=-O2
  		LEX="flex -l"
  		MT_CC="$CC"
***************
*** 456,462 ****
  	s390_linux24)
  		CC="gcc"
  		CCOBJ="gcc"
! 		LD="gcc"
  		KERN_OPTMZ=-O2
  		LEX="flex -l"
  		MT_CC="$CC"
--- 471,477 ----
  	s390_linux24)
  		CC="gcc"
  		CCOBJ="gcc"
! 		LD="ld"
  		KERN_OPTMZ=-O2
  		LEX="flex -l"
  		MT_CC="$CC"
***************
*** 470,475 ****
--- 485,507 ----
  		SHLIB_LINKER="${MT_CC} -shared"
  		;;
  
+ 	s390x_linux24)
+ 		CC="gcc"
+ 		CCOBJ="gcc"
+ 		LD="ld"
+ 		KERN_OPTMZ=-O2
+ 		LEX="flex -l"
+ 		MT_CC="$CC"
+ 		MT_CFLAGS='-DAFS_PTHREAD_ENV -pthread -D_REENTRANT ${XCFLAGS}'
+ 		MT_LIBS="-lpthread"
+ 		PAM_CFLAGS="-O -Dlinux -DLINUX_PAM -fPIC"
+ 		SHLIB_LDFLAGS="-shared -Xlinker -x"
+ 		TXLIBS="-lncurses"
+ 		XCFLAGS="-O -g -D_LARGEFILE64_SOURCE -D__s390x__"
+ 		YACC="bison -y"
+ 		SHLIB_LINKER="${MT_CC} -shared"
+ 		;;
+ 
  	sgi_62)
  		PINSTALL_LIBS=-lmld
  		AFSD_LIBS="/usr/lib/libdwarf.a /usr/lib/libelf.a"
Index: openafs/src/comerr/error_msg.c
diff -c openafs/src/comerr/error_msg.c:1.5 openafs/src/comerr/error_msg.c:1.5.2.1
*** openafs/src/comerr/error_msg.c:1.5	Tue Jul 15 19:14:53 2003
--- openafs/src/comerr/error_msg.c	Wed Aug 25 03:09:36 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/comerr/error_msg.c,v 1.5 2003/07/15 23:14:53 shadow Exp $");
  
  #include "internal.h"
  #include <stdio.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/comerr/error_msg.c,v 1.5.2.1 2004/08/25 07:09:36 shadow Exp $");
  
  #include "internal.h"
  #include <stdio.h>
***************
*** 54,62 ****
  }
  
  #define LOCK_ET_LIST \
! 	(et_list_done || pthread_once(&et_list_once, et_mutex_once)); \
! 	assert(pthread_mutex_lock(&et_list_mutex)==0);
! #define UNLOCK_ET_LIST assert(pthread_mutex_unlock(&et_list_mutex)==0);
  #else
  #define LOCK_ET_LIST
  #define UNLOCK_ET_LIST
--- 54,64 ----
  }
  
  #define LOCK_ET_LIST \
! 	do { \
! 	    (et_list_done || pthread_once(&et_list_once, et_mutex_once)); \
! 	    assert(pthread_mutex_lock(&et_list_mutex)==0); \
! 	} while (0)
! #define UNLOCK_ET_LIST assert(pthread_mutex_unlock(&et_list_mutex)==0)
  #else
  #define LOCK_ET_LIST
  #define UNLOCK_ET_LIST
***************
*** 131,146 ****
  	else
  	    goto oops;
      }
!     LOCK_ET_LIST for (et = _et_list; et; et = et->next) {
  	if (et->table->base == table_num) {
  	    /* This is the right table */
  	    if (et->table->n_msgs <= offset)
  		goto oops;
! 	    UNLOCK_ET_LIST return (et->table->msgs[offset]);
  	}
      }
    oops:
!     UNLOCK_ET_LIST strcpy(buffer, "Unknown code ");
      if (table_num) {
  	strcat(buffer, error_table_name(table_num));
  	strcat(buffer, " ");
--- 133,151 ----
  	else
  	    goto oops;
      }
!     LOCK_ET_LIST;
!     for (et = _et_list; et; et = et->next) {
  	if (et->table->base == table_num) {
  	    /* This is the right table */
  	    if (et->table->n_msgs <= offset)
  		goto oops;
! 	    UNLOCK_ET_LIST;
! 	    return (et->table->msgs[offset]);
  	}
      }
    oops:
!     UNLOCK_ET_LIST;
!     strcpy(buffer, "Unknown code ");
      if (table_num) {
  	strcat(buffer, error_table_name(table_num));
  	strcat(buffer, " ");
***************
*** 168,183 ****
  {
      struct et_list *et;
  
!     LOCK_ET_LIST
! 	/*
! 	 * Protect against adding the same error table twice
! 	 */
! 	for (et = _et_list; et; et = et->next) {
  	if (et->table->base == new_table->table->base) {
! 	    UNLOCK_ET_LIST return;
  	}
      }
  
      new_table->next = _et_list;
      _et_list = new_table;
! UNLOCK_ET_LIST}
--- 173,190 ----
  {
      struct et_list *et;
  
!     LOCK_ET_LIST;
!     /*
!      * Protect against adding the same error table twice
!      */
!     for (et = _et_list; et; et = et->next) {
  	if (et->table->base == new_table->table->base) {
! 	    UNLOCK_ET_LIST;
! 	    return;
  	}
      }
  
      new_table->next = _et_list;
      _et_list = new_table;
!     UNLOCK_ET_LIST;
! }
Index: openafs/src/config/NTMakefile.i386_nt40
diff -c openafs/src/config/NTMakefile.i386_nt40:1.46.2.1 openafs/src/config/NTMakefile.i386_nt40:1.46.2.5
*** openafs/src/config/NTMakefile.i386_nt40:1.46.2.1	Mon Aug  9 16:57:08 2004
--- openafs/src/config/NTMakefile.i386_nt40	Tue Aug 24 03:10:19 2004
***************
*** 28,34 ****
  #
  ####### Special optional defines
  
! !IFNDEF NO_CRTDBG		#don't set _CRTDBG_MAP_ALLOC flag for some module compliations
  #_CRTDBG_MAP_ALLOC=1
  !ENDIF
  
--- 28,35 ----
  #
  ####### Special optional defines
  
! !IFNDEF NO_CRTDBG		
! #don't set _CRTDBG_MAP_ALLOC flag for some module compliations
  #_CRTDBG_MAP_ALLOC=1
  !ENDIF
  
***************
*** 79,86 ****
  #define used in WinNT/2000 installation and program version display
  AFSPRODUCT_VER_MAJOR=1
  AFSPRODUCT_VER_MINOR=3
! AFSPRODUCT_VER_PATCH=7000
  AFSPRODUCT_VER_BUILD=0
  AFSPRODUCT_VERSION=$(AFSPRODUCT_VER_MAJOR).$(AFSPRODUCT_VER_MINOR).$(AFSPRODUCT_VER_PATCH)
  AFSPRODUCT_FILE_VERSION=$(AFSPRODUCT_VER_MAJOR),$(AFSPRODUCT_VER_MINOR),$(AFSPRODUCT_VER_PATCH),$(AFSPRODUCT_VER_BUILD)
  # Set CELLNAME_DEFAULT to "your cell name"
--- 80,92 ----
  #define used in WinNT/2000 installation and program version display
  AFSPRODUCT_VER_MAJOR=1
  AFSPRODUCT_VER_MINOR=3
! AFSPRODUCT_VER_PATCH=7100
  AFSPRODUCT_VER_BUILD=0
+ 
+ # For MSI installer, each major release should have a different GUID
+ # http://msdn.microsoft.com/library/en-us/msi/setup/changing_the_product_code.asp
+ AFSPRODUCT_VER_GUID=CCAF9E14-976E-46C0-8A1B-A218EAB7ADC5
+ 
  AFSPRODUCT_VERSION=$(AFSPRODUCT_VER_MAJOR).$(AFSPRODUCT_VER_MINOR).$(AFSPRODUCT_VER_PATCH)
  AFSPRODUCT_FILE_VERSION=$(AFSPRODUCT_VER_MAJOR),$(AFSPRODUCT_VER_MINOR),$(AFSPRODUCT_VER_PATCH),$(AFSPRODUCT_VER_BUILD)
  # Set CELLNAME_DEFAULT to "your cell name"
***************
*** 89,95 ****
  CELLSERVDB_WEB=http://grand.central.org/dl/cellservdb/CellServDB
  TARGETOS = WINNT
  
! #		Define defaults folder locations
  DEST=dest
  SRC=src
  OBJ=obj
--- 95,101 ----
  CELLSERVDB_WEB=http://grand.central.org/dl/cellservdb/CellServDB
  TARGETOS = WINNT
  
! # Define defaults folder locations
  DEST=dest
  SRC=src
  OBJ=obj
***************
*** 244,249 ****
--- 250,256 ----
  
  !IF ("$(AFSVER_CL)"!="1200")
  afscdefs = $(afscdefs) /GT /GS
+ #/Wp64
  !IF ("$(AFSVER_CL)"!="1400")
  afscdefs = $(afscdefs) /G7
  !ENDIF
Index: openafs/src/config/afs_sysnames.h
diff -c openafs/src/config/afs_sysnames.h:1.50 openafs/src/config/afs_sysnames.h:1.50.2.1
*** openafs/src/config/afs_sysnames.h:1.50	Tue Jul 27 10:39:31 2004
--- openafs/src/config/afs_sysnames.h	Wed Aug 25 03:03:38 2004
***************
*** 150,155 ****
--- 150,158 ----
  #define SYS_NAME_ID_s390_linux2         1900
  #define SYS_NAME_ID_s390_linux22        1901
  #define SYS_NAME_ID_s390_linux24        1902
+ #define SYS_NAME_ID_s390x_linux2         1903
+ #define SYS_NAME_ID_s390x_linux22        1904
+ #define SYS_NAME_ID_s390x_linux24        1905
  
  #define SYS_NAME_ID_alpha_linux_2       2000
  #define SYS_NAME_ID_alpha_linux_22      2001
Index: openafs/src/config/make_libafs_tree.pl
diff -c openafs/src/config/make_libafs_tree.pl:1.1 openafs/src/config/make_libafs_tree.pl:1.1.2.1
*** openafs/src/config/make_libafs_tree.pl:1.1	Tue Oct 15 23:58:31 2002
--- openafs/src/config/make_libafs_tree.pl	Wed Aug 25 03:03:38 2004
***************
*** 96,102 ****
  	$subdir =~ s|/$||gio;
  
  	print "# $dir/$depname\n";
! 	open(COMPS, "$dir/$depname");
  	while ( defined($file = <COMPS>) )
  	{
  		my ($destdir, $proj_src,$obj_src);
--- 96,102 ----
  	$subdir =~ s|/$||gio;
  
  	print "# $dir/$depname\n";
! 	open(COMPS, "$depname");
  	while ( defined($file = <COMPS>) )
  	{
  		my ($destdir, $proj_src,$obj_src);
Index: openafs/src/config/param.i386_nbsd20.h
diff -c openafs/src/config/param.i386_nbsd20.h:1.4 openafs/src/config/param.i386_nbsd20.h:1.4.2.1
*** openafs/src/config/param.i386_nbsd20.h:1.4	Mon Aug  9 00:07:33 2004
--- openafs/src/config/param.i386_nbsd20.h	Wed Aug 25 03:39:30 2004
***************
*** 1,88 ****
! #ifndef UKERNEL
! /* This section for kernel libafs compiles only */
! 
! #ifndef	AFS_PARAM_H
! #define	AFS_PARAM_H
! 
! #ifndef IGNORE_STDS_H
! #include <sys/param.h>
! #endif
  
  #define AFS_X86_XBSD_ENV 1
- 
  #define AFS_X86_ENV 1
  
  #define SYS_NAME       "i386_nbsd20"
  #define SYS_NAME_ID    SYS_NAME_ID_i386_nbsd20
  
! #define AFSLITTLE_ENDIAN 1
! 
! #endif /* AFS_PARAM_H */
  
  #else /* !defined(UKERNEL) */
  
  /* This section for user space compiles only */
  
! #ifndef AFS_PARAM_H
! #define AFS_PARAM_H
! 
! 
! #define UKERNEL			1	/* user space kernel */
! #define AFS_ENV			1
! #define AFS_VFSINCL_ENV         1
! #define AFS_NBSD_ENV	        1
! #define AFS_NBSD15_ENV	        1
! #define AFS_NBSD16_ENV	        1
! #define AFS_NBSD20_ENV	        1
! #define AFS_NONFSTRANS 1
! #define AFS_KERBEROS_ENV
! 
! #define AFS_MOUNT_AFS "afs"	/* The name of the filesystem type. */
! #define AFS_SYSCALL 210
! #define AFS_NAMEI_ENV         1	/* User space interface to file system */
! #define AFS_64BIT_ENV         1
! #define AFS_64BIT_CLIENT      1
! #define AFS_64BIT_IOPS_ENV    1	/* Needed for NAMEI */
! #include <afs/afs_sysnames.h>
! 
! #define AFS_USERSPACE_IP_ADDR 1
! #define RXK_LISTENER_ENV      1
! #define AFS_GCPAGS	      0	/* if nonzero, garbage collect PAGs */
! 
! /* Machine / Operating system information */
! #define SYS_NAME       "i386_nbsd16"
! #define SYS_NAME_ID    SYS_NAME_ID_i386_nbsd16
! #define AFSLITTLE_ENDIAN    1
! #define AFS_HAVE_FFS        1	/* Use system's ffs. */
! #define AFS_HAVE_STATVFS    0	/* System doesn't support statvfs */
! #define AFS_VM_RDWR_ENV	    1	/* read/write implemented via VM */
! 
! #define	afsio_iov	uio_iov
! #define	afsio_iovcnt	uio_iovcnt
! #define	afsio_offset	uio_offset
! #define	afsio_seg	uio_segflg
! #define	afsio_fmode	uio_fmode
! #define	afsio_resid	uio_resid
! #define	AFS_UIOSYS	1
! #define	AFS_UIOUSER	UIO_USERSPACE
! #define	AFS_CLBYTES	MCLBYTES
! #define	AFS_MINCHANGE	2
! #define	VATTR_NULL	usr_vattr_null
! 
! #define AFS_DIRENT
! #ifndef CMSERVERPREF
! #define CMSERVERPREF
! #endif
! 
! #include <limits.h>
! #include <sys/param.h>
! #include <sys/types.h>
! #include <sys/mount.h>
! #include <sys/fcntl.h>
! #include <netinet/in.h>
! #include <sys/uio.h>
! #include <sys/socket.h>
  
! #endif /* AFS_PARAM_H */
  
- #endif /* !defined(UKERNEL) */
--- 1,21 ----
! #ifndef	AFS_I386_PARAM_H
! #define	AFS_I386_PARAM_H
  
  #define AFS_X86_XBSD_ENV 1
  #define AFS_X86_ENV 1
+ #define AFSLITTLE_ENDIAN 1
  
  #define SYS_NAME       "i386_nbsd20"
  #define SYS_NAME_ID    SYS_NAME_ID_i386_nbsd20
  
! #ifndef UKERNEL
! /* This section for kernel libafs compiles only */
  
  #else /* !defined(UKERNEL) */
  
  /* This section for user space compiles only */
  
! #endif /* !defined(UKERNEL) */
  
! #endif /* AFS_I386_PARAM_H */
  
Index: openafs/src/config/param.nbsd20.h
diff -c openafs/src/config/param.nbsd20.h:1.5 openafs/src/config/param.nbsd20.h:1.5.2.1
*** openafs/src/config/param.nbsd20.h:1.5	Fri Aug  6 17:48:32 2004
--- openafs/src/config/param.nbsd20.h	Wed Aug 25 03:39:30 2004
***************
*** 1,25 ****
! #ifndef UKERNEL
! /* This section for kernel libafs compiles only */
! 
  
  #ifndef	AFS_PARAM_COMMON_H
! #define	AFS_PARAM_COMMON_H
  
! #ifndef ASSEMBLER
! #include <sys/param.h>
  #endif
  
  #define AFS_XBSD_ENV 1		/* {Free,Open,Net}BSD */
  
- #define AFS_64BIT_ENV  1
- #define AFS_NAMEI_ENV     1	/* User space interface to file system */
- #define AFS_64BIT_IOPS_ENV 1	/* Needed for NAMEI */
  #define AFS_NBSD_ENV 1
  #define AFS_NBSD15_ENV 1
  #define AFS_NBSD16_ENV 1
  #define AFS_NBSD20_ENV 1
  #define AFS_NONFSTRANS 1
  #define AFS_KERBEROS_ENV 1
  #define FTRUNC O_TRUNC
  
  #define IUPD 0x0010
--- 1,47 ----
! /* NetBSD shared section */
  
  #ifndef	AFS_PARAM_COMMON_H
! #define	AFS_PARAM_COMMON_H 1
  
! #define AFS_64BIT_ENV  1
! #define AFS_NAMEI_ENV  1	/* User space interface to file system */
! #define AFS_64BIT_IOPS_ENV 1	/* Needed for NAMEI */
! #define AFS_64BIT_CLIENT 1
! 
! #define AFS_MOUNT_AFS "afs"	/* The name of the filesystem type. */
! #define AFS_SYSCALL 210
! 
! #ifndef	MOUNT_AFS
! #define	MOUNT_AFS AFS_MOUNT_AFS
  #endif
  
  #define AFS_XBSD_ENV 1		/* {Free,Open,Net}BSD */
  
  #define AFS_NBSD_ENV 1
  #define AFS_NBSD15_ENV 1
  #define AFS_NBSD16_ENV 1
  #define AFS_NBSD20_ENV 1
  #define AFS_NONFSTRANS 1
  #define AFS_KERBEROS_ENV 1
+ 
+ #define AFS_VFSINCL_ENV 1
+ 
+ #define AFS_HAVE_FFS            1	/* Use system's ffs. */
+ 
+ #if	!defined(ASSEMBLER) && !defined(__LANGUAGE_ASSEMBLY__) && !defined(IGNORE_STDS_H)
+ #if __NetBSD_Version__ >= 200040000
+ #define AFS_HAVE_STATVFS    1	/* System supports statvfs */
+ #else
+ #define AFS_HAVE_STATVFS    0	/* System doesn't supports statvfs */
+ #endif
+ #endif
+ 
+ #ifndef UKERNEL
+ 
+ #if	!defined(ASSEMBLER) && !defined(__LANGUAGE_ASSEMBLY__) && !defined(IGNORE_STDS_H)
+ #include <sys/param.h>
+ #endif
+ 
  #define FTRUNC O_TRUNC
  
  #define IUPD 0x0010
***************
*** 36,59 ****
  
  #define AFS_VM_RDWR_ENV	1
  #define AFS_VFS_ENV	1
- #define AFS_VFSINCL_ENV 1
  #define AFS_GREEDY43_ENV	1
- #define AFS_ENV  	1
- 
- #define AFS_MOUNT_AFS	"afs"
- #define AFS_SYSCALL 210
- 
- 
- #ifndef MOUNT_UFS
- #define MOUNT_UFS "ufs"
- #endif
- 
- #ifndef	MOUNT_AFS
- #define	MOUNT_AFS AFS_MOUNT_AFS
- #endif
- 
- #define AFS_HAVE_FFS            1	/* Use system's ffs. */
- #define AFS_HAVE_STATVFS	0	/* System supports statvfs */
  
  #define AFS_GCPAGS	        0	/* if nonzero, garbage collect PAGs */
  #define AFS_USE_GETTIMEOFDAY    1	/* use gettimeofday to implement rx clock */
--- 58,64 ----
***************
*** 96,102 ****
  #define	VN_RELE(vp)	vrele(((struct vnode *)(vp)))
  #define	VN_HOLD(vp)	VREF(((struct vnode *)(vp)))
  
! #if	!defined(ASSEMBLER) && !defined(__LANGUAGE_ASSEMBLY__)
  enum vcexcl { NONEXCL, EXCL };
  
  #ifdef KERNEL
--- 101,107 ----
  #define	VN_RELE(vp)	vrele(((struct vnode *)(vp)))
  #define	VN_HOLD(vp)	VREF(((struct vnode *)(vp)))
  
! #if	!defined(ASSEMBLER) && !defined(__LANGUAGE_ASSEMBLY__) && !defined(IGNORE_STDS_H)
  enum vcexcl { NONEXCL, EXCL };
  
  #ifdef KERNEL
***************
*** 108,121 ****
  #endif
  #endif /* KERNEL */
  
! #endif /* ! ASSEMBLER & ! __LANGUAGE_ASSEMBLY__ */
  #endif /* _KERNEL */
  
- #endif /* AFS_PARAM_COMMON_H */
- 
  #else /* !defined(UKERNEL) */
  
  /* This section for user space compiles only */
  
  
  #endif /* !defined(UKERNEL) */
--- 113,162 ----
  #endif
  #endif /* KERNEL */
  
! #endif /* ! ASSEMBLER & ! __LANGUAGE_ASSEMBLY__ && !defined(IGNORE_STDS_H) */ 
  #endif /* _KERNEL */
  
  #else /* !defined(UKERNEL) */
  
+ 
  /* This section for user space compiles only */
  
+ #define UKERNEL			1	/* user space kernel */
+ 
+ #include <afs/afs_sysnames.h>
+ 
+ #define AFS_USERSPACE_IP_ADDR 1
+ #define RXK_LISTENER_ENV      1
+ #define AFS_GCPAGS	      0	/* if nonzero, garbage collect PAGs */
+ 
+ #define	afsio_iov	uio_iov
+ #define	afsio_iovcnt	uio_iovcnt
+ #define	afsio_offset	uio_offset
+ #define	afsio_seg	uio_segflg
+ #define	afsio_fmode	uio_fmode
+ #define	afsio_resid	uio_resid
+ #define	AFS_UIOSYS	UIO_SYSSPACE
+ #define	AFS_UIOUSER	UIO_USERSPACE
+ #define	AFS_CLBYTES	MCLBYTES
+ #define	AFS_MINCHANGE	2
+ #define	VATTR_NULL	usr_vattr_null
+ 
+ #define AFS_DIRENT
+ #ifndef CMSERVERPREF
+ #define CMSERVERPREF
+ #endif
+ 
+ #if	!defined(ASSEMBLER) && !defined(__LANGUAGE_ASSEMBLY__) && !defined(IGNORE_STDS_H)
+ #include <limits.h>
+ #include <sys/param.h>
+ #include <sys/types.h>
+ #include <sys/mount.h>
+ #include <sys/fcntl.h>
+ #include <netinet/in.h>
+ #include <sys/uio.h>
+ #include <sys/socket.h>
+ #endif
  
  #endif /* !defined(UKERNEL) */
+ 
+ #endif /* AFS_PARAM_COMMON_H */
Index: openafs/src/config/param.ppc_nbsd20.h
diff -c openafs/src/config/param.ppc_nbsd20.h:1.2 openafs/src/config/param.ppc_nbsd20.h:1.2.2.1
*** openafs/src/config/param.ppc_nbsd20.h:1.2	Tue Jul 15 19:14:56 2003
--- openafs/src/config/param.ppc_nbsd20.h	Wed Aug 25 03:39:30 2004
***************
*** 1,10 ****
! #ifndef UKERNEL
! /* This section for kernel libafs compiles only */
! 
! #ifndef	AFS_PARAM_H
! #define	AFS_PARAM_H
! 
! #include <sys/param.h>
  
  #define SYS_NAME       "macppc_nbsd20"
  #define SYS_NAME_ID    SYS_NAME_ID_macppc_nbsd20
--- 1,5 ----
! #ifndef	AFS_PPC_PARAM_H
! #define	AFS_PPC_PARAM_H
  
  #define SYS_NAME       "macppc_nbsd20"
  #define SYS_NAME_ID    SYS_NAME_ID_macppc_nbsd20
***************
*** 12,81 ****
  #define AFS_PPC_ENV 1
  #define AFSBIG_ENDIAN   1
  
! #endif /* AFS_PARAM_H */
! 
! #else /* !defined(UKERNEL) */
! 
! /* This section for user space compiles only */
! 
! #ifndef AFS_PARAM_H
! #define AFS_PARAM_H
! 
! 
! #define UKERNEL			1	/* user space kernel */
! #define AFS_ENV			1
! #define AFS_VFSINCL_ENV         1
! #define AFS_NBSD_ENV	        1
! #define AFS_NBSD15_ENV	        1
! #define AFS_NBSD16_ENV	        1
! #define AFS_NBSD20_ENV	        1
! #define AFS_NONFSTRANS 1
! #define AFS_KERBEROS_ENV
! 
! #define AFS_MOUNT_AFS "afs"	/* The name of the filesystem type. */
! #define AFS_SYSCALL 210
! #define AFS_NAMEI_ENV         1	/* User space interface to file system */
! #define AFS_64BIT_IOPS_ENV    1	/* Needed for NAMEI */
! #include <afs/afs_sysnames.h>
! 
! #define AFS_USERSPACE_IP_ADDR 1
! #define RXK_LISTENER_ENV      1
! #define AFS_GCPAGS	      0	/* if nonzero, garbage collect PAGs */
! 
! /* Machine / Operating system information */
! #define SYS_NAME       "i386_nbsd16"
! #define SYS_NAME_ID    SYS_NAME_ID_i386_nbsd16
! #define AFSLITTLE_ENDIAN    1
! #define AFS_HAVE_FFS        1	/* Use system's ffs. */
! #define AFS_HAVE_STATVFS    0	/* System doesn't support statvfs */
! #define AFS_VM_RDWR_ENV	    1	/* read/write implemented via VM */
! 
! #define	afsio_iov	uio_iov
! #define	afsio_iovcnt	uio_iovcnt
! #define	afsio_offset	uio_offset
! #define	afsio_seg	uio_segflg
! #define	afsio_fmode	uio_fmode
! #define	afsio_resid	uio_resid
! #define	AFS_UIOSYS	1
! #define	AFS_UIOUSER	UIO_USERSPACE
! #define	AFS_CLBYTES	MCLBYTES
! #define	AFS_MINCHANGE	2
! #define	VATTR_NULL	usr_vattr_null
! 
! #define AFS_DIRENT
! #ifndef CMSERVERPREF
! #define CMSERVERPREF
! #endif
! 
! #include <limits.h>
! #include <sys/param.h>
! #include <sys/types.h>
! #include <sys/mount.h>
! #include <sys/fcntl.h>
! #include <netinet/in.h>
! #include <sys/uio.h>
! #include <sys/socket.h>
! 
! #endif /* AFS_PARAM_H */
! 
! #endif /* !defined(UKERNEL) */
--- 7,10 ----
  #define AFS_PPC_ENV 1
  #define AFSBIG_ENDIAN   1
  
! #endif /* AFS_PCC_PARAM_H */
Index: openafs/src/config/param.s390x_linux24.h
diff -c /dev/null openafs/src/config/param.s390x_linux24.h:1.1.2.1
*** /dev/null	Wed Aug 25 03:47:55 2004
--- openafs/src/config/param.s390x_linux24.h	Wed Aug 25 03:03:38 2004
***************
*** 0 ****
--- 1,169 ----
+ #ifndef UKERNEL
+ /* This section for kernel libafs compiles only */
+ 
+ /*
+  * Copyright 2000, International Business Machines Corporation and others.
+  * All Rights Reserved.
+  * 
+  * This software has been released under the terms of the IBM Public
+  * License.  For details, see the LICENSE file in the top-level source
+  * directory or online at http://www.openafs.org/dl/license10.html
+  */
+ 
+ 
+ #ifndef AFS_PARAM_H
+ #define AFS_PARAM_H
+ 
+ /* In user space the AFS_LINUX20_ENV should be sufficient. In the kernel,
+  * it's a judgment call. If something is obviously s390 specific, use that
+  * #define instead. Note that "20" refers to the linux 2.0 kernel. The "2"
+  * in the sysname is the current version of the client. This takes into
+  * account the perferred OS user space configuration as well as the kernel.
+  */
+ 
+ #define AFS_LINUX20_ENV 1
+ #define AFS_LINUX22_ENV	1
+ #define AFS_LINUX24_ENV	1
+ #define AFS_S390_LINUX20_ENV    1
+ #define AFS_S390_LINUX22_ENV	1
+ #define AFS_S390_LINUX24_ENV	1
+ #define AFS_S390X_LINUX20_ENV    1
+ #define AFS_S390X_LINUX22_ENV	1
+ #define AFS_S390X_LINUX24_ENV	1
+ #define AFS_NONFSTRANS 1
+ 
+ #define AFS_MOUNT_AFS "afs"	/* The name of the filesystem type. */
+ #define AFS_SYSCALL 137
+ #define AFS_64BIT_ENV  1
+ #define AFS_64BITPOINTER_ENV  1
+ #define AFS_64BIT_CLIENT  1
+ #define AFS_64BIT_KERNEL  1
+ #define AFS_64BIT_IOPS_ENV  1
+ #define AFS_NAMEI_ENV     1	/* User space interface to file system */
+ 
+ #if defined(__KERNEL__) && !defined(KDUMP_KERNEL)
+ #include <linux/threads.h>
+ 
+ #include <linux/config.h>
+ #ifdef CONFIG_SMP
+ #undef CONFIG_SMP
+ #endif
+ /* Using "AFS_SMP" to map to however many #define's are required to get
+  * MP to compile for Linux
+  */
+ #ifdef AFS_SMP
+ #define CONFIG_SMP 1
+ #ifndef CONFIG_S390_LOCAL_APIC
+ #define CONFIG_S390_LOCAL_APIC 1
+ #endif
+ #ifndef __SMP__
+ #define __SMP__
+ #endif
+ #define AFS_GLOBAL_SUNLOCK
+ #endif
+ #if defined(MODULE) && defined(CONFIG_MODVERSIONS)
+ #define MODVERSIONS
+ #include <linux/modversions.h>
+ #endif
+ #endif /* __KERNEL__  && !DUMP_KERNEL */
+ 
+ #include <afs/afs_sysnames.h>
+ 
+ #define AFS_USERSPACE_IP_ADDR 1
+ #define RXK_LISTENER_ENV 1
+ #define AFS_GCPAGS       2	/* Set to Userdisabled, allow sysctl to override */
+ 
+ /* Machine / Operating system information */
+ #define SYS_NAME	"s390x_linux24"
+ #define SYS_NAME_ID	SYS_NAME_ID_s390x_linux24
+ #define AFSBIG_ENDIAN    1
+ #define AFS_HAVE_FFS        1	/* Use system's ffs. */
+ #define AFS_HAVE_STATVFS    0	/* System doesn't support statvfs */
+ #define AFS_VM_RDWR_ENV	    1	/* read/write implemented via VM */
+ 
+ #ifdef KERNEL
+ #ifndef MIN
+ #define MIN(A,B) ((A) < (B) ? (A) : (B))
+ #endif
+ #ifndef MAX
+ #define MAX(A,B) ((A) > (B) ? (A) : (B))
+ #endif
+ #endif /* KERNEL */
+ 
+ #endif /* AFS_PARAM_H */
+ 
+ #else /* !defined(UKERNEL) */
+ 
+ /* This section for user space compiles only */
+ 
+ /* 
+  * Copyright 2000, International Business Machines Corporation and others.
+  * All Rights Reserved.
+  * 
+  * This software has been released under the terms of the IBM Public
+  * License.  For details, see the LICENSE file in the top-level source
+  * directory or online at http://www.openafs.org/dl/license10.html
+  */
+ 
+ #ifndef AFS_PARAM_H
+ #define AFS_PARAM_H
+ 
+ /* In user space the AFS_LINUX20_ENV should be sufficient. In the kernel,
+  * it's a judgment call. If something is obviously s390 specific, use that
+  * #define instead. Note that "20" refers to the linux 2.0 kernel. The "2"
+  * in the sysname is the current version of the client. This takes into
+  * account the perferred OS user space configuration as well as the kernel.
+  */
+ 
+ #define UKERNEL			1	/* user space kernel */
+ #define AFS_ENV			1
+ #define AFS_USR_LINUX20_ENV     1
+ #define AFS_USR_LINUX22_ENV	1
+ #define AFS_USR_LINUX24_ENV	1
+ #define AFS_S390X_LINUX20_ENV    1
+ #define AFS_S390X_LINUX22_ENV	1
+ #define AFS_S390X_LINUX24_ENV	1
+ #define AFS_NONFSTRANS 1
+ 
+ #define AFS_MOUNT_AFS "afs"	/* The name of the filesystem type. */
+ #define AFS_SYSCALL 137
+ #define AFS_64BIT_ENV  1
+ #define AFS_64BIT_CLIENT  1
+ #define AFS_64BITPOINTER_ENV  1
+ #define AFS_64BIT_IOPS_ENV  1
+ #define AFS_NAMEI_ENV     1	/* User space interface to file system */
+ #include <afs/afs_sysnames.h>
+ 
+ #define AFS_USERSPACE_IP_ADDR 1
+ #define RXK_LISTENER_ENV 1
+ #define AFS_GCPAGS		0	/* if nonzero, garbage collect PAGs */
+ 
+ 
+ /* Machine / Operating system information */
+ #define SYS_NAME	"s390x_linux24"
+ #define SYS_NAME_ID	SYS_NAME_ID_s390x_linux24
+ #define AFSBIG_ENDIAN    1
+ #define AFS_HAVE_FFS        1	/* Use system's ffs. */
+ #define AFS_HAVE_STATVFS    0	/* System doesn't support statvfs */
+ #define AFS_VM_RDWR_ENV	    1	/* read/write implemented via VM */
+ 
+ #define	afsio_iov	uio_iov
+ #define	afsio_iovcnt	uio_iovcnt
+ #define	afsio_offset	uio_offset
+ #define	afsio_seg	uio_segflg
+ #define	afsio_fmode	uio_fmode
+ #define	afsio_resid	uio_resid
+ #define	AFS_UIOSYS	1
+ #define	AFS_UIOUSER	UIO_USERSPACE
+ #define	AFS_CLBYTES	MCLBYTES
+ #define	AFS_MINCHANGE	2
+ #define	VATTR_NULL	usr_vattr_null
+ 
+ #define AFS_DIRENT
+ #ifndef CMSERVERPREF
+ #define CMSERVERPREF
+ #endif
+ 
+ #endif /* AFS_PARAM_H */
+ 
+ #endif /* !defined(UKERNEL) */
Index: openafs/src/des/Makefile.in
diff -c openafs/src/des/Makefile.in:1.11 openafs/src/des/Makefile.in:1.11.2.1
*** openafs/src/des/Makefile.in:1.11	Tue Jun  1 22:38:32 2004
--- openafs/src/des/Makefile.in	Wed Aug 25 03:15:37 2004
***************
*** 85,90 ****
--- 85,97 ----
  make_s:	make_s.o misc.o main.o 
  	${CC} make_s.o misc.o main.o ${LDFLAGS} -o make_s
  
+ crypt.o: crypt.c
+ 	case ${SYS_NAME} in \
+ 	rs_aix*)\
+ 		${CC} -c ${COMMON_INCL} -o crypt.o crypt.c ;;\
+ 	*)\
+ 		${CC} -c ${CFLAGS} -o crypt.o crypt.c ;;\
+ 	esac
  #
  # Table/code generation targets
  #
Index: openafs/src/des/crypt.c
diff -c openafs/src/des/crypt.c:1.13 openafs/src/des/crypt.c:1.13.2.1
*** openafs/src/des/crypt.c:1.13	Tue Feb  3 01:23:37 2004
--- openafs/src/des/crypt.c	Wed Aug 25 03:03:38 2004
***************
*** 38,44 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/des/crypt.c,v 1.13 2004/02/03 06:23:37 shadow Exp $");
  
  #ifdef AFS_NT40_ENV
  #include <windows.h>
--- 38,44 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/des/crypt.c,v 1.13.2.1 2004/08/25 07:03:38 shadow Exp $");
  
  #ifdef AFS_NT40_ENV
  #include <windows.h>
***************
*** 91,97 ****
   */
  
  /* XXX shouldn't this be !AFS_64BIT_ENV ? */
! #if !defined(cray) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV) && !defined(AFS_AMD64_LINUX20_ENV) && !defined(AFS_PPC64_LINUX20_ENV)
  #define	LONG_IS_32_BITS
  #endif
  
--- 91,97 ----
   */
  
  /* XXX shouldn't this be !AFS_64BIT_ENV ? */
! #if !defined(cray) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV) && !defined(AFS_AMD64_LINUX20_ENV) && !defined(AFS_PPC64_LINUX20_ENV) & !defined(AFS_S390X_LINUX20_ENV)
  #define	LONG_IS_32_BITS
  #endif
  
Index: openafs/src/des/des.c
diff -c openafs/src/des/des.c:1.11 openafs/src/des/des.c:1.11.2.1
*** openafs/src/des/des.c:1.11	Tue Jul 15 19:14:59 2003
--- openafs/src/des/des.c	Wed Aug 25 03:09:37 2004
***************
*** 37,43 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/des/des.c,v 1.11 2003/07/15 23:14:59 shadow Exp $");
  
  #ifndef KERNEL
  #include <stdio.h>
--- 37,43 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/des/des.c,v 1.11.2.1 2004/08/25 07:09:37 shadow Exp $");
  
  #ifndef KERNEL
  #include <stdio.h>
***************
*** 104,128 ****
  #ifdef DEBUG
      afs_uint32 dbg_tmp[2];
  #endif
!     LOCK_RXKAD_STATS if (encrypt)
! 	  rxkad_stats.des_encrypts[DES_ENCRYPT]++;
      else
  	rxkad_stats.des_encrypts[DES_DECRYPT]++;
!     UNLOCK_RXKAD_STATS
! 	/*
! 	 * Use L1,R1 and L2,R2 as two sets of "64-bit" registers always
! 	 * work from L1,R1 input to L2,R2 output; initialize the cleartext
! 	 * into registers.
! 	 */
  #ifdef MUSTALIGN
  #ifdef DEBUG
! 	/*
! 	 * If the alignment is wrong, the programmer really screwed up --
! 	 * we aren't even getting the right data type.  His problem.  Keep
! 	 * this code for debugging.
! 	 */
! 	/* Make sure schedule is ok */
! 	if ((afs_int32) schedule & 3) {
  	fprintf(stderr, "des.c schedule arg pointer not aligned\n");
  	abort();
      }
--- 104,129 ----
  #ifdef DEBUG
      afs_uint32 dbg_tmp[2];
  #endif
!     LOCK_RXKAD_STATS;
!     if (encrypt)
! 	rxkad_stats.des_encrypts[DES_ENCRYPT]++;
      else
  	rxkad_stats.des_encrypts[DES_DECRYPT]++;
!     UNLOCK_RXKAD_STATS;
!     /*
!      * Use L1,R1 and L2,R2 as two sets of "64-bit" registers always
!      * work from L1,R1 input to L2,R2 output; initialize the cleartext
!      * into registers.
!      */
  #ifdef MUSTALIGN
  #ifdef DEBUG
!     /*
!      * If the alignment is wrong, the programmer really screwed up --
!      * we aren't even getting the right data type.  His problem.  Keep
!      * this code for debugging.
!      */
!     /* Make sure schedule is ok */
!     if ((afs_int32) schedule & 3) {
  	fprintf(stderr, "des.c schedule arg pointer not aligned\n");
  	abort();
      }
Index: openafs/src/des/key_sched.c
diff -c openafs/src/des/key_sched.c:1.6 openafs/src/des/key_sched.c:1.6.2.1
*** openafs/src/des/key_sched.c:1.6	Tue Jul 15 19:15:00 2003
--- openafs/src/des/key_sched.c	Wed Aug 25 03:09:37 2004
***************
*** 31,37 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/des/key_sched.c,v 1.6 2003/07/15 23:15:00 shadow Exp $");
  
  #include <mit-cpyright.h>
  #include "des_internal.h"
--- 31,37 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/des/key_sched.c,v 1.6.2.1 2004/08/25 07:09:37 shadow Exp $");
  
  #include <mit-cpyright.h>
  #include "des_internal.h"
***************
*** 66,75 ****
      n = 0;
      p_char = k_char;
  
!     LOCK_RXKAD_STATS rxkad_stats.des_key_scheds++;
!     UNLOCK_RXKAD_STATS
  #ifdef lint
! 	n = n;			/* fool it in case of VAXASM */
  #endif
  #ifdef DEBUG
      if (des_debug)
--- 66,76 ----
      n = 0;
      p_char = k_char;
  
!     LOCK_RXKAD_STATS;
!     rxkad_stats.des_key_scheds++;
!     UNLOCK_RXKAD_STATS;
  #ifdef lint
!     n = n;			/* fool it in case of VAXASM */
  #endif
  #ifdef DEBUG
      if (des_debug)
Index: openafs/src/des/new_rnd_key.c
diff -c openafs/src/des/new_rnd_key.c:1.13 openafs/src/des/new_rnd_key.c:1.13.2.1
*** openafs/src/des/new_rnd_key.c:1.13	Sun Dec  7 17:49:24 2003
--- openafs/src/des/new_rnd_key.c	Wed Aug 25 03:09:37 2004
***************
*** 19,25 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/des/new_rnd_key.c,v 1.13 2003/12/07 22:49:24 jaltman Exp $");
  
  #ifndef KERNEL
  #include <stdio.h>
--- 19,25 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/des/new_rnd_key.c,v 1.13.2.1 2004/08/25 07:09:37 shadow Exp $");
  
  #ifndef KERNEL
  #include <stdio.h>
***************
*** 54,61 ****
  
  #include <assert.h>
  pthread_mutex_t des_init_mutex;
! #define LOCK_INIT assert(pthread_mutex_lock(&des_init_mutex)==0);
! #define UNLOCK_INIT assert(pthread_mutex_unlock(&des_init_mutex)==0);
  #else
  #define LOCK_INIT
  #define UNLOCK_INIT
--- 54,61 ----
  
  #include <assert.h>
  pthread_mutex_t des_init_mutex;
! #define LOCK_INIT assert(pthread_mutex_lock(&des_init_mutex)==0)
! #define UNLOCK_INIT assert(pthread_mutex_unlock(&des_init_mutex)==0)
  #else
  #define LOCK_INIT
  #define UNLOCK_INIT
***************
*** 75,84 ****
  int
  des_random_key(des_cblock key)
  {
!     LOCK_INIT if (!is_inited) {
  	des_init_random_number_generator(key);
      }
!     UNLOCK_INIT
      do {
  	des_generate_random_block(key);
  	des_fixup_key_parity(key);
--- 75,85 ----
  int
  des_random_key(des_cblock key)
  {
!     LOCK_INIT;
!     if (!is_inited) {
  	des_init_random_number_generator(key);
      }
!     UNLOCK_INIT;
      do {
  	des_generate_random_block(key);
  	des_fixup_key_parity(key);
***************
*** 192,199 ****
  
  #include <assert.h>
  pthread_mutex_t des_random_mutex;
! #define LOCK_RANDOM assert(pthread_mutex_lock(&des_random_mutex)==0);
! #define UNLOCK_RANDOM assert(pthread_mutex_unlock(&des_random_mutex)==0);
  #else
  #define LOCK_RANDOM
  #define UNLOCK_RANDOM
--- 193,200 ----
  
  #include <assert.h>
  pthread_mutex_t des_random_mutex;
! #define LOCK_RANDOM assert(pthread_mutex_lock(&des_random_mutex)==0)
! #define UNLOCK_RANDOM assert(pthread_mutex_unlock(&des_random_mutex)==0)
  #else
  #define LOCK_RANDOM
  #define UNLOCK_RANDOM
***************
*** 216,227 ****
      register int i;
  
      /* select the new stream: (note errors are not possible here...) */
!     LOCK_RANDOM des_key_sched(key, random_sequence_key.d);
  
      /* "seek" to the start of the stream: */
      for (i = 0; i < 8; i++)
  	sequence_number[i] = 0;
! UNLOCK_RANDOM}
  
  /*
   * des_set_sequence_number: this routine is used to set the sequence number
--- 217,230 ----
      register int i;
  
      /* select the new stream: (note errors are not possible here...) */
!     LOCK_RANDOM;
!     des_key_sched(key, random_sequence_key.d);
  
      /* "seek" to the start of the stream: */
      for (i = 0; i < 8; i++)
  	sequence_number[i] = 0;
!     UNLOCK_RANDOM;
! }
  
  /*
   * des_set_sequence_number: this routine is used to set the sequence number
***************
*** 234,242 ****
  static afs_int32
  des_set_sequence_number(des_cblock new_sequence_number)
  {
!     LOCK_RANDOM memcpy((char *)sequence_number, (char *)new_sequence_number,
! 		       sizeof(sequence_number));
!     UNLOCK_RANDOM return 0;
  }
  
  /*
--- 237,247 ----
  static afs_int32
  des_set_sequence_number(des_cblock new_sequence_number)
  {
!     LOCK_RANDOM;
!     memcpy((char *)sequence_number, (char *)new_sequence_number,
! 	   sizeof(sequence_number));
!     UNLOCK_RANDOM;
!     return 0;
  }
  
  /*
***************
*** 252,264 ****
  {
      int i;
  
!     LOCK_RXKAD_STATS rxkad_stats.des_randoms++;
!     UNLOCK_RXKAD_STATS
! 	/*
! 	 * Encrypt the sequence number to get the new random block:
! 	 */
! 	LOCK_RANDOM des_ecb_encrypt(sequence_number, block,
! 				    random_sequence_key.d, 1);
  
      /*
       * Increment the sequence number as an 8 byte unsigned number with wrap:
--- 257,270 ----
  {
      int i;
  
!     LOCK_RXKAD_STATS;
!     rxkad_stats.des_randoms++;
!     UNLOCK_RXKAD_STATS;
!     /*
!      * Encrypt the sequence number to get the new random block:
!      */
!     LOCK_RANDOM;
!     des_ecb_encrypt(sequence_number, block, random_sequence_key.d, 1);
  
      /*
       * Increment the sequence number as an 8 byte unsigned number with wrap:
***************
*** 269,273 ****
  	if (sequence_number[i])
  	    break;
      }
!     UNLOCK_RANDOM return 0;
  }
--- 275,280 ----
  	if (sequence_number[i])
  	    break;
      }
!     UNLOCK_RANDOM;
!     return 0;
  }
Index: openafs/src/des/stats.h
diff -c openafs/src/des/stats.h:1.4 openafs/src/des/stats.h:1.4.2.1
*** openafs/src/des/stats.h:1.4	Sun Dec  7 17:49:24 2003
--- openafs/src/des/stats.h	Wed Aug 25 03:09:37 2004
***************
*** 37,44 ****
  #include <pthread.h>
  #include <assert.h>
  extern pthread_mutex_t rxkad_stats_mutex;
! #define LOCK_RXKAD_STATS assert(pthread_mutex_lock(&rxkad_stats_mutex)==0);
! #define UNLOCK_RXKAD_STATS assert(pthread_mutex_unlock(&rxkad_stats_mutex)==0);
  #else
  #define LOCK_RXKAD_STATS
  #define UNLOCK_RXKAD_STATS
--- 37,44 ----
  #include <pthread.h>
  #include <assert.h>
  extern pthread_mutex_t rxkad_stats_mutex;
! #define LOCK_RXKAD_STATS assert(pthread_mutex_lock(&rxkad_stats_mutex)==0)
! #define UNLOCK_RXKAD_STATS assert(pthread_mutex_unlock(&rxkad_stats_mutex)==0)
  #else
  #define LOCK_RXKAD_STATS
  #define UNLOCK_RXKAD_STATS
Index: openafs/src/export/Makefile.in
diff -c openafs/src/export/Makefile.in:1.15 openafs/src/export/Makefile.in:1.15.2.2
*** openafs/src/export/Makefile.in:1.15	Wed Mar 17 02:15:04 2004
--- openafs/src/export/Makefile.in	Wed Aug 25 03:13:48 2004
***************
*** 24,30 ****
  
  noversion system: install
  
! install: ${DESTDIR}${libdir}/afs/export.exp ${DESTDIR}${libdir}/afs/extras.exp  
  
  export.exp: ${srcdir}/export4.exp ${srcdir}/export5.exp
  	case ${SYS_NAME} in \
--- 24,40 ----
  
  noversion system: install
  
! install:    ${DESTDIR}${afskerneldir}/export.ext \
! 	${DESTDIR}${afskerneldir}/export.ext.nonfs \
! 	${DESTDIR}${afskerneldir}/export64.ext.nonfs \
! 	${DESTDIR}${libdir}/afs/export.exp \
! 	${DESTDIR}${libdir}/afs/export64.exp \
! 	${DESTDIR}${libdir}/afs/extras.exp \
! 	${DESTDIR}${afskerneldir}/cfgexport \
! 	${DESTDIR}${afskerneldir}/cfgafs \
! 	${DESTDIR}${afskerneldir}/export64.ext \
! 	${DESTDIR}${afskerneldir}/cfgexport64 \
! 	${DESTDIR}${afskerneldir}/cfgafs64 
  
  export.exp: ${srcdir}/export4.exp ${srcdir}/export5.exp
  	case ${SYS_NAME} in \
***************
*** 152,158 ****
  ${DEST}/root.client/usr/vice/etc/dkload/cfgexport64: @AIX64@cfgexport64
  @AIX64@	${INSTALL} $? $@
  
! ${DEST}/root.client/usr/vice/etc/dkload/cfgafs: @AIX64@cfgafs
  @AIX64@	${INSTALL} $? $@
  
  ${DEST}/root.client/usr/vice/etc/dkload/cfgafs64: @AIX64@cfgafs64
--- 162,168 ----
  ${DEST}/root.client/usr/vice/etc/dkload/cfgexport64: @AIX64@cfgexport64
  @AIX64@	${INSTALL} $? $@
  
! ${DEST}/root.client/usr/vice/etc/dkload/cfgafs: cfgafs
  @AIX64@	${INSTALL} $? $@
  
  ${DEST}/root.client/usr/vice/etc/dkload/cfgafs64: @AIX64@cfgafs64
Index: openafs/src/kauth/admin_tools.c
diff -c openafs/src/kauth/admin_tools.c:1.16 openafs/src/kauth/admin_tools.c:1.16.2.1
*** openafs/src/kauth/admin_tools.c:1.16	Sun Dec  7 17:49:26 2003
--- openafs/src/kauth/admin_tools.c	Wed Aug 25 03:03:39 2004
***************
*** 16,22 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/admin_tools.c,v 1.16 2003/12/07 22:49:26 jaltman Exp $");
  
  #include <afs/stds.h>
  #include <afs/debug.h>
--- 16,22 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/admin_tools.c,v 1.16.2.1 2004/08/25 07:03:39 shadow Exp $");
  
  #include <afs/stds.h>
  #include <afs/debug.h>
***************
*** 818,824 ****
      if (as->parms[3].items)
  	sscanf(as->parms[3].items->data, "%d", &kvno);
  
! #ifdef AFS_S390_LINUX20_ENV
      code = ubik_Call(KAM_SetPassword, conn, 0, name, instance, kvno, 0, key);
  #else
      code = ubik_Call(KAM_SetPassword, conn, 0, name, instance, kvno, key);
--- 818,824 ----
      if (as->parms[3].items)
  	sscanf(as->parms[3].items->data, "%d", &kvno);
  
! #if defined(AFS_S390_LINUX20_ENV) && !defined(AFS_S390X_LINUX20_ENV)
      code = ubik_Call(KAM_SetPassword, conn, 0, name, instance, kvno, 0, key);
  #else
      code = ubik_Call(KAM_SetPassword, conn, 0, name, instance, kvno, key);
Index: openafs/src/kauth/authclient.c
diff -c openafs/src/kauth/authclient.c:1.14 openafs/src/kauth/authclient.c:1.14.2.2
*** openafs/src/kauth/authclient.c:1.14	Tue Jul 15 19:15:16 2003
--- openafs/src/kauth/authclient.c	Wed Aug 25 03:09:38 2004
***************
*** 17,23 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/authclient.c,v 1.14 2003/07/15 23:15:16 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "afs/sysincludes.h"
--- 17,23 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/authclient.c,v 1.14.2.2 2004/08/25 07:09:38 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "afs/sysincludes.h"
***************
*** 83,89 ****
  {
      int i;
  
!     LOCK_GLOBAL_MUTEX ka_ExpandCell(cell, explicit_cell_server_list.name, 0);
      for (i = 0; i < MAXHOSTSPERCELL; i++)
  	if (serverList[i]) {
  	    explicit_cell_server_list.numServers = i + 1;
--- 83,90 ----
  {
      int i;
  
!     LOCK_GLOBAL_MUTEX;
!     ka_ExpandCell(cell, explicit_cell_server_list.name, 0);
      for (i = 0; i < MAXHOSTSPERCELL; i++)
  	if (serverList[i]) {
  	    explicit_cell_server_list.numServers = i + 1;
***************
*** 100,106 ****
  	    explicit = 1;
  	} else
  	    break;
! UNLOCK_GLOBAL_MUTEX}
  
  static int
  myCellLookup(struct afsconf_dir *conf, char *cell, char *service,
--- 101,108 ----
  	    explicit = 1;
  	} else
  	    break;
!     UNLOCK_GLOBAL_MUTEX;
! }
  
  static int
  myCellLookup(struct afsconf_dir *conf, char *cell, char *service,
***************
*** 125,132 ****
      afs_int32 code;
      char cellname[MAXKTCREALMLEN];
  
!     LOCK_GLOBAL_MUTEX if (cell && !strlen(cell))
! 	  cell = 0;
      else
  	cell = lcstring(cellname, cell, sizeof(cellname));
  
--- 127,135 ----
      afs_int32 code;
      char cellname[MAXKTCREALMLEN];
  
!     LOCK_GLOBAL_MUTEX;
!     if (cell && !strlen(cell))
! 	cell = 0;
      else
  	cell = lcstring(cellname, cell, sizeof(cellname));
  
***************
*** 137,154 ****
  	conf = afsconf_Open(AFSDIR_CLIENT_ETC_DIRPATH);
  #endif /* UKERNEL */
  	if (!conf) {
! 	    UNLOCK_GLOBAL_MUTEX return KANOCELLS;
  	}
      }
      code = myCellLookup(conf, cell, AFSCONF_KAUTHSERVICE, cellinfo);
!     UNLOCK_GLOBAL_MUTEX return code;
  }
  
  afs_int32
  ka_GetSecurity(int service, struct ktc_token * token,
  	       struct rx_securityClass ** scP, int *siP)
  {				/* security class index */
!     LOCK_GLOBAL_MUTEX *scP = 0;
      switch (service) {
      case KA_AUTHENTICATION_SERVICE:
      case KA_TICKET_GRANTING_SERVICE:
--- 140,160 ----
  	conf = afsconf_Open(AFSDIR_CLIENT_ETC_DIRPATH);
  #endif /* UKERNEL */
  	if (!conf) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return KANOCELLS;
  	}
      }
      code = myCellLookup(conf, cell, AFSCONF_KAUTHSERVICE, cellinfo);
!     UNLOCK_GLOBAL_MUTEX;
!     return code;
  }
  
  afs_int32
  ka_GetSecurity(int service, struct ktc_token * token,
  	       struct rx_securityClass ** scP, int *siP)
  {				/* security class index */
!     LOCK_GLOBAL_MUTEX;
!     *scP = 0;
      switch (service) {
      case KA_AUTHENTICATION_SERVICE:
      case KA_TICKET_GRANTING_SERVICE:
***************
*** 166,178 ****
  	*siP = RX_SCINDEX_KAD;
  	break;
      default:
! 	UNLOCK_GLOBAL_MUTEX return KABADARGUMENT;
      }
      if (*scP == 0) {
  	printf("Failed gettting security object\n");
! 	UNLOCK_GLOBAL_MUTEX return KARXFAIL;
      }
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  afs_int32
--- 172,187 ----
  	*siP = RX_SCINDEX_KAD;
  	break;
      default:
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KABADARGUMENT;
      }
      if (*scP == 0) {
  	printf("Failed gettting security object\n");
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KARXFAIL;
      }
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  afs_int32
***************
*** 190,198 ****
      char sname[MAXHOSTCHARS];
      int snamel;
  
!     LOCK_GLOBAL_MUTEX code = ka_GetServers(cell, &cellinfo);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
  
      lcstring(sname, server, sizeof(sname));
--- 199,209 ----
      char sname[MAXHOSTCHARS];
      int snamel;
  
!     LOCK_GLOBAL_MUTEX;
!     code = ka_GetServers(cell, &cellinfo);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
  
      lcstring(sname, server, sizeof(sname));
***************
*** 201,223 ****
      for (i = 0; i < cellinfo.numServers; i++) {
  	if (strncmp(cellinfo.hostName[i], sname, snamel) == 0) {
  	    if (match >= 0) {
! 		UNLOCK_GLOBAL_MUTEX return KANOCELLS;
  	    } else
  		match = i;
  	}
      }
      if (match < 0) {
! 	UNLOCK_GLOBAL_MUTEX return KANOCELLS;
      }
  
      code = rx_Init(0);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
  
      code = ka_GetSecurity(service, token, &sc, &si);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
  #ifdef AFS_PTHREAD_ENV
      serverconns[0] =
--- 212,238 ----
      for (i = 0; i < cellinfo.numServers; i++) {
  	if (strncmp(cellinfo.hostName[i], sname, snamel) == 0) {
  	    if (match >= 0) {
! 		UNLOCK_GLOBAL_MUTEX;
! 		return KANOCELLS;
  	    } else
  		match = i;
  	}
      }
      if (match < 0) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KANOCELLS;
      }
  
      code = rx_Init(0);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
  
      code = ka_GetSecurity(service, token, &sc, &si);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
  #ifdef AFS_PTHREAD_ENV
      serverconns[0] =
***************
*** 237,244 ****
      *conn = 0;
      code = ubik_ClientInit(serverconns, conn);
      rxs_Release(sc);
!     UNLOCK_GLOBAL_MUTEX if (code)
! 	  return KAUBIKINIT;
      return 0;
  }
  
--- 252,260 ----
      *conn = 0;
      code = ubik_ClientInit(serverconns, conn);
      rxs_Release(sc);
!     UNLOCK_GLOBAL_MUTEX;
!     if (code)
! 	return KAUBIKINIT;
      return 0;
  }
  
***************
*** 253,266 ****
      int si;			/* security class index */
      int i;
  
!     LOCK_GLOBAL_MUTEX code = rx_Init(0);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
  
      code = ka_GetSecurity(service, token, &sc, &si);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
  
      for (i = 0; i < cellinfo->numServers; i++)
--- 269,285 ----
      int si;			/* security class index */
      int i;
  
!     LOCK_GLOBAL_MUTEX;
!     code = rx_Init(0);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
  
      code = ka_GetSecurity(service, token, &sc, &si);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
  
      for (i = 0; i < cellinfo->numServers; i++)
***************
*** 282,289 ****
      *conn = 0;
      code = ubik_ClientInit(serverconns, conn);
      rxs_Release(sc);
!     UNLOCK_GLOBAL_MUTEX if (code)
! 	  return KAUBIKINIT;
      return 0;
  }
  
--- 301,309 ----
      *conn = 0;
      code = ubik_ClientInit(serverconns, conn);
      rxs_Release(sc);
!     UNLOCK_GLOBAL_MUTEX;
!     if (code)
! 	return KAUBIKINIT;
      return 0;
  }
  
***************
*** 298,316 ****
      int i;
      struct afsconf_cell cellinfo;	/* for cell auth server list */
  
!     LOCK_GLOBAL_MUTEX code = ka_GetServers(cell, &cellinfo);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
  
      code = rx_Init(0);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
  
      code = ka_GetSecurity(service, token, &sc, &si);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
  
      for (i = 0; i < cellinfo.numServers; i++)
--- 318,340 ----
      int i;
      struct afsconf_cell cellinfo;	/* for cell auth server list */
  
!     LOCK_GLOBAL_MUTEX;
!     code = ka_GetServers(cell, &cellinfo);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
  
      code = rx_Init(0);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
  
      code = ka_GetSecurity(service, token, &sc, &si);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
  
      for (i = 0; i < cellinfo.numServers; i++)
***************
*** 332,339 ****
      *conn = 0;
      code = ubik_ClientInit(serverconns, conn);
      rxs_Release(sc);
!     UNLOCK_GLOBAL_MUTEX if (code)
! 	  return KAUBIKINIT;
      return 0;
  }
  
--- 356,364 ----
      *conn = 0;
      code = ubik_ClientInit(serverconns, conn);
      rxs_Release(sc);
!     UNLOCK_GLOBAL_MUTEX;
!     if (code)
! 	return KAUBIKINIT;
      return 0;
  }
  
***************
*** 501,508 ****
      char *ans_label;
      int version;
  
!     LOCK_GLOBAL_MUTEX if ((code = des_key_sched(key, schedule))) {
! 	UNLOCK_GLOBAL_MUTEX return KABADKEY;
      }
  
      if (service == KA_MAINTENANCE_SERVICE) {
--- 526,535 ----
      char *ans_label;
      int version;
  
!     LOCK_GLOBAL_MUTEX;
!     if ((code = des_key_sched(key, schedule))) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KABADKEY;
      }
  
      if (service == KA_MAINTENANCE_SERVICE) {
***************
*** 512,518 ****
  	req_label = KA_GETTGT_REQ_LABEL;
  	ans_label = KA_GETTGT_ANS_LABEL;
      } else {
! 	UNLOCK_GLOBAL_MUTEX return KABADARGUMENT;
      }
  
      request_time = time(0);
--- 539,546 ----
  	req_label = KA_GETTGT_REQ_LABEL;
  	ans_label = KA_GETTGT_ANS_LABEL;
      } else {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KABADARGUMENT;
      }
  
      request_time = time(0);
***************
*** 552,559 ****
  	}
      }
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX if ((code >= KAMINERROR) && (code <= KAMAXERROR))
! 	      return code;
  	return KAUBIKCALL;
      }
      des_pcbc_encrypt(oanswer.SeqBody, oanswer.SeqBody, oanswer.SeqLen,
--- 580,588 ----
  	}
      }
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	if ((code >= KAMINERROR) && (code <= KAMAXERROR))
! 	    return code;
  	return KAUBIKCALL;
      }
      des_pcbc_encrypt(oanswer.SeqBody, oanswer.SeqBody, oanswer.SeqLen,
***************
*** 571,577 ****
  		CheckTicketAnswer(&oanswer, request_time + 1, token, &caller,
  				  0, ans_label, pwexpires);
  	    if (code) {
! 		UNLOCK_GLOBAL_MUTEX return code;
  	    }
  	}
  	break;
--- 600,607 ----
  		CheckTicketAnswer(&oanswer, request_time + 1, token, &caller,
  				  0, ans_label, pwexpires);
  	    if (code) {
! 		UNLOCK_GLOBAL_MUTEX;
! 		return code;
  	    }
  	}
  	break;
***************
*** 581,593 ****
  	if ((answer_old.time != request_time + 1)
  	    || (answer_old.ticket_len < MINKTCTICKETLEN)
  	    || (answer_old.ticket_len > MAXKTCTICKETLEN)) {
! 	    UNLOCK_GLOBAL_MUTEX return KABADPROTOCOL;
  	}
  	{
  	    char *label = ((char *)answer_old.ticket) + answer_old.ticket_len;
  
  	    if (strncmp(label, ans_label, sizeof(answer_old.label))) {
! 		UNLOCK_GLOBAL_MUTEX return KABADPROTOCOL;
  	    }
  	    token->startTime = start;
  	    token->endTime = end;
--- 611,625 ----
  	if ((answer_old.time != request_time + 1)
  	    || (answer_old.ticket_len < MINKTCTICKETLEN)
  	    || (answer_old.ticket_len > MAXKTCTICKETLEN)) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return KABADPROTOCOL;
  	}
  	{
  	    char *label = ((char *)answer_old.ticket) + answer_old.ticket_len;
  
  	    if (strncmp(label, ans_label, sizeof(answer_old.label))) {
! 		UNLOCK_GLOBAL_MUTEX;
! 		return KABADPROTOCOL;
  	    }
  	    token->startTime = start;
  	    token->endTime = end;
***************
*** 599,608 ****
  	}
  	break;
      default:
! 	UNLOCK_GLOBAL_MUTEX return KAINTERNALERROR;
      }
  
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  afs_int32
--- 631,642 ----
  	}
  	break;
      default:
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KAINTERNALERROR;
      }
  
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  afs_int32
***************
*** 624,635 ****
      int version;
      afs_int32 pwexpires;
  
!     LOCK_GLOBAL_MUTEX aticket.SeqLen = auth_token->ticketLen;
      aticket.SeqBody = auth_token->ticket;
  
      code = des_key_sched(&auth_token->sessionKey, schedule);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return KABADKEY;
      }
  
      times.start = htonl(start);
--- 658,671 ----
      int version;
      afs_int32 pwexpires;
  
!     LOCK_GLOBAL_MUTEX;
!     aticket.SeqLen = auth_token->ticketLen;
      aticket.SeqBody = auth_token->ticket;
  
      code = des_key_sched(&auth_token->sessionKey, schedule);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KABADKEY;
      }
  
      times.start = htonl(start);
***************
*** 662,669 ****
  	}
      }
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX if ((code >= KAMINERROR) && (code <= KAMAXERROR))
! 	      return code;
  	return KAUBIKCALL;
      }
  
--- 698,706 ----
  	}
      }
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	if ((code >= KAMINERROR) && (code <= KAMAXERROR))
! 	    return code;
  	return KAUBIKCALL;
      }
  
***************
*** 680,686 ****
  		CheckTicketAnswer(&oanswer, 0, token, 0, &server,
  				  KA_GETTICKET_ANS_LABEL, &pwexpires);
  	    if (code) {
! 		UNLOCK_GLOBAL_MUTEX return code;
  	    }
  	}
  	break;
--- 717,724 ----
  		CheckTicketAnswer(&oanswer, 0, token, 0, &server,
  				  KA_GETTICKET_ANS_LABEL, &pwexpires);
  	    if (code) {
! 		UNLOCK_GLOBAL_MUTEX;
! 		return code;
  	    }
  	}
  	break;
***************
*** 693,743 ****
  	       sizeof(token->sessionKey));
  
  	if (tkt_CheckTimes(token->startTime, token->endTime, time(0)) < 0) {
! 	    UNLOCK_GLOBAL_MUTEX return KABADPROTOCOL;
  	}
  	if ((token->ticketLen < MINKTCTICKETLEN)
  	    || (token->ticketLen > MAXKTCTICKETLEN)) {
! 	    UNLOCK_GLOBAL_MUTEX return KABADPROTOCOL;
  	}
  	strings = answer_old.name;
  	len = strlen(strings);	/* check client name */
  	if ((len < 1) || (len > MAXKTCNAMELEN)) {
! 	    UNLOCK_GLOBAL_MUTEX return KABADPROTOCOL;
  	}
  	strings += len + 1;	/* check client instance */
  	len = strlen(strings);
  	if ((len < 0) || (len > MAXKTCNAMELEN)) {
! 	    UNLOCK_GLOBAL_MUTEX return KABADPROTOCOL;
  	}
  	strings += len + 1;
  	len = strlen(strings);	/* check client cell */
  	if ((len < 0) || (len > MAXKTCNAMELEN)) {
! 	    UNLOCK_GLOBAL_MUTEX return KABADPROTOCOL;
  	}
  	strings += len + 1;
  	len = strlen(strings);	/* check server name */
  	if ((len < 1) || (len > MAXKTCNAMELEN) || strcmp(name, strings)) {
! 	    UNLOCK_GLOBAL_MUTEX return KABADPROTOCOL;
  	}
  	strings += len + 1;
  	len = strlen(strings);	/* check server instance */
  	if ((len < 0) || (len > MAXKTCNAMELEN) || strcmp(instance, strings)) {
! 	    UNLOCK_GLOBAL_MUTEX return KABADPROTOCOL;
  	}
  	strings += len + 1;
  
  	if ((strings - oanswer.SeqBody + token->ticketLen) - oanswer.SeqLen >=
  	    ENCRYPTIONBLOCKSIZE) {
! 	    UNLOCK_GLOBAL_MUTEX return KABADPROTOCOL;
  	}
  	memcpy(token->ticket, strings, token->ticketLen);
  
  	break;
      default:
! 	UNLOCK_GLOBAL_MUTEX return KAINTERNALERROR;
      }
  
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  afs_int32
--- 731,791 ----
  	       sizeof(token->sessionKey));
  
  	if (tkt_CheckTimes(token->startTime, token->endTime, time(0)) < 0) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return KABADPROTOCOL;
  	}
  	if ((token->ticketLen < MINKTCTICKETLEN)
  	    || (token->ticketLen > MAXKTCTICKETLEN)) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return KABADPROTOCOL;
  	}
  	strings = answer_old.name;
  	len = strlen(strings);	/* check client name */
  	if ((len < 1) || (len > MAXKTCNAMELEN)) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return KABADPROTOCOL;
  	}
  	strings += len + 1;	/* check client instance */
  	len = strlen(strings);
  	if ((len < 0) || (len > MAXKTCNAMELEN)) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return KABADPROTOCOL;
  	}
  	strings += len + 1;
  	len = strlen(strings);	/* check client cell */
  	if ((len < 0) || (len > MAXKTCNAMELEN)) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return KABADPROTOCOL;
  	}
  	strings += len + 1;
  	len = strlen(strings);	/* check server name */
  	if ((len < 1) || (len > MAXKTCNAMELEN) || strcmp(name, strings)) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return KABADPROTOCOL;
  	}
  	strings += len + 1;
  	len = strlen(strings);	/* check server instance */
  	if ((len < 0) || (len > MAXKTCNAMELEN) || strcmp(instance, strings)) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return KABADPROTOCOL;
  	}
  	strings += len + 1;
  
  	if ((strings - oanswer.SeqBody + token->ticketLen) - oanswer.SeqLen >=
  	    ENCRYPTIONBLOCKSIZE) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return KABADPROTOCOL;
  	}
  	memcpy(token->ticket, strings, token->ticketLen);
  
  	break;
      default:
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KAINTERNALERROR;
      }
  
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  afs_int32
***************
*** 748,761 ****
  {
      afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX
! #ifdef AFS_S390_LINUX20_ENV
! 	code =
  	ubik_Call_New(KAM_SetPassword, conn, 0, name, instance, 0, 0,
  		      *newkey);
  #else
! 	code =
  	ubik_Call_New(KAM_SetPassword, conn, 0, name, instance, 0, *newkey);
  #endif
!     UNLOCK_GLOBAL_MUTEX return code;
  }
--- 796,810 ----
  {
      afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX;
! #if defined(AFS_S390_LINUX20_ENV) && !defined(AFS_S390X_LINUX20_ENV)
!     code =
  	ubik_Call_New(KAM_SetPassword, conn, 0, name, instance, 0, 0,
  		      *newkey);
  #else
!     code =
  	ubik_Call_New(KAM_SetPassword, conn, 0, name, instance, 0, *newkey);
  #endif
!     UNLOCK_GLOBAL_MUTEX;
!     return code;
  }
Index: openafs/src/kauth/client.c
diff -c openafs/src/kauth/client.c:1.12 openafs/src/kauth/client.c:1.12.2.1
*** openafs/src/kauth/client.c:1.12	Tue Jul 15 19:15:16 2003
--- openafs/src/kauth/client.c	Wed Aug 25 03:09:38 2004
***************
*** 15,21 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/client.c,v 1.12 2003/07/15 23:15:16 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "afs/sysincludes.h"
--- 15,21 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/client.c,v 1.12.2.1 2004/08/25 07:09:38 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "afs/sysincludes.h"
***************
*** 141,147 ****
      char realm[MAXKTCREALMLEN];
      afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX code = ka_CellToRealm(cell, realm, 0 /*local */ );
      if (code)			/* just take his word for it */
  	strncpy(realm, cell, sizeof(realm));
      else			/* for backward compatibility */
--- 141,148 ----
      char realm[MAXKTCREALMLEN];
      afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX;
!     code = ka_CellToRealm(cell, realm, 0 /*local */ );
      if (code)			/* just take his word for it */
  	strncpy(realm, cell, sizeof(realm));
      else			/* for backward compatibility */
***************
*** 150,156 ****
  	StringToKey(str, realm, key);
      else
  	Andrew_StringToKey(str, realm, key);
! UNLOCK_GLOBAL_MUTEX}
  
  /* This prints out a prompt and reads a string from the terminal, turning off
     echoing.  If verify is requested it requests that the string be entered
--- 151,158 ----
  	StringToKey(str, realm, key);
      else
  	Andrew_StringToKey(str, realm, key);
!     UNLOCK_GLOBAL_MUTEX;
! }
  
  /* This prints out a prompt and reads a string from the terminal, turning off
     echoing.  If verify is requested it requests that the string be entered
***************
*** 168,183 ****
      char password[BUFSIZ];
      afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX memset(key, 0, sizeof(struct ktc_encryptionKey));
      code = read_pw_string(password, sizeof(password), prompt, verify);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return KAREADPW;
      }
      if (strlen(password) == 0) {
! 	UNLOCK_GLOBAL_MUTEX return KANULLPASSWORD;
      }
      ka_StringToKey(password, cell, key);
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  /* This performs the backslash quoting defined by AC_ParseLoginName. */
--- 170,189 ----
      char password[BUFSIZ];
      afs_int32 code;
  
!     LOCK_GLOBAL_MUTEX;
!     memset(key, 0, sizeof(struct ktc_encryptionKey));
      code = read_pw_string(password, sizeof(password), prompt, verify);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KAREADPW;
      }
      if (strlen(password) == 0) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KANULLPASSWORD;
      }
      ka_StringToKey(password, cell, key);
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  /* This performs the backslash quoting defined by AC_ParseLoginName. */
***************
*** 310,317 ****
      afs_int32 code;
      static int inited = 0;
  
!     LOCK_GLOBAL_MUTEX if (inited) {
! 	UNLOCK_GLOBAL_MUTEX return 0;
      }
      inited++;
      initialize_U_error_table();
--- 316,325 ----
      afs_int32 code;
      static int inited = 0;
  
!     LOCK_GLOBAL_MUTEX;
!     if (inited) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 0;
      }
      inited++;
      initialize_U_error_table();
***************
*** 320,327 ****
      initialize_KTC_error_table();
      initialize_ACFG_error_table();
      code = ka_CellConfig(AFSDIR_CLIENT_ETC_DIRPATH);
!     UNLOCK_GLOBAL_MUTEX if (code)
! 	  return code;
      return 0;
  }
  
--- 328,336 ----
      initialize_KTC_error_table();
      initialize_ACFG_error_table();
      code = ka_CellConfig(AFSDIR_CLIENT_ETC_DIRPATH);
!     UNLOCK_GLOBAL_MUTEX;
!     if (code)
! 	return code;
      return 0;
  }
  
Index: openafs/src/kauth/kadatabase.c
diff -c openafs/src/kauth/kadatabase.c:1.10 openafs/src/kauth/kadatabase.c:1.10.2.1
*** openafs/src/kauth/kadatabase.c:1.10	Sun Dec  7 17:49:26 2003
--- openafs/src/kauth/kadatabase.c	Wed Aug 25 03:09:38 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/kadatabase.c,v 1.10 2003/12/07 22:49:26 jaltman Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/kadatabase.c,v 1.10.2.1 2004/08/25 07:09:38 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
***************
*** 689,699 ****
  		    (keyCache[i].superseded == NEVERDATE);
  		info->kcInfo[j].keycksum = 0;
  #if DEBUG_KEY_CACHE
!         {
!         int k;
! 		for (k = 0; k < sizeof(struct ktc_encryptionKey); k++)
! 		    info->kcInfo[j].keycksum += ((char *)&keyCache[i].key)[k];
!         }
  #endif
  		strcpy(principal, keyCache[i].name);
  		strcat(principal, ".");
--- 689,700 ----
  		    (keyCache[i].superseded == NEVERDATE);
  		info->kcInfo[j].keycksum = 0;
  #if DEBUG_KEY_CACHE
! 		{
! 		    int k;
! 		    for (k = 0; k < sizeof(struct ktc_encryptionKey); k++)
! 			info->kcInfo[j].keycksum +=
! 			    ((char *)&keyCache[i].key)[k];
! 		}
  #endif
  		strcpy(principal, keyCache[i].name);
  		strcat(principal, ".");
Index: openafs/src/kauth/kalocalcell.c
diff -c openafs/src/kauth/kalocalcell.c:1.8 openafs/src/kauth/kalocalcell.c:1.8.2.1
*** openafs/src/kauth/kalocalcell.c:1.8	Tue Jul 15 19:15:16 2003
--- openafs/src/kauth/kalocalcell.c	Wed Aug 25 03:09:38 2004
***************
*** 15,21 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/kalocalcell.c,v 1.8 2003/07/15 23:15:16 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "afs/pthread_glock.h"
--- 15,21 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/kalocalcell.c,v 1.8.2.1 2004/08/25 07:09:38 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "afs/pthread_glock.h"
***************
*** 68,81 ****
      strcpy(cell_name, afs_LclCellName);
      return 0;
  #else /* UKERNEL */
!     LOCK_GLOBAL_MUTEX if (conf)
! 	  afsconf_Close(conf);
      conf = afsconf_Open(dir);
      if (!conf) {
! 	UNLOCK_GLOBAL_MUTEX return KANOCELLS;
      }
      code = afsconf_GetLocalCell(conf, cell_name, sizeof(cell_name));
!     UNLOCK_GLOBAL_MUTEX return code;
  #endif /* UKERNEL */
  }
  
--- 68,84 ----
      strcpy(cell_name, afs_LclCellName);
      return 0;
  #else /* UKERNEL */
!     LOCK_GLOBAL_MUTEX;
!     if (conf)
! 	afsconf_Close(conf);
      conf = afsconf_Open(dir);
      if (!conf) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KANOCELLS;
      }
      code = afsconf_GetLocalCell(conf, cell_name, sizeof(cell_name));
!     UNLOCK_GLOBAL_MUTEX;
!     return code;
  #endif /* UKERNEL */
  }
  
***************
*** 84,91 ****
  {
      int code;
  
!     LOCK_GLOBAL_MUTEX if (conf) {
! 	UNLOCK_GLOBAL_MUTEX return cell_name;
      }
  #ifdef UKERNEL
      conf = afs_cdir;
--- 87,96 ----
  {
      int code;
  
!     LOCK_GLOBAL_MUTEX;
!     if (conf) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return cell_name;
      }
  #ifdef UKERNEL
      conf = afs_cdir;
***************
*** 99,108 ****
      if (!conf || code) {
  	printf("** Can't determine local cell name!\n");
  	conf = 0;
! 	UNLOCK_GLOBAL_MUTEX return 0;
      }
  #endif /* UKERNEL */
!     UNLOCK_GLOBAL_MUTEX return cell_name;
  }
  
  int
--- 104,115 ----
      if (!conf || code) {
  	printf("** Can't determine local cell name!\n");
  	conf = 0;
! 	UNLOCK_GLOBAL_MUTEX;
! 	return 0;
      }
  #endif /* UKERNEL */
!     UNLOCK_GLOBAL_MUTEX;
!     return cell_name;
  }
  
  int
***************
*** 113,121 ****
      char cellname[MAXKTCREALMLEN];
      struct afsconf_cell cellinfo;	/* storage for cell info */
  
!     LOCK_GLOBAL_MUTEX ka_LocalCell();	/* initialize things */
      if (!conf) {
! 	UNLOCK_GLOBAL_MUTEX return KANOCELLS;
      }
  
      if ((cell == 0) || (strlen(cell) == 0)) {
--- 120,130 ----
      char cellname[MAXKTCREALMLEN];
      struct afsconf_cell cellinfo;	/* storage for cell info */
  
!     LOCK_GLOBAL_MUTEX;
!     ka_LocalCell();		/* initialize things */
      if (!conf) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KANOCELLS;
      }
  
      if ((cell == 0) || (strlen(cell) == 0)) {
***************
*** 125,131 ****
  	cell = lcstring(cellname, cell, sizeof(cellname));
  	code = afsconf_GetCellInfo(conf, cell, 0, &cellinfo);
  	if (code) {
! 	    UNLOCK_GLOBAL_MUTEX return KANOCELL;
  	}
  	cell = cellinfo.name;
      }
--- 134,141 ----
  	cell = lcstring(cellname, cell, sizeof(cellname));
  	code = afsconf_GetCellInfo(conf, cell, 0, &cellinfo);
  	if (code) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return KANOCELL;
  	}
  	cell = cellinfo.name;
      }
***************
*** 136,142 ****
  	strcpy(fullCell, cell);
      if (alocal)
  	*alocal = local;
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  int
--- 146,153 ----
  	strcpy(fullCell, cell);
      if (alocal)
  	*alocal = local;
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  int
***************
*** 144,150 ****
  {
      int code;
  
!     LOCK_GLOBAL_MUTEX code = ka_ExpandCell(cell, realm, local);
      ucstring(realm, realm, MAXKTCREALMLEN);
!     UNLOCK_GLOBAL_MUTEX return code;
  }
--- 155,163 ----
  {
      int code;
  
!     LOCK_GLOBAL_MUTEX;
!     code = ka_ExpandCell(cell, realm, local);
      ucstring(realm, realm, MAXKTCREALMLEN);
!     UNLOCK_GLOBAL_MUTEX;
!     return code;
  }
Index: openafs/src/kauth/kaprocs.c
diff -c openafs/src/kauth/kaprocs.c:1.16 openafs/src/kauth/kaprocs.c:1.16.2.1
*** openafs/src/kauth/kaprocs.c:1.16	Tue Apr 20 10:56:16 2004
--- openafs/src/kauth/kaprocs.c	Wed Aug 25 03:09:38 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/kaprocs.c,v 1.16 2004/04/20 14:56:16 jaltman Exp $");
  
  #include <afs/stds.h>
  #include <errno.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/kaprocs.c,v 1.16.2.1 2004/08/25 07:09:38 shadow Exp $");
  
  #include <afs/stds.h>
  #include <errno.h>
***************
*** 1032,1038 ****
  
      code = KAANSWERTOOLONG;
      if (oanswer->MaxSeqLen <
! 	sizeof(struct ka_ticketAnswer) - 5 * MAXKTCNAMELEN - MAXKTCTICKETLEN + ticketLen)
  	return code;
  
      answer = (struct ka_ticketAnswer *)oanswer->SeqBody;
--- 1032,1039 ----
  
      code = KAANSWERTOOLONG;
      if (oanswer->MaxSeqLen <
! 	sizeof(struct ka_ticketAnswer) - 5 * MAXKTCNAMELEN - MAXKTCTICKETLEN +
! 	ticketLen)
  	return code;
  
      answer = (struct ka_ticketAnswer *)oanswer->SeqBody;
***************
*** 1958,1964 ****
      case 0:
  	code = KAANSWERTOOLONG;
  	if (oanswer->MaxSeqLen <
! 	    sizeof(struct ka_getTicketAnswer) - 5 * MAXKTCNAMELEN - MAXKTCTICKETLEN + ticketLen)
  	    goto abort;
  
  	answer = (struct ka_getTicketAnswer *)oanswer->SeqBody;
--- 1959,1966 ----
      case 0:
  	code = KAANSWERTOOLONG;
  	if (oanswer->MaxSeqLen <
! 	    sizeof(struct ka_getTicketAnswer) - 5 * MAXKTCNAMELEN -
! 	    MAXKTCTICKETLEN + ticketLen)
  	    goto abort;
  
  	answer = (struct ka_getTicketAnswer *)oanswer->SeqBody;
Index: openafs/src/kauth/kdb.c
diff -c openafs/src/kauth/kdb.c:1.7 openafs/src/kauth/kdb.c:1.7.2.1
*** openafs/src/kauth/kdb.c:1.7	Tue Jul 15 19:15:16 2003
--- openafs/src/kauth/kdb.c	Wed Aug 25 03:18:06 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/kdb.c,v 1.7 2003/07/15 23:15:16 shadow Exp $");
  
  #include <fcntl.h>
  #include <sys/types.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/kdb.c,v 1.7.2.1 2004/08/25 07:18:06 shadow Exp $");
  
  #include <fcntl.h>
  #include <sys/types.h>
***************
*** 50,56 ****
  	printf("Printing all entries found in %s\n", dbmfile);
  	for (key = dbm_firstkey(kdb); key.dptr;
  	     key = afs_dbm_nextkey(kdb, key), cnt++) {
! 	    printf("\t%s\n", key.dptr);
  	}
  	printf("%d entries were found\n", cnt);
      } else {
--- 50,80 ----
  	printf("Printing all entries found in %s\n", dbmfile);
  	for (key = dbm_firstkey(kdb); key.dptr;
  	     key = afs_dbm_nextkey(kdb, key), cnt++) {
!             if (as->parms[2].items) {
! 		data = dbm_fetch(kdb, key);
! 		if (!data.dptr) {
! 		    fprintf(stderr, "%s: no entry exists\n", ti->data);
! 		    continue;
! 		}
! 		if (data.dsize != sizeof(kalog_elt)) {
! 		    fprintf(stderr, "%s: data came out corrupt\n", ti->data);
! 		    continue;
! 		}
! 		memcpy(&rdata, data.dptr, sizeof(kalog_elt));
! 		if (! as->parms[3].items) {
! 		    char *hostName;
! 		    hostName = hostutil_GetNameByINet(rdata.host);
! 		    printf("%s: last operation from host %s at %s", key.dptr, 
! 			   hostName, ctime(&rdata.last_use));
! 		} else {
! 		    char *hostIP;
! 		    hostIP = afs_inet_ntoa(rdata.host);
! 		    printf("%s: last operation from host %s at %s", key.dptr, 
! 			   hostIP, ctime(&rdata.last_use));
! 		}
!             } else {
! 		printf("\t%s\n", key.dptr);
!             }
  	}
  	printf("%d entries were found\n", cnt);
      } else {
***************
*** 91,96 ****
--- 115,122 ----
      cmd_AddParm(ts, "-dbmfile", CMD_SINGLE, CMD_OPTIONAL, dbmfile_help);
      cmd_AddParm(ts, "-key", CMD_SINGLE, CMD_OPTIONAL,
  		"extract entries that match specified key");
+     cmd_AddParm(ts, "-long", CMD_FLAG, CMD_OPTIONAL, "print long info for each entry");
+     cmd_AddParm(ts, "-numeric", CMD_FLAG, CMD_OPTIONAL, "addresses only");
      code = cmd_Dispatch(argc, argv);
      return code;
  }
Index: openafs/src/kauth/kpasswd.c
diff -c openafs/src/kauth/kpasswd.c:1.14 openafs/src/kauth/kpasswd.c:1.14.2.1
*** openafs/src/kauth/kpasswd.c:1.14	Sat Jun  5 16:11:06 2004
--- openafs/src/kauth/kpasswd.c	Wed Aug 25 03:09:38 2004
***************
*** 12,18 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/kpasswd.c,v 1.14 2004/06/05 20:11:06 jaltman Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
--- 12,18 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/kpasswd.c,v 1.14.2.1 2004/08/25 07:09:38 shadow Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
***************
*** 211,220 ****
       char *arock;
       struct cmd_syndesc *as;
  {
!     char name[MAXKTCNAMELEN]="";
!     char instance[MAXKTCNAMELEN]="";
!     char cell[MAXKTCREALMLEN]="";
!     char realm[MAXKTCREALMLEN]="";
      afs_int32 serverList[MAXSERVERS];
      char *lcell;		/* local cellname */
      int code;
--- 211,220 ----
       char *arock;
       struct cmd_syndesc *as;
  {
!     char name[MAXKTCNAMELEN] = "";
!     char instance[MAXKTCNAMELEN] = "";
!     char cell[MAXKTCREALMLEN] = "";
!     char realm[MAXKTCREALMLEN] = "";
      afs_int32 serverList[MAXSERVERS];
      char *lcell;		/* local cellname */
      int code;
Index: openafs/src/kauth/prot.h
diff -c openafs/src/kauth/prot.h:1.3 openafs/src/kauth/prot.h:1.3.2.1
*** openafs/src/kauth/prot.h:1.3	Fri Aug  8 17:54:40 2003
--- openafs/src/kauth/prot.h	Wed Aug 25 03:09:38 2004
***************
*** 11,17 ****
  
  #include <mit-cpyright.h>
  
! 										  /* #include <krb_conf.h> *//* removed 890221 */
  
  #ifndef PROT_DEFS
  #define PROT_DEFS
--- 11,17 ----
  
  #include <mit-cpyright.h>
  
! 																	/* #include <krb_conf.h> *//* removed 890221 */
  
  #ifndef PROT_DEFS
  #define PROT_DEFS
***************
*** 60,68 ****
  
  /* Routines to create and read packets may be found in prot.c */
  
! 												 /* KTEXT create_auth_reply(); *//* removed 890221 */
! 												       /* KTEXT create_death_packet(); *//* removed 890221 */
! 									    /* KTEXT pkt_cipher(); *//* removed 890221 */
  
  /* Message types , always leave lsb for byte order */
  
--- 60,68 ----
  
  /* Routines to create and read packets may be found in prot.c */
  
! 																				 /* KTEXT create_auth_reply(); *//* removed 890221 */
! 																					   /* KTEXT create_death_packet(); *//* removed 890221 */
! 															      /* KTEXT pkt_cipher(); *//* removed 890221 */
  
  /* Message types , always leave lsb for byte order */
  
Index: openafs/src/kauth/token.c
diff -c openafs/src/kauth/token.c:1.9 openafs/src/kauth/token.c:1.9.2.1
*** openafs/src/kauth/token.c:1.9	Tue Jul 15 19:15:17 2003
--- openafs/src/kauth/token.c	Wed Aug 25 03:09:38 2004
***************
*** 19,25 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/token.c,v 1.9 2003/07/15 23:15:17 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "afs/sysincludes.h"
--- 19,25 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/token.c,v 1.9.2.1 2004/08/25 07:09:38 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "afs/sysincludes.h"
***************
*** 65,71 ****
  
  afs_int32
  ka_GetAuthToken(char *name, char *instance, char *cell,
! 		struct ktc_encryptionKey *key, afs_int32 lifetime,
  		afs_int32 * pwexpires)
  {
      afs_int32 code;
--- 65,71 ----
  
  afs_int32
  ka_GetAuthToken(char *name, char *instance, char *cell,
! 		struct ktc_encryptionKey * key, afs_int32 lifetime,
  		afs_int32 * pwexpires)
  {
      afs_int32 code;
***************
*** 76,107 ****
      char realm[MAXKTCREALMLEN];
      struct ktc_principal client, server;
  
!     LOCK_GLOBAL_MUTEX code = ka_ExpandCell(cell, cellname, 0 /*local */ );
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
      cell = cellname;
  
      /* get an unauthenticated connection to desired cell */
      code = ka_AuthServerConn(cell, KA_AUTHENTICATION_SERVICE, 0, &conn);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
      code =
  	ka_Authenticate(name, instance, cell, conn,
  			KA_TICKET_GRANTING_SERVICE, key, now, now + lifetime,
  			&token, pwexpires);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
      code = ubik_ClientDestroy(conn);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
  
      code = ka_CellToRealm(cell, realm, 0 /*local */ );
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
      strcpy(client.name, name);
      strcpy(client.instance, instance);
--- 76,113 ----
      char realm[MAXKTCREALMLEN];
      struct ktc_principal client, server;
  
!     LOCK_GLOBAL_MUTEX;
!     code = ka_ExpandCell(cell, cellname, 0 /*local */ );
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
      cell = cellname;
  
      /* get an unauthenticated connection to desired cell */
      code = ka_AuthServerConn(cell, KA_AUTHENTICATION_SERVICE, 0, &conn);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
      code =
  	ka_Authenticate(name, instance, cell, conn,
  			KA_TICKET_GRANTING_SERVICE, key, now, now + lifetime,
  			&token, pwexpires);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
      code = ubik_ClientDestroy(conn);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
  
      code = ka_CellToRealm(cell, realm, 0 /*local */ );
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
      strcpy(client.name, name);
      strcpy(client.instance, instance);
***************
*** 110,116 ****
      strcpy(server.instance, realm);
      strcpy(server.cell, cell);
      code = ktc_SetToken(&server, &token, &client, 0);
!     UNLOCK_GLOBAL_MUTEX return code;
  }
  
  afs_int32
--- 116,123 ----
      strcpy(server.instance, realm);
      strcpy(server.cell, cell);
      code = ktc_SetToken(&server, &token, &client, 0);
!     UNLOCK_GLOBAL_MUTEX;
!     return code;
  }
  
  afs_int32
***************
*** 129,137 ****
      char authDomain[MAXKTCREALMLEN];
      int local;
  
!     LOCK_GLOBAL_MUTEX code = ka_ExpandCell(cell, cellname, 0 /*local */ );
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
      cell = cellname;
  
--- 136,146 ----
      char authDomain[MAXKTCREALMLEN];
      int local;
  
!     LOCK_GLOBAL_MUTEX;
!     code = ka_ExpandCell(cell, cellname, 0 /*local */ );
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
      cell = cellname;
  
***************
*** 142,154 ****
  	code =
  	    ktc_GetToken(&server, token, sizeof(struct ktc_token), &client);
  	if (!code) {
! 	    UNLOCK_GLOBAL_MUTEX return 0;
  	}
      }
  
      code = ka_CellToRealm(cell, realm, &local);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
  
      /* get TGS ticket for proper realm */
--- 151,165 ----
  	code =
  	    ktc_GetToken(&server, token, sizeof(struct ktc_token), &client);
  	if (!code) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return 0;
  	}
      }
  
      code = ka_CellToRealm(cell, realm, &local);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
  
      /* get TGS ticket for proper realm */
***************
*** 167,173 ****
      }
  
      if (code && local) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      } else if (code) {
  	/* here we invoke the inter-cell mechanism */
  
--- 178,185 ----
      }
  
      if (code && local) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      } else if (code) {
  	/* here we invoke the inter-cell mechanism */
  
***************
*** 179,191 ****
  	    ktc_GetToken(&auth_server, &cell_token, sizeof(cell_token),
  			 &client);
  	if (code) {
! 	    UNLOCK_GLOBAL_MUTEX return code;
  	}
  	/* get a connection to the local cell */
  	if ((code =
  	     ka_AuthServerConn(localCell, KA_TICKET_GRANTING_SERVICE, 0,
  			       &conn))) {
! 	    UNLOCK_GLOBAL_MUTEX return code;
  	}
  	/* get foreign auth ticket */
  	if ((code =
--- 191,205 ----
  	    ktc_GetToken(&auth_server, &cell_token, sizeof(cell_token),
  			 &client);
  	if (code) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return code;
  	}
  	/* get a connection to the local cell */
  	if ((code =
  	     ka_AuthServerConn(localCell, KA_TICKET_GRANTING_SERVICE, 0,
  			       &conn))) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return code;
  	}
  	/* get foreign auth ticket */
  	if ((code =
***************
*** 193,203 ****
  			 client.instance, conn, now, now + lifetime,
  			 &cell_token, "" /* local auth domain */ ,
  			 &auth_token))) {
! 	    UNLOCK_GLOBAL_MUTEX return code;
  	}
  	code = ubik_ClientDestroy(conn);
  	if (code) {
! 	    UNLOCK_GLOBAL_MUTEX return code;
  	}
  	conn = 0;
  
--- 207,219 ----
  			 client.instance, conn, now, now + lifetime,
  			 &cell_token, "" /* local auth domain */ ,
  			 &auth_token))) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return code;
  	}
  	code = ubik_ClientDestroy(conn);
  	if (code) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return code;
  	}
  	conn = 0;
  
***************
*** 206,235 ****
  	lcstring(auth_server.cell, localCell, sizeof(auth_server.cell));
  	ucstring(authDomain, localCell, sizeof(authDomain));
  	if ((code = ktc_SetToken(&auth_server, &auth_token, &client, 0))) {
! 	    UNLOCK_GLOBAL_MUTEX return code;
  	}
      }
  
      if ((code =
  	 ka_AuthServerConn(cell, KA_TICKET_GRANTING_SERVICE, 0, &conn))) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
      if ((code =
  	 ka_GetToken(name, instance, cell, client.name, client.instance, conn,
  		     now, now + lifetime, &auth_token, authDomain, token))) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
      code = ubik_ClientDestroy(conn);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
  
      if ((code =
  	 ktc_SetToken(&server, token, &client,
  		      dosetpag ? AFS_SETTOK_SETPAG : 0))) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
!     UNLOCK_GLOBAL_MUTEX return 0;
  }
  
  afs_int32
--- 222,257 ----
  	lcstring(auth_server.cell, localCell, sizeof(auth_server.cell));
  	ucstring(authDomain, localCell, sizeof(authDomain));
  	if ((code = ktc_SetToken(&auth_server, &auth_token, &client, 0))) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return code;
  	}
      }
  
      if ((code =
  	 ka_AuthServerConn(cell, KA_TICKET_GRANTING_SERVICE, 0, &conn))) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
      if ((code =
  	 ka_GetToken(name, instance, cell, client.name, client.instance, conn,
  		     now, now + lifetime, &auth_token, authDomain, token))) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
      code = ubik_ClientDestroy(conn);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
  
      if ((code =
  	 ktc_SetToken(&server, token, &client,
  		      dosetpag ? AFS_SETTOK_SETPAG : 0))) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
!     UNLOCK_GLOBAL_MUTEX;
!     return 0;
  }
  
  afs_int32
***************
*** 244,252 ****
      struct ktc_token localToken;
      char cellname[MAXKTCREALMLEN];
  
!     LOCK_GLOBAL_MUTEX code = ka_ExpandCell(cell, cellname, 0 /*local */ );
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
      cell = cellname;
  
--- 266,276 ----
      struct ktc_token localToken;
      char cellname[MAXKTCREALMLEN];
  
!     LOCK_GLOBAL_MUTEX;
!     code = ka_ExpandCell(cell, cellname, 0 /*local */ );
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
      cell = cellname;
  
***************
*** 260,292 ****
  	code =
  	    ktc_GetToken(&server, token, sizeof(struct ktc_token), &client);
  	if (code == 0) {
! 	    UNLOCK_GLOBAL_MUTEX return 0;
  	}
      }
  
      if ((name == 0) || (key == 0)) {
  	/* just lookup in cache don't get new one */
! 	UNLOCK_GLOBAL_MUTEX return KANOTICKET;
      }
  
      /* get an unauthenticated connection to desired cell */
      code = ka_AuthServerConn(cell, KA_AUTHENTICATION_SERVICE, 0, &conn);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
      code =
  	ka_Authenticate(name, instance, cell, conn, KA_MAINTENANCE_SERVICE,
  			key, now, now + lifetime, token, 0);
      (void)ubik_ClientDestroy(conn);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
  
      strcpy(client.name, name);
      strcpy(client.instance, instance);
      strncpy(client.cell, cell, sizeof(client.cell));
      code = ktc_SetToken(&server, token, &client, 0);
!     UNLOCK_GLOBAL_MUTEX return code;
  }
  
  
--- 284,321 ----
  	code =
  	    ktc_GetToken(&server, token, sizeof(struct ktc_token), &client);
  	if (code == 0) {
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    return 0;
  	}
      }
  
      if ((name == 0) || (key == 0)) {
  	/* just lookup in cache don't get new one */
! 	UNLOCK_GLOBAL_MUTEX;
! 	return KANOTICKET;
      }
  
      /* get an unauthenticated connection to desired cell */
      code = ka_AuthServerConn(cell, KA_AUTHENTICATION_SERVICE, 0, &conn);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
      code =
  	ka_Authenticate(name, instance, cell, conn, KA_MAINTENANCE_SERVICE,
  			key, now, now + lifetime, token, 0);
      (void)ubik_ClientDestroy(conn);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
  
      strcpy(client.name, name);
      strcpy(client.instance, instance);
      strncpy(client.cell, cell, sizeof(client.cell));
      code = ktc_SetToken(&server, token, &client, 0);
!     UNLOCK_GLOBAL_MUTEX;
!     return code;
  }
  
  
***************
*** 301,309 ****
      char cellname[MAXKTCREALMLEN];
      afs_int32 pwexpires;
  
!     LOCK_GLOBAL_MUTEX code = ka_ExpandCell(cell, cellname, 0 /*local */ );
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
  
      cell = cellname;
--- 330,340 ----
      char cellname[MAXKTCREALMLEN];
      afs_int32 pwexpires;
  
!     LOCK_GLOBAL_MUTEX;
!     code = ka_ExpandCell(cell, cellname, 0 /*local */ );
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
  
      cell = cellname;
***************
*** 311,317 ****
      /* get an unauthenticated connection to desired cell */
      code = ka_AuthServerConn(cell, KA_AUTHENTICATION_SERVICE, 0, &conn);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
  
      code =
--- 342,349 ----
      /* get an unauthenticated connection to desired cell */
      code = ka_AuthServerConn(cell, KA_AUTHENTICATION_SERVICE, 0, &conn);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
  
      code =
***************
*** 319,326 ****
  			KA_TICKET_GRANTING_SERVICE, key, now,
  			now + MAXKTCTICKETLIFETIME, &token, &pwexpires);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX return code;
      }
      code = ubik_ClientDestroy(conn);
!     UNLOCK_GLOBAL_MUTEX return code;
  }
--- 351,360 ----
  			KA_TICKET_GRANTING_SERVICE, key, now,
  			now + MAXKTCTICKETLIFETIME, &token, &pwexpires);
      if (code) {
! 	UNLOCK_GLOBAL_MUTEX;
! 	return code;
      }
      code = ubik_ClientDestroy(conn);
!     UNLOCK_GLOBAL_MUTEX;
!     return code;
  }
Index: openafs/src/kauth/user.c
diff -c openafs/src/kauth/user.c:1.11 openafs/src/kauth/user.c:1.11.2.1
*** openafs/src/kauth/user.c:1.11	Tue Jul 15 19:15:17 2003
--- openafs/src/kauth/user.c	Wed Aug 25 03:09:38 2004
***************
*** 18,24 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/user.c,v 1.11 2003/07/15 23:15:17 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "afs/sysincludes.h"
--- 18,24 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/user.c,v 1.11.2.1 2004/08/25 07:09:38 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "afs/sysincludes.h"
***************
*** 68,74 ****
  
  afs_int32
  GetTickets(char *name, char *instance, char *realm,
! 	   struct ktc_encryptionKey *key, Date lifetime,
  	   afs_int32 * pwexpires, afs_int32 flags)
  {
      afs_int32 code;
--- 68,74 ----
  
  afs_int32
  GetTickets(char *name, char *instance, char *realm,
! 	   struct ktc_encryptionKey * key, Date lifetime,
  	   afs_int32 * pwexpires, afs_int32 flags)
  {
      afs_int32 code;
Index: openafs/src/kauth/user_nt.c
diff -c openafs/src/kauth/user_nt.c:1.12 openafs/src/kauth/user_nt.c:1.12.2.1
*** openafs/src/kauth/user_nt.c:1.12	Sat Nov 29 16:38:00 2003
--- openafs/src/kauth/user_nt.c	Wed Aug 25 03:09:38 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/user_nt.c,v 1.12 2003/11/29 21:38:00 jaltman Exp $");
  
  #include <afs/stds.h>
  
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/user_nt.c,v 1.12.2.1 2004/08/25 07:09:38 shadow Exp $");
  
  #include <afs/stds.h>
  
***************
*** 797,803 ****
  	(void)fflush(stdout);
      }
      FD_ZERO(&readfds);
!     FD_SET(f,&readfds);
      errno = 0;
      /* select - either recv is ready, or timeout */
      /* see if timeout or error or wrong descriptor */
--- 797,803 ----
  	(void)fflush(stdout);
      }
      FD_ZERO(&readfds);
!     FD_SET(f, &readfds);
      errno = 0;
      /* select - either recv is ready, or timeout */
      /* see if timeout or error or wrong descriptor */
Index: openafs/src/libadmin/adminutil/afs_utilAdmin.c
diff -c openafs/src/libadmin/adminutil/afs_utilAdmin.c:1.7 openafs/src/libadmin/adminutil/afs_utilAdmin.c:1.7.2.1
*** openafs/src/libadmin/adminutil/afs_utilAdmin.c:1.7	Tue Jul 15 19:15:23 2003
--- openafs/src/libadmin/adminutil/afs_utilAdmin.c	Wed Aug 25 03:09:38 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/libadmin/adminutil/afs_utilAdmin.c,v 1.7 2003/07/15 23:15:23 shadow Exp $");
  
  #include <afs/stds.h>
  #include <afs/afs_Admin.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/libadmin/adminutil/afs_utilAdmin.c,v 1.7.2.1 2004/08/25 07:09:38 shadow Exp $");
  
  #include <afs/stds.h>
  #include <afs/afs_Admin.h>
***************
*** 446,452 ****
      if (num_converted == 4) {
  	*serverAddress = (part1 << 24) | (part2 << 16) | (part3 << 8) | part4;
      } else {
! 	LOCK_GLOBAL_MUTEX server = gethostbyname(serverName);
  	if (server != NULL) {
  	    memcpy((void *)serverAddress, (const void *)server->h_addr,
  		   sizeof(serverAddress));
--- 446,453 ----
      if (num_converted == 4) {
  	*serverAddress = (part1 << 24) | (part2 << 16) | (part3 << 8) | part4;
      } else {
! 	LOCK_GLOBAL_MUTEX;
! 	server = gethostbyname(serverName);
  	if (server != NULL) {
  	    memcpy((void *)serverAddress, (const void *)server->h_addr,
  		   sizeof(serverAddress));
***************
*** 456,462 ****
  	    UNLOCK_GLOBAL_MUTEX;
  	    goto fail_util_AdminServerAddressGetFromName;
  	}
!     UNLOCK_GLOBAL_MUTEX}
      rc = 1;
  
    fail_util_AdminServerAddressGetFromName:
--- 457,464 ----
  	    UNLOCK_GLOBAL_MUTEX;
  	    goto fail_util_AdminServerAddressGetFromName;
  	}
! 	UNLOCK_GLOBAL_MUTEX;
!     }
      rc = 1;
  
    fail_util_AdminServerAddressGetFromName:
Index: openafs/src/libadmin/client/afs_clientAdmin.c
diff -c openafs/src/libadmin/client/afs_clientAdmin.c:1.9 openafs/src/libadmin/client/afs_clientAdmin.c:1.9.2.1
*** openafs/src/libadmin/client/afs_clientAdmin.c:1.9	Tue Jul 15 19:15:28 2003
--- openafs/src/libadmin/client/afs_clientAdmin.c	Wed Aug 25 03:09:39 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/libadmin/client/afs_clientAdmin.c,v 1.9 2003/07/15 23:15:28 shadow Exp $");
  
  #include <afs/stds.h>
  #include "afs_clientAdmin.h"
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/libadmin/client/afs_clientAdmin.c,v 1.9.2.1 2004/08/25 07:09:39 shadow Exp $");
  
  #include <afs/stds.h>
  #include "afs_clientAdmin.h"
***************
*** 1956,1962 ****
       * Iterate over the list and fill in the hostname of each of the servers
       */
  
!     LOCK_GLOBAL_MUTEX for (iserv = 0; iserv < serv->total; iserv++) {
  	int addr = htonl(serv->server[iserv].serverAddress[0]);
  	host = gethostbyaddr((const char *)&addr, sizeof(int), AF_INET);
  	if (host != NULL) {
--- 1956,1963 ----
       * Iterate over the list and fill in the hostname of each of the servers
       */
  
!     LOCK_GLOBAL_MUTEX;
!     for (iserv = 0; iserv < serv->total; iserv++) {
  	int addr = htonl(serv->server[iserv].serverAddress[0]);
  	host = gethostbyaddr((const char *)&addr, sizeof(int), AF_INET);
  	if (host != NULL) {
***************
*** 1964,1971 ****
  		    AFS_MAX_SERVER_NAME_LEN);
  	}
      }
!     UNLOCK_GLOBAL_MUTEX
! 	if (IteratorInit
  	    (iter, (void *)serv, GetServerRPC, GetServerFromCache, NULL, NULL,
  	     &tst)) {
  	*iterationIdP = (void *)iter;
--- 1965,1972 ----
  		    AFS_MAX_SERVER_NAME_LEN);
  	}
      }
!     UNLOCK_GLOBAL_MUTEX;
!     if (IteratorInit
  	    (iter, (void *)serv, GetServerRPC, GetServerFromCache, NULL, NULL,
  	     &tst)) {
  	*iterationIdP = (void *)iter;
Index: openafs/src/libafs/MakefileProto.LINUX.in
diff -c openafs/src/libafs/MakefileProto.LINUX.in:1.40 openafs/src/libafs/MakefileProto.LINUX.in:1.40.2.1
*** openafs/src/libafs/MakefileProto.LINUX.in:1.40	Wed Jul 28 23:57:05 2004
--- openafs/src/libafs/MakefileProto.LINUX.in	Wed Aug 25 03:03:39 2004
***************
*** 61,66 ****
--- 61,70 ----
  CCFLAGS = $(COMMON_KERN_CFLAGS) -fsigned-char
  DEFINES = $(COMMON_DEFINES) -D__s390__ 
  
+ <s390x_linux22 s390x_linux24>
+ CCFLAGS = $(COMMON_KERN_CFLAGS) -fsigned-char
+ DEFINES = $(COMMON_DEFINES) -D__s390x__ 
+ 
  <sparc_linux22 sparc_linux24>
  LD = ld -m elf32_sparc
  CCFLAGS = $(COMMON_KERN_CFLAGS) -mcpu=v8 -mno-fpu -fcall-used-g5 -fcall-used-g7
***************
*** 152,157 ****
--- 156,163 ----
  	ln -fs ${LINUX_KERNEL_PATH}/include/asm-x86_64 asm
  <s390_linux22 s390_linux24>
  	ln -fs ${LINUX_KERNEL_PATH}/include/asm-s390 asm
+ <s390x_linux22 s390x_linux24>
+ 	ln -fs ${LINUX_KERNEL_PATH}/include/asm-s390x asm
  <ppc_linux22 ppc_linux24>
  	ln -fs ${LINUX_KERNEL_PATH}/include/asm-ppc asm 
  <ppc64_linux24>
Index: openafs/src/libafsauthent/mapfile
diff -c openafs/src/libafsauthent/mapfile:1.2 openafs/src/libafsauthent/mapfile:1.2.20.1
*** openafs/src/libafsauthent/mapfile:1.2	Sat Nov  4 05:05:05 2000
--- openafs/src/libafsauthent/mapfile	Wed Aug 25 02:59:31 2004
***************
*** 77,82 ****
--- 77,87 ----
  	afs_krb_get_lrealm;
  	pr_NameToId;
  	pr_IdToName;
+ 	pr_ListMembers;
+ 	pr_End;
+ 	pr_SNameToId;
+ 	afs_get_pag_from_groups;
+ 	setpag;
  
      local:
  	*;
Index: openafs/src/lwp/Makefile.in
diff -c openafs/src/lwp/Makefile.in:1.29 openafs/src/lwp/Makefile.in:1.29.2.2
*** openafs/src/lwp/Makefile.in:1.29	Sun Aug  8 19:49:52 2004
--- openafs/src/lwp/Makefile.in	Wed Aug 25 03:39:33 2004
***************
*** 44,58 ****
  		$(CCOBJ) ${LWP_DBG} ${LWP_OPTMZ} -c -I${TOP_INCDIR} -KPIC -G0  ${srcdir}/process.s;; \
  	sgi_61 | sgi_62 | sgi_63 ) \
  		$(CCOBJ) ${LWP_DBG} ${LWP_OPTMZ} -c ${XCFLAGS} -I${TOP_INCDIR} -KPIC -G0  ${srcdir}/process.s;; \
! 	s390*) \
! 		/lib/cpp -P -I${TOP_INCDIR} ${srcdir}/process.s >process.ss; \
  		${AS} -ahlns process.ss -o process.o >process.lst; \
  		$(RM) process.ss ;; \
  	*_darwin* ) \
  		$(CC) ${LWP_DBG} ${LWP_OPTMZ} -c ${XCFLAGS} -I${TOP_INCDIR} ${srcdir}/process.s;; \
  	i386_*bsd*) \
  		cp ${srcdir}/process.i386.s process.S ; \
! 		${CCOBJ} -E -I${srcdir} -I${TOP_INCDIR} process.S >process.ss ; \
  		${AS} process.ss -o process.o ;  \
  		$(RM) -f process.S ;;\
  	ncrx86_* | sunx86_*) \
--- 44,62 ----
  		$(CCOBJ) ${LWP_DBG} ${LWP_OPTMZ} -c -I${TOP_INCDIR} -KPIC -G0  ${srcdir}/process.s;; \
  	sgi_61 | sgi_62 | sgi_63 ) \
  		$(CCOBJ) ${LWP_DBG} ${LWP_OPTMZ} -c ${XCFLAGS} -I${TOP_INCDIR} -KPIC -G0  ${srcdir}/process.s;; \
! 	s390_*) \
! 		/lib/cpp -P -I${TOP_INCDIR} ${srcdir}/process.s390.s >process.ss; \
! 		${AS} -ahlns process.ss -o process.o >process.lst; \
! 		$(RM) process.ss ;; \
! 	s390x_*) \
! 		/lib/cpp -P -I${TOP_INCDIR} ${srcdir}/process.s390x.s >process.ss; \
  		${AS} -ahlns process.ss -o process.o >process.lst; \
  		$(RM) process.ss ;; \
  	*_darwin* ) \
  		$(CC) ${LWP_DBG} ${LWP_OPTMZ} -c ${XCFLAGS} -I${TOP_INCDIR} ${srcdir}/process.s;; \
  	i386_*bsd*) \
  		cp ${srcdir}/process.i386.s process.S ; \
! 		${CCOBJ} -DIGNORE_STDS_H -E -I${srcdir} -I${TOP_INCDIR} process.S > process.ss ; \
  		${AS} process.ss -o process.o ;  \
  		$(RM) -f process.S ;;\
  	ncrx86_* | sunx86_*) \
Index: openafs/src/lwp/lock.h
diff -c openafs/src/lwp/lock.h:1.6 openafs/src/lwp/lock.h:1.6.2.1
*** openafs/src/lwp/lock.h:1.6	Tue Jul 15 19:15:45 2003
--- openafs/src/lwp/lock.h	Wed Aug 25 03:09:40 2004
***************
*** 45,52 ****
  #ifdef AFS_PTHREAD_ENV
  #include <assert.h>
  #include <pthread.h>
! #define LOCK_LOCK(A) assert(pthread_mutex_lock(&(A)->mutex) == 0);
! #define LOCK_UNLOCK(A) assert(pthread_mutex_unlock(&(A)->mutex) == 0);
  #else /* AFS_PTHREAD_ENV */
  #define LOCK_LOCK(A)
  #define LOCK_UNLOCK(A)
--- 45,52 ----
  #ifdef AFS_PTHREAD_ENV
  #include <assert.h>
  #include <pthread.h>
! #define LOCK_LOCK(A) assert(pthread_mutex_lock(&(A)->mutex) == 0)
! #define LOCK_UNLOCK(A) assert(pthread_mutex_unlock(&(A)->mutex) == 0)
  #else /* AFS_PTHREAD_ENV */
  #define LOCK_LOCK(A)
  #define LOCK_UNLOCK(A)
***************
*** 82,169 ****
  
  #define ObtainReadLock(lock)\
  	BEGINMAC \
! 	    LOCK_LOCK(lock) \
  	    if (!((lock)->excl_locked & WRITE_LOCK) && !(lock)->wait_states)\
  		(lock) -> readers_reading++;\
  	    else\
  		Afs_Lock_Obtain(lock, READ_LOCK); \
! 	    LOCK_UNLOCK(lock) \
  	ENDMAC
  
  #define ObtainReadLockNoBlock(lock, code)\
          BEGINMAC \
!             LOCK_LOCK(lock) \
              if (!((lock)->excl_locked & WRITE_LOCK) && !(lock)->wait_states) {\
                  (lock) -> readers_reading++;\
                  code = 0;\
              }\
              else\
                  code = -1; \
!             LOCK_UNLOCK(lock) \
          ENDMAC
  
  #define ObtainWriteLock(lock)\
  	BEGINMAC \
! 	    LOCK_LOCK(lock) \
  	    if (!(lock)->excl_locked && !(lock)->readers_reading)\
  		(lock) -> excl_locked = WRITE_LOCK;\
  	    else\
  		Afs_Lock_Obtain(lock, WRITE_LOCK); \
! 	    LOCK_UNLOCK(lock) \
  	ENDMAC
  
  #define ObtainWriteLockNoBlock(lock, code)\
          BEGINMAC \
!             LOCK_LOCK(lock) \
              if (!(lock)->excl_locked && !(lock)->readers_reading) {\
                  (lock) -> excl_locked = WRITE_LOCK;\
                  code = 0;\
              }\
              else\
                  code = -1; \
!             LOCK_UNLOCK(lock) \
          ENDMAC
  
  #define ObtainSharedLock(lock)\
  	BEGINMAC \
! 	    LOCK_LOCK(lock) \
  	    if (!(lock)->excl_locked && !(lock)->wait_states)\
  		(lock) -> excl_locked = SHARED_LOCK;\
  	    else\
  	        Afs_Lock_Obtain(lock, SHARED_LOCK); \
! 	    LOCK_UNLOCK(lock) \
  	ENDMAC
  
  #define ObtainSharedLockNoBlock(lock, code)\
          BEGINMAC \
!             LOCK_LOCK(lock) \
              if (!(lock)->excl_locked && !(lock)->wait_states) {\
                  (lock) -> excl_locked = SHARED_LOCK;\
                  code = 0;\
              }\
              else\
                  code = -1; \
!             LOCK_UNLOCK(lock) \
          ENDMAC
  
  #define BoostSharedLock(lock)\
  	BEGINMAC \
! 	    LOCK_LOCK(lock) \
  	    if (!(lock)->readers_reading)\
  		(lock)->excl_locked = WRITE_LOCK;\
  	    else\
  		Afs_Lock_Obtain(lock, BOOSTED_LOCK); \
! 	    LOCK_UNLOCK(lock) \
  	ENDMAC
  
  /* this must only be called with a WRITE or boosted SHARED lock! */
  #define UnboostSharedLock(lock)\
  	BEGINMAC\
! 	    LOCK_LOCK(lock) \
  	    (lock)->excl_locked = SHARED_LOCK; \
  	    if((lock)->wait_states) \
  		Afs_Lock_ReleaseR(lock); \
! 	    LOCK_UNLOCK(lock) \
  	ENDMAC
  
  #ifdef notdef
--- 82,169 ----
  
  #define ObtainReadLock(lock)\
  	BEGINMAC \
! 	    LOCK_LOCK(lock); \
  	    if (!((lock)->excl_locked & WRITE_LOCK) && !(lock)->wait_states)\
  		(lock) -> readers_reading++;\
  	    else\
  		Afs_Lock_Obtain(lock, READ_LOCK); \
! 	    LOCK_UNLOCK(lock); \
  	ENDMAC
  
  #define ObtainReadLockNoBlock(lock, code)\
          BEGINMAC \
!             LOCK_LOCK(lock); \
              if (!((lock)->excl_locked & WRITE_LOCK) && !(lock)->wait_states) {\
                  (lock) -> readers_reading++;\
                  code = 0;\
              }\
              else\
                  code = -1; \
!             LOCK_UNLOCK(lock); \
          ENDMAC
  
  #define ObtainWriteLock(lock)\
  	BEGINMAC \
! 	    LOCK_LOCK(lock); \
  	    if (!(lock)->excl_locked && !(lock)->readers_reading)\
  		(lock) -> excl_locked = WRITE_LOCK;\
  	    else\
  		Afs_Lock_Obtain(lock, WRITE_LOCK); \
! 	    LOCK_UNLOCK(lock); \
  	ENDMAC
  
  #define ObtainWriteLockNoBlock(lock, code)\
          BEGINMAC \
!             LOCK_LOCK(lock); \
              if (!(lock)->excl_locked && !(lock)->readers_reading) {\
                  (lock) -> excl_locked = WRITE_LOCK;\
                  code = 0;\
              }\
              else\
                  code = -1; \
!             LOCK_UNLOCK(lock); \
          ENDMAC
  
  #define ObtainSharedLock(lock)\
  	BEGINMAC \
! 	    LOCK_LOCK(lock); \
  	    if (!(lock)->excl_locked && !(lock)->wait_states)\
  		(lock) -> excl_locked = SHARED_LOCK;\
  	    else\
  	        Afs_Lock_Obtain(lock, SHARED_LOCK); \
! 	    LOCK_UNLOCK(lock); \
  	ENDMAC
  
  #define ObtainSharedLockNoBlock(lock, code)\
          BEGINMAC \
!             LOCK_LOCK(lock); \
              if (!(lock)->excl_locked && !(lock)->wait_states) {\
                  (lock) -> excl_locked = SHARED_LOCK;\
                  code = 0;\
              }\
              else\
                  code = -1; \
!             LOCK_UNLOCK(lock); \
          ENDMAC
  
  #define BoostSharedLock(lock)\
  	BEGINMAC \
! 	    LOCK_LOCK(lock); \
  	    if (!(lock)->readers_reading)\
  		(lock)->excl_locked = WRITE_LOCK;\
  	    else\
  		Afs_Lock_Obtain(lock, BOOSTED_LOCK); \
! 	    LOCK_UNLOCK(lock); \
  	ENDMAC
  
  /* this must only be called with a WRITE or boosted SHARED lock! */
  #define UnboostSharedLock(lock)\
  	BEGINMAC\
! 	    LOCK_LOCK(lock); \
  	    (lock)->excl_locked = SHARED_LOCK; \
  	    if((lock)->wait_states) \
  		Afs_Lock_ReleaseR(lock); \
! 	    LOCK_UNLOCK(lock); \
  	ENDMAC
  
  #ifdef notdef
***************
*** 177,186 ****
  
  #define ReleaseReadLock(lock)\
  	BEGINMAC\
! 	    LOCK_LOCK(lock) \
  	    if (!--(lock)->readers_reading && (lock)->wait_states)\
  		Afs_Lock_ReleaseW(lock) ; \
! 	    LOCK_UNLOCK(lock) \
  	ENDMAC
  
  
--- 177,186 ----
  
  #define ReleaseReadLock(lock)\
  	BEGINMAC\
! 	    LOCK_LOCK(lock); \
  	    if (!--(lock)->readers_reading && (lock)->wait_states)\
  		Afs_Lock_ReleaseW(lock) ; \
! 	    LOCK_UNLOCK(lock); \
  	ENDMAC
  
  
***************
*** 195,204 ****
  
  #define ReleaseWriteLock(lock)\
  	BEGINMAC\
! 	    LOCK_LOCK(lock) \
  	    (lock)->excl_locked &= ~WRITE_LOCK;\
  	    if ((lock)->wait_states) Afs_Lock_ReleaseR(lock);\
! 	    LOCK_UNLOCK(lock) \
  	ENDMAC
  
  #ifdef notdef
--- 195,204 ----
  
  #define ReleaseWriteLock(lock)\
  	BEGINMAC\
! 	    LOCK_LOCK(lock); \
  	    (lock)->excl_locked &= ~WRITE_LOCK;\
  	    if ((lock)->wait_states) Afs_Lock_ReleaseR(lock);\
! 	    LOCK_UNLOCK(lock); \
  	ENDMAC
  
  #ifdef notdef
***************
*** 213,222 ****
  /* can be used on shared or boosted (write) locks */
  #define ReleaseSharedLock(lock)\
  	BEGINMAC\
! 	    LOCK_LOCK(lock) \
  	    (lock)->excl_locked &= ~(SHARED_LOCK | WRITE_LOCK);\
  	    if ((lock)->wait_states) Afs_Lock_ReleaseR(lock);\
! 	    LOCK_UNLOCK(lock) \
  	ENDMAC
  
  #ifdef notdef
--- 213,222 ----
  /* can be used on shared or boosted (write) locks */
  #define ReleaseSharedLock(lock)\
  	BEGINMAC\
! 	    LOCK_LOCK(lock); \
  	    (lock)->excl_locked &= ~(SHARED_LOCK | WRITE_LOCK);\
  	    if ((lock)->wait_states) Afs_Lock_ReleaseR(lock);\
! 	    LOCK_UNLOCK(lock); \
  	ENDMAC
  
  #ifdef notdef
***************
*** 232,243 ****
  /* convert a write lock to a read lock */
  #define ConvertWriteToReadLock(lock)\
  	BEGINMAC\
! 	    LOCK_LOCK(lock) \
  	    (lock)->excl_locked &= ~WRITE_LOCK;\
  	    (lock)->readers_reading++;\
  	    if ((lock)->wait_states & READ_LOCK) \
  		Afs_Lock_WakeupR(lock) ; \
! 	    LOCK_UNLOCK(lock) \
  	ENDMAC
  
  /* I added this next macro to make sure it is safe to nuke a lock -- Mike K. */
--- 232,243 ----
  /* convert a write lock to a read lock */
  #define ConvertWriteToReadLock(lock)\
  	BEGINMAC\
! 	    LOCK_LOCK(lock); \
  	    (lock)->excl_locked &= ~WRITE_LOCK;\
  	    (lock)->readers_reading++;\
  	    if ((lock)->wait_states & READ_LOCK) \
  		Afs_Lock_WakeupR(lock) ; \
! 	    LOCK_UNLOCK(lock); \
  	ENDMAC
  
  /* I added this next macro to make sure it is safe to nuke a lock -- Mike K. */
Index: openafs/src/lwp/lwp.c
diff -c openafs/src/lwp/lwp.c:1.27 openafs/src/lwp/lwp.c:1.27.2.1
*** openafs/src/lwp/lwp.c:1.27	Wed Jul 28 16:59:58 2004
--- openafs/src/lwp/lwp.c	Wed Aug 25 03:03:40 2004
***************
*** 17,23 ****
  #include <afsconfig.h>
  #include <afs/param.h>
  
! RCSID("$Header: /cvs/openafs/src/lwp/lwp.c,v 1.27 2004/07/28 20:59:58 shadow Exp $");
  
  #include <stdlib.h>
  #include <stdio.h>
--- 17,23 ----
  #include <afsconfig.h>
  #include <afs/param.h>
  
! RCSID("$Header: /cvs/openafs/src/lwp/lwp.c,v 1.27.2.1 2004/08/25 07:03:40 shadow Exp $");
  
  #include <stdlib.h>
  #include <stdio.h>
***************
*** 73,78 ****
--- 73,82 ----
  #define MINFRAME 128
  #define STACK_ALIGN 8
  #else
+ #ifdef __s390x__
+ #define MINFRAME    160
+ #define STACK_ALIGN 8
+ #else
  #ifdef __s390__
  #define MINFRAME    96
  #define STACK_ALIGN 8
***************
*** 80,85 ****
--- 84,90 ----
  #define STACK_ALIGN 4
  #endif
  #endif
+ #endif
  
  /* Debugging macro */
  #ifdef DEBUG
Index: openafs/src/lwp/process.i386.s
diff -c openafs/src/lwp/process.i386.s:1.5 openafs/src/lwp/process.i386.s:1.5.2.1
*** openafs/src/lwp/process.i386.s:1.5	Tue Aug  3 10:45:49 2004
--- openafs/src/lwp/process.i386.s	Wed Aug 25 03:00:41 2004
***************
*** 16,23 ****
   * "ojala que es correcto!"
   */
  
- #define IGNORE_STDS_H  1
- #include <afs/param.h>
  #include <lwp_elf.h>
  
  	.file "process.s"
--- 16,21 ----
Index: openafs/src/lwp/process.s
diff -c openafs/src/lwp/process.s:1.11 openafs/src/lwp/process.s:1.11.2.1
*** openafs/src/lwp/process.s:1.11	Mon Jun 23 13:02:18 2003
--- openafs/src/lwp/process.s	Wed Aug 25 03:03:40 2004
***************
*** 167,259 ****
  	.extern	PRE_Block[ua]
  
  #endif	/* RIOS	*/
- #if defined(AFS_S390_LINUX20_ENV)
-       /* Linux for S/390 (31 bit)
-        *
-        * Written by Neale Ferguson <Neale.Ferguson@SoftwareAG-usa.com>
-        *
-        *  additional munging by Adam Thornton <adam@sinenomine.net>
-        */
-               .file   "process.s"
- 
-               .globl savecontext
-               .type  savecontext,%function
-       /*
-        * savecontext(f, area1, newsp)
-        *      int (*f)();    struct savearea *area1; char *newsp;
-        * f     - r2
-        * area1 - r3
-        * newsp - r4
-        */
- 
-        /*
-         * struct savearea {
-         *      char    *topstack;
-         * }
-         */
- 
- P_PRE:	                  .long   PRE_Block
- P_ABORT:	              .long   abort
- 
- savecontext:
-               stm     %r6,%r15,24(%r15)       /* Save our registers */
-               lr      %r1,%r15
-               ahi     %r15,-96                /* Move out of harm's way */
-               st      %r1,0(%r15)
-               bras    %r5,.L0                 /* Get A(A(PRE_Block)) */
-               .long   PRE_Block
-       .L0:
-               l       %r5,0(%r5)              /* Get A(PRE_Block) */
-               mvi     3(%r5),1                /* Set it */
-               lr      %r6,%r3                 /* Get base of savearea */
-               st      %r15,0(%r3)             /* Save stack pointer */
-               ltr     %r4,%r4                 /* If new sp is 0 */
-               jz      .L1                     /* ... don't change sp */
-               lr      %r15,%r4                /* Set new stack pointer */
-       .L1:
-               br      %r2                     /* Call the routine */
-               /* Can't get here....*/
- 
-               bras    %r5,.L2
-               .long   abort
-       .L2:
-               l      %r5,0(%r5)
-               balr    %r14,%r5
- 
-       .savecontext_end:
-               .size   savecontext,.savecontext_end-savecontext
- 
-       /*
-        * returnto(area2)
-        *      struct savearea *area2;
-        *
-        * area2 - r2
-        */
-         .globl  returnto
-         .type   returnto,%function
- returnto:
-         l       %r15,0(%r2)             /* New frame, to get correct pointer*/
-         bras    %r5,.L3                         /* Get A(A(PRE_Block))
-       */
-                  .long          PRE_Block
-       .L3:
-               l       %r5,0(%r5)              /* Get A(PRE_Block) */
-               /*xc      0(4,%r5),0(%r5)         /* Clear it */
- 	      mvi     3(%r5),0                /* Clear it */ 
- 	      l       %r15,0(%r15)
-               lm      %r6,%r15,24(%r15)       /* Restore registers */
-               br      %r14                    /* Return */
- 
- 	      /* Can't happen */
-               la      %r2,1234
-               bras    %r5,.L4
-                 .long          abort
-       .L4:
-               l       %r5,0(%r5)
-               basr    %r14,%r5
-       .returnto_end:
-               .size   returnto,.returnto_end-returnto
- #endif /* AFS_S390_LINUX20_ENV */
  	
  #ifdef mc68000
  /*
--- 167,172 ----
Index: openafs/src/lwp/process.s390.s
diff -c /dev/null openafs/src/lwp/process.s390.s:1.1.2.1
*** /dev/null	Wed Aug 25 03:47:57 2004
--- openafs/src/lwp/process.s390.s	Wed Aug 25 03:03:41 2004
***************
*** 0 ****
--- 1,98 ----
+ /*
+  * Copyright 2000, International Business Machines Corporation and others.
+  * All Rights Reserved.
+  * 
+  * This software has been released under the terms of the IBM Public
+  * License.  For details, see the LICENSE file in the top-level source
+  * directory or online at http://www.openafs.org/dl/license10.html
+  *
+  * Linux for S/390 (31 bit)
+  *
+  * Written by Neale Ferguson <Neale.Ferguson@SoftwareAG-usa.com>
+  *
+  *  additional munging by Adam Thornton <adam@sinenomine.net>
+  */
+ 
+ #define	IGNORE_STDS_H	1
+ #include <afs/param.h>
+ 
+               .file   "process.s"
+ 
+               .globl savecontext
+               .type  savecontext,%function
+       /*
+        * savecontext(f, area1, newsp)
+        *      int (*f)();    struct savearea *area1; char *newsp;
+        * f     - r2
+        * area1 - r3
+        * newsp - r4
+        */
+ 
+        /*
+         * struct savearea {
+         *      char    *topstack;
+         * }
+         */
+ 
+ P_PRE:	                  .long   PRE_Block
+ P_ABORT:	              .long   abort
+ 
+ savecontext:
+               stm     %r6,%r15,24(%r15)       /* Save our registers */
+               lr      %r1,%r15
+               ahi     %r15,-96                /* Move out of harm's way */
+               st      %r1,0(%r15)
+               bras    %r5,.L0                 /* Get A(A(PRE_Block)) */
+               .long   PRE_Block
+       .L0:
+               l       %r5,0(%r5)              /* Get A(PRE_Block) */
+               mvi     3(%r5),1                /* Set it */
+               lr      %r6,%r3                 /* Get base of savearea */
+               st      %r15,0(%r3)             /* Save stack pointer */
+               ltr     %r4,%r4                 /* If new sp is 0 */
+               jz      .L1                     /* ... don't change sp */
+               lr      %r15,%r4                /* Set new stack pointer */
+       .L1:
+               br      %r2                     /* Call the routine */
+               /* Can't get here....*/
+ 
+               bras    %r5,.L2
+               .long   abort
+       .L2:
+               l      %r5,0(%r5)
+               balr    %r14,%r5
+ 
+       .savecontext_end:
+               .size   savecontext,.savecontext_end-savecontext
+ 
+       /*
+        * returnto(area2)
+        *      struct savearea *area2;
+        *
+        * area2 - r2
+        */
+         .globl  returnto
+         .type   returnto,%function
+ returnto:
+         l       %r15,0(%r2)             /* New frame, to get correct pointer*/
+         bras    %r5,.L3                         /* Get A(A(PRE_Block))
+       */
+                  .long          PRE_Block
+       .L3:
+               l       %r5,0(%r5)              /* Get A(PRE_Block) */
+               /*xc      0(4,%r5),0(%r5)         /* Clear it */
+ 	      mvi     3(%r5),0                /* Clear it */ 
+ 	      l       %r15,0(%r15)
+               lm      %r6,%r15,24(%r15)       /* Restore registers */
+               br      %r14                    /* Return */
+ 
+ 	      /* Can't happen */
+               la      %r2,1234
+               bras    %r5,.L4
+                 .long          abort
+       .L4:
+               l       %r5,0(%r5)
+               basr    %r14,%r5
+       .returnto_end:
+               .size   returnto,.returnto_end-returnto
+ 
Index: openafs/src/lwp/process.s390x.s
diff -c /dev/null openafs/src/lwp/process.s390x.s:1.1.2.1
*** /dev/null	Wed Aug 25 03:47:57 2004
--- openafs/src/lwp/process.s390x.s	Wed Aug 25 03:03:41 2004
***************
*** 0 ****
--- 1,98 ----
+ /*
+  * Copyright 2000, International Business Machines Corporation and others.
+  * All Rights Reserved.
+  * 
+  * This software has been released under the terms of the IBM Public
+  * License.  For details, see the LICENSE file in the top-level source
+  * directory or online at http://www.openafs.org/dl/license10.html
+  *
+  * Linux for S/390X (64 bit)
+  * by Soewono Effendi <Soewono.Effendi@sysgo.de>
+  * & Horst Birthelmer <Horst.Birthelmer@sysgo.de>
+  *
+  * based on Linux for S/390 (31 bit)
+  * Written by Neale Ferguson <Neale.Ferguson@SoftwareAG-usa.com>
+ */
+ 
+ #define IGNORE_STDS_H  1
+ #include <afs/param.h>
+ 
+               .file   "process.s"
+ 
+               .globl savecontext
+               .type  savecontext,%function
+       /*
+        * savecontext(f, area1, newsp)
+        *      int (*f)();    struct savearea *area1; char *newsp;
+        * f     - r2
+        * area1 - r3
+        * newsp - r4
+        */
+ 
+        /*
+         * struct savearea {
+         *      char    *topstack;
+         * }
+         */
+ 
+ P_PRE:	                  .long   PRE_Block
+ P_ABORT:	              .long   abort
+ 
+ savecontext:
+               stmg     %r6,%r15,48(%r15)       /* Save our registers */
+               lgr      %r1,%r15
+               aghi     %r15,-160
+               stg      %r1,0(%r15)
+               brasl    %r5,.L0                 /* Get A(A(PRE_Block)) */
+               .long   PRE_Block
+       .L0:
+               l       %r5,0(%r5)              /* Get A(PRE_Block) */
+               mvi     3(%r5),1                /* Set it */
+               lgr      %r6,%r3                 /* Get base of savearea */
+               stg      %r15,0(%r3)             /* Save stack pointer */
+               ltgr     %r4,%r4                 /* If new sp is 0 */
+               jz      .L1                     /* ... don't change sp */
+               lgr      %r15,%r4                /* Set new stack pointer */
+       .L1:
+               br      %r2                     /* Call the routine */
+               /* Can't get here....*/
+ 
+               brasl    %r5,.L2
+               .long   abort
+       .L2:
+               l      %r5,0(%r5)
+               balr    %r14,%r5
+ 
+       .savecontext_end:
+               .size   savecontext,.savecontext_end-savecontext
+ 
+       /*
+        * returnto(area2)
+        *      struct savearea *area2;
+        *
+        * area2 - r2
+        */
+         .globl  returnto
+         .type   returnto,%function
+ returnto:
+         lg       %r15,0(%r2)             /* New frame, to get correct pointer*/
+         brasl    %r5,.L3                         /* Get A(A(PRE_Block)) */
+                  .long          PRE_Block
+       .L3:
+               l       %r5,0(%r5)              /* Get A(PRE_Block) */
+               /*xc      0(4,%r5),0(%r5)         /* Clear it */
+ 	      mvi     3(%r5),0                /* Clear it */ 
+ 	      lg       %r15,0(%r15)
+               lmg      %r6,%r15,48(%r15)       /* Restore registers */
+               br      %r14                    /* Return */
+ 
+ 	      /* Can't happen */
+               la      %r2,1234
+               brasl    %r5,.L4
+                 .long          abort
+       .L4:
+               l       %r5,0(%r5)
+               basr    %r14,%r5
+       .returnto_end:
+               .size   returnto,.returnto_end-returnto
+ 
Index: openafs/src/rx/rx.c
diff -c openafs/src/rx/rx.c:1.58 openafs/src/rx/rx.c:1.58.2.2
*** openafs/src/rx/rx.c:1.58	Wed Aug  4 15:41:53 2004
--- openafs/src/rx/rx.c	Wed Aug 25 03:13:09 2004
***************
*** 17,23 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx.c,v 1.58 2004/08/04 19:41:53 shadow Exp $");
  
  #ifdef KERNEL
  #include "afs/sysincludes.h"
--- 17,23 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx.c,v 1.58.2.2 2004/08/25 07:13:09 shadow Exp $");
  
  #ifdef KERNEL
  #include "afs/sysincludes.h"
***************
*** 221,227 ****
  
  pthread_once_t rx_once_init = PTHREAD_ONCE_INIT;
  #define INIT_PTHREAD_LOCKS \
! assert(pthread_once(&rx_once_init, rxi_InitPthread)==0);
  /*
   * The rx_stats_mutex mutex protects the following global variables:
   * rxi_dataQuota
--- 221,227 ----
  
  pthread_once_t rx_once_init = PTHREAD_ONCE_INIT;
  #define INIT_PTHREAD_LOCKS \
! assert(pthread_once(&rx_once_init, rxi_InitPthread)==0)
  /*
   * The rx_stats_mutex mutex protects the following global variables:
   * rxi_dataQuota
***************
*** 337,344 ****
   * rx_epoch
   */
  
! #define LOCK_EPOCH assert(pthread_mutex_lock(&epoch_mutex)==0);
! #define UNLOCK_EPOCH assert(pthread_mutex_unlock(&epoch_mutex)==0);
  #else
  #define LOCK_EPOCH
  #define UNLOCK_EPOCH
--- 337,344 ----
   * rx_epoch
   */
  
! #define LOCK_EPOCH assert(pthread_mutex_lock(&epoch_mutex)==0)
! #define UNLOCK_EPOCH assert(pthread_mutex_unlock(&epoch_mutex)==0)
  #else
  #define LOCK_EPOCH
  #define UNLOCK_EPOCH
***************
*** 347,354 ****
  void
  rx_SetEpoch(afs_uint32 epoch)
  {
!     LOCK_EPOCH rx_epoch = epoch;
! UNLOCK_EPOCH}
  
  /* Initialize rx.  A port number may be mentioned, in which case this
   * becomes the default port number for any service installed later.
--- 347,356 ----
  void
  rx_SetEpoch(afs_uint32 epoch)
  {
!     LOCK_EPOCH;
!     rx_epoch = epoch;
!     UNLOCK_EPOCH;
! }
  
  /* Initialize rx.  A port number may be mentioned, in which case this
   * becomes the default port number for any service installed later.
***************
*** 363,376 ****
   * rxinit_status
   */
  
! #define LOCK_RX_INIT assert(pthread_mutex_lock(&rx_init_mutex)==0);
! #define UNLOCK_RX_INIT assert(pthread_mutex_unlock(&rx_init_mutex)==0);
  #else
  #define LOCK_RX_INIT
  #define UNLOCK_RX_INIT
  #endif
  
! int 
  rx_InitHost(u_int host, u_int port)
  {
  #ifdef KERNEL
--- 365,378 ----
   * rxinit_status
   */
  
! #define LOCK_RX_INIT assert(pthread_mutex_lock(&rx_init_mutex)==0)
! #define UNLOCK_RX_INIT assert(pthread_mutex_unlock(&rx_init_mutex)==0)
  #else
  #define LOCK_RX_INIT
  #define UNLOCK_RX_INIT
  #endif
  
! int
  rx_InitHost(u_int host, u_int port)
  {
  #ifdef KERNEL
***************
*** 387,395 ****
  
      SPLVAR;
  
!     INIT_PTHREAD_LOCKS LOCK_RX_INIT if (rxinit_status == 0) {
  	tmp_status = rxinit_status;
! 	UNLOCK_RX_INIT return tmp_status;	/* Already started; return previous error code. */
      }
  #ifdef AFS_NT40_ENV
      if (afs_winsockInit() < 0)
--- 389,400 ----
  
      SPLVAR;
  
!     INIT_PTHREAD_LOCKS;
!     LOCK_RX_INIT;
!     if (rxinit_status == 0) {
  	tmp_status = rxinit_status;
! 	UNLOCK_RX_INIT;
! 	return tmp_status;	/* Already started; return previous error code. */
      }
  #ifdef AFS_NT40_ENV
      if (afs_winsockInit() < 0)
***************
*** 409,415 ****
  
      rx_socket = rxi_GetHostUDPSocket(host, (u_short) port);
      if (rx_socket == OSI_NULLSOCKET) {
! 	UNLOCK_RX_INIT return RX_ADDRINUSE;
      }
  #ifdef	RX_ENABLE_LOCKS
  #ifdef RX_LOCKS_DB
--- 414,421 ----
  
      rx_socket = rxi_GetHostUDPSocket(host, (u_short) port);
      if (rx_socket == OSI_NULLSOCKET) {
! 	UNLOCK_RX_INIT;
! 	return RX_ADDRINUSE;
      }
  #ifdef	RX_ENABLE_LOCKS
  #ifdef RX_LOCKS_DB
***************
*** 531,540 ****
      AFS_RXGUNLOCK();
      USERPRI;
      tmp_status = rxinit_status = 0;
!     UNLOCK_RX_INIT return tmp_status;
  }
  
! int rx_Init(u_int port) 
  {
      return rx_InitHost(htonl(INADDR_ANY), port);
  }
--- 537,548 ----
      AFS_RXGUNLOCK();
      USERPRI;
      tmp_status = rxinit_status = 0;
!     UNLOCK_RX_INIT;
!     return tmp_status;
  }
  
! int
! rx_Init(u_int port)
  {
      return rx_InitHost(htonl(INADDR_ANY), port);
  }
***************
*** 1924,1931 ****
  {
      register struct rx_connection **conn_ptr, **conn_end;
  
!     INIT_PTHREAD_LOCKS LOCK_RX_INIT if (rxinit_status == 1) {
! 	UNLOCK_RX_INIT return;	/* Already shutdown. */
      }
      rxi_DeleteCachedConnections();
      if (rx_connHashTable) {
--- 1932,1942 ----
  {
      register struct rx_connection **conn_ptr, **conn_end;
  
!     INIT_PTHREAD_LOCKS;
!     LOCK_RX_INIT;
!     if (rxinit_status == 1) {
! 	UNLOCK_RX_INIT;
! 	return;			/* Already shutdown. */
      }
      rxi_DeleteCachedConnections();
      if (rx_connHashTable) {
***************
*** 1963,1969 ****
      rxi_flushtrace();
  
      rxinit_status = 1;
! UNLOCK_RX_INIT}
  #endif
  
  /* if we wakeup packet waiter too often, can get in loop with two
--- 1974,1981 ----
      rxi_flushtrace();
  
      rxinit_status = 1;
!     UNLOCK_RX_INIT;
! }
  #endif
  
  /* if we wakeup packet waiter too often, can get in loop with two
***************
*** 2310,2316 ****
  	    if (type == RX_CLIENT_CONNECTION && pp->port == port)
  		break;
  	    /* So what happens when it's a callback connection? */
! 	    if (/*type == RX_CLIENT_CONNECTION &&*/ (conn->epoch & 0x80000000))
  		break;
  	}
  	if (!flag) {
--- 2322,2329 ----
  	    if (type == RX_CLIENT_CONNECTION && pp->port == port)
  		break;
  	    /* So what happens when it's a callback connection? */
! 	    if (		/*type == RX_CLIENT_CONNECTION && */
! 		   (conn->epoch & 0x80000000))
  		break;
  	}
  	if (!flag) {
***************
*** 3996,4006 ****
  	if (call->flags & RX_CALL_WAIT_PROC) {
  	    /* Conservative:  I don't think this should happen */
  	    call->flags &= ~RX_CALL_WAIT_PROC;
! 	    MUTEX_ENTER(&rx_stats_mutex);
! 	    rx_nWaiting--;
! 	    MUTEX_EXIT(&rx_stats_mutex);
! 	    if (queue_IsOnQueue(call))
! 	        queue_Remove(call);
  	}
  	call->state = RX_STATE_ACTIVE;
  	call->mode = RX_MODE_RECEIVING;
--- 4009,4020 ----
  	if (call->flags & RX_CALL_WAIT_PROC) {
  	    /* Conservative:  I don't think this should happen */
  	    call->flags &= ~RX_CALL_WAIT_PROC;
! 	    if (queue_IsOnQueue(call)) {
! 		queue_Remove(call);
! 		MUTEX_ENTER(&rx_stats_mutex);
! 		rx_nWaiting--;
! 		MUTEX_EXIT(&rx_stats_mutex);
! 	    }
  	}
  	call->state = RX_STATE_ACTIVE;
  	call->mode = RX_MODE_RECEIVING;
***************
*** 6079,6086 ****
   * counter
   */
  
! #define LOCK_RX_DEBUG assert(pthread_mutex_lock(&rx_debug_mutex)==0);
! #define UNLOCK_RX_DEBUG assert(pthread_mutex_unlock(&rx_debug_mutex)==0);
  #else
  #define LOCK_RX_DEBUG
  #define UNLOCK_RX_DEBUG
--- 6093,6100 ----
   * counter
   */
  
! #define LOCK_RX_DEBUG assert(pthread_mutex_lock(&rx_debug_mutex)==0)
! #define UNLOCK_RX_DEBUG assert(pthread_mutex_unlock(&rx_debug_mutex)==0)
  #else
  #define LOCK_RX_DEBUG
  #define UNLOCK_RX_DEBUG
***************
*** 6103,6110 ****
      register char *tp;
  
      endTime = time(0) + 20;	/* try for 20 seconds */
!     LOCK_RX_DEBUG counter++;
!     UNLOCK_RX_DEBUG tp = &tbuffer[sizeof(struct rx_header)];
      taddr.sin_family = AF_INET;
      taddr.sin_port = remotePort;
      taddr.sin_addr.s_addr = remoteAddr;
--- 6117,6126 ----
      register char *tp;
  
      endTime = time(0) + 20;	/* try for 20 seconds */
!     LOCK_RX_DEBUG;
!     counter++;
!     UNLOCK_RX_DEBUG;
!     tp = &tbuffer[sizeof(struct rx_header)];
      taddr.sin_family = AF_INET;
      taddr.sin_port = remotePort;
      taddr.sin_addr.s_addr = remoteAddr;
***************
*** 6134,6151 ****
  	tv.tv_sec = 1;
  	tv.tv_usec = 0;
  	code = select(socket + 1, &imask, 0, 0, &tv);
! 	if (code == 1 && FD_ISSET(socket,&imask)) {
  	    /* now receive a packet */
  	    faddrLen = sizeof(struct sockaddr_in);
  	    code =
  		recvfrom(socket, tbuffer, sizeof(tbuffer), 0,
  			 (struct sockaddr *)&faddr, &faddrLen);
  
!         if (code > 0) {
!             memcpy(&theader, tbuffer, sizeof(struct rx_header));
!             if (counter == ntohl(theader.callNumber))
!                 break;
!         }
  	}
  
  	/* see if we've timed out */
--- 6150,6167 ----
  	tv.tv_sec = 1;
  	tv.tv_usec = 0;
  	code = select(socket + 1, &imask, 0, 0, &tv);
! 	if (code == 1 && FD_ISSET(socket, &imask)) {
  	    /* now receive a packet */
  	    faddrLen = sizeof(struct sockaddr_in);
  	    code =
  		recvfrom(socket, tbuffer, sizeof(tbuffer), 0,
  			 (struct sockaddr *)&faddr, &faddrLen);
  
! 	    if (code > 0) {
! 		memcpy(&theader, tbuffer, sizeof(struct rx_header));
! 		if (counter == ntohl(theader.callNumber))
! 		    break;
! 	    }
  	}
  
  	/* see if we've timed out */
***************
*** 6418,6425 ****
      register struct rx_serverQueueEntry *sq;
  #endif /* KERNEL */
  
!     LOCK_RX_INIT if (rxinit_status == 1) {
! 	UNLOCK_RX_INIT return;	/* Already shutdown. */
      }
  #ifndef KERNEL
      rx_port = 0;
--- 6434,6443 ----
      register struct rx_serverQueueEntry *sq;
  #endif /* KERNEL */
  
!     LOCK_RX_INIT;
!     if (rxinit_status == 1) {
! 	UNLOCK_RX_INIT;
! 	return;			/* Already shutdown. */
      }
  #ifndef KERNEL
      rx_port = 0;
***************
*** 6536,6542 ****
      MUTEX_EXIT(&rx_stats_mutex);
  
      rxinit_status = 1;
! UNLOCK_RX_INIT}
  
  #ifdef RX_ENABLE_LOCKS
  void
--- 6554,6561 ----
      MUTEX_EXIT(&rx_stats_mutex);
  
      rxinit_status = 1;
!     UNLOCK_RX_INIT;
! }
  
  #ifdef RX_ENABLE_LOCKS
  void
Index: openafs/src/rx/rx_clock_nt.c
diff -c openafs/src/rx/rx_clock_nt.c:1.9 openafs/src/rx/rx_clock_nt.c:1.9.2.1
*** openafs/src/rx/rx_clock_nt.c:1.9	Thu Feb 26 14:23:02 2004
--- openafs/src/rx/rx_clock_nt.c	Wed Aug 25 03:09:41 2004
***************
*** 14,20 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_clock_nt.c,v 1.9 2004/02/26 19:23:02 jaltman Exp $");
  
  #ifdef AFS_NT40_ENV
  #include <stdio.h>
--- 14,20 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_clock_nt.c,v 1.9.2.1 2004/08/25 07:09:41 shadow Exp $");
  
  #ifdef AFS_NT40_ENV
  #include <stdio.h>
***************
*** 23,29 ****
  #include <winbase.h>
  #include "rx_clock.h"
  
! void clock_UpdateTime(void);    /* forward reference */
  
  struct clock clock_now;		/* The last elapsed time ready by clock_GetTimer */
  
--- 23,29 ----
  #include <winbase.h>
  #include "rx_clock.h"
  
! void clock_UpdateTime(void);	/* forward reference */
  
  struct clock clock_now;		/* The last elapsed time ready by clock_GetTimer */
  
***************
*** 63,69 ****
  clock_UnInit(void)
  {
      clockInitialized = 0;
! 	return 0;
  }
  #endif
  
--- 63,69 ----
  clock_UnInit(void)
  {
      clockInitialized = 0;
!     return 0;
  }
  #endif
  
Index: openafs/src/rx/rx_conncache.c
diff -c openafs/src/rx/rx_conncache.c:1.9 openafs/src/rx/rx_conncache.c:1.9.2.1
*** openafs/src/rx/rx_conncache.c:1.9	Sat May 15 00:53:30 2004
--- openafs/src/rx/rx_conncache.c	Wed Aug 25 03:09:41 2004
***************
*** 19,25 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_conncache.c,v 1.9 2004/05/15 04:53:30 shadow Exp $");
  
  #ifdef UKERNEL
  #include "afs/sysincludes.h"
--- 19,25 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_conncache.c,v 1.9.2.1 2004/08/25 07:09:41 shadow Exp $");
  
  #ifdef UKERNEL
  #include "afs/sysincludes.h"
***************
*** 48,55 ****
   */
  
  pthread_mutex_t rxi_connCacheMutex;
! #define LOCK_CONN_CACHE assert(pthread_mutex_lock(&rxi_connCacheMutex)==0);
! #define UNLOCK_CONN_CACHE assert(pthread_mutex_unlock(&rxi_connCacheMutex)==0);
  #else
  #define LOCK_CONN_CACHE
  #define UNLOCK_CONN_CACHE
--- 48,55 ----
   */
  
  pthread_mutex_t rxi_connCacheMutex;
! #define LOCK_CONN_CACHE assert(pthread_mutex_lock(&rxi_connCacheMutex)==0)
! #define UNLOCK_CONN_CACHE assert(pthread_mutex_unlock(&rxi_connCacheMutex)==0)
  #else
  #define LOCK_CONN_CACHE
  #define UNLOCK_CONN_CACHE
***************
*** 183,189 ****
       * increase the frequency of cache hits.
       */
  
!     LOCK_CONN_CACHE if (!rxi_FindCachedConnection(parts, conn)) {
  	/*
  	 * Create a new connection and enter it in the cache
  	 */
--- 183,190 ----
       * increase the frequency of cache hits.
       */
  
!     LOCK_CONN_CACHE;
!     if (!rxi_FindCachedConnection(parts, conn)) {
  	/*
  	 * Create a new connection and enter it in the cache
  	 */
***************
*** 195,201 ****
  	    error = 1;
  	}
      }
!     UNLOCK_CONN_CACHE return error;
  }
  
  /*
--- 196,203 ----
  	    error = 1;
  	}
      }
!     UNLOCK_CONN_CACHE;
!     return error;
  }
  
  /*
***************
*** 208,223 ****
  {
      cache_entry_p cacheConn, nCacheConn;
  
!     LOCK_CONN_CACHE
! 	for (queue_Scan
! 	     (&rxi_connectionCache, cacheConn, nCacheConn, cache_entry)) {
  	if (!cacheConn)
  	    break;
  	queue_Remove(cacheConn);
  	rxi_DestroyConnection(cacheConn->conn);
  	free(cacheConn);
      }
! UNLOCK_CONN_CACHE}
  
  /*
   * External functions
--- 210,225 ----
  {
      cache_entry_p cacheConn, nCacheConn;
  
!     LOCK_CONN_CACHE;
!     for (queue_Scan(&rxi_connectionCache, cacheConn, nCacheConn, cache_entry)) {
  	if (!cacheConn)
  	    break;
  	queue_Remove(cacheConn);
  	rxi_DestroyConnection(cacheConn->conn);
  	free(cacheConn);
      }
!     UNLOCK_CONN_CACHE;
! }
  
  /*
   * External functions
***************
*** 262,270 ****
  {
      cache_entry_p cacheConn, nCacheConn;
  
!     LOCK_CONN_CACHE
! 	for (queue_Scan
! 	     (&rxi_connectionCache, cacheConn, nCacheConn, cache_entry)) {
  	if (conn == cacheConn->conn) {
  	    cacheConn->inUse--;
  	    /*
--- 264,271 ----
  {
      cache_entry_p cacheConn, nCacheConn;
  
!     LOCK_CONN_CACHE;
!     for (queue_Scan(&rxi_connectionCache, cacheConn, nCacheConn, cache_entry)) {
  	if (conn == cacheConn->conn) {
  	    cacheConn->inUse--;
  	    /*
***************
*** 284,287 ****
  	    break;
  	}
      }
! UNLOCK_CONN_CACHE}
--- 285,289 ----
  	    break;
  	}
      }
!     UNLOCK_CONN_CACHE;
! }
Index: openafs/src/rx/rx_event.c
diff -c openafs/src/rx/rx_event.c:1.14 openafs/src/rx/rx_event.c:1.14.2.1
*** openafs/src/rx/rx_event.c:1.14	Tue Jul 15 19:16:09 2003
--- openafs/src/rx/rx_event.c	Wed Aug 25 03:09:41 2004
***************
*** 19,25 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_event.c,v 1.14 2003/07/15 23:16:09 shadow Exp $");
  
  #ifdef KERNEL
  #ifndef UKERNEL
--- 19,25 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_event.c,v 1.14.2.1 2004/08/25 07:09:41 shadow Exp $");
  
  #ifdef KERNEL
  #ifndef UKERNEL
***************
*** 109,116 ****
  
  #include <assert.h>
  pthread_mutex_t rx_event_mutex;
! #define LOCK_EV_INIT assert(pthread_mutex_lock(&rx_event_mutex)==0);
! #define UNLOCK_EV_INIT assert(pthread_mutex_unlock(&rx_event_mutex)==0);
  #else
  #define LOCK_EV_INIT
  #define UNLOCK_EV_INIT
--- 109,116 ----
  
  #include <assert.h>
  pthread_mutex_t rx_event_mutex;
! #define LOCK_EV_INIT assert(pthread_mutex_lock(&rx_event_mutex)==0)
! #define UNLOCK_EV_INIT assert(pthread_mutex_unlock(&rx_event_mutex)==0)
  #else
  #define LOCK_EV_INIT
  #define UNLOCK_EV_INIT
***************
*** 122,129 ****
  void
  rxevent_Init(int nEvents, void (*scheduler) (void))
  {
!     LOCK_EV_INIT if (rxevent_initialized) {
! 	UNLOCK_EV_INIT return;
      }
      MUTEX_INIT(&rxevent_lock, "rxevent_lock", MUTEX_DEFAULT, 0);
      clock_Init();
--- 122,131 ----
  void
  rxevent_Init(int nEvents, void (*scheduler) (void))
  {
!     LOCK_EV_INIT;
!     if (rxevent_initialized) {
! 	UNLOCK_EV_INIT;
! 	return;
      }
      MUTEX_INIT(&rxevent_lock, "rxevent_lock", MUTEX_DEFAULT, 0);
      clock_Init();
***************
*** 138,144 ****
      rxevent_initialized = 1;
      clock_Zero(&rxevent_nextRaiseEvents);
      rxevent_raiseScheduled = 0;
! UNLOCK_EV_INIT}
  
  /* Create and initialize new epoch structure */
  struct rxepoch *
--- 140,147 ----
      rxevent_initialized = 1;
      clock_Zero(&rxevent_nextRaiseEvents);
      rxevent_raiseScheduled = 0;
!     UNLOCK_EV_INIT;
! }
  
  /* Create and initialize new epoch structure */
  struct rxepoch *
***************
*** 413,423 ****
  {
      struct xfreelist *xp, *nxp;
  
!     LOCK_EV_INIT if (!rxevent_initialized) {
! 	UNLOCK_EV_INIT return;
      }
      rxevent_initialized = 0;
!     UNLOCK_EV_INIT MUTEX_DESTROY(&rxevent_lock);
  #if	defined(AFS_AIX32_ENV) && defined(KERNEL)
      /* Everything is freed in afs_osinet.c */
  #else
--- 416,429 ----
  {
      struct xfreelist *xp, *nxp;
  
!     LOCK_EV_INIT;
!     if (!rxevent_initialized) {
! 	UNLOCK_EV_INIT;
! 	return;
      }
      rxevent_initialized = 0;
!     UNLOCK_EV_INIT;
!     MUTEX_DESTROY(&rxevent_lock);
  #if	defined(AFS_AIX32_ENV) && defined(KERNEL)
      /* Everything is freed in afs_osinet.c */
  #else
Index: openafs/src/rx/rx_kcommon.c
diff -c openafs/src/rx/rx_kcommon.c:1.44 openafs/src/rx/rx_kcommon.c:1.44.2.1
*** openafs/src/rx/rx_kcommon.c:1.44	Sun Aug  8 15:17:05 2004
--- openafs/src/rx/rx_kcommon.c	Wed Aug 25 03:09:41 2004
***************
*** 15,21 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_kcommon.c,v 1.44 2004/08/08 19:17:05 shadow Exp $");
  
  #include "rx/rx_kcommon.h"
  
--- 15,21 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_kcommon.c,v 1.44.2.1 2004/08/25 07:09:41 shadow Exp $");
  
  #include "rx/rx_kcommon.h"
  
***************
*** 516,522 ****
      memset((void *)mtus, 0, sizeof(mtus));
  
      for (i = 0; i < afs_cb_interface.numberOfInterfaces; i++) {
!         if (!afs_cb_interface.mtu[i]) 
  	    afs_cb_interface.mtu[i] = htonl(1500);
  	rxmtu = (ntohl(afs_cb_interface.mtu[i]) - RX_IPUDP_SIZE);
  	ifinaddr = ntohl(afs_cb_interface.addr_in[i]);
--- 516,522 ----
      memset((void *)mtus, 0, sizeof(mtus));
  
      for (i = 0; i < afs_cb_interface.numberOfInterfaces; i++) {
! 	if (!afs_cb_interface.mtu[i])
  	    afs_cb_interface.mtu[i] = htonl(1500);
  	rxmtu = (ntohl(afs_cb_interface.mtu[i]) - RX_IPUDP_SIZE);
  	ifinaddr = ntohl(afs_cb_interface.addr_in[i]);
***************
*** 791,806 ****
  #if	defined(AFS_HPUX102_ENV)
  #if     defined(AFS_HPUX110_ENV)
      /* we need a file associated with the socket so sosend in NetSend 
!        will not fail */
      /* blocking socket */
      code = socreate(AF_INET, &newSocket, SOCK_DGRAM, 0, 0);
      fp = falloc();
!     if (!fp) goto bad;
      fp->f_flag = FREAD | FWRITE;
      fp->f_type = DTYPE_SOCKET;
!     fp->f_ops  = &socketops;
  
!     fp->f_data = (void *) newSocket;
      newSocket->so_fp = (void *)fp;
  
  #else /* AFS_HPUX110_ENV */
--- 791,807 ----
  #if	defined(AFS_HPUX102_ENV)
  #if     defined(AFS_HPUX110_ENV)
      /* we need a file associated with the socket so sosend in NetSend 
!      * will not fail */
      /* blocking socket */
      code = socreate(AF_INET, &newSocket, SOCK_DGRAM, 0, 0);
      fp = falloc();
!     if (!fp)
! 	goto bad;
      fp->f_flag = FREAD | FWRITE;
      fp->f_type = DTYPE_SOCKET;
!     fp->f_ops = &socketops;
  
!     fp->f_data = (void *)newSocket;
      newSocket->so_fp = (void *)fp;
  
  #else /* AFS_HPUX110_ENV */
***************
*** 930,940 ****
  #endif
  #ifdef AFS_HPUX110_ENV
      if (asocket->so_fp) {
! 	struct file * fp = asocket->so_fp;
  #if !defined(AFS_HPUX1123_ENV)
  	/* 11.23 still has falloc, but not FPENTRYFREE ! 
! 	   so for now if we shutdown, we will waist a file 
! 	   structure */
  	FPENTRYFREE(fp);
  	asocket->so_fp = NULL;
  #endif
--- 931,941 ----
  #endif
  #ifdef AFS_HPUX110_ENV
      if (asocket->so_fp) {
! 	struct file *fp = asocket->so_fp;
  #if !defined(AFS_HPUX1123_ENV)
  	/* 11.23 still has falloc, but not FPENTRYFREE ! 
! 	 * so for now if we shutdown, we will waist a file 
! 	 * structure */
  	FPENTRYFREE(fp);
  	asocket->so_fp = NULL;
  #endif
Index: openafs/src/rx/rx_kcommon.h
diff -c openafs/src/rx/rx_kcommon.h:1.27 openafs/src/rx/rx_kcommon.h:1.27.2.1
*** openafs/src/rx/rx_kcommon.h:1.27	Tue Jul 15 19:16:09 2003
--- openafs/src/rx/rx_kcommon.h	Wed Aug 25 03:10:41 2004
***************
*** 88,94 ****
--- 88,96 ----
  #else
  #include "net/route.h"
  #endif
+ #if defined(HAVE_IN_SYSTM_H) || !defined(AFS_LINUX22_ENV)
  #include "netinet/in_systm.h"
+ #endif
  #include "netinet/ip.h"
  #if !defined(AFS_HPUX110_ENV) && !defined(AFS_LINUX22_ENV) && !defined(AFS_DARWIN60_ENV) && !defined(AFS_OBSD_ENV)
  #include "netinet/in_pcb.h"
Index: openafs/src/rx/rx_misc.c
diff -c openafs/src/rx/rx_misc.c:1.12 openafs/src/rx/rx_misc.c:1.12.2.1
*** openafs/src/rx/rx_misc.c:1.12	Tue Jul 15 19:16:09 2003
--- openafs/src/rx/rx_misc.c	Wed Aug 25 03:09:41 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_misc.c,v 1.12 2003/07/15 23:16:09 shadow Exp $");
  
  #ifdef	KERNEL
  #include <afs/sysincludes.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_misc.c,v 1.12.2.1 2004/08/25 07:09:41 shadow Exp $");
  
  #ifdef	KERNEL
  #include <afs/sysincludes.h>
***************
*** 109,116 ****
  
  #include <assert.h>
  pthread_mutex_t osi_malloc_mutex;
! #define LOCK_MALLOC_STATS assert(pthread_mutex_lock(&osi_malloc_mutex)==0);
! #define UNLOCK_MALLOC_STATS assert(pthread_mutex_unlock(&osi_malloc_mutex)==0);
  #else
  #define LOCK_MALLOC_STATS
  #define UNLOCK_MALLOC_STATS
--- 109,116 ----
  
  #include <assert.h>
  pthread_mutex_t osi_malloc_mutex;
! #define LOCK_MALLOC_STATS assert(pthread_mutex_lock(&osi_malloc_mutex)==0)
! #define UNLOCK_MALLOC_STATS assert(pthread_mutex_unlock(&osi_malloc_mutex)==0)
  #else
  #define LOCK_MALLOC_STATS
  #define UNLOCK_MALLOC_STATS
***************
*** 126,134 ****
       */
      if (x == 0)
  	return (char *)&memZero;
!     LOCK_MALLOC_STATS osi_alloccnt++;
      osi_allocsize += x;
!     UNLOCK_MALLOC_STATS return (char *)(mem_alloc(x));
  }
  
  int
--- 126,136 ----
       */
      if (x == 0)
  	return (char *)&memZero;
!     LOCK_MALLOC_STATS;
!     osi_alloccnt++;
      osi_allocsize += x;
!     UNLOCK_MALLOC_STATS;
!     return (char *)(mem_alloc(x));
  }
  
  int
***************
*** 136,144 ****
  {
      if ((x == &memZero) || !x)
  	return 0;
!     LOCK_MALLOC_STATS osi_alloccnt--;
      osi_allocsize -= size;
!     UNLOCK_MALLOC_STATS mem_free(x, size);
      return 0;
  }
  #endif
--- 138,148 ----
  {
      if ((x == &memZero) || !x)
  	return 0;
!     LOCK_MALLOC_STATS;
!     osi_alloccnt--;
      osi_allocsize -= size;
!     UNLOCK_MALLOC_STATS;
!     mem_free(x, size);
      return 0;
  }
  #endif
Index: openafs/src/rx/rx_packet.c
diff -c openafs/src/rx/rx_packet.c:1.35 openafs/src/rx/rx_packet.c:1.35.2.1
*** openafs/src/rx/rx_packet.c:1.35	Wed Jun  2 10:50:23 2004
--- openafs/src/rx/rx_packet.c	Wed Aug 25 03:09:42 2004
***************
*** 15,21 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_packet.c,v 1.35 2004/06/02 14:50:23 jaltman Exp $");
  
  #ifdef KERNEL
  #if defined(UKERNEL)
--- 15,21 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_packet.c,v 1.35.2.1 2004/08/25 07:09:42 shadow Exp $");
  
  #ifdef KERNEL
  #if defined(UKERNEL)
***************
*** 833,840 ****
  	    MUTEX_ENTER(&rx_stats_mutex);
  	    rx_stats.noPacketOnRead++;
  	    MUTEX_EXIT(&rx_stats_mutex);
! 	}
! 	else {
  	    MUTEX_ENTER(&rx_stats_mutex);
  	    rx_stats.bogusPacketOnRead++;
  	    rx_stats.bogusHost = from.sin_addr.s_addr;
--- 833,839 ----
  	    MUTEX_ENTER(&rx_stats_mutex);
  	    rx_stats.noPacketOnRead++;
  	    MUTEX_EXIT(&rx_stats_mutex);
! 	} else {
  	    MUTEX_ENTER(&rx_stats_mutex);
  	    rx_stats.bogusPacketOnRead++;
  	    rx_stats.bogusHost = from.sin_addr.s_addr;
***************
*** 1828,1838 ****
  
      assert(p != NULL);
  
!     dpf(("%c %d %s: %x.%u.%u.%u.%u.%u.%u flags %d, packet %x resend %d.%0.3d len %d", 
! 	   deliveryType, p->header.serial, rx_packetTypes[p->header.type - 1], 
! 	   peer->host, peer->port, p->header.serial, p->header.epoch, 
! 	   p->header.cid, p->header.callNumber, p->header.seq, p->header.flags,
! 	   (int)p, p->retryTime.sec, p->retryTime.usec / 1000, p->length));
  
  #endif
      MUTEX_ENTER(&rx_stats_mutex);
--- 1827,1833 ----
  
      assert(p != NULL);
  
!     dpf(("%c %d %s: %x.%u.%u.%u.%u.%u.%u flags %d, packet %x resend %d.%0.3d len %d", deliveryType, p->header.serial, rx_packetTypes[p->header.type - 1], peer->host, peer->port, p->header.serial, p->header.epoch, p->header.cid, p->header.callNumber, p->header.seq, p->header.flags, (int)p, p->retryTime.sec, p->retryTime.usec / 1000, p->length));
  
  #endif
      MUTEX_ENTER(&rx_stats_mutex);
Index: openafs/src/rx/rx_pthread.c
diff -c openafs/src/rx/rx_pthread.c:1.17 openafs/src/rx/rx_pthread.c:1.17.2.1
*** openafs/src/rx/rx_pthread.c:1.17	Tue Feb  3 01:23:39 2004
--- openafs/src/rx/rx_pthread.c	Wed Aug 25 03:09:42 2004
***************
*** 19,25 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_pthread.c,v 1.17 2004/02/03 06:23:39 shadow Exp $");
  
  #include <sys/types.h>
  #include <errno.h>
--- 19,25 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_pthread.c,v 1.17.2.1 2004/08/25 07:09:42 shadow Exp $");
  
  #include <sys/types.h>
  #include <errno.h>
***************
*** 156,162 ****
  	next.sec = 30;		/* Time to sleep if there are no events scheduled */
  	next.usec = 0;
  	clock_GetTime(&cv);
!  	rxevent_RaiseEvents(&next);
  
  	assert(pthread_mutex_lock(&event_handler_mutex) == 0);
  	if (rx_pthread_event_rescheduled) {
--- 156,162 ----
  	next.sec = 30;		/* Time to sleep if there are no events scheduled */
  	next.usec = 0;
  	clock_GetTime(&cv);
! 	rxevent_RaiseEvents(&next);
  
  	assert(pthread_mutex_lock(&event_handler_mutex) == 0);
  	if (rx_pthread_event_rescheduled) {
Index: openafs/src/rx/rx_user.c
diff -c openafs/src/rx/rx_user.c:1.18 openafs/src/rx/rx_user.c:1.18.2.1
*** openafs/src/rx/rx_user.c:1.18	Fri Aug  6 16:04:07 2004
--- openafs/src/rx/rx_user.c	Wed Aug 25 03:09:42 2004
***************
*** 13,19 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_user.c,v 1.18 2004/08/06 20:04:07 shadow Exp $");
  
  # include <sys/types.h>
  # include <errno.h>
--- 13,19 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_user.c,v 1.18.2.1 2004/08/25 07:09:42 shadow Exp $");
  
  # include <sys/types.h>
  # include <errno.h>
***************
*** 66,73 ****
   */
  
  pthread_mutex_t rx_if_init_mutex;
! #define LOCK_IF_INIT assert(pthread_mutex_lock(&rx_if_init_mutex)==0);
! #define UNLOCK_IF_INIT assert(pthread_mutex_unlock(&rx_if_init_mutex)==0);
  
  /*
   * The rx_if_mutex mutex protects the following global variables:
--- 66,73 ----
   */
  
  pthread_mutex_t rx_if_init_mutex;
! #define LOCK_IF_INIT assert(pthread_mutex_lock(&rx_if_init_mutex)==0)
! #define UNLOCK_IF_INIT assert(pthread_mutex_unlock(&rx_if_init_mutex)==0)
  
  /*
   * The rx_if_mutex mutex protects the following global variables:
***************
*** 77,84 ****
   */
  
  pthread_mutex_t rx_if_mutex;
! #define LOCK_IF assert(pthread_mutex_lock(&rx_if_mutex)==0);
! #define UNLOCK_IF assert(pthread_mutex_unlock(&rx_if_mutex)==0);
  #else
  #define LOCK_IF_INIT
  #define UNLOCK_IF_INIT
--- 77,84 ----
   */
  
  pthread_mutex_t rx_if_mutex;
! #define LOCK_IF assert(pthread_mutex_lock(&rx_if_mutex)==0)
! #define UNLOCK_IF assert(pthread_mutex_unlock(&rx_if_mutex)==0)
  #else
  #define LOCK_IF_INIT
  #define UNLOCK_IF_INIT
***************
*** 296,303 ****
  void
  rx_GetIFInfo(void)
  {
!     LOCK_IF_INIT if (Inited) {
! 	UNLOCK_IF_INIT return;
      } else {
  	u_int maxsize;
  	u_int rxsize;
--- 296,305 ----
  void
  rx_GetIFInfo(void)
  {
!     LOCK_IF_INIT;
!     if (Inited) {
! 	UNLOCK_IF_INIT;
! 	return;
      } else {
  	u_int maxsize;
  	u_int rxsize;
***************
*** 305,314 ****
  	afs_uint32 i;
  
  	Inited = 1;
! 	UNLOCK_IF_INIT rxi_numNetAddrs = ADDRSPERSITE;
  
! 	LOCK_IF(void) syscfg_GetIFInfo(&rxi_numNetAddrs, rxi_NetAddrs,
! 				       myNetMasks, myNetMTUs, myNetFlags);
  
  	for (i = 0; i < rxi_numNetAddrs; i++) {
  	    rxsize = rxi_AdjustIfMTU(myNetMTUs[i] - RX_IPUDP_SIZE);
--- 307,318 ----
  	afs_uint32 i;
  
  	Inited = 1;
! 	UNLOCK_IF_INIT;
! 	rxi_numNetAddrs = ADDRSPERSITE;
  
! 	LOCK_IF;
! 	(void)syscfg_GetIFInfo(&rxi_numNetAddrs, rxi_NetAddrs,
! 			       myNetMasks, myNetMTUs, myNetFlags);
  
  	for (i = 0; i < rxi_numNetAddrs; i++) {
  	    rxsize = rxi_AdjustIfMTU(myNetMTUs[i] - RX_IPUDP_SIZE);
***************
*** 322,328 ****
  	    }
  
  	}
! 	UNLOCK_IF ncbufs = (rx_maxJumboRecvSize - RX_FIRSTBUFFERSIZE);
  	if (ncbufs > 0) {
  	    ncbufs = ncbufs / RX_CBUFFERSIZE;
  	    npackets = rx_initSendWindow - 1;
--- 326,333 ----
  	    }
  
  	}
! 	UNLOCK_IF;
! 	ncbufs = (rx_maxJumboRecvSize - RX_FIRSTBUFFERSIZE);
  	if (ncbufs > 0) {
  	    ncbufs = ncbufs / RX_CBUFFERSIZE;
  	    npackets = rx_initSendWindow - 1;
***************
*** 391,406 ****
      struct sockaddr_in *a;
  #endif /* AFS_DJGPP_ENV */
  
!     LOCK_IF_INIT if (Inited) {
! 	UNLOCK_IF_INIT return;
      }
      Inited = 1;
!     UNLOCK_IF_INIT LOCK_IF rxi_numNetAddrs = 0;
      memset(rxi_NetAddrs, 0, sizeof(rxi_NetAddrs));
      memset(myNetFlags, 0, sizeof(myNetFlags));
      memset(myNetMTUs, 0, sizeof(myNetMTUs));
      memset(myNetMasks, 0, sizeof(myNetMasks));
!     UNLOCK_IF s = socket(AF_INET, SOCK_DGRAM, 0);
      if (s < 0)
  	return;
  
--- 396,416 ----
      struct sockaddr_in *a;
  #endif /* AFS_DJGPP_ENV */
  
!     LOCK_IF_INIT;
!     if (Inited) {
! 	UNLOCK_IF_INIT;
! 	return;
      }
      Inited = 1;
!     UNLOCK_IF_INIT;
!     LOCK_IF;
!     rxi_numNetAddrs = 0;
      memset(rxi_NetAddrs, 0, sizeof(rxi_NetAddrs));
      memset(myNetFlags, 0, sizeof(myNetFlags));
      memset(myNetMTUs, 0, sizeof(myNetMTUs));
      memset(myNetMasks, 0, sizeof(myNetMasks));
!     UNLOCK_IF;
!     s = socket(AF_INET, SOCK_DGRAM, 0);
      if (s < 0)
  	return;
  
***************
*** 421,430 ****
  	return;
      }
  
!     LOCK_IF
  #ifdef	AFS_AIX41_ENV
  #define size(p) MAX((p).sa_len, sizeof(p))
! 	cplim = buf + ifc.ifc_len;	/*skip over if's with big ifr_addr's */
      for (cp = buf; cp < cplim;
  	 cp += sizeof(ifr->ifr_name) + MAX(a->sin_len, sizeof(*a))) {
  	if (rxi_numNetAddrs >= ADDRSPERSITE)
--- 431,440 ----
  	return;
      }
  
!     LOCK_IF;
  #ifdef	AFS_AIX41_ENV
  #define size(p) MAX((p).sa_len, sizeof(p))
!     cplim = buf + ifc.ifc_len;	/*skip over if's with big ifr_addr's */
      for (cp = buf; cp < cplim;
  	 cp += sizeof(ifr->ifr_name) + MAX(a->sin_len, sizeof(*a))) {
  	if (rxi_numNetAddrs >= ADDRSPERSITE)
***************
*** 432,438 ****
  
  	ifr = (struct ifreq *)cp;
  #else
! 	len = ifc.ifc_len / sizeof(struct ifreq);
      if (len > ADDRSPERSITE)
  	len = ADDRSPERSITE;
  
--- 442,448 ----
  
  	ifr = (struct ifreq *)cp;
  #else
!     len = ifc.ifc_len / sizeof(struct ifreq);
      if (len > ADDRSPERSITE)
  	len = ADDRSPERSITE;
  
***************
*** 552,558 ****
  	    ++rxi_numNetAddrs;
  	}
      }
!     UNLOCK_IF close(s);
  
      /* have to allocate at least enough to allow a single packet to reach its
       * maximum size, so ReadPacket will work.  Allocate enough for a couple
--- 562,569 ----
  	    ++rxi_numNetAddrs;
  	}
      }
!     UNLOCK_IF;
!     close(s);
  
      /* have to allocate at least enough to allow a single packet to reach its
       * maximum size, so ReadPacket will work.  Allocate enough for a couple
***************
*** 594,608 ****
  
  
  
!     LOCK_IF_INIT if (!Inited) {
! 	UNLOCK_IF_INIT
! 	    /*
! 	     * there's a race here since more than one thread could call
! 	     * rx_GetIFInfo.  The race stops in rx_GetIFInfo.
! 	     */
! 	    rx_GetIFInfo();
      } else {
!     UNLOCK_IF_INIT}
  
  #ifdef ADAPT_MTU
      /* try to second-guess IP, and identify which link is most likely to
--- 605,621 ----
  
  
  
!     LOCK_IF_INIT;
!     if (!Inited) {
! 	UNLOCK_IF_INIT;
! 	/*
! 	 * there's a race here since more than one thread could call
! 	 * rx_GetIFInfo.  The race stops in rx_GetIFInfo.
! 	 */
! 	rx_GetIFInfo();
      } else {
! 	UNLOCK_IF_INIT;
!     }
  
  #ifdef ADAPT_MTU
      /* try to second-guess IP, and identify which link is most likely to
***************
*** 616,622 ****
       * pp->burstSize pp->burst pp->burstWait.sec pp->burstWait.usec
       * pp->timeout.usec */
  
!     LOCK_IF for (ix = 0; ix < rxi_numNetAddrs; ++ix) {
  	if ((rxi_NetAddrs[ix] & myNetMasks[ix]) == (ppaddr & myNetMasks[ix])) {
  #ifdef IFF_POINTOPOINT
  	    if (myNetFlags[ix] & IFF_POINTOPOINT)
--- 629,636 ----
       * pp->burstSize pp->burst pp->burstWait.sec pp->burstWait.usec
       * pp->timeout.usec */
  
!     LOCK_IF;
!     for (ix = 0; ix < rxi_numNetAddrs; ++ix) {
  	if ((rxi_NetAddrs[ix] & myNetMasks[ix]) == (ppaddr & myNetMasks[ix])) {
  #ifdef IFF_POINTOPOINT
  	    if (myNetFlags[ix] & IFF_POINTOPOINT)
***************
*** 629,635 ****
  		pp->ifMTU = MIN(rx_MyMaxSendSize, rxmtu);
  	}
      }
!     UNLOCK_IF if (!pp->ifMTU) {	/* not local */
  	pp->timeout.sec = 3;
  	pp->ifMTU = MIN(rx_MyMaxSendSize, RX_REMOTE_PACKET_SIZE);
      }
--- 643,650 ----
  		pp->ifMTU = MIN(rx_MyMaxSendSize, rxmtu);
  	}
      }
!     UNLOCK_IF;
!     if (!pp->ifMTU) {		/* not local */
  	pp->timeout.sec = 3;
  	pp->ifMTU = MIN(rx_MyMaxSendSize, RX_REMOTE_PACKET_SIZE);
      }
***************
*** 665,672 ****
  
  /* Override max MTU.  If rx_SetNoJumbo is called, it must be 
     called before calling rx_SetMaxMTU since SetNoJumbo clobbers rx_maxReceiveSize */
! void rx_SetMaxMTU(int mtu)
  {
! 	rx_MyMaxSendSize = rx_maxReceiveSizeUser = rx_maxReceiveSize = mtu;
  }
- 
--- 680,687 ----
  
  /* Override max MTU.  If rx_SetNoJumbo is called, it must be 
     called before calling rx_SetMaxMTU since SetNoJumbo clobbers rx_maxReceiveSize */
! void
! rx_SetMaxMTU(int mtu)
  {
!     rx_MyMaxSendSize = rx_maxReceiveSizeUser = rx_maxReceiveSize = mtu;
  }
Index: openafs/src/rx/rx_user.h
diff -c openafs/src/rx/rx_user.h:1.6 openafs/src/rx/rx_user.h:1.6.2.1
*** openafs/src/rx/rx_user.h:1.6	Thu Mar 11 01:30:58 2004
--- openafs/src/rx/rx_user.h	Wed Aug 25 03:09:42 2004
***************
*** 28,35 ****
  #define AFS_RXGUNLOCK()
  #ifndef UKERNEL
  /* Defined in rx/UKERNEL/rx_kmutex.h */
! #define ISAFS_GLOCK() 
! #define ISAFS_RXGLOCK() 
  #endif
  #define AFS_ASSERT_RXGLOCK()
  /* Some "operating-system independent" stuff, for the user mode implementation */
--- 28,35 ----
  #define AFS_RXGUNLOCK()
  #ifndef UKERNEL
  /* Defined in rx/UKERNEL/rx_kmutex.h */
! #define ISAFS_GLOCK()
! #define ISAFS_RXGLOCK()
  #endif
  #define AFS_ASSERT_RXGLOCK()
  /* Some "operating-system independent" stuff, for the user mode implementation */
Index: openafs/src/rx/rx_xmit_nt.c
diff -c openafs/src/rx/rx_xmit_nt.c:1.7 openafs/src/rx/rx_xmit_nt.c:1.7.2.1
*** openafs/src/rx/rx_xmit_nt.c:1.7	Wed Jun  2 10:50:24 2004
--- openafs/src/rx/rx_xmit_nt.c	Wed Aug 25 03:09:42 2004
***************
*** 18,24 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_xmit_nt.c,v 1.7 2004/06/02 14:50:24 jaltman Exp $");
  
  #if defined(AFS_NT40_ENV) || defined(AFS_DJGPP_ENV)
  
--- 18,24 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_xmit_nt.c,v 1.7.2.1 2004/08/25 07:09:42 shadow Exp $");
  
  #if defined(AFS_NT40_ENV) || defined(AFS_DJGPP_ENV)
  
***************
*** 79,90 ****
  	code -= size;
      } else {
  #ifdef AFS_NT40_ENV
!     if (code == SOCKET_ERROR)
!         code = WSAGetLastError();
!     if (code == WSAEWOULDBLOCK)
!         errno = WSAEWOULDBLOCK;
!     else
!         errno = EIO;
  #endif /* AFS_NT40_ENV */
  	code = -1;
      }
--- 79,90 ----
  	code -= size;
      } else {
  #ifdef AFS_NT40_ENV
! 	if (code == SOCKET_ERROR)
! 	    code = WSAGetLastError();
! 	if (code == WSAEWOULDBLOCK)
! 	    errno = WSAEWOULDBLOCK;
! 	else
! 	    errno = EIO;
  #endif /* AFS_NT40_ENV */
  	code = -1;
      }
***************
*** 136,144 ****
  	case WSAENOBUFS:
  	    errno = 0;
  	    break;
!     case WSAEWOULDBLOCK:
!         errno = WSAEWOULDBLOCK;
!         break;
  	default:
  	    errno = EIO;
  	    break;
--- 136,144 ----
  	case WSAENOBUFS:
  	    errno = 0;
  	    break;
! 	case WSAEWOULDBLOCK:
! 	    errno = WSAEWOULDBLOCK;
! 	    break;
  	default:
  	    errno = EIO;
  	    break;
Index: openafs/src/rx/rxdebug.c
diff -c openafs/src/rx/rxdebug.c:1.15 openafs/src/rx/rxdebug.c:1.15.2.1
*** openafs/src/rx/rxdebug.c:1.15	Sun Dec  7 17:49:36 2003
--- openafs/src/rx/rxdebug.c	Wed Aug 25 03:09:42 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rxdebug.c,v 1.15 2003/12/07 22:49:36 jaltman Exp $");
  
  #include <sys/types.h>
  #include <errno.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rxdebug.c,v 1.15.2.1 2004/08/25 07:09:42 shadow Exp $");
  
  #include <sys/types.h>
  #include <errno.h>
***************
*** 333,339 ****
  		printf("getconn call failed with code %d\n", code);
  		break;
  	    }
! 	    if (tconn.cid == (afs_int32)0xffffffff) {
  		printf("Done.\n");
  		break;
  	    }
--- 333,339 ----
  		printf("getconn call failed with code %d\n", code);
  		break;
  	    }
! 	    if (tconn.cid == (afs_int32) 0xffffffff) {
  		printf("Done.\n");
  		break;
  	    }
Index: openafs/src/rx/xdr_int64.c
diff -c openafs/src/rx/xdr_int64.c:1.9 openafs/src/rx/xdr_int64.c:1.9.2.1
*** openafs/src/rx/xdr_int64.c:1.9	Sun Dec  7 22:14:08 2003
--- openafs/src/rx/xdr_int64.c	Wed Aug 25 03:09:42 2004
***************
*** 7,13 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/xdr_int64.c,v 1.9 2003/12/08 03:14:08 jaltman Exp $");
  
  #if defined(KERNEL) && !defined(UKERNEL)
  #ifdef AFS_LINUX20_ENV
--- 7,13 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/xdr_int64.c,v 1.9.2.1 2004/08/25 07:09:42 shadow Exp $");
  
  #if defined(KERNEL) && !defined(UKERNEL)
  #ifdef AFS_LINUX20_ENV
***************
*** 53,60 ****
  	return (TRUE);
      }
      if (xdrs->x_op == XDR_ENCODE) {
! 	high = (afs_int32)(*ulp >> 32);
! 	low = (afs_uint32)(*ulp & 0xFFFFFFFFL);
  	if (!XDR_PUTINT32(xdrs, (afs_int32 *) & high))
  	    return (FALSE);
  	return (XDR_PUTINT32(xdrs, (afs_int32 *) & low));
--- 53,60 ----
  	return (TRUE);
      }
      if (xdrs->x_op == XDR_ENCODE) {
! 	high = (afs_int32) (*ulp >> 32);
! 	low = (afs_uint32) (*ulp & 0xFFFFFFFFL);
  	if (!XDR_PUTINT32(xdrs, (afs_int32 *) & high))
  	    return (FALSE);
  	return (XDR_PUTINT32(xdrs, (afs_int32 *) & low));
***************
*** 90,97 ****
  	return (TRUE);
      }
      if (xdrs->x_op == XDR_ENCODE) {
! 	high = (afs_uint32)(*ulp >> 32);
! 	low = (afs_uint32)(*ulp & 0xFFFFFFFFL);
  	if (!XDR_PUTINT32(xdrs, (afs_uint32 *) & high))
  	    return (FALSE);
  	return (XDR_PUTINT32(xdrs, (afs_uint32 *) & low));
--- 90,97 ----
  	return (TRUE);
      }
      if (xdrs->x_op == XDR_ENCODE) {
! 	high = (afs_uint32) (*ulp >> 32);
! 	low = (afs_uint32) (*ulp & 0xFFFFFFFFL);
  	if (!XDR_PUTINT32(xdrs, (afs_uint32 *) & high))
  	    return (FALSE);
  	return (XDR_PUTINT32(xdrs, (afs_uint32 *) & low));
Index: openafs/src/rx/AIX/rx_knet.c
diff -c openafs/src/rx/AIX/rx_knet.c:1.11 openafs/src/rx/AIX/rx_knet.c:1.11.2.1
*** openafs/src/rx/AIX/rx_knet.c:1.11	Tue Jul 15 19:16:14 2003
--- openafs/src/rx/AIX/rx_knet.c	Wed Aug 25 03:16:16 2004
***************
*** 11,17 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/AIX/rx_knet.c,v 1.11 2003/07/15 23:16:14 shadow Exp $");
  
  #ifdef AFS_AIX41_ENV
  #include "rx/rx_kcommon.h"
--- 11,17 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/AIX/rx_knet.c,v 1.11.2.1 2004/08/25 07:16:16 shadow Exp $");
  
  #ifdef AFS_AIX41_ENV
  #include "rx/rx_kcommon.h"
***************
*** 322,327 ****
--- 322,328 ----
  		rxk_portRocks[i] = NULL;
  	    }
  	}
+ 	del_input_type(0xdead);
      }
  }
  
Index: openafs/src/rx/LINUX/rx_knet.c
diff -c openafs/src/rx/LINUX/rx_knet.c:1.23 openafs/src/rx/LINUX/rx_knet.c:1.23.2.1
*** openafs/src/rx/LINUX/rx_knet.c:1.23	Wed Jul 28 22:46:48 2004
--- openafs/src/rx/LINUX/rx_knet.c	Wed Aug 25 03:41:00 2004
***************
*** 16,22 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/LINUX/rx_knet.c,v 1.23 2004/07/29 02:46:48 shadow Exp $");
  
  #include <linux/version.h>
  #ifdef AFS_LINUX22_ENV
--- 16,22 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/LINUX/rx_knet.c,v 1.23.2.1 2004/08/25 07:41:00 shadow Exp $");
  
  #include <linux/version.h>
  #ifdef AFS_LINUX22_ENV
***************
*** 37,43 ****
      int code;
  
  
! #ifdef LINUX_KERNEL_IS_SELINUX
      code = sock_create(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sockp, 0);
  #else
      code = sock_create(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sockp);
--- 37,46 ----
      int code;
  
  
!     /* We need a better test for this. if you need it back, tell us
!      * how to detect it. 
!      */
! #if 0/*def LINUX_KERNEL_IS_SELINUX*/
      code = sock_create(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sockp, 0);
  #else
      code = sock_create(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sockp);
Index: openafs/src/rxkad/bg-fcrypt.c
diff -c openafs/src/rxkad/bg-fcrypt.c:1.5 openafs/src/rxkad/bg-fcrypt.c:1.5.2.1
*** openafs/src/rxkad/bg-fcrypt.c:1.5	Tue Jul 15 19:16:42 2003
--- openafs/src/rxkad/bg-fcrypt.c	Wed Aug 25 03:09:42 2004
***************
*** 38,44 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/bg-fcrypt.c,v 1.5 2003/07/15 23:16:42 shadow Exp $");
  
  #define DEBUG 0
  #ifdef KERNEL
--- 38,44 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/bg-fcrypt.c,v 1.5.2.1 2004/08/25 07:09:42 shadow Exp $");
  
  #define DEBUG 0
  #ifdef KERNEL
***************
*** 507,515 ****
  fc_ecb_encrypt(afs_uint32 * in, afs_uint32 * out, fc_KeySchedule sched,
  	       int encrypt)
  {
!     LOCK_RXKAD_STATS rxkad_stats.fc_encrypts[encrypt]++;
!     UNLOCK_RXKAD_STATS if (encrypt)
! 	  fc_ecb_enc(in[0], in[1], out, sched);
      else
  	fc_ecb_dec(in[0], in[1], out, sched);
      return 0;
--- 507,517 ----
  fc_ecb_encrypt(afs_uint32 * in, afs_uint32 * out, fc_KeySchedule sched,
  	       int encrypt)
  {
!     LOCK_RXKAD_STATS;
!     rxkad_stats.fc_encrypts[encrypt]++;
!     UNLOCK_RXKAD_STATS;
!     if (encrypt)
! 	fc_ecb_enc(in[0], in[1], out, sched);
      else
  	fc_ecb_dec(in[0], in[1], out, sched);
      return 0;
***************
*** 667,674 ****
      ROT56R(hi, lo, 11);
      *sched++ = EFF_NTOHL(lo);
  #endif
!     LOCK_RXKAD_STATS rxkad_stats.fc_key_scheds++;
!     UNLOCK_RXKAD_STATS return 0;
  }
  
  /*
--- 669,678 ----
      ROT56R(hi, lo, 11);
      *sched++ = EFF_NTOHL(lo);
  #endif
!     LOCK_RXKAD_STATS;
!     rxkad_stats.fc_key_scheds++;
!     UNLOCK_RXKAD_STATS;
!     return 0;
  }
  
  /*
***************
*** 688,696 ****
  
      obj = rx_SecurityObjectOf(rx_connection_not_used);
      tp = (struct rxkad_cprivate *)obj->privateData;
!     LOCK_RXKAD_STATS rxkad_stats.bytesEncrypted[rxkad_TypeIndex(tp->type)] +=
! 	len;
!     UNLOCK_RXKAD_STATS {
  	/* What is this good for?
  	 * It turns out that the security header for auth_enc is of
  	 * size 8 bytes and the last 4 bytes are defined to be 0!
--- 692,701 ----
  
      obj = rx_SecurityObjectOf(rx_connection_not_used);
      tp = (struct rxkad_cprivate *)obj->privateData;
!     LOCK_RXKAD_STATS;
!     rxkad_stats.bytesEncrypted[rxkad_TypeIndex(tp->type)] += len;
!     UNLOCK_RXKAD_STATS;
!     {
  	/* What is this good for?
  	 * It turns out that the security header for auth_enc is of
  	 * size 8 bytes and the last 4 bytes are defined to be 0!
***************
*** 725,733 ****
  
      obj = rx_SecurityObjectOf(rx_connection_not_used);
      tp = (struct rxkad_cprivate *)obj->privateData;
!     LOCK_RXKAD_STATS rxkad_stats.bytesDecrypted[rxkad_TypeIndex(tp->type)] +=
! 	len;
!     UNLOCK_RXKAD_STATS memcpy(ivec, iv, sizeof(ivec));	/* Must use copy of iv */
      for (frag = &packet->wirevec[1]; len > 0; frag++) {
  	int iov_len = frag->iov_len;
  	afs_uint32 *iov_bas = (afs_uint32 *) frag->iov_base;
--- 730,739 ----
  
      obj = rx_SecurityObjectOf(rx_connection_not_used);
      tp = (struct rxkad_cprivate *)obj->privateData;
!     LOCK_RXKAD_STATS;
!     rxkad_stats.bytesDecrypted[rxkad_TypeIndex(tp->type)] += len;
!     UNLOCK_RXKAD_STATS;
!     memcpy(ivec, iv, sizeof(ivec));	/* Must use copy of iv */
      for (frag = &packet->wirevec[1]; len > 0; frag++) {
  	int iov_len = frag->iov_len;
  	afs_uint32 *iov_bas = (afs_uint32 *) frag->iov_base;
Index: openafs/src/rxkad/hash.h
diff -c openafs/src/rxkad/hash.h:1.2 openafs/src/rxkad/hash.h:1.2.2.1
*** openafs/src/rxkad/hash.h:1.2	Sun May  9 23:52:18 2004
--- openafs/src/rxkad/hash.h	Wed Aug 25 03:09:42 2004
***************
*** 30,36 ****
   * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
  
! /* $Id: hash.h,v 1.2 2004/05/10 03:52:18 shadow Exp $ */
  
  /* stuff in common between md4, md5, and sha1 */
  
--- 30,36 ----
   * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
  
! /* $Id: hash.h,v 1.2.2.1 2004/08/25 07:09:42 shadow Exp $ */
  
  /* stuff in common between md4, md5, and sha1 */
  
***************
*** 62,68 ****
  #endif
  
  static inline afs_uint32
! cshift (afs_uint32 x, unsigned int n)
  {
      x = CRAYFIX(x);
      return CRAYFIX((x << n) | (x >> (32 - n)));
--- 62,68 ----
  #endif
  
  static inline afs_uint32
! cshift(afs_uint32 x, unsigned int n)
  {
      x = CRAYFIX(x);
      return CRAYFIX((x << n) | (x >> (32 - n)));
Index: openafs/src/rxkad/md4.c
diff -c openafs/src/rxkad/md4.c:1.1 openafs/src/rxkad/md4.c:1.1.2.1
*** openafs/src/rxkad/md4.c:1.1	Fri Apr  9 01:54:22 2004
--- openafs/src/rxkad/md4.c	Wed Aug 25 03:09:42 2004
***************
*** 69,75 ****
  #include "rxkad.h"
  #endif /* defined(UKERNEL) */
  
! RCSID("$Id: md4.c,v 1.1 2004/04/09 05:54:22 jaltman Exp $");
  
  #undef WORDS_BIGENDIAN
  #ifdef AFSBIG_ENDIAN
--- 69,75 ----
  #include "rxkad.h"
  #endif /* defined(UKERNEL) */
  
! RCSID("$Id: md4.c,v 1.1.2.1 2004/08/25 07:09:42 shadow Exp $");
  
  #undef WORDS_BIGENDIAN
  #ifdef AFSBIG_ENDIAN
***************
*** 86,99 ****
  #define X data
  
  void
! MD4_Init (struct md4 *m)
  {
!   m->sz[0] = 0;
!   m->sz[1] = 0;
!   D = 0x10325476;
!   C = 0x98badcfe;
!   B = 0xefcdab89;
!   A = 0x67452301;
  }
  
  #define F(x,y,z) CRAYFIX((x & y) | (~x & z))
--- 86,99 ----
  #define X data
  
  void
! MD4_Init(struct md4 *m)
  {
!     m->sz[0] = 0;
!     m->sz[1] = 0;
!     D = 0x10325476;
!     C = 0x98badcfe;
!     B = 0xefcdab89;
!     A = 0x67452301;
  }
  
  #define F(x,y,z) CRAYFIX((x & y) | (~x & z))
***************
*** 108,192 ****
  #define DO3(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,H)
  
  static inline void
! calc (struct md4 *m, afs_uint32 *data)
  {
!   afs_uint32 AA, BB, CC, DD;
  
!   AA = A;
!   BB = B;
!   CC = C;
!   DD = D;
! 
!   /* Round 1 */
! 
!   DO1(A,B,C,D,0,3,0);
!   DO1(D,A,B,C,1,7,0);
!   DO1(C,D,A,B,2,11,0);
!   DO1(B,C,D,A,3,19,0);
! 
!   DO1(A,B,C,D,4,3,0);
!   DO1(D,A,B,C,5,7,0);
!   DO1(C,D,A,B,6,11,0);
!   DO1(B,C,D,A,7,19,0);
! 
!   DO1(A,B,C,D,8,3,0);
!   DO1(D,A,B,C,9,7,0);
!   DO1(C,D,A,B,10,11,0);
!   DO1(B,C,D,A,11,19,0);
! 
!   DO1(A,B,C,D,12,3,0);
!   DO1(D,A,B,C,13,7,0);
!   DO1(C,D,A,B,14,11,0);
!   DO1(B,C,D,A,15,19,0);
! 
!   /* Round 2 */
! 
!   DO2(A,B,C,D,0,3,0x5A827999);
!   DO2(D,A,B,C,4,5,0x5A827999);
!   DO2(C,D,A,B,8,9,0x5A827999);
!   DO2(B,C,D,A,12,13,0x5A827999);
! 
!   DO2(A,B,C,D,1,3,0x5A827999);
!   DO2(D,A,B,C,5,5,0x5A827999);
!   DO2(C,D,A,B,9,9,0x5A827999);
!   DO2(B,C,D,A,13,13,0x5A827999);
! 
!   DO2(A,B,C,D,2,3,0x5A827999);
!   DO2(D,A,B,C,6,5,0x5A827999);
!   DO2(C,D,A,B,10,9,0x5A827999);
!   DO2(B,C,D,A,14,13,0x5A827999);
! 
!   DO2(A,B,C,D,3,3,0x5A827999);
!   DO2(D,A,B,C,7,5,0x5A827999);
!   DO2(C,D,A,B,11,9,0x5A827999);
!   DO2(B,C,D,A,15,13,0x5A827999);
! 
!   /* Round 3 */
! 
!   DO3(A,B,C,D,0,3,0x6ED9EBA1);
!   DO3(D,A,B,C,8,9,0x6ED9EBA1);
!   DO3(C,D,A,B,4,11,0x6ED9EBA1);
!   DO3(B,C,D,A,12,15,0x6ED9EBA1);
! 
!   DO3(A,B,C,D,2,3,0x6ED9EBA1);
!   DO3(D,A,B,C,10,9,0x6ED9EBA1);
!   DO3(C,D,A,B,6,11,0x6ED9EBA1);
!   DO3(B,C,D,A,14,15,0x6ED9EBA1);
! 
!   DO3(A,B,C,D,1,3,0x6ED9EBA1);
!   DO3(D,A,B,C,9,9,0x6ED9EBA1);
!   DO3(C,D,A,B,5,11,0x6ED9EBA1);
!   DO3(B,C,D,A,13,15,0x6ED9EBA1);
! 
!   DO3(A,B,C,D,3,3,0x6ED9EBA1);
!   DO3(D,A,B,C,11,9,0x6ED9EBA1);
!   DO3(C,D,A,B,7,11,0x6ED9EBA1);
!   DO3(B,C,D,A,15,15,0x6ED9EBA1);
! 
!   A += AA;
!   B += BB;
!   C += CC;
!   D += DD;
  }
  
  /*
--- 108,192 ----
  #define DO3(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,H)
  
  static inline void
! calc(struct md4 *m, afs_uint32 * data)
  {
!     afs_uint32 AA, BB, CC, DD;
  
!     AA = A;
!     BB = B;
!     CC = C;
!     DD = D;
! 
!     /* Round 1 */
! 
!     DO1(A, B, C, D, 0, 3, 0);
!     DO1(D, A, B, C, 1, 7, 0);
!     DO1(C, D, A, B, 2, 11, 0);
!     DO1(B, C, D, A, 3, 19, 0);
! 
!     DO1(A, B, C, D, 4, 3, 0);
!     DO1(D, A, B, C, 5, 7, 0);
!     DO1(C, D, A, B, 6, 11, 0);
!     DO1(B, C, D, A, 7, 19, 0);
! 
!     DO1(A, B, C, D, 8, 3, 0);
!     DO1(D, A, B, C, 9, 7, 0);
!     DO1(C, D, A, B, 10, 11, 0);
!     DO1(B, C, D, A, 11, 19, 0);
! 
!     DO1(A, B, C, D, 12, 3, 0);
!     DO1(D, A, B, C, 13, 7, 0);
!     DO1(C, D, A, B, 14, 11, 0);
!     DO1(B, C, D, A, 15, 19, 0);
! 
!     /* Round 2 */
! 
!     DO2(A, B, C, D, 0, 3, 0x5A827999);
!     DO2(D, A, B, C, 4, 5, 0x5A827999);
!     DO2(C, D, A, B, 8, 9, 0x5A827999);
!     DO2(B, C, D, A, 12, 13, 0x5A827999);
! 
!     DO2(A, B, C, D, 1, 3, 0x5A827999);
!     DO2(D, A, B, C, 5, 5, 0x5A827999);
!     DO2(C, D, A, B, 9, 9, 0x5A827999);
!     DO2(B, C, D, A, 13, 13, 0x5A827999);
! 
!     DO2(A, B, C, D, 2, 3, 0x5A827999);
!     DO2(D, A, B, C, 6, 5, 0x5A827999);
!     DO2(C, D, A, B, 10, 9, 0x5A827999);
!     DO2(B, C, D, A, 14, 13, 0x5A827999);
! 
!     DO2(A, B, C, D, 3, 3, 0x5A827999);
!     DO2(D, A, B, C, 7, 5, 0x5A827999);
!     DO2(C, D, A, B, 11, 9, 0x5A827999);
!     DO2(B, C, D, A, 15, 13, 0x5A827999);
! 
!     /* Round 3 */
! 
!     DO3(A, B, C, D, 0, 3, 0x6ED9EBA1);
!     DO3(D, A, B, C, 8, 9, 0x6ED9EBA1);
!     DO3(C, D, A, B, 4, 11, 0x6ED9EBA1);
!     DO3(B, C, D, A, 12, 15, 0x6ED9EBA1);
! 
!     DO3(A, B, C, D, 2, 3, 0x6ED9EBA1);
!     DO3(D, A, B, C, 10, 9, 0x6ED9EBA1);
!     DO3(C, D, A, B, 6, 11, 0x6ED9EBA1);
!     DO3(B, C, D, A, 14, 15, 0x6ED9EBA1);
! 
!     DO3(A, B, C, D, 1, 3, 0x6ED9EBA1);
!     DO3(D, A, B, C, 9, 9, 0x6ED9EBA1);
!     DO3(C, D, A, B, 5, 11, 0x6ED9EBA1);
!     DO3(B, C, D, A, 13, 15, 0x6ED9EBA1);
! 
!     DO3(A, B, C, D, 3, 3, 0x6ED9EBA1);
!     DO3(D, A, B, C, 11, 9, 0x6ED9EBA1);
!     DO3(C, D, A, B, 7, 11, 0x6ED9EBA1);
!     DO3(B, C, D, A, 15, 15, 0x6ED9EBA1);
! 
!     A += AA;
!     B += BB;
!     C += CC;
!     D += DD;
  }
  
  /*
***************
*** 195,220 ****
  
  #if defined(WORDS_BIGENDIAN)
  static inline afs_uint32
! swap_afs_uint32 (afs_uint32 t)
  {
!   afs_uint32 temp1, temp2;
  
!   temp1   = cshift(t, 16);
!   temp2   = temp1 >> 8;
!   temp1  &= 0x00ff00ff;
!   temp2  &= 0x00ff00ff;
!   temp1 <<= 8;
!   return temp1 | temp2;
  }
  #endif
  
! struct x32{
!   unsigned int a:32;
!   unsigned int b:32;
  };
  
  void
! MD4_Update (struct md4 *m, const void *v, size_t len)
  {
      const unsigned char *p = v;
      size_t old_sz = m->sz[0];
--- 195,220 ----
  
  #if defined(WORDS_BIGENDIAN)
  static inline afs_uint32
! swap_afs_uint32(afs_uint32 t)
  {
!     afs_uint32 temp1, temp2;
  
!     temp1 = cshift(t, 16);
!     temp2 = temp1 >> 8;
!     temp1 &= 0x00ff00ff;
!     temp2 &= 0x00ff00ff;
!     temp1 <<= 8;
!     return temp1 | temp2;
  }
  #endif
  
! struct x32 {
!     unsigned int a:32;
!     unsigned int b:32;
  };
  
  void
! MD4_Update(struct md4 *m, const void *v, size_t len)
  {
      const unsigned char *p = v;
      size_t old_sz = m->sz[0];
***************
*** 223,247 ****
      m->sz[0] += len * 8;
      if (m->sz[0] < old_sz)
  	++m->sz[1];
!     offset = (old_sz / 8)  % 64;
!     while(len > 0) {
  	size_t l = min(len, 64 - offset);
  	memcpy(m->save + offset, p, l);
  	offset += l;
  	p += l;
  	len -= l;
! 	if(offset == 64) {
  #if defined(WORDS_BIGENDIAN)
  	    int i;
  	    afs_uint32 current[16];
! 	    struct x32 *u = (struct x32*)m->save;
! 	    for(i = 0; i < 8; i++){
! 		current[2*i+0] = swap_afs_uint32(u[i].a);
! 		current[2*i+1] = swap_afs_uint32(u[i].b);
  	    }
  	    calc(m, current);
  #else
! 	    calc(m, (afs_uint32*)m->save);
  #endif
  	    offset = 0;
  	}
--- 223,247 ----
      m->sz[0] += len * 8;
      if (m->sz[0] < old_sz)
  	++m->sz[1];
!     offset = (old_sz / 8) % 64;
!     while (len > 0) {
  	size_t l = min(len, 64 - offset);
  	memcpy(m->save + offset, p, l);
  	offset += l;
  	p += l;
  	len -= l;
! 	if (offset == 64) {
  #if defined(WORDS_BIGENDIAN)
  	    int i;
  	    afs_uint32 current[16];
! 	    struct x32 *u = (struct x32 *)m->save;
! 	    for (i = 0; i < 8; i++) {
! 		current[2 * i + 0] = swap_afs_uint32(u[i].a);
! 		current[2 * i + 1] = swap_afs_uint32(u[i].b);
  	    }
  	    calc(m, current);
  #else
! 	    calc(m, (afs_uint32 *) m->save);
  #endif
  	    offset = 0;
  	}
***************
*** 249,289 ****
  }
  
  void
! MD4_Final (void *res, struct md4 *m)
  {
!   static unsigned char zeros[72];
!   unsigned offset = (m->sz[0] / 8) % 64;
!   unsigned int dstart = (120 - offset - 1) % 64 + 1;
! 
!   *zeros = 0x80;
!   memset (zeros + 1, 0, sizeof(zeros) - 1);
!   zeros[dstart+0] = (m->sz[0] >> 0) & 0xff;
!   zeros[dstart+1] = (m->sz[0] >> 8) & 0xff;
!   zeros[dstart+2] = (m->sz[0] >> 16) & 0xff;
!   zeros[dstart+3] = (m->sz[0] >> 24) & 0xff;
!   zeros[dstart+4] = (m->sz[1] >> 0) & 0xff;
!   zeros[dstart+5] = (m->sz[1] >> 8) & 0xff;
!   zeros[dstart+6] = (m->sz[1] >> 16) & 0xff;
!   zeros[dstart+7] = (m->sz[1] >> 24) & 0xff;
!   MD4_Update (m, zeros, dstart + 8);
!   {
!       int i;
!       unsigned char *r = (unsigned char *)res;
! 
!       for (i = 0; i < 4; ++i) {
! 	  r[4*i]   = m->counter[i] & 0xFF;
! 	  r[4*i+1] = (m->counter[i] >> 8) & 0xFF;
! 	  r[4*i+2] = (m->counter[i] >> 16) & 0xFF;
! 	  r[4*i+3] = (m->counter[i] >> 24) & 0xFF;
!       }
!   }
  #if 0
!   {
!     int i;
!     afs_uint32 *r = (afs_uint32 *)res;
! 
!     for (i = 0; i < 4; ++i)
!       r[i] = swap_afs_uint32 (m->counter[i]);
!   }
  #endif
  }
--- 249,289 ----
  }
  
  void
! MD4_Final(void *res, struct md4 *m)
  {
!     static unsigned char zeros[72];
!     unsigned offset = (m->sz[0] / 8) % 64;
!     unsigned int dstart = (120 - offset - 1) % 64 + 1;
! 
!     *zeros = 0x80;
!     memset(zeros + 1, 0, sizeof(zeros) - 1);
!     zeros[dstart + 0] = (m->sz[0] >> 0) & 0xff;
!     zeros[dstart + 1] = (m->sz[0] >> 8) & 0xff;
!     zeros[dstart + 2] = (m->sz[0] >> 16) & 0xff;
!     zeros[dstart + 3] = (m->sz[0] >> 24) & 0xff;
!     zeros[dstart + 4] = (m->sz[1] >> 0) & 0xff;
!     zeros[dstart + 5] = (m->sz[1] >> 8) & 0xff;
!     zeros[dstart + 6] = (m->sz[1] >> 16) & 0xff;
!     zeros[dstart + 7] = (m->sz[1] >> 24) & 0xff;
!     MD4_Update(m, zeros, dstart + 8);
!     {
! 	int i;
! 	unsigned char *r = (unsigned char *)res;
! 
! 	for (i = 0; i < 4; ++i) {
! 	    r[4 * i] = m->counter[i] & 0xFF;
! 	    r[4 * i + 1] = (m->counter[i] >> 8) & 0xFF;
! 	    r[4 * i + 2] = (m->counter[i] >> 16) & 0xFF;
! 	    r[4 * i + 3] = (m->counter[i] >> 24) & 0xFF;
! 	}
!     }
  #if 0
!     {
! 	int i;
! 	afs_uint32 *r = (afs_uint32 *) res;
! 
! 	for (i = 0; i < 4; ++i)
! 	    r[i] = swap_afs_uint32(m->counter[i]);
!     }
  #endif
  }
Index: openafs/src/rxkad/md4.h
diff -c openafs/src/rxkad/md4.h:1.1 openafs/src/rxkad/md4.h:1.1.2.1
*** openafs/src/rxkad/md4.h:1.1	Fri Apr  9 01:54:22 2004
--- openafs/src/rxkad/md4.h	Wed Aug 25 03:09:42 2004
***************
*** 31,37 ****
   * SUCH DAMAGE.
   */
  
! /* $Id: md4.h,v 1.1 2004/04/09 05:54:22 jaltman Exp $ */
  
  #include <stdlib.h>
  #ifdef HAVE_SYS_TYPES_H
--- 31,37 ----
   * SUCH DAMAGE.
   */
  
! /* $Id: md4.h,v 1.1.2.1 2004/08/25 07:09:42 shadow Exp $ */
  
  #include <stdlib.h>
  #ifdef HAVE_SYS_TYPES_H
***************
*** 42,54 ****
  #endif
  
  struct md4 {
!   unsigned int sz[2];
!   afs_uint32 counter[4];
!   unsigned char save[64];
  };
  
  typedef struct md4 MD4_CTX;
  
! void MD4_Init (struct md4 *m);
! void MD4_Update (struct md4 *m, const void *p, size_t len);
! void MD4_Final (void *res, struct md4 *m);
--- 42,54 ----
  #endif
  
  struct md4 {
!     unsigned int sz[2];
!     afs_uint32 counter[4];
!     unsigned char save[64];
  };
  
  typedef struct md4 MD4_CTX;
  
! void MD4_Init(struct md4 *m);
! void MD4_Update(struct md4 *m, const void *p, size_t len);
! void MD4_Final(void *res, struct md4 *m);
Index: openafs/src/rxkad/md5.c
diff -c openafs/src/rxkad/md5.c:1.1 openafs/src/rxkad/md5.c:1.1.2.1
*** openafs/src/rxkad/md5.c:1.1	Fri Apr  9 01:54:22 2004
--- openafs/src/rxkad/md5.c	Wed Aug 25 03:09:42 2004
***************
*** 69,75 ****
  #include "rxkad.h"
  #endif /* defined(UKERNEL) */
  
! RCSID("$Id: md5.c,v 1.1 2004/04/09 05:54:22 jaltman Exp $");
  
  #undef WORDS_BIGENDIAN
  #ifdef AFSBIG_ENDIAN
--- 69,75 ----
  #include "rxkad.h"
  #endif /* defined(UKERNEL) */
  
! RCSID("$Id: md5.c,v 1.1.2.1 2004/08/25 07:09:42 shadow Exp $");
  
  #undef WORDS_BIGENDIAN
  #ifdef AFSBIG_ENDIAN
***************
*** 86,99 ****
  #define X data
  
  void
! MD5_Init (struct md5 *m)
  {
!   m->sz[0] = 0;
!   m->sz[1] = 0;
!   D = 0x10325476;
!   C = 0x98badcfe;
!   B = 0xefcdab89;
!   A = 0x67452301;
  }
  
  #define F(x,y,z) CRAYFIX((x & y) | (~x & z))
--- 86,99 ----
  #define X data
  
  void
! MD5_Init(struct md5 *m)
  {
!     m->sz[0] = 0;
!     m->sz[1] = 0;
!     D = 0x10325476;
!     C = 0x98badcfe;
!     B = 0xefcdab89;
!     A = 0x67452301;
  }
  
  #define F(x,y,z) CRAYFIX((x & y) | (~x & z))
***************
*** 110,216 ****
  #define DO4(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,I)
  
  static inline void
! calc (struct md5 *m, afs_uint32 *data)
  {
!   afs_uint32 AA, BB, CC, DD;
  
!   AA = A;
!   BB = B;
!   CC = C;
!   DD = D;
! 
!   /* Round 1 */
! 
!   DO1(A,B,C,D,0,7,0xd76aa478);
!   DO1(D,A,B,C,1,12,0xe8c7b756);
!   DO1(C,D,A,B,2,17,0x242070db);
!   DO1(B,C,D,A,3,22,0xc1bdceee);
! 
!   DO1(A,B,C,D,4,7,0xf57c0faf);
!   DO1(D,A,B,C,5,12,0x4787c62a);
!   DO1(C,D,A,B,6,17,0xa8304613);
!   DO1(B,C,D,A,7,22,0xfd469501);
! 
!   DO1(A,B,C,D,8,7,0x698098d8);
!   DO1(D,A,B,C,9,12,0x8b44f7af);
!   DO1(C,D,A,B,10,17,0xffff5bb1);
!   DO1(B,C,D,A,11,22,0x895cd7be);
! 
!   DO1(A,B,C,D,12,7,0x6b901122);
!   DO1(D,A,B,C,13,12,0xfd987193);
!   DO1(C,D,A,B,14,17,0xa679438e);
!   DO1(B,C,D,A,15,22,0x49b40821);
! 
!   /* Round 2 */
! 
!   DO2(A,B,C,D,1,5,0xf61e2562);
!   DO2(D,A,B,C,6,9,0xc040b340);
!   DO2(C,D,A,B,11,14,0x265e5a51);
!   DO2(B,C,D,A,0,20,0xe9b6c7aa);
! 
!   DO2(A,B,C,D,5,5,0xd62f105d);
!   DO2(D,A,B,C,10,9,0x2441453);
!   DO2(C,D,A,B,15,14,0xd8a1e681);
!   DO2(B,C,D,A,4,20,0xe7d3fbc8);
! 
!   DO2(A,B,C,D,9,5,0x21e1cde6);
!   DO2(D,A,B,C,14,9,0xc33707d6);
!   DO2(C,D,A,B,3,14,0xf4d50d87);
!   DO2(B,C,D,A,8,20,0x455a14ed);
! 
!   DO2(A,B,C,D,13,5,0xa9e3e905);
!   DO2(D,A,B,C,2,9,0xfcefa3f8);
!   DO2(C,D,A,B,7,14,0x676f02d9);
!   DO2(B,C,D,A,12,20,0x8d2a4c8a);
! 
!   /* Round 3 */
! 
!   DO3(A,B,C,D,5,4,0xfffa3942);
!   DO3(D,A,B,C,8,11,0x8771f681);
!   DO3(C,D,A,B,11,16,0x6d9d6122);
!   DO3(B,C,D,A,14,23,0xfde5380c);
! 
!   DO3(A,B,C,D,1,4,0xa4beea44);
!   DO3(D,A,B,C,4,11,0x4bdecfa9);
!   DO3(C,D,A,B,7,16,0xf6bb4b60);
!   DO3(B,C,D,A,10,23,0xbebfbc70);
! 
!   DO3(A,B,C,D,13,4,0x289b7ec6);
!   DO3(D,A,B,C,0,11,0xeaa127fa);
!   DO3(C,D,A,B,3,16,0xd4ef3085);
!   DO3(B,C,D,A,6,23,0x4881d05);
! 
!   DO3(A,B,C,D,9,4,0xd9d4d039);
!   DO3(D,A,B,C,12,11,0xe6db99e5);
!   DO3(C,D,A,B,15,16,0x1fa27cf8);
!   DO3(B,C,D,A,2,23,0xc4ac5665);
! 
!   /* Round 4 */
! 
!   DO4(A,B,C,D,0,6,0xf4292244);
!   DO4(D,A,B,C,7,10,0x432aff97);
!   DO4(C,D,A,B,14,15,0xab9423a7);
!   DO4(B,C,D,A,5,21,0xfc93a039);
! 
!   DO4(A,B,C,D,12,6,0x655b59c3);
!   DO4(D,A,B,C,3,10,0x8f0ccc92);
!   DO4(C,D,A,B,10,15,0xffeff47d);
!   DO4(B,C,D,A,1,21,0x85845dd1);
! 
!   DO4(A,B,C,D,8,6,0x6fa87e4f);
!   DO4(D,A,B,C,15,10,0xfe2ce6e0);
!   DO4(C,D,A,B,6,15,0xa3014314);
!   DO4(B,C,D,A,13,21,0x4e0811a1);
! 
!   DO4(A,B,C,D,4,6,0xf7537e82);
!   DO4(D,A,B,C,11,10,0xbd3af235);
!   DO4(C,D,A,B,2,15,0x2ad7d2bb);
!   DO4(B,C,D,A,9,21,0xeb86d391);
! 
!   A += AA;
!   B += BB;
!   C += CC;
!   D += DD;
  }
  
  /*
--- 110,216 ----
  #define DO4(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,I)
  
  static inline void
! calc(struct md5 *m, afs_uint32 * data)
  {
!     afs_uint32 AA, BB, CC, DD;
  
!     AA = A;
!     BB = B;
!     CC = C;
!     DD = D;
! 
!     /* Round 1 */
! 
!     DO1(A, B, C, D, 0, 7, 0xd76aa478);
!     DO1(D, A, B, C, 1, 12, 0xe8c7b756);
!     DO1(C, D, A, B, 2, 17, 0x242070db);
!     DO1(B, C, D, A, 3, 22, 0xc1bdceee);
! 
!     DO1(A, B, C, D, 4, 7, 0xf57c0faf);
!     DO1(D, A, B, C, 5, 12, 0x4787c62a);
!     DO1(C, D, A, B, 6, 17, 0xa8304613);
!     DO1(B, C, D, A, 7, 22, 0xfd469501);
! 
!     DO1(A, B, C, D, 8, 7, 0x698098d8);
!     DO1(D, A, B, C, 9, 12, 0x8b44f7af);
!     DO1(C, D, A, B, 10, 17, 0xffff5bb1);
!     DO1(B, C, D, A, 11, 22, 0x895cd7be);
! 
!     DO1(A, B, C, D, 12, 7, 0x6b901122);
!     DO1(D, A, B, C, 13, 12, 0xfd987193);
!     DO1(C, D, A, B, 14, 17, 0xa679438e);
!     DO1(B, C, D, A, 15, 22, 0x49b40821);
! 
!     /* Round 2 */
! 
!     DO2(A, B, C, D, 1, 5, 0xf61e2562);
!     DO2(D, A, B, C, 6, 9, 0xc040b340);
!     DO2(C, D, A, B, 11, 14, 0x265e5a51);
!     DO2(B, C, D, A, 0, 20, 0xe9b6c7aa);
! 
!     DO2(A, B, C, D, 5, 5, 0xd62f105d);
!     DO2(D, A, B, C, 10, 9, 0x2441453);
!     DO2(C, D, A, B, 15, 14, 0xd8a1e681);
!     DO2(B, C, D, A, 4, 20, 0xe7d3fbc8);
! 
!     DO2(A, B, C, D, 9, 5, 0x21e1cde6);
!     DO2(D, A, B, C, 14, 9, 0xc33707d6);
!     DO2(C, D, A, B, 3, 14, 0xf4d50d87);
!     DO2(B, C, D, A, 8, 20, 0x455a14ed);
! 
!     DO2(A, B, C, D, 13, 5, 0xa9e3e905);
!     DO2(D, A, B, C, 2, 9, 0xfcefa3f8);
!     DO2(C, D, A, B, 7, 14, 0x676f02d9);
!     DO2(B, C, D, A, 12, 20, 0x8d2a4c8a);
! 
!     /* Round 3 */
! 
!     DO3(A, B, C, D, 5, 4, 0xfffa3942);
!     DO3(D, A, B, C, 8, 11, 0x8771f681);
!     DO3(C, D, A, B, 11, 16, 0x6d9d6122);
!     DO3(B, C, D, A, 14, 23, 0xfde5380c);
! 
!     DO3(A, B, C, D, 1, 4, 0xa4beea44);
!     DO3(D, A, B, C, 4, 11, 0x4bdecfa9);
!     DO3(C, D, A, B, 7, 16, 0xf6bb4b60);
!     DO3(B, C, D, A, 10, 23, 0xbebfbc70);
! 
!     DO3(A, B, C, D, 13, 4, 0x289b7ec6);
!     DO3(D, A, B, C, 0, 11, 0xeaa127fa);
!     DO3(C, D, A, B, 3, 16, 0xd4ef3085);
!     DO3(B, C, D, A, 6, 23, 0x4881d05);
! 
!     DO3(A, B, C, D, 9, 4, 0xd9d4d039);
!     DO3(D, A, B, C, 12, 11, 0xe6db99e5);
!     DO3(C, D, A, B, 15, 16, 0x1fa27cf8);
!     DO3(B, C, D, A, 2, 23, 0xc4ac5665);
! 
!     /* Round 4 */
! 
!     DO4(A, B, C, D, 0, 6, 0xf4292244);
!     DO4(D, A, B, C, 7, 10, 0x432aff97);
!     DO4(C, D, A, B, 14, 15, 0xab9423a7);
!     DO4(B, C, D, A, 5, 21, 0xfc93a039);
! 
!     DO4(A, B, C, D, 12, 6, 0x655b59c3);
!     DO4(D, A, B, C, 3, 10, 0x8f0ccc92);
!     DO4(C, D, A, B, 10, 15, 0xffeff47d);
!     DO4(B, C, D, A, 1, 21, 0x85845dd1);
! 
!     DO4(A, B, C, D, 8, 6, 0x6fa87e4f);
!     DO4(D, A, B, C, 15, 10, 0xfe2ce6e0);
!     DO4(C, D, A, B, 6, 15, 0xa3014314);
!     DO4(B, C, D, A, 13, 21, 0x4e0811a1);
! 
!     DO4(A, B, C, D, 4, 6, 0xf7537e82);
!     DO4(D, A, B, C, 11, 10, 0xbd3af235);
!     DO4(C, D, A, B, 2, 15, 0x2ad7d2bb);
!     DO4(B, C, D, A, 9, 21, 0xeb86d391);
! 
!     A += AA;
!     B += BB;
!     C += CC;
!     D += DD;
  }
  
  /*
***************
*** 219,313 ****
  
  #if defined(WORDS_BIGENDIAN)
  static inline afs_uint32
! swap_afs_uint32 (afs_uint32 t)
  {
!   afs_uint32 temp1, temp2;
  
!   temp1   = cshift(t, 16);
!   temp2   = temp1 >> 8;
!   temp1  &= 0x00ff00ff;
!   temp2  &= 0x00ff00ff;
!   temp1 <<= 8;
!   return temp1 | temp2;
  }
  #endif
  
! struct x32{
!   unsigned int a:32;
!   unsigned int b:32;
  };
  
  void
! MD5_Update (struct md5 *m, const void *v, size_t len)
  {
!   const unsigned char *p = v;
!   size_t old_sz = m->sz[0];
!   size_t offset;
! 
!   m->sz[0] += len * 8;
!   if (m->sz[0] < old_sz)
!       ++m->sz[1];
!   offset = (old_sz / 8)  % 64;
!   while(len > 0){
!     size_t l = min(len, 64 - offset);
!     memcpy(m->save + offset, p, l);
!     offset += l;
!     p += l;
!     len -= l;
!     if(offset == 64){
  #if defined(WORDS_BIGENDIAN)
!       int i;
!       afs_uint32 current[16];
!       struct x32 *u = (struct x32*)m->save;
!       for(i = 0; i < 8; i++){
! 	current[2*i+0] = swap_afs_uint32(u[i].a);
! 	current[2*i+1] = swap_afs_uint32(u[i].b);
!       }
!       calc(m, current);
  #else
!       calc(m, (afs_uint32*)m->save);
  #endif
!       offset = 0;
      }
-   }
  }
  
  void
! MD5_Final (void *res, struct md5 *m)
  {
!   static unsigned char zeros[72];
!   unsigned offset = (m->sz[0] / 8) % 64;
!   unsigned int dstart = (120 - offset - 1) % 64 + 1;
! 
!   *zeros = 0x80;
!   memset (zeros + 1, 0, sizeof(zeros) - 1);
!   zeros[dstart+0] = (m->sz[0] >> 0) & 0xff;
!   zeros[dstart+1] = (m->sz[0] >> 8) & 0xff;
!   zeros[dstart+2] = (m->sz[0] >> 16) & 0xff;
!   zeros[dstart+3] = (m->sz[0] >> 24) & 0xff;
!   zeros[dstart+4] = (m->sz[1] >> 0) & 0xff;
!   zeros[dstart+5] = (m->sz[1] >> 8) & 0xff;
!   zeros[dstart+6] = (m->sz[1] >> 16) & 0xff;
!   zeros[dstart+7] = (m->sz[1] >> 24) & 0xff;
!   MD5_Update (m, zeros, dstart + 8);
!   {
!       int i;
!       unsigned char *r = (unsigned char *)res;
! 
!       for (i = 0; i < 4; ++i) {
! 	  r[4*i]   = m->counter[i] & 0xFF;
! 	  r[4*i+1] = (m->counter[i] >> 8) & 0xFF;
! 	  r[4*i+2] = (m->counter[i] >> 16) & 0xFF;
! 	  r[4*i+3] = (m->counter[i] >> 24) & 0xFF;
!       }
!   }
  #if 0
!   {
!     int i;
!     afs_uint32 *r = (afs_uint32 *)res;
! 
!     for (i = 0; i < 4; ++i)
!       r[i] = swap_afs_uint32 (m->counter[i]);
!   }
  #endif
  }
--- 219,313 ----
  
  #if defined(WORDS_BIGENDIAN)
  static inline afs_uint32
! swap_afs_uint32(afs_uint32 t)
  {
!     afs_uint32 temp1, temp2;
  
!     temp1 = cshift(t, 16);
!     temp2 = temp1 >> 8;
!     temp1 &= 0x00ff00ff;
!     temp2 &= 0x00ff00ff;
!     temp1 <<= 8;
!     return temp1 | temp2;
  }
  #endif
  
! struct x32 {
!     unsigned int a:32;
!     unsigned int b:32;
  };
  
  void
! MD5_Update(struct md5 *m, const void *v, size_t len)
  {
!     const unsigned char *p = v;
!     size_t old_sz = m->sz[0];
!     size_t offset;
! 
!     m->sz[0] += len * 8;
!     if (m->sz[0] < old_sz)
! 	++m->sz[1];
!     offset = (old_sz / 8) % 64;
!     while (len > 0) {
! 	size_t l = min(len, 64 - offset);
! 	memcpy(m->save + offset, p, l);
! 	offset += l;
! 	p += l;
! 	len -= l;
! 	if (offset == 64) {
  #if defined(WORDS_BIGENDIAN)
! 	    int i;
! 	    afs_uint32 current[16];
! 	    struct x32 *u = (struct x32 *)m->save;
! 	    for (i = 0; i < 8; i++) {
! 		current[2 * i + 0] = swap_afs_uint32(u[i].a);
! 		current[2 * i + 1] = swap_afs_uint32(u[i].b);
! 	    }
! 	    calc(m, current);
  #else
! 	    calc(m, (afs_uint32 *) m->save);
  #endif
! 	    offset = 0;
! 	}
      }
  }
  
  void
! MD5_Final(void *res, struct md5 *m)
  {
!     static unsigned char zeros[72];
!     unsigned offset = (m->sz[0] / 8) % 64;
!     unsigned int dstart = (120 - offset - 1) % 64 + 1;
! 
!     *zeros = 0x80;
!     memset(zeros + 1, 0, sizeof(zeros) - 1);
!     zeros[dstart + 0] = (m->sz[0] >> 0) & 0xff;
!     zeros[dstart + 1] = (m->sz[0] >> 8) & 0xff;
!     zeros[dstart + 2] = (m->sz[0] >> 16) & 0xff;
!     zeros[dstart + 3] = (m->sz[0] >> 24) & 0xff;
!     zeros[dstart + 4] = (m->sz[1] >> 0) & 0xff;
!     zeros[dstart + 5] = (m->sz[1] >> 8) & 0xff;
!     zeros[dstart + 6] = (m->sz[1] >> 16) & 0xff;
!     zeros[dstart + 7] = (m->sz[1] >> 24) & 0xff;
!     MD5_Update(m, zeros, dstart + 8);
!     {
! 	int i;
! 	unsigned char *r = (unsigned char *)res;
! 
! 	for (i = 0; i < 4; ++i) {
! 	    r[4 * i] = m->counter[i] & 0xFF;
! 	    r[4 * i + 1] = (m->counter[i] >> 8) & 0xFF;
! 	    r[4 * i + 2] = (m->counter[i] >> 16) & 0xFF;
! 	    r[4 * i + 3] = (m->counter[i] >> 24) & 0xFF;
! 	}
!     }
  #if 0
!     {
! 	int i;
! 	afs_uint32 *r = (afs_uint32 *) res;
! 
! 	for (i = 0; i < 4; ++i)
! 	    r[i] = swap_afs_uint32(m->counter[i]);
!     }
  #endif
  }
Index: openafs/src/rxkad/md5.h
diff -c openafs/src/rxkad/md5.h:1.1 openafs/src/rxkad/md5.h:1.1.2.1
*** openafs/src/rxkad/md5.h:1.1	Fri Apr  9 01:54:22 2004
--- openafs/src/rxkad/md5.h	Wed Aug 25 03:09:42 2004
***************
*** 31,37 ****
   * SUCH DAMAGE.
   */
  
! /* $Id: md5.h,v 1.1 2004/04/09 05:54:22 jaltman Exp $ */
  
  #include <stdlib.h>
  #ifdef HAVE_SYS_TYPES_H
--- 31,37 ----
   * SUCH DAMAGE.
   */
  
! /* $Id: md5.h,v 1.1.2.1 2004/08/25 07:09:42 shadow Exp $ */
  
  #include <stdlib.h>
  #ifdef HAVE_SYS_TYPES_H
***************
*** 42,54 ****
  #endif
  
  struct md5 {
!   unsigned int sz[2];
!   afs_uint32 counter[4];
!   unsigned char save[64];
  };
  
  typedef struct md5 MD5_CTX;
  
! void MD5_Init (struct md5 *m);
! void MD5_Update (struct md5 *m, const void *p, size_t len);
! void MD5_Final (void *res, struct md5 *m); /* afs_uint32 res[4] */
--- 42,54 ----
  #endif
  
  struct md5 {
!     unsigned int sz[2];
!     afs_uint32 counter[4];
!     unsigned char save[64];
  };
  
  typedef struct md5 MD5_CTX;
  
! void MD5_Init(struct md5 *m);
! void MD5_Update(struct md5 *m, const void *p, size_t len);
! void MD5_Final(void *res, struct md5 *m);	/* afs_uint32 res[4] */
Index: openafs/src/rxkad/rxkad.p.h
diff -c openafs/src/rxkad/rxkad.p.h:1.11 openafs/src/rxkad/rxkad.p.h:1.11.2.2
*** openafs/src/rxkad/rxkad.p.h:1.11	Sun Jul 11 17:23:09 2004
--- openafs/src/rxkad/rxkad.p.h	Wed Aug 25 03:20:28 2004
***************
*** 16,30 ****
  		/* no ticket good for longer than 30 days */
  #define MAXKTCTICKETLIFETIME (30*24*3600)
  #define MINKTCTICKETLEN	      32
! #define	MAXKTCTICKETLEN	      12000 /* was 344 */
  #define	MAXKTCNAMELEN	      64	/* name & inst should be 256 */
  #define MAXKTCREALMLEN	      64	/* should be 256 */
  #define KTC_TIME_UNCERTAINTY (15*60)	/* max skew bet. machines' clocks */
  
  #define MAXRANDOMNAMELEN 16	/* length of random generated 
!                              * usernames used by afslog for high 
!                              * security must be < MAXKTCNAMELEN && < MAXSMBNAMELEN */
! #define MAXSMBNAMELEN    256 /* max length of an SMB name */
  
  #define LOGON_OPTION_INTEGRATED 1
  #define LOGON_OPTION_HIGHSECURITY 2
--- 16,35 ----
  		/* no ticket good for longer than 30 days */
  #define MAXKTCTICKETLIFETIME (30*24*3600)
  #define MINKTCTICKETLEN	      32
! #ifdef AFS_AIX_ENV
! #define MAXKTCTICKETLEN 344 /* XXX why must this be small? */
! #else
! #define	MAXKTCTICKETLEN	      12000	/* was 344 */
! #endif
! 
  #define	MAXKTCNAMELEN	      64	/* name & inst should be 256 */
  #define MAXKTCREALMLEN	      64	/* should be 256 */
  #define KTC_TIME_UNCERTAINTY (15*60)	/* max skew bet. machines' clocks */
  
  #define MAXRANDOMNAMELEN 16	/* length of random generated 
! 				 * usernames used by afslog for high 
! 				 * security must be < MAXKTCNAMELEN && < MAXSMBNAMELEN */
! #define MAXSMBNAMELEN    256	/* max length of an SMB name */
  
  #define LOGON_OPTION_INTEGRATED 1
  #define LOGON_OPTION_HIGHSECURITY 2
***************
*** 124,131 ****
  #include <pthread.h>
  #include <assert.h>
  extern pthread_mutex_t rxkad_stats_mutex;
! #define LOCK_RXKAD_STATS assert(pthread_mutex_lock(&rxkad_stats_mutex)==0);
! #define UNLOCK_RXKAD_STATS assert(pthread_mutex_unlock(&rxkad_stats_mutex)==0);
  #else
  #define LOCK_RXKAD_STATS
  #define UNLOCK_RXKAD_STATS
--- 129,136 ----
  #include <pthread.h>
  #include <assert.h>
  extern pthread_mutex_t rxkad_stats_mutex;
! #define LOCK_RXKAD_STATS assert(pthread_mutex_lock(&rxkad_stats_mutex)==0)
! #define UNLOCK_RXKAD_STATS assert(pthread_mutex_unlock(&rxkad_stats_mutex)==0)
  #else
  #define LOCK_RXKAD_STATS
  #define UNLOCK_RXKAD_STATS
Index: openafs/src/rxkad/rxkad_client.c
diff -c openafs/src/rxkad/rxkad_client.c:1.18 openafs/src/rxkad/rxkad_client.c:1.18.2.1
*** openafs/src/rxkad/rxkad_client.c:1.18	Mon Apr 19 01:43:58 2004
--- openafs/src/rxkad/rxkad_client.c	Wed Aug 25 03:09:42 2004
***************
*** 19,25 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/rxkad_client.c,v 1.18 2004/04/19 05:43:58 kolya Exp $");
  
  #ifdef KERNEL
  #include "afs/stds.h"
--- 19,25 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/rxkad_client.c,v 1.18.2.1 2004/08/25 07:09:42 shadow Exp $");
  
  #ifdef KERNEL
  #include "afs/stds.h"
***************
*** 101,108 ****
   */
  #include <assert.h>
  pthread_mutex_t rxkad_client_uid_mutex;
! #define LOCK_CUID assert(pthread_mutex_lock(&rxkad_client_uid_mutex)==0);
! #define UNLOCK_CUID assert(pthread_mutex_unlock(&rxkad_client_uid_mutex)==0);
  #else
  #define LOCK_CUID
  #define UNLOCK_CUID
--- 101,108 ----
   */
  #include <assert.h>
  pthread_mutex_t rxkad_client_uid_mutex;
! #define LOCK_CUID assert(pthread_mutex_lock(&rxkad_client_uid_mutex)==0)
! #define UNLOCK_CUID assert(pthread_mutex_unlock(&rxkad_client_uid_mutex)==0)
  #else
  #define LOCK_CUID
  #define UNLOCK_CUID
***************
*** 119,125 ****
      struct rxkad_cidgen tgen;
      static afs_int32 counter = 0;	/* not used anymore */
  
!     LOCK_CUID if (Cuid[0] == 0) {
  	afs_uint32 xor[2];
  	tgen.ipAddr = rxi_getaddr();	/* comes back in net order */
  	clock_GetTime(&tgen.time);	/* changes time1 and time2 */
--- 119,126 ----
      struct rxkad_cidgen tgen;
      static afs_int32 counter = 0;	/* not used anymore */
  
!     LOCK_CUID;
!     if (Cuid[0] == 0) {
  	afs_uint32 xor[2];
  	tgen.ipAddr = rxi_getaddr();	/* comes back in net order */
  	clock_GetTime(&tgen.time);	/* changes time1 and time2 */
***************
*** 154,165 ****
      }
  
      if (!aconn) {
! 	UNLOCK_CUID return 0;
      }
      aconn->epoch = Cuid[0];
      aconn->cid = Cuid[1];
      Cuid[1] += 1 << RX_CIDSHIFT;
!     UNLOCK_CUID return 0;
  }
  
  /* Allocate a new client security object.  Called with the encryption level,
--- 155,168 ----
      }
  
      if (!aconn) {
! 	UNLOCK_CUID;
! 	return 0;
      }
      aconn->epoch = Cuid[0];
      aconn->cid = Cuid[1];
      Cuid[1] += 1 << RX_CIDSHIFT;
!     UNLOCK_CUID;
!     return 0;
  }
  
  /* Allocate a new client security object.  Called with the encryption level,
***************
*** 204,211 ****
      }
      memcpy(tcp->ticket, ticket, ticketLen);
  
!     LOCK_RXKAD_STATS rxkad_stats_clientObjects++;
!     UNLOCK_RXKAD_STATS return tsc;
  }
  
  /* client: respond to a challenge packet */
--- 207,216 ----
      }
      memcpy(tcp->ticket, ticket, ticketLen);
  
!     LOCK_RXKAD_STATS;
!     rxkad_stats_clientObjects++;
!     UNLOCK_RXKAD_STATS;
!     return tsc;
  }
  
  /* client: respond to a challenge packet */
***************
*** 250,257 ****
  
      if (level > tcp->level)
  	return RXKADLEVELFAIL;
!     LOCK_RXKAD_STATS rxkad_stats.challenges[rxkad_LevelIndex(tcp->level)]++;
!     UNLOCK_RXKAD_STATS if (v2) {
  	int i;
  	afs_uint32 xor[2];
  	memset((void *)&r_v2, 0, sizeof(r_v2));
--- 255,264 ----
  
      if (level > tcp->level)
  	return RXKADLEVELFAIL;
!     LOCK_RXKAD_STATS;
!     rxkad_stats.challenges[rxkad_LevelIndex(tcp->level)]++;
!     UNLOCK_RXKAD_STATS;
!     if (v2) {
  	int i;
  	afs_uint32 xor[2];
  	memset((void *)&r_v2, 0, sizeof(r_v2));
***************
*** 307,312 ****
  void
  rxkad_ResetState(void)
  {
!     LOCK_CUID Cuid[0] = 0;
      rxkad_EpochWasSet = 0;
! UNLOCK_CUID}
--- 314,321 ----
  void
  rxkad_ResetState(void)
  {
!     LOCK_CUID;
!     Cuid[0] = 0;
      rxkad_EpochWasSet = 0;
!     UNLOCK_CUID;
! }
Index: openafs/src/rxkad/rxkad_common.c
diff -c openafs/src/rxkad/rxkad_common.c:1.20 openafs/src/rxkad/rxkad_common.c:1.20.2.1
*** openafs/src/rxkad/rxkad_common.c:1.20	Wed Jun 23 10:27:44 2004
--- openafs/src/rxkad/rxkad_common.c	Wed Aug 25 03:09:42 2004
***************
*** 23,29 ****
  #define INCLUDE_RXKAD_PRIVATE_DECLS
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/rxkad_common.c,v 1.20 2004/06/23 14:27:44 shadow Exp $");
  
  #ifdef KERNEL
  #ifndef UKERNEL
--- 23,29 ----
  #define INCLUDE_RXKAD_PRIVATE_DECLS
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/rxkad_common.c,v 1.20.2.1 2004/08/25 07:09:42 shadow Exp $");
  
  #ifdef KERNEL
  #ifndef UKERNEL
***************
*** 83,89 ****
  #endif
  /* variable initialization for the benefit of darwin compiler; if it causes
     problems elsewhere, conditionalize for darwin or fc_test compile breaks */
! struct rxkad_stats rxkad_stats = {0};
  
  /* static prototypes */
  static afs_int32 ComputeSum(struct rx_packet *apacket,
--- 83,89 ----
  #endif
  /* variable initialization for the benefit of darwin compiler; if it causes
     problems elsewhere, conditionalize for darwin or fc_test compile breaks */
! struct rxkad_stats rxkad_stats = { 0 };
  
  /* static prototypes */
  static afs_int32 ComputeSum(struct rx_packet *apacket,
***************
*** 207,214 ****
      } else {
  	return RXKADINCONSISTENCY;
      }				/* unknown type */
!     LOCK_RXKAD_STATS rxkad_stats.destroyObject++;
!     UNLOCK_RXKAD_STATS return 0;
  }
  
  /* rxkad_Close - called by rx with the security class object as a parameter
--- 207,216 ----
      } else {
  	return RXKADINCONSISTENCY;
      }				/* unknown type */
!     LOCK_RXKAD_STATS;
!     rxkad_stats.destroyObject++;
!     UNLOCK_RXKAD_STATS;
!     return 0;
  }
  
  /* rxkad_Close - called by rx with the security class object as a parameter
***************
*** 249,257 ****
  	rxkad_SetLevel(aconn, tcp->level);	/* set header and trailer sizes */
  	rxkad_AllocCID(aobj, aconn);	/* CHANGES cid AND epoch!!!! */
  	rxkad_DeriveXORInfo(aconn, tcp->keysched, tcp->ivec, tccp->preSeq);
! 	LOCK_RXKAD_STATS rxkad_stats.
! 	    connections[rxkad_LevelIndex(tcp->level)]++;
!     UNLOCK_RXKAD_STATS}
  
      aobj->refCount++;		/* attached connection */
      return 0;
--- 251,260 ----
  	rxkad_SetLevel(aconn, tcp->level);	/* set header and trailer sizes */
  	rxkad_AllocCID(aobj, aconn);	/* CHANGES cid AND epoch!!!! */
  	rxkad_DeriveXORInfo(aconn, tcp->keysched, tcp->ivec, tccp->preSeq);
! 	LOCK_RXKAD_STATS;
! 	rxkad_stats.connections[rxkad_LevelIndex(tcp->level)]++;
! 	UNLOCK_RXKAD_STATS;
!     }
  
      aobj->refCount++;		/* attached connection */
      return 0;
***************
*** 269,285 ****
  	sconn = (struct rxkad_sconn *)aconn->securityData;
  	if (sconn) {
  	    aconn->securityData = 0;
! 	    LOCK_RXKAD_STATS if (sconn->authenticated)
! 		  rxkad_stats.destroyConn[rxkad_LevelIndex(sconn->level)]++;
  	    else
  		rxkad_stats.destroyUnauth++;
! 	    UNLOCK_RXKAD_STATS rock = sconn->rock;
  	    if (rock)
  		rxi_Free(rock, sizeof(struct rxkad_serverinfo));
  	    rxi_Free(sconn, sizeof(struct rxkad_sconn));
  	} else {
! 	    LOCK_RXKAD_STATS rxkad_stats.destroyUnused++;
! 	UNLOCK_RXKAD_STATS}
      } else {			/* client */
  	struct rxkad_cconn *cconn;
  	struct rxkad_cprivate *tcp;
--- 272,292 ----
  	sconn = (struct rxkad_sconn *)aconn->securityData;
  	if (sconn) {
  	    aconn->securityData = 0;
! 	    LOCK_RXKAD_STATS;
! 	    if (sconn->authenticated)
! 		rxkad_stats.destroyConn[rxkad_LevelIndex(sconn->level)]++;
  	    else
  		rxkad_stats.destroyUnauth++;
! 	    UNLOCK_RXKAD_STATS;
! 	    rock = sconn->rock;
  	    if (rock)
  		rxi_Free(rock, sizeof(struct rxkad_serverinfo));
  	    rxi_Free(sconn, sizeof(struct rxkad_sconn));
  	} else {
! 	    LOCK_RXKAD_STATS;
! 	    rxkad_stats.destroyUnused++;
! 	    UNLOCK_RXKAD_STATS;
! 	}
      } else {			/* client */
  	struct rxkad_cconn *cconn;
  	struct rxkad_cprivate *tcp;
***************
*** 291,298 ****
  	    aconn->securityData = 0;
  	    rxi_Free(cconn, sizeof(struct rxkad_cconn));
  	}
! 	LOCK_RXKAD_STATS rxkad_stats.destroyClient++;
!     UNLOCK_RXKAD_STATS}
      aobj->refCount--;		/* decrement connection counter */
      if (aobj->refCount <= 0) {
  	afs_int32 code;
--- 298,307 ----
  	    aconn->securityData = 0;
  	    rxi_Free(cconn, sizeof(struct rxkad_cconn));
  	}
! 	LOCK_RXKAD_STATS;
! 	rxkad_stats.destroyClient++;
! 	UNLOCK_RXKAD_STATS;
!     }
      aobj->refCount--;		/* decrement connection counter */
      if (aobj->refCount <= 0) {
  	afs_int32 code;
***************
*** 332,346 ****
  	if (sconn && sconn->authenticated
  	    && (osi_Time() < sconn->expirationTime)) {
  	    level = sconn->level;
! 	    LOCK_RXKAD_STATS rxkad_stats.
! 		checkPackets[rxkad_StatIndex(rxkad_server, level)]++;
! 	    UNLOCK_RXKAD_STATS sconn->stats.packetsReceived++;
  	    sconn->stats.bytesReceived += len;
  	    schedule = (fc_KeySchedule *) sconn->keysched;
  	    ivec = (fc_InitializationVector *) sconn->ivec;
  	} else {
! 	    LOCK_RXKAD_STATS rxkad_stats.expired++;
! 	    UNLOCK_RXKAD_STATS return RXKADEXPIRED;
  	}
  	preSeq = sconn->preSeq;
      } else {			/* client connection */
--- 341,358 ----
  	if (sconn && sconn->authenticated
  	    && (osi_Time() < sconn->expirationTime)) {
  	    level = sconn->level;
! 	    LOCK_RXKAD_STATS;
! 	    rxkad_stats.checkPackets[rxkad_StatIndex(rxkad_server, level)]++;
! 	    UNLOCK_RXKAD_STATS;
! 	    sconn->stats.packetsReceived++;
  	    sconn->stats.bytesReceived += len;
  	    schedule = (fc_KeySchedule *) sconn->keysched;
  	    ivec = (fc_InitializationVector *) sconn->ivec;
  	} else {
! 	    LOCK_RXKAD_STATS;
! 	    rxkad_stats.expired++;
! 	    UNLOCK_RXKAD_STATS;
! 	    return RXKADEXPIRED;
  	}
  	preSeq = sconn->preSeq;
      } else {			/* client connection */
***************
*** 354,362 ****
  	if (!(tcp->type & rxkad_client))
  	    return RXKADINCONSISTENCY;
  	level = tcp->level;
! 	LOCK_RXKAD_STATS rxkad_stats.
! 	    checkPackets[rxkad_StatIndex(rxkad_client, level)]++;
! 	UNLOCK_RXKAD_STATS cconn->stats.packetsReceived++;
  	cconn->stats.bytesReceived += len;
  	preSeq = cconn->preSeq;
  	schedule = (fc_KeySchedule *) tcp->keysched;
--- 366,375 ----
  	if (!(tcp->type & rxkad_client))
  	    return RXKADINCONSISTENCY;
  	level = tcp->level;
! 	LOCK_RXKAD_STATS;
! 	rxkad_stats.checkPackets[rxkad_StatIndex(rxkad_client, level)]++;
! 	UNLOCK_RXKAD_STATS;
! 	cconn->stats.packetsReceived++;
  	cconn->stats.bytesReceived += len;
  	preSeq = cconn->preSeq;
  	schedule = (fc_KeySchedule *) tcp->keysched;
***************
*** 421,435 ****
  	if (sconn && sconn->authenticated
  	    && (osi_Time() < sconn->expirationTime)) {
  	    level = sconn->level;
! 	    LOCK_RXKAD_STATS rxkad_stats.
  		preparePackets[rxkad_StatIndex(rxkad_server, level)]++;
! 	    UNLOCK_RXKAD_STATS sconn->stats.packetsSent++;
  	    sconn->stats.bytesSent += len;
  	    schedule = (fc_KeySchedule *) sconn->keysched;
  	    ivec = (fc_InitializationVector *) sconn->ivec;
  	} else {
! 	    LOCK_RXKAD_STATS rxkad_stats.expired++;	/* this is a pretty unlikely path... */
! 	    UNLOCK_RXKAD_STATS return RXKADEXPIRED;
  	}
  	preSeq = sconn->preSeq;
      } else {			/* client connection */
--- 434,452 ----
  	if (sconn && sconn->authenticated
  	    && (osi_Time() < sconn->expirationTime)) {
  	    level = sconn->level;
! 	    LOCK_RXKAD_STATS;
! 	    rxkad_stats.
  		preparePackets[rxkad_StatIndex(rxkad_server, level)]++;
! 	    UNLOCK_RXKAD_STATS;
! 	    sconn->stats.packetsSent++;
  	    sconn->stats.bytesSent += len;
  	    schedule = (fc_KeySchedule *) sconn->keysched;
  	    ivec = (fc_InitializationVector *) sconn->ivec;
  	} else {
! 	    LOCK_RXKAD_STATS;
! 	    rxkad_stats.expired++;	/* this is a pretty unlikely path... */
! 	    UNLOCK_RXKAD_STATS;
! 	    return RXKADEXPIRED;
  	}
  	preSeq = sconn->preSeq;
      } else {			/* client connection */
***************
*** 440,448 ****
  	if (!(tcp->type & rxkad_client))
  	    return RXKADINCONSISTENCY;
  	level = tcp->level;
! 	LOCK_RXKAD_STATS rxkad_stats.
! 	    preparePackets[rxkad_StatIndex(rxkad_client, level)]++;
! 	UNLOCK_RXKAD_STATS cconn->stats.packetsSent++;
  	cconn->stats.bytesSent += len;
  	preSeq = cconn->preSeq;
  	schedule = (fc_KeySchedule *) tcp->keysched;
--- 457,466 ----
  	if (!(tcp->type & rxkad_client))
  	    return RXKADINCONSISTENCY;
  	level = tcp->level;
! 	LOCK_RXKAD_STATS;
! 	rxkad_stats.preparePackets[rxkad_StatIndex(rxkad_client, level)]++;
! 	UNLOCK_RXKAD_STATS;
! 	cconn->stats.packetsSent++;
  	cconn->stats.bytesSent += len;
  	preSeq = cconn->preSeq;
  	schedule = (fc_KeySchedule *) tcp->keysched;
***************
*** 530,552 ****
  rxkad_level
  rxkad_StringToLevel(char *name)
  {
!   if (strcmp(name, "clear") == 0)
!     return rxkad_clear;
!   if (strcmp(name, "auth") == 0)
!     return rxkad_auth;
!   if (strcmp(name, "crypt") == 0)
!     return rxkad_crypt;
!   return -1;
  }
  
  char *
  rxkad_LevelToString(rxkad_level level)
  {
!   if (level == rxkad_clear) 
!       return "clear";
!   if (level == rxkad_auth) 
!       return "auth";
!   if (level == rxkad_crypt) 
!       return "crypt";
!   return "unknown";
  }
--- 548,570 ----
  rxkad_level
  rxkad_StringToLevel(char *name)
  {
!     if (strcmp(name, "clear") == 0)
! 	return rxkad_clear;
!     if (strcmp(name, "auth") == 0)
! 	return rxkad_auth;
!     if (strcmp(name, "crypt") == 0)
! 	return rxkad_crypt;
!     return -1;
  }
  
  char *
  rxkad_LevelToString(rxkad_level level)
  {
!     if (level == rxkad_clear)
! 	return "clear";
!     if (level == rxkad_auth)
! 	return "auth";
!     if (level == rxkad_crypt)
! 	return "crypt";
!     return "unknown";
  }
Index: openafs/src/rxkad/rxkad_prototypes.h
diff -c openafs/src/rxkad/rxkad_prototypes.h:1.9 openafs/src/rxkad/rxkad_prototypes.h:1.9.2.1
*** openafs/src/rxkad/rxkad_prototypes.h:1.9	Wed Jun 23 10:27:44 2004
--- openafs/src/rxkad/rxkad_prototypes.h	Wed Aug 25 03:09:42 2004
***************
*** 87,105 ****
  							      level, char
  							      *get_key_rock,
  							      int (*get_key)
! 							        (char
! 								 *get_key_rock,
! 								 int kvno,
! 								 struct
! 								 ktc_encryptionKey
! 								 * serverKey),
  							      int (*user_ok)
! 							        (char *name,
! 								 char
! 								 *instance,
! 								 char *cell,
! 								 afs_int32
! 								 kvno));
  extern int rxkad_CheckAuthentication(struct rx_securityClass *aobj,
  				     struct rx_connection *aconn);
  extern int rxkad_CreateChallenge(struct rx_securityClass *aobj,
--- 87,111 ----
  							      level, char
  							      *get_key_rock,
  							      int (*get_key)
! 
! 
! 							       
! 							      (char
! 							       *get_key_rock,
! 							       int kvno,
! 							       struct
! 							       ktc_encryptionKey
! 							       * serverKey),
  							      int (*user_ok)
! 
! 
! 							       
! 							      (char *name,
! 							       char
! 							       *instance,
! 							       char *cell,
! 							       afs_int32
! 							       kvno));
  extern int rxkad_CheckAuthentication(struct rx_securityClass *aobj,
  				     struct rx_connection *aconn);
  extern int rxkad_CreateChallenge(struct rx_securityClass *aobj,
Index: openafs/src/rxkad/rxkad_server.c
diff -c openafs/src/rxkad/rxkad_server.c:1.14 openafs/src/rxkad/rxkad_server.c:1.14.2.1
*** openafs/src/rxkad/rxkad_server.c:1.14	Sat Nov 29 15:23:35 2003
--- openafs/src/rxkad/rxkad_server.c	Wed Aug 25 03:09:42 2004
***************
*** 15,21 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/rxkad_server.c,v 1.14 2003/11/29 20:23:35 jaltman Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
--- 15,21 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/rxkad_server.c,v 1.14.2.1 2004/08/25 07:09:42 shadow Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
***************
*** 59,67 ****
      rxkad_CheckPacket,		/* check data packet */
      rxkad_DestroyConnection,
      rxkad_GetStats,
! 	0, /* spare 1 */
! 	0, /* spare 2 */
! 	0, /* spare 3 */
  };
  extern afs_uint32 rx_MyMaxSendSize;
  
--- 59,67 ----
      rxkad_CheckPacket,		/* check data packet */
      rxkad_DestroyConnection,
      rxkad_GetStats,
!     0,				/* spare 1 */
!     0,				/* spare 2 */
!     0,				/* spare 3 */
  };
  extern afs_uint32 rx_MyMaxSendSize;
  
***************
*** 79,86 ****
  
  #include <assert.h>
  pthread_mutex_t rxkad_random_mutex;
! #define LOCK_RM assert(pthread_mutex_lock(&rxkad_random_mutex)==0);
! #define UNLOCK_RM assert(pthread_mutex_unlock(&rxkad_random_mutex)==0);
  #else
  #define LOCK_RM
  #define UNLOCK_RM
--- 79,86 ----
  
  #include <assert.h>
  pthread_mutex_t rxkad_random_mutex;
! #define LOCK_RM assert(pthread_mutex_lock(&rxkad_random_mutex)==0)
! #define UNLOCK_RM assert(pthread_mutex_unlock(&rxkad_random_mutex)==0)
  #else
  #define LOCK_RM
  #define UNLOCK_RM
***************
*** 92,99 ****
      struct timeval key;
  
      gettimeofday(&key, NULL);
!     LOCK_RM fc_keysched(&key, random_int32_schedule);
! UNLOCK_RM}
  
  static afs_int32
  get_random_int32(void)
--- 92,101 ----
      struct timeval key;
  
      gettimeofday(&key, NULL);
!     LOCK_RM;
!     fc_keysched(&key, random_int32_schedule);
!     UNLOCK_RM;
! }
  
  static afs_int32
  get_random_int32(void)
***************
*** 101,109 ****
      static struct timeval seed;
      afs_int32 rc;
  
!     LOCK_RM fc_ecb_encrypt(&seed, &seed, random_int32_schedule, ENCRYPT);
      rc = seed.tv_sec;
!     UNLOCK_RM return rc;
  }
  
  /* Called with four parameters.  The first is the level of encryption, as
--- 103,113 ----
      static struct timeval seed;
      afs_int32 rc;
  
!     LOCK_RM;
!     fc_ecb_encrypt(&seed, &seed, random_int32_schedule, ENCRYPT);
      rc = seed.tv_sec;
!     UNLOCK_RM;
!     return rc;
  }
  
  /* Called with four parameters.  The first is the level of encryption, as
***************
*** 156,163 ****
      tsp->user_ok = user_ok;	/* to inform server of client id. */
      init_random_int32();
  
!     LOCK_RXKAD_STATS rxkad_stats_serverObjects++;
!     UNLOCK_RXKAD_STATS return tsc;
  }
  
  /* server: called to tell if a connection authenticated properly */
--- 160,169 ----
      tsp->user_ok = user_ok;	/* to inform server of client id. */
      init_random_int32();
  
!     LOCK_RXKAD_STATS;
!     rxkad_stats_serverObjects++;
!     UNLOCK_RXKAD_STATS;
!     return tsc;
  }
  
  /* server: called to tell if a connection authenticated properly */
***************
*** 232,239 ****
      rx_packetwrite(apacket, 0, challengeSize, challenge);
      rx_SetDataSize(apacket, challengeSize);
      sconn->tried = 1;
!     LOCK_RXKAD_STATS rxkad_stats.challengesSent++;
!     UNLOCK_RXKAD_STATS return 0;
  }
  
  /* server: process a response to a challenge packet */
--- 238,247 ----
      rx_packetwrite(apacket, 0, challengeSize, challenge);
      rx_SetDataSize(apacket, challengeSize);
      sconn->tried = 1;
!     LOCK_RXKAD_STATS;
!     rxkad_stats.challengesSent++;
!     UNLOCK_RXKAD_STATS;
!     return 0;
  }
  
  /* server: process a response to a challenge packet */
***************
*** 397,407 ****
  	return RXKADLEVELFAIL;
      sconn->level = level;
      rxkad_SetLevel(aconn, sconn->level);
!     LOCK_RXKAD_STATS rxkad_stats.responses[rxkad_LevelIndex(sconn->level)]++;
!     UNLOCK_RXKAD_STATS
! 	/* now compute endpoint-specific info used for computing 16 bit checksum */
! 	rxkad_DeriveXORInfo(aconn, sconn->keysched, sconn->ivec,
! 			    sconn->preSeq);
  
      /* otherwise things are ok */
      sconn->expirationTime = end;
--- 405,415 ----
  	return RXKADLEVELFAIL;
      sconn->level = level;
      rxkad_SetLevel(aconn, sconn->level);
!     LOCK_RXKAD_STATS;
!     rxkad_stats.responses[rxkad_LevelIndex(sconn->level)]++;
!     UNLOCK_RXKAD_STATS;
!     /* now compute endpoint-specific info used for computing 16 bit checksum */
!     rxkad_DeriveXORInfo(aconn, sconn->keysched, sconn->ivec, sconn->preSeq);
  
      /* otherwise things are ok */
      sconn->expirationTime = end;
Index: openafs/src/rxkad/ticket5.c
diff -c openafs/src/rxkad/ticket5.c:1.8 openafs/src/rxkad/ticket5.c:1.8.2.1
*** openafs/src/rxkad/ticket5.c:1.8	Fri Apr  9 01:53:14 2004
--- openafs/src/rxkad/ticket5.c	Wed Aug 25 03:09:42 2004
***************
*** 62,68 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/ticket5.c,v 1.8 2004/04/09 05:53:14 jaltman Exp $");
  
  #if defined(UKERNEL)
  #include "../afs/sysincludes.h"
--- 62,68 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/ticket5.c,v 1.8.2.1 2004/08/25 07:09:42 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "../afs/sysincludes.h"
***************
*** 387,422 ****
  
  static int
  verify_checksum_md4(void *data, size_t len,
!                     void *cksum, size_t cksumsz,
!                     struct ktc_encryptionKey *key)
  {
!       MD4_CTX md4;
!       unsigned char tmp[16];
  
!       MD4_Init(&md4);
!       MD4_Update(&md4, data, len);
!       MD4_Final (tmp, &md4);
! 
!       if (memcmp(tmp, cksum, cksumsz) != 0)
!               return 1;
!       return 0;
  }
  
  static int
  verify_checksum_md5(void *data, size_t len,
!                     void *cksum, size_t cksumsz,
!                     struct ktc_encryptionKey *key)
  {
!       MD5_CTX md5;
!       unsigned char tmp[16];
  
!       MD5_Init(&md5);
!       MD5_Update(&md5, data, len);
!       MD5_Final (tmp, &md5);
! 
!       if (memcmp(tmp, cksum, cksumsz) != 0)
!               return 1;
!       return 0;
  }
  
  static int
--- 387,422 ----
  
  static int
  verify_checksum_md4(void *data, size_t len,
! 		    void *cksum, size_t cksumsz,
! 		    struct ktc_encryptionKey *key)
  {
!     MD4_CTX md4;
!     unsigned char tmp[16];
! 
!     MD4_Init(&md4);
!     MD4_Update(&md4, data, len);
!     MD4_Final(tmp, &md4);
  
!     if (memcmp(tmp, cksum, cksumsz) != 0)
! 	return 1;
!     return 0;
  }
  
  static int
  verify_checksum_md5(void *data, size_t len,
! 		    void *cksum, size_t cksumsz,
! 		    struct ktc_encryptionKey *key)
  {
!     MD5_CTX md5;
!     unsigned char tmp[16];
! 
!     MD5_Init(&md5);
!     MD5_Update(&md5, data, len);
!     MD5_Final(tmp, &md5);
  
!     if (memcmp(tmp, cksum, cksumsz) != 0)
! 	return 1;
!     return 0;
  }
  
  static int
***************
*** 449,455 ****
      des_key_schedule s;
      char cksum[24];
      size_t cksumsz;
!     int ret = 1;	/* failure */
  
      cksum_func = NULL;
  
--- 449,455 ----
      des_key_schedule s;
      char cksum[24];
      size_t cksumsz;
!     int ret = 1;		/* failure */
  
      cksum_func = NULL;
  
Index: openafs/src/rxkad/domestic/crypt_conn.c
diff -c openafs/src/rxkad/domestic/crypt_conn.c:1.11 openafs/src/rxkad/domestic/crypt_conn.c:1.11.2.1
*** openafs/src/rxkad/domestic/crypt_conn.c:1.11	Tue Jul 15 19:16:44 2003
--- openafs/src/rxkad/domestic/crypt_conn.c	Wed Aug 25 03:17:01 2004
***************
*** 19,25 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/domestic/crypt_conn.c,v 1.11 2003/07/15 23:16:44 shadow Exp $");
  
  #ifdef KERNEL
  #include "afs/stds.h"
--- 19,25 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/domestic/crypt_conn.c,v 1.11.2.1 2004/08/25 07:17:01 shadow Exp $");
  
  #ifdef KERNEL
  #include "afs/stds.h"
***************
*** 61,69 ****
  
      obj = rx_SecurityObjectOf(conn);
      tp = (struct rxkad_cprivate *)obj->privateData;
!     LOCK_RXKAD_STATS rxkad_stats.bytesDecrypted[rxkad_TypeIndex(tp->type)] +=
! 	len;
!     UNLOCK_RXKAD_STATS memcpy((void *)xor, (void *)ivec, sizeof(xor));
      for (i = 0; len; i++) {
  	data = rx_data(packet, i, tlen);
  	if (!data || !tlen)
--- 61,70 ----
  
      obj = rx_SecurityObjectOf(conn);
      tp = (struct rxkad_cprivate *)obj->privateData;
!     LOCK_RXKAD_STATS;
!     rxkad_stats.bytesDecrypted[rxkad_TypeIndex(tp->type)] += len;
!     UNLOCK_RXKAD_STATS;
!     memcpy((void *)xor, (void *)ivec, sizeof(xor));
      for (i = 0; len; i++) {
  	data = rx_data(packet, i, tlen);
  	if (!data || !tlen)
***************
*** 96,110 ****
  
      obj = rx_SecurityObjectOf(conn);
      tp = (struct rxkad_cprivate *)obj->privateData;
!     LOCK_RXKAD_STATS rxkad_stats.bytesEncrypted[rxkad_TypeIndex(tp->type)] +=
! 	len;
!     UNLOCK_RXKAD_STATS
! 	/*
! 	 * afs_int32 cksum;
! 	 * cksum = htonl(0);                
! 	 * * Future option to add cksum here, but for now we just put 0
! 	 */
! 	rx_PutInt32(packet, 1 * sizeof(afs_int32), 0);
  
      memcpy((void *)xor, (void *)ivec, sizeof(xor));
      for (i = 0; len; i++) {
--- 97,111 ----
  
      obj = rx_SecurityObjectOf(conn);
      tp = (struct rxkad_cprivate *)obj->privateData;
!     LOCK_RXKAD_STATS;
!     rxkad_stats.bytesEncrypted[rxkad_TypeIndex(tp->type)] += len;
!     UNLOCK_RXKAD_STATS;
!     /*
!      * afs_int32 cksum;
!      * cksum = htonl(0);                
!      * * Future option to add cksum here, but for now we just put 0
!      */
!     rx_PutInt32(packet, 1 * sizeof(afs_int32), 0);
  
      memcpy((void *)xor, (void *)ivec, sizeof(xor));
      for (i = 0; len; i++) {
Index: openafs/src/rxkad/domestic/fcrypt.c
diff -c openafs/src/rxkad/domestic/fcrypt.c:1.11 openafs/src/rxkad/domestic/fcrypt.c:1.11.2.1
*** openafs/src/rxkad/domestic/fcrypt.c:1.11	Tue Jul 15 19:16:44 2003
--- openafs/src/rxkad/domestic/fcrypt.c	Wed Aug 25 03:17:01 2004
***************
*** 20,26 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/domestic/fcrypt.c,v 1.11 2003/07/15 23:16:44 shadow Exp $");
  
  #define DEBUG 0
  #ifdef KERNEL
--- 20,26 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/domestic/fcrypt.c,v 1.11.2.1 2004/08/25 07:17:01 shadow Exp $");
  
  #define DEBUG 0
  #ifdef KERNEL
***************
*** 102,109 ****
  	kword[1] = (kword[1] >> 11) | (temp << (56 - 32 - 11));
  	schedule[i] = kword[0];
      }
!     LOCK_RXKAD_STATS rxkad_stats.fc_key_scheds++;
!     UNLOCK_RXKAD_STATS return 0;
  }
  
  /* IN int encrypt; * 0 ==> decrypt, else encrypt */
--- 102,111 ----
  	kword[1] = (kword[1] >> 11) | (temp << (56 - 32 - 11));
  	schedule[i] = kword[0];
      }
!     LOCK_RXKAD_STATS;
!     rxkad_stats.fc_key_scheds++;
!     UNLOCK_RXKAD_STATS;
!     return 0;
  }
  
  /* IN int encrypt; * 0 ==> decrypt, else encrypt */
***************
*** 138,145 ****
  #endif
  
      if (encrypt) {
! 	LOCK_RXKAD_STATS rxkad_stats.fc_encrypts[ENCRYPT]++;
! 	UNLOCK_RXKAD_STATS for (i = 0; i < (ROUNDS / 2); i++) {
  	    S = *schedule++ ^ R;	/* xor R with key bits from schedule */
  	    Pchar[Byte2] = sbox0[Schar[Byte0]];	/* do 8-bit S Box subst. */
  	    Pchar[Byte3] = sbox1[Schar[Byte1]];	/* and permute the result */
--- 140,149 ----
  #endif
  
      if (encrypt) {
! 	LOCK_RXKAD_STATS;
! 	rxkad_stats.fc_encrypts[ENCRYPT]++;
! 	UNLOCK_RXKAD_STATS;
! 	for (i = 0; i < (ROUNDS / 2); i++) {
  	    S = *schedule++ ^ R;	/* xor R with key bits from schedule */
  	    Pchar[Byte2] = sbox0[Schar[Byte0]];	/* do 8-bit S Box subst. */
  	    Pchar[Byte3] = sbox1[Schar[Byte1]];	/* and permute the result */
***************
*** 156,163 ****
  	    R ^= P;
  	}
      } else {
! 	LOCK_RXKAD_STATS rxkad_stats.fc_encrypts[DECRYPT]++;
! 	UNLOCK_RXKAD_STATS schedule = &schedule[ROUNDS - 1];	/* start at end of key schedule */
  	for (i = 0; i < (ROUNDS / 2); i++) {
  	    S = *schedule-- ^ L;	/* xor R with key bits from schedule */
  	    Pchar[Byte2] = sbox0[Schar[Byte0]];	/* do 8-bit S Box subst. and */
--- 160,169 ----
  	    R ^= P;
  	}
      } else {
! 	LOCK_RXKAD_STATS;
! 	rxkad_stats.fc_encrypts[DECRYPT]++;
! 	UNLOCK_RXKAD_STATS;
! 	schedule = &schedule[ROUNDS - 1];	/* start at end of key schedule */
  	for (i = 0; i < (ROUNDS / 2); i++) {
  	    S = *schedule-- ^ L;	/* xor R with key bits from schedule */
  	    Pchar[Byte2] = sbox0[Schar[Byte0]];	/* do 8-bit S Box subst. and */
Index: openafs/src/shlibafsauthent/mapfile
diff -c openafs/src/shlibafsauthent/mapfile:1.2 openafs/src/shlibafsauthent/mapfile:1.2.2.1
*** openafs/src/shlibafsauthent/mapfile:1.2	Sat Nov  2 12:25:20 2002
--- openafs/src/shlibafsauthent/mapfile	Wed Aug 25 02:59:34 2004
***************
*** 77,82 ****
--- 77,84 ----
  	afs_krb_get_lrealm;
  	pr_NameToId;
  	pr_IdToName;
+ 	pr_ListMembers;
+ 	pr_End;
  	pr_SNameToId;
  	afs_get_pag_from_groups;
  	setpag;
Index: openafs/src/ubik/beacon.c
diff -c openafs/src/ubik/beacon.c:1.19 openafs/src/ubik/beacon.c:1.19.2.2
*** openafs/src/ubik/beacon.c:1.19	Sat Jan 10 11:59:35 2004
--- openafs/src/ubik/beacon.c	Wed Aug 25 03:11:03 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/beacon.c,v 1.19 2004/01/10 16:59:35 zacheiss Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/beacon.c,v 1.19.2.2 2004/08/25 07:11:03 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
***************
*** 494,501 ****
      }
  
  #ifdef AFS_NT40_ENV
! 	/* get all my interface addresses in net byte order */
! 	count = rx_getAllAddr(myAddr, UBIK_MAX_INTERFACE_ADDR);
  #else
      if (AFSDIR_SERVER_NETRESTRICT_FILEPATH || AFSDIR_SERVER_NETINFO_FILEPATH) {
  	/*
--- 494,501 ----
      }
  
  #ifdef AFS_NT40_ENV
!     /* get all my interface addresses in net byte order */
!     count = rx_getAllAddr(myAddr, UBIK_MAX_INTERFACE_ADDR);
  #else
      if (AFSDIR_SERVER_NETRESTRICT_FILEPATH || AFSDIR_SERVER_NETINFO_FILEPATH) {
  	/*
***************
*** 570,576 ****
  	for (i = 0; i < totalServers; i++) {
  	    if (info)
  		tmpAddr =
! 		    ntohl((afs_uint32) info->hostAddr[i].sin_addr.s_addr);
  	    else
  		tmpAddr = aservers[i];
  	    if (myAddr[j] == tmpAddr) {
--- 570,576 ----
  	for (i = 0; i < totalServers; i++) {
  	    if (info)
  		tmpAddr =
! 		    (afs_uint32) info->hostAddr[i].sin_addr.s_addr;
  	    else
  		tmpAddr = aservers[i];
  	    if (myAddr[j] == tmpAddr) {
Index: openafs/src/ubik/remote.c
diff -c openafs/src/ubik/remote.c:1.12 openafs/src/ubik/remote.c:1.12.2.1
*** openafs/src/ubik/remote.c:1.12	Sat Sep 27 02:23:30 2003
--- openafs/src/ubik/remote.c	Wed Aug 25 03:09:43 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/remote.c,v 1.12 2003/09/27 06:23:30 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/remote.c,v 1.12.2.1 2004/08/25 07:09:43 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
***************
*** 537,543 ****
      (*dbase->truncate) (dbase, file, 0);	/* truncate first */
      tversion.epoch = 0;		/* start off by labelling in-transit db as invalid */
      tversion.counter = 0;
!     (*dbase->setlabel) (dbase, file, &tversion);/* setlabel does sync */
      memcpy(&ubik_dbase->version, &tversion, sizeof(struct ubik_version));
      while (length > 0) {
  	tlen = (length > sizeof(tbuffer) ? sizeof(tbuffer) : length);
--- 537,543 ----
      (*dbase->truncate) (dbase, file, 0);	/* truncate first */
      tversion.epoch = 0;		/* start off by labelling in-transit db as invalid */
      tversion.counter = 0;
!     (*dbase->setlabel) (dbase, file, &tversion);	/* setlabel does sync */
      memcpy(&ubik_dbase->version, &tversion, sizeof(struct ubik_version));
      while (length > 0) {
  	tlen = (length > sizeof(tbuffer) ? sizeof(tbuffer) : length);
Index: openafs/src/ubik/ubik.p.h
diff -c openafs/src/ubik/ubik.p.h:1.11 openafs/src/ubik/ubik.p.h:1.11.2.1
*** openafs/src/ubik/ubik.p.h:1.11	Sun Dec  7 17:49:38 2003
--- openafs/src/ubik/ubik.p.h	Wed Aug 25 03:09:43 2004
***************
*** 87,94 ****
  };
  
  #ifdef AFS_PTHREAD_ENV
! #define LOCK_UBIK_CLIENT(client) assert(pthread_mutex_lock(&client->cm)==0);
! #define UNLOCK_UBIK_CLIENT(client) assert(pthread_mutex_unlock(&client->cm)==0);
  #else
  #define LOCK_UBIK_CLIENT(client)
  #define UNLOCK_UBIK_CLIENT(client)
--- 87,94 ----
  };
  
  #ifdef AFS_PTHREAD_ENV
! #define LOCK_UBIK_CLIENT(client) assert(pthread_mutex_lock(&client->cm)==0)
! #define UNLOCK_UBIK_CLIENT(client) assert(pthread_mutex_unlock(&client->cm)==0)
  #else
  #define LOCK_UBIK_CLIENT(client)
  #define UNLOCK_UBIK_CLIENT(client)
***************
*** 355,361 ****
  extern afs_int32 ubik_ClientDestroy(struct ubik_client *aclient);
  
  /* ubik.c */
! extern int ubik_BeginTrans(register struct ubik_dbase *dbase, afs_int32 transMode, struct ubik_trans **transPtr);
  extern int ubik_EndTrans(register struct ubik_trans *transPtr);
  
  #endif /* UBIK_H */
--- 355,362 ----
  extern afs_int32 ubik_ClientDestroy(struct ubik_client *aclient);
  
  /* ubik.c */
! extern int ubik_BeginTrans(register struct ubik_dbase *dbase,
! 			   afs_int32 transMode, struct ubik_trans **transPtr);
  extern int ubik_EndTrans(register struct ubik_trans *transPtr);
  
  #endif /* UBIK_H */
Index: openafs/src/ubik/ubikclient.c
diff -c openafs/src/ubik/ubikclient.c:1.8 openafs/src/ubik/ubikclient.c:1.8.2.1
*** openafs/src/ubik/ubikclient.c:1.8	Tue Jul 15 19:17:05 2003
--- openafs/src/ubik/ubikclient.c	Wed Aug 25 03:09:43 2004
***************
*** 15,21 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/ubikclient.c,v 1.8 2003/07/15 23:17:05 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "afs/sysincludes.h"
--- 15,21 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/ubikclient.c,v 1.8.2.1 2004/08/25 07:09:43 shadow Exp $");
  
  #if defined(UKERNEL)
  #include "afs/sysincludes.h"
***************
*** 72,85 ****
  	    if (*tp == '-')
  		break;		/* done */
  	    /* otherwise this is a new host name */
! 	    LOCK_GLOBAL_MUTEX th = gethostbyname(tp);
  	    if (!th) {
! 		UNLOCK_GLOBAL_MUTEX return UBADHOST;
  	    }
  	    memmove((void *)&temp, (const void *)th->h_addr,
  		    sizeof(afs_int32));
! 	    UNLOCK_GLOBAL_MUTEX if (counter++ >= MAXSERVERS)
! 		  return UNHOSTS;
  	    *aothers++ = temp;
  	} else {
  	    /* haven't seen a -server yet */
--- 72,88 ----
  	    if (*tp == '-')
  		break;		/* done */
  	    /* otherwise this is a new host name */
! 	    LOCK_GLOBAL_MUTEX;
! 	    th = gethostbyname(tp);
  	    if (!th) {
! 		UNLOCK_GLOBAL_MUTEX;
! 		return UBADHOST;
  	    }
  	    memmove((void *)&temp, (const void *)th->h_addr,
  		    sizeof(afs_int32));
! 	    UNLOCK_GLOBAL_MUTEX;
! 	    if (counter++ >= MAXSERVERS)
! 		return UNHOSTS;
  	    *aothers++ = temp;
  	} else {
  	    /* haven't seen a -server yet */
***************
*** 205,215 ****
      initialize_U_error_table();
  
      if (*aclient) {		/* the application is doing a re-initialization */
! 	LOCK_UBIK_CLIENT((*aclient))
! 	    /* this is an important defensive check */
! 	    if (!((*aclient)->initializationState)) {
! 	    UNLOCK_UBIK_CLIENT((*aclient))
! 		return UREINITIALIZE;
  	}
  
  	/* release all existing connections */
--- 208,218 ----
      initialize_U_error_table();
  
      if (*aclient) {		/* the application is doing a re-initialization */
! 	LOCK_UBIK_CLIENT((*aclient));
! 	/* this is an important defensive check */
! 	if (!((*aclient)->initializationState)) {
! 	    UNLOCK_UBIK_CLIENT((*aclient));
! 	    return UREINITIALIZE;
  	}
  
  	/* release all existing connections */
***************
*** 223,231 ****
  	    rx_DestroyConnection(rxConn);
  #endif
  	}
! 	UNLOCK_UBIK_CLIENT((*aclient))
  #ifdef AFS_PTHREAD_ENV
! 	    if (pthread_mutex_destroy(&((*aclient)->cm)))
  	    return UMUTEXDESTROY;
  #endif
      } else {
--- 226,234 ----
  	    rx_DestroyConnection(rxConn);
  #endif
  	}
! 	UNLOCK_UBIK_CLIENT((*aclient));
  #ifdef AFS_PTHREAD_ENV
! 	if (pthread_mutex_destroy(&((*aclient)->cm)))
  	    return UMUTEXDESTROY;
  #endif
      } else {
***************
*** 335,342 ****
  pthread_mutex_t ubik_client_mutex;
  #define LOCK_UCLNT_CACHE \
      assert(pthread_once(&ubik_client_once, ubik_client_init_mutex) == 0 && \
! 	   pthread_mutex_lock(&ubik_client_mutex)==0);
! #define UNLOCK_UCLNT_CACHE assert(pthread_mutex_unlock(&ubik_client_mutex)==0);
  
  void
  ubik_client_init_mutex()
--- 338,345 ----
  pthread_mutex_t ubik_client_mutex;
  #define LOCK_UCLNT_CACHE \
      assert(pthread_once(&ubik_client_once, ubik_client_init_mutex) == 0 && \
! 	   pthread_mutex_lock(&ubik_client_mutex)==0)
! #define UNLOCK_UCLNT_CACHE assert(pthread_mutex_unlock(&ubik_client_mutex)==0)
  
  void
  ubik_client_init_mutex()
***************
*** 397,414 ****
      rcode = UNOSERVERS;
      chaseCount = inlist = needsync = 0;
  
!     LOCK_UCLNT_CACHE for (j = 0; ((j < SYNCCOUNT) && calls_needsync[j]); j++) {
  	if (calls_needsync[j] == (int *)aproc) {
  	    inlist = needsync = 1;
  	    break;
  	}
      }
!     UNLOCK_UCLNT_CACHE
! 	/* 
! 	 * First  pass, we try all servers that are up.
! 	 * Second pass, we try all servers.
! 	 */
! 	for (pass = 0; pass < 2; pass++) {	/*p */
  	/* For each entry in our servers list */
  	for (count = 0;; count++) {	/*s */
  
--- 400,418 ----
      rcode = UNOSERVERS;
      chaseCount = inlist = needsync = 0;
  
!     LOCK_UCLNT_CACHE;
!     for (j = 0; ((j < SYNCCOUNT) && calls_needsync[j]); j++) {
  	if (calls_needsync[j] == (int *)aproc) {
  	    inlist = needsync = 1;
  	    break;
  	}
      }
!     UNLOCK_UCLNT_CACHE;
!     /* 
!      * First  pass, we try all servers that are up.
!      * Second pass, we try all servers.
!      */
!     for (pass = 0; pass < 2; pass++) {	/*p */
  	/* For each entry in our servers list */
  	for (count = 0;; count++) {	/*s */
  
***************
*** 494,503 ****
    done:
      if (needsync) {
  	if (!inlist) {		/* Remember proc call that needs sync site */
! 	    LOCK_UCLNT_CACHE calls_needsync[synccount % SYNCCOUNT] =
! 		(int *)aproc;
  	    synccount++;
! 	    UNLOCK_UCLNT_CACHE inlist = 1;
  	}
  	if (!rcode) {		/* Remember the sync site - cmd successful */
  	    rxp = rx_PeerOf(aclient->conns[count]);
--- 498,508 ----
    done:
      if (needsync) {
  	if (!inlist) {		/* Remember proc call that needs sync site */
! 	    LOCK_UCLNT_CACHE;
! 	    calls_needsync[synccount % SYNCCOUNT] = (int *)aproc;
  	    synccount++;
! 	    UNLOCK_UCLNT_CACHE;
! 	    inlist = 1;
  	}
  	if (!rcode) {		/* Remember the sync site - cmd successful */
  	    rxp = rx_PeerOf(aclient->conns[count]);
***************
*** 605,611 ****
      short origLevel;
  
      if (needlock) {
! 	LOCK_UBIK_CLIENT(aclient)
      }
      origLevel = aclient->initializationState;
  
--- 610,616 ----
      short origLevel;
  
      if (needlock) {
! 	LOCK_UBIK_CLIENT(aclient);
      }
      origLevel = aclient->initializationState;
  
***************
*** 616,622 ****
  	tc = aclient->conns[*apos];
  	if (!tc) {
  	    if (needlock) {
! 		UNLOCK_UBIK_CLIENT(aclient)
  	    }
  	    return UNOSERVERS;
  	}
--- 621,627 ----
  	tc = aclient->conns[*apos];
  	if (!tc) {
  	    if (needlock) {
! 		UNLOCK_UBIK_CLIENT(aclient);
  	    }
  	    return UNOSERVERS;
  	}
***************
*** 634,640 ****
      }
      if (*apos >= MAXSERVERS) {
  	if (needlock) {
! 	    UNLOCK_UBIK_CLIENT(aclient)
  	}
  	return UNOSERVERS;
      }
--- 639,645 ----
      }
      if (*apos >= MAXSERVERS) {
  	if (needlock) {
! 	    UNLOCK_UBIK_CLIENT(aclient);
  	}
  	return UNOSERVERS;
      }
***************
*** 644,650 ****
  		  p14, p15, p16);
      if (aclient->initializationState != origLevel) {
  	if (needlock) {
! 	    UNLOCK_UBIK_CLIENT(aclient)
  	}
  	return code;		/* somebody did a ubik_ClientInit */
      }
--- 649,655 ----
  		  p14, p15, p16);
      if (aclient->initializationState != origLevel) {
  	if (needlock) {
! 	    UNLOCK_UBIK_CLIENT(aclient);
  	}
  	return code;		/* somebody did a ubik_ClientInit */
      }
***************
*** 659,665 ****
  
      (*apos)++;
      if (needlock) {
! 	UNLOCK_UBIK_CLIENT(aclient)
      }
      return code;
  }
--- 664,670 ----
  
      (*apos)++;
      if (needlock) {
! 	UNLOCK_UBIK_CLIENT(aclient);
      }
      return code;
  }
***************
*** 698,704 ****
      int stepBack;
      short origLevel;
  
!     LOCK_UBIK_CLIENT(aclient)
    restart:
      rcode = UNOSERVERS;
      origLevel = aclient->initializationState;
--- 703,709 ----
      int stepBack;
      short origLevel;
  
!     LOCK_UBIK_CLIENT(aclient);
    restart:
      rcode = UNOSERVERS;
      origLevel = aclient->initializationState;
***************
*** 732,744 ****
  		    }
  		}
  	    } else if ((code >= 0) && (code != UNOQUORUM)) {
! 		UNLOCK_UBIK_CLIENT(aclient)
! 		    return code;	/* success or global error condition */
  	    }
  	}
      }
!     UNLOCK_UBIK_CLIENT(aclient)
! 	return rcode;
  }
  
  /* 
--- 737,749 ----
  		    }
  		}
  	    } else if ((code >= 0) && (code != UNOQUORUM)) {
! 		UNLOCK_UBIK_CLIENT(aclient);
! 		return code;	/* success or global error condition */
  	    }
  	}
      }
!     UNLOCK_UBIK_CLIENT(aclient);
!     return rcode;
  }
  
  /* 
Index: openafs/src/util/pthread_glock.h
diff -c openafs/src/util/pthread_glock.h:1.3 openafs/src/util/pthread_glock.h:1.3.2.1
*** openafs/src/util/pthread_glock.h:1.3	Tue Jul 15 19:17:16 2003
--- openafs/src/util/pthread_glock.h	Wed Aug 25 03:09:43 2004
***************
*** 35,44 ****
  extern int pthread_recursive_mutex_unlock(pthread_recursive_mutex_p);
  
  #define LOCK_GLOBAL_MUTEX \
!     assert(pthread_recursive_mutex_lock(&grmutex)==0);
  
  #define UNLOCK_GLOBAL_MUTEX \
!     assert(pthread_recursive_mutex_unlock(&grmutex)==0);
  
  #else
  
--- 35,44 ----
  extern int pthread_recursive_mutex_unlock(pthread_recursive_mutex_p);
  
  #define LOCK_GLOBAL_MUTEX \
!     assert(pthread_recursive_mutex_lock(&grmutex)==0)
  
  #define UNLOCK_GLOBAL_MUTEX \
!     assert(pthread_recursive_mutex_unlock(&grmutex)==0)
  
  #else
  
Index: openafs/src/vfsck/setup.c
diff -c openafs/src/vfsck/setup.c:1.10 openafs/src/vfsck/setup.c:1.10.2.1
*** openafs/src/vfsck/setup.c:1.10	Thu Jun 24 13:38:39 2004
--- openafs/src/vfsck/setup.c	Wed Aug 25 03:22:22 2004
***************
*** 19,25 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vfsck/setup.c,v 1.10 2004/06/24 17:38:39 shadow Exp $");
  
  #include <stdio.h>
  #define VICE
--- 19,25 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vfsck/setup.c,v 1.10.2.1 2004/08/25 07:22:22 shadow Exp $");
  
  #include <stdio.h>
  #define VICE
***************
*** 380,386 ****
  	return (-1);
  #endif
  #ifdef AFS_NEWCG_ENV
! # ifndef AFS_SUN510_ENV
      if (sblock.fs_interleave < 1) {
  	pwarn("IMPOSSIBLE INTERLEAVE=%d IN SUPERBLOCK", sblock.fs_interleave);
  	sblock.fs_interleave = 1;
--- 380,386 ----
  	return (-1);
  #endif
  #ifdef AFS_NEWCG_ENV
! # ifndef AFS_SUN59_ENV
      if (sblock.fs_interleave < 1) {
  	pwarn("IMPOSSIBLE INTERLEAVE=%d IN SUPERBLOCK", sblock.fs_interleave);
  	sblock.fs_interleave = 1;
***************
*** 391,397 ****
  	    dirty(&asblk);
  	}
      }
! # endif /* AFS_SUN510_ENV */
  #endif /* AFS_NEWCG_ENV */
  #ifdef AFS_NEWCG_ENV
      if (sblock.fs_npsect < sblock.fs_nsect) {
--- 391,397 ----
  	    dirty(&asblk);
  	}
      }
! # endif /* AFS_SUN59_ENV */
  #endif /* AFS_NEWCG_ENV */
  #ifdef AFS_NEWCG_ENV
      if (sblock.fs_npsect < sblock.fs_nsect) {
***************
*** 473,479 ****
  #if	defined(AFS_SUN_ENV) && !defined(AFS_SUN3_ENV)
  #ifdef	AFS_SUN5_ENV
  	    sblock.fs_npsect = 0;
! # ifndef AFS_SUN510_ENV
  	    sblock.fs_interleave = 0;
  # endif
  	    sblock.fs_state = FSOKAY - sblock.fs_time;	/* make mountable */
--- 473,479 ----
  #if	defined(AFS_SUN_ENV) && !defined(AFS_SUN3_ENV)
  #ifdef	AFS_SUN5_ENV
  	    sblock.fs_npsect = 0;
! # ifndef AFS_SUN59_ENV
  	    sblock.fs_interleave = 0;
  # endif
  	    sblock.fs_state = FSOKAY - sblock.fs_time;	/* make mountable */
***************
*** 743,749 ****
       */
      altsblock.fs_fsbtodb = sblock.fs_fsbtodb;
  #ifdef AFS_NEWCG_ENV
! # ifndef AFS_SUN510_ENV
      altsblock.fs_interleave = sblock.fs_interleave;
  # endif
      altsblock.fs_npsect = sblock.fs_npsect;
--- 743,749 ----
       */
      altsblock.fs_fsbtodb = sblock.fs_fsbtodb;
  #ifdef AFS_NEWCG_ENV
! # ifndef AFS_SUN59_ENV
      altsblock.fs_interleave = sblock.fs_interleave;
  # endif
      altsblock.fs_npsect = sblock.fs_npsect;
Index: openafs/src/vol/clone.c
diff -c openafs/src/vol/clone.c:1.17 openafs/src/vol/clone.c:1.17.2.1
*** openafs/src/vol/clone.c:1.17	Fri Aug  8 16:40:45 2003
--- openafs/src/vol/clone.c	Wed Aug 25 03:14:19 2004
***************
*** 19,25 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/clone.c,v 1.17 2003/08/08 20:40:45 shadow Exp $");
  
  #include <sys/types.h>
  #include <stdio.h>
--- 19,25 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/clone.c,v 1.17.2.1 2004/08/25 07:14:19 shadow Exp $");
  
  #include <sys/types.h>
  #include <stdio.h>
***************
*** 403,410 ****
  void
  CloneVolume(Error * error, Volume * original, Volume * new, Volume * old)
  {
!     VOL_LOCK CloneVolume_r(error, original, new, old);
! VOL_UNLOCK}
  
  void
  CloneVolume_r(Error * rerror, Volume * original, Volume * new, Volume * old)
--- 403,412 ----
  void
  CloneVolume(Error * error, Volume * original, Volume * new, Volume * old)
  {
!     VOL_LOCK;
!     CloneVolume_r(error, original, new, old);
!     VOL_UNLOCK;
! }
  
  void
  CloneVolume_r(Error * rerror, Volume * original, Volume * new, Volume * old)
Index: openafs/src/vol/fssync.c
diff -c openafs/src/vol/fssync.c:1.26 openafs/src/vol/fssync.c:1.26.2.1
*** openafs/src/vol/fssync.c:1.26	Wed Jul 28 17:49:18 2004
--- openafs/src/vol/fssync.c	Wed Aug 25 03:14:19 2004
***************
*** 50,56 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/fssync.c,v 1.26 2004/07/28 21:49:18 shadow Exp $");
  
  #include <sys/types.h>
  #include <stdio.h>
--- 50,56 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/fssync.c,v 1.26.2.1 2004/08/25 07:14:19 shadow Exp $");
  
  #include <sys/types.h>
  #include <stdio.h>
***************
*** 105,111 ****
  
  #define MAXHANDLERS	4	/* Up to 4 clients; must be at least 2, so that
  				 * move = dump+restore can run on single server */
! #define MAXOFFLINEVOLUMES 128   /* This needs to be as big as the maximum
  				 * number that would be offline for 1 operation.
  				 * Current winner is salvage, which needs all
  				 * cloned read-only copies offline when salvaging
--- 105,111 ----
  
  #define MAXHANDLERS	4	/* Up to 4 clients; must be at least 2, so that
  				 * move = dump+restore can run on single server */
! #define MAXOFFLINEVOLUMES 128	/* This needs to be as big as the maximum
  				 * number that would be offline for 1 operation.
  				 * Current winner is salvage, which needs all
  				 * cloned read-only copies offline when salvaging
***************
*** 214,220 ****
      else
  	command.partName[0] = 0;
      assert(FS_sd != -1);
!     VFSYNC_LOCK
  #ifdef AFS_NT40_ENV
      if (send(FS_sd, (char *)&command, sizeof(command), 0) != sizeof(command)) {
  	printf("FSYNC_askfs: write to file server failed\n");
--- 214,220 ----
      else
  	command.partName[0] = 0;
      assert(FS_sd != -1);
!     VFSYNC_LOCK;
  #ifdef AFS_NT40_ENV
      if (send(FS_sd, (char *)&command, sizeof(command), 0) != sizeof(command)) {
  	printf("FSYNC_askfs: write to file server failed\n");
***************
*** 247,255 ****
  	    ("FSYNC_askfs: negative response from file server; volume %u, command %d\n",
  	     command.volume, (int)command.command);
      }
!  done:
!     VFSYNC_UNLOCK
! 
      return response;
  }
  
--- 247,254 ----
  	    ("FSYNC_askfs: negative response from file server; volume %u, command %d\n",
  	     command.volume, (int)command.command);
      }
!   done:
!     VFSYNC_UNLOCK;
      return response;
  }
  
***************
*** 406,412 ****
  	FSYNC_Drop(fd);
  	return;
      }
!     VATTACH_LOCK VOL_LOCK volumes = OfflineVolumes[FindHandler(fd)];
      for (v = 0, i = 0; i < MAXOFFLINEVOLUMES; i++) {
  	if (volumes[i].volumeID == command.volume
  	    && strcmp(volumes[i].partName, command.partName) == 0) {
--- 405,413 ----
  	FSYNC_Drop(fd);
  	return;
      }
!     VATTACH_LOCK;
!     VOL_LOCK;
!     volumes = OfflineVolumes[FindHandler(fd)];
      for (v = 0, i = 0; i < MAXOFFLINEVOLUMES; i++) {
  	if (volumes[i].volumeID == command.volume
  	    && strcmp(volumes[i].partName, command.partName) == 0) {
***************
*** 568,595 ****
  	if (V_BreakVolumeCallbacks) {
  	    Log("fssync: volume %u moved to %x; breaking all call backs\n",
  		command.volume, command.reason);
! 	    VOL_UNLOCK VATTACH_UNLOCK(*V_BreakVolumeCallbacks) (command.
! 								volume);
! 	VATTACH_LOCK VOL_LOCK}
  	break;
      case FSYNC_RESTOREVOLUME:
  	/* if the volume is being restored, break all callbacks on it */
  	if (V_BreakVolumeCallbacks) {
  	    Log("fssync: volume %u restored; breaking all call backs\n",
  		command.volume);
! 	    VOL_UNLOCK VATTACH_UNLOCK(*V_BreakVolumeCallbacks) (command.
! 								volume);
! 	VATTACH_LOCK VOL_LOCK}
  	break;
      default:
  	rc = FSYNC_DENIED;
  	break;
      }
!     VOL_UNLOCK VATTACH_UNLOCK
  #ifdef AFS_NT40_ENV
!       (void) send(fd, &rc, 1, 0);
  #else
!       (void) write(fd, &rc, 1);
  #endif
  }
  
--- 569,603 ----
  	if (V_BreakVolumeCallbacks) {
  	    Log("fssync: volume %u moved to %x; breaking all call backs\n",
  		command.volume, command.reason);
! 	    VOL_UNLOCK;
! 	    VATTACH_UNLOCK;
! 	    (*V_BreakVolumeCallbacks) (command.volume);
! 	    VATTACH_LOCK;
! 	    VOL_LOCK;
! 	}
  	break;
      case FSYNC_RESTOREVOLUME:
  	/* if the volume is being restored, break all callbacks on it */
  	if (V_BreakVolumeCallbacks) {
  	    Log("fssync: volume %u restored; breaking all call backs\n",
  		command.volume);
! 	    VOL_UNLOCK;
! 	    VATTACH_UNLOCK;
! 	    (*V_BreakVolumeCallbacks) (command.volume);
! 	    VATTACH_LOCK;
! 	    VOL_LOCK;
! 	}
  	break;
      default:
  	rc = FSYNC_DENIED;
  	break;
      }
!     VOL_UNLOCK;
!     VATTACH_UNLOCK;
  #ifdef AFS_NT40_ENV
!     (void)send(fd, &rc, 1, 0);
  #else
!     (void)write(fd, &rc, 1);
  #endif
  }
  
***************
*** 601,607 ****
      Error error;
      char tvolName[VMAXPATHLEN];
  
!     VATTACH_LOCK VOL_LOCK p = OfflineVolumes[FindHandler(fd)];
      for (i = 0; i < MAXOFFLINEVOLUMES; i++) {
  	if (p[i].volumeID) {
  	    Volume *vp;
--- 609,617 ----
      Error error;
      char tvolName[VMAXPATHLEN];
  
!     VATTACH_LOCK;
!     VOL_LOCK;
!     p = OfflineVolumes[FindHandler(fd)];
      for (i = 0; i < MAXOFFLINEVOLUMES; i++) {
  	if (p[i].volumeID) {
  	    Volume *vp;
***************
*** 615,621 ****
  	    p[i].volumeID = 0;
  	}
      }
!     VOL_UNLOCK VATTACH_UNLOCK RemoveHandler(fd);
  #ifdef AFS_NT40_ENV
      closesocket(fd);
  #else
--- 625,633 ----
  	    p[i].volumeID = 0;
  	}
      }
!     VOL_UNLOCK;
!     VATTACH_UNLOCK;
!     RemoveHandler(fd);
  #ifdef AFS_NT40_ENV
      closesocket(fd);
  #else
Index: openafs/src/vol/fstab.c
diff -c openafs/src/vol/fstab.c:1.3 openafs/src/vol/fstab.c:1.3.2.1
*** openafs/src/vol/fstab.c:1.3	Thu Apr  1 17:26:24 2004
--- openafs/src/vol/fstab.c	Wed Aug 25 03:14:19 2004
***************
*** 85,181 ****
  static
  fstabscan()
  {
! 	if(_fs_count <= 0)
! 		return(0);
! 	_fs_fstab.fs_spec = _fs_ptr->f_mntfromname;
! 	_fs_fstab.fs_file = _fs_ptr->f_mntonname;
! 	_fs_fstab.fs_vfstype = _fs_ptr->f_fstypename;
! 	_fs_fstab.fs_mntops = _fs_ptr->f_fstypename;	// no mount options given
! 	_fs_fstab.fs_type = (_fs_ptr->f_flags & MNT_RDONLY) ? FSTAB_RO : FSTAB_RW;
! 	_fs_fstab.fs_freq = 0;
! 	_fs_fstab.fs_passno = 0;
! 
! 	_fs_ptr++;
! 	_fs_count--;
! 	return(1);
  }
  
  struct fstab *
  getfsent()
  {
! 	if (!_fs_buf && !setfsent() || !fstabscan())
! 		return((struct fstab *)NULL);
! 	return(&_fs_fstab);
  }
  
  struct fstab *
  getfsspec(name)
! 	register const char *name;
  {
! 	if (setfsent())
! 		while (fstabscan())
! 			if (!strcmp(_fs_fstab.fs_spec, name))
! 				return(&_fs_fstab);
! 	return((struct fstab *)NULL);
  }
  
  struct fstab *
  getfsfile(name)
! 	register const char *name;
  {
! 	if (setfsent())
! 		while (fstabscan())
! 			if (!strcmp(_fs_fstab.fs_file, name))
! 				return(&_fs_fstab);
! 	return((struct fstab *)NULL);
  }
  
  setfsent()
  {
! 	long bufsize;
  
! 	if (_fs_buf) {
! 		free(_fs_buf);
! 		_fs_buf = NULL;
! 	}
! 	if((_fs_count = getfsstat(NULL, 0, MNT_WAIT)) < 0) {
! 		error(errno);
! 		return(0);
! 	}
! 	bufsize = (long)_fs_count * sizeof(struct statfs);
! 	if((_fs_buf = malloc(bufsize)) == NULL) {
! 		error(errno);
! 		return(0);
! 	}
! 	if(getfsstat(_fs_buf, bufsize, MNT_WAIT) < 0) {
! 		error(errno);
! 		return(0);
! 	}
! 	_fs_ptr = _fs_buf;
! 	return(1);
  }
  
  void
  endfsent()
  {
! 	if (_fs_buf) {
! 		free(_fs_buf);
! 		_fs_buf = NULL;
! 	}
! 	_fs_count = 0;
  }
  
  static
  error(err)
! 	int err;
  {
! 	char *p;
  
! 	(void)write(STDERR_FILENO, "fstab: ", 7);
! 	(void)write(STDERR_FILENO, _PATH_FSTAB, sizeof(_PATH_FSTAB) - 1);
! 	(void)write(STDERR_FILENO, ": ", 1);
! 	p = strerror(err);
! 	(void)write(STDERR_FILENO, p, strlen(p));
! 	(void)write(STDERR_FILENO, "\n", 1);
  }
  #endif /* defined(AFS_DARWIN_ENV) */
--- 85,181 ----
  static
  fstabscan()
  {
!     if (_fs_count <= 0)
! 	return (0);
!     _fs_fstab.fs_spec = _fs_ptr->f_mntfromname;
!     _fs_fstab.fs_file = _fs_ptr->f_mntonname;
!     _fs_fstab.fs_vfstype = _fs_ptr->f_fstypename;
!     _fs_fstab.fs_mntops = _fs_ptr->f_fstypename;	// no mount options given
!     _fs_fstab.fs_type = (_fs_ptr->f_flags & MNT_RDONLY) ? FSTAB_RO : FSTAB_RW;
!     _fs_fstab.fs_freq = 0;
!     _fs_fstab.fs_passno = 0;
! 
!     _fs_ptr++;
!     _fs_count--;
!     return (1);
  }
  
  struct fstab *
  getfsent()
  {
!     if (!_fs_buf && !setfsent() || !fstabscan())
! 	return ((struct fstab *)NULL);
!     return (&_fs_fstab);
  }
  
  struct fstab *
  getfsspec(name)
!      register const char *name;
  {
!     if (setfsent())
! 	while (fstabscan())
! 	    if (!strcmp(_fs_fstab.fs_spec, name))
! 		return (&_fs_fstab);
!     return ((struct fstab *)NULL);
  }
  
  struct fstab *
  getfsfile(name)
!      register const char *name;
  {
!     if (setfsent())
! 	while (fstabscan())
! 	    if (!strcmp(_fs_fstab.fs_file, name))
! 		return (&_fs_fstab);
!     return ((struct fstab *)NULL);
  }
  
  setfsent()
  {
!     long bufsize;
  
!     if (_fs_buf) {
! 	free(_fs_buf);
! 	_fs_buf = NULL;
!     }
!     if ((_fs_count = getfsstat(NULL, 0, MNT_WAIT)) < 0) {
! 	error(errno);
! 	return (0);
!     }
!     bufsize = (long)_fs_count *sizeof(struct statfs);
!     if ((_fs_buf = malloc(bufsize)) == NULL) {
! 	error(errno);
! 	return (0);
!     }
!     if (getfsstat(_fs_buf, bufsize, MNT_WAIT) < 0) {
! 	error(errno);
! 	return (0);
!     }
!     _fs_ptr = _fs_buf;
!     return (1);
  }
  
  void
  endfsent()
  {
!     if (_fs_buf) {
! 	free(_fs_buf);
! 	_fs_buf = NULL;
!     }
!     _fs_count = 0;
  }
  
  static
  error(err)
!      int err;
  {
!     char *p;
  
!     (void)write(STDERR_FILENO, "fstab: ", 7);
!     (void)write(STDERR_FILENO, _PATH_FSTAB, sizeof(_PATH_FSTAB) - 1);
!     (void)write(STDERR_FILENO, ": ", 1);
!     p = strerror(err);
!     (void)write(STDERR_FILENO, p, strlen(p));
!     (void)write(STDERR_FILENO, "\n", 1);
  }
  #endif /* defined(AFS_DARWIN_ENV) */
Index: openafs/src/vol/ihandle.c
diff -c openafs/src/vol/ihandle.c:1.18 openafs/src/vol/ihandle.c:1.18.2.1
*** openafs/src/vol/ihandle.c:1.18	Tue Dec  9 14:58:28 2003
--- openafs/src/vol/ihandle.c	Wed Aug 25 03:14:19 2004
***************
*** 15,21 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/ihandle.c,v 1.18 2003/12/09 19:58:28 shadow Exp $");
  
  #include <stdio.h>
  #include <sys/types.h>
--- 15,21 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/ihandle.c,v 1.18.2.1 2004/08/25 07:14:19 shadow Exp $");
  
  #include <stdio.h>
  #include <sys/types.h>
***************
*** 297,303 ****
  	    DLL_DELETE(fdP, fdLruHead, fdLruTail, fd_next, fd_prev);
  	    ihP->ih_refcnt++;
  	    IH_UNLOCK;
! 	    (void) FDH_SEEK(fdP, 0, SEEK_SET);
  	    return fdP;
  	}
      }
--- 297,303 ----
  	    DLL_DELETE(fdP, fdLruHead, fdLruTail, fd_next, fd_prev);
  	    ihP->ih_refcnt++;
  	    IH_UNLOCK;
! 	    (void)FDH_SEEK(fdP, 0, SEEK_SET);
  	    return fdP;
  	}
      }
Index: openafs/src/vol/ihandle.h
diff -c openafs/src/vol/ihandle.h:1.8 openafs/src/vol/ihandle.h:1.8.2.1
*** openafs/src/vol/ihandle.h:1.8	Thu Mar 11 15:22:07 2004
--- openafs/src/vol/ihandle.h	Wed Aug 25 03:14:19 2004
***************
*** 76,84 ****
  extern void ih_glock_init(void);
  #define IH_LOCK \
      assert(pthread_once(&ih_glock_once, ih_glock_init) == 0 && \
! 	   pthread_mutex_lock(&ih_glock_mutex) == 0);
  #define IH_UNLOCK \
!     assert(pthread_mutex_unlock(&ih_glock_mutex) == 0);
  #else /* AFS_PTHREAD_ENV */
  #define IH_LOCK
  #define IH_UNLOCK
--- 76,84 ----
  extern void ih_glock_init(void);
  #define IH_LOCK \
      assert(pthread_once(&ih_glock_once, ih_glock_init) == 0 && \
! 	   pthread_mutex_lock(&ih_glock_mutex) == 0)
  #define IH_UNLOCK \
!     assert(pthread_mutex_unlock(&ih_glock_mutex) == 0)
  #else /* AFS_PTHREAD_ENV */
  #define IH_LOCK
  #define IH_UNLOCK
Index: openafs/src/vol/namei_ops.c
diff -c openafs/src/vol/namei_ops.c:1.21 openafs/src/vol/namei_ops.c:1.21.2.1
*** openafs/src/vol/namei_ops.c:1.21	Sun Nov 23 22:51:24 2003
--- openafs/src/vol/namei_ops.c	Wed Aug 25 03:14:19 2004
***************
*** 13,19 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/namei_ops.c,v 1.21 2003/11/24 03:51:24 shadow Exp $");
  
  #ifdef AFS_NAMEI_ENV
  #include <stdio.h>
--- 13,19 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/namei_ops.c,v 1.21.2.1 2004/08/25 07:14:19 shadow Exp $");
  
  #ifdef AFS_NAMEI_ENV
  #include <stdio.h>
***************
*** 696,709 ****
  	if (count == 0) {
  	    IHandle_t *th;
  	    IH_INIT(th, ih->ih_dev, ih->ih_vid, ino);
! #if 0 
  	    /* This triggers in the fileserver on the volume index vnodes */
!             if (th->ih_refcnt > 1) 
!                 Log("Warning: Leaked ref on ihandle dev %d vid %d ino %lld\n",
  		    th->ih_dev, th->ih_vid, (int64_t) th->ih_ino);
  #endif
!             namei_HandleToName(&name, th);
!             IH_RELEASE(th);
  	    code = unlink(name.n_path);
  	}
  	FDH_CLOSE(fdP);
--- 696,709 ----
  	if (count == 0) {
  	    IHandle_t *th;
  	    IH_INIT(th, ih->ih_dev, ih->ih_vid, ino);
! #if 0
  	    /* This triggers in the fileserver on the volume index vnodes */
! 	    if (th->ih_refcnt > 1)
! 		Log("Warning: Leaked ref on ihandle dev %d vid %d ino %lld\n",
  		    th->ih_dev, th->ih_vid, (int64_t) th->ih_ino);
  #endif
! 	    namei_HandleToName(&name, th);
! 	    IH_RELEASE(th);
  	    code = unlink(name.n_path);
  	}
  	FDH_CLOSE(fdP);
Index: openafs/src/vol/nuke.c
diff -c openafs/src/vol/nuke.c:1.13 openafs/src/vol/nuke.c:1.13.2.1
*** openafs/src/vol/nuke.c:1.13	Sat Nov 22 23:53:43 2003
--- openafs/src/vol/nuke.c	Wed Aug 25 03:14:19 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/nuke.c,v 1.13 2003/11/23 04:53:43 jaltman Exp $");
  
  #include <rx/xdr.h>
  #include <afs/afsint.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/nuke.c,v 1.13.2.1 2004/08/25 07:14:19 shadow Exp $");
  
  #include <rx/xdr.h>
  #include <afs/afsint.h>
***************
*** 144,155 ****
      *lastDevComp = toupper(*lastDevComp);
  #else
      {
!     char *tfile = vol_DevName(tstat.st_dev, wpath);
!     if (!tfile) {
! 	printf("volnuke: can't find %s's device.\n", aname);
! 	return 1;
!     }
!     strcpy(devName, tfile);	/* save this from the static buffer */
      }
      /* aim lastDevComp at the 'foo' of '/dev/foo' */
      lastDevComp = strrchr(devName, '/');
--- 144,155 ----
      *lastDevComp = toupper(*lastDevComp);
  #else
      {
! 	char *tfile = vol_DevName(tstat.st_dev, wpath);
! 	if (!tfile) {
! 	    printf("volnuke: can't find %s's device.\n", aname);
! 	    return 1;
! 	}
! 	strcpy(devName, tfile);	/* save this from the static buffer */
      }
      /* aim lastDevComp at the 'foo' of '/dev/foo' */
      lastDevComp = strrchr(devName, '/');
***************
*** 201,212 ****
  		}
  #else /* AFS_NAMEI_ENV */
  		IH_INIT(fileH, (int)tstat.st_dev, avolid, ti->inode[i]);
!         {
!         int j;
!         for (j = 0; j < ti->count[i]; j++) {
! 		   code = IH_DEC(fileH, ti->inode[i], avolid);
!         }
!         }
  		IH_RELEASE(fileH);
  #endif /* AFS_NAMEI_ENV */
  	    }
--- 201,212 ----
  		}
  #else /* AFS_NAMEI_ENV */
  		IH_INIT(fileH, (int)tstat.st_dev, avolid, ti->inode[i]);
! 		{
! 		    int j;
! 		    for (j = 0; j < ti->count[i]; j++) {
! 			code = IH_DEC(fileH, ti->inode[i], avolid);
! 		    }
! 		}
  		IH_RELEASE(fileH);
  #endif /* AFS_NAMEI_ENV */
  	    }
Index: openafs/src/vol/partition.c
diff -c openafs/src/vol/partition.c:1.30 openafs/src/vol/partition.c:1.30.2.1
*** openafs/src/vol/partition.c:1.30	Sun Aug  8 19:59:51 2004
--- openafs/src/vol/partition.c	Wed Aug 25 03:14:19 2004
***************
*** 21,27 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/partition.c,v 1.30 2004/08/08 23:59:51 shadow Exp $");
  
  #include <ctype.h>
  #ifdef AFS_NT40_ENV
--- 21,27 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/partition.c,v 1.30.2.1 2004/08/25 07:14:19 shadow Exp $");
  
  #include <ctype.h>
  #ifdef AFS_NT40_ENV
***************
*** 273,280 ****
  static void
  VInitPartition(char *path, char *devname, Device dev)
  {
!     VOL_LOCK VInitPartition_r(path, devname, dev);
! VOL_UNLOCK}
  
  #ifndef AFS_NT40_ENV
  /* VAttachPartitions() finds the vice partitions on this server. Calls
--- 273,282 ----
  static void
  VInitPartition(char *path, char *devname, Device dev)
  {
!     VOL_LOCK;
!     VInitPartition_r(path, devname, dev);
!     VOL_UNLOCK;
! }
  
  #ifndef AFS_NT40_ENV
  /* VAttachPartitions() finds the vice partitions on this server. Calls
***************
*** 836,843 ****
  VGetPartition(char *name, int abortp)
  {
      struct DiskPartition *retVal;
!     VOL_LOCK retVal = VGetPartition_r(name, abortp);
!     VOL_UNLOCK return retVal;
  }
  
  #ifdef AFS_NT40_ENV
--- 838,847 ----
  VGetPartition(char *name, int abortp)
  {
      struct DiskPartition *retVal;
!     VOL_LOCK;
!     retVal = VGetPartition_r(name, abortp);
!     VOL_UNLOCK;
!     return retVal;
  }
  
  #ifdef AFS_NT40_ENV
***************
*** 933,940 ****
  void
  VSetPartitionDiskUsage(register struct DiskPartition *dp)
  {
!     VOL_LOCK VSetPartitionDiskUsage_r(dp);
! VOL_UNLOCK}
  
  void
  VResetDiskUsage_r(void)
--- 937,946 ----
  void
  VSetPartitionDiskUsage(register struct DiskPartition *dp)
  {
!     VOL_LOCK;
!     VSetPartitionDiskUsage_r(dp);
!     VOL_UNLOCK;
! }
  
  void
  VResetDiskUsage_r(void)
***************
*** 951,958 ****
  void
  VResetDiskUsage(void)
  {
!     VOL_LOCK VResetDiskUsage_r();
! VOL_UNLOCK}
  
  void
  VAdjustDiskUsage_r(Error * ec, Volume * vp, afs_sfsize_t blocks,
--- 957,966 ----
  void
  VResetDiskUsage(void)
  {
!     VOL_LOCK;
!     VResetDiskUsage_r();
!     VOL_UNLOCK;
! }
  
  void
  VAdjustDiskUsage_r(Error * ec, Volume * vp, afs_sfsize_t blocks,
***************
*** 988,995 ****
  VAdjustDiskUsage(Error * ec, Volume * vp, afs_sfsize_t blocks,
  		 afs_sfsize_t checkBlocks)
  {
!     VOL_LOCK VAdjustDiskUsage_r(ec, vp, blocks, checkBlocks);
! VOL_UNLOCK}
  
  int
  VDiskUsage_r(Volume * vp, afs_sfsize_t blocks)
--- 996,1005 ----
  VAdjustDiskUsage(Error * ec, Volume * vp, afs_sfsize_t blocks,
  		 afs_sfsize_t checkBlocks)
  {
!     VOL_LOCK;
!     VAdjustDiskUsage_r(ec, vp, blocks, checkBlocks);
!     VOL_UNLOCK;
! }
  
  int
  VDiskUsage_r(Volume * vp, afs_sfsize_t blocks)
***************
*** 1015,1022 ****
  VDiskUsage(Volume * vp, afs_sfsize_t blocks)
  {
      int retVal;
!     VOL_LOCK retVal = VDiskUsage_r(vp, blocks);
!     VOL_UNLOCK return retVal;
  }
  
  void
--- 1025,1034 ----
  VDiskUsage(Volume * vp, afs_sfsize_t blocks)
  {
      int retVal;
!     VOL_LOCK;
!     retVal = VDiskUsage_r(vp, blocks);
!     VOL_UNLOCK;
!     return retVal;
  }
  
  void
***************
*** 1036,1043 ****
  void
  VPrintDiskStats(void)
  {
!     VOL_LOCK VPrintDiskStats_r();
! VOL_UNLOCK}
  
  #ifdef AFS_NT40_ENV
  /* Need a separate lock file on NT, since NT only has mandatory file locks. */
--- 1048,1057 ----
  void
  VPrintDiskStats(void)
  {
!     VOL_LOCK;
!     VPrintDiskStats_r();
!     VOL_UNLOCK;
! }
  
  #ifdef AFS_NT40_ENV
  /* Need a separate lock file on NT, since NT only has mandatory file locks. */
***************
*** 1208,1218 ****
  void
  VLockPartition(char *name)
  {
!     VOL_LOCK VLockPartition_r(name);
! VOL_UNLOCK}
  
  void
  VUnlockPartition(char *name)
  {
!     VOL_LOCK VUnlockPartition_r(name);
! VOL_UNLOCK}
--- 1222,1236 ----
  void
  VLockPartition(char *name)
  {
!     VOL_LOCK;
!     VLockPartition_r(name);
!     VOL_UNLOCK;
! }
  
  void
  VUnlockPartition(char *name)
  {
!     VOL_LOCK;
!     VUnlockPartition_r(name);
!     VOL_UNLOCK;
! }
Index: openafs/src/vol/purge.c
diff -c openafs/src/vol/purge.c:1.9 openafs/src/vol/purge.c:1.9.2.1
*** openafs/src/vol/purge.c:1.9	Tue Jul 15 19:17:40 2003
--- openafs/src/vol/purge.c	Wed Aug 25 03:14:19 2004
***************
*** 17,23 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/purge.c,v 1.9 2003/07/15 23:17:40 shadow Exp $");
  
  #include <stdio.h>
  #ifdef AFS_NT40_ENV
--- 17,23 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/purge.c,v 1.9.2.1 2004/08/25 07:14:19 shadow Exp $");
  
  #include <stdio.h>
  #ifdef AFS_NT40_ENV
***************
*** 84,91 ****
  void
  VPurgeVolume(Error * ec, Volume * vp)
  {
!     VOL_LOCK VPurgeVolume_r(ec, vp);
! VOL_UNLOCK}
  
  #define MAXOBLITATONCE	200
  /* delete a portion of an index, adjusting offset appropriately.  Returns 0 if
--- 84,93 ----
  void
  VPurgeVolume(Error * ec, Volume * vp)
  {
!     VOL_LOCK;
!     VPurgeVolume_r(ec, vp);
!     VOL_UNLOCK;
! }
  
  #define MAXOBLITATONCE	200
  /* delete a portion of an index, adjusting offset appropriately.  Returns 0 if
***************
*** 162,169 ****
  void
  PurgeIndex(Volume * vp, VnodeClass class)
  {
!     VOL_LOCK PurgeIndex_r(vp, class);
! VOL_UNLOCK}
  
  void
  PurgeIndex_r(Volume * vp, VnodeClass class)
--- 164,173 ----
  void
  PurgeIndex(Volume * vp, VnodeClass class)
  {
!     VOL_LOCK;
!     PurgeIndex_r(vp, class);
!     VOL_UNLOCK;
! }
  
  void
  PurgeIndex_r(Volume * vp, VnodeClass class)
***************
*** 198,205 ****
  void
  PurgeHeader(Volume * vp)
  {
!     VOL_LOCK PurgeHeader_r(vp);
! VOL_UNLOCK}
  
  void
  PurgeHeader_r(Volume * vp)
--- 202,211 ----
  void
  PurgeHeader(Volume * vp)
  {
!     VOL_LOCK;
!     PurgeHeader_r(vp);
!     VOL_UNLOCK;
! }
  
  void
  PurgeHeader_r(Volume * vp)
Index: openafs/src/vol/vnode.c
diff -c openafs/src/vol/vnode.c:1.19 openafs/src/vol/vnode.c:1.19.2.1
*** openafs/src/vol/vnode.c:1.19	Wed Jun 23 10:27:48 2004
--- openafs/src/vol/vnode.c	Wed Aug 25 03:14:19 2004
***************
*** 17,23 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/vnode.c,v 1.19 2004/06/23 14:27:48 shadow Exp $");
  
  #include <errno.h>
  #include <stdio.h>
--- 17,23 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/vnode.c,v 1.19.2.1 2004/08/25 07:14:19 shadow Exp $");
  
  #include <errno.h>
  #include <stdio.h>
***************
*** 266,273 ****
  VAllocVnode(Error * ec, Volume * vp, VnodeType type)
  {
      Vnode *retVal;
!     VOL_LOCK retVal = VAllocVnode_r(ec, vp, type);
!     VOL_UNLOCK return retVal;
  }
  
  Vnode *
--- 266,275 ----
  VAllocVnode(Error * ec, Volume * vp, VnodeType type)
  {
      Vnode *retVal;
!     VOL_LOCK;
!     retVal = VAllocVnode_r(ec, vp, type);
!     VOL_UNLOCK;
!     return retVal;
  }
  
  Vnode *
***************
*** 344,351 ****
  	    ObtainWriteLock(&vnp->lock);
  	} else {
  	    /* follow locking hierarchy */
! 	    VOL_UNLOCK ObtainWriteLock(&vnp->lock);
! 	VOL_LOCK}
  #ifdef AFS_PTHREAD_ENV
  	vnp->writer = pthread_self();
  #else /* AFS_PTHREAD_ENV */
--- 346,355 ----
  	    ObtainWriteLock(&vnp->lock);
  	} else {
  	    /* follow locking hierarchy */
! 	    VOL_UNLOCK;
! 	    ObtainWriteLock(&vnp->lock);
! 	    VOL_LOCK;
! 	}
  #ifdef AFS_PTHREAD_ENV
  	vnp->writer = pthread_self();
  #else /* AFS_PTHREAD_ENV */
***************
*** 381,387 ****
  	    FdHandle_t *fdP;
  	    off_t off = vnodeIndexOffset(vcp, vnodeNumber);
  
! 	    VOL_UNLOCK fdP = IH_OPEN(ihP);
  	    if (fdP == NULL)
  		Abort("VAllocVnode: can't open index file!\n");
  	    if ((size = FDH_SIZE(fdP)) < 0)
--- 385,392 ----
  	    FdHandle_t *fdP;
  	    off_t off = vnodeIndexOffset(vcp, vnodeNumber);
  
! 	    VOL_UNLOCK;
! 	    fdP = IH_OPEN(ihP);
  	    if (fdP == NULL)
  		Abort("VAllocVnode: can't open index file!\n");
  	    if ((size = FDH_SIZE(fdP)) < 0)
***************
*** 403,409 ****
  		free(buf);
  	    }
  	    FDH_CLOSE(fdP);
! 	VOL_LOCK}
  	VNLog(4, 2, vnodeNumber, (afs_int32) vnp);
      }
  
--- 408,415 ----
  		free(buf);
  	    }
  	    FDH_CLOSE(fdP);
! 	    VOL_LOCK;
! 	}
  	VNLog(4, 2, vnodeNumber, (afs_int32) vnp);
      }
  
***************
*** 429,436 ****
  VGetVnode(Error * ec, Volume * vp, VnodeId vnodeNumber, int locktype)
  {				/* READ_LOCK or WRITE_LOCK, as defined in lock.h */
      Vnode *retVal;
!     VOL_LOCK retVal = VGetVnode_r(ec, vp, vnodeNumber, locktype);
!     VOL_UNLOCK return retVal;
  }
  
  Vnode *
--- 435,444 ----
  VGetVnode(Error * ec, Volume * vp, VnodeId vnodeNumber, int locktype)
  {				/* READ_LOCK or WRITE_LOCK, as defined in lock.h */
      Vnode *retVal;
!     VOL_LOCK;
!     retVal = VGetVnode_r(ec, vp, vnodeNumber, locktype);
!     VOL_UNLOCK;
!     return retVal;
  }
  
  Vnode *
***************
*** 520,526 ****
  #endif /* AFS_PTHREAD_ENV */
  
  	/* Read vnode from volume index */
! 	VOL_UNLOCK fdP = IH_OPEN(ihP);
  	if (fdP == NULL) {
  	    Log("VGetVnode: can't open index dev=%u, i=%s\n", vp->device,
  		PrintInode(NULL, vp->vnodeIndex[class].handle->ih_ino));
--- 528,535 ----
  #endif /* AFS_PTHREAD_ENV */
  
  	/* Read vnode from volume index */
! 	VOL_UNLOCK;
! 	fdP = IH_OPEN(ihP);
  	if (fdP == NULL) {
  	    Log("VGetVnode: can't open index dev=%u, i=%s\n", vp->device,
  		PrintInode(NULL, vp->vnodeIndex[class].handle->ih_ino));
***************
*** 537,543 ****
  	    /* Don't take volume off line if the inumber is out of range
  	     * or the inode table is full. */
  	    FDH_REALLYCLOSE(fdP);
! 	    VOL_LOCK if (n == BAD_IGET) {
  		Log("VGetVnode: bad inumber %s\n",
  		    PrintInode(NULL, vp->vnodeIndex[class].handle->ih_ino));
  		*ec = VIO;
--- 546,553 ----
  	    /* Don't take volume off line if the inumber is out of range
  	     * or the inode table is full. */
  	    FDH_REALLYCLOSE(fdP);
! 	    VOL_LOCK;
! 	    if (n == BAD_IGET) {
  		Log("VGetVnode: bad inumber %s\n",
  		    PrintInode(NULL, vp->vnodeIndex[class].handle->ih_ino));
  		*ec = VIO;
***************
*** 561,569 ****
  	    return NULL;
  	}
  	FDH_CLOSE(fdP);
! 	VOL_LOCK
! 	    /* Quick check to see that the data is reasonable */
! 	    if (vnp->disk.vnodeMagic != vcp->magic || vnp->disk.type == vNull) {
  	    if (vnp->disk.type == vNull) {
  		*ec = VNOVNODE;
  		mlkReason = 6;
--- 571,579 ----
  	    return NULL;
  	}
  	FDH_CLOSE(fdP);
! 	VOL_LOCK;
! 	/* Quick check to see that the data is reasonable */
! 	if (vnp->disk.vnodeMagic != vcp->magic || vnp->disk.type == vNull) {
  	    if (vnp->disk.type == vNull) {
  		*ec = VNOVNODE;
  		mlkReason = 6;
***************
*** 613,619 ****
  	    vnp->lruNext->lruPrev = vnp->lruPrev;
  	}
      }
!     VOL_UNLOCK if (locktype == READ_LOCK)
  	ObtainReadLock(&vnp->lock);
      else {
  	ObtainWriteLock(&vnp->lock);
--- 623,630 ----
  	    vnp->lruNext->lruPrev = vnp->lruPrev;
  	}
      }
!     VOL_UNLOCK;
!     if (locktype == READ_LOCK)
  	ObtainReadLock(&vnp->lock);
      else {
  	ObtainWriteLock(&vnp->lock);
***************
*** 623,632 ****
  	LWP_CurrentProcess(&vnp->writer);
  #endif /* AFS_PTHREAD_ENV */
      }
!     VOL_LOCK
! 	/* Check that the vnode hasn't been removed while we were obtaining
! 	 * the lock */
! 	VNLog(102, 2, vnodeNumber, (afs_int32) vnp);
      if ((vnp->disk.type == vNull) || (vnp->cacheCheck == 0)) {
  	if (vnp->nUsers-- == 1)
  	    StickOnLruChain_r(vnp, vcp);
--- 634,643 ----
  	LWP_CurrentProcess(&vnp->writer);
  #endif /* AFS_PTHREAD_ENV */
      }
!     VOL_LOCK;
!     /* Check that the vnode hasn't been removed while we were obtaining
!      * the lock */
!     VNLog(102, 2, vnodeNumber, (afs_int32) vnp);
      if ((vnp->disk.type == vNull) || (vnp->cacheCheck == 0)) {
  	if (vnp->nUsers-- == 1)
  	    StickOnLruChain_r(vnp, vcp);
***************
*** 652,659 ****
  void
  VPutVnode(Error * ec, register Vnode * vnp)
  {
!     VOL_LOCK VPutVnode_r(ec, vnp);
! VOL_UNLOCK}
  
  void
  VPutVnode_r(Error * ec, register Vnode * vnp)
--- 663,672 ----
  void
  VPutVnode(Error * ec, register Vnode * vnp)
  {
!     VOL_LOCK;
!     VPutVnode_r(ec, vnp);
!     VOL_UNLOCK;
! }
  
  void
  VPutVnode_r(Error * ec, register Vnode * vnp)
***************
*** 709,715 ****
  	    } else {
  		IHandle_t *ihP = vp->vnodeIndex[class].handle;
  		FdHandle_t *fdP;
! 		VOL_UNLOCK fdP = IH_OPEN(ihP);
  		if (fdP == NULL)
  		    Abort("VPutVnode: can't open index file!\n");
  		offset = vnodeIndexOffset(vcp, vnp->vnodeNumber);
--- 722,729 ----
  	    } else {
  		IHandle_t *ihP = vp->vnodeIndex[class].handle;
  		FdHandle_t *fdP;
! 		VOL_UNLOCK;
! 		fdP = IH_OPEN(ihP);
  		if (fdP == NULL)
  		    Abort("VPutVnode: can't open index file!\n");
  		offset = vnodeIndexOffset(vcp, vnp->vnodeNumber);
***************
*** 723,729 ****
  		    /* Don't force volume offline if the inumber is out of
  		     * range or the inode table is full.
  		     */
! 		    VOL_LOCK if (code == BAD_IGET) {
  			Log("VPutVnode: bad inumber %s\n",
  			    PrintInode(NULL,
  				       vp->vnodeIndex[class].handle->ih_ino));
--- 737,744 ----
  		    /* Don't force volume offline if the inumber is out of
  		     * range or the inode table is full.
  		     */
! 		    VOL_LOCK;
! 		    if (code == BAD_IGET) {
  			Log("VPutVnode: bad inumber %s\n",
  			    PrintInode(NULL,
  				       vp->vnodeIndex[class].handle->ih_ino));
***************
*** 733,749 ****
  			VForceOffline_r(vp);
  			*ec = VSALVAGE;
  		    }
! 		    VOL_UNLOCK FDH_REALLYCLOSE(fdP);
  		} else {
  		    FDH_CLOSE(fdP);
  		}
! 		VOL_LOCK
! 		    /* If the vnode is to be deleted, and we wrote the vnode out,
! 		     * free its bitmap entry. Do after the vnode is written so we
! 		     * don't allocate from bitmap before the vnode is written
! 		     * (doing so could cause a "addled bitmap" message).
! 		     */
! 		    if (vnp->delete && !*ec) {
  		    VFreeBitMapEntry_r(ec, &vp->vnodeIndex[class],
  				       vnodeIdToBitNumber(vnp->vnodeNumber));
  		}
--- 748,765 ----
  			VForceOffline_r(vp);
  			*ec = VSALVAGE;
  		    }
! 		    VOL_UNLOCK;
! 		    FDH_REALLYCLOSE(fdP);
  		} else {
  		    FDH_CLOSE(fdP);
  		}
! 		VOL_LOCK;
! 		/* If the vnode is to be deleted, and we wrote the vnode out,
! 		 * free its bitmap entry. Do after the vnode is written so we
! 		 * don't allocate from bitmap before the vnode is written
! 		 * (doing so could cause a "addled bitmap" message).
! 		 */
! 		if (vnp->delete && !*ec) {
  		    VFreeBitMapEntry_r(ec, &vp->vnodeIndex[class],
  				       vnodeIdToBitNumber(vnp->vnodeNumber));
  		}
***************
*** 779,786 ****
  VVnodeWriteToRead(Error * ec, register Vnode * vnp)
  {
      int retVal;
!     VOL_LOCK retVal = VVnodeWriteToRead_r(ec, vnp);
!     VOL_UNLOCK return retVal;
  }
  
  int
--- 795,804 ----
  VVnodeWriteToRead(Error * ec, register Vnode * vnp)
  {
      int retVal;
!     VOL_LOCK;
!     retVal = VVnodeWriteToRead_r(ec, vnp);
!     VOL_UNLOCK;
!     return retVal;
  }
  
  int
***************
*** 818,824 ****
  					    changed_oldTime) << 1) | vnp->
  	  delete);
      if (thisProcess != vnp->writer)
! 	Abort("VPutVnode: Vnode at 0x%x locked by another process!\n", (int)vnp);
      if (vnp->delete) {
  	return 0;
      }
--- 836,843 ----
  					    changed_oldTime) << 1) | vnp->
  	  delete);
      if (thisProcess != vnp->writer)
! 	Abort("VPutVnode: Vnode at 0x%x locked by another process!\n",
! 	      (int)vnp);
      if (vnp->delete) {
  	return 0;
      }
***************
*** 839,845 ****
  	    IHandle_t *ihP = vp->vnodeIndex[class].handle;
  	    FdHandle_t *fdP;
  	    off_t off = vnodeIndexOffset(vcp, vnp->vnodeNumber);
! 	    VOL_UNLOCK fdP = IH_OPEN(ihP);
  	    if (fdP == NULL)
  		Abort("VPutVnode: can't open index file!\n");
  	    code = FDH_SEEK(fdP, off, SEEK_SET);
--- 858,865 ----
  	    IHandle_t *ihP = vp->vnodeIndex[class].handle;
  	    FdHandle_t *fdP;
  	    off_t off = vnodeIndexOffset(vcp, vnp->vnodeNumber);
! 	    VOL_UNLOCK;
! 	    fdP = IH_OPEN(ihP);
  	    if (fdP == NULL)
  		Abort("VPutVnode: can't open index file!\n");
  	    code = FDH_SEEK(fdP, off, SEEK_SET);
***************
*** 851,868 ****
  		 * Don't force volume offline if the inumber is out of
  		 * range or the inode table is full.
  		 */
! 		VOL_LOCK if (code == BAD_IGET) {
  		    Log("VPutVnode: bad inumber %s\n",
! 			PrintInode(NULL, vp->vnodeIndex[class].handle->ih_ino));
  		    *ec = VIO;
  		} else {
  		    Log("VPutVnode: Couldn't write vnode %u, volume %u (%s)\n", vnp->vnodeNumber, V_id(vnp->volumePtr), V_name(vnp->volumePtr));
  		    VForceOffline_r(vp);
  		    *ec = VSALVAGE;
  		}
! 	    VOL_UNLOCK}
  	    FDH_CLOSE(fdP);
! 	VOL_LOCK}
  	vcp->writes++;
  	vnp->changed_newTime = vnp->changed_oldTime = 0;
      }
--- 871,892 ----
  		 * Don't force volume offline if the inumber is out of
  		 * range or the inode table is full.
  		 */
! 		VOL_LOCK;
! 		if (code == BAD_IGET) {
  		    Log("VPutVnode: bad inumber %s\n",
! 			PrintInode(NULL,
! 				   vp->vnodeIndex[class].handle->ih_ino));
  		    *ec = VIO;
  		} else {
  		    Log("VPutVnode: Couldn't write vnode %u, volume %u (%s)\n", vnp->vnodeNumber, V_id(vnp->volumePtr), V_name(vnp->volumePtr));
  		    VForceOffline_r(vp);
  		    *ec = VSALVAGE;
  		}
! 		VOL_UNLOCK;
! 	    }
  	    FDH_CLOSE(fdP);
! 	    VOL_LOCK;
! 	}
  	vcp->writes++;
  	vnp->changed_newTime = vnp->changed_oldTime = 0;
      }
Index: openafs/src/vol/vol-info.c
diff -c openafs/src/vol/vol-info.c:1.18 openafs/src/vol/vol-info.c:1.18.2.1
*** openafs/src/vol/vol-info.c:1.18	Wed Jun 23 10:27:48 2004
--- openafs/src/vol/vol-info.c	Wed Aug 25 03:14:19 2004
***************
*** 18,24 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/vol-info.c,v 1.18 2004/06/23 14:27:48 shadow Exp $");
  
  #include <ctype.h>
  #include <errno.h>
--- 18,24 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/vol-info.c,v 1.18.2.1 2004/08/25 07:14:19 shadow Exp $");
  
  #include <ctype.h>
  #include <errno.h>
***************
*** 608,615 ****
  	if (saveinodes)
  	    printf
  		("Volume-Id\t  Volsize  Auxsize Inodesize  AVolsize SizeDiff                (VolName)\n");
! 	printf("%u\t%9d%9d%10d%10d%9d\t%24s\n", V_id(vp), Vdiskused, Vauxsize_k,
! 	       Vvnodesize_k, totvolsize, totvolsize - Vdiskused, V_name(vp));
      }
  }
  
--- 608,616 ----
  	if (saveinodes)
  	    printf
  		("Volume-Id\t  Volsize  Auxsize Inodesize  AVolsize SizeDiff                (VolName)\n");
! 	printf("%u\t%9d%9d%10d%10d%9d\t%24s\n", V_id(vp), Vdiskused,
! 	       Vauxsize_k, Vvnodesize_k, totvolsize, totvolsize - Vdiskused,
! 	       V_name(vp));
      }
  }
  
Index: openafs/src/vol/vol-salvage.c
diff -c openafs/src/vol/vol-salvage.c:1.41 openafs/src/vol/vol-salvage.c:1.41.2.1
*** openafs/src/vol/vol-salvage.c:1.41	Sat May 15 02:11:40 2004
--- openafs/src/vol/vol-salvage.c	Wed Aug 25 03:14:19 2004
***************
*** 92,98 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/vol-salvage.c,v 1.41 2004/05/15 06:11:40 shadow Exp $");
  
  #include <stdlib.h>
  #include <stdio.h>
--- 92,98 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/vol-salvage.c,v 1.41.2.1 2004/08/25 07:14:19 shadow Exp $");
  
  #include <stdlib.h>
  #include <stdio.h>
***************
*** 519,532 ****
  
  #ifdef FAST_RESTART
      {
!     afs_int32 i;
!     for (i = 0; i < CMD_MAXPARMS; i++) {
! 	if (as->parms[i].items) {
! 	    seenany = 1;
! 	    break;
  	}
      }
-     }
      if (!seenany) {
  	char *msg =
  	    "Exiting immediately without salvage. Look into the FileLog to find volumes which really need to be salvaged!";
--- 519,532 ----
  
  #ifdef FAST_RESTART
      {
! 	afs_int32 i;
! 	for (i = 0; i < CMD_MAXPARMS; i++) {
! 	    if (as->parms[i].items) {
! 		seenany = 1;
! 		break;
! 	    }
  	}
      }
      if (!seenany) {
  	char *msg =
  	    "Exiting immediately without salvage. Look into the FileLog to find volumes which really need to be salvaged!";
***************
*** 1602,1608 ****
  
  		GetVolumeSummary(singleVolumeNumber);
  
! 		for (i = 0,vsp = volumeSummaryp; i < nVolumes; i++) {
  		    if (vsp->fileName)
  			DeleteExtraVolumeHeaderFile(vsp);
  		}
--- 1602,1608 ----
  
  		GetVolumeSummary(singleVolumeNumber);
  
! 		for (i = 0, vsp = volumeSummaryp; i < nVolumes; i++) {
  		    if (vsp->fileName)
  			DeleteExtraVolumeHeaderFile(vsp);
  		}
***************
*** 3066,3072 ****
  		    if (dirOrphaned) {
  			Log("dir vnode %u: %s/%s parent vnode is %u (vnode %u, unique %u) -- %sdeleted\n", dir->vnodeNumber, (dir->name ? dir->name : "??"), name, vnodeEssence->parent, vnodeNumber, unique, (Testing ? "would have been " : ""));
  		    } else if (vnodeNumber == 1) {
! 			Log("dir vnode %d: %s/%s is invalid (vnode %d, unique %d) -- %sdeleted\n", dir->vnodeNumber, (dir->name ? dir->name : "??"), name, vnodeNumber, unique, (Testing?"would have been ":""));
  		    } else {
  			Log("dir vnode %u: %s/%s already claimed by directory vnode %u (vnode %u, unique %u) -- %sdeleted\n", dir->vnodeNumber, (dir->name ? dir->name : "??"), name, vnodeEssence->parent, vnodeNumber, unique, (Testing ? "would have been " : ""));
  		    }
--- 3066,3072 ----
  		    if (dirOrphaned) {
  			Log("dir vnode %u: %s/%s parent vnode is %u (vnode %u, unique %u) -- %sdeleted\n", dir->vnodeNumber, (dir->name ? dir->name : "??"), name, vnodeEssence->parent, vnodeNumber, unique, (Testing ? "would have been " : ""));
  		    } else if (vnodeNumber == 1) {
! 			Log("dir vnode %d: %s/%s is invalid (vnode %d, unique %d) -- %sdeleted\n", dir->vnodeNumber, (dir->name ? dir->name : "??"), name, vnodeNumber, unique, (Testing ? "would have been " : ""));
  		    } else {
  			Log("dir vnode %u: %s/%s already claimed by directory vnode %u (vnode %u, unique %u) -- %sdeleted\n", dir->vnodeNumber, (dir->name ? dir->name : "??"), name, vnodeEssence->parent, vnodeNumber, unique, (Testing ? "would have been " : ""));
  		    }
Index: openafs/src/vol/volume.c
diff -c openafs/src/vol/volume.c:1.35 openafs/src/vol/volume.c:1.35.2.1
*** openafs/src/vol/volume.c:1.35	Sun Apr 18 02:13:54 2004
--- openafs/src/vol/volume.c	Wed Aug 25 03:14:19 2004
***************
*** 20,26 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/volume.c,v 1.35 2004/04/18 06:13:54 kolya Exp $");
  
  #include <rx/xdr.h>
  #include <afs/afsint.h>
--- 20,26 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/volume.c,v 1.35.2.1 2004/08/25 07:14:19 shadow Exp $");
  
  #include <rx/xdr.h>
  #include <afs/afsint.h>
***************
*** 339,346 ****
  VConnectFS(void)
  {
      int retVal;
!     VOL_LOCK retVal = VConnectFS_r();
!     VOL_UNLOCK return retVal;
  }
  
  int
--- 339,348 ----
  VConnectFS(void)
  {
      int retVal;
!     VOL_LOCK;
!     retVal = VConnectFS_r();
!     VOL_UNLOCK;
!     return retVal;
  }
  
  int
***************
*** 365,372 ****
  void
  VDisconnectFS(void)
  {
!     VOL_LOCK VDisconnectFS_r();
! VOL_UNLOCK}
  
  void
  VShutdown_r(void)
--- 367,376 ----
  void
  VDisconnectFS(void)
  {
!     VOL_LOCK;
!     VDisconnectFS_r();
!     VOL_UNLOCK;
! }
  
  void
  VShutdown_r(void)
***************
*** 409,416 ****
  void
  VShutdown(void)
  {
!     VOL_LOCK VShutdown_r();
! VOL_UNLOCK}
  
  
  static void
--- 413,422 ----
  void
  VShutdown(void)
  {
!     VOL_LOCK;
!     VShutdown_r();
!     VOL_UNLOCK;
! }
  
  
  static void
***************
*** 556,564 ****
  VAttachVolumeByName(Error * ec, char *partition, char *name, int mode)
  {
      Volume *retVal;
!     VATTACH_LOCK VOL_LOCK retVal =
! 	VAttachVolumeByName_r(ec, partition, name, mode);
!     VOL_UNLOCK VATTACH_UNLOCK return retVal;
  }
  
  Volume *
--- 562,573 ----
  VAttachVolumeByName(Error * ec, char *partition, char *name, int mode)
  {
      Volume *retVal;
!     VATTACH_LOCK;
!     VOL_LOCK;
!     retVal = VAttachVolumeByName_r(ec, partition, name, mode);
!     VOL_UNLOCK;
!     VATTACH_UNLOCK;
!     return retVal;
  }
  
  Volume *
***************
*** 601,618 ****
      strcpy(path, VPartitionPath(partp));
      strcat(path, "/");
      strcat(path, name);
!     VOL_UNLOCK if ((fd = afs_open(path, O_RDONLY)) == -1
! 		   || afs_fstat(fd, &status) == -1) {
  	Log("VAttachVolume: Failed to open %s (errno %d)\n", path, errno);
  	if (fd > -1)
  	    close(fd);
! 	VOL_LOCK *ec = VNOVOL;
  	goto done;
      }
      n = read(fd, &diskHeader, sizeof(diskHeader));
      close(fd);
!     VOL_LOCK if (n != sizeof(diskHeader)
! 		 || diskHeader.stamp.magic != VOLUMEHEADERMAGIC) {
  	Log("VAttachVolume: Error reading volume header %s\n", path);
  	*ec = VSALVAGE;
  	goto done;
--- 610,629 ----
      strcpy(path, VPartitionPath(partp));
      strcat(path, "/");
      strcat(path, name);
!     VOL_UNLOCK;
!     if ((fd = afs_open(path, O_RDONLY)) == -1 || afs_fstat(fd, &status) == -1) {
  	Log("VAttachVolume: Failed to open %s (errno %d)\n", path, errno);
  	if (fd > -1)
  	    close(fd);
! 	VOL_LOCK;
! 	*ec = VNOVOL;
  	goto done;
      }
      n = read(fd, &diskHeader, sizeof(diskHeader));
      close(fd);
!     VOL_LOCK;
!     if (n != sizeof(diskHeader)
! 	|| diskHeader.stamp.magic != VOLUMEHEADERMAGIC) {
  	Log("VAttachVolume: Error reading volume header %s\n", path);
  	*ec = VSALVAGE;
  	goto done;
***************
*** 711,717 ****
  {
      register Volume *vp;
  
!     VOL_UNLOCK vp = (Volume *) calloc(1, sizeof(Volume));
      assert(vp != NULL);
      vp->specialStatus = (byte) (isbusy ? VBUSY : 0);
      vp->device = partp->device;
--- 722,729 ----
  {
      register Volume *vp;
  
!     VOL_UNLOCK;
!     vp = (Volume *) calloc(1, sizeof(Volume));
      assert(vp != NULL);
      vp->specialStatus = (byte) (isbusy ? VBUSY : 0);
      vp->device = partp->device;
***************
*** 730,740 ****
      vp->shuttingDown = 0;
      vp->goingOffline = 0;
      vp->nUsers = 1;
!     VOL_LOCK GetVolumeHeader(vp);
!     VOL_UNLOCK(void) ReadHeader(ec, V_diskDataHandle(vp), (char *)&V_disk(vp),
! 				sizeof(V_disk(vp)), VOLUMEINFOMAGIC,
! 				VOLUMEINFOVERSION);
!     VOL_LOCK if (*ec) {
  	Log("VAttachVolume: Error reading diskDataHandle vol header %s; error=%u\n", path, *ec);
      }
      if (!*ec) {
--- 742,754 ----
      vp->shuttingDown = 0;
      vp->goingOffline = 0;
      vp->nUsers = 1;
!     VOL_LOCK;
!     GetVolumeHeader(vp);
!     VOL_UNLOCK;
!     (void)ReadHeader(ec, V_diskDataHandle(vp), (char *)&V_disk(vp),
! 		     sizeof(V_disk(vp)), VOLUMEINFOMAGIC, VOLUMEINFOVERSION);
!     VOL_LOCK;
!     if (*ec) {
  	Log("VAttachVolume: Error reading diskDataHandle vol header %s; error=%u\n", path, *ec);
      }
      if (!*ec) {
***************
*** 751,779 ****
  	    V_stat_initialized(vp) = 1;
  	}
  #endif /* OPENAFS_VOL_STATS */
! 	VOL_UNLOCK(void) ReadHeader(ec, vp->vnodeIndex[vSmall].handle,
! 				    (char *)&iHead, sizeof(iHead),
! 				    SMALLINDEXMAGIC, SMALLINDEXVERSION);
! 	VOL_LOCK if (*ec) {
  	    Log("VAttachVolume: Error reading smallVnode vol header %s; error=%u\n", path, *ec);
  	}
      }
      if (!*ec) {
  	struct IndexFileHeader iHead;
! 	VOL_UNLOCK(void) ReadHeader(ec, vp->vnodeIndex[vLarge].handle,
! 				    (char *)&iHead, sizeof(iHead),
! 				    LARGEINDEXMAGIC, LARGEINDEXVERSION);
! 	VOL_LOCK if (*ec) {
  	    Log("VAttachVolume: Error reading largeVnode vol header %s; error=%u\n", path, *ec);
  	}
      }
  #ifdef AFS_NAMEI_ENV
      if (!*ec) {
  	struct versionStamp stamp;
! 	VOL_UNLOCK(void) ReadHeader(ec, V_linkHandle(vp), (char *)&stamp,
! 				    sizeof(stamp), LINKTABLEMAGIC,
! 				    LINKTABLEVERSION);
! 	VOL_LOCK if (*ec) {
  	    Log("VAttachVolume: Error reading namei vol header %s; error=%u\n", path, *ec);
  	}
      }
--- 765,798 ----
  	    V_stat_initialized(vp) = 1;
  	}
  #endif /* OPENAFS_VOL_STATS */
! 	VOL_UNLOCK;
! 	(void)ReadHeader(ec, vp->vnodeIndex[vSmall].handle,
! 			 (char *)&iHead, sizeof(iHead),
! 			 SMALLINDEXMAGIC, SMALLINDEXVERSION);
! 	VOL_LOCK;
! 	if (*ec) {
  	    Log("VAttachVolume: Error reading smallVnode vol header %s; error=%u\n", path, *ec);
  	}
      }
      if (!*ec) {
  	struct IndexFileHeader iHead;
! 	VOL_UNLOCK;
! 	(void)ReadHeader(ec, vp->vnodeIndex[vLarge].handle,
! 			 (char *)&iHead, sizeof(iHead),
! 			 LARGEINDEXMAGIC, LARGEINDEXVERSION);
! 	VOL_LOCK;
! 	if (*ec) {
  	    Log("VAttachVolume: Error reading largeVnode vol header %s; error=%u\n", path, *ec);
  	}
      }
  #ifdef AFS_NAMEI_ENV
      if (!*ec) {
  	struct versionStamp stamp;
! 	VOL_UNLOCK;
! 	(void)ReadHeader(ec, V_linkHandle(vp), (char *)&stamp,
! 			 sizeof(stamp), LINKTABLEMAGIC, LINKTABLEVERSION);
! 	VOL_LOCK;
! 	if (*ec) {
  	    Log("VAttachVolume: Error reading namei vol header %s; error=%u\n", path, *ec);
  	}
      }
***************
*** 819,826 ****
      if (programType == fileServer && VolumeWriteable(vp)) {
  	int i;
  	for (i = 0; i < nVNODECLASSES; i++) {
! 	    VOL_UNLOCK GetBitmap(ec, vp, i);
! 	    VOL_LOCK if (*ec) {
  		FreeVolume(vp);
  		Log("VAttachVolume: error getting bitmap for volume (%s)\n",
  		    path);
--- 838,847 ----
      if (programType == fileServer && VolumeWriteable(vp)) {
  	int i;
  	for (i = 0; i < nVNODECLASSES; i++) {
! 	    VOL_UNLOCK;
! 	    GetBitmap(ec, vp, i);
! 	    VOL_LOCK;
! 	    if (*ec) {
  		FreeVolume(vp);
  		Log("VAttachVolume: error getting bitmap for volume (%s)\n",
  		    path);
***************
*** 851,858 ****
  VAttachVolume(Error * ec, VolumeId volumeId, int mode)
  {
      Volume *retVal;
!     VATTACH_LOCK VOL_LOCK retVal = VAttachVolume_r(ec, volumeId, mode);
!     VOL_UNLOCK VATTACH_UNLOCK return retVal;
  }
  
  Volume *
--- 872,883 ----
  VAttachVolume(Error * ec, VolumeId volumeId, int mode)
  {
      Volume *retVal;
!     VATTACH_LOCK;
!     VOL_LOCK;
!     retVal = VAttachVolume_r(ec, volumeId, mode);
!     VOL_UNLOCK;
!     VATTACH_UNLOCK;
!     return retVal;
  }
  
  Volume *
***************
*** 901,908 ****
  VHold(register Volume * vp)
  {
      int retVal;
!     VOL_LOCK retVal = VHold_r(vp);
!     VOL_UNLOCK return retVal;
  }
  
  void
--- 926,935 ----
  VHold(register Volume * vp)
  {
      int retVal;
!     VOL_LOCK;
!     retVal = VHold_r(vp);
!     VOL_UNLOCK;
!     return retVal;
  }
  
  void
***************
*** 917,924 ****
  void
  VTakeOffline(register Volume * vp)
  {
!     VOL_LOCK VTakeOffline_r(vp);
! VOL_UNLOCK}
  
  void
  VPutVolume_r(register Volume * vp)
--- 944,953 ----
  void
  VTakeOffline(register Volume * vp)
  {
!     VOL_LOCK;
!     VTakeOffline_r(vp);
!     VOL_UNLOCK;
! }
  
  void
  VPutVolume_r(register Volume * vp)
***************
*** 962,969 ****
  void
  VPutVolume(register Volume * vp)
  {
!     VOL_LOCK VPutVolume_r(vp);
! VOL_UNLOCK}
  
  /* Get a pointer to an attached volume.  The pointer is returned regardless
     of whether or not the volume is in service or on/off line.  An error
--- 991,1000 ----
  void
  VPutVolume(register Volume * vp)
  {
!     VOL_LOCK;
!     VPutVolume_r(vp);
!     VOL_UNLOCK;
! }
  
  /* Get a pointer to an attached volume.  The pointer is returned regardless
     of whether or not the volume is in service or on/off line.  An error
***************
*** 972,979 ****
  VGetVolume(Error * ec, VolId volumeId)
  {
      Volume *retVal;
!     VOL_LOCK retVal = VGetVolume_r(ec, volumeId);
!     VOL_UNLOCK return retVal;
  }
  
  Volume *
--- 1003,1012 ----
  VGetVolume(Error * ec, VolId volumeId)
  {
      Volume *retVal;
!     VOL_LOCK;
!     retVal = VGetVolume_r(ec, volumeId);
!     VOL_UNLOCK;
!     return retVal;
  }
  
  Volume *
***************
*** 1126,1133 ****
  void
  VForceOffline(Volume * vp)
  {
!     VOL_LOCK VForceOffline_r(vp);
! VOL_UNLOCK}
  
  /* The opposite of VAttachVolume.  The volume header is written to disk, with
     the inUse bit turned off.  A copy of the header is maintained in memory,
--- 1159,1168 ----
  void
  VForceOffline(Volume * vp)
  {
!     VOL_LOCK;
!     VForceOffline_r(vp);
!     VOL_UNLOCK;
! }
  
  /* The opposite of VAttachVolume.  The volume header is written to disk, with
     the inUse bit turned off.  A copy of the header is maintained in memory,
***************
*** 1156,1163 ****
  void
  VOffline(Volume * vp, char *message)
  {
!     VOL_LOCK VOffline_r(vp, message);
! VOL_UNLOCK}
  
  /* For VDetachVolume, we close all cached file descriptors, but keep
   * the Inode handles in case we need to read from a busy volume.
--- 1191,1200 ----
  void
  VOffline(Volume * vp, char *message)
  {
!     VOL_LOCK;
!     VOffline_r(vp, message);
!     VOL_UNLOCK;
! }
  
  /* For VDetachVolume, we close all cached file descriptors, but keep
   * the Inode handles in case we need to read from a busy volume.
***************
*** 1237,1244 ****
  void
  VDetachVolume(Error * ec, Volume * vp)
  {
!     VOL_LOCK VDetachVolume_r(ec, vp);
! VOL_UNLOCK}
  
  
  VnodeId
--- 1274,1283 ----
  void
  VDetachVolume(Error * ec, Volume * vp)
  {
!     VOL_LOCK;
!     VDetachVolume_r(ec, vp);
!     VOL_UNLOCK;
! }
  
  
  VnodeId
***************
*** 1262,1280 ****
  					 * from AddNewReadableResidency */
  		wasVBUSY = 1;
  	    } else {
! 		VOL_UNLOCK while (vp->specialStatus == VBUSY)
  #ifdef AFS_PTHREAD_ENV
  		    sleep(2);
  #else /* AFS_PTHREAD_ENV */
  		    IOMGR_Sleep(2);
  #endif /* AFS_PTHREAD_ENV */
! 	    VOL_LOCK}
  	}
  	if (!index->bitmap) {
  	    vp->specialStatus = VBUSY;	/* Stop anyone else from using it. */
  	    for (i = 0; i < nVNODECLASSES; i++) {
! 		VOL_UNLOCK GetBitmap(ec, vp, i);
! 		VOL_LOCK if (*ec) {
  		    vp->specialStatus = 0;
  		    vp->shuttingDown = 1;	/* Let who has it free it. */
  		    return NULL;
--- 1301,1323 ----
  					 * from AddNewReadableResidency */
  		wasVBUSY = 1;
  	    } else {
! 		VOL_UNLOCK;
! 		while (vp->specialStatus == VBUSY)
  #ifdef AFS_PTHREAD_ENV
  		    sleep(2);
  #else /* AFS_PTHREAD_ENV */
  		    IOMGR_Sleep(2);
  #endif /* AFS_PTHREAD_ENV */
! 		VOL_LOCK;
! 	    }
  	}
  	if (!index->bitmap) {
  	    vp->specialStatus = VBUSY;	/* Stop anyone else from using it. */
  	    for (i = 0; i < nVNODECLASSES; i++) {
! 		VOL_UNLOCK;
! 		GetBitmap(ec, vp, i);
! 		VOL_LOCK;
! 		if (*ec) {
  		    vp->specialStatus = 0;
  		    vp->shuttingDown = 1;	/* Let who has it free it. */
  		    return NULL;
***************
*** 1316,1323 ****
  VAllocBitmapEntry(Error * ec, Volume * vp, register struct vnodeIndex * index)
  {
      VnodeId retVal;
!     VOL_LOCK retVal = VAllocBitmapEntry_r(ec, vp, index);
!     VOL_UNLOCK return retVal;
  }
  
  void
--- 1359,1368 ----
  VAllocBitmapEntry(Error * ec, Volume * vp, register struct vnodeIndex * index)
  {
      VnodeId retVal;
!     VOL_LOCK;
!     retVal = VAllocBitmapEntry_r(ec, vp, index);
!     VOL_UNLOCK;
!     return retVal;
  }
  
  void
***************
*** 1344,1351 ****
  VFreeBitMapEntry(Error * ec, register struct vnodeIndex *index,
  		 unsigned bitNumber)
  {
!     VOL_LOCK VFreeBitMapEntry_r(ec, index, bitNumber);
! VOL_UNLOCK}
  
  void
  VUpdateVolume_r(Error * ec, Volume * vp)
--- 1389,1398 ----
  VFreeBitMapEntry(Error * ec, register struct vnodeIndex *index,
  		 unsigned bitNumber)
  {
!     VOL_LOCK;
!     VFreeBitMapEntry_r(ec, index, bitNumber);
!     VOL_UNLOCK;
! }
  
  void
  VUpdateVolume_r(Error * ec, Volume * vp)
***************
*** 1367,1374 ****
  void
  VUpdateVolume(Error * ec, Volume * vp)
  {
!     VOL_LOCK VUpdateVolume_r(ec, vp);
! VOL_UNLOCK}
  
  void
  VSyncVolume_r(Error * ec, Volume * vp)
--- 1414,1423 ----
  void
  VUpdateVolume(Error * ec, Volume * vp)
  {
!     VOL_LOCK;
!     VUpdateVolume_r(ec, vp);
!     VOL_UNLOCK;
! }
  
  void
  VSyncVolume_r(Error * ec, Volume * vp)
***************
*** 1388,1395 ****
  void
  VSyncVolume(Error * ec, Volume * vp)
  {
!     VOL_LOCK VSyncVolume_r(ec, vp);
! VOL_UNLOCK}
  
  static void
  FreeVolume(Volume * vp)
--- 1437,1446 ----
  void
  VSyncVolume(Error * ec, Volume * vp)
  {
!     VOL_LOCK;
!     VSyncVolume_r(ec, vp);
!     VOL_UNLOCK;
! }
  
  static void
  FreeVolume(Volume * vp)
***************
*** 1609,1616 ****
  VAdjustVolumeStatistics(register Volume * vp)
  {
      int retVal;
!     VOL_LOCK retVal = VAdjustVolumeStatistics_r(vp);
!     VOL_UNLOCK return retVal;
  }
  
  void
--- 1660,1669 ----
  VAdjustVolumeStatistics(register Volume * vp)
  {
      int retVal;
!     VOL_LOCK;
!     retVal = VAdjustVolumeStatistics_r(vp);
!     VOL_UNLOCK;
!     return retVal;
  }
  
  void
***************
*** 1631,1638 ****
  void
  VBumpVolumeUsage(register Volume * vp)
  {
!     VOL_LOCK VBumpVolumeUsage_r(vp);
! VOL_UNLOCK}
  
  void
  VSetDiskUsage_r(void)
--- 1684,1693 ----
  void
  VBumpVolumeUsage(register Volume * vp)
  {
!     VOL_LOCK;
!     VBumpVolumeUsage_r(vp);
!     VOL_UNLOCK;
! }
  
  void
  VSetDiskUsage_r(void)
***************
*** 1660,1667 ****
  void
  VSetDiskUsage(void)
  {
!     VOL_LOCK VSetDiskUsage_r();
! VOL_UNLOCK}
  
  /* The number of minutes that a volume hasn't been updated before the
   * "Dont salvage" flag in the volume header will be turned on */
--- 1715,1724 ----
  void
  VSetDiskUsage(void)
  {
!     VOL_LOCK;
!     VSetDiskUsage_r();
!     VOL_UNLOCK;
! }
  
  /* The number of minutes that a volume hasn't been updated before the
   * "Dont salvage" flag in the volume header will be turned on */
***************
*** 1883,1887 ****
  void
  VPrintCacheStats(void)
  {
!     VOL_LOCK VPrintCacheStats_r();
! VOL_UNLOCK}
--- 1940,1946 ----
  void
  VPrintCacheStats(void)
  {
!     VOL_LOCK;
!     VPrintCacheStats_r();
!     VOL_UNLOCK;
! }
Index: openafs/src/vol/volume.h
diff -c openafs/src/vol/volume.h:1.14 openafs/src/vol/volume.h:1.14.2.1
*** openafs/src/vol/volume.h:1.14	Fri Nov 21 21:43:19 2003
--- openafs/src/vol/volume.h	Wed Aug 25 03:14:19 2004
***************
*** 35,55 ****
  extern pthread_cond_t vol_put_volume_cond;
  extern pthread_cond_t vol_sleep_cond;
  #define VATTACH_LOCK \
!     assert(pthread_mutex_lock(&vol_attach_mutex) == 0);
  #define VATTACH_UNLOCK \
!     assert(pthread_mutex_unlock(&vol_attach_mutex) == 0);
  #define VOL_LOCK \
!     assert(pthread_mutex_lock(&vol_glock_mutex) == 0);
  #define VOL_UNLOCK \
!     assert(pthread_mutex_unlock(&vol_glock_mutex) == 0);
  #define VFSYNC_LOCK \
!     assert(pthread_mutex_lock(&vol_fsync_mutex) == 0);
  #define VFSYNC_UNLOCK \
!     assert(pthread_mutex_unlock(&vol_fsync_mutex) == 0);
  #define VTRANS_LOCK \
!     assert(pthread_mutex_lock(&vol_trans_mutex) == 0);
  #define VTRANS_UNLOCK \
!     assert(pthread_mutex_unlock(&vol_trans_mutex) == 0);
  #else /* AFS_PTHREAD_ENV */
  #define VATTACH_LOCK
  #define VATTACH_UNLOCK
--- 35,55 ----
  extern pthread_cond_t vol_put_volume_cond;
  extern pthread_cond_t vol_sleep_cond;
  #define VATTACH_LOCK \
!     assert(pthread_mutex_lock(&vol_attach_mutex) == 0)
  #define VATTACH_UNLOCK \
!     assert(pthread_mutex_unlock(&vol_attach_mutex) == 0)
  #define VOL_LOCK \
!     assert(pthread_mutex_lock(&vol_glock_mutex) == 0)
  #define VOL_UNLOCK \
!     assert(pthread_mutex_unlock(&vol_glock_mutex) == 0)
  #define VFSYNC_LOCK \
!     assert(pthread_mutex_lock(&vol_fsync_mutex) == 0)
  #define VFSYNC_UNLOCK \
!     assert(pthread_mutex_unlock(&vol_fsync_mutex) == 0)
  #define VTRANS_LOCK \
!     assert(pthread_mutex_lock(&vol_trans_mutex) == 0)
  #define VTRANS_UNLOCK \
!     assert(pthread_mutex_unlock(&vol_trans_mutex) == 0)
  #else /* AFS_PTHREAD_ENV */
  #define VATTACH_LOCK
  #define VATTACH_UNLOCK
Index: openafs/src/vol/vutil.c
diff -c openafs/src/vol/vutil.c:1.15 openafs/src/vol/vutil.c:1.15.2.1
*** openafs/src/vol/vutil.c:1.15	Sat Nov 29 16:38:05 2003
--- openafs/src/vol/vutil.c	Wed Aug 25 03:14:19 2004
***************
*** 18,24 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/vutil.c,v 1.15 2003/11/29 21:38:05 jaltman Exp $");
  
  #include <stdio.h>
  #include <sys/types.h>
--- 18,24 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/vutil.c,v 1.15.2.1 2004/08/25 07:14:19 shadow Exp $");
  
  #include <stdio.h>
  #include <sys/types.h>
***************
*** 109,116 ****
  {				/* Should be the same as volumeId if there is
  				 * no parent */
      Volume *retVal;
!     VOL_LOCK retVal = VCreateVolume_r(ec, partname, volumeId, parentId);
!     VOL_UNLOCK return retVal;
  }
  
  Volume *
--- 109,118 ----
  {				/* Should be the same as volumeId if there is
  				 * no parent */
      Volume *retVal;
!     VOL_LOCK;
!     retVal = VCreateVolume_r(ec, partname, volumeId, parentId);
!     VOL_UNLOCK;
!     return retVal;
  }
  
  Volume *
***************
*** 289,296 ****
  void
  AssignVolumeName(register VolumeDiskData * vol, char *name, char *ext)
  {
!     VOL_LOCK AssignVolumeName_r(vol, name, ext);
! VOL_UNLOCK}
  
  void
  AssignVolumeName_r(register VolumeDiskData * vol, char *name, char *ext)
--- 291,300 ----
  void
  AssignVolumeName(register VolumeDiskData * vol, char *name, char *ext)
  {
!     VOL_LOCK;
!     AssignVolumeName_r(vol, name, ext);
!     VOL_UNLOCK;
! }
  
  void
  AssignVolumeName_r(register VolumeDiskData * vol, char *name, char *ext)
***************
*** 335,349 ****
  {
      afs_int32 code;
  
!     VOL_LOCK code = CopyVolumeHeader_r(from, to);
!     VOL_UNLOCK return (code);
  }
  
  void
  ClearVolumeStats(register VolumeDiskData * vol)
  {
!     VOL_LOCK ClearVolumeStats_r(vol);
! VOL_UNLOCK}
  
  void
  ClearVolumeStats_r(register VolumeDiskData * vol)
--- 339,357 ----
  {
      afs_int32 code;
  
!     VOL_LOCK;
!     code = CopyVolumeHeader_r(from, to);
!     VOL_UNLOCK;
!     return (code);
  }
  
  void
  ClearVolumeStats(register VolumeDiskData * vol)
  {
!     VOL_LOCK;
!     ClearVolumeStats_r(vol);
!     VOL_UNLOCK;
! }
  
  void
  ClearVolumeStats_r(register VolumeDiskData * vol)
Index: openafs/src/volser/vos.c
diff -c openafs/src/volser/vos.c:1.40 openafs/src/volser/vos.c:1.40.2.1
*** openafs/src/volser/vos.c:1.40	Thu Jul 29 14:51:20 2004
--- openafs/src/volser/vos.c	Tue Aug 17 00:28:45 2004
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/volser/vos.c,v 1.40 2004/07/29 18:51:20 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/volser/vos.c,v 1.40.2.1 2004/08/17 04:28:45 jaltman Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
***************
*** 3356,3362 ****
  SyncVldb(as)
       register struct cmd_syndesc *as;
  {
!     afs_int32 pnum, code;	/* part name */
      char part[10];
      int flags = 0;
      char *volname = 0;
--- 3356,3362 ----
  SyncVldb(as)
       register struct cmd_syndesc *as;
  {
!     afs_int32 pnum = 0, code;	/* part name */
      char part[10];
      int flags = 0;
      char *volname = 0;
