summaryrefslogtreecommitdiffstats
path: root/libfdisk/src
diff options
context:
space:
mode:
authorKarel Zak2014-11-21 11:03:08 +0100
committerKarel Zak2014-11-21 11:03:08 +0100
commita3d834888e912f29def6cb1c37d1793736ce81cd (patch)
tree7e2b5022eae8e4d24d28cae5f36f38e02b68a97f /libfdisk/src
parentagetty: fix typo (diff)
downloadkernel-qcow2-util-linux-a3d834888e912f29def6cb1c37d1793736ce81cd.tar.gz
kernel-qcow2-util-linux-a3d834888e912f29def6cb1c37d1793736ce81cd.tar.xz
kernel-qcow2-util-linux-a3d834888e912f29def6cb1c37d1793736ce81cd.zip
libfdisk: add ref.counting to ask API
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libfdisk/src')
-rw-r--r--libfdisk/src/ask.c67
-rw-r--r--libfdisk/src/bsd.c4
-rw-r--r--libfdisk/src/dos.c6
-rw-r--r--libfdisk/src/fdiskP.h2
-rw-r--r--libfdisk/src/gpt.c2
-rw-r--r--libfdisk/src/libfdisk.h3
-rw-r--r--libfdisk/src/partition.c4
-rw-r--r--libfdisk/src/sgi.c4
-rw-r--r--libfdisk/src/sun.c4
9 files changed, 72 insertions, 24 deletions
diff --git a/libfdisk/src/ask.c b/libfdisk/src/ask.c
index c6e02f348..0fc48954f 100644
--- a/libfdisk/src/ask.c
+++ b/libfdisk/src/ask.c
@@ -1,38 +1,83 @@
#include "strutils.h"
-
#include "fdiskP.h"
-static void fdisk_ask_menu_reset_items(struct fdisk_ask *ask);
+/**
+ * SECTION: ask
+ * @title: Ask callback
+ * @short_description: interface for dialog driven partitioning
+ *
+ */
+static void fdisk_ask_menu_reset_items(struct fdisk_ask *ask);
+/**
+ * fdisk_new_ask:
+ *
+ * Returns: newly allocated ask instance.
+ */
struct fdisk_ask *fdisk_new_ask(void)
{
struct fdisk_ask *ask = calloc(1, sizeof(struct fdisk_ask));
DBG(ASK, ul_debugobj(ask, "alloc"));
+ ask->refcount = 1;
return ask;
}
+/**
+ * fdisk_reset_ask:
+ * @ask: ask instance
+ *
+ * Resets all ask setting.
+ */
void fdisk_reset_ask(struct fdisk_ask *ask)
{
+ int refcount;
+
assert(ask);
free(ask->query);
DBG(ASK, ul_debugobj(ask, "reset"));
+ refcount = ask->refcount;
if (fdisk_is_ask(ask, MENU))
fdisk_ask_menu_reset_items(ask);
memset(ask, 0, sizeof(*ask));
+ ask->refcount = refcount;
}
-void fdisk_free_ask(struct fdisk_ask *ask)
+/**
+ * fdisk_ref_ask:
+ * @ask: ask instance
+ *
+ * Incremparts reference counter.
+ */
+void fdisk_ref_ask(struct fdisk_ask *ask)
+{
+ if (ask)
+ ask->refcount++;
+}
+
+
+/**
+ * fdisk_unref_ask:
+ * @ask: ask instance
+ *
+ * De-incremparts reference counter, on zero the @ask is automatically
+ * deallocated.
+ */
+void fdisk_unref_ask(struct fdisk_ask *ask)
{
if (!ask)
return;
- fdisk_reset_ask(ask);
- DBG(ASK, ul_debugobj(ask, "free"));
- free(ask);
+ ask->refcount--;
+
+ if (ask->refcount <= 0) {
+ fdisk_reset_ask(ask);
+ DBG(ASK, ul_debugobj(ask, "free"));
+ free(ask);
+ }
}
const char *fdisk_ask_get_query(struct fdisk_ask *ask)
@@ -384,7 +429,7 @@ dont_ask:
*partnum -= 1;
}
DBG(ASK, ul_debugobj(ask, "result: %ju [rc=%d]\n", fdisk_ask_number_get_result(ask), rc));
- fdisk_free_ask(ask);
+ fdisk_unref_ask(ask);
return rc;
}
@@ -420,7 +465,7 @@ int fdisk_ask_number(struct fdisk_context *cxt,
*result = fdisk_ask_number_get_result(ask);
DBG(ASK, ul_debugobj(ask, "result: %ju [rc=%d]\n", *result, rc));
- fdisk_free_ask(ask);
+ fdisk_unref_ask(ask);
return rc;
}
@@ -466,7 +511,7 @@ int fdisk_ask_string(struct fdisk_context *cxt,
*result = fdisk_ask_string_get_result(ask);
DBG(ASK, ul_debugobj(ask, "result: %s [rc=%d]\n", *result, rc));
- fdisk_free_ask(ask);
+ fdisk_unref_ask(ask);
return rc;
}
@@ -492,7 +537,7 @@ int fdisk_ask_yesno(struct fdisk_context *cxt,
*result = fdisk_ask_yesno_get_result(ask) == 1 ? 1 : 0;
DBG(ASK, ul_debugobj(ask, "result: %d [rc=%d]\n", *result, rc));
- fdisk_free_ask(ask);
+ fdisk_unref_ask(ask);
return rc;
}
@@ -690,7 +735,7 @@ static int do_vprint(struct fdisk_context *cxt, int errnum, int type,
fdisk_ask_print_set_errno(ask, errnum);
rc = fdisk_do_ask(cxt, ask);
- fdisk_free_ask(ask);
+ fdisk_unref_ask(ask);
free(mesg);
return rc;
}
diff --git a/libfdisk/src/bsd.c b/libfdisk/src/bsd.c
index c92c893bb..16281e2f6 100644
--- a/libfdisk/src/bsd.c
+++ b/libfdisk/src/bsd.c
@@ -257,7 +257,7 @@ static int bsd_add_partition(struct fdisk_context *cxt,
rc = fdisk_do_ask(cxt, ask);
begin = fdisk_ask_number_get_result(ask);
- fdisk_free_ask(ask);
+ fdisk_unref_ask(ask);
if (rc)
return rc;
if (fdisk_use_cylinders(cxt))
@@ -298,7 +298,7 @@ static int bsd_add_partition(struct fdisk_context *cxt,
rc = fdisk_do_ask(cxt, ask);
end = fdisk_ask_number_get_result(ask);
- fdisk_free_ask(ask);
+ fdisk_unref_ask(ask);
if (rc)
return rc;
if (fdisk_use_cylinders(cxt))
diff --git a/libfdisk/src/dos.c b/libfdisk/src/dos.c
index 54af66cf9..edf5cc2e0 100644
--- a/libfdisk/src/dos.c
+++ b/libfdisk/src/dos.c
@@ -934,7 +934,7 @@ static int get_start_from_user( struct fdisk_context *cxt,
rc = fdisk_do_ask(cxt, ask);
*start = fdisk_ask_number_get_result(ask);
- fdisk_free_ask(ask);
+ fdisk_unref_ask(ask);
if (rc)
return rc;
if (fdisk_use_cylinders(cxt)) {
@@ -1167,7 +1167,7 @@ static int add_partition(struct fdisk_context *cxt, size_t n,
rc = fdisk_do_ask(cxt, ask);
stop = fdisk_ask_number_get_result(ask);
isrel = fdisk_ask_number_is_relative(ask);
- fdisk_free_ask(ask);
+ fdisk_unref_ask(ask);
if (rc)
return rc;
if (fdisk_use_cylinders(cxt)) {
@@ -1612,7 +1612,7 @@ static int dos_add_partition(struct fdisk_context *cxt,
if (rc)
return rc;
fdisk_ask_menu_get_result(ask, &c);
- fdisk_free_ask(ask);
+ fdisk_unref_ask(ask);
if (c == 'p') {
rc = get_partition_unused_primary(cxt, pa, &res);
diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h
index a655ecf59..3deb64078 100644
--- a/libfdisk/src/fdiskP.h
+++ b/libfdisk/src/fdiskP.h
@@ -295,6 +295,8 @@ struct fdisk_ask {
char *query;
unsigned int flags;
+ int refcount;
+
union {
/* FDISK_ASKTYPE_{NUMBER,OFFSET} */
struct ask_number {
diff --git a/libfdisk/src/gpt.c b/libfdisk/src/gpt.c
index d3bc4ae00..12756997a 100644
--- a/libfdisk/src/gpt.c
+++ b/libfdisk/src/gpt.c
@@ -2146,7 +2146,7 @@ static int gpt_add_partition(
if (partno)
*partno = partnum;
done:
- fdisk_free_ask(ask);
+ fdisk_unref_ask(ask);
return rc;
}
diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h
index 359bd4acb..3ca1f7aea 100644
--- a/libfdisk/src/libfdisk.h
+++ b/libfdisk/src/libfdisk.h
@@ -455,7 +455,8 @@ int fdisk_apply_script(struct fdisk_context *cxt, struct fdisk_script *dp);
extern struct fdisk_ask *fdisk_new_ask(void);
extern void fdisk_reset_ask(struct fdisk_ask *ask);
-extern void fdisk_free_ask(struct fdisk_ask *ask);
+extern void fdisk_ref_ask(struct fdisk_ask *ask);
+extern void fdisk_unref_ask(struct fdisk_ask *ask);
extern const char *fdisk_ask_get_query(struct fdisk_ask *ask);
extern int fdisk_ask_set_query(struct fdisk_ask *ask, const char *str);
extern int fdisk_ask_get_type(struct fdisk_ask *ask);
diff --git a/libfdisk/src/partition.c b/libfdisk/src/partition.c
index 1af3cf245..194b68e3d 100644
--- a/libfdisk/src/partition.c
+++ b/libfdisk/src/partition.c
@@ -85,9 +85,9 @@ void fdisk_ref_partition(struct fdisk_partition *pa)
/**
* fdisk_unref_partition:
- * @tb: partition pointer
+ * @pa: partition pointer
*
- * De-incremparts reference counter, on zero the @tb is automatically
+ * De-incremparts reference counter, on zero the @pa is automatically
* deallocated.
*/
void fdisk_unref_partition(struct fdisk_partition *pa)
diff --git a/libfdisk/src/sgi.c b/libfdisk/src/sgi.c
index e2eff9bb4..c99deb3c7 100644
--- a/libfdisk/src/sgi.c
+++ b/libfdisk/src/sgi.c
@@ -838,7 +838,7 @@ static int sgi_add_partition(struct fdisk_context *cxt,
rc = fdisk_do_ask(cxt, ask);
first = fdisk_ask_number_get_result(ask);
- fdisk_free_ask(ask);
+ fdisk_unref_ask(ask);
if (rc)
return rc;
@@ -888,7 +888,7 @@ static int sgi_add_partition(struct fdisk_context *cxt,
rc = fdisk_do_ask(cxt, ask);
last = fdisk_ask_number_get_result(ask) + 1;
- fdisk_free_ask(ask);
+ fdisk_unref_ask(ask);
if (rc)
return rc;
if (fdisk_use_cylinders(cxt))
diff --git a/libfdisk/src/sun.c b/libfdisk/src/sun.c
index dcde5d7af..82dd2c326 100644
--- a/libfdisk/src/sun.c
+++ b/libfdisk/src/sun.c
@@ -550,7 +550,7 @@ static int sun_add_partition(
}
rc = fdisk_do_ask(cxt, ask);
first = fdisk_ask_number_get_result(ask);
- fdisk_free_ask(ask);
+ fdisk_unref_ask(ask);
if (rc)
return rc;
@@ -657,7 +657,7 @@ static int sun_add_partition(
rc = fdisk_do_ask(cxt, ask);
last = fdisk_ask_number_get_result(ask);
- fdisk_free_ask(ask);
+ fdisk_unref_ask(ask);
if (rc)
return rc;
if (fdisk_use_cylinders(cxt))