X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=mkswap.c;h=5b908daa34a29c147b397cca8d964dd76a7a6f07;hb=537d1652164635c72ca6ef2679be33a0a7a49265;hp=130d24162cc003b4b753c99df07792433b03066f;hpb=e49d5ecbbe51718fa925b6890a735e5937cc2aa2;p=oweals%2Fbusybox.git diff --git a/mkswap.c b/mkswap.c index 130d24162..5b908daa3 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,9 +87,9 @@ 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\n", pagesize); #endif - signature_page = (int *) malloc(pagesize); + signature_page = (int *) xmalloc(pagesize); memset(signature_page, 0, pagesize); p = (struct swap_header_v1 *) signature_page; } @@ -200,19 +173,19 @@ static int bit_test_and_clear(unsigned int *addr, unsigned int nr) } -void die(const char *str) +static void die(const char *str) { - fprintf(stderr, "%s: %s\n", program_name, str); - exit(FALSE); + error_msg("%s\n", str); + exit(EXIT_FAILURE); } -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); @@ -224,15 +197,13 @@ void page_bad(int page) badpages++; } -void check_blocks(void) +static void check_blocks(void) { unsigned int current_page; int do_seek = 1; char *buffer; - buffer = malloc(pagesize); - if (!buffer) - die("Out of memory"); + buffer = xmalloc(pagesize); current_page = 0; while (current_page < PAGES) { if (!check) { @@ -289,11 +260,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; @@ -315,9 +283,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) { @@ -348,26 +313,22 @@ int mkswap_main(int argc, char **argv) } } if (!device_name) { - fprintf(stderr, - "%s: error: Nowhere to set up swap on?\n", program_name); + error_msg("error: Nowhere to set up swap on?\n"); usage(mkswap_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\n", 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; @@ -375,14 +336,12 @@ 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); + error_msg("error: unknown version %d\n", version); usage(mkswap_usage); } if (PAGES < 10) { - fprintf(stderr, - "%s: error: swap area needs to be at least %ldkB\n", - program_name, (long) (10 * pagesize / 1024)); + error_msg("error: swap area needs to be at least %ldkB\n", + (long) (10 * pagesize / 1024)); usage(mkswap_usage); } #if 0 @@ -390,7 +349,7 @@ int mkswap_main(int argc, char **argv) #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; @@ -400,15 +359,13 @@ 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\n", + 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) @@ -427,12 +384,11 @@ int mkswap_main(int argc, char **argv) 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.\n", device_name); + return EXIT_FAILURE; } } } @@ -468,5 +424,5 @@ the -f option to force it.\n", program_name, device_name); */ if (fsync(DEV)) die("fsync failed"); - exit(TRUE); + return EXIT_SUCCESS; }