aboutsummaryrefslogtreecommitdiff
path: root/sbin/mount_cd9660
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/mount_cd9660')
-rw-r--r--sbin/mount_cd9660/mount_cd9660.837
-rw-r--r--sbin/mount_cd9660/mount_cd9660.c79
2 files changed, 112 insertions, 4 deletions
diff --git a/sbin/mount_cd9660/mount_cd9660.8 b/sbin/mount_cd9660/mount_cd9660.8
index cd6f7a19f6eb..d2cdd2f3ef20 100644
--- a/sbin/mount_cd9660/mount_cd9660.8
+++ b/sbin/mount_cd9660/mount_cd9660.8
@@ -29,7 +29,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd August 11, 2018
+.Dd January 2, 2024
.Dt MOUNT_CD9660 8
.Os
.Sh NAME
@@ -39,8 +39,12 @@
.Nm
.Op Fl begjrv
.Op Fl C Ar charset
+.Op Fl G Ar gid
+.Op Fl m Ar mask
+.Op Fl M Ar mask
.Op Fl o Ar options
.Op Fl s Ar startsector
+.Op Fl U Ar uid
.Ar special node
.Sh DESCRIPTION
The
@@ -66,6 +70,37 @@ Do not strip version numbers on files.
only the last one will be listed.)
In either case, files may be opened without explicitly stating a
version number.
+.It Fl G Ar group
+Set the group of the files in the file system to
+.Ar group .
+The default gid on non-Rockridge volumes is zero.
+.It Fl U Ar user
+Set the owner of the files in the file system to
+.Ar user .
+The default uid on non-Rockridge volumes is zero.
+.It Fl m Ar mask
+Specify the maximum file permissions for files
+in the file system.
+(For example, a
+.Ar mask
+of
+.Li 755
+specifies that, by default, the owner should have
+read, write, and execute permissions for files, but
+others should only have read and execute permissions).
+See
+.Xr chmod 1
+for more information about octal file modes.
+Only the nine low-order bits of
+.Ar mask
+are used.
+The default
+.Ar mask
+on non-Rockridge volumes is 755.
+.It Fl M Ar mask
+Specify the maximum file permissions for directories
+in the file system.
+See the previous option's description for details.
.It Fl j
Do not use any Joliet extensions included in the file system.
.It Fl o
diff --git a/sbin/mount_cd9660/mount_cd9660.c b/sbin/mount_cd9660/mount_cd9660.c
index ab6da7271c17..d8d64eb5a656 100644
--- a/sbin/mount_cd9660/mount_cd9660.c
+++ b/sbin/mount_cd9660/mount_cd9660.c
@@ -44,8 +44,11 @@
#include <arpa/inet.h>
+#include <ctype.h>
#include <err.h>
#include <errno.h>
+#include <grp.h>
+#include <pwd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -60,6 +63,9 @@ static struct mntopt mopts[] = {
MOPT_END
};
+static gid_t a_gid(const char *);
+static uid_t a_uid(const char *);
+static mode_t a_mask(const char *);
static int get_ssector(const char *dev);
static int set_charset(struct iovec **, int *iovlen, const char *);
void usage(void);
@@ -80,7 +86,7 @@ main(int argc, char **argv)
mntflags = verbose = 0;
ssector = -1;
- while ((ch = getopt(argc, argv, "begjo:rs:vC:")) != -1)
+ while ((ch = getopt(argc, argv, "begG:jm:M:o:rs:U:vC:")) != -1)
switch (ch) {
case 'b':
build_iovec(&iov, &iovlen, "brokenjoliet", NULL, (size_t)-1);
@@ -91,6 +97,15 @@ main(int argc, char **argv)
case 'g':
build_iovec(&iov, &iovlen, "gens", NULL, (size_t)-1);
break;
+ case 'G':
+ build_iovec_argf(&iov, &iovlen, "gid", "%d", a_gid(optarg));
+ break;
+ case 'm':
+ build_iovec_argf(&iov, &iovlen, "mask", "%u", a_mask(optarg));
+ break;
+ case 'M':
+ build_iovec_argf(&iov, &iovlen, "dirmask", "%u", a_mask(optarg));
+ break;
case 'j':
build_iovec(&iov, &iovlen, "nojoliet", NULL, (size_t)-1);
break;
@@ -110,6 +125,9 @@ main(int argc, char **argv)
case 's':
ssector = atoi(optarg);
break;
+ case 'U':
+ build_iovec_argf(&iov, &iovlen, "uid", "%d", a_uid(optarg));
+ break;
case 'v':
verbose++;
break;
@@ -173,8 +191,8 @@ void
usage(void)
{
(void)fprintf(stderr,
-"usage: mount_cd9660 [-begjrv] [-C charset] [-o options] [-s startsector]\n"
-" special node\n");
+"usage: mount_cd9660 [-begjrv] [-C charset] [-G gid] [-m mask] [-M mask]\n"
+" [-o options] [-U uid] [-s startsector] special node\n");
exit(EX_USAGE);
}
@@ -254,3 +272,58 @@ set_charset(struct iovec **iov, int *iovlen, const char *localcs)
return (0);
}
+
+static gid_t
+a_gid(const char *s)
+{
+ struct group *gr;
+ const char *gname;
+ gid_t gid;
+
+ if ((gr = getgrnam(s)) != NULL)
+ gid = gr->gr_gid;
+ else {
+ for (gname = s; *s && isdigit(*s); ++s);
+ if (!*s)
+ gid = atoi(gname);
+ else
+ errx(EX_NOUSER, "unknown group id: %s", gname);
+ }
+ return (gid);
+}
+
+static uid_t
+a_uid(const char *s)
+{
+ struct passwd *pw;
+ const char *uname;
+ uid_t uid;
+
+ if ((pw = getpwnam(s)) != NULL)
+ uid = pw->pw_uid;
+ else {
+ for (uname = s; *s && isdigit(*s); ++s);
+ if (!*s)
+ uid = atoi(uname);
+ else
+ errx(EX_NOUSER, "unknown user id: %s", uname);
+ }
+ return (uid);
+}
+
+static mode_t
+a_mask(const char *s)
+{
+ int done, rv;
+ char *ep;
+
+ done = 0;
+ rv = -1;
+ if (*s >= '0' && *s <= '7') {
+ done = 1;
+ rv = strtol(optarg, &ep, 8);
+ }
+ if (!done || rv < 0 || *ep)
+ errx(EX_USAGE, "invalid file mode: %s", s);
+ return (rv);
+}