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.opasiak@xxxxxxxxxxx> --- include/usbg/usbg.h | 16 ++++++++++++ src/usbg.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/include/usbg/usbg.h b/include/usbg/usbg.h index ca21753..4bfa058 100644 --- a/include/usbg/usbg.h +++ b/include/usbg/usbg.h @@ -43,6 +43,13 @@ #define USBG_MAX_PATH_LENGTH PATH_MAX #define USBG_MAX_NAME_LENGTH 40 +/** + * @brief Additional option for usbg_rm_* functions. + * @details This option allows to remove all content + * of gadget/config/function recursive. + */ +#define USBG_RM_RECURSE 1 + /* * Internal structures */ @@ -287,6 +294,15 @@ extern usbg_config *usbg_get_config(usbg_gadget *g, int id, const char *label); extern int usbg_rm_binding(usbg_binding *b); /** + * @brief Remove configuration + * @details This function frees also the memory allocated for configuration + * @param c Configuration to be removed + * @param opts Additional options for configuration removal. + * @return 0 on success, usbg_error if error occurred + */ +extern int usbg_rm_config(usbg_config *c, int opts); + +/** * @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 036a710..7fae9fe 100644 --- a/src/usbg.c +++ b/src/usbg.c @@ -714,6 +714,28 @@ static int usbg_rm_dir(char *path, char *name) return ret; } +static int usbg_rm_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_rm_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) { @@ -1319,6 +1341,52 @@ int usbg_rm_binding(usbg_binding *b) return ret; } +int usbg_rm_config(usbg_config *c, int opts) +{ + int ret = USBG_ERROR_INVALID_PARAM; + usbg_gadget *g; + + if (!c) + return ret; + + g = c->parent; + + if (opts & USBG_RM_RECURSE) { + /* Recursive flag was given + * so remove all bindings and strings */ + char spath[USBG_MAX_PATH_LENGTH]; + int nmb; + usbg_binding *b; + + while (!TAILQ_EMPTY(&c->bindings)) { + b = TAILQ_FIRST(&c->bindings); + ret = usbg_rm_binding(b); + if (ret != USBG_SUCCESS) + goto out; + } + + nmb = snprintf(spath, sizeof(spath), "%s/%s/%s", c->path, + c->name, STRINGS_DIR); + if (nmb >= sizeof(spath)) { + ret = USBG_ERROR_PATH_TOO_LONG; + goto out; + } + + ret = usbg_rm_all_dirs(spath); + if (ret != USBG_SUCCESS) + goto out; + } + + ret = usbg_rm_dir(c->path, c->name); + if (ret == USBG_SUCCESS) { + TAILQ_REMOVE(&(g->configs), c, cnode); + usbg_free_config(c); + } + +out: + return ret; +} + int usbg_rm_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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html