commit 1f7b76f6f2b74c4108eb19f2cae0b0de06cbc856
parent f4d650e35d83911be60e328fe1d591bd31d46d7f
Author: sin <sin@2f30.org>
Date: Tue, 28 Jan 2014 16:49:25 +0000
Import mknod(1) from sbase
mknod(1) is not POSIX and it is not portable so it should be
in ubase instead of sbase.
Diffstat:
M | Makefile | | | 1 | + |
A | mknod.1 | | | 40 | ++++++++++++++++++++++++++++++++++++++++ |
A | mknod.c | | | 43 | +++++++++++++++++++++++++++++++++++++++++++ |
3 files changed, 84 insertions(+), 0 deletions(-)
diff --git a/Makefile b/Makefile
@@ -29,6 +29,7 @@ SRC = \
insmod.c \
lsmod.c \
lsusb.c \
+ mknod.c \
mkswap.c \
mount.c \
mountpoint.c \
diff --git a/mknod.1 b/mknod.1
@@ -0,0 +1,40 @@
+.TH MKNOD 1 sbase\-VERSION
+.SH NAME
+mknod \- create a special device file
+
+.SH SYNOPSIS
+.B mknod
+.RB [ \-m
+.IR mode ]
+.I name
+.I type
+.I major
+.I minor
+
+.SH DESCRIPTION
+.B mknod
+Creates a special device file named
+.I name
+with major number
+.IR major ,
+and minor number
+.IR minor .
+
+.IR type
+specifies what kind of special file will be created,
+and must be one of:
+.TP
+.BR u \ or\ c
+A character device.
+.TP
+.BR b
+A block device.
+
+.SH OPTIONS
+.TP
+.B \-m "mode"
+Set the mode of the new file based on the octal value of
+.IR mode .
+
+.SH SEE ALSO
+.IR mknod (2)
diff --git a/mknod.c b/mknod.c
@@ -0,0 +1,43 @@
+/* See LICENSE file for copyright and license details. */
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include "util.h"
+
+static void
+usage(void)
+{
+ eprintf("usage: mknod [-m mode] name type major minor\n");
+}
+
+int
+main(int argc, char **argv)
+{
+ mode_t type, mode = 0644;
+ dev_t dev;
+
+ ARGBEGIN {
+ case 'm':
+ mode = estrtol(EARGF(usage()), 8);
+ break;
+ default:
+ usage();
+ } ARGEND;
+
+ if(argc != 4)
+ usage();
+
+ if(strlen(argv[1]) != 1 || !strchr("ucb", argv[1][0]))
+ eprintf("mknod: '%s': invalid type\n", argv[1]);
+ type = (argv[1][0] == 'b') ? S_IFBLK : S_IFCHR;
+
+ dev = makedev(estrtol(argv[2], 0), estrtol(argv[3], 0));
+
+ if(mknod(argv[0], type|mode, dev) == -1)
+ eprintf("mknod: '%s':", argv[0]);
+ return EXIT_SUCCESS;
+}