2019-06-24 07:33:34

by Michał Lowas-Rzechonek

[permalink] [raw]
Subject: [PATCH BlueZ v3 2/2] mesh: Added --io option

This allows specifying io type and options when invoking the daemon.

By default, meshd runs with MESH_IO_TYPE_GENERIC and tries to attach to
the first available HCI interface.

Option "--index=<n>" is now just a shortcut for "--io=generic:<n>"
---
mesh/main.c | 94 +++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 77 insertions(+), 17 deletions(-)

diff --git a/mesh/main.c b/mesh/main.c
index 262e3da48..c9bf850f6 100644
--- a/mesh/main.c
+++ b/mesh/main.c
@@ -39,6 +39,7 @@

static const struct option main_options[] = {
{ "index", required_argument, NULL, 'i' },
+ { "io", required_argument, NULL, 'I' },
{ "config", optional_argument, NULL, 'c' },
{ "nodetach", no_argument, NULL, 'n' },
{ "debug", no_argument, NULL, 'd' },
@@ -49,16 +50,23 @@ static const struct option main_options[] = {

static void usage(void)
{
- l_info("");
- l_info("Usage:\n"
+ fprintf(stderr,
+ "Usage:\n"
"\tbluetooth-meshd [options]\n");
- l_info("Options:\n"
- "\t--index <hcinum> Use specified controller\n"
+ fprintf(stderr,
+ "Options:\n"
+ "\t--index <hcinum> Equivalent of `--io=generic:<hcinum>`\n"
+ "\t--io <io> Use specified io (default: generic)\n"
"\t--config Configuration directory\n"
"\t--nodetach Run in foreground\n"
"\t--debug Enable debug output\n"
"\t--dbus-debug Enable D-Bus debugging\n"
"\t--help Show %s information\n", __func__);
+ fprintf(stderr,
+ "io:\n"
+ "\tgeneric[:<index>]\n"
+ "\t\tUse generic HCI io on interface hci<index>, or the first\n"
+ "\t\tavailable one\n");
}

static void do_debug(const char *str, void *user_data)
@@ -107,6 +115,37 @@ static void signal_handler(uint32_t signo, void *user_data)
terminated = true;
}

+static bool parse_io(const char *optarg, enum mesh_io_type *type, void **opts)
+{
+ if (strstr(optarg, "generic") == optarg) {
+ int *index = l_new(int, 1);
+
+ *type = MESH_IO_TYPE_GENERIC;
+ *opts = index;
+
+ optarg += strlen("generic");
+ if (!*optarg) {
+ *index = MGMT_INDEX_NONE;
+ return true;
+ }
+
+ if (*optarg != ':')
+ return false;
+
+ optarg++;
+
+ if (sscanf(optarg, "hci%d", index) == 1)
+ return true;
+
+ if (sscanf(optarg, "%d", index) == 1)
+ return true;
+
+ return false;
+ }
+
+ return false;
+}
+
int main(int argc, char *argv[])
{
int status;
@@ -114,7 +153,9 @@ int main(int argc, char *argv[])
bool dbus_debug = false;
struct l_dbus *dbus = NULL;
const char *config_dir = NULL;
- int index = MGMT_INDEX_NONE;
+ enum mesh_io_type io_type = MESH_IO_TYPE_NONE;
+ char *io = NULL;
+ void *io_opts = NULL;

if (!l_main_init())
return -1;
@@ -123,7 +164,6 @@ int main(int argc, char *argv[])

for (;;) {
int opt;
- const char *str;

opt = getopt_long(argc, argv, "i:c:ndbh", main_options, NULL);
if (opt < 0)
@@ -131,18 +171,20 @@ int main(int argc, char *argv[])

switch (opt) {
case 'i':
- if (strlen(optarg) > 3 && !strncmp(optarg, "hci", 3))
- str = optarg + 3;
- else
- str = optarg;
- if (!isdigit(*str)) {
- l_error("Invalid controller index value");
- status = EXIT_FAILURE;
+ if (io) {
+ l_error("Use either --index or --io, not both");
+ status = EXIT_SUCCESS;
goto done;
}
-
- index = atoi(str);
-
+ io = l_strdup_printf("generic:%s", optarg);
+ break;
+ case 'I':
+ if (io) {
+ l_error("Use either --index or --io, not both");
+ status = EXIT_SUCCESS;
+ goto done;
+ }
+ io = l_strdup(optarg);
break;
case 'n':
detached = false;
@@ -167,8 +209,20 @@ int main(int argc, char *argv[])
}
}

+ if (!parse_io(io, &io_type, &io_opts)) {
+ l_error("Invalid io: %s", io);
+ status = EXIT_FAILURE;
+ goto done;
+ }
+
+ if ((io_type == MESH_IO_TYPE_NONE) && !io_opts) {
+ int *index = l_new(int, 1);
+ *index = MGMT_INDEX_NONE;
+ io_type = MESH_IO_TYPE_GENERIC;
+ io_opts = index;
+ }

- if (!mesh_init(config_dir, MESH_IO_TYPE_GENERIC, &index)) {
+ if (!mesh_init(config_dir, io_type, io_opts)) {
l_error("Failed to initialize mesh");
status = EXIT_FAILURE;
goto done;
@@ -198,6 +252,12 @@ int main(int argc, char *argv[])
status = l_main_run_with_signal(signal_handler, NULL);

done:
+ if (io)
+ l_free(io);
+
+ if (io_opts)
+ l_free(io_opts);
+
mesh_cleanup();
l_dbus_destroy(dbus);
l_main_exit();
--
2.19.1


2019-06-24 22:01:00

by Michał Lowas-Rzechonek

[permalink] [raw]
Subject: Re: [PATCH BlueZ v3 2/2] mesh: Added --io option

Hi Brian,

On 06/24, Michał Lowas-Rzechonek wrote:
> This allows specifying io type and options when invoking the daemon.
>
> By default, meshd runs with MESH_IO_TYPE_GENERIC and tries to attach to
> the first available HCI interface.
>
> Option "--index=<n>" is now just a shortcut for "--io=generic:<n>"

Thanks for applying the first patch, but how about this one? :)

cheers
--
Michał Lowas-Rzechonek <[email protected]>
Silvair http://silvair.com
Jasnogórska 44, 31-358 Krakow, POLAND