hello shirish,

we made some more experiments with the dfs-code and now have a running
solution for our smb-proxy, without breaking msdfs (well, i didn't had a
look on the dfs_rpc-pipe for now...)

you can now have a samba-share behave like an mdfs-symlink.
if you set a share to "msdfs proxy = yes" and declare the link in its
path to "msdfs link name = linkname" the clients will reveive correct 
referrals already when they access the share :) 

since we are planning to use this patch in production, it would be very
nice if you could comment on this.

-----8<------------------snip--------------8<--------------
add to smb.conf:
        [global]
                host msdfs = yes

        [dfs-fake]
                path = /export/dfs-fake
                msdfs root      = yes
                msdfs proxy     = yes
                msdfs link name = "linkname"

create a link:

        ln -s msdfs:unimak\\storage /export/dfs-fake/linkname
----->8------------------snap-------------->8--------------

thanks a lot,
guenther


On Thu, Sep 05, 2002 at 09:50:51AM -0700, Shirish Kalele wrote:
> Hi,
> 
> Clients do request dfs referrals for every share they connect to. In a dfs
> reply for a share, you could try and send a different sharename and see what
> happens. I don't know if clients will be able to handle this. Look for
> self_referral in the setup_dfs_referral() code to find out where to start
> making changes.
> 
> Let me know how the clients take it..
> 
> Thanks,
> Shirish
> 
> ----- Original Message -----
> From: "Guenther Deschner" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Wednesday, September 04, 2002 2:48 PM
> Subject: msdfs referrals at share-level
> 
> hello everybody,
> 
> as far as i have looked into msdfs.c it seems to be impossible to send
> a client a dfs-referral at the share level (\\fileserver\msdfs-link).
> 
> maybe there is another way to "proxy" a request to \\samba\thisshare to
> \\anothersamba\thatshare ?
> 
> i currently want to migrate a couple of nt-servers transparently for
> clients. the basic idea is to setup one samba-server that offers faked
> file-service via netbios-aliases and dfs-redirects to the real
> samba-fileserver. unfortunatly touching the clients is a no-go.
> 
> old setup with *nt*:
> 
>  client -> //fileserver/share1
> 
> planned setup with *samba*:
> 
>  client -> //fileserver/share1  where share1 -> msdfs:samba-file\whatever
> 
> any help is much appreciated.
> 
> bye,
> guenther
> --
> Guenther Deschner                          [EMAIL PROTECTED]
> SuSE Linux AG                                        GnuPG: 8EE11688
> Berliner Str. 27                      phone:  +49 (0) 30 / 430944778
> D-13507 Berlin                           fax:  +49 (0) 30 / 43732804
> 
> 

-- 
Guenther Deschner                          [EMAIL PROTECTED]
SuSE Linux AG                                        GnuPG: 8EE11688
Berliner Str. 27                      phone:  +49 (0) 30 / 430944778
D-13507 Berlin                           fax:  +49 (0) 30 / 43732804
--- source/param/loadparm.c     Thu Oct 10 00:26:52 2002
+++ source/param/loadparm.c     Mon Oct 14 14:21:08 2002
@@ -408,6 +408,8 @@
        BOOL bInheritPerms;
        BOOL bInheritACLS;
        BOOL bMSDfsRoot;
+       BOOL bMSDfsProxy;
+       char *bMSDfsLinkName;
        BOOL bUseClientDriver;
        BOOL bDefaultDevmode;
        BOOL bNTAclSupport;
@@ -533,6 +535,8 @@
        False,                  /* bInheritPerms */
        False,                  /* bInheritACLS */
        False,                  /* bMSDfsRoot */
+       False,                  /* bMSDfsProxy */
+       NULL,                   /* bMSDfsLinkName */
        False,                  /* bUseClientDriver */
        False,                  /* bDefaultDevmode */
        True,                   /* bNTAclSupport */
@@ -1107,6 +1111,8 @@
        {"MSDfs options", P_SEP, P_SEPARATOR},
 
        {"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_SHARE},
+       {"msdfs proxy", P_BOOL, P_LOCAL, &sDefault.bMSDfsProxy, NULL, NULL, 
+FLAG_SHARE},
+       {"msdfs link name", P_STRING, P_LOCAL, &sDefault.bMSDfsLinkName, NULL, NULL, 
+FLAG_SHARE},
        {"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, 0},
 #endif
 
@@ -1754,6 +1760,8 @@
 FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
 FN_LOCAL_STRING(lp_driverlocation, szPrinterDriverLocation)
 FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
+FN_LOCAL_BOOL(lp_msdfs_proxy, bMSDfsProxy)
+FN_LOCAL_STRING(lp_msdfs_link_name, bMSDfsLinkName)
 FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
 FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
 FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
--- source/msdfs/msdfs.c        Fri Sep  6 22:47:07 2002
+++ source/msdfs/msdfs.c        Mon Oct 14 14:18:46 2002
@@ -597,12 +609,37 @@
        int reply_size = 0;
        char *pathnamep = pathname;
 
+       struct connection_struct conns;
+       struct connection_struct* conn = &conns;
+       int snum;
+       struct dfs_path dpi;
+
+       struct junction_map junction2;
+       parse_dfs_path(pathname, &dpi);
+       pstrcpy(junction2.service_name, dpi.servicename);
+       snum = lp_servicenumber(junction2.service_name);
+       create_conn_struct(conn, snum);
+       
+
        ZERO_STRUCT(junction);
 
        /* get the junction entry */
        if (!pathnamep)
                return -1;
 
+        if (lp_msdfs_proxy(SNUM(conn))) {
+               DEBUG(10,("running in proxy mode\n"));
+               pstrcpy(pathnamep, "\\");
+               pstrcat(pathnamep, dpi.hostname);
+               pstrcat(pathnamep, "\\");
+               pstrcat(pathnamep, dpi.servicename);
+               pstrcat(pathnamep, "\\");
+               pstrcat(pathnamep, (char *) lp_msdfs_link_name(SNUM(conn)));
+        } else {
+               DEBUG(10,("running in normal mode\n"));
+       }
+       
+       
        /* Trim pathname sent by client so it begins with only one backslash.
           Two backslashes confuse some dfs clients
         */
@@ -628,6 +665,17 @@
                }
        }
        
+        if ( lp_msdfs_proxy(SNUM(conn)) ) {
+               DEBUG(10,("running in proxy mode\n"));
+               pstrcpy ( pathnamep, "\\" );
+               pstrcat ( pathnamep, dpi.hostname);
+               pstrcat ( pathnamep, "\\" );
+               pstrcat ( pathnamep, dpi.servicename);
+        } else {
+               DEBUG(10,("running in normal mode\n"));
+       }
+               
+       
        /* create the referral depeding on version */
        DEBUG(10,("max_referral_level :%d\n",max_referral_level));
        if(max_referral_level<2 || max_referral_level>3)

Attachment: msg03688/pgp00000.pgp
Description: PGP signature

Reply via email to