sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit 1fbe4e95eded282e20a18a773c792f2f91e6660b
parent c1c367c1bd4e7a178afa4ebe73e46c17b5cc86cb
Author: David Galos <galosd83@students.rowan.edu>
Date:   Wed,  3 Jul 2013 02:02:36 -0400

Adding mknod(1)

Diffstat:
MMakefile | 1+
Amknod.1 | 40++++++++++++++++++++++++++++++++++++++++
Amknod.c | 46++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 87 insertions(+), 0 deletions(-)

diff --git a/Makefile b/Makefile @@ -47,6 +47,7 @@ SRC = \ mc.c \ mkdir.c \ mkfifo.c \ + mknod.c \ mv.c \ nice.c \ nl.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,46 @@ +#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; + mode_t types['u'+1]; + dev_t dev; + + types['u'] = types['c'] = S_IFCHR; + types['b'] = S_IFBLK; + + 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 = types[(unsigned)argv[1][0]]; + + dev = makedev(estrtol(argv[2], 0), estrtol(argv[3], 0)); + + if(mknod(argv[0], type|mode, dev) == -1) + eprintf("mknod: '%s':", argv[0]); + return 0; +}