BusyBox has no business hard coding the number of major and minor bits for a
authorEric Andersen <andersen@codepoet.org>
Mon, 26 Jul 2004 09:11:12 +0000 (09:11 -0000)
committerEric Andersen <andersen@codepoet.org>
Mon, 26 Jul 2004 09:11:12 +0000 (09:11 -0000)
dev_t.  This is especially important now that the user space concept of a dev_t
and the kernel concept of a dev_t are divergant.  The only bit of user space
allowed to know the number of major and minor bits is include/sys/sysmacros.h
(i.e. part of libc).  When used with a current C library and a 2.6.x kernel,
this fix should allow BusyBox to support wide device major/minor numbers.
 -Erik

archival/libunarchive/get_header_cpio.c
archival/libunarchive/get_header_tar.c
archival/tar.c
coreutils/ls.c
miscutils/makedevs.c

index f72c376342002c2d3e4fb85962138da09838e362..11925c4e3e2b648aeab22734af6c1f50ced79328 100644 (file)
@@ -18,6 +18,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <sys/sysmacros.h>     /* major() and minor() */
 #include "unarchive.h"
 #include "libbb.h"
 
@@ -143,7 +144,7 @@ extern char get_header_cpio(archive_handle_t *archive_handle)
                        }
                }
        }
-       file_header->device = (major << 8) | minor;
+       file_header->device = makedev(major, minor);
 
        if (archive_handle->filter(archive_handle) == EXIT_SUCCESS) {
                archive_handle->action_data(archive_handle);
index 33f19c60ad453ec00a1f6902ca21d103a65800c4..1ad9ac5e50aff3abfd5689344c65a2914af9141e 100644 (file)
@@ -121,8 +121,8 @@ extern char get_header_tar(archive_handle_t *archive_handle)
        file_header->mtime = strtol(tar.formated.mtime, NULL, 8);
        file_header->link_name = (tar.formated.linkname[0] != '\0') ?
            bb_xstrdup(tar.formated.linkname) : NULL;
-       file_header->device = (dev_t) ((strtol(tar.formated.devmajor, NULL, 8) << 8) +
-                                strtol(tar.formated.devminor, NULL, 8));
+       file_header->device = makedev(strtol(tar.formated.devmajor, NULL, 8),
+               strtol(tar.formated.devminor, NULL, 8));
 
        /* Set bits 0-11 of the files mode */
        file_header->mode = 07777 & strtol(tar.formated.mode, NULL, 8);
index 2de6454e71751286051ebea7f8c0c51254d634a5..689dd14249056df93e39ab02b287cf8c357069bf 100644 (file)
@@ -49,6 +49,7 @@
 #include <signal.h>
 #include <sys/wait.h>
 #include <sys/socket.h>
+#include <sys/sysmacros.h>     /* major() and minor() */
 #include "unarchive.h"
 #include "busybox.h"
 
 # define TAR_MAGIC          "ustar"    /* ustar and a null */
 # define TAR_VERSION        "  "       /* Be compatable with GNU tar format */
 
-# ifndef MAJOR
-#  define MAJOR(dev) (((dev)>>8)&0xff)
-#  define MINOR(dev) ((dev)&0xff)
-# endif
-
 static const int TAR_BLOCK_SIZE = 512;
 static const int TAR_MAGIC_LEN = 6;
 static const int TAR_VERSION_LEN = 2;
@@ -262,15 +258,15 @@ static inline int writeTarHeader(struct TarBallInfo *tbInfo,
        } else if (S_ISCHR(statbuf->st_mode)) {
                header.typeflag = CHRTYPE;
                putOctal(header.devmajor, sizeof(header.devmajor),
-                                MAJOR(statbuf->st_rdev));
+                                major(statbuf->st_rdev));
                putOctal(header.devminor, sizeof(header.devminor),
-                                MINOR(statbuf->st_rdev));
+                                minor(statbuf->st_rdev));
        } else if (S_ISBLK(statbuf->st_mode)) {
                header.typeflag = BLKTYPE;
                putOctal(header.devmajor, sizeof(header.devmajor),
-                                MAJOR(statbuf->st_rdev));
+                                major(statbuf->st_rdev));
                putOctal(header.devminor, sizeof(header.devminor),
-                                MINOR(statbuf->st_rdev));
+                                minor(statbuf->st_rdev));
        } else if (S_ISFIFO(statbuf->st_mode)) {
                header.typeflag = FIFOTYPE;
        } else if (S_ISREG(statbuf->st_mode)) {
index 5fc60a347f57fd94f5bc358951899d70f452f005..a87f0ec2d609c3ced0658527f8283cd0cacf2e57 100644 (file)
@@ -61,6 +61,7 @@ enum {
 #include <signal.h>
 #include <termios.h>
 #include <sys/ioctl.h>
+#include <sys/sysmacros.h>     /* major() and minor() */
 #include "busybox.h"
 #ifdef CONFIG_SELINUX
 #include <fs_secure.h>
@@ -72,11 +73,6 @@ enum {
 #include <time.h>
 #endif
 
-#ifndef MAJOR
-#define MAJOR(dev) (((dev)>>8)&0xff)
-#define MINOR(dev) ((dev)&0xff)
-#endif
-
 /* what is the overall style of the listing */
 #define STYLE_AUTO      (0)
 #define STYLE_COLUMNS   (1U<<21)       /* fill columns */
@@ -700,8 +696,8 @@ static int list_single(struct dnode *dn)
                case LIST_SIZE:
                case LIST_DEV:
                        if (S_ISBLK(dn->dstat.st_mode) || S_ISCHR(dn->dstat.st_mode)) {
-                               column += printf("%4d, %3d ", (int) MAJOR(dn->dstat.st_rdev),
-                                          (int) MINOR(dn->dstat.st_rdev));
+                               column += printf("%4d, %3d ", (int) major(dn->dstat.st_rdev),
+                                          (int) minor(dn->dstat.st_rdev));
                        } else {
 #ifdef CONFIG_FEATURE_HUMAN_READABLE
                                if (all_fmt & LS_DISP_HR) {
index 45498bb1d0ece40bee018c87b1d990cf9ea1ffc0..e4233330a2b6b80da2a33a8ba9f3378aed743e49 100644 (file)
 #include <fcntl.h>
 #include <unistd.h>
 #include <sys/types.h>
+#include <sys/sysmacros.h>     /* major() and minor() */
 #include "busybox.h"
 
 int makedevs_main(int argc, char **argv)
 {
        mode_t mode;
        char *basedev, *type, *nodname, buf[255];
-       int major, Sminor, S, E;
+       int Smajor, Sminor, S, E;
 
        if (argc < 7 || *argv[1]=='-')
                bb_show_usage();
 
        basedev = argv[1];
        type = argv[2];
-       major = atoi(argv[3]) << 8;  /* correcting param to mknod() */
-       Sminor = atoi(argv[4]);
+       Smajor = major(atoi(argv[3]));
+       Sminor = minor(atoi(argv[4]));
        S = atoi(argv[5]);
        E = atoi(argv[6]);
        nodname = argc == 8 ? basedev : buf;
@@ -57,7 +58,7 @@ int makedevs_main(int argc, char **argv)
 
        /* if mode != S_IFCHR and != S_IFBLK third param in mknod() ignored */
 
-               if (mknod(nodname, mode, major | Sminor))
+               if (mknod(nodname, mode, Smajor | Sminor))
                        bb_error_msg("Failed to create: %s", nodname);
 
                if (nodname == basedev) /* ex. /dev/hda - to /dev/hda1 ... */