ubase

suckless linux base utils
git clone git://git.2f30.org/ubase
Log | Files | Refs | README | LICENSE

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:
MMakefile | 1+
Amknod.1 | 40++++++++++++++++++++++++++++++++++++++++
Amknod.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; +}