#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)
*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;
}
*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;
}
*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;
}
*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;
}
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;
}
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)) {
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)) {
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);
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);