installer: Use humanize_number() and dehumanize_number().
authorSascha Wildner <saw@online.de>
Tue, 9 Jul 2013 20:30:40 +0000 (22:30 +0200)
committerSascha Wildner <saw@online.de>
Tue, 9 Jul 2013 20:31:30 +0000 (22:31 +0200)
usr.sbin/installer/dfuibe_installer/Makefile
usr.sbin/installer/dfuibe_installer/fn_subpart_hammer.c
usr.sbin/installer/dfuibe_installer/fn_subpart_ufs.c
usr.sbin/installer/libinstaller/functions.c

index 57e40e2..16e70a0 100644 (file)
@@ -26,7 +26,7 @@ LIBINSTALLER=${.OBJDIR}/../libinstaller/libinstaller.a
 LIBINSTALLER=${.CURDIR}/../libinstaller/libinstaller.a
 .endif
 
-DPADD+=        ${LIBINSTALLER} ${LIBDFUI} ${LIBAURA}
-LDADD+=        ${LIBINSTALLER} ${LIBDFUI} ${LIBAURA}
+DPADD+=        ${LIBINSTALLER} ${LIBDFUI} ${LIBAURA} ${LIBUTIL}
+LDADD+=        ${LIBINSTALLER} ${LIBDFUI} ${LIBAURA} -lutil
 
 .include <bsd.prog.mk>
index 39cff8e..5ddba3d 100644 (file)
@@ -425,11 +425,12 @@ check_subpartition_selections(struct dfui_response *r, struct i_fn_args *a)
                }
 
                if (!string_to_capacity(capstring, &capacity)) {
-                       inform(a->c, _("Capacity must be either a '*' symbol to indicate "
-                           "'use the rest of the primary partition', or it "
-                           "must be a series of decimal digits ending with a "
-                           "'M' (indicating megabytes) or a 'G' (indicating "
-                           "gigabytes.)"));
+                       inform(a->c, _("Capacity must be either a '*' symbol "
+                           "to indicate 'use the rest of the primary "
+                           "partition', or it must be a series of decimal "
+                           "digits ending with an 'M' (indicating "
+                           "megabytes), a 'G' (indicating gigabytes) and "
+                           "so on (up to 'E'.)"));
                        valid = 0;
                }
 
@@ -614,8 +615,8 @@ make_create_subpartitions_form(struct i_fn_args *a)
            "partition. In most cases you should be fine with "
            "the default settings.\n\n"
            "For Capacity, use 'M' to indicate megabytes, 'G' to "
-           "indicate gigabytes, or a single '*' to indicate "
-           "'use the remaining space on the primary partition'."),
+           "indicate gigabytes, and so on (up to 'E'.) A single '*' "
+           "indicates 'use the remaining space on the primary partition'."),
 
            msg_buf[0],
 
index a71e55a..58e48ad 100644 (file)
@@ -429,11 +429,12 @@ check_subpartition_selections(struct dfui_response *r, struct i_fn_args *a)
                }
 
                if (!string_to_capacity(capstring, &capacity)) {
-                       inform(a->c, _("Capacity must be either a '*' symbol to indicate "
-                           "'use the rest of the primary partition', or it "
-                           "must be a series of decimal digits ending with a "
-                           "'M' (indicating megabytes) or a 'G' (indicating "
-                           "gigabytes.)"));
+                       inform(a->c, _("Capacity must be either a '*' symbol "
+                           "to indicate 'use the rest of the primary "
+                           "partition', or it must be a series of decimal "
+                           "digits ending with an 'M' (indicating "
+                           "megabytes), a 'G' (indicating gigabytes) and "
+                           "so on (up to 'E'.)"));
                        valid = 0;
                }
 
@@ -686,8 +687,8 @@ make_create_subpartitions_form(struct i_fn_args *a)
            "in BSD tradition) you want to have on this primary "
            "partition.\n\n"
            "For Capacity, use 'M' to indicate megabytes, 'G' to "
-           "indicate gigabytes, or a single '*' to indicate "
-           "'use the remaining space on the primary partition'."),
+           "indicate gigabytes, and so on (up to 'E'.) A single '*' "
+           "indicates 'use the remaining space on the primary partition'."),
 
            msg_buf[0],
 
index c700ae2..bcf602b 100644 (file)
@@ -43,6 +43,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <libutil.h>
 
 #include "libaura/mem.h"
 #include "libaura/dict.h"
@@ -240,12 +241,13 @@ first_non_space_char_is(const char *line, char x)
 const char *
 capacity_to_string(long capacity)
 {
-       static char string[256];
+       static char string[6];
 
        if (capacity < 0)
                strlcpy(string, "*", 2);
        else
-               snprintf(string, 255, "%ldM", capacity);
+               humanize_number(string, sizeof(string), capacity << 20, "",
+                   HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL);
 
        return(string);
 }
@@ -253,21 +255,21 @@ capacity_to_string(long capacity)
 int
 string_to_capacity(const char *string, long *capacity)
 {
-       char unit;
+       int error;
+       int64_t result;
 
-       unit = string[strlen(string) - 1];
        if (!strcmp(string, "*")) {
                *capacity = -1;
                return(1);
-       } else if (unit == 'm' || unit == 'M') {
-               *capacity = strtol(string, NULL, 10);
-               return(1);
-       } else if (unit == 'g' || unit == 'G') {
-               *capacity = strtol(string, NULL, 10) * 1024;
-               return(1);
-       } else {
-               return(0);
        }
+       error = dehumanize_number(string, &result);
+       if (error != 0)
+               return(0);
+       result >>= 20;
+       if (result == 0)
+               return(0);
+       *capacity = result;
+       return(1);
 }
 
 /*