X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=mkswap.c;h=48637e88984081311bd7acabe0ecc091af09bf46;hb=ca0f458adaa46e447b809d96895761adb5ae660f;hp=17866a735324522ab7d439906d8fa2b858860809;hpb=0d068a20676144e9fd6796cc77764c420d785394;p=oweals%2Fbusybox.git diff --git a/mkswap.c b/mkswap.c index 17866a735..48637e889 100644 --- a/mkswap.c +++ b/mkswap.c @@ -35,7 +35,7 @@ * */ -#include "internal.h" +#include "busybox.h" #include #include #include @@ -43,30 +43,17 @@ #include #include /* for _IO */ #include -#include #include /* for PAGE_SIZE and PAGE_SHIFT */ /* we also get PAGE_SIZE via getpagesize() */ - -static const char mkswap_usage[] = - "mkswap [-c] [-v0|-v1] device [block-count]\n\n" - "Prepare a disk partition to be used as a swap partition.\n\n" - "Options:\n" "\t-c\t\tCheck for read-ability.\n" - "\t-v0\t\tMake version 0 swap [max 128 Megs].\n" - "\t-v1\t\tMake version 1 swap [big!] (default for kernels > 2.1.117).\n" - - "\tblock-count\tNumber of block to use (default is entire partition).\n"; - - #ifndef _IO /* pre-1.3.45 */ -#define BLKGETSIZE 0x1260 +static const int BLKGETSIZE = 0x1260; #else /* same on i386, m68k, arm; different on alpha, mips, sparc, ppc */ #define BLKGETSIZE _IO(0x12,96) #endif -static char *program_name = "mkswap"; static char *device_name = NULL; static int DEV = -1; static long PAGES = 0; @@ -76,20 +63,6 @@ static int version = -1; #define MAKE_VERSION(p,q,r) (65536*(p) + 256*(q) + (r)) -static int linux_version_code(void) -{ - struct utsname my_utsname; - int p, q, r; - - if (uname(&my_utsname) == 0) { - p = atoi(strtok(my_utsname.release, ".")); - q = atoi(strtok(NULL, ".")); - r = atoi(strtok(NULL, ".")); - return MAKE_VERSION(p, q, r); - } - return 0; -} - /* * The definition of the union swap_header uses the constant PAGE_SIZE. * Unfortunately, on some architectures this depends on the hardware model, @@ -114,7 +87,7 @@ static void init_signature_page() #ifdef PAGE_SIZE if (pagesize != PAGE_SIZE) - fprintf(stderr, "Assuming pages of size %d\n", pagesize); + error_msg("Assuming pages of size %d", pagesize); #endif signature_page = (int *) xmalloc(pagesize); memset(signature_page, 0, pagesize); @@ -200,31 +173,25 @@ static int bit_test_and_clear(unsigned int *addr, unsigned int nr) } -void die(const char *str) -{ - fprintf(stderr, "%s: %s\n", program_name, str); - exit(FALSE); -} - -void page_ok(int page) +static void page_ok(int page) { if (version == 0) bit_set(signature_page, page); } -void page_bad(int page) +static void page_bad(int page) { if (version == 0) bit_test_and_clear(signature_page, page); else { if (badpages == MAX_BADPAGES) - die("too many bad pages"); + error_msg_and_die("too many bad pages"); p->badpages[badpages] = page; } badpages++; } -void check_blocks(void) +static void check_blocks(void) { unsigned int current_page; int do_seek = 1; @@ -239,7 +206,7 @@ void check_blocks(void) } if (do_seek && lseek(DEV, current_page * pagesize, SEEK_SET) != current_page * pagesize) - die("seek failed in check_blocks"); + error_msg_and_die("seek failed in check_blocks"); if ((do_seek = (pagesize != read(DEV, buffer, pagesize)))) { page_bad(current_page++); continue; @@ -287,11 +254,8 @@ static long get_size(const char *file) int fd; long size; - fd = open(file, O_RDONLY); - if (fd < 0) { - perror(file); - exit(1); - } + if ((fd = open(file, O_RDONLY)) < 0) + perror_msg_and_die("%s", file); if (ioctl(fd, BLKGETSIZE, &size) >= 0) { int sectors_per_page = pagesize / 512; @@ -313,9 +277,6 @@ int mkswap_main(int argc, char **argv) int offset; int force = 0; - if (argc && *argv) - program_name = *argv; - init_signature_page(); /* get pagesize */ while (argc-- > 1) { @@ -326,7 +287,7 @@ int mkswap_main(int argc, char **argv) PAGES = strtol(argv[0], &tmp, 0) / blocks_per_page; if (*tmp) - usage(mkswap_usage); + show_usage(); } else device_name = argv[0]; } else { @@ -341,31 +302,27 @@ int mkswap_main(int argc, char **argv) version = atoi(argv[0] + 2); break; default: - usage(mkswap_usage); + show_usage(); } } } if (!device_name) { - fprintf(stderr, - "%s: error: Nowhere to set up swap on?\n", program_name); - usage(mkswap_usage); + error_msg("error: Nowhere to set up swap on?"); + show_usage(); } sz = get_size(device_name); if (!PAGES) { PAGES = sz; } else if (PAGES > sz && !force) { - fprintf(stderr, - "%s: error: " - "size %ld is larger than device size %d\n", - program_name, + error_msg("error: size %ld is larger than device size %d", PAGES * (pagesize / 1024), sz * (pagesize / 1024)); - exit(FALSE); + return EXIT_FAILURE; } if (version == -1) { if (PAGES <= V0_MAX_PAGES) version = 0; - else if (linux_version_code() < MAKE_VERSION(2, 1, 117)) + else if (get_kernel_revision() < MAKE_VERSION(2, 1, 117)) version = 0; else if (pagesize < 2048) version = 0; @@ -373,22 +330,20 @@ int mkswap_main(int argc, char **argv) version = 1; } if (version != 0 && version != 1) { - fprintf(stderr, "%s: error: unknown version %d\n", - program_name, version); - usage(mkswap_usage); + error_msg("error: unknown version %d", version); + show_usage(); } if (PAGES < 10) { - fprintf(stderr, - "%s: error: swap area needs to be at least %ldkB\n", - program_name, (long) (10 * pagesize / 1024)); - usage(mkswap_usage); + error_msg("error: swap area needs to be at least %ldkB", + (long) (10 * pagesize / 1024)); + show_usage(); } #if 0 maxpages = ((version == 0) ? V0_MAX_PAGES : V1_MAX_PAGES); #else if (!version) maxpages = V0_MAX_PAGES; - else if (linux_version_code() >= MAKE_VERSION(2, 2, 1)) + else if (get_kernel_revision() >= MAKE_VERSION(2, 2, 1)) maxpages = V1_MAX_PAGES; else { maxpages = V1_OLD_MAX_PAGES; @@ -398,19 +353,17 @@ int mkswap_main(int argc, char **argv) #endif if (PAGES > maxpages) { PAGES = maxpages; - fprintf(stderr, "%s: warning: truncating swap area to %ldkB\n", - program_name, PAGES * pagesize / 1024); + error_msg("warning: truncating swap area to %ldkB", + PAGES * pagesize / 1024); } DEV = open(device_name, O_RDWR); - if (DEV < 0 || fstat(DEV, &statbuf) < 0) { - perror(device_name); - exit(FALSE); - } + if (DEV < 0 || fstat(DEV, &statbuf) < 0) + perror_msg_and_die("%s", device_name); if (!S_ISBLK(statbuf.st_mode)) check = 0; else if (statbuf.st_rdev == 0x0300 || statbuf.st_rdev == 0x0340) - die("Will not try to make swapdevice on '%s'"); + error_msg_and_die("Will not try to make swapdevice on '%s'", device_name); #ifdef __sparc__ if (!force && version == 0) { @@ -419,18 +372,17 @@ int mkswap_main(int argc, char **argv) unsigned short *q, sum; if (read(DEV, buffer, 512) != 512) - die("fatal: first page unreadable"); + error_msg_and_die("fatal: first page unreadable"); if (buffer[508] == 0xDA && buffer[509] == 0xBE) { q = (unsigned short *) (buffer + 510); for (sum = 0; q >= (unsigned short *) buffer;) sum ^= *q--; if (!sum) { - fprintf(stderr, "\ -%s: Device '%s' contains a valid Sun disklabel.\n\ -This probably means creating v0 swap would destroy your partition table\n\ -No swap created. If you really want to create swap v0 on that device, use\n\ -the -f option to force it.\n", program_name, device_name); - exit(FALSE); + error_msg("Device '%s' contains a valid Sun disklabel.\n" +"This probably means creating v0 swap would destroy your partition table\n" +"No swap created. If you really want to create swap v0 on that device, use\n" +"the -f option to force it.", device_name); + return EXIT_FAILURE; } } } @@ -439,7 +391,7 @@ the -f option to force it.\n", program_name, device_name); if (version == 0 || check) check_blocks(); if (version == 0 && !bit_test_and_clear(signature_page, 0)) - die("fatal: first page unreadable"); + error_msg_and_die("fatal: first page unreadable"); if (version == 1) { p->version = version; p->last_page = PAGES - 1; @@ -448,23 +400,23 @@ the -f option to force it.\n", program_name, device_name); goodpages = PAGES - badpages - 1; if (goodpages <= 0) - die("Unable to set up swap-space: unreadable"); + error_msg_and_die("Unable to set up swap-space: unreadable"); printf("Setting up swapspace version %d, size = %ld bytes\n", version, (long) (goodpages * pagesize)); write_signature((version == 0) ? "SWAP-SPACE" : "SWAPSPACE2"); offset = ((version == 0) ? 0 : 1024); if (lseek(DEV, offset, SEEK_SET) != offset) - die("unable to rewind swap-device"); + error_msg_and_die("unable to rewind swap-device"); if (write(DEV, (char *) signature_page + offset, pagesize - offset) != pagesize - offset) - die("unable to write signature page"); + error_msg_and_die("unable to write signature page"); /* * A subsequent swapon() will fail if the signature * is not actually on disk. (This is a kernel bug.) */ if (fsync(DEV)) - die("fsync failed"); - exit(TRUE); + error_msg_and_die("fsync failed"); + return EXIT_SUCCESS; }