Add mount option grpid (sr #108432)

This commit is contained in:
wbaumann
2014-04-13 10:11:26 +00:00
parent dc397cc58a
commit aebcb3c26f
8 changed files with 357 additions and 245 deletions

View File

@ -193,6 +193,10 @@ static gid_t default_gid;
static mode_t default_file_mode;
static mode_t default_dir_mode;
/* New files get the group id of the directory in which they are created
if this variable is set to 1. */
static int grpid;
/* Directory for cached files and directories. */
static char *cache_dir;
@ -589,6 +593,7 @@ dav_init_cache(const dav_args *args, const char *mpoint)
default_file_mode = args->file_mode;
default_dir_mode = args->dir_mode;
grpid = args->grpid;
table_size = args->table_size;
table = xcalloc(table_size, sizeof(*table));
@ -901,7 +906,11 @@ dav_create(dav_node **nodep, dav_node *parent, const char *name, uid_t uid,
(*nodep)->path = path;
(*nodep)->name = xstrdup(name);
(*nodep)->uid = uid;
(*nodep)->gid = pw->pw_gid;
if (grpid && parent->gid != 0) {
(*nodep)->gid = parent->gid;
} else {
(*nodep)->gid = pw->pw_gid;
}
int ret = create_cache_file(*nodep);
if (!ret)
@ -1026,7 +1035,11 @@ dav_mkdir(dav_node **nodep, dav_node *parent, const char *name, uid_t uid,
(*nodep)->path = path;
(*nodep)->name = xstrdup(name);
(*nodep)->uid = uid;
(*nodep)->gid = pw->pw_gid;
if (grpid && parent->gid != 0) {
(*nodep)->gid = parent->gid;
} else {
(*nodep)->gid = pw->pw_gid;
}
(*nodep)->smtime = (*nodep)->mtime;
(*nodep)->utime = (*nodep)->mtime;
delete_cache_file(parent);
@ -1514,6 +1527,9 @@ add_node(dav_node *parent, dav_props *props)
node->remote_exists = 1;
}
if (grpid && parent->gid != 0)
node->gid = parent->gid;
parent->mtime = node->mtime;
parent->ctime = node->mtime;

View File

@ -107,6 +107,10 @@
/* The device directory. */
#define DAV_DEV_DIR "/dev"
/* Whether new files will automatically have the group id of the parent
directory. */
#define DAV_GRPID 0
/* By default add option "_netdev" to mtab entry.
May be overridden by command line or fstab. */
#define DAV_NETDEV 1

View File

@ -746,7 +746,7 @@ check_fstab(const dav_args *args)
error(EXIT_FAILURE, 0,
_("neither option `user' nor option `users' set in %s"),
_PATH_MNTTAB);
if (args->mopts != n_args->mopts)
if (args->mopts != n_args->mopts || args->grpid != n_args->grpid)
error(EXIT_FAILURE, 0, _("different mount options in %s"),
_PATH_MNTTAB);
if (args->fsuid != n_args->fsuid)
@ -1210,8 +1210,9 @@ write_mtab_entry(const dav_args *args)
if (args->use_utab) {
utab_line = xasprintf("SRC=%s TARGET=%s ROOT=/ "
"OPTS=uid=%i,gid=%i%s%s,helper=%s\n",
"OPTS=uid=%i,gid=%i%s%s%s,helper=%s\n",
url, mpoint, args->fsuid, args->fsgid,
(args->grpid) ? ",grpid" : "",
(!args->privileged) ? ",user=" : "",
(!args->privileged) ? args->uid_name : "",
DAV_FS_TYPE);
@ -1223,11 +1224,12 @@ write_mtab_entry(const dav_args *args)
mntent.mnt_fsname = url;
mntent.mnt_dir = mpoint;
mntent.mnt_type = DAV_FS_TYPE;
mntent.mnt_opts = xasprintf("%s%s%s%s%s,uid=%i,gid=%i%s%s",
mntent.mnt_opts = xasprintf("%s%s%s%s%s%s,uid=%i,gid=%i%s%s",
(args->mopts & MS_RDONLY) ? "ro" : "rw",
(args->mopts & MS_NOSUID) ? ",nosuid" : "",
(args->mopts & MS_NOEXEC) ? ",noexec" : "",
(args->mopts & MS_NODEV) ? ",nodev" : "",
(args->grpid) ? ",grpid" : "",
(args->netdev) ? ",_netdev" : "",
args->fsuid, args->fsgid,
(!args->privileged) ? ",user=" : "",
@ -1500,6 +1502,8 @@ get_options(dav_args *args, char *option)
USERS,
NETDEV,
NONETDEV,
GRPID,
NOGRPID,
RW,
RO,
SUID,
@ -1527,6 +1531,8 @@ get_options(dav_args *args, char *option)
[USERS] = "users",
[NETDEV] = "_netdev",
[NONETDEV] = "no_netdev",
[GRPID] = "grpid",
[NOGRPID] = "nogrpid",
[RW] = "rw",
[RO] = "ro",
[SUID] = "suid",
@ -1605,6 +1611,12 @@ get_options(dav_args *args, char *option)
case NONETDEV:
args->netdev = 0;
break;
case GRPID:
args->grpid = 1;
break;
case NOGRPID:
args->grpid = 0;
break;
case RW:
args->mopts &= ~MS_RDONLY;
break;
@ -1658,6 +1670,7 @@ new_args(void)
dav_args *args = (dav_args *) xcalloc(1, sizeof(dav_args));
args->netdev = DAV_NETDEV;
args->grpid = DAV_GRPID;
args->mopts = DAV_MOPTS;
args->buf_size = DAV_FUSE_BUF_SIZE;
@ -1715,6 +1728,8 @@ log_dbg_config(dav_args *args)
" user: %i", args->user);
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG),
" netdev: %i", args->netdev);
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG),
" grpid: %i", args->grpid);
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG),
" mopts: %#lx", args->mopts);
syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_DEBUG),
@ -2550,6 +2565,8 @@ usage(void)
" rw : mount read-write\n"
" [no]exec : (don't) allow execution of binaries\n"
" [no]suid : (don't) allow suid and sgid bits to take effect\n"
" [no]grpid : new files (don't) get the group id of the directory\n"
" in which they are created.\n"
" [no]_netdev : (no) network connection needed\n"));
}

View File

@ -49,6 +49,7 @@ typedef struct {
/* Mount options */
int user; /* Command line */
int users; /* Command line */
int grpid; /* Command line */
int netdev; /* Command line */
unsigned long int mopts; /* Command line */
int use_utab;