]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: fix script partitions size parsing
authorKarel Zak <kzak@redhat.com>
Mon, 8 Sep 2014 14:16:31 +0000 (16:16 +0200)
committerKarel Zak <kzak@redhat.com>
Tue, 7 Oct 2014 12:55:31 +0000 (14:55 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
libfdisk/src/libfdisk.h
libfdisk/src/partition.c
libfdisk/src/script.c
libfdisk/src/utils.c

index 802e243bb78dfa935971f0e59adc34b4babe93d2..6abae04b584d4d038b1bf9ead301375c8afca46f 100644 (file)
@@ -270,6 +270,8 @@ extern int fdisk_partition_next_partno(struct fdisk_partition *pa,
 extern int fdisk_partition_partno_follow_default(struct fdisk_partition *pa, int enable);
 extern int fdisk_partition_start_follow_default(struct fdisk_partition *pa, int enable);
 extern int fdisk_partition_end_follow_default(struct fdisk_partition *pa, int enable);
+extern int fdisk_partition_end_is_default(struct fdisk_partition *pa);
+extern int fdisk_partition_start_is_default(struct fdisk_partition *pa);
 
 extern int fdisk_reorder_partitions(struct fdisk_context *cxt);
 
@@ -416,12 +418,13 @@ struct fdisk_table *fdisk_script_get_table(struct fdisk_script *dp);
 
 int fdisk_script_read_context(struct fdisk_script *dp, struct fdisk_context *cxt);
 int fdisk_script_write_file(struct fdisk_script *dp, FILE *f);
-int fdisk_script_read_buffer(struct fdisk_script *dp, char *s);
 int fdisk_script_read_file(struct fdisk_script *dp, FILE *f);
+int fdisk_script_read_line(struct fdisk_script *dp, FILE *f, char *buf, size_t sz);
 
 int fdisk_set_script(struct fdisk_context *cxt, struct fdisk_script *dp);
 struct fdisk_script *fdisk_get_script(struct fdisk_context *cxt);
 
+int fdisk_apply_script_headers(struct fdisk_context *cxt, struct fdisk_script *dp);
 int fdisk_apply_script(struct fdisk_context *cxt, struct fdisk_script *dp);
 
 
@@ -506,6 +509,9 @@ extern int fdisk_ask_menu_add_item(struct fdisk_ask *ask, int key,
 
 extern int fdisk_ask_partnum(struct fdisk_context *cxt, size_t *partnum, int wantnew);
 
+/* utils.h */
+extern char *fdisk_partname(const char *dev, size_t partno);
+
 #ifdef __cplusplus
 }
 #endif
index 35ee8ed4e6db44246542acec7554fb8874712b46..c60e064fbb75e4a07db7ff40091b9e9cd6ce703c 100644 (file)
@@ -294,6 +294,18 @@ int fdisk_partition_start_follow_default(struct fdisk_partition *pa, int enable)
        return 0;
 }
 
+/**
+ * fdisk_partition_start_is_default:
+ * @pa: partition
+ *
+ * Returns: 1 if the partition follows default
+ */
+int fdisk_partition_start_is_default(struct fdisk_partition *pa)
+{
+       assert(pa);
+       return pa->start_follow_default;
+}
+
 /**
  * fdisk_partition_start_follow_default
  * @pa: partition
@@ -312,6 +324,18 @@ int fdisk_partition_end_follow_default(struct fdisk_partition *pa, int enable)
        return 0;
 }
 
+/**
+ * fdisk_partition_end_is_default:
+ * @pa: partition
+ *
+ * Returns: 1 if the partition follows default
+ */
+int fdisk_partition_end_is_default(struct fdisk_partition *pa)
+{
+       assert(pa);
+       return pa->end_follow_default;
+}
+
 const char *fdisk_partition_get_uuid(struct fdisk_partition *pa)
 {
        return pa ? pa->uuid : NULL;
index d91cef92d4fca1f1c99ef326d4153bbf9f434252..7d6f5eec32005af98c936dc02e4a2c6775d1ad7e 100644 (file)
@@ -57,6 +57,12 @@ struct fdisk_script *fdisk_new_script(struct fdisk_context *cxt)
        dp->cxt = cxt;
        fdisk_ref_context(cxt);
 
+       dp->table = fdisk_new_table();
+       if (!dp->table) {
+               fdisk_unref_script(dp);
+               return NULL;
+       }
+
        INIT_LIST_HEAD(&dp->headers);
        return dp;
 }
@@ -592,7 +598,7 @@ static int parse_script_line(struct fdisk_script *dp, char *s)
                        p += 5;
                        rc = next_number(&p, &num);
                        if (!rc)
-                               fdisk_partition_set_size(pa, num);
+                               fdisk_partition_set_size(pa, num / dp->cxt->sector_size);
 
                } else if (!strncasecmp(p, "end=", 4)) {
                        p += 4;
@@ -728,6 +734,7 @@ static int parse_commas_line(struct fdisk_script *dp, char *s)
 
        fdisk_partition_start_follow_default(pa, 1);
        fdisk_partition_end_follow_default(pa, 1);
+       fdisk_partition_partno_follow_default(pa, 1);
 
        while (rc == 0 && p && *p) {
                uint64_t num;
@@ -756,7 +763,7 @@ static int parse_commas_line(struct fdisk_script *dp, char *s)
                        else {
                                rc = next_number(&p, &num);
                                if (!rc)
-                                       fdisk_partition_set_size(pa, num);
+                                       fdisk_partition_set_size(pa, num / dp->cxt->sector_size);
                                fdisk_partition_end_follow_default(pa, 0);
                        }
                        break;
@@ -851,9 +858,17 @@ int fdisk_script_read_buffer(struct fdisk_script *dp, char *s)
        return rc;
 }
 
-static int fdisk_script_read_line(struct fdisk_script *dp, FILE *f)
+/**
+ * fdisk_script_read_line:
+ * @dp: script
+ * @f: file
+ *
+ * Reads next line into dump.
+ *
+ * Returns: 0 on success, <0 on error.
+ */
+int fdisk_script_read_line(struct fdisk_script *dp, FILE *f, char *buf, size_t bufsz)
 {
-       char buf[BUFSIZ];
        char *s;
 
        assert(dp);
@@ -863,7 +878,7 @@ static int fdisk_script_read_line(struct fdisk_script *dp, FILE *f)
 
        /* read the next non-blank non-comment line */
        do {
-               if (fgets(buf, sizeof(buf), f) == NULL)
+               if (fgets(buf, bufsz, f) == NULL)
                        return -errno;
                dp->nlines++;
                s = strchr(buf, '\n');
@@ -901,6 +916,7 @@ static int fdisk_script_read_line(struct fdisk_script *dp, FILE *f)
  */
 int fdisk_script_read_file(struct fdisk_script *dp, FILE *f)
 {
+       char buf[BUFSIZ];
        int rc = NULL;
 
        assert(dp);
@@ -909,7 +925,7 @@ int fdisk_script_read_file(struct fdisk_script *dp, FILE *f)
        DBG(SCRIPT, ul_debugobj(dp, "parsing file"));
 
        while (!feof(f)) {
-               rc = fdisk_script_read_line(dp, f);
+               rc = fdisk_script_read_line(dp, f, buf, sizeof(buf));
                if (rc)
                        break;
        }
@@ -961,6 +977,32 @@ struct fdisk_script *fdisk_get_script(struct fdisk_context *cxt)
        return cxt->script;
 }
 
+/**
+ * fdisk_apply_script_headers:
+ * @cxt: context
+ * dp: script
+ *
+ * Associte context @cxt with script @dp and creates a new empty disklabel.
+ *
+ * Return: 0 on success, <0 on error.
+ */
+int fdisk_apply_script_headers(struct fdisk_context *cxt, struct fdisk_script *dp)
+{
+       const char *name;
+
+       assert(cxt);
+       assert(dp);
+
+       fdisk_set_script(cxt, dp);
+
+       /* create empty label */
+       name = fdisk_script_get_header(dp, "label");
+       if (!name)
+               return -EINVAL;
+
+       return fdisk_create_disklabel(cxt, name);
+}
+
 /**
  * fdisk_apply_script:
  * @cxt: context
@@ -974,7 +1016,6 @@ struct fdisk_script *fdisk_get_script(struct fdisk_context *cxt)
 int fdisk_apply_script(struct fdisk_context *cxt, struct fdisk_script *dp)
 {
        int rc;
-       const char *p;
        struct fdisk_script *old;
 
        assert(dp);
@@ -983,23 +1024,14 @@ int fdisk_apply_script(struct fdisk_context *cxt, struct fdisk_script *dp)
        DBG(CXT, ul_debugobj(cxt, "appling script %p", dp));
 
        old = fdisk_get_script(cxt);
-       fdisk_set_script(cxt, dp);
 
-       /* create empty label */
-       p = fdisk_script_get_header(dp, "label");
-       if (!p) {
-               rc = -EINVAL;
-               goto done;
-       }
-       rc = fdisk_create_disklabel(cxt, p);
-       if (rc)
-               goto done;
+       /* create empty disk label */
+       rc = fdisk_apply_script_headers(cxt, dp);
 
        /* create partitions */
-       if (dp->table)
+       if (!rc && dp->table)
                rc = fdisk_apply_table(cxt, dp->table);
 
-done:
        fdisk_set_script(cxt, old);
        DBG(CXT, ul_debugobj(cxt, "script done [rc=%d]", rc));
        return rc;
index e809c6e4ffc1de785671153bb34507c82e59b7d0..ac8eb202d2a99efb996ca6ff7882a44605517a29 100644 (file)
@@ -61,8 +61,12 @@ int fdisk_read_firstsector(struct fdisk_context *cxt)
        return 0;
 }
 
-/*
- * Return allocated buffer with partition name
+/**
+ * fdisk_partname:
+ * dev: device name
+ * @partno: partition name
+ *
+ * Return: allocated buffer with partition name
  */
 char *fdisk_partname(const char *dev, size_t partno)
 {