Enabled the creating of mount.nfs and umount.nfs binaries Added mount
option fixes suggested by upstream. Fix lazy umounts (bz 169299) Added -o fsc mount option.
This commit is contained in:
parent
22ba356e78
commit
8280d7e59c
58
nfs-utils-1.0.9-lazy-umount.patch
Normal file
58
nfs-utils-1.0.9-lazy-umount.patch
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
--- nfs-utils-1.0.9/utils/mount/nfsumount.c.orig 2006-07-28 11:12:32.000000000 -0400
|
||||||
|
+++ nfs-utils-1.0.9/utils/mount/nfsumount.c 2006-07-28 11:14:41.000000000 -0400
|
||||||
|
@@ -100,9 +100,9 @@ int nfs_call_umount(clnt_addr_t *mnt_ser
|
||||||
|
}
|
||||||
|
mnt_closeclnt(clnt, msock);
|
||||||
|
if (res == RPC_SUCCESS)
|
||||||
|
- return 1;
|
||||||
|
+ return 0;
|
||||||
|
out_bad:
|
||||||
|
- return 0;
|
||||||
|
+ return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
u_int get_mntproto(const char *);
|
||||||
|
@@ -251,9 +251,6 @@ int add_mtab2(const char *spec, const ch
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
-/*
|
||||||
|
- * Returns 1 if everything went well, else 0.
|
||||||
|
- */
|
||||||
|
int _nfsumount(const char *spec, const char *opts)
|
||||||
|
{
|
||||||
|
char *hostname;
|
||||||
|
@@ -309,8 +306,8 @@ int _nfsumount(const char *spec, const c
|
||||||
|
goto out_bad;
|
||||||
|
return nfs_call_umount(&mnt_server, &dirname);
|
||||||
|
out_bad:
|
||||||
|
- fprintf(stderr, "%s: %s: not found or not mounted\n", progname, spec);
|
||||||
|
- return 0;
|
||||||
|
+ fprintf(stderr, "%s: %s: not found / mounted or server not reachable\n", progname, spec);
|
||||||
|
+ return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct option umount_longopts[] =
|
||||||
|
@@ -393,14 +390,18 @@ int nfsumount(int argc, char *argv[])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- ret = _nfsumount(mc->m.mnt_fsname, mc->m.mnt_opts);
|
||||||
|
- if(ret)
|
||||||
|
+ ret = 0;
|
||||||
|
+ if(!force && !lazy)
|
||||||
|
+ ret = _nfsumount(mc->m.mnt_fsname, mc->m.mnt_opts);
|
||||||
|
+ if(!ret)
|
||||||
|
ret = add_mtab2(mc->m.mnt_fsname, mc->m.mnt_dir,
|
||||||
|
mc->m.mnt_type, mc->m.mnt_opts, mc);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
- ret = _nfsumount(spec, NULL);
|
||||||
|
- if(ret)
|
||||||
|
+ ret = 0;
|
||||||
|
+ if(!force && !lazy)
|
||||||
|
+ ret = _nfsumount(spec, NULL);
|
||||||
|
+ if(!ret)
|
||||||
|
ret = add_mtab2(spec, spec, spec, spec, NULL);
|
||||||
|
}
|
||||||
|
|
71
nfs-utils-1.0.9-mount-fsc.patch
Normal file
71
nfs-utils-1.0.9-mount-fsc.patch
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
--- nfs-utils-1.0.9/utils/mount/nfs4mount.c.orig 2006-07-07 20:04:32.000000000 -0400
|
||||||
|
+++ nfs-utils-1.0.9/utils/mount/nfs4mount.c 2006-07-28 13:08:10.000000000 -0400
|
||||||
|
@@ -200,7 +200,7 @@ int nfs4mount(const char *spec, const ch
|
||||||
|
char *s;
|
||||||
|
int val;
|
||||||
|
int bg, soft, intr;
|
||||||
|
- int nocto, noac;
|
||||||
|
+ int nocto, noac, fscache;
|
||||||
|
int retry;
|
||||||
|
int retval;
|
||||||
|
time_t timeout, t;
|
||||||
|
@@ -251,6 +251,7 @@ int nfs4mount(const char *spec, const ch
|
||||||
|
intr = NFS4_MOUNT_INTR;
|
||||||
|
nocto = 0;
|
||||||
|
noac = 0;
|
||||||
|
+ fscache = 0;
|
||||||
|
retry = 10000; /* 10000 minutes ~ 1 week */
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -331,6 +332,8 @@ int nfs4mount(const char *spec, const ch
|
||||||
|
soft = !val;
|
||||||
|
else if (!strcmp(opt, "intr"))
|
||||||
|
intr = val;
|
||||||
|
+ else if (!strcmp(opt, "fsc"))
|
||||||
|
+ fscache = val;
|
||||||
|
else if (!strcmp(opt, "cto"))
|
||||||
|
nocto = !val;
|
||||||
|
else if (!strcmp(opt, "ac"))
|
||||||
|
@@ -346,7 +349,8 @@ int nfs4mount(const char *spec, const ch
|
||||||
|
data.flags = (soft ? NFS4_MOUNT_SOFT : 0)
|
||||||
|
| (intr ? NFS4_MOUNT_INTR : 0)
|
||||||
|
| (nocto ? NFS4_MOUNT_NOCTO : 0)
|
||||||
|
- | (noac ? NFS4_MOUNT_NOAC : 0);
|
||||||
|
+ | (noac ? NFS4_MOUNT_NOAC : 0)
|
||||||
|
+ | (fscache ? NFS4_MOUNT_FSCACHE : 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Give a warning if the rpc.idmapd daemon is not running
|
||||||
|
--- nfs-utils-1.0.9/utils/mount/nfs_mount.h.orig 2006-07-28 12:52:43.000000000 -0400
|
||||||
|
+++ nfs-utils-1.0.9/utils/mount/nfs_mount.h 2006-07-28 12:58:07.000000000 -0400
|
||||||
|
@@ -63,6 +63,7 @@ struct nfs_mount_data {
|
||||||
|
#define NFS_MOUNT_BROKEN_SUID 0x0400 /* 4 */
|
||||||
|
#define NFS_MOUNT_NOACL 0x0800 /* 4 */
|
||||||
|
#define NFS_MOUNT_SECFLAVOUR 0x2000 /* 5 */
|
||||||
|
+#define NFS_MOUNT_FSCACHE 0x4000 /* 6 */
|
||||||
|
|
||||||
|
/* security pseudoflavors */
|
||||||
|
|
||||||
|
--- nfs-utils-1.0.9/utils/mount/nfsmount.c.orig 2006-07-28 13:02:55.000000000 -0400
|
||||||
|
+++ nfs-utils-1.0.9/utils/mount/nfsmount.c 2006-07-28 13:03:11.000000000 -0400
|
||||||
|
@@ -694,6 +694,10 @@ parse_options(char *old_opts, struct nfs
|
||||||
|
data->flags &= ~NFS_MOUNT_SOFT;
|
||||||
|
if (val)
|
||||||
|
data->flags |= NFS_MOUNT_SOFT;
|
||||||
|
+ } else if (!strcmp(opt, "fsc")) {
|
||||||
|
+ data->flags &= ~NFS_MOUNT_FSCACHE;
|
||||||
|
+ if (val)
|
||||||
|
+ data->flags |= NFS_MOUNT_FSCACHE;
|
||||||
|
} else if (!strcmp(opt, "hard")) {
|
||||||
|
data->flags &= ~NFS_MOUNT_SOFT;
|
||||||
|
if (!val)
|
||||||
|
--- nfs-utils-1.0.9/utils/mount/nfs4_mount.h.orig 2006-07-07 20:04:32.000000000 -0400
|
||||||
|
+++ nfs-utils-1.0.9/utils/mount/nfs4_mount.h 2006-07-28 13:07:27.000000000 -0400
|
||||||
|
@@ -65,6 +65,7 @@ struct nfs4_mount_data {
|
||||||
|
#define NFS4_MOUNT_NOCTO 0x0010 /* 1 */
|
||||||
|
#define NFS4_MOUNT_NOAC 0x0020 /* 1 */
|
||||||
|
#define NFS4_MOUNT_STRICTLOCK 0x1000 /* 1 */
|
||||||
|
+#define NFS4_MOUNT_FSCACHE 0x4000 /* 1 */
|
||||||
|
#define NFS4_MOUNT_FLAGMASK 0xFFFF
|
||||||
|
|
||||||
|
/* pseudoflavors: */
|
447
nfs-utils-1.0.9-mount-options-v3.patch
Normal file
447
nfs-utils-1.0.9-mount-options-v3.patch
Normal file
@ -0,0 +1,447 @@
|
|||||||
|
--- nfs-utils-1.0.9/support/include/fstab.h.orig 2006-07-07 20:04:32.000000000 -0400
|
||||||
|
+++ nfs-utils-1.0.9/support/include/fstab.h 2006-07-28 11:07:24.000000000 -0400
|
||||||
|
@@ -3,6 +3,10 @@
|
||||||
|
|
||||||
|
#include "nfs_mntent.h"
|
||||||
|
|
||||||
|
+#ifndef _PATH_FSTAB
|
||||||
|
+#define _PATH_FSTAB "/etc/fstab"
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
int mtab_is_writable(void);
|
||||||
|
int mtab_does_not_exist(void);
|
||||||
|
|
||||||
|
@@ -16,6 +20,10 @@ struct mntentchn *getmntoptfile (const c
|
||||||
|
struct mntentchn *getmntdirbackward (const char *dir, struct mntentchn *mc);
|
||||||
|
struct mntentchn *getmntdevbackward (const char *dev, struct mntentchn *mc);
|
||||||
|
|
||||||
|
+struct mntentchn *fstab_head (void);
|
||||||
|
+struct mntentchn *getfsfile (const char *file);
|
||||||
|
+struct mntentchn *getfsspec (const char *spec);
|
||||||
|
+
|
||||||
|
void lock_mtab (void);
|
||||||
|
void unlock_mtab (void);
|
||||||
|
void update_mtab (const char *special, nfs_mntent_t *with);
|
||||||
|
--- nfs-utils-1.0.9/support/include/nfs_mntent.h.orig 2006-07-07 20:04:32.000000000 -0400
|
||||||
|
+++ nfs-utils-1.0.9/support/include/nfs_mntent.h 2006-07-28 11:07:24.000000000 -0400
|
||||||
|
@@ -7,10 +7,10 @@
|
||||||
|
#define _NFS_MNTENT_H
|
||||||
|
|
||||||
|
typedef struct nfs_mntent_s {
|
||||||
|
- const char *mnt_fsname;
|
||||||
|
- const char *mnt_dir;
|
||||||
|
- const char *mnt_type;
|
||||||
|
- const char *mnt_opts;
|
||||||
|
+ char *mnt_fsname;
|
||||||
|
+ char *mnt_dir;
|
||||||
|
+ char *mnt_type;
|
||||||
|
+ char *mnt_opts;
|
||||||
|
int mnt_freq;
|
||||||
|
int mnt_passno;
|
||||||
|
} nfs_mntent_t;
|
||||||
|
--- nfs-utils-1.0.9/support/nfs/fstab.c.orig 2006-07-07 20:04:32.000000000 -0400
|
||||||
|
+++ nfs-utils-1.0.9/support/nfs/fstab.c 2006-07-28 11:07:24.000000000 -0400
|
||||||
|
@@ -78,10 +78,10 @@ mtab_is_writable() {
|
||||||
|
|
||||||
|
/* Contents of mtab and fstab ---------------------------------*/
|
||||||
|
|
||||||
|
-struct mntentchn mounttable;
|
||||||
|
-static int got_mtab = 0;
|
||||||
|
+struct mntentchn mounttable, fstab;
|
||||||
|
+static int got_mtab = 0, got_fstab = 0;
|
||||||
|
|
||||||
|
-static void read_mounttable(void);
|
||||||
|
+static void read_mounttable(void), read_fstab(void);
|
||||||
|
|
||||||
|
struct mntentchn *
|
||||||
|
mtab_head() {
|
||||||
|
@@ -96,6 +96,13 @@ my_free(const void *s) {
|
||||||
|
free((void *) s);
|
||||||
|
}
|
||||||
|
|
||||||
|
+struct mntentchn *
|
||||||
|
+fstab_head() {
|
||||||
|
+ if (!got_fstab)
|
||||||
|
+ read_fstab();
|
||||||
|
+ return &fstab;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
discard_mntentchn(struct mntentchn *mc0) {
|
||||||
|
struct mntentchn *mc, *mc1;
|
||||||
|
@@ -167,6 +174,26 @@ read_mounttable() {
|
||||||
|
read_mntentchn(mfp, fnam, mc);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+read_fstab() {
|
||||||
|
+ mntFILE *mfp = NULL;
|
||||||
|
+ const char *fnam;
|
||||||
|
+ struct mntentchn *mc = &fstab;
|
||||||
|
+
|
||||||
|
+ got_fstab = 1;
|
||||||
|
+ mc->nxt = mc->prev = NULL;
|
||||||
|
+
|
||||||
|
+ fnam = _PATH_FSTAB;
|
||||||
|
+ mfp = nfs_setmntent (fnam, "r");
|
||||||
|
+ if (mfp == NULL || mfp->mntent_fp == NULL) {
|
||||||
|
+ int errsv = errno;
|
||||||
|
+ error(_("warning: can't open %s: %s"),
|
||||||
|
+ _PATH_FSTAB, strerror (errsv));
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ read_mntentchn(mfp, fnam, mc);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Given the directory name NAME, and the place MCPREV we found it last time,
|
||||||
|
* try to find more occurrences.
|
||||||
|
@@ -201,6 +228,30 @@ getmntdevbackward (const char *name, str
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Find the dir FILE in fstab. */
|
||||||
|
+struct mntentchn *
|
||||||
|
+getfsfile (const char *file) {
|
||||||
|
+ struct mntentchn *mc, *mc0;
|
||||||
|
+
|
||||||
|
+ mc0 = fstab_head();
|
||||||
|
+ for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt)
|
||||||
|
+ if (streq(mc->m.mnt_dir, file))
|
||||||
|
+ return mc;
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* Find the device SPEC in fstab. */
|
||||||
|
+struct mntentchn *
|
||||||
|
+getfsspec (const char *spec) {
|
||||||
|
+ struct mntentchn *mc, *mc0;
|
||||||
|
+
|
||||||
|
+ mc0 = fstab_head();
|
||||||
|
+ for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt)
|
||||||
|
+ if (streq(mc->m.mnt_fsname, spec))
|
||||||
|
+ return mc;
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Updating mtab ----------------------------------------------*/
|
||||||
|
|
||||||
|
/* Flag for already existing lock file. */
|
||||||
|
--- nfs-utils-1.0.9/utils/mount/Makefile.am.orig 2006-07-07 20:04:32.000000000 -0400
|
||||||
|
+++ nfs-utils-1.0.9/utils/mount/Makefile.am 2006-07-28 11:09:31.000000000 -0400
|
||||||
|
@@ -14,9 +14,10 @@ MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
install-exec-hook:
|
||||||
|
(cd $(DESTDIR)$(sbindir) && \
|
||||||
|
- ln -sf $(sbin_PROGRAMS) mount.nfs4 && \
|
||||||
|
- ln -sf $(sbin_PROGRAMS) umount.nfs && \
|
||||||
|
- ln -sf $(sbin_PROGRAMS) umount.nfs4)
|
||||||
|
+ chmod +s $(sbin_PROGRAMS) && \
|
||||||
|
+ cp -p $(sbin_PROGRAMS) $(DESTDIR)$(sbindir)/mount.nfs4 && \
|
||||||
|
+ cp -p $(sbin_PROGRAMS) $(DESTDIR)$(sbindir)/umount.nfs && \
|
||||||
|
+ cp -p $(sbin_PROGRAMS) $(DESTDIR)$(sbindir)/umount.nfs4)
|
||||||
|
uninstall-hook:
|
||||||
|
(cd $(DESTDIR)$(sbindir) && \
|
||||||
|
rm -f mount.nfs4 umount.nfs umount.nfs4)
|
||||||
|
--- nfs-utils-1.0.9/utils/mount/mount.c.orig 2006-07-07 20:04:32.000000000 -0400
|
||||||
|
+++ nfs-utils-1.0.9/utils/mount/mount.c 2006-07-28 11:07:24.000000000 -0400
|
||||||
|
@@ -28,6 +28,7 @@
|
||||||
|
#include <sys/mount.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <mntent.h>
|
||||||
|
+#include <pwd.h>
|
||||||
|
|
||||||
|
#include "fstab.h"
|
||||||
|
#include "xcommon.h"
|
||||||
|
@@ -74,6 +75,12 @@ struct opt_map {
|
||||||
|
int mask; /* flag mask value */
|
||||||
|
};
|
||||||
|
|
||||||
|
+/* Custom mount options for our own purposes. */
|
||||||
|
+/* Maybe these should now be freed for kernel use again */
|
||||||
|
+#define MS_DUMMY 0x00000000
|
||||||
|
+#define MS_USERS 0x40000000
|
||||||
|
+#define MS_USER 0x20000000
|
||||||
|
+
|
||||||
|
static const struct opt_map opt_map[] = {
|
||||||
|
{ "defaults", 0, 0, 0 }, /* default options */
|
||||||
|
{ "ro", 1, 0, MS_RDONLY }, /* read-only */
|
||||||
|
@@ -90,6 +97,18 @@ static const struct opt_map opt_map[] =
|
||||||
|
{ "remount", 0, 0, MS_REMOUNT}, /* Alter flags of mounted FS */
|
||||||
|
{ "bind", 0, 0, MS_BIND }, /* Remount part of tree elsewhere */
|
||||||
|
{ "rbind", 0, 0, MS_BIND|MS_REC }, /* Idem, plus mounted subtrees */
|
||||||
|
+ { "auto", 0, 0, MS_DUMMY }, /* Can be mounted using -a */
|
||||||
|
+ { "noauto", 0, 0, MS_DUMMY }, /* Can only be mounted explicitly */
|
||||||
|
+ { "users", 0, 0, MS_USERS }, /* Allow ordinary user to mount */
|
||||||
|
+ { "nousers", 0, 1, MS_USERS }, /* Forbid ordinary user to mount */
|
||||||
|
+ { "user", 0, 0, MS_USER }, /* Allow ordinary user to mount */
|
||||||
|
+ { "nouser", 0, 1, MS_USER }, /* Forbid ordinary user to mount */
|
||||||
|
+ { "owner", 0, 0, MS_DUMMY }, /* Let the owner of the device mount */
|
||||||
|
+ { "noowner", 0, 0, MS_DUMMY }, /* Device owner has no special privs */
|
||||||
|
+ { "group", 0, 0, MS_DUMMY }, /* Let the group of the device mount */
|
||||||
|
+ { "nogroup", 0, 0, MS_DUMMY }, /* Device group has no special privs */
|
||||||
|
+ { "_netdev", 0, 0, MS_DUMMY}, /* Device requires network */
|
||||||
|
+ { "comment", 0, 0, MS_DUMMY}, /* fstab comment only (kudzu,_netdev)*/
|
||||||
|
|
||||||
|
/* add new options here */
|
||||||
|
#ifdef MS_NOSUB
|
||||||
|
@@ -104,6 +123,7 @@ static const struct opt_map opt_map[] =
|
||||||
|
{ "mand", 0, 0, MS_MANDLOCK }, /* Allow mandatory locks on this FS */
|
||||||
|
{ "nomand", 0, 1, MS_MANDLOCK }, /* Forbid mandatory locks on this FS */
|
||||||
|
#endif
|
||||||
|
+ { "loop", 1, 0, MS_DUMMY }, /* use a loop device */
|
||||||
|
#ifdef MS_NOATIME
|
||||||
|
{ "atime", 0, 1, MS_NOATIME }, /* Update access time */
|
||||||
|
{ "noatime", 0, 0, MS_NOATIME }, /* Do not update access time */
|
||||||
|
@@ -121,6 +141,12 @@ static char * fix_opts_string (int flags
|
||||||
|
char *new_opts;
|
||||||
|
|
||||||
|
new_opts = xstrdup((flags & MS_RDONLY) ? "ro" : "rw");
|
||||||
|
+ if (flags & MS_USER) {
|
||||||
|
+ struct passwd *pw = getpwuid(getuid());
|
||||||
|
+ if(pw)
|
||||||
|
+ new_opts = xstrconcat3(new_opts, ",user=", pw->pw_name);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
for (om = opt_map; om->opt != NULL; om++) {
|
||||||
|
if (om->skip)
|
||||||
|
continue;
|
||||||
|
@@ -132,9 +158,20 @@ static char * fix_opts_string (int flags
|
||||||
|
if (extra_opts && *extra_opts) {
|
||||||
|
new_opts = xstrconcat3(new_opts, ",", extra_opts);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
return new_opts;
|
||||||
|
}
|
||||||
|
|
||||||
|
+void copy_mntent(struct mntent *ment, nfs_mntent_t *nment)
|
||||||
|
+{
|
||||||
|
+ /* Not sure why nfs_mntent_t should exist */
|
||||||
|
+ strcpy(nment->mnt_fsname, ment->mnt_fsname);
|
||||||
|
+ strcpy(nment->mnt_dir, ment->mnt_dir);
|
||||||
|
+ strcpy(nment->mnt_type, ment->mnt_type);
|
||||||
|
+ strcpy(nment->mnt_opts, ment->mnt_opts);
|
||||||
|
+ nment->mnt_freq = ment->mnt_freq;
|
||||||
|
+ nment->mnt_passno = ment->mnt_passno;
|
||||||
|
+}
|
||||||
|
|
||||||
|
int add_mtab(char *fsname, char *mount_point, char *fstype, int flags, char *opts, int freq, int passno)
|
||||||
|
{
|
||||||
|
@@ -146,8 +183,16 @@ int add_mtab(char *fsname, char *mount_p
|
||||||
|
ment.mnt_dir = mount_point;
|
||||||
|
ment.mnt_type = fstype;
|
||||||
|
ment.mnt_opts = fix_opts_string(flags, opts);
|
||||||
|
- ment.mnt_freq = 0;
|
||||||
|
- ment.mnt_passno= 0;
|
||||||
|
+ ment.mnt_freq = freq;
|
||||||
|
+ ment.mnt_passno= passno;
|
||||||
|
+
|
||||||
|
+ if(flags & MS_REMOUNT) {
|
||||||
|
+ nfs_mntent_t nment;
|
||||||
|
+
|
||||||
|
+ copy_mntent(&ment, &nment);
|
||||||
|
+ update_mtab(nment.mnt_dir, &nment);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if ((fd = open(MOUNTED"~", O_RDWR|O_CREAT|O_EXCL, 0600)) == -1) {
|
||||||
|
fprintf(stderr, "Can't get "MOUNTED"~ lock file");
|
||||||
|
@@ -242,20 +287,56 @@ static void parse_opts (const char *opti
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Look for an option in a comma-separated list
|
||||||
|
+ */
|
||||||
|
+int
|
||||||
|
+contains(const char *list, const char *s) {
|
||||||
|
+ int n = strlen(s);
|
||||||
|
+
|
||||||
|
+ while (*list) {
|
||||||
|
+ if (strncmp(list, s, n) == 0 &&
|
||||||
|
+ (list[n] == 0 || list[n] == ','))
|
||||||
|
+ return 1;
|
||||||
|
+ while (*list && *list++ != ',') ;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * If list contains "user=peter" and we ask for "user=", return "peter"
|
||||||
|
+ */
|
||||||
|
+char *
|
||||||
|
+get_value(const char *list, const char *s) {
|
||||||
|
+ const char *t;
|
||||||
|
+ int n = strlen(s);
|
||||||
|
+
|
||||||
|
+ while (*list) {
|
||||||
|
+ if (strncmp(list, s, n) == 0) {
|
||||||
|
+ s = t = list+n;
|
||||||
|
+ while (*s && *s != ',')
|
||||||
|
+ s++;
|
||||||
|
+ return xstrndup(t, s-t);
|
||||||
|
+ }
|
||||||
|
+ while (*list && *list++ != ',') ;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void mount_error(char *node)
|
||||||
|
{
|
||||||
|
switch(errno) {
|
||||||
|
case ENOTDIR:
|
||||||
|
- printf("%s: mount point %s is not a directory\n", progname, node);
|
||||||
|
+ fprintf(stderr, "%s: mount point %s is not a directory\n", progname, node);
|
||||||
|
break;
|
||||||
|
case EBUSY:
|
||||||
|
- printf("%s: %s is already mounted or busy\n", progname, node);
|
||||||
|
+ fprintf(stderr, "%s: %s is already mounted or busy\n", progname, node);
|
||||||
|
break;
|
||||||
|
case ENOENT:
|
||||||
|
- printf("%s: mount point %s does not exist\n", progname, node);
|
||||||
|
+ fprintf(stderr, "%s: mount point %s does not exist\n", progname, node);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
- printf("%s: %s\n", progname, strerror(errno));
|
||||||
|
+ fprintf(stderr, "%s: %s\n", progname, strerror(errno));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -264,16 +345,13 @@ int main(int argc, char *argv[])
|
||||||
|
int c, flags = 0, nfs_mount_vers = 0, mnt_err = 1, fake = 0;
|
||||||
|
char *spec, *mount_point, *extra_opts = NULL;
|
||||||
|
char *mount_opts = NULL, *p;
|
||||||
|
+ struct mntentchn *mc;
|
||||||
|
+ uid_t uid = getuid();
|
||||||
|
|
||||||
|
progname = argv[0];
|
||||||
|
if ((p = strrchr(progname, '/')) != NULL)
|
||||||
|
progname = p+1;
|
||||||
|
|
||||||
|
- if (getuid() != 0) {
|
||||||
|
- printf("%s: only root can do that.\n", progname);
|
||||||
|
- exit(1);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
if(!strncmp(progname, "umount", strlen("umount"))) {
|
||||||
|
if(argc < 2) {
|
||||||
|
umount_usage();
|
||||||
|
@@ -355,9 +433,33 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
|
spec = argv[1];
|
||||||
|
mount_point = canonicalize(argv[2]);
|
||||||
|
-
|
||||||
|
+
|
||||||
|
parse_opts(mount_opts, &flags, &extra_opts);
|
||||||
|
|
||||||
|
+ if (uid != 0 && !(flags & MS_USERS) && !(flags & MS_USER)) {
|
||||||
|
+ fprintf(stderr, "%s: permission denied\n", progname);
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if ((flags & MS_USER || flags & MS_USERS) && uid != 0) {
|
||||||
|
+ /* check if fstab has entry, and further see if the user or users option is given */
|
||||||
|
+ if ((mc = getfsspec(spec)) == NULL &&
|
||||||
|
+ (mc = getfsfile(spec)) == NULL) {
|
||||||
|
+ fprintf(stderr, "%s: permission denied - invalid option\n", progname);
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ if((flags & MS_USER) && !contains(mc->m.mnt_opts, "user")) {
|
||||||
|
+ fprintf(stderr, "%s: permission denied - invalid option\n", progname);
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
+ if((flags & MS_USERS) && !contains(mc->m.mnt_opts, "users")) {
|
||||||
|
+ fprintf(stderr, "%s: permission denied - invalid option\n", progname);
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (!strcmp(progname, "mount.nfs4") || nfs_mount_vers == 4) {
|
||||||
|
nfs_mount_vers = 4;
|
||||||
|
mnt_err = nfs4mount(spec, mount_point, &flags, &extra_opts, &mount_opts, 0);
|
||||||
|
@@ -370,16 +472,19 @@ int main(int argc, char *argv[])
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mnt_err && !fake) {
|
||||||
|
- mnt_err = do_mount_syscall(spec, mount_point, nfs_mount_vers == 4 ? "nfs4" : "nfs", flags, mount_opts);
|
||||||
|
+ if(!(flags & MS_REMOUNT)) {
|
||||||
|
+ mnt_err = do_mount_syscall(spec, mount_point,
|
||||||
|
+ nfs_mount_vers == 4 ? "nfs4" : "nfs", flags, mount_opts);
|
||||||
|
|
||||||
|
- if(mnt_err) {
|
||||||
|
- mount_error(mount_point);
|
||||||
|
- exit(-1);
|
||||||
|
+ if(mnt_err) {
|
||||||
|
+ mount_error(mount_point);
|
||||||
|
+ exit(-1);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- if(!nomtab)
|
||||||
|
+ if(!nomtab) {
|
||||||
|
add_mtab(spec, mount_point, nfs_mount_vers == 4 ? "nfs4" : "nfs",
|
||||||
|
flags, extra_opts, 0, 0);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
--- nfs-utils-1.0.9/utils/mount/nfs_mount.h.orig 2006-07-07 20:04:32.000000000 -0400
|
||||||
|
+++ nfs-utils-1.0.9/utils/mount/nfs_mount.h 2006-07-28 11:07:24.000000000 -0400
|
||||||
|
@@ -80,5 +80,7 @@ struct nfs_mount_data {
|
||||||
|
|
||||||
|
int nfsmount(const char *, const char *, int *, char **, char **, int *, int);
|
||||||
|
void mount_errors(char *, int, int);
|
||||||
|
+int contains(const char *, const char *);
|
||||||
|
+char *get_value(const char *, const char *);
|
||||||
|
|
||||||
|
#endif /* _NFS_MOUNT_H */
|
||||||
|
--- nfs-utils-1.0.9/utils/mount/nfsumount.c.orig 2006-07-07 20:04:32.000000000 -0400
|
||||||
|
+++ nfs-utils-1.0.9/utils/mount/nfsumount.c 2006-07-28 11:07:24.000000000 -0400
|
||||||
|
@@ -23,12 +23,14 @@
|
||||||
|
#include <mntent.h>
|
||||||
|
#include <sys/mount.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
+#include <pwd.h>
|
||||||
|
|
||||||
|
#include "xcommon.h"
|
||||||
|
#include "fstab.h"
|
||||||
|
#include "nls.h"
|
||||||
|
#include "conn.h"
|
||||||
|
|
||||||
|
+#include "nfs_mount.h"
|
||||||
|
#include "mount_constants.h"
|
||||||
|
#include "mount.h"
|
||||||
|
#include "nfsumount.h"
|
||||||
|
@@ -307,7 +309,7 @@ int _nfsumount(const char *spec, const c
|
||||||
|
goto out_bad;
|
||||||
|
return nfs_call_umount(&mnt_server, &dirname);
|
||||||
|
out_bad:
|
||||||
|
- printf("%s: %s: not found or not mounted\n", progname, spec);
|
||||||
|
+ fprintf(stderr, "%s: %s: not found or not mounted\n", progname, spec);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -376,6 +378,21 @@ int nfsumount(int argc, char *argv[])
|
||||||
|
printf(_("Could not find %s in mtab\n"), spec);
|
||||||
|
|
||||||
|
if(mc) {
|
||||||
|
+ if(contains(mc->m.mnt_opts, "user") && getuid() != 0) {
|
||||||
|
+ struct passwd *pw = getpwuid(getuid());
|
||||||
|
+ if(!pw || strcmp(pw->pw_name, get_value(mc->m.mnt_opts, "user="))) {
|
||||||
|
+ fprintf(stderr, "%s: permission denied to unmount %s\n",
|
||||||
|
+ progname, spec);
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ if(!contains(mc->m.mnt_opts, "users") && getuid() != 0) {
|
||||||
|
+ fprintf(stderr, "%s: only root can unmount %s from %s\n",
|
||||||
|
+ progname, mc->m.mnt_fsname, mc->m.mnt_dir);
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
ret = _nfsumount(mc->m.mnt_fsname, mc->m.mnt_opts);
|
||||||
|
if(ret)
|
||||||
|
ret = add_mtab2(mc->m.mnt_fsname, mc->m.mnt_dir,
|
@ -1,12 +1,16 @@
|
|||||||
Summary: NFS utlilities and supporting daemons for the kernel NFS server.
|
Summary: NFS utlilities and supporting daemons for the kernel NFS server.
|
||||||
Name: nfs-utils
|
Name: nfs-utils
|
||||||
Version: 1.0.9
|
Version: 1.0.9
|
||||||
Release: 1%{?dist}
|
Release: 2%{?dist}
|
||||||
#Epoch: 1
|
|
||||||
|
|
||||||
# group all 32bit related archs
|
# group all 32bit related archs
|
||||||
%define all_32bit_archs i386 i686 athlon
|
%define all_32bit_archs i386 i686 athlon
|
||||||
|
|
||||||
|
# Create mount.nfs and umount.nfs binaries that will be
|
||||||
|
# used by the system mount command to mount (and umount)
|
||||||
|
# both NFS and NFS4 filesystems.
|
||||||
|
%define enablemount 1
|
||||||
|
|
||||||
Source0: http://www.kernel.org/pub/linux/utils/nfs/nfs-utils-1.0.9.tar.bz2
|
Source0: http://www.kernel.org/pub/linux/utils/nfs/nfs-utils-1.0.9.tar.bz2
|
||||||
Source1: ftp://nfs.sourceforge.net/pub/nfs/nfs.doc.tar.gz
|
Source1: ftp://nfs.sourceforge.net/pub/nfs/nfs.doc.tar.gz
|
||||||
|
|
||||||
@ -21,6 +25,9 @@ Patch51: nfs-utils-1.0.6-mountd.patch
|
|||||||
Patch52: nfs-utils-1.0.6-idmap.conf.patch
|
Patch52: nfs-utils-1.0.6-idmap.conf.patch
|
||||||
Patch53: nfs-utils-1.0.6-gssd_mixed_case.patch
|
Patch53: nfs-utils-1.0.6-gssd_mixed_case.patch
|
||||||
Patch54: nfs-utils-1.0.8-privports.patch
|
Patch54: nfs-utils-1.0.8-privports.patch
|
||||||
|
Patch55: nfs-utils-1.0.9-mount-options-v3.patch
|
||||||
|
Patch56: nfs-utils-1.0.9-lazy-umount.patch
|
||||||
|
Patch57: nfs-utils-1.0.9-mount-fsc.patch
|
||||||
|
|
||||||
Patch100: nfs-utils-1.0.8-compile.patch
|
Patch100: nfs-utils-1.0.8-compile.patch
|
||||||
|
|
||||||
@ -65,6 +72,9 @@ clients which are mounted on that host.
|
|||||||
%patch52 -p1
|
%patch52 -p1
|
||||||
%patch53 -p1
|
%patch53 -p1
|
||||||
%patch54 -p1
|
%patch54 -p1
|
||||||
|
%patch55 -p1
|
||||||
|
%patch56 -p1
|
||||||
|
%patch57 -p1
|
||||||
|
|
||||||
# Do the magic to get things to compile
|
# Do the magic to get things to compile
|
||||||
%patch100 -p1
|
%patch100 -p1
|
||||||
@ -73,6 +83,9 @@ clients which are mounted on that host.
|
|||||||
find . -name "*.orig" | xargs rm -f
|
find . -name "*.orig" | xargs rm -f
|
||||||
|
|
||||||
%build
|
%build
|
||||||
|
%if %{enablemount}
|
||||||
|
ENABLEMOUNT="--enable-mount"
|
||||||
|
%endif
|
||||||
|
|
||||||
%ifarch s390 s390x
|
%ifarch s390 s390x
|
||||||
PIE="-fPIE"
|
PIE="-fPIE"
|
||||||
@ -88,7 +101,8 @@ CFLAGS="`echo $RPM_OPT_FLAGS $ARCH_OPT_FLAGS $PIE`"
|
|||||||
CFLAGS="$CFLAGS" \
|
CFLAGS="$CFLAGS" \
|
||||||
CPPFLAGS="$DEFINES" \
|
CPPFLAGS="$DEFINES" \
|
||||||
LDFLAGS="-pie" \
|
LDFLAGS="-pie" \
|
||||||
--prefix=$RPM_BUILD_ROOT
|
--prefix=$RPM_BUILD_ROOT \
|
||||||
|
$ENABLEMOUNT
|
||||||
|
|
||||||
make all
|
make all
|
||||||
|
|
||||||
@ -113,6 +127,10 @@ mkdir -p $RPM_BUILD_ROOT/var/lib/nfs/rpc_pipefs
|
|||||||
touch $RPM_BUILD_ROOT/var/lib/nfs/rmtab
|
touch $RPM_BUILD_ROOT/var/lib/nfs/rmtab
|
||||||
mv $RPM_BUILD_ROOT/usr/sbin/{rpc.lockd,rpc.statd} $RPM_BUILD_ROOT/sbin
|
mv $RPM_BUILD_ROOT/usr/sbin/{rpc.lockd,rpc.statd} $RPM_BUILD_ROOT/sbin
|
||||||
|
|
||||||
|
%if %{enablemount}
|
||||||
|
mv $RPM_BUILD_ROOT/usr/sbin/{mount.*,umount.*} $RPM_BUILD_ROOT/sbin
|
||||||
|
%endif
|
||||||
|
|
||||||
mkdir -p $RPM_BUILD_ROOT/var/lib/nfs/statd
|
mkdir -p $RPM_BUILD_ROOT/var/lib/nfs/statd
|
||||||
mkdir -p $RPM_BUILD_ROOT/var/lib/nfs/v4recovery
|
mkdir -p $RPM_BUILD_ROOT/var/lib/nfs/v4recovery
|
||||||
|
|
||||||
@ -222,7 +240,20 @@ fi
|
|||||||
%{_mandir}/*/*
|
%{_mandir}/*/*
|
||||||
%config /etc/rc.d/init.d/nfslock
|
%config /etc/rc.d/init.d/nfslock
|
||||||
|
|
||||||
|
%if %{enablemount}
|
||||||
|
%attr(4755,root,root) /sbin/mount.nfs
|
||||||
|
%attr(4755,root,root) /sbin/mount.nfs4
|
||||||
|
%attr(4755,root,root) /sbin/umount.nfs
|
||||||
|
%attr(4755,root,root) /sbin/umount.nfs4
|
||||||
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Jul 28 2006 <SteveD@RedHat.com> 1.0.9-2
|
||||||
|
- Enabled the creating of mount.nfs and umount.nfs binaries
|
||||||
|
- Added mount option fixes suggested by upstream.
|
||||||
|
- Fix lazy umounts (bz 169299)
|
||||||
|
- Added -o fsc mount option.
|
||||||
|
|
||||||
* Mon Jul 24 2006 <SteveD@RedHat.com> 1.0.9-1
|
* Mon Jul 24 2006 <SteveD@RedHat.com> 1.0.9-1
|
||||||
- Updated to 1.0.9 release
|
- Updated to 1.0.9 release
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user