summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libfdisk/docs/libfdisk-sections.txt3
-rw-r--r--libfdisk/src/libfdisk.h.in5
-rw-r--r--libfdisk/src/libfdisk.sym6
-rw-r--r--libfdisk/src/script.c56
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) {