Modified so that it "works" for archs other than i386... arm in particular.
[oweals/busybox.git] / coreutils / mknod.c
index 0c93df64da3483e9c191513edc95f293942965d2..432ec2b25bb9b5628f761dfcdef94da5b73c18fe 100644 (file)
@@ -3,6 +3,7 @@
  * Mini mknod implementation for busybox
  *
  * Copyright (C) 1995, 1996 by Bruce Perens <bruce@pixar.com>.
+ * Copyright (C) 1999-2002 by Erik Andersen <andersee@debian.org>
  *
  * 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
  *
  */
 
-#include "internal.h"
 #include <stdio.h>
 #include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
-
-static const char mknod_usage[] = "mknod [OPTIONS] NAME TYPE MAJOR MINOR\n\n"
-       "Create a special file (block, character, or pipe).\n\n"
-       "Options:\n"
-       "\t-m\tcreate the special file using the specified mode (default a=rw)\n\n"
-       "TYPEs include:\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";
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include "busybox.h"
 
 int mknod_main(int argc, char **argv)
 {
        char *thisarg;
        mode_t mode = 0;
        mode_t perm = 0666;
-       dev_t dev = 0;
+       dev_t dev = (dev_t) 0;
 
        argc--;
        argv++;
@@ -58,15 +52,16 @@ int mknod_main(int argc, char **argv)
                        argc--;
                        argv++;
                        parse_mode(*argv, &perm);
+                       umask(0);
                        break;
                default:
-                       usage(mknod_usage);
+                       show_usage();
                }
                argc--;
                argv++;
        }
        if (argc != 4 && argc != 2) {
-               usage(mknod_usage);
+               show_usage();
        }
        switch (argv[1][0]) {
        case 'c':
@@ -78,22 +73,21 @@ int mknod_main(int argc, char **argv)
                break;
        case 'p':
                mode = S_IFIFO;
-               if (argc!=2) {
-                       usage(mknod_usage);
+               if (argc != 2) {
+                       show_usage();
                }
                break;
        default:
-               usage(mknod_usage);
+               show_usage();
        }
 
        if (mode == S_IFCHR || mode == S_IFBLK) {
-               dev = (atoi(argv[2]) << 8) | atoi(argv[1]);
+               dev = (dev_t) ((atoi(argv[2]) << 8) | atoi(argv[3]));
        }
 
        mode |= perm;
 
        if (mknod(argv[0], mode, dev) != 0)
-               fatalError("%s: %s\n", argv[0], strerror(errno));
-       exit (TRUE);
+               perror_msg_and_die("%s", argv[0]);
+       return EXIT_SUCCESS;
 }
-