diff options
-rw-r--r-- | libfdisk/docs/libfdisk-sections.txt | 3 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.h.in | 5 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.sym | 6 | ||||
-rw-r--r-- | libfdisk/src/script.c | 56 |
4 files changed, 69 insertions, 1 deletions
diff --git a/libfdisk/docs/libfdisk-sections.txt b/libfdisk/docs/libfdisk-sections.txt index 676d500cf..8713d23b3 100644 --- a/libfdisk/docs/libfdisk-sections.txt +++ b/libfdisk/docs/libfdisk-sections.txt @@ -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> diff --git a/libfdisk/src/libfdisk.h.in b/libfdisk/src/libfdisk.h.in index 3aeef1e2f..a38ef47c9 100644 --- a/libfdisk/src/libfdisk.h.in +++ b/libfdisk/src/libfdisk.h.in @@ -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); diff --git a/libfdisk/src/libfdisk.sym b/libfdisk/src/libfdisk.sym index 541b2477d..5ff270b59 100644 --- a/libfdisk/src/libfdisk.sym +++ b/libfdisk/src/libfdisk.sym @@ -239,3 +239,9 @@ global: local: *; }; + +FDISK_2.27 { + fdisk_script_set_fgets; + fdisk_script_set_userdata; + fdisk_script_get_userdata; +} FDISK_2.26; diff --git a/libfdisk/src/script.c b/libfdisk/src/script.c index eb4e31d20..a7e0d21d8 100644 --- a/libfdisk/src/script.c +++ b/libfdisk/src/script.c @@ -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) { @@ -938,6 +968,26 @@ int fdisk_script_read_buffer(struct fdisk_script *dp, char *s) } /** + * 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 * @f: file @@ -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) { |