Add mount option grpid (sr #108432)
This commit is contained in:
20
src/cache.c
20
src/cache.c
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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"));
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user