From: Karel Zak Date: Wed, 25 Mar 2015 15:05:14 +0000 (+0100) Subject: libfdisk: add fgets() callback for scripts X-Git-Tag: v2.27-rc1~318 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5cdbe36fbc07c7d30c454b764eb5a6e9595a8252;p=thirdparty%2Futil-linux.git libfdisk: add fgets() callback for scripts Signed-off-by: Karel Zak --- diff --git a/libfdisk/docs/libfdisk-sections.txt b/libfdisk/docs/libfdisk-sections.txt index 676d500cfd..8713d23b3e 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 diff --git a/libfdisk/src/libfdisk.h.in b/libfdisk/src/libfdisk.h.in index 3aeef1e2f5..a38ef47c99 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 541b2477d2..5ff270b598 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 eb4e31d20e..a7e0d21d8b 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) { @@ -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) {