Re: [PATCH] Pass config parameters to do_connect() on gatttool

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Please ignore this patch. I will resent it with a different approach.

Sheldon

On Tue, Feb 15, 2011 at 6:14 PM, Sheldon Demario
<sheldon.demario@xxxxxxxxxxxxx> wrote:
> It is desirable that do_connect() doesn't depend on global variables
> in order to make it more independent and reusable. Unifying all these
> connection parameters on a single struct makes the code simpler.
> ---
>  attrib/gatttool.c    |   61 +++++++++++++++++++++++++------------------------
>  attrib/gatttool.h    |   11 ++++++++-
>  attrib/interactive.c |   28 ++++++++++++++---------
>  3 files changed, 58 insertions(+), 42 deletions(-)
>
> diff --git a/attrib/gatttool.c b/attrib/gatttool.c
> index 1e2a8db..d72a49e 100644
> --- a/attrib/gatttool.c
> +++ b/attrib/gatttool.c
> @@ -47,28 +47,24 @@
>  /* Minimum MTU for L2CAP connections over BR/EDR */
>  #define ATT_MIN_MTU_L2CAP 48
>
> -static gchar *opt_src = NULL;
> -static gchar *opt_dst = NULL;
>  static gchar *opt_value = NULL;
> -static gchar *opt_sec_level = "low";
>  static uuid_t *opt_uuid = NULL;
>  static int opt_start = 0x0001;
>  static int opt_end = 0xffff;
>  static int opt_handle = -1;
> -static int opt_mtu = 0;
> -static int opt_psm = 0x1f;
>  static gboolean opt_primary = FALSE;
>  static gboolean opt_characteristics = FALSE;
>  static gboolean opt_char_read = FALSE;
>  static gboolean opt_listen = FALSE;
>  static gboolean opt_char_desc = FALSE;
> -static gboolean opt_le = FALSE;
>  static gboolean opt_char_write = FALSE;
>  static gboolean opt_char_write_req = FALSE;
>  static gboolean opt_interactive = FALSE;
>  static GMainLoop *event_loop;
>  static gboolean got_error = FALSE;
>
> +struct connect_params config;
> +
>  struct characteristic_data {
>        GAttrib *attrib;
>        uint16_t start;
> @@ -84,7 +80,7 @@ static void connect_cb(GIOChannel *io, GError *err, gpointer user_data)
>        }
>  }
>
> -GIOChannel *do_connect(gchar *dst, gboolean le, BtIOConnect connect_cb)
> +GIOChannel *do_connect(struct connect_params *config, BtIOConnect connect_cb)
>  {
>        GIOChannel *chan;
>        bdaddr_t sba, dba;
> @@ -93,49 +89,49 @@ GIOChannel *do_connect(gchar *dst, gboolean le, BtIOConnect connect_cb)
>
>        /* This check is required because currently setsockopt() returns no
>         * errors for MTU values smaller than the allowed minimum. */
> -       if (opt_mtu != 0 && opt_mtu < ATT_MIN_MTU_L2CAP) {
> +       if (config->mtu != 0 && config->mtu < ATT_MIN_MTU_L2CAP) {
>                g_printerr("MTU cannot be smaller than %d\n",
>                                                        ATT_MIN_MTU_L2CAP);
>                return NULL;
>        }
>
>        /* Remote device */
> -       if (dst == NULL) {
> +       if (config->dst == NULL) {
>                g_printerr("Remote Bluetooth address required\n");
>                return NULL;
>        }
> -       str2ba(dst, &dba);
> +       str2ba(config->dst, &dba);
>
>        /* Local adapter */
> -       if (opt_src != NULL) {
> -               if (!strncmp(opt_src, "hci", 3))
> -                       hci_devba(atoi(opt_src + 3), &sba);
> +       if (config->src != NULL) {
> +               if (!strncmp(config->src, "hci", 3))
> +                       hci_devba(atoi(config->src + 3), &sba);
>                else
> -                       str2ba(opt_src, &sba);
> +                       str2ba(config->src, &sba);
>        } else
>                bacpy(&sba, BDADDR_ANY);
>
> -       if (strcmp(opt_sec_level, "medium") == 0)
> +       if (strcmp(config->sec_level, "medium") == 0)
>                sec_level = BT_IO_SEC_MEDIUM;
> -       else if (strcmp(opt_sec_level, "high") == 0)
> +       else if (strcmp(config->sec_level, "high") == 0)
>                sec_level = BT_IO_SEC_HIGH;
>        else
>                sec_level = BT_IO_SEC_LOW;
>
> -       if (le)
> +       if (config->le)
>                chan = bt_io_connect(BT_IO_L2CAP, connect_cb, NULL, NULL, &err,
>                                BT_IO_OPT_SOURCE_BDADDR, &sba,
>                                BT_IO_OPT_DEST_BDADDR, &dba,
>                                BT_IO_OPT_CID, GATT_CID,
> -                               BT_IO_OPT_OMTU, opt_mtu,
> +                               BT_IO_OPT_OMTU, config->mtu,
>                                BT_IO_OPT_SEC_LEVEL, sec_level,
>                                BT_IO_OPT_INVALID);
>        else
>                chan = bt_io_connect(BT_IO_L2CAP, connect_cb, NULL, NULL, &err,
>                                BT_IO_OPT_SOURCE_BDADDR, &sba,
>                                BT_IO_OPT_DEST_BDADDR, &dba,
> -                               BT_IO_OPT_PSM, opt_psm,
> -                               BT_IO_OPT_OMTU, opt_mtu,
> +                               BT_IO_OPT_PSM, config->psm,
> +                               BT_IO_OPT_OMTU, config->mtu,
>                                BT_IO_OPT_SEC_LEVEL, sec_level,
>                                BT_IO_OPT_INVALID);
>
> @@ -594,7 +590,7 @@ static GOptionEntry gatt_options[] = {
>                "Characteristics Descriptor Discovery", NULL },
>        { "listen", 0, 0, G_OPTION_ARG_NONE, &opt_listen,
>                "Listen for notifications and indications", NULL },
> -       { "le", 0, 0, G_OPTION_ARG_NONE, &opt_le,
> +       { "le", 0, 0, G_OPTION_ARG_NONE, &config.le,
>                "Use Bluetooth Low Energy transport", NULL },
>        { "interactive", 'I', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE,
>                &opt_interactive, "Use interactive mode", NULL },
> @@ -602,15 +598,15 @@ static GOptionEntry gatt_options[] = {
>  };
>
>  static GOptionEntry options[] = {
> -       { "adapter", 'i', 0, G_OPTION_ARG_STRING, &opt_src,
> +       { "adapter", 'i', 0, G_OPTION_ARG_STRING, &config.src,
>                "Specify local adapter interface", "hciX" },
> -       { "device", 'b', 0, G_OPTION_ARG_STRING, &opt_dst,
> +       { "device", 'b', 0, G_OPTION_ARG_STRING, &config.dst,
>                "Specify remote Bluetooth address", "MAC" },
> -       { "mtu", 'm', 0, G_OPTION_ARG_INT, &opt_mtu,
> +       { "mtu", 'm', 0, G_OPTION_ARG_INT, &config.mtu,
>                "Specify the MTU size", "MTU" },
> -       { "psm", 'p', 0, G_OPTION_ARG_INT, &opt_psm,
> +       { "psm", 'p', 0, G_OPTION_ARG_INT, &config.psm,
>                "Specify the PSM for GATT/ATT over BR/EDR", "PSM" },
> -       { "sec-level", 'l', 0, G_OPTION_ARG_STRING, &opt_sec_level,
> +       { "sec-level", 'l', 0, G_OPTION_ARG_STRING, &config.sec_level,
>                "Set security level. Default: low", "[low | medium | high]"},
>        { NULL },
>  };
> @@ -624,6 +620,10 @@ int main(int argc, char *argv[])
>        GIOChannel *chan;
>        GSourceFunc callback;
>
> +       memset(&config, 0, sizeof(config));
> +       config.sec_level = strdup("low");
> +       config.psm = 0x1f;
> +
>        context = g_option_context_new(NULL);
>        g_option_context_add_main_entries(context, options, NULL);
>
> @@ -656,7 +656,7 @@ int main(int argc, char *argv[])
>        }
>
>        if (opt_interactive) {
> -               interactive(opt_dst, opt_le);
> +               interactive(config.dst, config.le);
>                goto done;
>        }
>
> @@ -680,7 +680,7 @@ int main(int argc, char *argv[])
>                goto done;
>        }
>
> -       chan = do_connect(opt_dst, opt_le, connect_cb);
> +       chan = do_connect(&config, connect_cb);
>        if (chan == NULL) {
>                got_error = TRUE;
>                goto done;
> @@ -706,9 +706,10 @@ int main(int argc, char *argv[])
>
>  done:
>        g_option_context_free(context);
> -       g_free(opt_src);
> -       g_free(opt_dst);
> +       g_free(config.src);
> +       g_free(config.dst);
>        g_free(opt_uuid);
> +       g_free(config.sec_level);
>
>        if (got_error)
>                exit(EXIT_FAILURE);
> diff --git a/attrib/gatttool.h b/attrib/gatttool.h
> index 2237330..ec6fa35 100644
> --- a/attrib/gatttool.h
> +++ b/attrib/gatttool.h
> @@ -21,5 +21,14 @@
>  *
>  */
>
> +struct connect_params {
> +       gchar *src;
> +       gchar *dst;
> +       gchar *sec_level;
> +       int psm;
> +       int mtu;
> +       gboolean le;
> +};
> +
>  int interactive(gchar *dst, gboolean le);
> -GIOChannel *do_connect(gchar *dst, gboolean le, BtIOConnect connect_cb);
> +GIOChannel *do_connect(struct connect_params *config, BtIOConnect connect_cb);
> diff --git a/attrib/interactive.c b/attrib/interactive.c
> index 83a0778..284699b 100644
> --- a/attrib/interactive.c
> +++ b/attrib/interactive.c
> @@ -37,8 +37,7 @@ static GAttrib *attrib = NULL;
>  static GMainLoop *event_loop;
>  static GString *prompt;
>
> -static gchar *opt_dst = NULL;
> -static gboolean opt_le = FALSE;
> +struct connect_params config;
>
>  static void cmd_help(int argcp, char **argvp);
>
> @@ -60,12 +59,12 @@ static char *get_prompt(void)
>        else
>                g_string_assign(prompt, "[   ]");
>
> -       if (opt_dst)
> -               g_string_append_printf(prompt, "[%17s]", opt_dst);
> +       if (config.dst)
> +               g_string_append_printf(prompt, "[%17s]", config.dst);
>        else
>                g_string_append_printf(prompt, "[%17s]", "");
>
> -       if (opt_le)
> +       if (config.le)
>                g_string_append(prompt, "[LE]");
>        else
>                g_string_append(prompt, "[BR]");
> @@ -107,17 +106,17 @@ static void cmd_connect(int argcp, char **argvp)
>                return;
>
>        if (argcp > 1) {
> -               g_free(opt_dst);
> -               opt_dst = strdup(argvp[1]);
> +               g_free(config.dst);
> +               config.dst = strdup(argvp[1]);
>        }
>
> -       if (opt_dst == NULL) {
> +       if (config.dst == NULL) {
>                printf("Remote Bluetooth address required\n");
>                return;
>        }
>
>        set_state(STATE_CONNECTING);
> -       iochannel = do_connect(opt_dst, opt_le, connect_cb);
> +       iochannel = do_connect(&config, connect_cb);
>        if (iochannel == NULL)
>                set_state(STATE_DISCONNECTED);
>
> @@ -212,8 +211,12 @@ int interactive(gchar *dst, gboolean le)
>        GIOChannel *pchan;
>        gint events;
>
> -       opt_dst = dst;
> -       opt_le = le;
> +       memset(&config, 0, sizeof(config));
> +       config.sec_level = strdup("low");
> +       config.psm = 0x1f;
> +
> +       config.dst = strdup(dst);
> +       config.le = le;
>
>        prompt = g_string_new(NULL);
>
> @@ -234,5 +237,8 @@ int interactive(gchar *dst, gboolean le)
>        g_main_loop_unref(event_loop);
>        g_string_free(prompt, TRUE);
>
> +       g_free(config.dst);
> +       g_free(config.sec_level);
> +
>        return 0;
>  }
> --
> 1.7.1
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux