[git commit master] mount: if we mount //host/xxx, add ip=IPADDR to options

Denys Vlasenko vda.linux at googlemail.com
Tue Dec 15 00:28:59 UTC 2009


commit: http://git.busybox.net/busybox/commit/?id=4e60f304d4525b37344a141bf28b46456dbf6203
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 util-linux/mount.c |   50 ++++++++++++++++++++------------------------------
 1 files changed, 20 insertions(+), 30 deletions(-)

diff --git a/util-linux/mount.c b/util-linux/mount.c
index e1372ea..1ffed9d 100644
--- a/util-linux/mount.c
+++ b/util-linux/mount.c
@@ -1639,52 +1639,42 @@ static int singlemount(struct mntent *mp, int ignore_busy)
 	 && (mp->mnt_fsname[0] == '/' || mp->mnt_fsname[0] == '\\')
 	 && mp->mnt_fsname[0] == mp->mnt_fsname[1]
 	) {
-#if 0 /* reported to break things */
+		int len;
+		char c;
 		len_and_sockaddr *lsa;
-		char *ip, *dotted;
-		char *s;
-
-		// Replace '/' with '\' and verify that unc points to "//server/share".
-		for (s = mp->mnt_fsname; *s; ++s)
-			if (*s == '/') *s = '\\';
+		char *ip, *dotted, *s;
 
-		// Get server IP
-		s = strrchr(mp->mnt_fsname, '\\');
-		if (s <= mp->mnt_fsname+1)
+		s = mp->mnt_fsname + 2;
+		len = strcspn(s, "/\\");
+		s += len; // points after hostname
+		if (len == 0 || *s == '\0')
 			goto report_error;
+		c = *s;
 		*s = '\0';
-		lsa = host2sockaddr(mp->mnt_fsname+2, 0);
-		*s = '\\';
+		lsa = host2sockaddr(s, 0);
+		*s = c;
 		if (!lsa)
 			goto report_error;
 
-		// Insert ip=... option into string flags.
+		// Insert "ip=..." option into options
 		dotted = xmalloc_sockaddr2dotted_noport(&lsa->u.sa);
+		if (ENABLE_FEATURE_CLEAN_UP) free(lsa);
 		ip = xasprintf("ip=%s", dotted);
+		if (ENABLE_FEATURE_CLEAN_UP) free(dotted);
 		parse_mount_options(ip, &filteropts);
+		if (ENABLE_FEATURE_CLEAN_UP) free(ip);
 
-		// Compose new unc '\\server-ip\share'
-		// (s => slash after hostname)
-		mp->mnt_fsname = xasprintf("\\\\%s%s", dotted, s);
-#endif
-		// Lock is required [why?]
+		// "-o mand" is required [why?]
 		vfsflags |= MS_MANDLOCK;
 		mp->mnt_type = (char*)"cifs";
 		rc = mount_it_now(mp, vfsflags, filteropts);
-#if 0
-		if (ENABLE_FEATURE_CLEAN_UP) {
-			free(mp->mnt_fsname);
-			free(ip);
-			free(dotted);
-			free(lsa);
-		}
-#endif
+
 		goto report_error;
 	}
 
 	// Might this be an NFS filesystem?
 	if (ENABLE_FEATURE_MOUNT_NFS
-	 && (!mp->mnt_type || !strcmp(mp->mnt_type, "nfs"))
+	 && (!mp->mnt_type || strcmp(mp->mnt_type, "nfs") == 0)
 	 && strchr(mp->mnt_fsname, ':') != NULL
 	) {
 		rc = nfsmount(mp, vfsflags, filteropts);
@@ -1702,7 +1692,7 @@ static int singlemount(struct mntent *mp, int ignore_busy)
 		if (ENABLE_FEATURE_MOUNT_LOOP && S_ISREG(st.st_mode)) {
 			loopFile = bb_simplify_path(mp->mnt_fsname);
 			mp->mnt_fsname = NULL; // will receive malloced loop dev name
-			if (set_loop(&(mp->mnt_fsname), loopFile, 0) < 0) {
+			if (set_loop(&mp->mnt_fsname, loopFile, 0) < 0) {
 				if (errno == EPERM || errno == EACCES)
 					bb_error_msg(bb_msg_perm_denied_are_you_root);
 				else
@@ -1870,9 +1860,9 @@ int mount_main(int argc UNUSED_PARAM, char **argv)
 			{
 				// Don't show rootfs. FIXME: why??
 				// util-linux 2.12a happily shows rootfs...
-				//if (!strcmp(mtpair->mnt_fsname, "rootfs")) continue;
+				//if (strcmp(mtpair->mnt_fsname, "rootfs") == 0) continue;
 
-				if (!fstype || !strcmp(mtpair->mnt_type, fstype))
+				if (!fstype || strcmp(mtpair->mnt_type, fstype) == 0)
 					printf("%s on %s type %s (%s)\n", mtpair->mnt_fsname,
 							mtpair->mnt_dir, mtpair->mnt_type,
 							mtpair->mnt_opts);
-- 
1.6.3.3



More information about the busybox-cvs mailing list