From aab5fc6ecd53449a01a686b8d77fea9499cc55d4 Mon Sep 17 00:00:00 2001 From: Jeff Riegel Date: Sat, 23 Jun 2001 18:29:56 +0000 Subject: [PATCH] winnt-win2000-win98-afs-client-updates-20010623 updates for nt/2000 and 95/98 afs clients ==================== This delta was composed from multiple commits as part of the CVS->Git migration. The checkin message with each commit was inconsistent. The following are the additional commit messages. ==================== binary file updates --- src/NTMake9x | 2 +- src/WINNT/afsd/NTMakefile | 1 + src/WINNT/afsd/afsd_init.c | 4 +- src/WINNT/afsd/afsd_init95.c | 4 +- src/WINNT/afsd/afsd_service.c | 17 + src/WINNT/afsd/cm_ioctl.c | 5 + src/WINNT/afsd/cm_user.c | 11 +- src/WINNT/afsd/netbios95.h | 7 + src/WINNT/afsd/smb.c | 599 ++++++++++++++++----- src/WINNT/afsd/smb.h | 25 +- src/WINNT/afsd/smb3.c | 296 +++++----- src/WINNT/afsd/smb_ioctl.c | 42 +- .../install/InstallShield5/CreateISDirTree.bat | 47 +- src/WINNT/install/InstallShield5/Default.rge | 97 ++-- src/WINNT/install/InstallShield5/GenFileGroups.bat | 59 +- src/WINNT/install/InstallShield5/NTMakefile | 15 +- src/WINNT/install/InstallShield5/afsdcell.ini | 2 - .../install/InstallShield5/lang/en_US/value.shl | 22 +- src/WINNT/install/InstallShield5/setup.bmp | Bin 60214 -> 399222 bytes src/WINNT/install/InstallShield5/setup.rul | 19 +- src/WINNT/install/Win9x/NTMakeFile | 19 +- src/WINNT/license/lang/en_US.ide | Bin 4802 -> 604 bytes src/WINNT/pthread/NTMakefile | 6 +- src/WINNT/win9xpanel/NTMakefile | 9 +- src/config/Makefile.i386_djgpp | 4 +- src/config/NTMakefile | 74 ++- src/config/NTMakefile.i386_nt40 | 1 + src/config/NTMakefile.i386_win95 | 2 +- src/config/util_cr.c | 36 +- src/kauth/krb_udp.c | 1 + src/lwp/process.s | 33 +- src/rmbat.bat | 4 +- src/rmbat.rsp | 2 +- src/rx/Makefile | 4 +- src/sys/pioctl_nt.c | 4 +- src/tbutc/NTMakefile | 6 +- 36 files changed, 983 insertions(+), 496 deletions(-) diff --git a/src/NTMake9x b/src/NTMake9x index 0676d63..8b84b89 100644 --- a/src/NTMake9x +++ b/src/NTMake9x @@ -23,7 +23,7 @@ NTMAKELANG = nmake /nologo /f ntmakefile en_install NTMAKE_HEADERS = nmake /nologo /f ntmakefile install_headers NTMAKE_LIBUTILS = nmake /nologo /f ntmakefile install_libutils MKDIR = mkdir -OBJ = src +#OBJ = src # Standard install directory. !IFDEF AFSDEV_DESTDIR diff --git a/src/WINNT/afsd/NTMakefile b/src/WINNT/afsd/NTMakefile index 96e05b9..e8e33da 100644 --- a/src/WINNT/afsd/NTMakefile +++ b/src/WINNT/afsd/NTMakefile @@ -30,6 +30,7 @@ INCFILES =\ $(INCFILEDIR)\fs_utils.h \ $(INCFILEDIR)\krb.h \ $(INCFILEDIR)\krb_prot.h \ + $(INCFILEDIR)\cm_dir.h \ $(INCFILEDIR)\smb.h \ $(INCFILEDIR)\smb3.h \ $(INCFILEDIR)\smb_iocons.h \ diff --git a/src/WINNT/afsd/afsd_init.c b/src/WINNT/afsd/afsd_init.c index f7c7fec..48cecb4 100644 --- a/src/WINNT/afsd/afsd_init.c +++ b/src/WINNT/afsd/afsd_init.c @@ -210,8 +210,8 @@ int afsd_InitCM(char **reasonP) if (code == ERROR_SUCCESS) afsi_log("LAN adapter number %d", LANadapter); else { - LANadapter = 0; - afsi_log("Default LAN adapter number 0"); + LANadapter = -1; + afsi_log("Default LAN adapter number"); } dummyLen = sizeof(cacheSize); diff --git a/src/WINNT/afsd/afsd_init95.c b/src/WINNT/afsd/afsd_init95.c index 777b4c9..602255f 100644 --- a/src/WINNT/afsd/afsd_init95.c +++ b/src/WINNT/afsd/afsd_init95.c @@ -362,8 +362,8 @@ int afsd_InitCM(char **reasonP, struct cmd_syndesc *as, char *arock) } else { - LANadapter = 0; - afsi_log("Default LAN adapter number 0"); + LANadapter = -1; + afsi_log("Default LAN adapter number"); } if (as->parms[1].items) { diff --git a/src/WINNT/afsd/afsd_service.c b/src/WINNT/afsd/afsd_service.c index b8f9b5d..3df9c7f 100644 --- a/src/WINNT/afsd/afsd_service.c +++ b/src/WINNT/afsd/afsd_service.c @@ -20,6 +20,10 @@ #include #include + +#ifdef DEBUG +//#define NOTSERVICE +#endif extern void afsi_log(char *pattern, ...); @@ -186,6 +190,7 @@ void afsd_Main() WaitToTerminate = CreateEvent(NULL, TRUE, FALSE, NULL); +#ifndef NOTSERVICE StatusHandle = RegisterServiceCtrlHandler(AFS_DAEMON_SERVICE_NAME, (LPHANDLER_FUNCTION) afsd_ServiceControlHandler); @@ -197,6 +202,7 @@ void afsd_Main() ServiceStatus.dwWaitHint = 15000; ServiceStatus.dwControlsAccepted = 0; SetServiceStatus(StatusHandle, &ServiceStatus); +#endif { HANDLE h; char *ptbuf[1]; h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); @@ -223,12 +229,14 @@ void afsd_Main() if (code != 0) osi_panic(reason, __FILE__, __LINE__); +#ifndef NOTSERVICE ServiceStatus.dwCurrentState = SERVICE_RUNNING; ServiceStatus.dwWin32ExitCode = NO_ERROR; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; SetServiceStatus(StatusHandle, &ServiceStatus); +#endif { HANDLE h; char *ptbuf[1]; h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); @@ -261,6 +269,14 @@ void afsd_Main() SetServiceStatus(StatusHandle, &ServiceStatus); } +#ifdef NOTSERVICE +void main() +{ + afsd_Main(); + Sleep(1000); + return ; +} +#else void _CRTAPI1 main() { LONG status = ERROR_SUCCESS; @@ -272,3 +288,4 @@ void _CRTAPI1 main() if (!StartServiceCtrlDispatcher(dispatchTable)) status = GetLastError(); } +#endif diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index 2de6df1..58d8873 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -1393,6 +1393,11 @@ long cm_IoctlSetToken(struct smb_ioctl *ioctlp, struct cm_user *userp) } else cellp = cm_rootCellp; + if (flags & PIOCTL_LOGON) { + userp = smb_FindCMUserByName(/*ioctlp->fidp->vcp,*/ uname, + ioctlp->fidp->vcp->rname); + } + /* store the token */ lock_ObtainMutex(&userp->mx); ucellp = cm_GetUCell(userp, cellp); diff --git a/src/WINNT/afsd/cm_user.c b/src/WINNT/afsd/cm_user.c index 51803c3..471f47c 100644 --- a/src/WINNT/afsd/cm_user.c +++ b/src/WINNT/afsd/cm_user.c @@ -145,7 +145,7 @@ void cm_CheckTokenCache(long now) extern smb_vc_t *smb_allVCsp; /* global vcp list */ smb_vc_t *vcp; smb_user_t *usersp; - cm_user_t *userp; + cm_user_t *userp = NULL; cm_ucell_t *ucellp; BOOL bExpired=FALSE; @@ -154,9 +154,12 @@ void cm_CheckTokenCache(long now) */ lock_ObtainWrite(&smb_rctLock); for(vcp=smb_allVCsp; vcp; vcp=vcp->nextp) { - for(usersp=vcp->usersp; usersp; usersp=usersp->nextp) { - userp=usersp->userp; - osi_assert(userp); + for(usersp=vcp->usersp; usersp; usersp=usersp->nextp) { + if (usersp->unp) { + if ((userp=usersp->unp->userp)==0) + continue; + } else + continue; lock_ObtainMutex(&userp->mx); for(ucellp=userp->cellInfop; ucellp; ucellp=ucellp->nextp) { if(ucellp->flags & CM_UCELLFLAG_RXKAD) { diff --git a/src/WINNT/afsd/netbios95.h b/src/WINNT/afsd/netbios95.h index c70c855..5fd7e66 100644 --- a/src/WINNT/afsd/netbios95.h +++ b/src/WINNT/afsd/netbios95.h @@ -44,6 +44,13 @@ typedef struct _NCB { EVENT_HANDLE ncb_event; } NCB, *PNCB; +/* this struct is returned by NCBENUM command in Win32 but is not available + in DJGPP. */ +typedef struct { + int length; + int lana[8]; +} LANA_ENUM; + #define NCBCALL 0x10 #define NCBLISTEN 0x11 diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index 171f936..5a03d90 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -7,6 +7,8 @@ * directory or online at http://www.openafs.org/dl/license10.html */ +//#define NOSERVICE 1 + #include #include @@ -61,8 +63,9 @@ osi_hyper_t hones = {0xFFFFFFFF, -1}; osi_log_t *smb_logp; osi_rwlock_t smb_globalLock; osi_rwlock_t smb_rctLock; - -unsigned char smb_LANadapter; +osi_rwlock_t smb_ListenerLock; + +char smb_LANadapter; unsigned char smb_sharename[NCBNAMSZ+1] = {0}; /* for debugging */ @@ -88,7 +91,9 @@ struct smb_packet *bufs[NCBmax]; #define Sessionmax 100 EVENT_HANDLE SessionEvents[Sessionmax]; unsigned short LSNs[Sessionmax]; +int lanas[Sessionmax]; BOOL dead_sessions[Sessionmax]; +LANA_ENUM lana_list; /* for raw I/O */ osi_mutex_t smb_RawBufLock; @@ -142,6 +147,8 @@ char *smb_localNamep; smb_vc_t *smb_allVCsp; +smb_username_t *usernamesp = NULL; + smb_waitingLock_t *smb_allWaitingLocks; /* forward decl */ @@ -170,7 +177,145 @@ extern char cm_confDir[]; #define EXPIREDATE 834000000 /* Wed Jun 5 1996 */ +char * myCrt_Dispatch(int i) +{ + switch (i) + { + default: + return "unknown SMB op"; + case 0x00: + return "(00)ReceiveCoreMakeDir"; + case 0x01: + return "(01)ReceiveCoreRemoveDir"; + case 0x02: + return "(02)ReceiveCoreOpen"; + case 0x03: + return "(03)ReceiveCoreCreate"; + case 0x04: + return "(04)ReceiveCoreClose"; + case 0x05: + return "(05)ReceiveCoreFlush"; + case 0x06: + return "(06)ReceiveCoreUnlink"; + case 0x07: + return "(07)ReceiveCoreRename"; + case 0x08: + return "(08)ReceiveCoreGetFileAttributes"; + case 0x09: + return "(09)ReceiveCoreSetFileAttributes"; + case 0x0a: + return "(0a)ReceiveCoreRead"; + case 0x0b: + return "(0b)ReceiveCoreWrite"; + case 0x0c: + return "(0c)ReceiveCoreLockRecord"; + case 0x0d: + return "(0d)ReceiveCoreUnlockRecord"; + case 0x0e: + return "(0e)SendCoreBadOp"; + case 0x0f: + return "(0f)ReceiveCoreCreate"; + case 0x10: + return "(10)ReceiveCoreCheckPath"; + case 0x11: + return "(11)SendCoreBadOp"; + case 0x12: + return "(12)ReceiveCoreSeek"; + case 0x1a: + return "(1a)ReceiveCoreReadRaw"; + case 0x1d: + return "(1d)ReceiveCoreWriteRawDummy"; + case 0x22: + return "(22)ReceiveV3SetAttributes"; + case 0x23: + return "(23)ReceiveV3GetAttributes"; + case 0x24: + return "(24)ReceiveV3LockingX"; + case 0x29: + return "(29)SendCoreBadOp"; + case 0x2b: + return "(2b)ReceiveCoreEcho"; + case 0x2d: + return "(2d)ReceiveV3OpenX"; + case 0x2e: + return "(2e)ReceiveV3ReadX"; + case 0x32: + return "(32)ReceiveV3Tran2A"; + case 0x33: + return "(33)ReceiveV3Tran2A"; + case 0x34: + return "(34)ReceiveV3FindClose"; + case 0x35: + return "(35)ReceiveV3FindNotifyClose"; + case 0x70: + return "(70)ReceiveCoreTreeConnect"; + case 0x71: + return "(71)ReceiveCoreTreeDisconnect"; + case 0x72: + return "(72)ReceiveNegotiate"; + case 0x73: + return "(73)ReceiveV3SessionSetupX"; + case 0x74: + return "(74)ReceiveV3UserLogoffX"; + case 0x75: + return "(75)ReceiveV3TreeConnectX"; + case 0x80: + return "(80)ReceiveCoreGetDiskAttributes"; + case 0x81: + return "(81)ReceiveCoreSearchDir"; + case 0xA0: + return "(A0)ReceiveNTTransact"; + case 0xA2: + return "(A2)ReceiveNTCreateX"; + case 0xA4: + return "(A4)ReceiveNTCancel"; + case 0xc0: + return "(c0)SendCoreBadOp"; + case 0xc1: + return "(c1)SendCoreBadOp"; + case 0xc2: + return "(c2)SendCoreBadOp"; + case 0xc3: + return "(c3)SendCoreBadOp"; + } +} +char * myCrt_2Dispatch(int i) +{ + switch (i) + { + default: + return "unknown SMB op-2"; + case 0: + return "S(00)CreateFile"; + case 1: + return "S(01)FindFirst"; + case 2: + return "S(02)FindNext"; /* FindNext */ + case 3: + return "S(03)QueryFileSystem_ReceiveTran2QFSInfo"; + case 4: + return "S(04)??"; + case 5: + return "S(05)QueryFileInfo_ReceiveTran2QPathInfo"; + case 6: + return "S(06)SetFileInfo_ReceiveTran2SetPathInfo"; + case 7: + return "S(07)SetInfoHandle_ReceiveTran2QFileInfo"; + case 8: + return "S(08)??_ReceiveTran2SetFileInfo"; + case 9: + return "S(09)??_ReceiveTran2FSCTL"; + case 10: + return "S(0a)_ReceiveTran2IOCTL"; + case 11: + return "S(0b)_ReceiveTran2FindNotifyFirst"; + case 12: + return "S(0c)_ReceiveTran2FindNotifyNext"; + case 13: + return "S(0d)CreateDirectory_ReceiveTran2MKDir"; + } +} /* scache must be locked */ unsigned int smb_Attributes(cm_scache_t *scp) @@ -521,13 +666,13 @@ void smb_UnixTimeFromDosUTime(long *unixTimep, long dosTime) #endif /* !DJGPP */ } -smb_vc_t *smb_FindVC(unsigned short lsn, int flags) +smb_vc_t *smb_FindVC(unsigned short lsn, int flags, int lana) { smb_vc_t *vcp; lock_ObtainWrite(&smb_rctLock); for(vcp = smb_allVCsp; vcp; vcp=vcp->nextp) { - if (lsn == vcp->lsn) { + if (lsn == vcp->lsn && lana == vcp->lana) { vcp->refCount++; break; } @@ -538,10 +683,12 @@ smb_vc_t *smb_FindVC(unsigned short lsn, int flags) vcp->refCount = 1; vcp->tidCounter = 1; vcp->fidCounter = 1; + vcp->uidCounter = 1; /* UID 0 is reserved for blank user */ vcp->nextp = smb_allVCsp; smb_allVCsp = vcp; lock_InitializeMutex(&vcp->mx, "vc_t mutex"); vcp->lsn = lsn; + vcp->lana = lana; } lock_ReleaseWrite(&smb_rctLock); return vcp; @@ -625,13 +772,23 @@ void smb_ReleaseTID(smb_tid_t *tidp) smb_user_t *smb_FindUID(smb_vc_t *vcp, unsigned short uid, int flags) { - smb_user_t *uidp; + smb_user_t *uidp = NULL; lock_ObtainWrite(&smb_rctLock); for(uidp = vcp->usersp; uidp; uidp = uidp->nextp) { if (uid == uidp->userID) { uidp->refCount++; - break; +#ifdef DEBUG_VERBOSE + { + HANDLE h; char *ptbuf[1],buf[132]; + h = RegisterEventSource(NULL, "AFS Service - smb_FindUID (Find by UID)"); + sprintf(buf, "VCP[%x] found-uid[%d] name[%s]",vcp,uidp->userID,(uidp->unp ? uidp->unp->name : "")); + ptbuf[0] = buf; + ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, ptbuf, NULL); + DeregisterEventSource(h); + } +#endif + break; } } if (!uidp && (flags & SMB_FLAG_CREATE)) { @@ -643,11 +800,73 @@ smb_user_t *smb_FindUID(smb_vc_t *vcp, unsigned short uid, int flags) vcp->usersp = uidp; lock_InitializeMutex(&uidp->mx, "uid_t mutex"); uidp->userID = uid; +#ifdef DEBUG_VERBOSE + { + HANDLE h; char *ptbuf[1],buf[132]; + h = RegisterEventSource(NULL, "AFS Service - smb_FindUID (Find by UID)"); + sprintf(buf, "VCP[%x] new-uid[%d] name[%s]",vcp,uidp->userID,(uidp->unp ? uidp->unp->name : "")); + ptbuf[0] = buf; + ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, ptbuf, NULL); + DeregisterEventSource(h); + } +#endif } lock_ReleaseWrite(&smb_rctLock); return uidp; } +smb_username_t *smb_FindUserByName(char *usern, char *machine, int flags) +{ + smb_username_t *unp= NULL; + + lock_ObtainWrite(&smb_rctLock); + for(unp = usernamesp; unp; unp = unp->nextp) { + if (stricmp(unp->name, usern) == 0 && + stricmp(unp->machine, machine) == 0) { + unp->refCount++; + break; + } + } + if (!unp && (flags & SMB_FLAG_CREATE)) { + unp = malloc(sizeof(*unp)); + memset(unp, 0, sizeof(*unp)); + unp->nextp = usernamesp; + unp->name = strdup(usern); + unp->machine = strdup(machine); + usernamesp = unp; + lock_InitializeMutex(&unp->mx, "username_t mutex"); + } + lock_ReleaseWrite(&smb_rctLock); + return unp; +} + +smb_user_t *smb_FindUserByNameThisSession(smb_vc_t *vcp, char *usern) +{ + smb_user_t *uidp= NULL; + + lock_ObtainWrite(&smb_rctLock); + for(uidp = vcp->usersp; uidp; uidp = uidp->nextp) { + if (!uidp->unp) + continue; + if (stricmp(uidp->unp->name, usern) == 0) { + uidp->refCount++; +#ifdef DEBUG_VERBOSE + { + HANDLE h; char *ptbuf[1],buf[132]; + h = RegisterEventSource(NULL, "AFS Service - smb_FindUserByNameThisSession"); + sprintf(buf, "VCP[%x] uid[%d] match-name[%s]",vcp,uidp->userID,usern); + ptbuf[0] = buf; + ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, ptbuf, NULL); + DeregisterEventSource(h); + } +#endif + break; + } else + continue; + } + lock_ReleaseWrite(&smb_rctLock); + return uidp; +} void smb_ReleaseUID(smb_user_t *uidp) { smb_user_t *up; @@ -665,7 +884,8 @@ void smb_ReleaseUID(smb_user_t *uidp) osi_assert(up != NULL); *lupp = up->nextp; lock_FinalizeMutex(&uidp->mx); - userp = uidp->userp; /* remember to drop ref later */ + if (uidp->unp) + userp = uidp->unp->userp; /* remember to drop ref later */ } lock_ReleaseWrite(&smb_rctLock); if (userp) { @@ -686,10 +906,11 @@ cm_user_t *smb_GetUser(smb_vc_t *vcp, smb_packet_t *inp) smbp = (smb_t *) inp; uidp = smb_FindUID(vcp, smbp->uid, 0); - if (!uidp) return NULL; + if ((!uidp) || (!uidp->unp)) + return NULL; lock_ObtainMutex(&uidp->mx); - up = uidp->userp; + up = uidp->unp->userp; cm_HoldUser(up); lock_ReleaseMutex(&uidp->mx); @@ -957,13 +1178,19 @@ int smb_FindShare(smb_vc_t *vcp, smb_packet_t *inp, char *shareName, { if (var = smb_stristr(p, VNUserName)) { uidp = smb_FindUID(vcp, ((smb_t *)inp)->uid, 0); - smb_subst(p, var, sizeof(VNUserName), - uidp->name); + if (uidp && uidp->unp) + smb_subst(p, var, sizeof(VNUserName), + uidp->unp->name); + else + smb_subst(p, var, sizeof(VNUserName), + " "); smb_ReleaseUID(uidp); } else if (var = smb_stristr(p, VNLCUserName)) { uidp = smb_FindUID(vcp, ((smb_t *)inp)->uid, 0); - strcpy(temp, uidp->name); + if (uidp && uidp->unp) + strcpy(temp, uidp->unp->name); + else strcpy(temp, " "); _strlwr(temp); smb_subst(p, var, sizeof(VNLCUserName), temp); smb_ReleaseUID(uidp); @@ -1576,7 +1803,7 @@ void smb_SendPacket(smb_vc_t *vcp, smb_packet_t *inp) ncbp->ncb_length = extra; /* bytes to send */ ncbp->ncb_lsn = (unsigned char) vcp->lsn; /* vc to use */ - ncbp->ncb_lana_num = smb_LANadapter; + ncbp->ncb_lana_num = vcp->lana; ncbp->ncb_command = NCBSEND; /* op means send data */ #ifndef DJGPP ncbp->ncb_buffer = (char *) inp;/* packet */ @@ -1974,7 +2201,7 @@ send1: ncbp->ncb_length = (unsigned short) finalCount; ncbp->ncb_lsn = (unsigned char) vcp->lsn; - ncbp->ncb_lana_num = smb_LANadapter; + ncbp->ncb_lana_num = vcp->lana; ncbp->ncb_command = NCBSEND; ncbp->ncb_buffer = rawBuf; @@ -5163,8 +5390,29 @@ void smb_DispatchPacket(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp, /* Raw Write */ code = smb_ReceiveCoreWriteRaw (vcp, inp, outp, rwcp); - else - code = (*(dp->procp)) (vcp, inp, outp); + else { + +#ifdef DEBUG_VERBOSE + HANDLE h; char *ptbuf[1],buf[132];DWORD err; + h = RegisterEventSource(NULL, "AFS Server - Dispatch"); + sprintf(buf,"%s vcp[%x] lana[%d] lsn[%d]",myCrt_Dispatch(inp->inCom),vcp,vcp->lana,vcp->lsn); + ptbuf[0] = buf; + ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, ptbuf, NULL); + DeregisterEventSource(h); +#endif + code = (*(dp->procp)) (vcp, inp, outp); + +#ifdef DEBUG_VERBOSE + h = RegisterEventSource(NULL, "AFS Server - Dispatch return "); + sprintf(buf,"code[%d]",code-CM_ERROR_BASE); + if (code) + ptbuf[0] = buf; + else + ptbuf[0] = "code[0]"; + ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, ptbuf, NULL); + DeregisterEventSource(h); +#endif + } if (oldGen != sessionGen) { #ifndef DJGPP @@ -5180,8 +5428,8 @@ void smb_DispatchPacket(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp, 1005, NULL, 1, ncbp->ncb_length, ptbuf, smbp); DeregisterEventSource(h); #else /* DJGPP */ - osi_Log1(afsd_logp, "Pkt straddled session startup, " - "ncb length %d", ncbp->ncb_length); + osi_Log1(afsd_logp, "Pkt straddled session startup, " + "ncb length %d", ncbp->ncb_length); #endif /* !DJGPP */ } } @@ -5402,7 +5650,7 @@ NCBretry: #endif /* DJGPP */ ncbp->ncb_lsn = (unsigned char) LSNs[idx_session]; ncbp->ncb_command = NCBRECV | ASYNCH; - ncbp->ncb_lana_num = smb_LANadapter; + ncbp->ncb_lana_num = lanas[idx_session]; #ifndef DJGPP ncbp->ncb_buffer = (unsigned char *) bufs[idx_NCB]; ncbp->ncb_event = NCBevents[idx_NCB]; @@ -5489,7 +5737,7 @@ void smb_Server(VOID *parmp) case NRC_SNUMOUT: /* Client closed session */ dead_sessions[idx_session] = TRUE; - vcp = smb_FindVC(ncbp->ncb_lsn, 0); + vcp = smb_FindVC(ncbp->ncb_lsn, 0, lanas[idx_session]); /* Should also release vcp. Also, would do * sanity check that all TID's are gone. */ if (dead_vcp) @@ -5508,7 +5756,7 @@ void smb_Server(VOID *parmp) loggedOut = 1; loggedOutTime = vcp->logoffTime; loggedOutName = - strdup(vcp->justLoggedOut->name); + strdup(vcp->justLoggedOut->unp->name); loggedOutUserp = vcp->justLoggedOut; lock_ObtainWrite(&smb_rctLock); loggedOutUserp->refCount++; @@ -5573,7 +5821,7 @@ void smb_Server(VOID *parmp) if (smb_concurrentCalls > smb_maxObsConcurrentCalls) smb_maxObsConcurrentCalls = smb_concurrentCalls; - vcp = smb_FindVC(ncbp->ncb_lsn, 0); + vcp = smb_FindVC(ncbp->ncb_lsn, 0, ncbp->ncb_lana_num); vcp->errorCount = 0; bufp = (struct smb_packet *) ncbp->ncb_buffer; #ifdef DJGPP @@ -5597,7 +5845,7 @@ void smb_Server(VOID *parmp) rwevent = thrd_CreateEvent(NULL, FALSE, FALSE, NULL); ncbp->ncb_command = NCBRECV | ASYNCH; ncbp->ncb_lsn = (unsigned char) vcp->lsn; - ncbp->ncb_lana_num = smb_LANadapter; + ncbp->ncb_lana_num = vcp->lana; ncbp->ncb_buffer = rwc.buf; ncbp->ncb_length = 65535; ncbp->ncb_event = rwevent; @@ -5674,6 +5922,7 @@ void smb_Listener(void *parmp) dos_ptr dos_ncb; time_t now; #endif /* DJGPP */ + int lana = (int) parmp; ncbp = GetNCB(); #ifdef DJGPP @@ -5681,6 +5930,7 @@ void smb_Listener(void *parmp) #endif /* DJGPP */ while (1) { + memset(ncbp, 0, sizeof(NCB)); #ifdef DJGPP /* terminate if shutdown flag is set */ if (smbShutdownFlag == 1) @@ -5712,7 +5962,7 @@ void smb_Listener(void *parmp) strcpy(ncbp->ncb_callname, "*"); for(i=1; incb_callname[i] = ' '; - ncbp->ncb_lana_num = smb_LANadapter; + ncbp->ncb_lana_num = lana; #ifndef DJGPP code = Netbios(ncbp); @@ -5721,18 +5971,17 @@ void smb_Listener(void *parmp) if (code != 0) { - fprintf(stderr, "NCBLISTEN lana=%d (smb_LANadapter=%d) " - "failed with code %d\n", - ncbp->ncb_lana_num, smb_LANadapter, code); - osi_Log3(0, "NCBLISTEN lana=%d (smb_LANadapter=%d) " - "failed with code %d", - ncbp->ncb_lana_num, smb_LANadapter, code); + fprintf(stderr, "NCBLISTEN lana=%d failed with code %d\n", + ncbp->ncb_lana_num, code); + osi_Log2(0, "NCBLISTEN lana=%d failed with code %d", + ncbp->ncb_lana_num, code); fprintf(stderr, "\nClient exiting due to network failure " "(possibly due to power-saving mode)\n"); fprintf(stderr, "Please restart client.\n"); afs_exit(AFS_EXITCODE_NETWORK_FAILURE); } #endif /* !DJGPP */ + osi_assert(code == 0); /* check for remote conns */ @@ -5752,11 +6001,18 @@ void smb_Listener(void *parmp) flags |= SMB_VCFLAG_REMOTECONN; osi_Log1(afsd_logp, "New session lsn %d", ncbp->ncb_lsn); + /* lock */ + lock_ObtainMutex(&smb_ListenerLock); /* New generation */ sessionGen++; /* Log session startup */ +#ifdef NOSERVICE + fprintf(stderr, "New session(ncb_lsn,ncb_lana_num) %d,%d starting from host " + "%s\n", + ncbp->ncb_lsn,ncbp->ncb_lana_num, rname); +#endif if (reportSessionStartups) { #ifndef DJGPP HANDLE h; @@ -5771,21 +6027,21 @@ void smb_Listener(void *parmp) 1, 0, ptbuf, NULL); DeregisterEventSource(h); #else /* DJGPP */ - afsi_log("NCBLISTEN completed, call from %s",rname); - osi_Log1(afsd_logp, "SMB session startup, %d ongoing o -ps", - ongoingOps); - time(&now); - fprintf(stderr, "%s: New session starting from host %s -\n", - asctime(localtime(&now)), rname); - fflush(stderr); + afsi_log("NCBLISTEN completed, call from %s",rname); + osi_Log1(afsd_logp, "SMB session startup, %d ongoing ops", + ongoingOps); + time(&now); + fprintf(stderr, "%s: New session %d starting from host " + "%s\n", + asctime(localtime(&now)), ncbp->ncb_lsn, rname); + fflush(stderr); #endif /* !DJGPP */ } /* now ncbp->ncb_lsn is the connection ID */ - vcp = smb_FindVC(ncbp->ncb_lsn, SMB_FLAG_CREATE); + vcp = smb_FindVC(ncbp->ncb_lsn, SMB_FLAG_CREATE, ncbp->ncb_lana_num); vcp->flags |= flags; + strcpy(vcp->rname, rname); /* Allocate slot in session arrays */ /* Re-use dead session if possible, otherwise add one more */ @@ -5796,6 +6052,8 @@ ps", } } LSNs[i] = ncbp->ncb_lsn; + lanas[i] = ncbp->ncb_lana_num; + if (i == numSessions) { /* Add new NCB for new session */ InitNCBslot(numNCBs); @@ -5811,6 +6069,8 @@ ps", } else { thrd_SetEvent(SessionEvents[i]); } + /* unlock */ + lock_ReleaseMutex(&smb_ListenerLock); } /* dispatch while loop */ } @@ -5818,119 +6078,173 @@ ps", /* initialize Netbios */ void smb_NetbiosInit() { - NCB *ncbp; + NCB *ncbp; #ifdef DJGPP - dos_ptr dos_ncb; + dos_ptr dos_ncb; #endif /* DJGPP */ - int i, lana, code; - char s[100]; - int delname_tried=0; - int len; - - /* setup the NCB system */ - ncbp = GetNCB(); + int i, lana, code, l; + char s[100]; + int delname_tried=0; + int len; + int lana_found = 0; + + /* setup the NCB system */ + ncbp = GetNCB(); #ifdef DJGPP - dos_ncb = ((smb_ncb_t *)ncbp)->dos_ncb; + dos_ncb = ((smb_ncb_t *)ncbp)->dos_ncb; #endif /* DJGPP */ #ifndef DJGPP - /* reset the adaptor: in Win32, this is required for every process, and + if (smb_LANadapter == -1) { + ncbp->ncb_command = NCBENUM; + ncbp->ncb_buffer = &lana_list; + ncbp->ncb_length = sizeof(lana_list); + code = Netbios(ncbp); + if (code != 0) { + sprintf(s, "Netbios NCBENUM error code %d", code); + afsi_log(s); + osi_panic(s, __FILE__, __LINE__); + } + } + else { + lana_list.length = 1; + lana_list.lana[0] = smb_LANadapter; + } + + for (i = 0; i < lana_list.length; i++) { + /* reset the adaptor: in Win32, this is required for every process, and * acts as an init call, not as a real hardware reset. */ ncbp->ncb_command = NCBRESET; ncbp->ncb_callname[0] = 100; ncbp->ncb_callname[2] = 100; - ncbp->ncb_lana_num = smb_LANadapter; + ncbp->ncb_lana_num = lana_list.lana[i]; code = Netbios(ncbp); if (code == 0) code = ncbp->ncb_retcode; - if (code != 0) { - sprintf(s, "Netbios NCBRESET error code %d", code); - afsi_log(s); - osi_panic(s, __FILE__, __LINE__); - } + if (code != 0) { + sprintf(s, "Netbios NCBRESET lana %d error code %d", lana_list.lana[i], code); + afsi_log(s); + lana_list.lana[i] = 255; /* invalid lana */ + } + else { + sprintf(s, "Netbios NCBRESET lana %d succeeded", lana_list.lana[i]); + afsi_log(s); + } + } +#else + /* for DJGPP, there is no NCBENUM and NCBRESET is a real reset. so + we will just fake the LANA list */ + if (smb_LANadapter == -1) { + for (i = 0; i < 8; i++) + lana_list.lana[i] = i; + lana_list.length = 8; + } + else { + lana_list.length = 1; + lana_list.lana[0] = smb_LANadapter; + } #endif /* !DJGPP */ - try_addname: - /* and declare our name so we can receive connections */ - memset(ncbp, 0, sizeof(*ncbp)); - ncbp->ncb_lana_num = smb_LANadapter; + try_addname: + /* and declare our name so we can receive connections */ + memset(ncbp, 0, sizeof(*ncbp)); + len=lstrlen(smb_localNamep); + memset(smb_sharename,' ',NCBNAMSZ); + memcpy(smb_sharename,smb_localNamep,len); +#if 0 + /*ncbp->ncb_lana_num = smb_LANadapter;*/ + strcpy(ncbp->ncb_name, smb_localNamep); + len = strlen(smb_localNamep); + for(i=len; incb_name[i] = ' '; +#endif + /* Keep the name so we can unregister it later */ + for (l = 0; l < lana_list.length; l++) { + lana = lana_list.lana[l]; + ncbp->ncb_command = NCBADDNAME; - strcpy(ncbp->ncb_name, smb_localNamep); - len = strlen(smb_localNamep); - for(i=len; incb_name[i] = ' '; - /* Keep the name so we can unregister it later */ - memcpy(smb_sharename,ncbp->ncb_name,NCBNAMSZ); - lana = smb_LANadapter; - - do { /* try multiple LANA numbers until we find one that works */ - ncbp->ncb_lana_num = lana; + ncbp->ncb_lana_num = lana; + memcpy(ncbp->ncb_name,smb_sharename,NCBNAMSZ); #ifndef DJGPP - code = Netbios(ncbp); + code = Netbios(ncbp); #else /* DJGPP */ - code = Netbios(ncbp, dos_ncb); + code = Netbios(ncbp, dos_ncb); #endif /* !DJGPP */ - afsi_log("Netbios NCBADDNAME code=%d retcode=%d complete=%d",code, - ncbp->ncb_retcode,ncbp->ncb_cmd_cplt); - { - char name[200]; - int i; - for (i=0;incb_name[i]; - name[i] = '\0'; + afsi_log("Netbios NCBADDNAME lana=%d code=%d retcode=%d complete=%d", + lana, code, ncbp->ncb_retcode,ncbp->ncb_cmd_cplt); + { + char name[NCBNAMSZ+1]; + name[NCBNAMSZ]=0; + memcpy(name,ncbp->ncb_name,NCBNAMSZ); afsi_log("Netbios NCBADDNAME added new name >%s<",name); - } + } - if (code == 0) - { - code = ncbp->ncb_retcode; - smb_LANadapter = lana; /* correct LANA number */ - break; - } - else - { + if (code == 0) code = ncbp->ncb_retcode; + if (code == 0) { + fprintf(stderr, "Netbios NCBADDNAME succeeded on lana %d\n", lana); +#ifdef DJGPP + /* we only use one LANA with djgpp */ + lana_list.lana[0] = lana; + lana_list.length = 1; +#endif + } + else { sprintf(s, "Netbios NCBADDNAME lana %d error code %d", lana, code); afsi_log(s); - if (code != NRC_BRIDGE) /* invalid LANA num */ - break; - else - lana = (lana + 1) % 8; - } - } while (lana != smb_LANadapter); /* quit when we loop back to orig. */ - - if (code == NRC_DUPNAME) - { - /* Name already exists; try to delete it */ - memset(ncbp, 0, sizeof(*ncbp)); - ncbp->ncb_command = NCBDELNAME; - memcpy(ncbp->ncb_name,smb_sharename,NCBNAMSZ); - ncbp->ncb_lana_num = smb_LANadapter; + fprintf(stderr, "Netbios NCBADDNAME lana %d error code %d\n", lana, code); + if (code == NRC_BRIDGE) { /* invalid LANA num */ + lana_list.lana[l] = 255; + continue; + } + else if (code == NRC_DUPNAME) { + /* Name already exists; try to delete it */ + memset(ncbp, 0, sizeof(*ncbp)); + ncbp->ncb_command = NCBDELNAME; + memcpy(ncbp->ncb_name,smb_sharename,NCBNAMSZ); + ncbp->ncb_lana_num = lana; #ifndef DJGPP - code = Netbios(ncbp); + code = Netbios(ncbp); #else - code = Netbios(ncbp, dos_ncb); + code = Netbios(ncbp, dos_ncb); #endif /* DJGPP */ - if (code == 0) code = ncbp->ncb_retcode; - if (code != 0) { - fprintf(stderr, "Netbios NCBDELNAME error code %d", code); - } - fflush(stderr); - if (code == 0 && !delname_tried) - { - delname_tried = 1; - goto try_addname; - } + if (code == 0) code = ncbp->ncb_retcode; + else + fprintf(stderr, "Netbios NCBDELNAME lana %d error code %d\n", lana, code); + fflush(stderr); + if (code != 0 || delname_tried) { + lana_list.lana[l] = 255; + } + else if (code == 0) { + if (!delname_tried) { + lana--; + delname_tried = 1; + continue; + } + } + } + else { + sprintf(s, "Netbios NCBADDNAME lana %d error code %d", lana, code); + afsi_log(s); + lana_list.lana[l] = 255; /* invalid lana */ + osi_panic(s, __FILE__, __LINE__); + } } + if (code == 0) { + lana_found = 1; /* at least one worked */ +#ifdef DJGPP + break; +#endif + } + } - if (code != 0) - osi_panic(s, __FILE__, __LINE__); + osi_assert(lana_list.length >= 0); + if (!lana_found) { + sprintf(s, "No valid LANA numbers found!"); + osi_panic(s, __FILE__, __LINE__); + } - fprintf(stderr, "Using LAN Adapter %d\n", smb_LANadapter, code); - afsi_log("Netbios NCBADDNAME lana=%d name number=%d", smb_LANadapter, - ncbp->ncb_num); - - /* we're done with the NCB now */ - FreeNCB(ncbp); + /* we're done with the NCB now */ + FreeNCB(ncbp); } void smb_Init(osi_log_t *logp, char *snamep, int useV3, int LANadapt, @@ -6007,6 +6321,8 @@ void smb_Init(osi_log_t *logp, char *snamep, int useV3, int LANadapt, /* Raw I/O data structures */ lock_InitializeMutex(&smb_RawBufLock, "smb raw buffer lock"); + lock_InitializeMutex(&smb_ListenerLock, "smb listener lock"); + /* 4 Raw I/O buffers */ #ifndef DJGPP smb_RawBufs = GlobalAlloc(GMEM_FIXED, 65536); @@ -6159,10 +6475,13 @@ void smb_Init(osi_log_t *logp, char *snamep, int useV3, int LANadapt, /* Start listeners, waiters, servers, and daemons */ - phandle = thrd_Create(NULL, 65536, (ThreadFunc) smb_Listener, - NULL, 0, &lpid, "smb_Listener"); - osi_assert(phandle != NULL); - thrd_CloseHandle(phandle); + for (i = 0; i < lana_list.length; i++) { + if (lana_list.lana[i] == 255) continue; + phandle = thrd_Create(NULL, 65536, (ThreadFunc) smb_Listener, + (void*)lana_list.lana[i], 0, &lpid, "smb_Listener"); + osi_assert(phandle != NULL); + thrd_CloseHandle(phandle); + } #ifndef DJGPP phandle = thrd_Create(NULL, 65536, (ThreadFunc) smb_ClientWaiter, @@ -6227,7 +6546,7 @@ void smb_Shutdown(void) /*fprintf(stderr, "NCBHANGUP session %d LSN %d\n", i, LSNs[i]);*/ ncbp->ncb_command = NCBHANGUP; - ncbp->ncb_lana_num = smb_LANadapter; + ncbp->ncb_lana_num = lanas[i]; /*smb_LANadapter;*/ ncbp->ncb_lsn = LSNs[i]; code = Netbios(ncbp, dos_ncb); /*fprintf(stderr, "returned from NCBHANGUP session %d LSN %d\n", i, LS @@ -6238,15 +6557,21 @@ void smb_Shutdown(void) } } +#if 1 /* Delete Netbios name */ - ncbp->ncb_command = NCBDELNAME; - memcpy(ncbp->ncb_name,smb_sharename,NCBNAMSZ); - ncbp->ncb_lana_num = smb_LANadapter; - code = Netbios(ncbp, dos_ncb); - if (code == 0) code = ncbp->ncb_retcode; - if (code != 0) { - fprintf(stderr, "Netbios NCBDELNAME error code %d", code); - } - fflush(stderr); + for (i = 0; i < lana_list.length; i++) { + if (lana_list.lana[i] == 255) continue; + ncbp->ncb_command = NCBDELNAME; + ncbp->ncb_lana_num = lana_list.lana[i]; + memcpy(ncbp->ncb_name,smb_sharename,NCBNAMSZ); + code = Netbios(ncbp, dos_ncb); + if (code == 0) code = ncbp->ncb_retcode; + if (code != 0) { + fprintf(stderr, "Netbios NCBDELNAME lana %d error code %d", + ncbp->ncb_lana_num, code); + } + fflush(stderr); + } +#endif } #endif /* DJGPP */ diff --git a/src/WINNT/afsd/smb.h b/src/WINNT/afsd/smb.h index 0bba634..e3a9c20 100644 --- a/src/WINNT/afsd/smb.h +++ b/src/WINNT/afsd/smb.h @@ -124,8 +124,10 @@ typedef struct smb_vc { 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 */ + /*struct cm_user *logonDLLUser; /* integrated logon user */ unsigned char errorCount; + char rname[17]; + int lana; } smb_vc_t; /* have we negotiated ... */ @@ -144,10 +146,19 @@ typedef struct smb_user { osi_mutex_t mx; long userID; /* the session identifier */ struct smb_vc *vcp; /* back ptr to virtual circuit */ - struct cm_user *userp; /* CM user structure */ - char *name; /* user name */ + struct smb_username *unp; /* user name struct */ } smb_user_t; +typedef struct smb_username { + struct smb_username *nextp; /* next sibling */ + long refCount; /* ref count */ + long flags; /* flags; locked by mx */ + osi_mutex_t mx; + struct cm_user *userp; /* CM user structure */ + char *name; /* user name */ + char *machine; /* machine name */ +} smb_username_t; + #define SMB_USERFLAG_DELETE 1 /* delete struct when ref count zero */ /* one per tree-connect */ @@ -194,6 +205,9 @@ typedef struct smb_ioctl { /* flags */ long flags; + + /* fid pointer */ + struct smb_fid *fidp; } smb_ioctl_t; /* flags for smb_ioctl_t */ @@ -265,6 +279,7 @@ typedef struct smb_dirListPatch { osi_queue_t q; char *dptr; /* ptr to attr, time, data, sizel, sizeh */ cm_fid_t fid; + cm_dirEntry_t *dep; /* temp */ } smb_dirListPatch_t; /* waiting lock list elements */ @@ -315,7 +330,7 @@ extern void smb_DosUTimeFromUnixTime(long *dosUTimep, long unixTime); extern void smb_UnixTimeFromDosUTime(long *unixTimep, long dosUTime); -extern smb_vc_t *smb_FindVC(unsigned short lsn, int flags); +extern smb_vc_t *smb_FindVC(unsigned short lsn, int flags, int lana); extern void smb_ReleaseVC(smb_vc_t *vcp); @@ -434,5 +449,7 @@ extern BOOL smb_IsLegalFilename(char *filename); #include "smb3.h" #include "smb_ioctl.h" #include "smb_iocons.h" + +cm_user_t *smb_FindOrCreateUser(smb_vc_t *vcp, char *usern); #endif /* whole file */ diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index bb0eec6..207f9f8 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -7,6 +7,8 @@ * directory or online at http://www.openafs.org/dl/license10.html */ +//#define NOSERVICE 1 + #include #include @@ -42,14 +44,16 @@ smb_tran2Packet_t *smb_tran2AssemblyQueuep; cm_user_t *smb_GetTran2User(smb_vc_t *vcp, smb_tran2Packet_t *inp) { smb_user_t *uidp; - cm_user_t *up; + cm_user_t *up = NULL; uidp = smb_FindUID(vcp, inp->uid, 0); if (!uidp) return NULL; lock_ObtainMutex(&uidp->mx); - up = uidp->userp; - cm_HoldUser(up); + if (uidp->unp) { + up = uidp->unp->userp; + cm_HoldUser(up); + } lock_ReleaseMutex(&uidp->mx); smb_ReleaseUID(uidp); @@ -107,119 +111,123 @@ unsigned char *smb_ParseString(unsigned char *inp, char **chainpp) long smb_ReceiveV3SessionSetupX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) { - char *tp; - char *usern, *pwd, *pwdx; - smb_user_t *uidp, *dead_uidp; - unsigned short newUid; - unsigned long caps; - cm_user_t *userp; - char *s1 = " "; - - /* Check for bad conns */ - if (vcp->flags & SMB_VCFLAG_REMOTECONN) - return CM_ERROR_REMOTECONN; - - /* For NT LM 0.12 and up, get capabilities */ - if (vcp->flags & SMB_VCFLAG_USENT) { - caps = smb_GetSMBParm(inp, 11); - if (caps & 0x40) - vcp->flags |= SMB_VCFLAG_STATUS32; - /* for now, ignore other capability bits */ - } - - /* Parse the data */ - tp = smb_GetSMBData(inp, NULL); - if (vcp->flags & SMB_VCFLAG_USENT) - pwdx = smb_ParseString(tp, &tp); - pwd = smb_ParseString(tp, &tp); - usern = smb_ParseString(tp, &tp); - - /* Create a new UID and cm_user_t structure */ - userp = cm_NewUser(); - lock_ObtainMutex(&vcp->mx); - newUid = vcp->uidCounter++; - lock_ReleaseMutex(&vcp->mx); - - /* Create a new smb_user_t structure and connect them up */ - uidp = smb_FindUID(vcp, newUid, SMB_FLAG_CREATE); - lock_ObtainMutex(&uidp->mx); - uidp->userp = userp; - uidp->name = strdup(usern); - lock_ReleaseMutex(&uidp->mx); - smb_ReleaseUID(uidp); - - if (dead_vcp) { - dead_uidp = dead_vcp->usersp; - while (dead_uidp) { - if (dead_uidp->userp - && strcmp(dead_uidp->name, usern) == 0) - break; - dead_uidp = dead_uidp->nextp; - } - } - - /* transfer tokens from dead vcp */ - if (dead_vcp && dead_uidp) { - cm_user_t *dead_userp; - s1 = ", tokens from terminated session"; - dead_userp = dead_uidp->userp; - cm_ResetACLCache(dead_userp); - userp->cellInfop = dead_userp->cellInfop; - dead_userp->cellInfop = NULL; - dead_vcp = NULL; - } - - /* transfer tokens from integrated logon */ - if (vcp->logonDLLUser) { - s1 = ", tokens from integrated logon"; - cm_ResetACLCache(vcp->logonDLLUser); - userp->cellInfop = vcp->logonDLLUser->cellInfop; - vcp->logonDLLUser->cellInfop = NULL; - vcp->logonDLLUser = NULL; - } - - /* transfer tokens for logoff profile upload */ - if (vcp->justLoggedOut) { - cm_user_t *logout_userp; - if (GetTickCount() - vcp->logoffTime < - 1000 * smb_LogoffTransferTimeout - && strcmp(vcp->justLoggedOut->name, usern) == 0) { - s1 = ", tokens from logoff"; - logout_userp = vcp->justLoggedOut->userp; - cm_ResetACLCache(logout_userp); - userp->cellInfop = logout_userp->cellInfop; - logout_userp->cellInfop = NULL; + char *tp; + char *usern, *pwd, *pwdx; + smb_user_t *uidp, *dead_uidp; + unsigned short newUid; + unsigned long caps; + cm_user_t *userp; + smb_username_t *unp; + char *s1 = " "; + + /* Check for bad conns */ + if (vcp->flags & SMB_VCFLAG_REMOTECONN) + return CM_ERROR_REMOTECONN; + + /* For NT LM 0.12 and up, get capabilities */ + if (vcp->flags & SMB_VCFLAG_USENT) { + caps = smb_GetSMBParm(inp, 11); + if (caps & 0x40) + vcp->flags |= SMB_VCFLAG_STATUS32; + /* for now, ignore other capability bits */ + } + + /* Parse the data */ + tp = smb_GetSMBData(inp, NULL); + if (vcp->flags & SMB_VCFLAG_USENT) + pwdx = smb_ParseString(tp, &tp); + pwd = smb_ParseString(tp, &tp); + usern = smb_ParseString(tp, &tp); + + if (strlen(usern)==0) { + /*return CM_ERROR_NOACCESS;*/ + newUid = 0; /* always assign uid 0 for blank username */ + uidp = smb_FindUID(vcp, newUid, SMB_FLAG_CREATE); +#ifdef DEBUG_VERBOSE + { + HANDLE h; char *ptbuf[1],buf[132]; + h = RegisterEventSource(NULL, "AFS Service - smb_ReceiveV3SessionSetupX"); + sprintf(buf, "VCP[%x] lsn[%d] anonymous, uid[%d]",vcp,vcp->lsn,uidp->userID); + ptbuf[0] = buf; + ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, ptbuf, NULL); + DeregisterEventSource(h); } - vcp->justLoggedOut = NULL; - } - else if (loggedOut) { - cm_user_t *logout_userp; - if (GetTickCount() - loggedOutTime < - 1000 * smb_LogoffTransferTimeout - && strcmp(loggedOutName, usern) == 0) { - s1 = ", tokens from logoff"; - logout_userp = loggedOutUserp->userp; - cm_ResetACLCache(logout_userp); - userp->cellInfop = logout_userp->cellInfop; - logout_userp->cellInfop = NULL; +#endif + smb_ReleaseUID(uidp); + goto done; + } + + /* On Windows 2000, this function appears to be called more often than + it is expected to be called. This resulted in multiple smb_user_t + records existing all for the same user session which results in all + of the users tokens disappearing. + + To avoid this problem, we look for an existing smb_user_t record + based on the users name, and use that one if we find it. + */ + + uidp = smb_FindUserByNameThisSession(vcp, usern); + if (uidp) { /* already there, so don't create a new one */ + unp = uidp->unp; + userp = unp->userp; + newUid = (unsigned short)uidp->userID; /* For some reason these are different types!*/ +#ifdef DEBUG_VERBOSE + { + HANDLE h; char *ptbuf[1],buf[132]; + h = RegisterEventSource(NULL, "AFS Service - smb_ReceiveV3SessionSetupX"); + sprintf(buf,"FindUserByName:VCP[%x],Lana[%d],lsn[%d],userid[%d],name[%s]",vcp,vcp->lana,vcp->lsn,newUid,usern); + ptbuf[0] = buf; + ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, ptbuf, NULL); + DeregisterEventSource(h); + } +#endif + smb_ReleaseUID(uidp); + } + else { + /* do a global search for the username/machine name pair */ + unp = smb_FindUserByName(usern, vcp->rname, SMB_FLAG_CREATE); + + /* Create a new UID and cm_user_t structure */ + userp = unp->userp; + if (!userp) + userp = cm_NewUser(); + lock_ObtainMutex(&vcp->mx); + newUid = vcp->uidCounter++; + lock_ReleaseMutex(&vcp->mx); + + /* Create a new smb_user_t structure and connect them up */ + lock_ObtainMutex(&unp->mx); + unp->userp = userp; + lock_ReleaseMutex(&unp->mx); + + uidp = smb_FindUID(vcp, newUid, SMB_FLAG_CREATE); + lock_ObtainMutex(&uidp->mx); + uidp->unp = unp; +#ifdef DEBUG_VERBOSE + { + HANDLE h; char *ptbuf[1],buf[132]; + h = RegisterEventSource(NULL, "AFS Service - smb_ReceiveV3SessionSetupX"); + sprintf(buf,"NewUser:VCP[%x],Lana[%d],lsn[%d],userid[%d],name[%s]",vcp,vcp->lana,vcp->lsn,newUid,usern); + ptbuf[0] = buf; + ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, ptbuf, NULL); + DeregisterEventSource(h); } - smb_ReleaseUID(loggedOutUserp); - loggedOutUserp = NULL; - free(loggedOutName); - loggedOutName = NULL; - loggedOut = 0; - } - - /* Return UID to the client */ - ((smb_t *)outp)->uid = newUid; - /* Also to the next chained message */ - ((smb_t *)inp)->uid = newUid; - - osi_Log3(afsd_logp, "SMB3 session setup name %s creating ID %d%s", - osi_LogSaveString(afsd_logp, usern), newUid, osi_LogSaveString(afsd_logp, s1)); - smb_SetSMBParm(outp, 2, 0); - smb_SetSMBDataLength(outp, 0); - return 0; +#endif + lock_ReleaseMutex(&uidp->mx); + smb_ReleaseUID(uidp); + } + + done: + /* Return UID to the client */ + ((smb_t *)outp)->uid = newUid; + /* Also to the next chained message */ + ((smb_t *)inp)->uid = newUid; + + osi_Log3(afsd_logp, "SMB3 session setup name %s creating ID %d%s", + osi_LogSaveString(afsd_logp, usern), newUid, osi_LogSaveString(afsd_logp, s1)); + smb_SetSMBParm(outp, 2, 0); + smb_SetSMBDataLength(outp, 0); + return 0; } long smb_ReceiveV3UserLogoffX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) @@ -236,27 +244,13 @@ long smb_ReceiveV3UserLogoffX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou if (uidp) { char *s1 = NULL, *s2 = NULL; - /* Also, this is not logon session any more */ - if (uidp->userp == vcp->logonDLLUser) { - s1 = ", was logon session"; - vcp->logonDLLUser = NULL; - } - - /* But its tokens might be needed later */ - if (uidp->userp && !(uidp->userp->flags & CM_USERFLAG_WASLOGON) - && smb_LogoffTokenTransfer) { - s2 = ", pre-logout effect"; - vcp->justLoggedOut = uidp; - vcp->logoffTime = GetTickCount(); - } - if (s2 == NULL) s2 = " "; if (s1 == NULL) {s1 = s2; s2 = " ";} osi_Log4(afsd_logp, "SMB3 user logoffX uid %d name %s%s%s", uidp->userID, - osi_LogSaveString(afsd_logp, uidp->name), - s1, s2); + osi_LogSaveString(afsd_logp, + (uidp->unp) ? uidp->unp->name: " "), s1, s2); lock_ObtainMutex(&uidp->mx); uidp->flags |= SMB_USERFLAG_DELETE; @@ -1227,7 +1221,7 @@ long smb_ReceiveTran2QPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t smb_FreeTran2Packet(outp); return 0; } - + lock_ObtainMutex(&scp->mx); code = cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); @@ -2320,6 +2314,9 @@ long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t curPatchp->fid.volume = scp->fid.volume; curPatchp->fid.vnode = ntohl(dep->fid.vnode); curPatchp->fid.unique = ntohl(dep->fid.unique); + + /* temp */ + curPatchp->dep = dep; } if (searchFlags & 4) @@ -4135,3 +4132,40 @@ void smb3_Init() { lock_InitializeMutex(&smb_Dir_Watch_Lock, "Directory Watch List Lock"); } + +cm_user_t *smb_FindCMUserByName(/*smb_vc_t *vcp,*/ char *usern, char *machine) +{ + cm_user_t *userp; + /*int newUid;*/ + smb_user_t *uidp; + smb_username_t *unp; + + unp = smb_FindUserByName(usern, machine, SMB_FLAG_CREATE); + if (!unp->userp) { + lock_ObtainMutex(&unp->mx); + unp->userp = cm_NewUser(); + lock_ReleaseMutex(&unp->mx); +#ifdef DEBUG_VERBOSE + { //jimpeter + HANDLE h; char *ptbuf[1],buf[132]; + h = RegisterEventSource(NULL, "AFS Service - smb_FindCMUserByName"); + sprintf(buf,"New User name[%s] machine[%s]",usern,machine); + ptbuf[0] = buf; + ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, ptbuf, NULL); + DeregisterEventSource(h); + } +#endif + } +#ifdef DEBUG_VERBOSE + else { //jimpeter + HANDLE h; char *ptbuf[1],buf[132]; + h = RegisterEventSource(NULL, "AFS Service - smb_FindCMUserByName"); + sprintf(buf,"Found-name[%s] machine[%s]",usern,machine); + ptbuf[0] = buf; + ReportEvent(h, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, ptbuf, NULL); + DeregisterEventSource(h); + } +#endif + return unp->userp; +} + diff --git a/src/WINNT/afsd/smb_ioctl.c b/src/WINNT/afsd/smb_ioctl.c index ca40f64..9e06d88 100644 --- a/src/WINNT/afsd/smb_ioctl.c +++ b/src/WINNT/afsd/smb_ioctl.c @@ -27,7 +27,8 @@ smb_ioctlProc_t *smb_ioctlProcsp[SMB_IOCTL_MAXPROCS]; -extern unsigned char smb_LANadapter; +/*extern unsigned char smb_LANadapter;*/ +extern LANA_ENUM lana_list; void smb_InitIoctl(void) { @@ -86,6 +87,7 @@ void smb_SetupIoctlFid(smb_fid_t *fidp, cm_space_t *prefix) iop = malloc(sizeof(*iop)); memset(iop, 0, sizeof(*iop)); fidp->ioctlp = iop; + iop->fidp = fidp; } if (prefix) { copyPrefix = cm_GetSpace(); @@ -183,11 +185,6 @@ long smb_IoctlRead(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, return code; } - if (iop->flags & SMB_IOCTLFLAG_LOGON) { - vcp->logonDLLUser = userp; - userp->flags |= CM_USERFLAG_WASLOGON; - } - leftToCopy = (iop->outDatap - iop->outAllocp) - iop->outCopied; if (count > leftToCopy) count = leftToCopy; @@ -278,9 +275,13 @@ long smb_IoctlV3Read(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, smb_pack smb_user_t *uidp; uidp = smb_FindUID(vcp, ((smb_t *)inp)->uid, 0); - osi_Log3(afsd_logp, "Ioctl uid %d user %x name %s", - uidp->userID, userp, - osi_LogSaveString(afsd_logp, uidp->name)); + if (uidp && uidp->unp) + osi_Log3(afsd_logp, "Ioctl uid %d user %x name %s", + uidp->userID, userp, + osi_LogSaveString(afsd_logp, uidp->unp->name)); + else + osi_Log2(afsd_logp, "Ioctl uid %d user %x no name", + uidp->userID, userp); smb_ReleaseUID(uidp); } @@ -293,11 +294,6 @@ long smb_IoctlV3Read(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, smb_pack return code; } - if (iop->flags & SMB_IOCTLFLAG_LOGON) { - vcp->logonDLLUser = userp; - userp->flags |= CM_USERFLAG_WASLOGON; - } - leftToCopy = (iop->outDatap - iop->outAllocp) - iop->outCopied; if (count > leftToCopy) count = leftToCopy; @@ -370,9 +366,13 @@ long smb_IoctlReadRaw(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, smb_user_t *uidp; uidp = smb_FindUID(vcp, ((smb_t *)inp)->uid, 0); - osi_Log3(afsd_logp, "Ioctl uid %d user %x name %s", - uidp->userID, userp, - osi_LogSaveString(afsd_logp, uidp->name)); + if (uidp && uidp->unp) + osi_Log3(afsd_logp, "Ioctl uid %d user %x name %s", + uidp->userID, userp, + osi_LogSaveString(afsd_logp, uidp->unp->name)); + else + osi_Log2(afsd_logp, "Ioctl uid %d user %x no name", + uidp->userID, userp); smb_ReleaseUID(uidp); } @@ -385,11 +385,6 @@ long smb_IoctlReadRaw(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, return code; } - if (iop->flags & SMB_IOCTLFLAG_LOGON) { - vcp->logonDLLUser = userp; - userp->flags |= CM_USERFLAG_WASLOGON; - } - leftToCopy = (iop->outDatap - iop->outAllocp) - iop->outCopied; ncbp = outp->ncbp; @@ -398,7 +393,8 @@ long smb_IoctlReadRaw(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, ncbp->ncb_length = (unsigned short) leftToCopy; ncbp->ncb_lsn = (unsigned char) vcp->lsn; ncbp->ncb_command = NCBSEND; - ncbp->ncb_lana_num = smb_LANadapter; + /*ncbp->ncb_lana_num = smb_LANadapter;*/ + ncbp->ncb_lana_num = vcp->lana; #ifndef DJGPP ncbp->ncb_buffer = iop->outCopied + iop->outAllocp; diff --git a/src/WINNT/install/InstallShield5/CreateISDirTree.bat b/src/WINNT/install/InstallShield5/CreateISDirTree.bat index ed046ae..b7f8138 100644 --- a/src/WINNT/install/InstallShield5/CreateISDirTree.bat +++ b/src/WINNT/install/InstallShield5/CreateISDirTree.bat @@ -18,14 +18,43 @@ if not exist "Media\Transarc AFS" mkdir "Media\Transarc AFS" if not exist "Registry Entries" mkdir "Registry Entries" if not exist "Script Files" mkdir "Script Files" if not exist "Setup Files" mkdir "Setup Files" - -if not exist "Setup Files\Uncompressed Files" mkdir "Setup Files\Uncompressed Files" -if not exist "Setup Files\Uncompressed Files\Language Independent" mkdir "Setup Files\Uncompressed Files\Language Independent" -if not exist "Setup Files\Uncompressed Files\Language Independent\OS Independent" mkdir "Setup Files\Uncompressed Files\Language Independent\OS Independent" -if not exist "Setup Files\Compressed Files" mkdir "Setup Files\Compressed Files" -if not exist "Setup Files\Compressed Files\Language Independent" mkdir "Setup Files\Compressed Files\Language Independent" -if not exist "Setup Files\Compressed Files\Language Independent\OS Independent" mkdir "Setup Files\Compressed Files\Language Independent\OS Independent" - + +set sub1=Uncompressed Files +call :gencomp +set sub1=Compressed Files +call :gencomp +goto shell + +:gencomp +if not exist "Setup Files\%sub1%" mkdir "Setup Files\%sub1%" +set sub2=Language Independent +call :gencomp2 +set sub2=0009-English +call :gencomp2 +set sub2=0007-German +call :gencomp2 +set sub2=0011-Japanese +call :gencomp2 +set sub2=0012-Korean +call :gencomp2 +set sub2=0416-Portuguese (Brazilian) +call :gencomp2 +set sub2=0404-Chinese (Taiwan) +call :gencomp2 +set sub2=000a-Spanish +call :gencomp2 +set sub2=0804-Chinese (PRC) +call :gencomp2 +goto :eof + +:gencomp2 +rem echo ]%sub1%] ]%sub2%] +if not exist "Setup Files\%sub1%\%sub2%" mkdir "Setup Files\%sub1%\%sub2%" +if not exist "Setup Files\%sub1%\%sub2%\OS Independent" mkdir "Setup Files\%sub1%\%sub2%\OS Independent" +if not exist "Setup Files\%sub1%\%sub2%\Intel 32" mkdir "Setup Files\%sub1%\%sub2%\Intel 32" +goto :eof + +:shell if not exist "Shell Objects" mkdir "Shell Objects" if not exist "String Tables" mkdir "String Tables" if not exist "String Tables\0009-English" mkdir "String Tables\0009-English" @@ -38,4 +67,4 @@ if not exist "String Tables\0416-Portuguese (Brazilian)" mkdir "String Tables\04 if not exist "String Tables\000a-Spanish" mkdir "String Tables\000a-Spanish" if not exist "Text Substitutions" mkdir "Text Substitutions" - +:eof \ No newline at end of file diff --git a/src/WINNT/install/InstallShield5/Default.rge b/src/WINNT/install/InstallShield5/Default.rge index 8b31e9c..7949523 100644 --- a/src/WINNT/install/InstallShield5/Default.rge +++ b/src/WINNT/install/InstallShield5/Default.rge @@ -3,7 +3,7 @@ ---FileGroup---= HKLM0=Software\TransarcCorporation\AFS Client\CurrentVersion HKLM1=Software\TransarcCorporation\AFS Client -HKLM2=Software\TransarcCorporation\AFS Client\3.6 +HKLM2=Software\TransarcCorporation\AFS Client\1.0 4.01 HKLM3=SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon HKCR0=CLSID\{DC515C27-6CAC-11D1-BAE7-00C04FD140D2} HKLM4=SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters @@ -11,6 +11,7 @@ HKCR1=CLSID\{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}\InprocServer32 HKLM5=SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider HKCR2=*\shellex\ContextMenuHandlers\AFS Client Shell Extension HKCR3=FOLDER\shellex\ContextMenuHandlers\AFS Client Shell Extension +HKLM6=SYSTEM\CurrentControlSet\Services\NetBT\Parameters [Client:HKCR:*\shellex\ContextMenuHandlers\AFS Client Shell Extension] ---Comment---= @@ -41,7 +42,7 @@ TypesSupported=N,7 HKLM0=Software\TransarcCorporation\AFS Server\CurrentVersion HKLM1=System\CurrentControlSet\Services\EventLog\Application\AFS Service HKLM2=Software\TransarcCorporation\AFS Server -HKLM3=Software\TransarcCorporation\AFS Server\3.6 +HKLM3=Software\TransarcCorporation\AFS Server\1.0 4.01 [WinNT_Client_NoUninstall:HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\File Manager\AddOns] ---Comment---= @@ -53,22 +54,22 @@ AFS Client FME=S,\Client\Program\afs_fme.dll ---FileGroup---= HKLM0=Software\TransarcCorporation\AFS Control Center\CurrentVersion HKLM1=Software\TransarcCorporation\AFS Control Center -HKLM2=Software\TransarcCorporation\AFS Control Center\3.6 +HKLM2=Software\TransarcCorporation\AFS Control Center\1.0 4.01 -[Client:HKLM:Software\TransarcCorporation\AFS Client\3.6] -PatchLevel=N,0 -BetaLevel=N,0 +[Client:HKLM:Software\TransarcCorporation\AFS Client\1.0 4.01] +PatchLevel=N,401 +BetaLevel=N,1 Revision=N,0 ---Comment---= (Default)=S, -MajorVersion=N,3 +MajorVersion=N,1 Title=S, InstallDateString=S, PathName=S,\Client Software Type=S,File System -MinorVersion=N,6 +MinorVersion=N,0 ReleaseType=S, -VersionString=S,3.6 +VersionString=S,1.0 4.01 Description=S, [Client_NoUninstall] @@ -85,19 +86,19 @@ HKLM0=SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved (Default)=S, Gateway=S, -[Control_Center:HKLM:Software\TransarcCorporation\AFS Control Center\3.6] -PatchLevel=N,0 -BetaLevel=N,0 +[Control_Center:HKLM:Software\TransarcCorporation\AFS Control Center\1.0 4.01] +PatchLevel=N,401 +BetaLevel=N,1 Revision=N,0 ---Comment---= (Default)=S, -MajorVersion=N,3 +MajorVersion=N,1 InstallDateString=S, PathName=S,\Control Center Software Type=S,File System -MinorVersion=N,6 +MinorVersion=N,0 ReleaseType=S, -VersionString=S,3.6 +VersionString=S,1.0 4.01 Description=S,AFS Control Center for Windows NT [Client_NoUninstall:HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved] @@ -110,18 +111,18 @@ Description=S,AFS Control Center for Windows NT (Default)=S, [Control_Center:HKLM:Software\TransarcCorporation\AFS Control Center\CurrentVersion] -PatchLevel=N,0 -BetaLevel=N,0 +PatchLevel=N,401 +BetaLevel=N,1 Revision=N,0 ---Comment---= (Default)=S, -MajorVersion=N,3 +MajorVersion=N,1 InstallDateString=S, PathName=S,\Control Center Software Type=S,File System -MinorVersion=N,6 +MinorVersion=N,0 ReleaseType=S, -VersionString=S,3.6 +VersionString=S,1.0 4.01 Description=S,AFS Control Center for Windows NT [Light_Client] @@ -143,7 +144,7 @@ IsGateway=N,0 ---FileGroup---= HKLM0=Software\TransarcCorporation\AFS Supplemental Documentation\CurrentVersion HKLM1=Software\TransarcCorporation\AFS Supplemental Documentation -HKLM2=Software\TransarcCorporation\AFS Supplemental Documentation\3.6 +HKLM2=Software\TransarcCorporation\AFS Supplemental Documentation\1.0 4.01 [Data] Set0=Server @@ -156,19 +157,19 @@ Set6=Full_Client Set7=Docs [Client:HKLM:Software\TransarcCorporation\AFS Client\CurrentVersion] -PatchLevel=N,0 -BetaLevel=N,0 +PatchLevel=N,401 +BetaLevel=N,1 Revision=N,0 ---Comment---= (Default)=S, -MajorVersion=N,3 +MajorVersion=N,1 Title=S, InstallDateString=S, PathName=S,\Client Software Type=S,File System -MinorVersion=N,6 +MinorVersion=N,0 ReleaseType=S, -VersionString=S,3.6 +VersionString=S,1.0 4.01 Description=S, [Full_Client] @@ -177,33 +178,33 @@ Description=S, HKLM0=SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters [Docs:HKLM:Software\TransarcCorporation\AFS Supplemental Documentation\CurrentVersion] -PatchLevel=N,0 -BetaLevel=N,0 +PatchLevel=N,401 +BetaLevel=N,1 Revision=N,0 ---Comment---= (Default)=S, -MajorVersion=N,3 +MajorVersion=N,1 InstallDateString=S, PathName=S,\Documentation Software Type=S,File System -MinorVersion=N,6 +MinorVersion=N,0 ReleaseType=S, -VersionString=S,3.6 +VersionString=S,1.0 4.01 Description=S,AFS System Administration Documentation -[Server:HKLM:Software\TransarcCorporation\AFS Server\3.6] -PatchLevel=N,0 -BetaLevel=N,0 +[Server:HKLM:Software\TransarcCorporation\AFS Server\1.0 4.01] +PatchLevel=N,401 +BetaLevel=N,1 Revision=N,0 ---Comment---= (Default)=S, -MajorVersion=N,3 +MajorVersion=N,1 InstallDateString=S, PathName=S,\Server Software Type=S,File System -MinorVersion=N,6 +MinorVersion=N,0 ReleaseType=S, -VersionString=S,3.6 +VersionString=S,1.0 4.01 Description=S,AFS Server for Windows NT [Client:HKLM:SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider] @@ -228,19 +229,19 @@ AFS Client FME=S,\Client\Program\afs_fme.dll ---FileGroup---= HKLM0=SOFTWARE\Microsoft\Windows NT\CurrentVersion\File Manager\AddOns -[Docs:HKLM:Software\TransarcCorporation\AFS Supplemental Documentation\3.6] -PatchLevel=N,0 -BetaLevel=N,0 +[Docs:HKLM:Software\TransarcCorporation\AFS Supplemental Documentation\1.0 4.01] +PatchLevel=N,401 +BetaLevel=N,1 Revision=N,0 ---Comment---= (Default)=S, -MajorVersion=N,3 +MajorVersion=N,1 InstallDateString=S, PathName=S,\Documentation Software Type=S,File System -MinorVersion=N,6 +MinorVersion=N,0 ReleaseType=S, -VersionString=S,3.6 +VersionString=S,1.0 4.01 Description=S,AFS System Administration Documentation [General] @@ -252,18 +253,18 @@ Version=1.00.000 (Default)=S,{DC515C27-6CAC-11D1-BAE7-00C04FD140D2} [Server:HKLM:Software\TransarcCorporation\AFS Server\CurrentVersion] -PatchLevel=N,0 -BetaLevel=N,0 +PatchLevel=N,401 +BetaLevel=N,1 Revision=N,0 ---Comment---= (Default)=S, -MajorVersion=N,3 +MajorVersion=N,1 InstallDateString=S, PathName=S,\Server Software Type=S,File System -MinorVersion=N,6 +MinorVersion=N,0 ReleaseType=S, -VersionString=S,3.6 +VersionString=S,1.0 4.01 Description=S,AFS Server for Windows NT [Client:HKCR:CLSID\{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}] diff --git a/src/WINNT/install/InstallShield5/GenFileGroups.bat b/src/WINNT/install/InstallShield5/GenFileGroups.bat index ab12b9e..06b4fe2 100644 --- a/src/WINNT/install/InstallShield5/GenFileGroups.bat +++ b/src/WINNT/install/InstallShield5/GenFileGroups.bat @@ -81,10 +81,7 @@ rem -------------- Client_System32_Files.fgl --------------------------- echo [TopDir] > Client_System32_Files.fgl echo file0=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa.cpl >> Client_System32_Files.fgl echo file1=%MSVCDIR%\REDIST\Msvcrt.dll >> Client_System32_Files.fgl -echo file2=%SYSTEMROOT%\system32\Msvcrtd.dll >> Client_System32_Files.fgl -echo file3=%MSVCDIR%\REDIST\Mfc42.dll >> Client_System32_Files.fgl -echo file4=%SYSTEMROOT%\system32\mfc42d.dll >> Client_System32_Files.fgl -echo file5=%SYSTEMROOT%\system32\mfco42d.dll >> Client_System32_Files.fgl +echo file2=%MSVCDIR%\REDIST\Mfc42.dll >> Client_System32_Files.fgl echo. >> Client_System32_Files.fgl echo [General] >> Client_System32_Files.fgl echo Type=FILELIST >> Client_System32_Files.fgl @@ -159,11 +156,8 @@ rem -------------- Light_Client_System32_Files.fgl --------------------- echo [TopDir] > Light_Client_System32_Files.fgl echo file0=%MSVCDIR%\REDIST\Msvcrt.dll >> Light_Client_System32_Files.fgl -echo file1=%SYSTEMROOT%\system32\Msvcrtd.dll >> Light_Client_System32_Files.fgl -echo file2=%MSVCDIR%\REDIST\Mfc42.dll >> Light_Client_System32_Files.fgl -echo file3=%SYSTEMROOT%\system32\mfc42d.dll >> Light_Client_System32_Files.fgl -echo file4=%SYSTEMROOT%\system32\mfco42d.dll >> Light_Client_System32_Files.fgl -echo file5=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa.cpl >> Light_Client_System32_Files.fgl +echo file1=%MSVCDIR%\REDIST\Mfc42.dll >> Light_Client_System32_Files.fgl +echo file2=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa.cpl >> Light_Client_System32_Files.fgl echo. >> Light_Client_System32_Files.fgl echo [General] >> Light_Client_System32_Files.fgl echo Type=FILELIST >> Light_Client_System32_Files.fgl @@ -218,11 +212,8 @@ rem -------------- Light95_Client_System32_Files.fgl --------------------- echo [TopDir] > Light95_Client_System32_Files.fgl echo file0=%MSVCDIR%\REDIST\Msvcrt.dll >> Light95_Client_System32_Files.fgl -echo file1=%SYSTEMROOT%\system32\Msvcrtd.dll >> Light95_Client_System32_Files.fgl -echo file2=%MSVCDIR%\REDIST\Mfc42.dll >> Light95_Client_System32_Files.fgl -echo file3=%SYSTEMROOT%\system32\mfc42d.dll >> Light95_Client_System32_Files.fgl -echo file4=%SYSTEMROOT%\system32\mfco42d.dll >> Light95_Client_System32_Files.fgl -echo file5=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa.cpl >> Light95_Client_System32_Files.fgl +echo file1=%MSVCDIR%\REDIST\Mfc42.dll >> Light95_Client_System32_Files.fgl +echo file2=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa.cpl >> Light95_Client_System32_Files.fgl echo. >> Light95_Client_System32_Files.fgl echo [General] >> Light95_Client_System32_Files.fgl echo Type=FILELIST >> Light95_Client_System32_Files.fgl @@ -290,7 +281,6 @@ rem -------------- Server_System32_Files.fgl --------------------------- echo [TopDir] > Server_System32_Files.fgl echo file0=%IS5_DEST%\root.server\usr\afs\bin\afsserver.cpl >> Server_System32_Files.fgl echo file1=%MSVCDIR%\REDIST\Msvcrt.dll >> Server_System32_Files.fgl -echo file2=%SYSTEMROOT%\system32\Msvcrtd.dll >> Server_System32_Files.fgl echo. >> Server_System32_Files.fgl echo [General] >> Server_System32_Files.fgl echo Type=FILELIST >> Server_System32_Files.fgl @@ -346,7 +336,6 @@ rem -------------- Control_Center_System32_Files.fgl-------------------- echo [TopDir] > Control_Center_System32_Files.fgl echo file0=%IS5_DEST%\root.client\usr\vice\etc\afs_cpa.cpl >> Control_Center_System32_Files.fgl echo file1=%MSVCDIR%\REDIST\Msvcrt.dll >> Control_Center_System32_Files.fgl -echo file2=%SYSTEMROOT%\system32\Msvcrtd.dll >> Control_Center_System32_Files.fgl echo. >> Control_Center_System32_Files.fgl echo [General] >> Control_Center_System32_Files.fgl echo Type=FILELIST >> Control_Center_System32_Files.fgl @@ -373,12 +362,12 @@ call :Generate_Release_Notes_File_Group rem Trad_Chinese set FILEGROUP=Release_Notes_Trad_Chinese_Files.fgl set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_TW -call :Generate_Release_Notes_File_Group - -rem Simp_Chinese -set FILEGROUP=Release_Notes_Simp_Chinese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_CN -call :Generate_Release_Notes_File_Group +call :Generate_Release_Notes_File_Group + +rem Simp_Chinese +set FILEGROUP=Release_Notes_Simp_Chinese_Files.fgl +set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_CN +call :Generate_Release_Notes_File_Group rem German set FILEGROUP=Release_Notes_German_Files.fgl @@ -428,8 +417,8 @@ rem -------------- Generate the Install Guide file groups --------------- rem English set FILEGROUP=Install_Guide_English_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\en_US\Html -call :Generate_Install_Guide_File_Group +set IS5_DOC=%IS5_DOCROOT%\install\Documentation\en_US\Html +call :Generate_Install_Guide_File_Group rem Japanese set FILEGROUP=Install_Guide_Japanese_Files.fgl @@ -448,9 +437,9 @@ call :Generate_Install_Guide_File_Group rem Simp_Chinese set FILEGROUP=Install_Guide_Simp_Chinese_Files.fgl -set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_CN\Html +set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_CN\Html call :Generate_Install_Guide_File_Group - + rem German set FILEGROUP=Install_Guide_German_Files.fgl set IS5_DOC=%IS5_DOCROOT%\install\Documentation\de_DE\Html @@ -465,10 +454,10 @@ rem Portuguese set FILEGROUP=Install_Guide_Portuguese_Files.fgl set IS5_DOC=%IS5_DOCROOT%\install\Documentation\pt_BR\Html call :Generate_Install_Guide_File_Group - + goto Sys_Admin_Guide_Files -:Generate_Install_Guide_File_Group +:Generate_Install_Guide_File_Group echo [TopDir] > %FILEGROUP% echo file0=%IS5_DOC%\InstallGd\awqbg000.htm >> %FILEGROUP% echo file1=%IS5_DOC%\InstallGd\awqbg002.htm >> %FILEGROUP% @@ -932,21 +921,21 @@ set IS5_LANG=ko_KR set IS5_DOC=%IS5_DOCROOT%\install\Documentation\ko_KR\Html call :Generate_Doc_Misc_File_Group copy %AFSROOT%\src\WINNT\license\lang\%IS5_LANG%.rtf %AFSROOT%\src\WINNT\install\InstallShield5\lang\%IS5_LANG%\license.rtf - + rem Trad_Chinese set FILEGROUP=Doc_Misc_Trad_Chinese_Files.fgl set IS5_LANG=zh_TW set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_TW\Html call :Generate_Doc_Misc_File_Group -copy %AFSROOT%\src\WINNT\license\lang\%IS5_LANG%.rtf %AFSROOT%\src\WINNT\install\InstallShield5\lang\%IS5_LANG%\license.rtf - +copy %AFSROOT%\src\WINNT\license\lang\%IS5_LANG%.rtf %AFSROOT%\src\WINNT\install\InstallShield5\lang\%IS5_LANG%\license.rtf + rem Simp_Chinese set FILEGROUP=Doc_Misc_Simp_Chinese_Files.fgl set IS5_LANG=zh_CN set IS5_DOC=%IS5_DOCROOT%\install\Documentation\zh_CN\Html call :Generate_Doc_Misc_File_Group copy %AFSROOT%\src\WINNT\license\lang\%IS5_LANG%.rtf %AFSROOT%\src\WINNT\install\InstallShield5\lang\%IS5_LANG%\license.rtf - + rem German set FILEGROUP=Doc_Misc_German_Files.fgl set IS5_LANG=de_DE @@ -970,7 +959,7 @@ copy %AFSROOT%\src\WINNT\license\lang\%IS5_LANG%.rtf %AFSROOT%\src\WINNT\install goto Doc_Files -:Generate_Doc_Misc_File_Group +:Generate_Doc_Misc_File_Group echo [TopDir] > %FILEGROUP% echo file0=%IS5_DOC%\banner.gif >> %FILEGROUP% echo file1=%IS5_DOC%\books.gif >> %FILEGROUP% @@ -1262,7 +1251,7 @@ echo file0=%IS5_INCL%\afs\afs_args.h >> Client_Afs_Header_Files.fgl echo file1=%IS5_INCL%\afs\debug.h >> Client_Afs_Header_Files.fgl echo file2=%IS5_INCL%\afs\param.h >> Client_Afs_Header_Files.fgl echo file3=%IS5_INCL%\afs\afs_sysnames.h >> Client_Afs_Header_Files.fgl -echo file4=%IS5_INCL%\afs\bnode.h >> Client_Afs_Header_Files.fgl +echo file4=%IS5_INCL%\afs\permit_xprt.h >> Client_Afs_Header_Files.fgl echo file5=%IS5_INCL%\afs\stds.h >> Client_Afs_Header_Files.fgl echo file6=%IS5_INCL%\afs\icl.h >> Client_Afs_Header_Files.fgl echo file7=%IS5_INCL%\afs\procmgmt.h >> Client_Afs_Header_Files.fgl @@ -1349,6 +1338,7 @@ echo file87=%IS5_INCL%\afs\volser.h >> Client_Afs_Header_Files.fgl echo file88=%IS5_INCL%\afs\volint.h >> Client_Afs_Header_Files.fgl echo file89=%IS5_INCL%\afs\fs_stats.h >> Client_Afs_Header_Files.fgl echo file90=%IS5_INCL%\afs\bosint.h >> Client_Afs_Header_Files.fgl +echo file91=%IS5_INCL%\afs\bnode.h >> Client_Afs_Header_Files.fgl echo. >> Client_Afs_Header_Files.fgl echo [General] >> Client_Afs_Header_Files.fgl echo Type=FILELIST >> Client_Afs_Header_Files.fgl @@ -1425,3 +1415,4 @@ echo [General] >> Client_Sample_Files.fgl echo Type=FILELIST >> Client_Sample_Files.fgl echo Version=1.00.000 >> Client_Sample_Files.fgl +:EOF diff --git a/src/WINNT/install/InstallShield5/NTMakefile b/src/WINNT/install/InstallShield5/NTMakefile index db7f8f3..c679e5a 100644 --- a/src/WINNT/install/InstallShield5/NTMakefile +++ b/src/WINNT/install/InstallShield5/NTMakefile @@ -22,9 +22,16 @@ prep: $(CELLSERVDB) AFS_component_version_number.txt CompileScript.bat build: - BuildSetup.bat - xcopy/s/e "Media\Transarc AFS\Disk Images\disk1\*.*" $(DESTDIR)\WinInstall - copy AFS_component_version_number.txt $(DESTDIR)\WinInstall\Version.txt - del /q "Media\Transarc AFS\Disk Images\disk1\*.*" + BuildSetup.bat + xcopy/s/e/y "Media\Transarc AFS\Disk Images\disk1\*.*" $(DESTDIR)\WinInstall + copy AFS_component_version_number.txt $(DESTDIR)\WinInstall\Version.txt + $(DEL) /q "Media\Transarc AFS\Disk Images\disk1\*.*" +!IF ((EXIST("$(ISWEB)")) &&("$(ISWEB)"!="")) +! IF (!EXIST($(DESTDIR)\Wininstall\PackageWeb)) + $(MKDIR) $(DESTDIR)\Wininstall\PackageWeb +! ENDIF + $(DEL) /q $(DESTDIR)\Wininstall\PackageWeb\*.* + $(ISWEB)\Pftwwiz.exe $(AFSROOT)\src\winnt\install\InstallShield5\PackageWeb.pfw -s -a +!ENDIF install: prep build diff --git a/src/WINNT/install/InstallShield5/afsdcell.ini b/src/WINNT/install/InstallShield5/afsdcell.ini index a088d55..6536475 100644 --- a/src/WINNT/install/InstallShield5/afsdcell.ini +++ b/src/WINNT/install/InstallShield5/afsdcell.ini @@ -1,5 +1,3 @@ -# This file must change to specify a cell. -# The "511.01.01.01" represents an IP address. >PutCellNameHere # CellName Comment 511.01.01.01 #DBServerMachineName1 511.02.02.02 #DBServerMachineName2 diff --git a/src/WINNT/install/InstallShield5/lang/en_US/value.shl b/src/WINNT/install/InstallShield5/lang/en_US/value.shl index 1fbc3fd..aab0f0f 100644 --- a/src/WINNT/install/InstallShield5/lang/en_US/value.shl +++ b/src/WINNT/install/InstallShield5/lang/en_US/value.shl @@ -3,34 +3,34 @@ DEFAULT_INSTALL_DIR=IBM\AFS NOTHING_SELECTED_MSG=You must select something to install before continuing. DOWNGRADE_LIGHT_CLIENT_MSG=Downgrade AFS Light Client SETUP_FINISHED_MSG=Setup has finished installing AFS® for Windows on your computer. -TITLE_MAIN=AFS® for Windows 3.6 -SEVERE_DIALOG_TITLE=AFS® for Windows +TITLE_MAIN=Open AFS for Windows 1.0 4.01 +SEVERE_DIALOG_TITLE=Open AFS for Windows UPGRADE_CLIENT_MSG=Upgrade AFS Client -PRODUCT_VERSION_MINOR=6 +PRODUCT_VERSION_MINOR=0 CONFIGURING_AFS_CLIENT_SERVICE=Configuring the AFS Client service PRODUCT_NAME_CC=AFS Control Center PRODUCT_NAME_SERVER=AFS Server UPGRADE_CC_MSG=Upgrade AFS Control Center DOWNGRADE_SERVER_MSG=Downgrade AFS Server -UNINST_DISPLAY_NAME_LIGHT_CLIENT=AFS Light 3.6 +UNINST_DISPLAY_NAME_LIGHT_CLIENT=AFS Light 1.0 4.01 PRODUCT_NAME_LIGHT_CLIENT=AFS Light ERROR_COMPONENT=Component: COMPANY_NAME=TransarcCorporation REINSTALL_CLIENT_MSG=Reinstall AFS Client DOWNGRADE_CC_MSG=Downgrade AFS Control Center -UNINST_DISPLAY_NAME_DOCS=AFS Supplemental Documentation 3.6 +UNINST_DISPLAY_NAME_DOCS=AFS Supplemental Documentation 1.0 4.01 UNINST_KEY_SERVER=AFS Server VIEW_README_PROMPT_MSG=View the readme file INSTALL_LIGHT_CLIENT_MSG=AFS Light Client -PRODUCT_VERSION_TITLE=3.6 -UNINST_DISPLAY_NAME_CC=AFS Control Center 3.6 +PRODUCT_VERSION_TITLE=1.0 4.01 +UNINST_DISPLAY_NAME_CC=AFS Control Center 1.0 4.01 ERROR_FILEGROUP=File Group: ERROR_MOVEDATA=An error occurred during the move data process: %d CONFIGURING_AFS_SERVER_SERVICE=Configuring the AFS Server service CLIENT_DESC=AFS Client SET_NETWORK_PROVIDER_ERROR=Unable to configure the AFS Client as a Network Provider. -PRODUCT_VERSION_MAJOR=3 -UNINST_DISPLAY_NAME_SERVER=AFS Server 3.6 +PRODUCT_VERSION_MAJOR=1 +UNINST_DISPLAY_NAME_SERVER=AFS Server 1.0 4.01 SETUPUTILS_NOT_FOUND=The file InstallUtils.dll could not be loaded. Setup cannot continue. LIGHT_CLIENT_ALREADY_INSTALLED_MSG=AFS Light is already installed on this computer. SETUP_TYPE_MSG=Select the AFS® for Windows products that you wish to install: @@ -68,13 +68,13 @@ UNINST_KEY_CC=AFS Control Center UNINST_KEY_CLIENT=AFS Client UPGRADE_DOCS_MSG=Upgrade AFS Supplemental Documentation DOWNGRADE_PREP_MSG=Preparing to downgrade the %s. Please wait...this may be a lengthy process. -PRODUCT_VERSION_PATCH_LEVEL=0 +PRODUCT_VERSION_PATCH_LEVEL=401 NON_UPGRADABLE_SOFTWARE_INSTALLED_ERROR_MSG=Non-upgradable versions of this product are installed on your computer. These \nversions must be uninstalled before the current versions can be installed. CANT_INSTALL_BOTH_CLIENTS_MSG=Please select only one of the AFS Clients to install. You cannot install both. UNINST_KEY_LIGHT_CLIENT=AFS Light UPGRADE_LIGHT_CLIENT_MSG=Upgrade AFS Light Client UNINST_KEY_DOCS=AFS Supplemental Documentation -UNINST_DISPLAY_NAME_CLIENT=AFS Client 3.6 +UNINST_DISPLAY_NAME_CLIENT=AFS Client 1.0 4.01 REINSTALL_DOCS_MSG=Reinstall AFS Supplemental Documentation UPGRADE_PREP_MSG=Preparing to upgrade the %s. Please wait...this may be a lengthy process. MUST_BE_AN_ADMIN_MSG=You must be a member of the local Administrators group on this Windows system in order to install this product. diff --git a/src/WINNT/install/InstallShield5/setup.bmp b/src/WINNT/install/InstallShield5/setup.bmp index 6cefd61a1af7bf4041f9ae414b321c98d9657093..eba949add63a8d64effded3ebce87cddbea2ff38 100644 GIT binary patch literal 399222 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�=0_0Z0G08o*`& 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 YUtoIHK1cy7d%_z32P*9U-}jRJ-ykFo2LJ#7 diff --git a/src/WINNT/install/InstallShield5/setup.rul b/src/WINNT/install/InstallShield5/setup.rul index a9a6b45..6c44721 100644 --- a/src/WINNT/install/InstallShield5/setup.rul +++ b/src/WINNT/install/InstallShield5/setup.rul @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 1998 Transarc Corporation. +// Copyright (C) 1998 OpenAFS // All rights reserved. // // @@ -16,6 +16,7 @@ #include "sdlang.h" #include "sddialog.h" + ////////////////////// string defines //////////////////////////// // If the user places a file with this name in the same directory as @@ -2056,12 +2057,16 @@ end; /////////////////////////////////////////////////////////////////////////////// function AddPath(szPath) begin - LongPathToShortPath(szPath); - - if (AddToPath(szPath) < 0) then - ShowError(@ADD_PATH_ERROR, WARNING); + LongPathToShortPath(szPath); + if (bWin98 || bWin95) then + if (EzBatchAddPath ("Path", szPath, "", AFTER) < 0) then + ShowError(@ADD_PATH_ERROR, WARNING); + endif; + else + if (AddToPath(szPath) < 0) then + ShowError(@ADD_PATH_ERROR, WARNING); + endif; endif; - return 0; end; @@ -2736,3 +2741,5 @@ end; + + diff --git a/src/WINNT/install/Win9x/NTMakeFile b/src/WINNT/install/Win9x/NTMakeFile index 3b3837f..d0f8d46 100644 --- a/src/WINNT/install/Win9x/NTMakeFile +++ b/src/WINNT/install/Win9x/NTMakeFile @@ -6,6 +6,7 @@ # directory or online at http://www.openafs.org/dl/license10.html + !INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) !INCLUDE ..\..\..\config\NTMakefile.version OUTDIR = $(DESTDIR)\WinInstall @@ -14,12 +15,10 @@ OUTDIR = $(DESTDIR)\WinInstall COMPONENTS = \ INSTALL.BAT \ - UNINSTALL.BAT \ afsd.pif \ cellservdb \ - readme.doc \ + readme.RTF \ license.txt \ - AFSD.EXE \ templet.reg \ runonce.pif \ $(DESTDIR)\bin\util_cr.exe \ @@ -38,11 +37,11 @@ COMPONENTS = \ $(DESTDIR)\lib\win95\pthread.dll \ $(DESTDIR)\lib\afsrpc.dll - -$(COMPONENTS):: +$(COMPONENTS):: + $(DESTDIR)\bin\util_cr.exe ~ $@ "Missing $@" $(COPY) $@ $(DESTDIR)\WinInstall\. -!IF (EXIST(ISBUILD.H)) +!IF (EXIST(ISBUILD.MAK)) !INCLUDE ISBUILD.MAK !ENDIF @@ -57,9 +56,7 @@ clean :: $(DEL) $(OUTDIR)\DiskIm~1\Disk1\* $(DEL) $(OUTDIR)\DiskIm~1\WebInstall\* -.SILENT: prep : - if not exist $(DESTDIR)\WinInstall\sock.vxd $(DESTDIR)\bin\util_cr.exe ~ "SOCK.VXD is missing from $(DESTDIR)\WinInstall\." - if not exist $(DESTDIR)\WinInstall\mmap.vxd $(DESTDIR)\bin\util_cr.exe ~ "MMAP.VXD is missing from $(DESTDIR)\WinInstall\." - if not exist $(DESTDIR)\WinInstall\afsd.exe $(DESTDIR)\bin\util_cr.exe ~ "AFSD.EXE is missing from $(DESTDIR)\WinInstall\." - + $(DESTDIR)\bin\util_cr.exe ~ "$(DESTDIR)\WinInstall\sock.vxd" "SOCK.VXD is missing from $(DESTDIR)\WinInstall\." + $(DESTDIR)\bin\util_cr.exe ~ "$(DESTDIR)\WinInstall\MMAP.vxd" "MMAP.VXD is missing from $(DESTDIR)\WinInstall\." + $(DESTDIR)\bin\util_cr.exe ~ "$(DESTDIR)\WinInstall\AFSD.EXE" "AFSD.EXE is missing from $(DESTDIR)\WinInstall\." diff --git a/src/WINNT/license/lang/en_US.ide b/src/WINNT/license/lang/en_US.ide index 6473cae0e7eab2d850d354319689591a8de25342..2efcf2de2968ece50837c37aca19b59b24e9667c 100644 GIT binary patch literal 604 zcmYL`-Acny5QOJi@Es1lmedxnq*hcA3RVkxFNvlZsI8@9GmJRmyqIwB??G9Py5ZdQh#ke$>F6X|4_ReO<=6ARfWoz-hR1 zq6PJiDzJMLTQV!~mXkCF`9S5EOQGM;p+@1vPsFR3w?=aw`mHjZ>r4Zxhk6SYYqoHw zRPEq2R3?x-x)r>CnNq-^<`y^Ms7pWz2iRMg_Yq*dpmEZg;S1 zM&>d0NOUMs%fTx!`{WAGW_QfDC*IP2+SLtPU8~F4#mT5#Q)4fuu>EfM16{N$zWW)D zy?gwREOeG2cIo8Q1YQl({x0eE9Ct~##CbV%NxEbDS28`6tagRdxB3S6WCeWt_l5U+ JZBMd~{{cT4XA1xT literal 4802 zcmcJT-ESL36vgKmiT`1hry@bqBv3&Vfp>8G@-yDD9#fqq@2Ykgm6 zB*wSWVfs!hhIw|aYn5JV=6RZ?d75bULZeeXvHh9mzfM2rdB>VDm9@EMO;VkA8S8tY zQT#a7_oZgs>VBYE*uL!S#jI=D9%*c@`$c1!-7lN9Y$TiEC0?+C z9Y^{rBUqR=draje-b@u|*_F7x%T+7xf&8daH`Zzev!jf|nXFFq!Or817^oHG`c{6( z$epEq?NFto^mRJX_ny{1RW83s@6t?v`$7`*2I&`}kF`}h*V-4n=Z&pTWMMBoNgv7T zPWp7CwHKKcWYO`5KRX*&9cdN$f+yqjTMMzOVNaFbEO90y-)JuAY|DREEwtuT=#q(N zd2E(#mMC^NdeBGVB*%XvZ(uV_c&>=x$yeFCh-+84JP|6}x<1tvoHn8TRyFjkth|y{ zSOveZUpH89#;Gs>PpHjG)mOFZb4T}w@|A46PD|Aljt2Yp8$R7{&Gy!1wJ>pg4OhzN zAR{-BhZE(5Nbkg=Q#~Jwe^sL)ZMHntQ&fXmvTjg)S6Wv!ysfjPN>8TBa8Uzlzt&u; zx7OORb|bD^-NCI=o84T0sFARRM#WAGS)a=$I4|<*sCYOw(@a>$>_^(kdw?t6f0@45 zH@x&}_(Rp96lf9i>hyu0p6d=K<0t&*F1!JyU**L(uXTeVy3v zK6+T1$QCRzo}pb-EtO~8xsz4;FQV)ACGIb}eGwW%FHtXJEu1!^tSnsnXUSgXb)QEM zIU5UCUuSl#veC%gDu%iKz#@9Rz|q`^o)E@@O8ZO(AN17yA$Z*A!?V&2SnqgN_)S+u zyr>hqVtc0Vq1Kj@0~>I+u;k&$eVmbdtF^>eNy+FFP{eg7e?jY?D(^_1x=#sSQe{3D zN|e+faS}aO;`OS)+*yf=J`)<&h$^j%1@(Y~cS~;h^w?BK_f-XI!5N5OQA1`XztJD+ zW1e${=VUGFqnxsI9CQdo=G;2ZJfW|}I=y1_`0VPKhkD9c7+s{#PVecHb|DUN-kX>1 z3u~>W7O~UTx>BKFy`4Sx=^Q6^%xGr^zc|GsF6I!s*@|v2G)6VI)!NU9i)?~#SyRU7 zyx=yS2U>z3tf9*>3;Hqi^%`}#)Jn%W(n>TLm3`Fkq>{~d@)s4O%fTW%Bx|m8KO;lu zTHAgWQQF7Ja*Qs?ib^H}nRXWv{noMeDesWsCw!kbnZrBIG4|rkHFyOEp#+=qVV*^& z)K`P@`~F_Rox+Lm>8s6;`I-F)ZakNt=pAugE!kVt;y!Kd+K1V}cb|#oQ+JlL{ctaQ zGOxbd_xlWHL_caiqgCsxG4kPakSvw6&YHA(j?|fl<~-3Am4B)AaNWEu7;HE1l2iio zdAo6ca$jbxLtMKjM*Wq3U5J-dQ_1ds zYqwJUhcDD6^-GoFN5O^>zqjyiT5F8|x_~hn7;iCs|4*|nMuuJpjU&xH(!27pzE5NY kU1!JghK}~Yc2MZoH9JLBKg<5i^0oN6nyCY+Z1n1X0^0^MLI3~& diff --git a/src/WINNT/pthread/NTMakefile b/src/WINNT/pthread/NTMakefile index 3d33271..fc2aa88 100644 --- a/src/WINNT/pthread/NTMakefile +++ b/src/WINNT/pthread/NTMakefile @@ -44,9 +44,9 @@ $(PTHR95_DLLFILE): $(PTHR95_DLLOBJS) pthread_95.obj: pthread.c $(C2OBJ) pthread.c -DAFS_WIN95_ENV /Fopthread_95.obj -install: $(PTHR_DLLFILE) $(LIBINCLUDES) - -install9x: $(PTHR95_DLLFILE) install +install: $(PTHR95_DLLFILE) $(PTHR_DLLFILE) $(LIBINCLUDES) + +install9x: install pthread.res: pthread.rc AFS_component_version_number.h $(RC) $*.rc diff --git a/src/WINNT/win9xpanel/NTMakefile b/src/WINNT/win9xpanel/NTMakefile index 9bb7933..4f4c140 100644 --- a/src/WINNT/win9xpanel/NTMakefile +++ b/src/WINNT/win9xpanel/NTMakefile @@ -47,6 +47,9 @@ RSC=rc.exe HLPDIR= .\HELP +prep : + $(DESTDIR)\bin\util_cr.exe ~ "$(MSSDK)\Include\windows.h" "MSSDK must point to SDK include headers " + !IF "$(AFSDEV_BUILDTYPE)" == "FREE" INTDIR=. @@ -54,7 +57,7 @@ HLP=hcrtf.exe HLP_PROJ = /x # Begin Custom Macros # End Custom Macros - + INSTALL : prep "$(OUTDIR)\WinAfsLoad.exe" "$(OUTDIRHLP)\afswin9x.HLP" "$(OUTDIR)\afswin9x.CNT" CLEAN :: @@ -330,7 +333,3 @@ SOURCE=.\WinAfsLoadDlg.cpp install9x: install -.SILENT: -prep : - if not exist $(MSSDK)\Include\$(NULL) $(DESTDIR)\bin\util_cr.exe ~ "MSSDK must point to SDK include headers " - diff --git a/src/config/Makefile.i386_djgpp b/src/config/Makefile.i386_djgpp index 0a06bf9..fc57153 100644 --- a/src/config/Makefile.i386_djgpp +++ b/src/config/Makefile.i386_djgpp @@ -13,8 +13,8 @@ DESTDIR=DEST/ SRCDIR=DEST/ # compilation and link editor flags -DBG=-g -#OPTMZ=-O2 +#DBG=-g +OPTMZ=-O2 #PAM_CFLAGS = -O2 -Dlinux -DLINUX_PAM -fPIC # Put -O2 here to _ensure_ all Makefiles pick it up. XCFLAGS= ${DBG} -Dfds_bits=fd_bits diff --git a/src/config/NTMakefile b/src/config/NTMakefile index 6d1673a..9d27966 100644 --- a/src/config/NTMakefile +++ b/src/config/NTMakefile @@ -26,7 +26,7 @@ INCFILES =\ $(INCFILEDIR)\afs_sysnames.h \ $(INCFILEDIR)\stds.h \ $(INCFILEDIR)\icl.h - + $(INCFILEDIR)\param.h: param.$(SYS_NAME).h $(COPY) $? $@ @@ -90,7 +90,29 @@ idirs: doclink $(MKDIR) $(DESTDIR)\root.client\usr\vice\etc ! ENDIF - +INCCOPY = \ + $(DESTDIR)\bin\rmbat.bat \ + $(DESTDIR)\bin\rmbat.rsp \ + $(DESTDIR)\bin\NTBUILD.bat + +$(DESTDIR)\bin\rmbat.bat:..\rmbat.bat + $(COPY) $? $@ + util_cr + $@ + +$(DESTDIR)\bin\rmbat.rsp:..\rmbat.rsp + $(COPY) $? $@ + +$(DESTDIR)\bin\NTBUILD.bat:..\NTBUILD.bat + $(COPY) $? $@ + util_cr + $@ + +$(DESTDIR)\bin\NTLang.bat: NTLang.bat util_cr.exe + $(COPY) NTLang.bat $(DESTDIR)\bin + util_cr + $(DESTDIR)\bin\NTLang.bat + +$(DESTDIR)\NTDllmap.txt:NTDllmap.txt + $(COPY) $? $@ + # Create link to docs needed for media build; allow to fail in case # symlink not available, e.g. if using a 3.4a client, since most builds # aren't media builds. @@ -111,34 +133,29 @@ NTMakefile.version: NTMakefile.version-CML NTMakefile.version-NOCML $(COPY) NTMakefile.version-NOCML NTMakefile.version ! ENDIF -$(DESTDIR)\bin\util_cr.exe: util_cr.exe - $(COPY) util_cr.exe $(DESTDIR)\bin - -$(DESTDIR)\bin\touch.exe: touch.exe - $(COPY) touch.exe $(DESTDIR)\bin - -$(DESTDIR)\bin\mkvers.exe: mkvers.exe - $(COPY) mkvers.exe $(DESTDIR)\bin - - -$(DESTDIR)\NTDllmap.txt: NTDllmap.txt - $(COPY) NTDllmap.txt $(DESTDIR) - - -# $$$: make CR/LF when doing copy here -$(DESTDIR)\bin\NTLang.bat: NTLang.bat util_cr.exe - $(COPY) NTLang.bat $(DESTDIR)\bin - util_cr + $(DESTDIR)\bin\NTLang.bat - -util_cr.obj : util_cr.c - $(cc) $(cflags) $(cdebug) $(cvarsdll) $(afscflags) $(afscdefs) $*.c - +INCTOOLS = \ + $(DESTDIR)\bin\mkvers.exe \ + $(DESTDIR)\bin\util_cr.exe \ + $(DESTDIR)\bin\touch.exe + +#mkvers.exe : mkvers.obj +# $(EXECONLINK) + +$(DESTDIR)\bin\mkvers.exe:mkvers.exe + $(COPY) mkvers.exe $(DESTDIR)\bin\. + +$(DESTDIR)\bin\util_cr.exe:util_cr.exe + $(COPY) util_cr.exe $(DESTDIR)\bin\. + util_cr.exe : util_cr.obj $(EXECONLINK) + +$(DESTDIR)\bin\touch.exe:touch.exe + $(COPY) touch.exe $(DESTDIR)\bin\. langsetup: $(DESTDIR)\bin\NTLang.bat -install: idirs version $(DESTDIR)\bin\touch.exe $(DESTDIR)\bin\util_cr.exe $(INCFILES) $(DESTDIR)\NTDllmap.txt langsetup +install: idirs $(INCTOOLS) $(INCCOPY) version $(INCFILES) $(DESTDIR)\NTDllmap.txt langsetup install9x: install @@ -149,4 +166,9 @@ clean_version: clean:: $(DEL) $(DESTDIR)\LIB\*.DLL - $(DEL) $(DESTDIR)\bin\mkvers.exe \ No newline at end of file + $(DEL) $(DESTDIR)\bin\mkver.exe + $(DEL) $(DESTDIR)\bin\touch.exe + $(DEL) $(DESTDIR)\bin\util_cr.exe + $(DEL) mkver.exe + $(DEL) touch.exe + $(DEL) util_cr.exe \ No newline at end of file diff --git a/src/config/NTMakefile.i386_nt40 b/src/config/NTMakefile.i386_nt40 index d5e3428..54b095f 100644 --- a/src/config/NTMakefile.i386_nt40 +++ b/src/config/NTMakefile.i386_nt40 @@ -114,6 +114,7 @@ DESTDIR = $(AFSROOT)\DEST # Command macros. COPY = copy DEL = -del +#DEL = $(DESTDIR)\BIN\rmbat # win 98 must use batch file MKDIR = mkdir REN = ren ECHO = echo diff --git a/src/config/NTMakefile.i386_win95 b/src/config/NTMakefile.i386_win95 index a5b801b..22e2feb 100644 --- a/src/config/NTMakefile.i386_win95 +++ b/src/config/NTMakefile.i386_win95 @@ -124,7 +124,7 @@ DESTDIR = $(AFSROOT)\DEST COPY = copy #DEL = del #DEL = rm -f # to delete multiple files on one command line -DEL = $(AFSROOT)\src\rmbat # win 98 must use batch file +DEL = $(DESTDIR)\BIN\rmbat # win 98 must use batch file MKDIR = mkdir REN = ren ECHO = echo diff --git a/src/config/util_cr.c b/src/config/util_cr.c index 1b05d79..ded70a5 100644 --- a/src/config/util_cr.c +++ b/src/config/util_cr.c @@ -9,7 +9,8 @@ */ #include "stdio.h" -#include "io.h" +#include "io.h" +#include #include "string.h" #include "process.h" #include "windows.h" @@ -23,7 +24,7 @@ void usuage() OR util_cr * \"-[register key value]\" ; aremove register key value\n\ OR util_cr & file.ini \"SectionKey=value\" ; update ini-ipr-pwf file\n\ OR util_cr ~ ;force error\n"); - exit(1); + exit(0xc000); } @@ -46,7 +47,7 @@ void Addkey (const char *hkey,const char *subkey,const char *stag,const char *sv if(!result) { printf("AFS Error - Could Not create a registration key\n"); - exit(1); + exit(0xc000); } if (stag==NULL) return; if ((sval)&&(strlen(sval))) @@ -65,7 +66,7 @@ void Addkey (const char *hkey,const char *subkey,const char *stag,const char *sv if(result!=ERROR_SUCCESS) { printf("AFS Error - Could Not create a registration key\n"); - exit(1); + exit(0xc000); } } @@ -85,7 +86,7 @@ void Subkey(const char *hkey,const char *subkey) if(result!=ERROR_SUCCESS) { printf("AFS Error - Could Not create a registration key\n"); - exit(1); + exit(0xc000); } } @@ -96,13 +97,16 @@ int main(int argc, char* argv[]) int l,i; char **pvar,*ch; long len; - typedef char * CHARP; + typedef char * CHARP; if (argc<3) usuage(); if (strcmp(argv[1],"~")==0) - { - exit(2); + { //check for file presence + if (fopen(argv[2],"r")) + return(0); + printf("Error---%s\n",argv[3]); + exit(0xc000); } if (strcmp(argv[1],"*")==0) { /* "[HKEY_CLASSES_ROOT\CLSID\{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}] @=AFS Client Shell Extension" */ @@ -117,7 +121,7 @@ int main(int argc, char* argv[]) if ((ssub==NULL) || (skey==NULL)) { printf("format error parameter %s\n",argv[i]); - exit(1); + exit(0xc000); } option=(*ssub=='-'); stag=strtok(NULL,"\0"); @@ -158,7 +162,7 @@ int main(int argc, char* argv[]) if ((ssect==NULL) || (skey==NULL)) { printf("format error parameter %s\n",argv[i]); - exit(1); + exit(0xc000); } while(*skey==' ') skey++; @@ -167,9 +171,9 @@ int main(int argc, char* argv[]) if (sval==NULL) { printf("format error parameter %s\n",argv[i]); - exit(1); + exit(0xc000); } - printf("parameters %s %s %s %s\n",ssect,skey,sval,argv[2]); +// printf("parameters %s %s %s %s\n",ssect,skey,sval,argv[2]); if (WritePrivateProfileString(ssect,skey,sval,argv[2])==0) { LPVOID lpMsgBuf; @@ -186,7 +190,7 @@ int main(int argc, char* argv[]) ); printf("Error writing profile string - %s",lpMsgBuf); LocalFree( lpMsgBuf ); - exit(1); + exit(0xc000); } argc-=1; } @@ -197,7 +201,7 @@ int main(int argc, char* argv[]) { file=fopen(fname,"rb"); if (file==NULL) - exit(2); + exit(0xc000); len=filelength(_fileno(file)); ch=(char *)malloc(len+2); *ch++=0; /* a small hack to allow matching /r/n if /n is first character*/ @@ -220,7 +224,7 @@ int main(int argc, char* argv[]) strcpy(fname,argv[2]); file=fopen(fname,"rb"); if (file==NULL) - exit(2); + exit(0xc000); len=filelength(_fileno(file)); ch=(char *)malloc(len+1); len=fread(ch,sizeof(char),len,file); @@ -238,7 +242,7 @@ int main(int argc, char* argv[]) strcat(fname,".et"); file=fopen(fname,"rb"); if (file==NULL) - exit(2); + exit(0xc000); len=filelength(_fileno(file)); ch=(char *)malloc(len+1); len=fread(ch,sizeof(char),len,file); diff --git a/src/kauth/krb_udp.c b/src/kauth/krb_udp.c index d5e5ad7..eec4a84a 100644 --- a/src/kauth/krb_udp.c +++ b/src/kauth/krb_udp.c @@ -17,6 +17,7 @@ #include #ifdef AFS_NT40_ENV #include +#define snprintf _snprintf #else #include #include diff --git a/src/lwp/process.s b/src/lwp/process.s index 4c7f9fc..d24af7c 100644 --- a/src/lwp/process.s +++ b/src/lwp/process.s @@ -8,9 +8,9 @@ */ #define IGNORE_STDS_H 1 -#ifndef AFS_DJGPP_ENV +/*#ifndef AFS_DJGPP_ENV*/ #include -#endif /* AFS_DJGPP_ENV */ +/*#endif /* AFS_DJGPP_ENV */ #if defined(RIOS) @@ -1187,14 +1187,23 @@ LEAF(returnto,1) .set newsp,16 +#ifdef AFS_DJGPP_ENV +.globl _PRE_Block +.globl _savecontext +_savecontext: +#else .globl PRE_Block .globl savecontext - savecontext: +#endif /* AFS_DJGPP_ENV */ pushl %ebp /* New Frame! */ movl %esp,%ebp pusha /* Push all registers */ +#ifdef AFS_DJGPP_ENV + movl $1,_PRE_Block /* Pre-emption code */ +#else movl $1,PRE_Block /* Pre-emption code */ +#endif /* AFS_DJGPP_ENV */ movl area1(%ebp),%eax /* eax = base of savearea */ movl %esp,(%eax) /* area->topstack = esp */ movl newsp(%ebp),%eax /* get new sp into eax */ @@ -1206,7 +1215,11 @@ L1: /* Shouldnt be here....*/ +#ifdef AFS_DJGPP_ENV + call _abort +#else call abort +#endif /* AFS_DJGPP_ENV */ /* * returnto(area2) @@ -1216,21 +1229,33 @@ L1: /* stack offset */ .set area2,8 +#ifdef AFS_DJGPP_ENV +.globl _returnto +_returnto: +#else .globl returnto - returnto: +#endif /* AFS_DJGPP_ENV */ pushl %ebp movl %esp, %ebp /* New frame, to get correct pointer */ movl area2(%ebp),%eax /* eax = area2 */ movl (%eax),%esp /* restore esp */ popa +#ifdef AFS_DJGPP_ENV + movl $0,_PRE_Block /* clear it up... */ +#else movl $0,PRE_Block /* clear it up... */ +#endif /* AFS_DJGPP_ENV */ popl %ebp ret /* I see, said the blind man, as he picked up his hammer and saw! */ pushl $1234 +#ifdef AFS_DJGPP_ENV + call _abort +#else call abort +#endif /* AFS_DJGPP_ENV */ #endif /* AFS_NCR_ENV */ diff --git a/src/rmbat.bat b/src/rmbat.bat index 08148a7..ccc3328 100644 --- a/src/rmbat.bat +++ b/src/rmbat.bat @@ -11,6 +11,6 @@ if [%1]==[-f] shift if [%1]==[/f] shift if [%1]==[-F] shift if [%1]==[/F] shift -if not [%1]==[] del %1 <%AFSROOT%\src\rmbat.rsp +if not [%1]==[] del %1 <%AFSROOT%\DEST\BIN\rmbat.rsp if not [%1]==[] shift -if not [%1]==[] %AFSROOT%\src\rmbat %1 %2 %3 %4 %5 %6 %7 %8 +if not [%1]==[] %AFSROOT%\DEST\BIN\rmbat %1 %2 %3 %4 %5 %6 %7 %8 diff --git a/src/rmbat.rsp b/src/rmbat.rsp index 975fbec..5758d80 100644 --- a/src/rmbat.rsp +++ b/src/rmbat.rsp @@ -1 +1 @@ -y +y diff --git a/src/rx/Makefile b/src/rx/Makefile index ec83898..18739c4 100644 --- a/src/rx/Makefile +++ b/src/rx/Makefile @@ -37,11 +37,11 @@ XMIT_H = rx_xmit_nt.h XDROBJS_djgpp = xdr.o xdr_rec.o xdr_stdio.o \ xdr_float.o xdr_refernce.o xdr_update.o \ - xdr_array.o xdr_mem.o + xdr_array.o xdr_mem.o xdr_rx.o xdr_afsuuid.o RXOBJS_djgpp = rx_clock.o rx_event.o rx_user.o rx_lwp.o rx.o rx_null.o rx_globals.o \ rx_getaddr.o rx_misc.o rx_packet.o rx_rdwr.o rx_trace.o rx_conncache.o \ - $(XMIT) + xdr_int64.o $(XMIT) BASICINCLS = ${SRCDIR}include/lwp.h ${SRCDIR}include/lock.h \ rx_clock.h rx_queue.h rx_event.h diff --git a/src/sys/pioctl_nt.c b/src/sys/pioctl_nt.c index fa2981f..8be9093 100644 --- a/src/sys/pioctl_nt.c +++ b/src/sys/pioctl_nt.c @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -28,9 +29,8 @@ #include #include #include - + #include -#include #include static char AFSConfigKeyName[] = diff --git a/src/tbutc/NTMakefile b/src/tbutc/NTMakefile index 1a85916..6848183 100644 --- a/src/tbutc/NTMakefile +++ b/src/tbutc/NTMakefile @@ -47,8 +47,8 @@ BUTMINCLUDE = -I$(DESTDIR)\include BUTCOBJS = dbentries.obj tcprocs.obj lwps.obj tcmain.obj list.obj recoverDb.obj \ tcudbprocs.obj dump.obj tcstatus.obj butc_xbsa.obj \ $(LWPOBJS) $(BUCOORDOBJS) -BUTCINCLUDE= -I. -I$(DESTDIR)\include -I$(XBSADIR)\ -BUTCLIBS = $(DESTDIR)\lib\afs\afsbudb.lib \ +BUTCINCLUDE= -I. -I$(DESTDIR)\include -I$(XBSADIR) +BUTCLIBS=$(DESTDIR)\lib\afs\afsbudb.lib \ $(DESTDIR)\lib\afs\afsbubasics.lib \ $(VOLSERLIBS) \ $(BUTMLIBS) \ @@ -93,7 +93,7 @@ include ..\config\NTMakefile.version # nmake /nologo /f ntmakefile install #----------------------------------------------- BUTC -$(BUTCEXE): $(BUTCOBJS) $(BUTCLIBS) +$(BUTCEXE): $(BUTCOBJS) $(BUTCLIBS) $(EXECONLINK) $(EXEPREP) -- 1.9.4