*/
extern usbg_config *usbg_get_config(usbg_gadget *g, int id, const char *label);
+/* USB gadget/config/function/binding removal */
+
+/**
+ * @brief Remove binding between configuration and function
+ * @details This function frees also the memory allocated for binding
+ * @param b Binding to be removed
+ * @return 0 on success, usbg_error if error occurred
+ */
+extern int usbg_rm_binding(usbg_binding *b);
+
/* USB gadget allocation and configuration */
/**
break;
case EACCES:
case EROFS:
+ case EPERM:
ret = USBG_ERROR_NO_ACCESS;
break;
case ENOENT:
return b;
}
+static int ubsg_rm_file(char *path, char *name)
+{
+ int ret = USBG_SUCCESS;
+ int nmb;
+ char buf[USBG_MAX_PATH_LENGTH];
+
+ nmb = snprintf(buf, sizeof(buf), "%s/%s", path, name);
+ if (nmb < sizeof(buf)) {
+ nmb = unlink(buf);
+ if (nmb != 0)
+ ret = usbg_translate_error(errno);
+ } else {
+ ret = USBG_ERROR_PATH_TOO_LONG;
+ }
+
+ return ret;
+}
+
+
static int usbg_parse_function_net_attrs(usbg_function *f,
usbg_function_attrs *f_attrs)
{
return NULL;
}
+int usbg_rm_binding(usbg_binding *b)
+{
+ int ret = USBG_SUCCESS;
+ usbg_config *c;
+
+ if (!b)
+ return USBG_ERROR_INVALID_PARAM;
+
+ c = b->parent;
+
+ ret = ubsg_rm_file(b->path, b->name);
+ if (ret == USBG_SUCCESS) {
+ TAILQ_REMOVE(&(c->bindings), b, bnode);
+ usbg_free_binding(b);
+ }
+
+ return ret;
+}
+
static int usbg_create_empty_gadget(usbg_state *s, char *name, usbg_gadget **g)
{
char gpath[USBG_MAX_PATH_LENGTH];