X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=mknod.c;h=b4d4b82a109cba977bffc206c16da96359f0c8a7;hb=4391a16c92cef744fc715cb7347b7b71fc8f312e;hp=b18394bec34116ab58041cc1d0a20746a2baaf82;hpb=cc8ed39b240180b58810784f844e253263594ac3;p=oweals%2Fbusybox.git diff --git a/mknod.c b/mknod.c index b18394bec..b4d4b82a1 100644 --- a/mknod.c +++ b/mknod.c @@ -1,24 +1,67 @@ -#include "internal.h" +/* vi: set sw=4 ts=4: */ +/* + * Mini mknod implementation for busybox + * + * Copyright (C) 1995, 1996 by Bruce Perens . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include #include -#include -#include #include #include +#include +#include +#include +#include "busybox.h" -const char mknod_usage[] = "mknod file b|c|u|p major minor\n" -"\tMake special files.\n" -"\n" -"\tb:\tMake a block (buffered) device.\n" -"\tc or u:\tMake a character (un-buffered) device.\n" -"\tp:\tMake a named pipe. Major and minor are ignored for named pipes.\n"; - -int -mknod_main(struct FileInfo * i, int argc, char * * argv) +int mknod_main(int argc, char **argv) { - mode_t mode = 0; - dev_t dev = 0; + char *thisarg; + mode_t mode = 0; + mode_t perm = 0666; + dev_t dev = 0; + + argc--; + argv++; - switch(argv[2][0]) { + /* Parse any options */ + while (argc > 1) { + if (**argv != '-') + break; + thisarg = *argv; + thisarg++; + switch (*thisarg) { + case 'm': + argc--; + argv++; + parse_mode(*argv, &perm); + umask(0); + break; + default: + show_usage(); + } + argc--; + argv++; + } + if (argc != 4 && argc != 2) { + show_usage(); + } + switch (argv[1][0]) { case 'c': case 'u': mode = S_IFCHR; @@ -28,25 +71,22 @@ mknod_main(struct FileInfo * i, int argc, char * * argv) break; case 'p': mode = S_IFIFO; + if (argc!=2) { + show_usage(); + } break; default: - usage(mknod_usage); - return 1; + show_usage(); } - if ( mode == S_IFCHR || mode == S_IFBLK ) { - dev = (atoi(argv[3]) << 8) | atoi(argv[4]); - if ( argc != 5 ) { - usage(mknod_usage); - return 1; - } + if (mode == S_IFCHR || mode == S_IFBLK) { + dev = (atoi(argv[2]) << 8) | atoi(argv[3]); } - mode |= 0666; + mode |= perm; - if ( mknod(argv[1], mode, dev) != 0 ) { - name_and_error(argv[1]); - return 1; - } - return 0; + if (mknod(argv[0], mode, dev) != 0) + perror_msg_and_die("%s", argv[0]); + return EXIT_SUCCESS; } +