From f614e0ccf60b84f4cdbf716419d9e8b163eb11f9 Mon Sep 17 00:00:00 2001 From: obrien Date: Thu, 6 Jan 2000 05:20:14 +0000 Subject: Add chown(8)-like functionality. This will allow us to not use chown(8) in MAKEDEV(8) -- removing the need of having /usr mounted. --- sbin/mknod/mknod.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 5 deletions(-) (limited to 'sbin/mknod/mknod.c') diff --git a/sbin/mknod/mknod.c b/sbin/mknod/mknod.c index 822d5f2..98c0612 100644 --- a/sbin/mknod/mknod.c +++ b/sbin/mknod/mknod.c @@ -56,26 +56,75 @@ static const char rcsid[] = #include #include #include +#include +#include +#include static void usage() { - (void)fprintf(stderr, "usage: mknod name [b | c] major minor\n"); + + (void)fprintf(stderr, + "usage: mknod name [b | c] major minor [owner:group]\n"); exit(1); } +static u_long +id(name, type) + char *name, *type; +{ + u_long val; + char *ep; + + /* + * XXX + * We know that uid_t's and gid_t's are unsigned longs. + */ + errno = 0; + val = strtoul(name, &ep, 10); + if (errno) + err(1, "%s", name); + if (*ep != '\0') + errx(1, "%s: illegal %s name", name, type); + return (val); +} + +static gid_t +a_gid(s) + char *s; +{ + struct group *gr; + + if (*s == '\0') /* Argument was "uid[:.]". */ + errx(1, "group must be specified when the owner is"); + return ((gr = getgrnam(s)) == NULL) ? id(s, "group") : gr->gr_gid; +} + +static uid_t +a_uid(s) + char *s; +{ + struct passwd *pw; + + if (*s == '\0') /* Argument was "[:.]gid". */ + errx(1, "owner must be specified when the group is"); + return ((pw = getpwnam(s)) == NULL) ? id(s, "user") : pw->pw_uid; +} + int main(argc, argv) int argc; char **argv; { + int range_error; + uid_t uid; + gid_t gid; + mode_t mode; dev_t dev; - char *endp; + char *cp, *endp; long mymajor, myminor; - mode_t mode; - int range_error; - if (argc != 5) + if (argc != 5 && argc != 6) usage(); mode = 0666; @@ -101,7 +150,21 @@ main(argc, argv) minor(dev) != (u_int) myminor) errx(1, "major or minor number too large"); + uid = gid = -1; + if (6 == argc) { + /* have owner:group */ + if ((cp = strchr(argv[5], ':')) != NULL) { + *cp++ = '\0'; + gid = a_gid(cp); + } else + usage(); + uid = a_uid(argv[5]); + } + if (mknod(argv[1], mode, dev) != 0) err(1, "%s", argv[1]); + if (6 == argc) + if (chown(argv[1], uid, gid)) + err(1, "setting ownership on %s", argv[1]); exit(0); } -- cgit v1.1