this applet needlessly big! TODO: bb_getopt_ulflags()
[oweals/busybox.git] / util-linux / mkswap.c
index 5b908daa34a29c147b397cca8d964dd76a7a6f07..1fc648f3af0387d1a6e5719baefcba405f39f925 100644 (file)
  * - added Native Language Support
  *
  *  from util-linux -- adapted for busybox by
  * - added Native Language Support
  *
  *  from util-linux -- adapted for busybox by
- *  Erik Andersen <andersee@debian.org>. I ripped out Native Language
+ *  Erik Andersen <andersen@codepoet.org>. I ripped out Native Language
  *  Support, made some stuff smaller, and fitted for life in busybox.
  *
  */
 
  *  Support, made some stuff smaller, and fitted for life in busybox.
  *
  */
 
-#include "busybox.h"
 #include <stdio.h>
 #include <unistd.h>
 #include <string.h>
 #include <stdio.h>
 #include <unistd.h>
 #include <string.h>
@@ -45,6 +44,7 @@
 #include <sys/utsname.h>
 #include <asm/page.h>                  /* for PAGE_SIZE and PAGE_SHIFT */
                                /* we also get PAGE_SIZE via getpagesize() */
 #include <sys/utsname.h>
 #include <asm/page.h>                  /* for PAGE_SIZE and PAGE_SHIFT */
                                /* we also get PAGE_SIZE via getpagesize() */
+#include "busybox.h"
 
 #ifndef _IO
 /* pre-1.3.45 */
 
 #ifndef _IO
 /* pre-1.3.45 */
@@ -72,7 +72,7 @@ static int version = -1;
 static int pagesize;
 static int *signature_page;
 
 static int pagesize;
 static int *signature_page;
 
-struct swap_header_v1 {
+static struct swap_header_v1 {
        char bootbits[1024];            /* Space for disklabel etc. */
        unsigned int version;
        unsigned int last_page;
        char bootbits[1024];            /* Space for disklabel etc. */
        unsigned int version;
        unsigned int last_page;
@@ -81,20 +81,20 @@ struct swap_header_v1 {
        unsigned int badpages[1];
 } *p;
 
        unsigned int badpages[1];
 } *p;
 
-static void init_signature_page()
+static inline void init_signature_page(void)
 {
        pagesize = getpagesize();
 
 #ifdef PAGE_SIZE
        if (pagesize != PAGE_SIZE)
 {
        pagesize = getpagesize();
 
 #ifdef PAGE_SIZE
        if (pagesize != PAGE_SIZE)
-               error_msg("Assuming pages of size %d\n", pagesize);
+               bb_error_msg("Assuming pages of size %d", pagesize);
 #endif
        signature_page = (int *) xmalloc(pagesize);
        memset(signature_page, 0, pagesize);
        p = (struct swap_header_v1 *) signature_page;
 }
 
 #endif
        signature_page = (int *) xmalloc(pagesize);
        memset(signature_page, 0, pagesize);
        p = (struct swap_header_v1 *) signature_page;
 }
 
-static void write_signature(char *sig)
+static inline void write_signature(char *sig)
 {
        char *sp = (char *) signature_page;
 
 {
        char *sp = (char *) signature_page;
 
@@ -147,7 +147,7 @@ It is roughly 2GB on i386, PPC, m68k, ARM, 1GB on sparc, 512MB on mips,
 
 #define MAX_BADPAGES   ((pagesize-1024-128*sizeof(int)-10)/sizeof(int))
 
 
 #define MAX_BADPAGES   ((pagesize-1024-128*sizeof(int)-10)/sizeof(int))
 
-static void bit_set(unsigned int *addr, unsigned int nr)
+static inline void bit_set(unsigned int *addr, unsigned int nr)
 {
        unsigned int r, m;
 
 {
        unsigned int r, m;
 
@@ -173,25 +173,19 @@ static int bit_test_and_clear(unsigned int *addr, unsigned int nr)
 }
 
 
 }
 
 
-static void die(const char *str)
-{
-       error_msg("%s\n", str);
-       exit(EXIT_FAILURE);
-}
-
 static void page_ok(int page)
 {
        if (version == 0)
                bit_set(signature_page, page);
 }
 
 static void page_ok(int page)
 {
        if (version == 0)
                bit_set(signature_page, page);
 }
 
-static void page_bad(int page)
+static inline void page_bad(int page)
 {
        if (version == 0)
                bit_test_and_clear(signature_page, page);
        else {
                if (badpages == MAX_BADPAGES)
 {
        if (version == 0)
                bit_test_and_clear(signature_page, page);
        else {
                if (badpages == MAX_BADPAGES)
-                       die("too many bad pages");
+                       bb_error_msg_and_die("too many bad pages");
                p->badpages[badpages] = page;
        }
        badpages++;
                p->badpages[badpages] = page;
        }
        badpages++;
@@ -212,7 +206,7 @@ static void check_blocks(void)
                }
                if (do_seek && lseek(DEV, current_page * pagesize, SEEK_SET) !=
                        current_page * pagesize)
                }
                if (do_seek && lseek(DEV, current_page * pagesize, SEEK_SET) !=
                        current_page * pagesize)
-                       die("seek failed in check_blocks");
+                       bb_error_msg_and_die("seek failed in check_blocks");
                if ((do_seek = (pagesize != read(DEV, buffer, pagesize)))) {
                        page_bad(current_page++);
                        continue;
                if ((do_seek = (pagesize != read(DEV, buffer, pagesize)))) {
                        page_bad(current_page++);
                        continue;
@@ -261,7 +255,7 @@ static long get_size(const char *file)
        long size;
 
        if ((fd = open(file, O_RDONLY)) < 0)
        long size;
 
        if ((fd = open(file, O_RDONLY)) < 0)
-               perror_msg_and_die("%s", file);
+               bb_perror_msg_and_die("%s", file);
        if (ioctl(fd, BLKGETSIZE, &size) >= 0) {
                int sectors_per_page = pagesize / 512;
 
        if (ioctl(fd, BLKGETSIZE, &size) >= 0) {
                int sectors_per_page = pagesize / 512;
 
@@ -293,7 +287,7 @@ int mkswap_main(int argc, char **argv)
 
                                PAGES = strtol(argv[0], &tmp, 0) / blocks_per_page;
                                if (*tmp)
 
                                PAGES = strtol(argv[0], &tmp, 0) / blocks_per_page;
                                if (*tmp)
-                                       usage(mkswap_usage);
+                                       bb_show_usage();
                        } else
                                device_name = argv[0];
                } else {
                        } else
                                device_name = argv[0];
                } else {
@@ -308,41 +302,37 @@ int mkswap_main(int argc, char **argv)
                                version = atoi(argv[0] + 2);
                                break;
                        default:
                                version = atoi(argv[0] + 2);
                                break;
                        default:
-                               usage(mkswap_usage);
+                               bb_show_usage();
                        }
                }
        }
        if (!device_name) {
                        }
                }
        }
        if (!device_name) {
-               error_msg("error: Nowhere to set up swap on?\n");
-               usage(mkswap_usage);
+               bb_error_msg("error: Nowhere to set up swap on?");
+               bb_show_usage();
        }
        sz = get_size(device_name);
        if (!PAGES) {
                PAGES = sz;
        } else if (PAGES > sz && !force) {
        }
        sz = get_size(device_name);
        if (!PAGES) {
                PAGES = sz;
        } else if (PAGES > sz && !force) {
-               error_msg("error: size %ld is larger than device size %d\n",
+               bb_error_msg("error: size %ld is larger than device size %d",
                                PAGES * (pagesize / 1024), sz * (pagesize / 1024));
                return EXIT_FAILURE;
        }
 
        if (version == -1) {
                                PAGES * (pagesize / 1024), sz * (pagesize / 1024));
                return EXIT_FAILURE;
        }
 
        if (version == -1) {
-               if (PAGES <= V0_MAX_PAGES)
-                       version = 0;
-               else if (get_kernel_revision() < MAKE_VERSION(2, 1, 117))
-                       version = 0;
-               else if (pagesize < 2048)
+               if (get_kernel_revision() < MAKE_VERSION(2, 1, 117))
                        version = 0;
                else
                        version = 1;
        }
        if (version != 0 && version != 1) {
                        version = 0;
                else
                        version = 1;
        }
        if (version != 0 && version != 1) {
-               error_msg("error: unknown version %d\n", version);
-               usage(mkswap_usage);
+               bb_error_msg("error: unknown version %d", version);
+               bb_show_usage();
        }
        if (PAGES < 10) {
        }
        if (PAGES < 10) {
-               error_msg("error: swap area needs to be at least %ldkB\n",
+               bb_error_msg("error: swap area needs to be at least %ldkB",
                                (long) (10 * pagesize / 1024));
                                (long) (10 * pagesize / 1024));
-               usage(mkswap_usage);
+               bb_show_usage();
        }
 #if 0
        maxpages = ((version == 0) ? V0_MAX_PAGES : V1_MAX_PAGES);
        }
 #if 0
        maxpages = ((version == 0) ? V0_MAX_PAGES : V1_MAX_PAGES);
@@ -359,17 +349,17 @@ int mkswap_main(int argc, char **argv)
 #endif
        if (PAGES > maxpages) {
                PAGES = maxpages;
 #endif
        if (PAGES > maxpages) {
                PAGES = maxpages;
-               error_msg("warning: truncating swap area to %ldkB\n",
+               bb_error_msg("warning: truncating swap area to %ldkB",
                                PAGES * pagesize / 1024);
        }
 
        DEV = open(device_name, O_RDWR);
        if (DEV < 0 || fstat(DEV, &statbuf) < 0)
                                PAGES * pagesize / 1024);
        }
 
        DEV = open(device_name, O_RDWR);
        if (DEV < 0 || fstat(DEV, &statbuf) < 0)
-               perror_msg_and_die("%s", device_name);
+               bb_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)
        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'");
+               bb_error_msg_and_die("Will not try to make swapdevice on '%s'", device_name);
 
 #ifdef __sparc__
        if (!force && version == 0) {
 
 #ifdef __sparc__
        if (!force && version == 0) {
@@ -378,16 +368,16 @@ int mkswap_main(int argc, char **argv)
                unsigned short *q, sum;
 
                if (read(DEV, buffer, 512) != 512)
                unsigned short *q, sum;
 
                if (read(DEV, buffer, 512) != 512)
-                       die("fatal: first page unreadable");
+                       bb_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) {
                if (buffer[508] == 0xDA && buffer[509] == 0xBE) {
                        q = (unsigned short *) (buffer + 510);
                        for (sum = 0; q >= (unsigned short *) buffer;)
                                sum ^= *q--;
                        if (!sum) {
-                               error_msg("Device '%s' contains a valid Sun disklabel.\n"
+                               bb_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"
 "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);
+"the -f option to force it.", device_name);
                                return EXIT_FAILURE;
                        }
                }
                                return EXIT_FAILURE;
                        }
                }
@@ -397,7 +387,7 @@ int mkswap_main(int argc, char **argv)
        if (version == 0 || check)
                check_blocks();
        if (version == 0 && !bit_test_and_clear(signature_page, 0))
        if (version == 0 || check)
                check_blocks();
        if (version == 0 && !bit_test_and_clear(signature_page, 0))
-               die("fatal: first page unreadable");
+               bb_error_msg_and_die("fatal: first page unreadable");
        if (version == 1) {
                p->version = version;
                p->last_page = PAGES - 1;
        if (version == 1) {
                p->version = version;
                p->last_page = PAGES - 1;
@@ -406,23 +396,23 @@ int mkswap_main(int argc, char **argv)
 
        goodpages = PAGES - badpages - 1;
        if (goodpages <= 0)
 
        goodpages = PAGES - badpages - 1;
        if (goodpages <= 0)
-               die("Unable to set up swap-space: unreadable");
+               bb_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)
        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");
+               bb_error_msg_and_die("unable to rewind swap-device");
        if (write(DEV, (char *) signature_page + offset, pagesize - offset)
                != pagesize - offset)
        if (write(DEV, (char *) signature_page + offset, pagesize - offset)
                != pagesize - offset)
-               die("unable to write signature page");
+               bb_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))
 
        /*
         * A subsequent swapon() will fail if the signature
         * is not actually on disk. (This is a kernel bug.)
         */
        if (fsync(DEV))
-               die("fsync failed");
+               bb_error_msg_and_die("fsync failed");
        return EXIT_SUCCESS;
 }
        return EXIT_SUCCESS;
 }