BusyBox has no business hard coding the number of major and minor bits for a 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/
No binary (build failed)
—
(log yok)
| @@ -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); | |
| @@ -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); | |
| @@ -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" | |
| @@ -58,11 +59,6 @@ | |
| # 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)) { | |
| @@ -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) { | |
| @@ -13,21 +13,22 @@ | |
| #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 ... */ | |