Hello, I think we have found a problem with Samba's msdfs support. When we try to directly access a directory for the first time via a msdfs link from a Windows XP or 2000 client the Samba server does not return the referral if the link is more than two levels back in the path. Here is an example:
Win2000 server with a Dfs root \\rchn20dc\home, link technet points to a Samba server: C:\>dir \\rchn20dc\home\technet\tn0208\technet Volume in drive \\rchn20dc\home has no label. Volume Serial Number is 5406-067F Directory of \\rchn20dc\home\technet\tn0208\technet 08/06/2002 02:37 PM <DIR> . . . 07/31/2002 07:00 PM 11,291,797 TN0208.TOC 5 File(s) 643,464,418 bytes 2 Dir(s) 233,144,582,144 bytes free Samba 2.2.5 or 3.0 alpha19 msdfs root with same link: C:\>dir \\rchfs\pub\technet\tn0208\technet Volume in drive \\rchfs\pub is pub Volume Serial Number is 0514-0112 Directory of \\rchfs\pub\technet\tn0208 08/06/2002 02:34 PM <DIR> . . . 08/06/2002 02:37 PM <DIR> TECHNET 20 File(s) 6,407,854 bytes 4 Dir(s) 233,144,582,144 bytes free After looking at the ethereal traces to a Samba 2.2.5, Samba 3.0 alpha19, and Win2k server I see that Win2k returns the referral for \\rcn20dc\pub when sent a get_dfs_referral for \rchn20dc\home\technet\tn0208\technet. The Samba servers do not. The XP client then sends a second get_dfs_referral to the Samba server, this time leaving off the last directory in the path and then displays the directory one level back from what was asked for. I have tried the same test from a Windows 2000 client and the dir command to the Samba server just fails, it does not send the second get_dfs_referral. I made the following change to work around the problem. Can anyone tell me if this is OK: [rchfs2:root samba-2.2.5]# diff -urN source/msdfs/msdfs.c.orig source/msdfs/msdf s.c --- source/msdfs/msdfs.c.orig Tue Jun 18 20:13:44 2002 +++ source/msdfs/msdfs.c Wed Aug 21 10:20:20 2002 @@ -215,7 +215,7 @@ BOOL* self_referralp, int* consumedcntp) { fstring localpath; - + int levels; char *p; fstring reqpath; @@ -253,7 +253,7 @@ /* also redirect if the parent directory is a dfs link */ fstrcpy(reqpath, dp->reqpath); p = strrchr(reqpath, '/'); - if (p) { + for(levels=1; p; levels++) { *p = '\0'; fstrcpy(localpath, conn->connectpath); fstrcat(localpath, "/"); @@ -267,19 +267,23 @@ the path consumed */ if (consumedcntp) { - char *q; - pstring buf; + char *q; + pstring buf; + int j; safe_strcpy(buf, dfspath, sizeof(buf)); trim_string(buf, NULL, "\\"); - q = strrchr(buf, '\\'); - if (q) - *q = '\0'; + for(j=0; j<levels; j++) { + q = strrchr(buf, '\\'); + if (q) + *q = '\0'; + } *consumedcntp = strlen(buf); DEBUG(10, ("resolve_dfs_path: Path consumed: %d\ n", *consumedcntp)); } return True; - } + } + p = strrchr(reqpath, '/'); } return False; Thanks, John Janosik [EMAIL PROTECTED]