]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: add fgets() callback for scripts
authorKarel Zak <kzak@redhat.com>
Wed, 25 Mar 2015 15:05:14 +0000 (16:05 +0100)
committerKarel Zak <kzak@redhat.com>
Wed, 25 Mar 2015 15:05:14 +0000 (16:05 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
libfdisk/docs/libfdisk-sections.txt
libfdisk/src/libfdisk.h.in
libfdisk/src/libfdisk.sym
libfdisk/src/script.c

index 676d500cfd90b9aa092ea5de344311f97046761b..8713d23b3e005ad277a6540423b55cb0aef51829 100644 (file)
@@ -135,7 +135,10 @@ fdisk_script_read_context
 fdisk_script_read_file
 fdisk_script_read_line
 fdisk_script_set_header
+fdisk_script_set_fgets
 fdisk_script_write_file
+fdisk_script_set_userdata
+fdisk_script_get_userdata
 fdisk_unref_script
 </SECTION>
 
index 3aeef1e2f5503b20ff0b669471d14b1576adb07b..a38ef47c99234e05f02aa6c2e57f0b5797e6da59 100644 (file)
@@ -540,6 +540,11 @@ int fdisk_script_set_header(struct fdisk_script *dp, const char *name, const cha
 struct fdisk_table *fdisk_script_get_table(struct fdisk_script *dp);
 int fdisk_script_get_nlines(struct fdisk_script *dp);
 
+int fdisk_script_set_userdata(struct fdisk_script *dp, void *data);
+void *fdisk_script_get_userdata(struct fdisk_script *dp);
+
+int fdisk_script_set_fgets(struct fdisk_script *dp,
+                          char *(*fn_fgets)(struct fdisk_script *, char *, size_t, FILE *));
 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_file(struct fdisk_script *dp, FILE *f);
index 541b2477d2d8e386f92fd1588c8527b39e947ef0..5ff270b598c3d2ef430f6c8b1bc62dd06f2c652e 100644 (file)
@@ -239,3 +239,9 @@ global:
 local:
        *;
 };
+
+FDISK_2.27 {
+       fdisk_script_set_fgets;
+       fdisk_script_set_userdata;
+       fdisk_script_get_userdata;
+} FDISK_2.26;
index eb4e31d20ead92d2f550bbce1662d657efc55fa4..a7e0d21d8bf725ad0589e730b2e2f667ec58ece7 100644 (file)
@@ -28,6 +28,8 @@ struct fdisk_script {
        struct fdisk_context    *cxt;
 
        int                     refcount;
+       char                    *(*fn_fgets)(struct fdisk_script *, char *, size_t, FILE *);
+       void                    *userdata;
 
        /* parser's state */
        size_t                  nlines;
@@ -174,6 +176,34 @@ void fdisk_unref_script(struct fdisk_script *dp)
        }
 }
 
+/**
+ * fdisk_script_set_userdata
+ * @dp: script
+ * @data: your data
+ *
+ * Sets data usable for example in callbacks (e.g fdisk_script_set_fgets()).
+ *
+ * Returns: 0 on success, <0 on error.
+ */
+int fdisk_script_set_userdata(struct fdisk_script *dp, void *data)
+{
+       assert(dp);
+       dp->userdata = data;
+       return 0;
+}
+
+/**
+ * fdisk_script_get_userdata
+ * @dp: script
+ *
+ * Returns: user data or NULL.
+ */
+void *fdisk_script_get_userdata(struct fdisk_script *dp)
+{
+       assert(dp);
+       return dp->userdata;
+}
+
 static struct fdisk_scriptheader *script_get_header(struct fdisk_script *dp,
                                                     const char *name)
 {
@@ -937,6 +967,26 @@ int fdisk_script_read_buffer(struct fdisk_script *dp, char *s)
        return rc;
 }
 
+/**
+ * fdisk_script_set_fgets:
+ * @dp: script
+ * @fn_fgets: callback function
+ *
+ * The library uses fgets() function to read the next line from the script.
+ * This default maybe overrided to another function. Note that the function has
+ * to return the line terminated by \n (for example readline(3) removes \n).
+ *
+ * Return: 0 on success, <0 on error
+ */
+int fdisk_script_set_fgets(struct fdisk_script *dp,
+                         char *(*fn_fgets)(struct fdisk_script *, char *, size_t, FILE *))
+{
+       assert(dp);
+
+       dp->fn_fgets = fn_fgets;
+       return 0;
+}
+
 /**
  * fdisk_script_read_line:
  * @dp: script
@@ -959,8 +1009,12 @@ int fdisk_script_read_line(struct fdisk_script *dp, FILE *f, char *buf, size_t b
 
        /* read the next non-blank non-comment line */
        do {
-               if (fgets(buf, bufsz, f) == NULL)
+               if (dp->fn_fgets) {
+                       if (dp->fn_fgets(dp, buf, bufsz, f) == NULL)
+                               return 1;
+               } else if (fgets(buf, bufsz, f) == NULL)
                        return 1;
+
                dp->nlines++;
                s = strchr(buf, '\n');
                if (!s) {