diff options
-rw-r--r-- | util-linux/mount.c | 56 |
1 files changed, 32 insertions, 24 deletions
diff --git a/util-linux/mount.c b/util-linux/mount.c index 9f9249f..31f433b 100644 --- a/util-linux/mount.c +++ b/util-linux/mount.c @@ -701,7 +701,8 @@ enum { NFS_MOUNT_TCP = 0x0040, /* 2 */ NFS_MOUNT_VER3 = 0x0080, /* 3 */ NFS_MOUNT_KERBEROS = 0x0100, /* 3 */ - NFS_MOUNT_NONLM = 0x0200 /* 3 */ + NFS_MOUNT_NONLM = 0x0200, /* 3 */ + NFS_MOUNT_NORDIRPLUS = 0x4000 }; @@ -896,18 +897,16 @@ get_mountport(struct pmap *pm_mnt, #if BB_MMU static int daemonize(void) { - int fd; int pid = fork(); if (pid < 0) /* error */ return -errno; if (pid > 0) /* parent */ return 0; /* child */ - fd = xopen(bb_dev_null, O_RDWR); - dup2(fd, 0); - dup2(fd, 1); - dup2(fd, 2); - while (fd > 2) close(fd--); + close(0); + xopen(bb_dev_null, O_RDWR); + xdup2(0, 1); + xdup2(0, 2); setsid(); openlog(applet_name, LOG_PID, LOG_DAEMON); logmode = LOGMODE_SYSLOG; @@ -959,23 +958,25 @@ static int nfsmount(struct mntent *mp, long vfsflags, char *filteropts) int mountport; int proto; #if BB_MMU - int bg = 0; + smallint bg = 0; #else enum { bg = 0 }; #endif - int soft; - int intr; - int posix; - int nocto; - int noac; - int nolock; int retry; - int tcp; int mountprog; int mountvers; int nfsprog; int nfsvers; int retval; + /* these all are one-bit really. 4.3.1 likes this combination: */ + smallint tcp; + smallint soft; + int intr; + int posix; + int nocto; + int noac; + int nordirplus; + int nolock; find_kernel_nfs_mount_version(); @@ -1036,12 +1037,12 @@ static int nfsmount(struct mntent *mp, long vfsflags, char *filteropts) * let the kernel decide. * timeo is filled in after we know whether it'll be TCP or UDP. */ memset(&data, 0, sizeof(data)); - data.retrans = 3; - data.acregmin = 3; - data.acregmax = 60; - data.acdirmin = 30; - data.acdirmax = 60; - data.namlen = NAME_MAX; + data.retrans = 3; + data.acregmin = 3; + data.acregmax = 60; + data.acdirmin = 30; + data.acdirmax = 60; + data.namlen = NAME_MAX; soft = 0; intr = 0; @@ -1049,6 +1050,7 @@ static int nfsmount(struct mntent *mp, long vfsflags, char *filteropts) nocto = 0; nolock = 0; noac = 0; + nordirplus = 0; retry = 10000; /* 10000 minutes ~ 1 week */ tcp = 0; @@ -1183,7 +1185,8 @@ static int nfsmount(struct mntent *mp, long vfsflags, char *filteropts) "ac\0" "tcp\0" "udp\0" - "lock\0"; + "lock\0" + "rdirplus\0"; int val = 1; if (!strncmp(opt, "no", 2)) { val = 0; @@ -1230,6 +1233,9 @@ static int nfsmount(struct mntent *mp, long vfsflags, char *filteropts) else bb_error_msg("warning: option nolock is not supported"); break; + case 11: //rdirplus + nordirplus = !val; + break; default: bb_error_msg("unknown nfs mount option: %s%s", val ? "" : "no", opt); goto fail; @@ -1242,7 +1248,8 @@ static int nfsmount(struct mntent *mp, long vfsflags, char *filteropts) | (intr ? NFS_MOUNT_INTR : 0) | (posix ? NFS_MOUNT_POSIX : 0) | (nocto ? NFS_MOUNT_NOCTO : 0) - | (noac ? NFS_MOUNT_NOAC : 0); + | (noac ? NFS_MOUNT_NOAC : 0) + | (nordirplus ? NFS_MOUNT_NORDIRPLUS : 0); if (nfs_mount_version >= 2) data.flags |= (tcp ? NFS_MOUNT_TCP : 0); if (nfs_mount_version >= 3) @@ -1325,6 +1332,7 @@ static int nfsmount(struct mntent *mp, long vfsflags, char *filteropts) retry_timeout.tv_usec = 0; total_timeout.tv_sec = 20; total_timeout.tv_usec = 0; +//FIXME: use monotonic()? timeout = time(NULL) + 60 * retry; prevt = 0; t = 30; @@ -1511,7 +1519,7 @@ static int nfsmount(struct mntent *mp, long vfsflags, char *filteropts) if (!daemonized) { daemonized = daemonize(); if (daemonized <= 0) { /* parent or error */ - // FIXME: parent doesn't close fsock - ??! +// FIXME: parent doesn't close fsock - ??! retval = -daemonized; goto ret; } |