svn commit: samba r21749 - in branches/SAMBA_3_0_25/source/libsmb: .

jra at samba.org jra at samba.org
Wed Mar 7 19:43:01 GMT 2007


Author: jra
Date: 2007-03-07 19:43:00 +0000 (Wed, 07 Mar 2007)
New Revision: 21749

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=21749

Log:
Merge from SAMBA_3_0 to fix dfs referrel link problems.
Sync up with 3.0.
Jeremy.

Modified:
   branches/SAMBA_3_0_25/source/libsmb/clidfs.c
   branches/SAMBA_3_0_25/source/libsmb/errormap.c


Changeset:
Modified: branches/SAMBA_3_0_25/source/libsmb/clidfs.c
===================================================================
--- branches/SAMBA_3_0_25/source/libsmb/clidfs.c	2007-03-07 14:25:07 UTC (rev 21748)
+++ branches/SAMBA_3_0_25/source/libsmb/clidfs.c	2007-03-07 19:43:00 UTC (rev 21749)
@@ -354,13 +354,13 @@
 	have_ip = True;
 }
 
-/********************************************************************
- split a dfs path into the server and share name components
-********************************************************************/
+/**********************************************************************
+ split a dfs path into the server, share name, and extrapath components
+**********************************************************************/
 
-static void split_dfs_path( const char *nodepath, fstring server, fstring share )
+static void split_dfs_path( const char *nodepath, fstring server, fstring share, fstring extrapath )
 {
-	char *p;
+	char *p, *q;
 	pstring path;
 
 	pstrcpy( path, nodepath );
@@ -368,7 +368,7 @@
 	if ( path[0] != '\\' )
 		return;
 
-	p = strrchr_m( path, '\\' );
+	p = strchr_m( path + 1, '\\' );
 
 	if ( !p )
 		return;
@@ -376,6 +376,16 @@
 	*p = '\0';
 	p++;
 
+	/* Look for any extra/deep path */
+	q = strchr_m(p, '\\');
+	if (q != NULL) {
+		*q = '\0';
+		q++;
+		fstrcpy( extrapath, q );
+	} else {
+		fstrcpy( extrapath, '\0' );
+	}
+	
 	fstrcpy( share, p );
 	fstrcpy( server, &path[1] );
 }
@@ -576,13 +586,13 @@
 	size_t num_refs;
 	uint16 consumed;
 	struct cli_state *cli_ipc;
-	pstring fullpath, cleanpath;
+	pstring fullpath, cleanpath, extrapath;
 	int pathlen;
 	fstring server, share;
 	struct cli_state *newcli;
 	pstring newpath;
 	pstring newmount;
-	char *ppath;
+	char *ppath, *temppath = NULL;
 	
 	SMB_STRUCT_STAT sbuf;
 	uint32 attributes;
@@ -637,8 +647,14 @@
 	consumed = MIN(pathlen, consumed );
 	pstrcpy( targetpath, &fullpath[consumed/2] );
 
-	split_dfs_path( refs[0].dfspath, server, share );
+	split_dfs_path( refs[0].dfspath, server, share, extrapath );
 	SAFE_FREE( refs );
+
+	if (strlen(extrapath) > 0) {
+		string_append(&temppath, extrapath);
+		string_append(&temppath, targetpath);
+		pstrcpy( targetpath, temppath );
+	}
 	
 	/* open the connection to the target path */
 	
@@ -690,6 +706,7 @@
 	pstring fullpath;
 	BOOL res;
 	uint16 cnum;
+	fstring newextrapath;
 	
 	if ( !cli || !sharename )
 		return False;
@@ -725,7 +742,7 @@
 		return False;
 	}
 	
-	split_dfs_path( refs[0].dfspath, newserver, newshare );
+	split_dfs_path( refs[0].dfspath, newserver, newshare, newextrapath );
 
 	/* check that this is not a self-referral */
 

Modified: branches/SAMBA_3_0_25/source/libsmb/errormap.c
===================================================================
--- branches/SAMBA_3_0_25/source/libsmb/errormap.c	2007-03-07 14:25:07 UTC (rev 21748)
+++ branches/SAMBA_3_0_25/source/libsmb/errormap.c	2007-03-07 19:43:00 UTC (rev 21749)
@@ -1511,7 +1511,6 @@
 	{ EACCES, ERRDOS, ERRnoaccess, NT_STATUS_ACCESS_DENIED },
 	{ ENOENT, ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_NOT_FOUND },
 	{ ENOTDIR, ERRDOS, ERRbadpath,  NT_STATUS_NOT_A_DIRECTORY },
-	{ ENAMETOOLONG, ERRDOS, 206, NT_STATUS_OBJECT_NAME_INVALID },
 	{ EIO, ERRHRD, ERRgeneral, NT_STATUS_IO_DEVICE_ERROR },
 	{ EBADF, ERRSRV, ERRsrverror, NT_STATUS_INVALID_HANDLE },
 	{ EINVAL, ERRSRV, ERRsrverror, NT_STATUS_INVALID_HANDLE },
@@ -1534,6 +1533,9 @@
 #ifdef EROFS
 	{ EROFS, ERRHRD, ERRnowrite, NT_STATUS_ACCESS_DENIED },
 #endif
+#ifdef ENAMETOOLONG
+	{ ENAMETOOLONG, ERRDOS, 206, NT_STATUS_OBJECT_NAME_INVALID },
+#endif
 #ifdef EFBIG
 	{ EFBIG, ERRHRD, ERRdiskfull, NT_STATUS_DISK_FULL },
 #endif



More information about the samba-cvs mailing list