OSDN Git Service

Handle 64-bit offsets correctly on Android
[android-x86/external-exfat.git] / mkfs / main.c
index b8ce63d..8a419f1 100644 (file)
@@ -2,7 +2,7 @@
        main.c (15.08.10)
        Creates exFAT file system.
 
-       Copyright (C) 2011, 2012  Andrew Nayenko
+       Copyright (C) 2011-2013  Andrew Nayenko
 
        This program is free software: you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
@@ -18,6 +18,7 @@
        along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#include <exfat.h>
 #include <sys/types.h>
 #include <sys/time.h>
 #include <unistd.h>
@@ -25,7 +26,6 @@
 #include <stdio.h>
 #include <string.h>
 #include <limits.h>
-#include <exfat.h>
 #include "mkexfat.h"
 #include "vbr.h"
 #include "fat.h"
@@ -96,14 +96,6 @@ int get_cluster_size(void)
        return get_sector_size() << get_spc_bits();
 }
 
-static off_t setup_volume_size(struct exfat_dev* dev)
-{
-       off_t size = exfat_seek(dev, 0, SEEK_END);
-       if (size == (off_t) -1)
-               exfat_error("failed to get volume size");
-       return size;
-}
-
 static int setup_spc_bits(int sector_bits, int user_defined, off_t volume_size)
 {
        int i;
@@ -166,10 +158,7 @@ static int setup(struct exfat_dev* dev, int sector_bits, int spc_bits,
 {
        param.sector_bits = sector_bits;
        param.first_sector = first_sector;
-
-       param.volume_size = setup_volume_size(dev);
-       if (param.volume_size == (off_t) -1)
-               return 1;
+       param.volume_size = exfat_get_size(dev);
 
        param.spc_bits = setup_spc_bits(sector_bits, spc_bits, param.volume_size);
        if (param.spc_bits == -1)
@@ -199,14 +188,14 @@ static void usage(const char* prog)
 {
        fprintf(stderr, "Usage: %s [-i volume-id] [-n label] "
                        "[-p partition-first-sector] "
-                       "[-s sectors-per-cluster] [-v] <device>\n", prog);
+                       "[-s sectors-per-cluster] [-V] <device>\n", prog);
        exit(1);
 }
 
 int main(int argc, char* argv[])
 {
        const char* spec = NULL;
-       char** pp;
+       int opt;
        int spc_bits = -1;
        const char* volume_label = NULL;
        uint32_t volume_serial = 0;
@@ -216,53 +205,38 @@ int main(int argc, char* argv[])
        printf("mkexfatfs %u.%u.%u\n",
                        EXFAT_VERSION_MAJOR, EXFAT_VERSION_MINOR, EXFAT_VERSION_PATCH);
 
-       for (pp = argv + 1; *pp; pp++)
+       while ((opt = getopt(argc, argv, "i:n:p:s:V")) != -1)
        {
-               if (strcmp(*pp, "-s") == 0)
+               switch (opt)
                {
-                       pp++;
-                       if (*pp == NULL)
-                               usage(argv[0]);
-                       spc_bits = logarithm2(atoi(*pp));
+               case 'i':
+                       volume_serial = strtol(optarg, NULL, 16);
+                       break;
+               case 'n':
+                       volume_label = optarg;
+                       break;
+               case 'p':
+                       first_sector = strtoll(optarg, NULL, 10);
+                       break;
+               case 's':
+                       spc_bits = logarithm2(atoi(optarg));
                        if (spc_bits < 0)
                        {
-                               exfat_error("invalid option value: `%s'", *pp);
+                               exfat_error("invalid option value: `%s'", optarg);
                                return 1;
                        }
-               }
-               else if (strcmp(*pp, "-n") == 0)
-               {
-                       pp++;
-                       if (*pp == NULL)
-                               usage(argv[0]);
-                       volume_label = *pp;
-               }
-               else if (strcmp(*pp, "-i") == 0)
-               {
-                       pp++;
-                       if (*pp == NULL)
-                               usage(argv[0]);
-                       volume_serial = strtol(*pp, NULL, 16);
-               }
-               else if (strcmp(*pp, "-p") == 0)
-               {
-                       pp++;
-                       if (*pp == NULL)
-                               usage(argv[0]);
-                       first_sector = strtoll(*pp, NULL, 10);
-               }
-               else if (strcmp(*pp, "-v") == 0)
-               {
-                       puts("Copyright (C) 2011, 2012  Andrew Nayenko");
+                       break;
+               case 'V':
+                       puts("Copyright (C) 2011-2013  Andrew Nayenko");
                        return 0;
-               }
-               else if (spec == NULL)
-                       spec = *pp;
-               else
+               default:
                        usage(argv[0]);
+                       break;
+               }
        }
-       if (spec == NULL)
+       if (argc - optind != 1)
                usage(argv[0]);
+       spec = argv[optind];
 
        dev = exfat_open(spec, EXFAT_MODE_RW);
        if (dev == NULL)