case-sensitivity-20040508
[openafs.git] / src / WINNT / afsd / smb.c
index 5fcb691..423ed0a 100644 (file)
@@ -111,6 +111,9 @@ int smb_RawBufSel[SMB_RAW_BUFS];
 char *smb_RawBufs;
 #endif /* DJGPP */
 
+#define SMB_MASKFLAG_TILDE 1
+#define SMB_MASKFLAG_CASEFOLD 2
+
 #define RAWTIMEOUT INFINITE
 
 /* for raw write */
@@ -139,8 +142,10 @@ int smb_hideDotFiles;
 int smb_useV3;         /* try to negotiate V3 */
 
 #ifndef DJGPP
+static showErrors = 1;
 /* MessageBox or something like it */
-int (WINAPI *smb_MBfunc)(HWND, LPCTSTR, LPCTSTR, UINT) = NULL;
+int (_stdcall *smb_MBfunc)(HWND, LPCTSTR, LPCTSTR, UINT) = NULL;
+extern HANDLE WaitToTerminate;
 #endif /* DJGPP */
 
 /* GMT time info:
@@ -400,7 +405,7 @@ void ShowUnixTime(char *FuncName, long unixTime)
        smb_LargeSearchTimeFromUnixTime(&ft, unixTime);
                 
        if (!FileTimeToDosDateTime(&ft, &wDate, &wTime))
-               osi_Log1(afsd_logp, "Failed to convert filetime to dos datetime: %d", GetLastError());
+               osi_Log1(smb_logp, "Failed to convert filetime to dos datetime: %d", GetLastError());
        else {
                int day, month, year, sec, min, hour;
                char msg[256];
@@ -414,7 +419,7 @@ void ShowUnixTime(char *FuncName, long unixTime)
                hour = ExtractBits(wTime, 11, 5);
 
                sprintf(msg, "%s = %02d-%02d-%04d %02d:%02d:%02d", FuncName, month, day, year, hour, min, sec);
-               osi_Log1(afsd_logp, "%s", osi_LogSaveString(afsd_logp, msg));
+               osi_Log1(smb_logp, "%s", osi_LogSaveString(smb_logp, msg));
        }
 }
 #endif /* DJGPP */
@@ -528,7 +533,14 @@ smb_CalculateNowTZ()
        local_tm = *(localtime(&t));
 
        days = local_tm.tm_yday - gmt_tm.tm_yday;
-       hours = 24 * days + local_tm.tm_hour - gmt_tm.tm_hour - (local_tm.tm_isdst ? 1 : 0);
+       hours = 24 * days + local_tm.tm_hour - gmt_tm.tm_hour
+#ifdef COMMENT
+        /* There is a problem with DST immediately after the time change
+         * which may continue to exist until the machine is rebooted
+         */
+        - (local_tm.tm_isdst ? 1 : 0)
+#endif /* COMMENT */
+        ;
        minutes = 60 * hours + local_tm.tm_min - gmt_tm.tm_min;
        seconds = 60 * minutes + local_tm.tm_sec - gmt_tm.tm_sec;
 
@@ -973,6 +985,7 @@ smb_fid_t *smb_FindFID(smb_vc_t *vcp, unsigned short fid, int flags)
        smb_fid_t *fidp;
        int newFid;
         
+       lock_ObtainWrite(&smb_rctLock);
        /* figure out if we need to allocate a new file ID */
        if (fid == 0) {
                newFid = 1;
@@ -980,7 +993,6 @@ smb_fid_t *smb_FindFID(smb_vc_t *vcp, unsigned short fid, int flags)
        }
        else newFid = 0;
 
-       lock_ObtainWrite(&smb_rctLock);
 retry:
        for(fidp = vcp->fidsp; fidp; fidp = (smb_fid_t *) osi_QNext(&fidp->q)) {
                if (fid == fidp->fid) {
@@ -1010,7 +1022,8 @@ retry:
             afsi_log("Event Object Already Exists: %s", eventName);
         if (newFid) {
                        vcp->fidCounter = fid+1;
-            if (vcp->fidCounter == 0) vcp->fidCounter = 1;
+            if (vcp->fidCounter == 0) 
+                vcp->fidCounter = 1;
         }
     }
     lock_ReleaseWrite(&smb_rctLock);
@@ -1269,17 +1282,24 @@ int smb_FindShare(smb_vc_t *vcp, smb_packet_t *inp, char *shareName,
     } 
     else /* create  \\<netbiosName>\<cellname>  */
     {
+        char * p = shareName; 
+        int rw = 0;
+
+        if ( *p == '.' ) {
+            p++;
+            rw = 1;
+        }
         /* Get the full name for this cell */
-        code = cm_SearchCellFile(shareName, temp, 0, 0);
+        code = cm_SearchCellFile(p, temp, 0, 0);
 #ifdef AFS_AFSDB_ENV
                if (code && cm_dnsEnabled) {
             int ttl;
-            code = cm_SearchCellByDNS(shareName, temp, &ttl, 0, 0);
+            code = cm_SearchCellByDNS(p, temp, &ttl, 0, 0);
         }
 #endif
         /* construct the path */
-        if (code == 0) {
-            sprintf(pathName,"/%s/",temp);
+        if (code == 0) {     
+            sprintf(pathName,rw ? "/.%s/" : "/%s/",temp);
             *pathNamep = strdup(strlwr(pathName));
             return 1;
         }
@@ -1289,6 +1309,48 @@ int smb_FindShare(smb_vc_t *vcp, smb_packet_t *inp, char *shareName,
     return 0;
 }
 
+/* Client-side offline caching policy types */
+#define CSC_POLICY_MANUAL 0
+#define CSC_POLICY_DOCUMENTS 1
+#define CSC_POLICY_PROGRAMS 2
+#define CSC_POLICY_DISABLE 3
+
+int smb_FindShareCSCPolicy(char *shareName)
+{
+       DWORD len;
+       char policy[1024];
+       char sbmtpath[256];
+
+#ifndef DJGPP
+        strcpy(sbmtpath, "afsdsbmt.ini");
+#else /* DJGPP */
+        strcpy(sbmtpath, cm_confDir);
+        strcat(sbmtpath, "/afsdsbmt.ini");
+#endif /* !DJGPP */
+       len = GetPrivateProfileString("CSC Policy", shareName, "",
+                                     policy, sizeof(policy), sbmtpath);
+       if (len == 0 || len == sizeof(policy) - 1) {
+               return CSC_POLICY_MANUAL;
+       }
+       
+       if (stricmp(policy, "documents") == 0)
+       {
+               return CSC_POLICY_DOCUMENTS;
+       }
+       
+       if (stricmp(policy, "programs") == 0)
+       {
+               return CSC_POLICY_PROGRAMS;
+       }
+       
+       if (stricmp(policy, "disable") == 0)
+       {
+               return CSC_POLICY_DISABLE;
+       }
+       
+       return CSC_POLICY_MANUAL;
+}
+
 /* find a dir search structure by cookie value, and return it held.
  * Must be called with smb_globalLock held.
  */
@@ -1666,7 +1728,7 @@ unsigned int smb_GetSMBParm(smb_packet_t *smbp, int parm)
 
                sprintf(s, "Bad SMB param %d out of %d, ncb len %d",
                                parm, parmCount, smbp->ncb_length);
-               osi_Log0(afsd_logp, s);
+               osi_Log0(smb_logp, s);
 #endif /* !DJGPP */
                osi_panic(s, __FILE__, __LINE__);
        }
@@ -1701,7 +1763,7 @@ unsigned int smb_GetSMBOffsetParm(smb_packet_t *smbp, int parm, int offset)
                sprintf(s, "Bad SMB param %d offset %d out of %d, "
                                "ncb len %d",
                                 parm, offset, parmCount, smbp->ncb_length);
-               osi_Log0(afsd_logp, s);
+               osi_Log0(smb_logp, s);
 #endif /* !DJGPP */
 
                osi_panic(s, __FILE__, __LINE__);
@@ -1858,7 +1920,7 @@ void smb_SendPacket(smb_vc_t *vcp, smb_packet_t *inp)
 {
        NCB *ncbp;
        int extra;
-       long code;
+       long code = 0;
        unsigned char *tp;
        int localNCB = 0;
 #ifdef DJGPP
@@ -1899,7 +1961,7 @@ void smb_SendPacket(smb_vc_t *vcp, smb_packet_t *inp)
 #endif /* !DJGPP */
         
        if (code != 0)
-               osi_Log1(afsd_logp, "SendPacket failure code %d", code);
+               osi_Log1(smb_logp, "SendPacket failure code %d", code);
 
        if (localNCB)
                FreeNCB(ncbp);
@@ -2004,12 +2066,19 @@ void smb_MapNTError(long code, unsigned long *NTStatusp)
        else if (code == CM_ERROR_BUFFERTOOSMALL) {
                NTStatus = 0xC0000023L; /* Buffer too small */
        }
+    else if (code == CM_ERROR_AMBIGUOUS_FILENAME) {
+#ifdef COMMENT
+               NTStatus = 0xC000049CL; /* Potential file found */
+#else
+               NTStatus = 0xC0000035L; /* Object name collision */
+#endif
+    }
        else {
                NTStatus = 0xC0982001L; /* SMB non-specific error */
        }
 
        *NTStatusp = NTStatus;
-       osi_Log2(afsd_logp, "SMB SEND code %x as NT %x", code, NTStatus);
+       osi_Log2(smb_logp, "SMB SEND code %x as NT %x", code, NTStatus);
 }
 
 void smb_MapCoreError(long code, smb_vc_t *vcp, unsigned short *scodep,
@@ -2162,7 +2231,7 @@ void smb_MapCoreError(long code, smb_vc_t *vcp, unsigned short *scodep,
 
        *scodep = error;
        *classp = class;
-       osi_Log3(afsd_logp, "SMB SEND code %x as SMB %d: %d", code, class, error);
+       osi_Log3(smb_logp, "SMB SEND code %x as SMB %d: %d", code, class, error);
 }
 
 long smb_SendCoreBadOp(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
@@ -2196,7 +2265,7 @@ long smb_ReceiveCoreReadRaw(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp
        long count, minCount, finalCount;
        unsigned short fd;
        smb_fid_t *fidp;
-       long code;
+       long code = 0;
        cm_user_t *userp = NULL;
     NCB *ncbp;
     int rc;
@@ -2216,7 +2285,7 @@ long smb_ReceiveCoreReadRaw(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp
        offset.HighPart = 0;    /* too bad */
        offset.LowPart = smb_GetSMBParm(inp, 1) | (smb_GetSMBParm(inp, 2) << 16);
 
-       osi_Log3(afsd_logp, "smb_ReceieveCoreReadRaw fd %d, off 0x%x, size 0x%x",
+       osi_Log3(smb_logp, "smb_ReceieveCoreReadRaw fd %d, off 0x%x, size 0x%x",
              fd, offset.LowPart, count);
 
        fidp = smb_FindFID(vcp, fd, 0);
@@ -2299,7 +2368,7 @@ long smb_ReceiveCoreReadRaw(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp
        code = Netbios(ncbp, dos_ncb);
 #endif /* !DJGPP */
        if (code != 0)
-               osi_Log1(afsd_logp, "ReadRaw send failure code %d", code);
+               osi_Log1(smb_logp, "ReadRaw send failure code %d", code);
 
        if (rawBuf) {
                /* Give back raw buffer */
@@ -2341,14 +2410,14 @@ long smb_ReceiveNegotiate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
        char protocol_array[10][1024]; /* protocol signature of the client */
 
         
-       osi_Log1(afsd_logp, "SMB receive negotiate; %d + 1 ongoing ops",
+       osi_Log1(smb_logp, "SMB receive negotiate; %d + 1 ongoing ops",
                         ongoingOps - 1);
        if (!isGateway) {
                if (active_vcp) {
                        DWORD now = GetCurrentTime();
                        if (now - last_msg_time >= 30000
                                && now - last_msg_time <= 90000) {
-                               osi_Log1(afsd_logp,
+                               osi_Log1(smb_logp,
                                                 "Setting dead_vcp %x", active_vcp);
                                dead_vcp = active_vcp;
                                dead_vcp->flags |= SMB_VCFLAG_ALREADYDEAD;
@@ -2365,8 +2434,8 @@ long smb_ReceiveNegotiate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
        v3ProtoIndex = -1;
        NTProtoIndex = -1;
        while(namex < dbytes) {
-               osi_Log1(afsd_logp, "Protocol %s",
-                                osi_LogSaveString(afsd_logp, namep+1));
+               osi_Log1(smb_logp, "Protocol %s",
+                                osi_LogSaveString(smb_logp, namep+1));
                strcpy(protocol_array[tcounter], namep+1);
 
                /* namep points at the first protocol, or really, a 0x02
@@ -2412,7 +2481,7 @@ long smb_ReceiveNegotiate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
                         (strcmp("LANMAN2.1", protocol_array[4]) == 0) &&
                         (strcmp("NT LM 0.12", protocol_array[5]) == 0)) {
                        isWindows2000 = TRUE;
-                       osi_Log0(afsd_logp, "Looks like a Windows 2000 client");
+                       osi_Log0(smb_logp, "Looks like a Windows 2000 client");
                        /* 
                         * HACK: for now - just negotiate a lower protocol till we 
                         * figure out which flag/flag2 or some other field 
@@ -2423,7 +2492,7 @@ long smb_ReceiveNegotiate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
                        /* Things to try (after looking at tcpdump output could be
                         * setting flags and flags2 to 0x98 and 0xc853 like this
                         * op->reb = 0x98; op->flg2 = 0xc853;
-                        * osi_Log2(afsd_logp, "Flags:0x%x Flags2:0x%x", ip->reb, ip->flg2);
+                        * osi_Log2(smb_logp, "Flags:0x%x Flags2:0x%x", ip->reb, ip->flg2);
                         */
                }       
        }       
@@ -2519,7 +2588,7 @@ void smb_WaitingLocksDaemon()
        smb_vc_t *vcp;
        smb_packet_t *inp, *outp;
        NCB *ncbp;
-       long code;
+       long code = 0;
 
        while(1) {
                lock_ObtainWrite(&smb_globalLock);
@@ -2582,7 +2651,7 @@ void smb_WaitingLocksDaemon()
 
 long smb_ReceiveCoreGetDiskAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 {
-       osi_Log0(afsd_logp, "SMB receive get disk attributes");
+       osi_Log0(smb_logp, "SMB receive get disk attributes");
 
        smb_SetSMBParm(outp, 0, 32000);
        smb_SetSMBParm(outp, 1, 64);
@@ -2605,7 +2674,7 @@ long smb_ReceiveCoreTreeConnect(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *
        char *passwordp;
        cm_user_t *userp;
 
-       osi_Log0(afsd_logp, "SMB receive tree connect");
+       osi_Log0(smb_logp, "SMB receive tree connect");
 
        /* parse input parameters */
        tp = smb_GetSMBData(inp, NULL);
@@ -2638,7 +2707,7 @@ long smb_ReceiveCoreTreeConnect(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *
        smb_SetSMBParm(rsp, 1, newTid);
        smb_SetSMBDataLength(rsp, 0);
 
-       osi_Log1(afsd_logp, "SMB tree connect created ID %d", newTid);
+       osi_Log1(smb_logp, "SMB tree connect created ID %d", newTid);
        return 0;
 }
 
@@ -2777,7 +2846,7 @@ long smb_ReceiveCoreSearchVolume(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t
        unsigned char initStatBlock[21];
        int statLen;
         
-       osi_Log0(afsd_logp, "SMB receive search volume");
+       osi_Log0(smb_logp, "SMB receive search volume");
 
        /* pull pathname and stat block out of request */
        tp = smb_GetSMBData(inp, NULL);
@@ -2839,7 +2908,7 @@ long smb_ReceiveCoreSearchVolume(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t
 long smb_ApplyDirListPatches(smb_dirListPatch_t **dirPatchespp,
        cm_user_t *userp, cm_req_t *reqp)
 {
-       long code;
+       long code = 0;
        cm_scache_t *scp;
        char *dptr;
        long dosTime;
@@ -2905,7 +2974,7 @@ long smb_ReceiveCoreSearchDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou
        int attribute;
        long nextCookie;
        char *tp;
-       long code;
+       long code = 0;
        char *pathp;
        cm_dirEntry_t *dep;
        int maxCount;
@@ -2978,8 +3047,8 @@ long smb_ReceiveCoreSearchDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou
                if (attribute & 0x8)
                        return smb_ReceiveCoreSearchVolume(vcp, inp, outp);
 
-               osi_Log2(afsd_logp, "SMB receive search dir count %d [%s]",
-                                maxCount, osi_LogSaveString(afsd_logp, pathp));
+               osi_Log2(smb_logp, "SMB receive search dir count %d [%s]",
+                                maxCount, osi_LogSaveString(smb_logp, pathp));
 
                if (*pathp == 0) {      /* null pathp, treat as root dir */
                        if (!(attribute & SMB_ATTR_DIRECTORY))  /* exclude dirs */
@@ -3021,7 +3090,7 @@ long smb_ReceiveCoreSearchDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou
                starPattern = 1;
        }
 
-       osi_Log3(afsd_logp, "SMB dir search cookie 0x%x, connection %d, attr 0x%x",
+       osi_Log3(smb_logp, "SMB dir search cookie 0x%x, connection %d, attr 0x%x",
                         nextCookie, dsp->cookie, attribute);
 
        userp = smb_GetUser(vcp, inp);
@@ -3261,7 +3330,7 @@ long smb_ReceiveCoreSearchDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou
                                fid.vnode = ntohl(dep->fid.vnode);
                                fid.unique = ntohl(dep->fid.unique);
                                fileType = cm_FindFileType(&fid);
-                               osi_Log2(afsd_logp, "smb_ReceiveCoreSearchDir: file %s "
+                               osi_Log2(smb_logp, "smb_ReceiveCoreSearchDir: file %s "
                                                  "has filetype %d", dep->name,
                                                  fileType);
                                if (fileType == CM_SCACHETYPE_DIRECTORY)
@@ -3350,7 +3419,7 @@ long smb_ReceiveCoreSearchDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou
        if (code == 0 && dataLength < 21 && returnedNames == 0)
                code = CM_ERROR_NOFILES;
 
-       osi_Log2(afsd_logp, "SMB search dir done, %d names, code %d",
+       osi_Log2(smb_logp, "SMB search dir done, %d names, code %d",
                 returnedNames, code);
 
        if (code != 0) {
@@ -3388,7 +3457,7 @@ long smb_ReceiveCoreSearchDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou
 long smb_ReceiveCoreCheckPath(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 {
        char *pathp;
-       long code;
+       long code = 0;
        cm_scache_t *rootScp;
        cm_scache_t *newScp;
        cm_user_t *userp;
@@ -3401,8 +3470,8 @@ long smb_ReceiveCoreCheckPath(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou
 
        pathp = smb_GetSMBData(inp, NULL);
        pathp = smb_ParseASCIIBlock(pathp, NULL);
-       osi_Log1(afsd_logp, "SMB receive check path %s",
-                         osi_LogSaveString(afsd_logp, pathp));
+       osi_Log1(smb_logp, "SMB receive check path %s",
+                         osi_LogSaveString(smb_logp, pathp));
 
        if (!pathp) {
                return CM_ERROR_BADFD;
@@ -3450,7 +3519,7 @@ long smb_ReceiveCoreCheckPath(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou
 long smb_ReceiveCoreSetFileAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 {
        char *pathp;
-       long code;
+       long code = 0;
        cm_scache_t *rootScp;
        unsigned short attribute;
        cm_attr_t attr;
@@ -3474,7 +3543,7 @@ long smb_ReceiveCoreSetFileAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_pack
                return CM_ERROR_BADSMB;
        }
         
-       osi_Log2(afsd_logp, "SMB receive setfile attributes time %d, attr 0x%x",
+       osi_Log2(smb_logp, "SMB receive setfile attributes time %d, attr 0x%x",
                         dosTime, attribute);
 
        rootScp = cm_rootSCachep;
@@ -3547,7 +3616,7 @@ long smb_ReceiveCoreSetFileAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_pack
 long smb_ReceiveCoreGetFileAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 {
        char *pathp;
-       long code;
+       long code = 0;
        cm_scache_t *rootScp;
        cm_scache_t *newScp, *dscp;
        long dosTime;
@@ -3571,8 +3640,8 @@ long smb_ReceiveCoreGetFileAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_pack
        if (*pathp == 0)                /* null path */
                pathp = "\\";
 
-       osi_Log1(afsd_logp, "SMB receive getfile attributes path %s",
-                        osi_LogSaveString(afsd_logp, pathp));
+       osi_Log1(smb_logp, "SMB receive getfile attributes path %s",
+                        osi_LogSaveString(smb_logp, pathp));
 
        rootScp = cm_rootSCachep;
         
@@ -3684,7 +3753,7 @@ long smb_ReceiveCoreTreeDisconnect(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_
 {
        smb_tid_t *tidp;
         
-       osi_Log0(afsd_logp, "SMB receive tree disconnect");
+       osi_Log0(smb_logp, "SMB receive tree disconnect");
 
        /* find the tree and free it */
        tidp = smb_FindTID(vcp, ((smb_t *)inp)->tid, 0);
@@ -3705,7 +3774,7 @@ long smb_ReceiveCoreOpen(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
        char *lastNamep;
     int share;
     int attribute;
-       long code;
+       long code = 0;
     cm_user_t *userp;
     cm_scache_t *scp;
     long dosTime;
@@ -3719,7 +3788,7 @@ long smb_ReceiveCoreOpen(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
     pathp = smb_GetSMBData(inp, NULL);
     pathp = smb_ParseASCIIBlock(pathp, NULL);
        
-    osi_Log1(afsd_logp, "SMB receive open file [%s]", osi_LogSaveString(afsd_logp, pathp));
+    osi_Log1(smb_logp, "SMB receive open file [%s]", osi_LogSaveString(smb_logp, pathp));
 
 #ifdef DEBUG_VERBOSE
     {
@@ -3827,13 +3896,13 @@ typedef struct smb_unlinkRock {
        cm_req_t *reqp;
        smb_vc_t *vcp;
        char *maskp;            /* pointer to the star pattern */
-       int hasTilde;
+       int flags;
        int any;
 } smb_unlinkRock_t;
 
 int smb_UnlinkProc(cm_scache_t *dscp, cm_dirEntry_t *dep, void *vrockp, osi_hyper_t *offp)
 {
-       long code;
+       long code = 0;
        smb_unlinkRock_t *rockp;
        int caseFold;
        int match;
@@ -3842,19 +3911,19 @@ int smb_UnlinkProc(cm_scache_t *dscp, cm_dirEntry_t *dep, void *vrockp, osi_hype
         
        rockp = vrockp;
 
-       if (rockp->vcp->flags & SMB_VCFLAG_USEV3)
-               caseFold = CM_FLAG_CASEFOLD;
-       else 
-               caseFold = CM_FLAG_CASEFOLD | CM_FLAG_8DOT3;
+    caseFold = ((rockp->flags & SMB_MASKFLAG_CASEFOLD)? CM_FLAG_CASEFOLD : 0);
+    if (!(rockp->vcp->flags & SMB_VCFLAG_USEV3))
+        caseFold |= CM_FLAG_8DOT3;
 
        matchName = dep->name;
        match = smb_V3MatchMask(matchName, rockp->maskp, caseFold);
        if (!match
-           && rockp->hasTilde
+           && (rockp->flags & SMB_MASKFLAG_TILDE)
            && !cm_Is8Dot3(dep->name)) {
                cm_Gen8Dot3Name(dep, shortName, NULL);
                matchName = shortName;
-               match = smb_V3MatchMask(matchName, rockp->maskp, caseFold);
+        /* 8.3 matches are always case insensitive */
+        match = smb_V3MatchMask(matchName, rockp->maskp, caseFold | CM_FLAG_CASEFOLD);
        }
        if (match) {
                osi_Log1(smb_logp, "Unlinking %s",
@@ -3864,8 +3933,12 @@ int smb_UnlinkProc(cm_scache_t *dscp, cm_dirEntry_t *dep, void *vrockp, osi_hype
                        smb_NotifyChange(FILE_ACTION_REMOVED,
                                                         FILE_NOTIFY_CHANGE_FILE_NAME,
                                                         dscp, dep->name, NULL, TRUE);
-               if (code == 0)
+               if (code == 0) {
                        rockp->any = 1;
+            /* If we made a case sensitive exact match, we might as well quit now. */
+            if(!(rockp->flags & SMB_MASKFLAG_CASEFOLD) && !strcmp(matchName, rockp->maskp))
+                code = CM_ERROR_STOPNOW;
+        }
        }
        else code = 0;
 
@@ -3875,7 +3948,7 @@ int smb_UnlinkProc(cm_scache_t *dscp, cm_dirEntry_t *dep, void *vrockp, osi_hype
 long smb_ReceiveCoreUnlink(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 {
        int attribute;
-       long code;
+       long code = 0;
        char *pathp;
        char *tp;
        cm_space_t *spacep;
@@ -3922,7 +3995,7 @@ long smb_ReceiveCoreUnlink(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 
        rock.any = 0;
        rock.maskp = smb_FindMask(pathp);
-       rock.hasTilde = ((strchr(rock.maskp, '~') != NULL) ? 1 : 0);
+       rock.flags = ((strchr(rock.maskp, '~') != NULL) ? SMB_MASKFLAG_TILDE : 0);
         
        thyper.LowPart = 0;
        thyper.HighPart = 0;
@@ -3930,7 +4003,25 @@ long smb_ReceiveCoreUnlink(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
        rock.reqp = &req;
        rock.dscp = dscp;
        rock.vcp = vcp;
-       code = cm_ApplyDir(dscp, smb_UnlinkProc, &rock, &thyper, userp, &req, NULL);
+
+    /* Now, if we aren't dealing with a wildcard match, we first try an exact 
+     * match.  If that fails, we do a case insensitve match. 
+     */
+    if (!(rock.flags & SMB_MASKFLAG_TILDE) &&
+        !smb_IsStarMask(rock.maskp)) {
+        code = cm_ApplyDir(dscp, smb_UnlinkProc, &rock, &thyper, userp, &req, NULL);
+        if(!rock.any) {
+            thyper.LowPart = 0;
+            thyper.HighPart = 0;
+            rock.flags |= SMB_MASKFLAG_CASEFOLD;
+        }
+    }
+    if (!rock.any)
+        code = cm_ApplyDir(dscp, smb_UnlinkProc, &rock, &thyper, userp, &req, NULL);
+    
+    if (code == CM_ERROR_STOPNOW) 
+        code = 0;
 
        cm_ReleaseUser(userp);
         
@@ -3948,28 +4039,27 @@ typedef struct smb_renameRock {
        cm_req_t *reqp;         /* request struct */
        smb_vc_t *vcp;          /* virtual circuit */
        char *maskp;            /* pointer to star pattern of old file name */
-       int hasTilde;           /* star pattern might be shortname? */
+       int flags;                  /* tilde, casefold, etc */
        char *newNamep;         /* ptr to the new file's name */
 } smb_renameRock_t;
 
 int smb_RenameProc(cm_scache_t *dscp, cm_dirEntry_t *dep, void *vrockp, osi_hyper_t *offp)
 {
-       long code;
+       long code = 0;
        smb_renameRock_t *rockp;
        int caseFold;
        int match;
        char shortName[13];
         
-       rockp = vrockp;
+       rockp = (smb_renameRock_t *) vrockp;
 
-       if (rockp->vcp->flags & SMB_VCFLAG_USEV3)
-               caseFold = CM_FLAG_CASEFOLD;
-       else 
-               caseFold = CM_FLAG_CASEFOLD | CM_FLAG_8DOT3;
+    caseFold = ((rockp->flags & SMB_MASKFLAG_CASEFOLD)? CM_FLAG_CASEFOLD : 0);
+    if (!(rockp->vcp->flags & SMB_VCFLAG_USEV3))
+        caseFold |= CM_FLAG_8DOT3;
 
        match = smb_V3MatchMask(dep->name, rockp->maskp, caseFold);
        if (!match
-           && rockp->hasTilde
+           && (rockp->flags & SMB_MASKFLAG_TILDE)
            && !cm_Is8Dot3(dep->name)) {
                cm_Gen8Dot3Name(dep, shortName, NULL);
                match = smb_V3MatchMask(shortName, rockp->maskp, caseFold);
@@ -3991,15 +4081,16 @@ int smb_RenameProc(cm_scache_t *dscp, cm_dirEntry_t *dep, void *vrockp, osi_hype
 
 long smb_ReceiveCoreRename(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 {
-       long code;
+       long code = 0;
        char *oldPathp;
        char *newPathp;
        char *tp;
-       cm_space_t *spacep;
+       cm_space_t *spacep = NULL;
        smb_renameRock_t rock;
-       cm_scache_t *oldDscp;
-       cm_scache_t *newDscp;
-       cm_scache_t *tmpscp;
+       cm_scache_t *oldDscp = NULL;
+       cm_scache_t *newDscp = NULL;
+       cm_scache_t *tmpscp= NULL;
+       cm_scache_t *tmpscp2 = NULL;
        char *oldLastNamep;
        char *newLastNamep;
        osi_hyper_t thyper;
@@ -4015,9 +4106,9 @@ long smb_ReceiveCoreRename(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
        oldPathp = smb_ParseASCIIBlock(tp, &tp);
        newPathp = smb_ParseASCIIBlock(tp, &tp);
 
-       osi_Log2(afsd_logp, "smb rename %s to %s",
-                        osi_LogSaveString(afsd_logp, oldPathp),
-                        osi_LogSaveString(afsd_logp, newPathp));
+       osi_Log2(smb_logp, "smb rename [%s] to [%s]",
+                        osi_LogSaveString(smb_logp, oldPathp),
+                        osi_LogSaveString(smb_logp, newPathp));
 
        spacep = inp->spacep;
        smb_StripLastComponent(spacep->data, &oldLastNamep, oldPathp);
@@ -4071,6 +4162,8 @@ long smb_ReceiveCoreRename(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
                newLastNamep = newPathp;
        else 
                newLastNamep++;
+
+    /* TODO: The old name could be a wildcard.  The new name must not be */
        
        /* do the vnode call */
        rock.odscp = oldDscp;
@@ -4079,16 +4172,44 @@ long smb_ReceiveCoreRename(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
        rock.reqp = &req;
        rock.vcp = vcp;
        rock.maskp = oldLastNamep;
-       rock.hasTilde = ((strchr(oldLastNamep, '~') != NULL) ? 1 : 0);
+       rock.flags = ((strchr(oldLastNamep, '~') != NULL) ? SMB_MASKFLAG_TILDE : 0);
        rock.newNamep = newLastNamep;
 
     /* Check if the file already exists; if so return error */
        code = cm_Lookup(newDscp,newLastNamep,CM_FLAG_CHECKPATH,userp,&req,&tmpscp);
-       if((code != CM_ERROR_NOSUCHFILE) && (code != CM_ERROR_NOSUCHPATH) && (code != CM_ERROR_NOSUCHVOLUME) ) {
-           cm_ReleaseSCache(tmpscp);
-           return CM_ERROR_EXISTS; /* file exist, do not rename, also 
-                                        * fixes move
-                                                                */
+       if ((code != CM_ERROR_NOSUCHFILE) && (code != CM_ERROR_NOSUCHPATH) && (code != CM_ERROR_NOSUCHVOLUME) ) {
+        osi_Log2(afsd_logp, "  lookup returns %ld for [%s]", code,
+                 osi_LogSaveString(afsd_logp, newLastNamep));
+        /* Check if the old and the new names differ only in case. If so return
+         * success, else return CM_ERROR_EXISTS 
+         */
+        if (!code && oldDscp == newDscp && !stricmp(oldLastNamep, newLastNamep)) {
+
+            /* This would be a success only if the old file is *as same as* the new file */
+            code = cm_Lookup(oldDscp, oldLastNamep, CM_FLAG_CHECKPATH, userp, &req, &tmpscp2);
+            if (!code) {
+                if (tmpscp == tmpscp2) 
+                    code = 0;
+                else 
+                    code = CM_ERROR_EXISTS;
+                cm_ReleaseSCache(tmpscp2);
+                               tmpscp2 = NULL;
+            } else {
+                code = CM_ERROR_NOSUCHFILE;
+            }
+        } else {
+            /* file exist, do not rename, also fixes move */
+            osi_Log0(afsd_logp, "Can't rename.  Target already exists");
+            code = CM_ERROR_EXISTS;
+        }
+
+               if(tmpscp != NULL)
+            cm_ReleaseSCache(tmpscp);
+        cm_ReleaseSCache(newDscp);
+        cm_ReleaseSCache(oldDscp);
+        cm_ReleaseUser(userp);
+           return code; 
        }
 
     /* Now search the directory for the pattern, and do the appropriate rename when found */
@@ -4124,11 +4245,11 @@ long smb_ReceiveCoreRename(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
                                                         NULL, TRUE);
        }
 
-       cm_ReleaseUser(userp);
-        
+    if(tmpscp != NULL) 
+        cm_ReleaseSCache(tmpscp);
+    cm_ReleaseUser(userp);
        cm_ReleaseSCache(oldDscp);
        cm_ReleaseSCache(newDscp);
-
        return code;
 }
 
@@ -4137,24 +4258,27 @@ typedef struct smb_rmdirRock {
        cm_user_t *userp;
        cm_req_t *reqp;
        char *maskp;            /* pointer to the star pattern */
-       int hasTilde;
+       int flags;
        int any;
 } smb_rmdirRock_t;
 
 int smb_RmdirProc(cm_scache_t *dscp, cm_dirEntry_t *dep, void *vrockp, osi_hyper_t *offp)
 {
-       long code;
+       long code = 0;
        smb_rmdirRock_t *rockp;
        int match;
        char shortName[13];
        char *matchName;
         
-       rockp = vrockp;
+       rockp = (smb_rmdirRock_t *) vrockp;
 
        matchName = dep->name;
-       match = (cm_stricmp(matchName, rockp->maskp) == 0);
+    if (rockp->flags & SMB_MASKFLAG_CASEFOLD)
+        match = (cm_stricmp(matchName, rockp->maskp) == 0);
+    else
+        match = (strcmp(matchName, rockp->maskp) == 0);
        if (!match
-           && rockp->hasTilde
+           && (rockp->flags & SMB_MASKFLAG_TILDE)
            && !cm_Is8Dot3(dep->name)) {
                cm_Gen8Dot3Name(dep, shortName, NULL);
                matchName = shortName;
@@ -4178,7 +4302,7 @@ int smb_RmdirProc(cm_scache_t *dscp, cm_dirEntry_t *dep, void *vrockp, osi_hyper
 
 long smb_ReceiveCoreRemoveDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 {
-       long code;
+       long code = 0;
        char *pathp;
        char *tp;
        cm_space_t *spacep;
@@ -4220,14 +4344,21 @@ long smb_ReceiveCoreRemoveDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou
        
        rock.any = 0;
        rock.maskp = lastNamep;
-       rock.hasTilde = ((strchr(rock.maskp, '~') != NULL) ? 1 : 0);
+       rock.flags = ((strchr(rock.maskp, '~') != NULL) ? SMB_MASKFLAG_TILDE : 0);
 
        thyper.LowPart = 0;
        thyper.HighPart = 0;
        rock.userp = userp;
        rock.reqp = &req;
        rock.dscp = dscp;
-       code = cm_ApplyDir(dscp, smb_RmdirProc, &rock, &thyper, userp, &req, NULL);
+    /* First do a case sensitive match, and if that fails, do a case insensitive match */
+    code = cm_ApplyDir(dscp, smb_RmdirProc, &rock, &thyper, userp, &req, NULL);
+    if (code == 0 && !rock.any) {
+        thyper.LowPart = 0;
+        thyper.HighPart = 0;
+        rock.flags |= SMB_MASKFLAG_CASEFOLD;
+        code = cm_ApplyDir(dscp, smb_RmdirProc, &rock, &thyper, userp, &req, NULL);
+    }
 
        cm_ReleaseUser(userp);
         
@@ -4243,14 +4374,14 @@ long smb_ReceiveCoreFlush(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
        unsigned short fid;
     smb_fid_t *fidp;
     cm_user_t *userp;
-    long code;
+    long code = 0;
     cm_req_t req;
 
        cm_InitReq(&req);
 
        fid = smb_GetSMBParm(inp, 0);
         
-       osi_Log1(afsd_logp, "SMB flush fid %d", fid);
+       osi_Log1(smb_logp, "SMB flush fid %d", fid);
 
        fid = smb_ChainFID(fid, inp);
     fidp = smb_FindFID(vcp, fid, 0);
@@ -4288,17 +4419,17 @@ int smb_FullNameProc(cm_scache_t *scp, cm_dirEntry_t *dep, void *rockp,
        char shortName[13];
        struct smb_FullNameRock *vrockp;
 
-       vrockp = rockp;
+       vrockp = (struct smb_FullNameRock *)rockp;
 
        if (!cm_Is8Dot3(dep->name)) {
                cm_Gen8Dot3Name(dep, shortName, NULL);
 
-               if (strcmp(shortName, vrockp->name) == 0) {
+               if (cm_stricmp(shortName, vrockp->name) == 0) {
                        vrockp->fullName = strdup(dep->name);
                        return CM_ERROR_STOPNOW;
                }
        }
-       if (stricmp(dep->name, vrockp->name) == 0
+       if (cm_stricmp(dep->name, vrockp->name) == 0
            && ntohl(dep->fid.vnode) == vrockp->vnode->fid.vnode
            && ntohl(dep->fid.unique) == vrockp->vnode->fid.unique) {
                vrockp->fullName = strdup(dep->name);
@@ -4311,7 +4442,7 @@ void smb_FullName(cm_scache_t *dscp, cm_scache_t *scp, char *pathp,
        char **newPathp, cm_user_t *userp, cm_req_t *reqp)
 {
        struct smb_FullNameRock rock;
-       long code;
+       long code = 0;
 
        rock.name = pathp;
        rock.vnode = scp;
@@ -4330,7 +4461,7 @@ long smb_ReceiveCoreClose(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
     smb_fid_t *fidp;
     cm_user_t *userp;
        long dosTime;
-    long code;
+    long code = 0;
        cm_req_t req;
 
        cm_InitReq(&req);
@@ -4338,7 +4469,7 @@ long smb_ReceiveCoreClose(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
        fid = smb_GetSMBParm(inp, 0);
        dosTime = smb_GetSMBParm(inp, 1) | (smb_GetSMBParm(inp, 2) << 16);
         
-       osi_Log1(afsd_logp, "SMB close fid %d", fid);
+       osi_Log1(smb_logp, "SMB close fid %d", fid);
 
        fid = smb_ChainFID(fid, inp);
     fidp = smb_FindFID(vcp, fid, 0);
@@ -4423,7 +4554,7 @@ long smb_ReadData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count, char *op,
 #endif /* !DJGPP */
 {
        osi_hyper_t offset;
-       long code;
+       long code = 0;
        cm_scache_t *scp;
        cm_buf_t *bufferp;
        osi_hyper_t fileLength;
@@ -4577,7 +4708,7 @@ long smb_WriteData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count, char *op,
 #endif /* !DJGPP */
 {
        osi_hyper_t offset;
-       long code;
+       long code = 0;
        long written = 0;
        cm_scache_t *scp;
        osi_hyper_t fileLength; /* file's length at start of write */
@@ -4807,7 +4938,7 @@ long smb_ReceiveCoreWrite(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
     long count, written = 0;
     unsigned short fd;
     smb_fid_t *fidp;
-    long code;
+    long code = 0;
     cm_user_t *userp;
     cm_attr_t truncAttr;       /* attribute struct used for truncating file */
     char *op;
@@ -4821,7 +4952,7 @@ long smb_ReceiveCoreWrite(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
     op = smb_GetSMBData(inp, NULL);
        op = smb_ParseDataBlock(op, NULL, &inDataBlockCount);
 
-    osi_Log3(afsd_logp, "smb_ReceiveCoreWrite fd %d, off 0x%x, size 0x%x",
+    osi_Log3(smb_logp, "smb_ReceiveCoreWrite fd %d, off 0x%x, size 0x%x",
              fd, offset.LowPart, count);
         
        fd = smb_ChainFID(fd, inp);
@@ -4901,12 +5032,12 @@ void smb_CompleteWriteRaw(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp,
        dos_ptr rawBuf;
 #endif /* !DJGPP */
        long written = 0;
-       long code;
+       long code = 0;
 
        fd = smb_GetSMBParm(inp, 0);
        fidp = smb_FindFID(vcp, fd, 0);
 
-       osi_Log2(afsd_logp, "Completing Raw Write offset %x count %x",
+       osi_Log2(smb_logp, "Completing Raw Write offset %x count %x",
                 rwcp->offset.LowPart, rwcp->count);
 
        userp = smb_GetUser(vcp, inp);
@@ -4967,7 +5098,7 @@ long smb_ReceiveCoreWriteRaw(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out
        long totalCount;
     unsigned short fd;
     smb_fid_t *fidp;
-    long code;
+    long code = 0;
     cm_user_t *userp;
     char *op;
        unsigned short writeMode;
@@ -4987,7 +5118,7 @@ long smb_ReceiveCoreWriteRaw(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out
        op = (char *) inp->data;
        op += smb_GetSMBParm(inp, 11);
 
-    osi_Log4(afsd_logp,
+    osi_Log4(smb_logp,
              "smb_ReceiveCoreWriteRaw fd %d, off 0x%x, size 0x%x, WriteMode 0x%x",
              fd, offset.LowPart, count, writeMode);
         
@@ -5083,7 +5214,7 @@ long smb_ReceiveCoreRead(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
     long count, finalCount;
     unsigned short fd;
     smb_fid_t *fidp;
-    long code;
+    long code = 0;
     cm_user_t *userp;
     char *op;
         
@@ -5092,7 +5223,7 @@ long smb_ReceiveCoreRead(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
     offset.HighPart = 0;       /* too bad */
     offset.LowPart = smb_GetSMBParm(inp, 2) | (smb_GetSMBParm(inp, 3) << 16);
         
-    osi_Log3(afsd_logp, "smb_ReceiveCoreRead fd %d, off 0x%x, size 0x%x",
+    osi_Log3(smb_logp, "smb_ReceiveCoreRead fd %d, off 0x%x, size 0x%x",
              fd, offset.LowPart, count);
         
        fd = smb_ChainFID(fd, inp);
@@ -5148,7 +5279,7 @@ long smb_ReceiveCoreRead(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 long smb_ReceiveCoreMakeDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 {
        char *pathp;
-    long code;
+    long code = 0;
        cm_space_t *spacep;
     char *tp;
     cm_user_t *userp;
@@ -5199,7 +5330,7 @@ long smb_ReceiveCoreMakeDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp
         lastNamep = pathp;
     else 
         lastNamep++;
-    code = cm_Lookup(dscp, lastNamep, caseFold, userp, &req, &scp);
+    code = cm_Lookup(dscp, lastNamep, 0, userp, &req, &scp);
     if (scp) cm_ReleaseSCache(scp);
     if (code != CM_ERROR_NOSUCHFILE) {
         if (code == 0) code = CM_ERROR_EXISTS;
@@ -5249,7 +5380,7 @@ BOOL smb_IsLegalFilename(char *filename)
 long smb_ReceiveCoreCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 {
        char *pathp;
-    long code;
+    long code = 0;
        cm_space_t *spacep;
     char *tp;
     int excl;
@@ -5306,7 +5437,7 @@ long smb_ReceiveCoreCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
     if (!smb_IsLegalFilename(lastNamep))
         return CM_ERROR_BADNTFILENAME;
 
-    osi_Log1(afsd_logp, "SMB receive create [%s]", osi_LogSaveString( afsd_logp, pathp ));
+    osi_Log1(smb_logp, "SMB receive create [%s]", osi_LogSaveString( smb_logp, pathp ));
 #ifdef DEBUG_VERBOSE
     {
         char *hexp;
@@ -5316,7 +5447,7 @@ long smb_ReceiveCoreCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
     }
 #endif    
 
-    code = cm_Lookup(dscp, lastNamep, caseFold, userp, &req, &scp);
+    code = cm_Lookup(dscp, lastNamep, 0, userp, &req, &scp);
     if (code && code != CM_ERROR_NOSUCHFILE) {
                cm_ReleaseSCache(dscp);
         cm_ReleaseUser(userp);
@@ -5408,7 +5539,7 @@ long smb_ReceiveCoreCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 
 long smb_ReceiveCoreSeek(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 {
-    long code;
+    long code = 0;
     long offset;
     int whence;
     unsigned short fd;
@@ -5464,10 +5595,9 @@ long smb_ReceiveCoreSeek(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 void smb_DispatchPacket(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp,
        NCB *ncbp, raw_write_cont_t *rwcp)
 {
-    static showErrors = 0;
     smb_dispatch_t *dp;
     smb_t *smbp;
-    unsigned long code;
+    unsigned long code = 0;
     unsigned char *outWctp;
     int nparms;                        /* # of bytes of parameters */
     char tbuffer[200];
@@ -5538,7 +5668,7 @@ void smb_DispatchPacket(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp,
         /* process each request in the packet; inCom, wctp and inCount
          * are already set up.
          */
-               osi_Log2(afsd_logp, "SMB received op 0x%x lsn %d", inp->inCom,
+               osi_Log2(smb_logp, "SMB received op 0x%x lsn %d", inp->inCom,
                  ncbp->ncb_lsn);
 
                /* now do the dispatch */
@@ -5572,10 +5702,10 @@ void smb_DispatchPacket(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp,
                                                 rwcp);
                        else {
                                        osi_LogEvent("AFS Dispatch %s",(myCrt_Dispatch(inp->inCom)),"vcp[%x] lana[%d] lsn[%d]",(int)vcp,vcp->lana,vcp->lsn);
-                                       osi_Log4(afsd_logp,"Dispatch %s vcp[%x] lana[%d] lsn[%d]",(myCrt_Dispatch(inp->inCom)),vcp,vcp->lana,vcp->lsn);
+                                       osi_Log4(smb_logp,"Dispatch %s vcp[%x] lana[%d] lsn[%d]",(myCrt_Dispatch(inp->inCom)),vcp,vcp->lana,vcp->lsn);
                                        code = (*(dp->procp)) (vcp, inp, outp);
                                        osi_LogEvent("AFS Dispatch return",NULL,"Code[%d]",(code==0)?0:code-CM_ERROR_BASE);
-                                       osi_Log1(afsd_logp,"Dispatch return  code[%d]",(code==0)?0:code-CM_ERROR_BASE);
+                                       osi_Log1(smb_logp,"Dispatch return  code[%d]",(code==0)?0:code-CM_ERROR_BASE);
             }
 
                        if (oldGen != sessionGen) {
@@ -5592,7 +5722,7 @@ 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, "
+                               osi_Log1(smb_logp, "Pkt straddled session startup, "
                          "ncb length %d", ncbp->ncb_length);
 #endif /* !DJGPP */
                        }
@@ -5607,7 +5737,7 @@ void smb_DispatchPacket(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp,
                        if (showErrors) {
                                sprintf(tbuffer, "Received bad SMB req 0x%x", inp->inCom);
                 code = (*smb_MBfunc)(NULL, tbuffer, "Cancel: don't show again",
-                                     MB_OKCANCEL);
+                                     MB_OKCANCEL|MB_SERVICE_NOTIFICATION);
                 if (code == IDCANCEL) showErrors = 0;
                        }
 #endif /* DJGPP */
@@ -5636,7 +5766,7 @@ void smb_DispatchPacket(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp,
             smb_LogPacket(inp);
 #endif /* NOTSERVICE */
 #else /* DJGPP */
-            osi_Log1(afsd_logp, "Invalid SMB message, length %d",
+            osi_Log1(smb_logp, "Invalid SMB message, length %d",
                      ncbp->ncb_length);
 #endif /* !DJGPP */
 
@@ -5973,7 +6103,7 @@ void smb_Server(VOID *parmp)
                        if (tod > EXPIREDATE) {
                                (*smb_MBfunc)(NULL, "AFS demo expiration",
                                           "afsd dispatcher",
-                                          MB_OK|MB_ICONSTOP|MB_SETFOREGROUND);
+                                          MB_OK|MB_ICONSTOP|MB_SETFOREGROUND|MB_SERVICE_NOTIFICATION);
                                trhd_Exit(1);
                        }
                }
@@ -6026,7 +6156,7 @@ void smb_Server(VOID *parmp)
                rc = ncbp->ncb_retcode;
 
                if (rc != NRC_PENDING && rc != NRC_GOODRET)
-                       osi_Log1(afsd_logp, "NCBRECV failure code %d", rc);
+                       osi_Log1(smb_logp, "NCBRECV failure code %d", rc);
 
                switch (rc) {
                        case NRC_GOODRET: break;
@@ -6054,11 +6184,11 @@ void smb_Server(VOID *parmp)
                  */
                 if (vcp) {
                     if (dead_vcp)
-                        osi_Log1(afsd_logp,
+                        osi_Log1(smb_logp,
                                   "dead_vcp already set, %x",
                                   dead_vcp);
                     if (!dead_vcp && !(vcp->flags & SMB_VCFLAG_ALREADYDEAD)) {
-                        osi_Log2(afsd_logp,
+                        osi_Log2(smb_logp,
                                   "setting dead_vcp %x, user struct %x",
                                   vcp, vcp->usersp);
                         dead_vcp = vcp;
@@ -6171,7 +6301,7 @@ void smb_Server(VOID *parmp)
                        }
 
                        /* Also log in the trace log. */
-                       osi_Log4(afsd_logp, "Server: BAD VCP!"
+                       osi_Log4(smb_logp, "Server: BAD VCP!"
                                "LSNs[idx_session]=[%d],"
                                "lanas[idx_session]=[%d],"
                                "ncbp->ncb_lsn=[%d],"
@@ -6328,7 +6458,7 @@ void InitNCBslot(int idx)
 void smb_Listener(void *parmp)
 {
        NCB *ncbp;
-    long code;
+    long code = 0;
     long len;
        long i, j;
     smb_vc_t *vcp;
@@ -6362,7 +6492,7 @@ void smb_Listener(void *parmp)
                        if (tod > EXPIREDATE) {
                                (*smb_MBfunc)(NULL, "AFS demo expiration",
                                "afsd listener",
-                               MB_OK|MB_ICONSTOP|MB_SETFOREGROUND);
+                               MB_OK|MB_ICONSTOP|MB_SETFOREGROUND|MB_SERVICE_NOTIFICATION);
 #ifndef DJGPP
                 ExitThread(1);
 #else
@@ -6394,7 +6524,11 @@ void smb_Listener(void *parmp)
 
         if (code != 0)
         {
-                   /* terminate if shutdown flag is set */
+#ifndef DJGPP
+            char tbuffer[256];
+#endif
+
+            /* terminate silently if shutdown flag is set */
                if (smbShutdownFlag == 1) {
 #ifndef DJGPP
                            ExitThread(1);
@@ -6403,17 +6537,29 @@ void smb_Listener(void *parmp)
 #endif
                        }
 
+            osi_Log2(smb_logp, 
+                     "NCBLISTEN lana=%d failed with code %d",
+                     ncbp->ncb_lana_num, code);
+            osi_Log0(smb_logp, 
+                     "Client exiting due to network failure. Please restart client.\n");
+
 #ifndef DJGPP
-                       osi_assert(0);
+            sprintf(tbuffer, 
+                     "Client exiting due to network failure.  Please restart client.\n"
+                     "NCBLISTEN lana=%d failed with code %d",
+                     ncbp->ncb_lana_num, code);
+                       if (showErrors)
+                code = (*smb_MBfunc)(NULL, tbuffer, "AFS Client Service: Fatal Error",
+                                     MB_OK|MB_SERVICE_NOTIFICATION);
+            osi_assert(tbuffer);
+            ExitThread(1);
 #else
             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);
+                       afs_exit(AFS_EXITCODE_NETWORK_FAILURE);
 #endif /* !DJGPP */
         }
 
@@ -6432,7 +6578,7 @@ void smb_Listener(void *parmp)
                        if (strncmp(rname, cname, NCBNAMSZ) != 0)
                                flags |= SMB_VCFLAG_REMOTECONN;
 
-               osi_Log1(afsd_logp, "New session lsn %d", ncbp->ncb_lsn);
+               osi_Log1(smb_logp, "New session lsn %d", ncbp->ncb_lsn);
                /* lock */
                lock_ObtainMutex(&smb_ListenerLock);
 
@@ -6462,7 +6608,7 @@ void smb_Listener(void *parmp)
                        DeregisterEventSource(h);
 #else /* DJGPP */
             afsi_log("NCBLISTEN completed, call from %s",rname);
-            osi_Log1(afsd_logp, "SMB session startup, %d ongoing ops",
+            osi_Log1(smb_logp, "SMB session startup, %d ongoing ops",
                      ongoingOps);
             time(&now);
             fprintf(stderr, "%s: New session %d starting from host %s\n",
@@ -6501,7 +6647,7 @@ void smb_Listener(void *parmp)
                        /* Add new NCB for new session */
             char eventName[MAX_PATH];
 
-            osi_Log1(afsd_logp, "smb_Listener creating new session %d", i);
+            osi_Log1(smb_logp, "smb_Listener creating new session %d", i);
 
                        InitNCBslot(numNCBs);
                        numNCBs++;
@@ -6735,7 +6881,7 @@ void smb_Init(osi_log_t *logp, char *snamep, int useV3, int LANadapt,
                if (tod > EXPIREDATE) {
 #ifndef DJGPP
                        (*smb_MBfunc)(NULL, "AFS demo expiration", "afsd",
-                          MB_OK|MB_ICONSTOP|MB_SETFOREGROUND);
+                          MB_OK|MB_ICONSTOP|MB_SETFOREGROUND|MB_SERVICE_NOTIFICATION);
                        exit(1);
 #else /* DJGPP */
             fprintf(stderr, "AFS demo expiration\n");
@@ -6994,7 +7140,7 @@ void smb_Shutdown(void)
 #ifdef DJGPP
     dos_ptr dos_ncb;
 #endif
-    long code;
+    long code = 0;
     int i;
 
     /*fprintf(stderr, "Entering smb_Shutdown\n");*/
@@ -7027,7 +7173,7 @@ void smb_Shutdown(void)
         /*fprintf(stderr, "returned from NCBHANGUP session %d LSN %d\n", i, LSNs[i]);*/
         if (code == 0) code = ncbp->ncb_retcode;
         if (code != 0) {
-            osi_Log1(afsd_logp, "Netbios NCBHANGUP error code %d", code);
+            osi_Log1(smb_logp, "Netbios NCBHANGUP error code %d", code);
             fprintf(stderr, "Session %d Netbios NCBHANGUP error code %d", i, code);
         }
     }
@@ -7081,7 +7227,7 @@ void smb_LogPacket(smb_packet_t *packet)
 
        if(!packet) return;
 
-       osi_Log0(afsd_logp, "*** SMB packet dump ***");
+       osi_Log0(smb_logp, "*** SMB packet dump ***");
 
        vp = (BYTE *) packet->data;
 
@@ -7126,10 +7272,10 @@ void smb_LogPacket(smb_packet_t *packet)
 
                *cp = 0;
 
-               osi_Log0( afsd_logp, buf );
+               osi_Log0( smb_logp, buf );
        }
 
-       osi_Log0(afsd_logp, "*** End SMB packet dump ***");
+       osi_Log0(smb_logp, "*** End SMB packet dump ***");
 
 }