Add function which allow to remove configuration. This functions also remove binding from internal library structures what means that after this operation all pointers to removed config are invalid.
Signed-off-by: Krzysztof Opasiak <k.opas...@samsung.com> --- include/usbg/usbg.h | 10 ++++++++ src/usbg.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/include/usbg/usbg.h b/include/usbg/usbg.h index d0b9dbe..d874a36 100644 --- a/include/usbg/usbg.h +++ b/include/usbg/usbg.h @@ -278,6 +278,16 @@ extern usbg_config *usbg_get_config(usbg_gadget *g, const char *name); extern int usbg_remove_binding(usbg_binding *b); /** + * @brief Remove configuration + * @details This function frees also the memory allocated for configuration + * @param c Configuration to be removed + * @param recursive If different than 0 all bindings and strings will + * be recursively removed before removing configuration + * @return 0 on success, usbg_error if error occurred + */ +extern int usbg_remove_config(usbg_config *c, int recursive); + +/** * @brief Remove configuration strings for given language * @param c Pointer to configuration * @param lang Language of strings which should be deleted diff --git a/src/usbg.c b/src/usbg.c index 9f67f9d..7dbdd12 100644 --- a/src/usbg.c +++ b/src/usbg.c @@ -606,6 +606,28 @@ static int usbg_remove_dir(char *path, char *name) return ret; } +static int usbg_remove_all_dirs(char *path) +{ + int ret = USBG_SUCCESS; + int n, i; + struct dirent **dent; + + n = scandir(path, &dent, file_select, alphasort); + if (n >= 0) { + for (i = 0; i < n; ++i) { + if (ret == USBG_SUCCESS) + ret = usbg_remove_dir(path, dent[i]->d_name); + + free(dent[i]); + } + free(dent); + } else { + ret = usbg_translate_error(errno); + } + + return ret; +} + static int usbg_parse_function_net_attrs(usbg_function *f, usbg_function_attrs *f_attrs) { @@ -1157,6 +1179,52 @@ int usbg_remove_binding(usbg_binding *b) return ret; } +int usbg_remove_config(usbg_config *c, int recursive) +{ + int ret = USBG_ERROR_INVALID_PARAM; + usbg_gadget *g; + + if (!c) + return ret; + + g = c->parent; + + if (recursive) { + /* Recursive flag was given + * so remove all bindings and strings */ + char spath[PATH_MAX]; + int nmb; + usbg_binding *b; + + while (!TAILQ_EMPTY(&c->bindings)) { + b = TAILQ_FIRST(&c->bindings); + ret = usbg_remove_binding(b); + if (ret != USBG_SUCCESS) + goto out; + } + + nmb = snprintf(spath, PATH_MAX, "%s/%s/%s", c->path, c->name, + STRINGS_DIR); + if (nmb >= PATH_MAX) { + ret = USBG_ERROR_PATH_TOO_LONG; + goto out; + } + + ret = usbg_remove_all_dirs(spath); + if (ret != USBG_SUCCESS) + goto out; + } + + ret = usbg_remove_dir(c->path, c->name); + if (ret == USBG_SUCCESS) { + TAILQ_REMOVE(&(g->configs), c, cnode); + usbg_free_config(c); + } + +out: + return ret; +} + int usbg_remove_config_strs(usbg_config *c, int lang) { int ret = USBG_SUCCESS; -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html