this applet needlessly big! TODO: bb_getopt_ulflags()
[oweals/busybox.git] / util-linux / mkswap.c
index 5a33945c838f7b1b76ed6c571b483503260ecdfd..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 "internal.h"
 #include <stdio.h>
 #include <unistd.h>
 #include <string.h>
 #include <stdio.h>
 #include <unistd.h>
 #include <string.h>
 #include <stdlib.h>
 #include <sys/ioctl.h>                 /* for _IO */
 #include <sys/utsname.h>
 #include <stdlib.h>
 #include <sys/ioctl.h>                 /* for _IO */
 #include <sys/utsname.h>
-#include <sys/stat.h>
 #include <asm/page.h>                  /* for PAGE_SIZE and PAGE_SHIFT */
                                /* we also get PAGE_SIZE via getpagesize() */
 #include <asm/page.h>                  /* 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"
-#ifndef BB_FEATURE_TRIVIAL_HELP
-       "\nPrepare 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"
-#endif
-       ;
-
+#include "busybox.h"
 
 #ifndef _IO
 /* pre-1.3.45 */
 
 #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)
 #else
 /* same on i386, m68k, arm; different on alpha, mips, sparc, ppc */
 #define BLKGETSIZE _IO(0x12,96)
@@ -78,20 +63,6 @@ static int version = -1;
 
 #define MAKE_VERSION(p,q,r)    (65536*(p) + 256*(q) + (r))
 
 
 #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,
 /*
  * The definition of the union swap_header uses the constant PAGE_SIZE.
  * Unfortunately, on some architectures this depends on the hardware model,
@@ -101,7 +72,7 @@ static int linux_version_code(void)
 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;
@@ -110,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)
-               errorMsg("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;
 
@@ -176,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;
 
@@ -202,31 +173,25 @@ static int bit_test_and_clear(unsigned int *addr, unsigned int nr)
 }
 
 
 }
 
 
-void die(const char *str)
-{
-       errorMsg("%s\n", str);
-       exit(FALSE);
-}
-
-void page_ok(int page)
+static void page_ok(int page)
 {
        if (version == 0)
                bit_set(signature_page, page);
 }
 
 {
        if (version == 0)
                bit_set(signature_page, page);
 }
 
-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++;
 }
 
-void check_blocks(void)
+static void check_blocks(void)
 {
        unsigned int current_page;
        int do_seek = 1;
 {
        unsigned int current_page;
        int do_seek = 1;
@@ -241,7 +206,7 @@ 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;
@@ -289,11 +254,8 @@ static long get_size(const char *file)
        int fd;
        long size;
 
        int fd;
        long size;
 
-       fd = open(file, O_RDONLY);
-       if (fd < 0) {
-               perror(file);
-               exit(1);
-       }
+       if ((fd = open(file, O_RDONLY)) < 0)
+               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;
 
@@ -325,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 {
@@ -340,48 +302,44 @@ 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) {
-               errorMsg("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) {
-               errorMsg("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));
                                PAGES * (pagesize / 1024), sz * (pagesize / 1024));
-               exit(FALSE);
+               return EXIT_FAILURE;
        }
 
        if (version == -1) {
        }
 
        if (version == -1) {
-               if (PAGES <= V0_MAX_PAGES)
-                       version = 0;
-               else if (linux_version_code() < 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) {
-               errorMsg("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) {
-               errorMsg("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);
 #else
        if (!version)
                maxpages = V0_MAX_PAGES;
        }
 #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;
                maxpages = V1_MAX_PAGES;
        else {
                maxpages = V1_OLD_MAX_PAGES;
@@ -391,19 +349,17 @@ int mkswap_main(int argc, char **argv)
 #endif
        if (PAGES > maxpages) {
                PAGES = maxpages;
 #endif
        if (PAGES > maxpages) {
                PAGES = maxpages;
-               errorMsg("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);
                                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)
+               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) {
@@ -412,17 +368,17 @@ 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) {
-                               errorMsg("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);
-                               exit(FALSE);
+"the -f option to force it.", device_name);
+                               return EXIT_FAILURE;
                        }
                }
        }
                        }
                }
        }
@@ -431,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;
@@ -440,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");
-       return(TRUE);
+               bb_error_msg_and_die("fsync failed");
+       return EXIT_SUCCESS;
 }
 }