summaryrefslogtreecommitdiff
path: root/source3/msdfs
diff options
context:
space:
mode:
Diffstat (limited to 'source3/msdfs')
-rw-r--r--source3/msdfs/README32
-rw-r--r--source3/msdfs/msdfs.c85
2 files changed, 55 insertions, 62 deletions
diff --git a/source3/msdfs/README b/source3/msdfs/README
deleted file mode 100644
index 0e924b31dc..0000000000
--- a/source3/msdfs/README
+++ /dev/null
@@ -1,32 +0,0 @@
-Setting up MS Dfs in Samba
-kalele@veritas.com March 2000
-
-Currently, MS Dfs support is a configure time parameter (--with-msdfs). Can be changed later to always compile it in..
-
-To have a server announce itself as a Dfs server, add a "host msdfs=yes" entry to smb.conf.
-
-To make a share a Dfs root, add a "msdfs root=yes" entry to the share definition
-in the smb.conf file.
-e.g.
-[pub]
- path = /export/publicsmb
- msdfs root = yes
-
-To create dfs volumes/junctions in the share, create symbolic links of the
-format msdfs:server1\share1,server2\share2 and so on.
-
-In the above example, create a dfs volume "dfsstorage" in the [pub] share as:
-cd /export/publicsmb
-ln -s msdfs:serverA\\share dfsstorage
-
-Clicking on dfsstorage from a dfs-aware client will show you the contents of
-\\serverA\share
-
-Shares with "msdfs root = no" (which is the default) entries are served as normal
-shares and the client stops talking Dfs with Samba after a tconX.
-
-NOTES:
-* Windows clients need to be rebooted if a non-dfs root is made a dfs root or
- vice versa. A better option is to introduce a new share and make it the dfs root.
-* Currently there's a restriction that msdfs symlink names should be all
- lowercase.
diff --git a/source3/msdfs/msdfs.c b/source3/msdfs/msdfs.c
index ce6e64d915..4c86cd0f94 100644
--- a/source3/msdfs/msdfs.c
+++ b/source3/msdfs/msdfs.c
@@ -40,7 +40,7 @@ static BOOL parse_dfs_path(char* pathname, struct dfs_path* pdp)
ZERO_STRUCTP(pdp);
- trim_string(temp,"\\","\\");
+ trim_char(temp,'\\','\\');
DEBUG(10,("temp in parse_dfs_path: .%s. after trimming \\'s\n",temp));
/* now tokenize */
@@ -87,8 +87,16 @@ static BOOL create_conn_struct( connection_struct *conn, int snum, char *path)
conn->connectpath = path;
pstring_sub(conn->connectpath , "%S", lp_servicename(snum));
+ /* needed for smbd_vfs_init() */
+
+ if ( (conn->mem_ctx=talloc_init("connection_struct")) == NULL ) {
+ DEBUG(0,("talloc_init(connection_struct) failed!\n"));
+ return False;
+ }
+
if (!smbd_vfs_init(conn)) {
DEBUG(0,("create_conn_struct: smbd_vfs_init failed.\n"));
+ talloc_destroy( conn->mem_ctx );
return False;
}
return True;
@@ -267,7 +275,7 @@ static BOOL resolve_dfs_path(char* dfspath, struct dfs_path* dp,
char *q;
pstring buf;
pstrcpy(buf, dfspath);
- trim_string(buf, NULL, "\\");
+ trim_char(buf, '\0', '\\');
for (; consumed_level; consumed_level--) {
q = strrchr(buf, '\\');
if (q) *q = 0;
@@ -339,6 +347,7 @@ BOOL get_referred_path(char *pathname, struct junction_map* jn,
struct connection_struct* conn = &conns;
pstring conn_path;
int snum;
+ BOOL ret = False;
BOOL self_referral = False;
@@ -381,16 +390,15 @@ BOOL get_referred_path(char *pathname, struct junction_map* jn,
if (!lp_msdfs_root(SNUM(conn))) {
DEBUG(3,("get_referred_path: .%s. in dfs path %s is not a dfs root.\n",
dp.servicename, pathname));
- return False;
+ goto out;
}
if (*lp_msdfs_proxy(snum) != '\0') {
struct referral* ref;
jn->referral_count = 1;
- if ((ref = (struct referral*) malloc(sizeof(struct referral)))
- == NULL) {
+ if ((ref = (struct referral*) malloc(sizeof(struct referral))) == NULL) {
DEBUG(0, ("malloc failed for referral\n"));
- return False;
+ goto out;
}
pstrcpy(ref->alternate_path, lp_msdfs_proxy(snum));
@@ -401,7 +409,8 @@ BOOL get_referred_path(char *pathname, struct junction_map* jn,
jn->referral_list = ref;
if (consumedcntp)
*consumedcntp = strlen(pathname);
- return True;
+ ret = True;
+ goto out;
}
/* If not remote & not a self referral, return False */
@@ -410,7 +419,7 @@ BOOL get_referred_path(char *pathname, struct junction_map* jn,
self_referralp, consumedcntp)) {
if (!*self_referralp) {
DEBUG(3,("get_referred_path: No valid referrals for path %s\n", pathname));
- return False;
+ goto out;
}
}
@@ -418,10 +427,9 @@ BOOL get_referred_path(char *pathname, struct junction_map* jn,
if (*self_referralp) {
struct referral* ref;
jn->referral_count = 1;
- if((ref = (struct referral*) malloc(sizeof(struct referral)))
- == NULL) {
+ if((ref = (struct referral*) malloc(sizeof(struct referral))) == NULL) {
DEBUG(0,("malloc failed for referral\n"));
- return False;
+ goto out;
}
pstrcpy(ref->alternate_path,pathname);
@@ -431,8 +439,12 @@ BOOL get_referred_path(char *pathname, struct junction_map* jn,
if (consumedcntp)
*consumedcntp = strlen(pathname);
}
-
- return True;
+
+ ret = True;
+out:
+ talloc_destroy( conn->mem_ctx );
+
+ return ret;
}
static int setup_ver2_dfs_referral(char* pathname, char** ppdata,
@@ -758,6 +770,7 @@ BOOL create_msdfs_link(struct junction_map* jn, BOOL exists)
connection_struct *conn = &conns;
int i=0;
BOOL insert_comma = False;
+ BOOL ret = False;
if(!junction_to_local_path(jn, path, sizeof(path), conn))
return False;
@@ -767,7 +780,7 @@ BOOL create_msdfs_link(struct junction_map* jn, BOOL exists)
for(i=0; i<jn->referral_count; i++) {
char* refpath = jn->referral_list[i].alternate_path;
- trim_string(refpath, "\\", "\\");
+ trim_char(refpath, '\\', '\\');
if(*refpath == '\0') {
if (i == 0)
insert_comma = False;
@@ -786,14 +799,20 @@ BOOL create_msdfs_link(struct junction_map* jn, BOOL exists)
if(exists)
if(SMB_VFS_UNLINK(conn,path)!=0)
- return False;
+ goto out;
if(SMB_VFS_SYMLINK(conn, msdfs_link, path) < 0) {
DEBUG(1,("create_msdfs_link: symlink failed %s -> %s\nError: %s\n",
path, msdfs_link, strerror(errno)));
- return False;
+ goto out;
}
- return True;
+
+
+ ret = True;
+
+out:
+ talloc_destroy( conn->mem_ctx );
+ return ret;
}
BOOL remove_msdfs_link(struct junction_map* jn)
@@ -801,14 +820,16 @@ BOOL remove_msdfs_link(struct junction_map* jn)
pstring path;
connection_struct conns;
connection_struct *conn = &conns;
+ BOOL ret = False;
- if(!junction_to_local_path(jn, path, sizeof(path), conn))
- return False;
-
- if(SMB_VFS_UNLINK(conn, path)!=0)
- return False;
-
- return True;
+ if( junction_to_local_path(jn, path, sizeof(path), conn) ) {
+ if( SMB_VFS_UNLINK(conn, path) == 0 )
+ ret = True;
+
+ talloc_destroy( conn->mem_ctx );
+ }
+
+ return ret;
}
static BOOL form_junctions(int snum, struct junction_map* jn, int* jn_count)
@@ -821,6 +842,7 @@ static BOOL form_junctions(int snum, struct junction_map* jn, int* jn_count)
connection_struct conns;
connection_struct *conn = &conns;
struct referral *ref = NULL;
+ BOOL ret = False;
pstrcpy(connect_path,lp_pathname(snum));
@@ -846,7 +868,7 @@ static BOOL form_junctions(int snum, struct junction_map* jn, int* jn_count)
= (struct referral*) malloc(sizeof(struct referral));
if (jn[cnt].referral_list == NULL) {
DEBUG(0, ("Malloc failed!\n"));
- return False;
+ goto out;
}
ref->proximity = 0;
@@ -854,7 +876,8 @@ static BOOL form_junctions(int snum, struct junction_map* jn, int* jn_count)
if (*lp_msdfs_proxy(snum) != '\0') {
pstrcpy(ref->alternate_path, lp_msdfs_proxy(snum));
*jn_count = ++cnt;
- return True;
+ ret = True;
+ goto out;
}
slprintf(ref->alternate_path, sizeof(pstring)-1,
@@ -864,7 +887,7 @@ static BOOL form_junctions(int snum, struct junction_map* jn, int* jn_count)
/* Now enumerate all dfs links */
dirp = SMB_VFS_OPENDIR(conn, connect_path);
if(!dirp)
- return False;
+ goto out;
while((dname = vfs_readdirname(conn, dirp)) != NULL) {
pstring pathreal;
@@ -883,7 +906,9 @@ static BOOL form_junctions(int snum, struct junction_map* jn, int* jn_count)
SMB_VFS_CLOSEDIR(conn,dirp);
*jn_count = cnt;
- return True;
+out:
+ talloc_destroy(conn->mem_ctx);
+ return ret;
}
int enum_msdfs_links(struct junction_map* jn)
@@ -892,9 +917,9 @@ int enum_msdfs_links(struct junction_map* jn)
int jn_count = 0;
if(!lp_host_msdfs())
- return -1;
+ return 0;
- for(i=0;*lp_servicename(i);i++) {
+ for(i=0;i < lp_numservices();i++) {
if(lp_msdfs_root(i))
form_junctions(i,jn,&jn_count);
}