From b698cb5a83fd2effc1f7ef388e6739ab11aab2bf Mon Sep 17 00:00:00 2001 From: Pawel Szewczyk Date: Fri, 26 Jun 2015 12:58:00 +0200 Subject: [PATCH] gadget: Implement gadget rm on libsubg backend Change-Id: I49e1f9877597fce7f290786caaa4c678eff7c024 Signed-off-by: Pawel Szewczyk --- source/gadget/src/gadget.c | 8 ++++++- source/gadget/src/gadget_libusbg.c | 49 +++++++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/source/gadget/src/gadget.c b/source/gadget/src/gadget.c index b7d3fac..8078dce 100644 --- a/source/gadget/src/gadget.c +++ b/source/gadget/src/gadget.c @@ -192,7 +192,13 @@ out: static int gt_gadget_rm_help(void *data) { - printf("Gadget rm help.\n"); + printf("usage: %s rm [OPTIONS] NAME \n" + "Remove gadget of specified name\n" + "\n" + "Options:\n" + " -f, --force\tDisable gadget if it was enabled\n" + " -r, --recursive\tRemove configs and functions recursively\n", + program_name); return -1; } diff --git a/source/gadget/src/gadget_libusbg.c b/source/gadget/src/gadget_libusbg.c index ee0e55e..c2c651c 100644 --- a/source/gadget/src/gadget_libusbg.c +++ b/source/gadget/src/gadget_libusbg.c @@ -75,6 +75,53 @@ err_usbg: return -1; } +static int rm_func(void *data) +{ + struct gt_gadget_rm_data *dt; + int usbg_ret; + usbg_udc *u; + usbg_gadget *g; + int opts = 0; + + dt = (struct gt_gadget_rm_data *)data; + + g = usbg_get_gadget(backend_ctx.libusbg_state, dt->name); + if (g == NULL) { + fprintf(stderr, "Gadget '%s' not found\n", dt->name); + goto err; + } + + u = usbg_get_gadget_udc(g); + + if (u) { + if (!(dt->opts & GT_FORCE)) { + fprintf(stderr, "Gadget is enabled, disable it first or use --force option\n"); + goto err; + } + + usbg_ret = usbg_disable_gadget(g); + if (usbg_ret != USBG_SUCCESS) { + fprintf(stderr, "Error on disable gadget: %s : %s\n", + usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); + goto err; + } + } + + if (dt->opts & GT_RECURSIVE) + opts |= USBG_RM_RECURSE; + + usbg_ret = usbg_rm_gadget(g, opts); + if (usbg_ret != USBG_SUCCESS){ + fprintf(stderr, "Error on gadget remove: %s : %s\n", + usbg_error_name(usbg_ret), usbg_strerror(usbg_ret)); + goto err; + } + + return 0; +err: + return -1; +} + static int enable_func(void *data) { struct gt_gadget_enable_data *dt; @@ -110,7 +157,7 @@ static int enable_func(void *data) struct gt_gadget_backend gt_gadget_backend_libusbg = { .create = create_func, - .rm = NULL, + .rm = rm_func, .get = NULL, .set = NULL, .enable = enable_func, -- 2.7.4