From e8b263fa47a9d33ed8fc48f51d44a5ece0cc8e7b Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Wed, 21 Mar 2007 20:28:55 +0000 Subject: Add file for shared functions --- network/common.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 network/common.c (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c new file mode 100644 index 00000000..8e5043cc --- /dev/null +++ b/network/common.c @@ -0,0 +1,28 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2004-2007 Marcel Holtmann + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "common.h" -- cgit From d1d248d12b0eba700498c47647f9cd438510b242 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 22 Mar 2007 17:36:56 +0000 Subject: Initial code of bnep common. --- network/common.c | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index 8e5043cc..1649eb70 100644 --- a/network/common.c +++ b/network/common.c @@ -25,4 +25,150 @@ #include #endif +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "logging.h" #include "common.h" + +static int ctl; + +/* Compatibility with old ioctls */ +#define OLD_BNEPCONADD 1 +#define OLD_BNEPCONDEL 2 +#define OLD_BNEPGETCONLIST 3 +#define OLD_BNEPGETCONINFO 4 + +static unsigned long bnepconnadd; +static unsigned long bnepconndel; +static unsigned long bnepgetconnlist; +static unsigned long bnepgetconninfo; + +static struct { + char *str; + uint16_t uuid; +} __svc[] = { + { "PANU", BNEP_SVC_PANU }, + { "NAP", BNEP_SVC_NAP }, + { "GN", BNEP_SVC_GN }, + { NULL } +}; + +int bnep_str2svc(char *svc, uint16_t *uuid) +{ + int i; + for (i = 0; __svc[i].str; i++) + if (!strcasecmp(svc, __svc[i].str)) { + *uuid = __svc[i].uuid; + return 0; + } + return -1; +} + +char *bnep_svc2str(uint16_t uuid) +{ + int i; + for (i = 0; __svc[i].str; i++) + if (__svc[i].uuid == uuid) + return __svc[i].str; + return NULL; +} + +int bnep_init(void) +{ + ctl = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_BNEP); + if (ctl < 0) { + error("Failed to open control socket"); + return 1; + } + + /* Temporary ioctl compatibility hack */ + { + struct bnep_connlist_req req; + struct bnep_conninfo ci[1]; + + req.cnum = 1; + req.ci = ci; + + if (!ioctl(ctl, BNEPGETCONNLIST, &req)) { + /* New ioctls */ + bnepconnadd = BNEPCONNADD; + bnepconndel = BNEPCONNDEL; + bnepgetconnlist = BNEPGETCONNLIST; + bnepgetconninfo = BNEPGETCONNINFO; + } else { + /* Old ioctls */ + bnepconnadd = OLD_BNEPCONADD; + bnepconndel = OLD_BNEPCONDEL; + bnepgetconnlist = OLD_BNEPGETCONLIST; + bnepgetconninfo = OLD_BNEPGETCONINFO; + } + } + + return 0; +} + +int bnep_cleanup(void) +{ + close(ctl); + return 0; +} + +int bnep_kill_connection(const char *addr) +{ + struct bnep_conndel_req req; + uint8_t *dst = (void *) strtoba(addr); + + memcpy(req.dst, dst, ETH_ALEN); + req.flags = 0; + if (ioctl(ctl, bnepconndel, &req)) { + error("Failed to kill connection"); + return -1; + } + return 0; +} + +int bnep_kill_all_connections(void) +{ + struct bnep_connlist_req req; + struct bnep_conninfo ci[48]; + int i; + + req.cnum = 48; + req.ci = ci; + if (ioctl(ctl, bnepgetconnlist, &req)) { + error("Failed to get connection list"); + return -1; + } + + for (i=0; i < req.cnum; i++) { + struct bnep_conndel_req req; + memcpy(req.dst, ci[i].dst, ETH_ALEN); + req.flags = 0; + ioctl(ctl, bnepconndel, &req); + } + return 0; +} + +int bnep_connadd(int sk, uint16_t role, char *dev) +{ + struct bnep_connadd_req req; + + strncpy(req.device, dev, 16); + req.device[15] = '\0'; + req.sock = sk; + req.role = role; + if (ioctl(ctl, bnepconnadd, &req)) { + error("Failed to add device %s", dev); + return -1; + } + strncpy(dev, req.device, 16); + return 0; +} -- cgit From 2e39ac58720cba4fc6e889ec5f18a8ce1d67276c Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 23 Mar 2007 19:10:37 +0000 Subject: network: Fixed string/service id/uuid convertion functions --- network/common.c | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index 1649eb70..1be7bbe4 100644 --- a/network/common.c +++ b/network/common.c @@ -40,6 +40,10 @@ static int ctl; +#define PANU_UUID "00001115-0000-1000-8000-00805f9b34fb" +#define NAP_UUID "00001116-0000-1000-8000-00805f9b34fb" +#define GN_UUID "00001117-0000-1000-8000-00805f9b34fb" + /* Compatibility with old ioctls */ #define OLD_BNEPCONADD 1 #define OLD_BNEPCONDEL 2 @@ -52,32 +56,44 @@ static unsigned long bnepgetconnlist; static unsigned long bnepgetconninfo; static struct { - char *str; - uint16_t uuid; + const char *name; /* Friendly name */ + const char *uuid128; /* UUID 128 */ + uint16_t id; /* Service class identifier */ } __svc[] = { - { "PANU", BNEP_SVC_PANU }, - { "NAP", BNEP_SVC_NAP }, - { "GN", BNEP_SVC_GN }, + { "PANU", PANU_UUID, BNEP_SVC_PANU }, + { "GN", GN_UUID, BNEP_SVC_GN }, + { "NAP", NAP_UUID, BNEP_SVC_NAP }, { NULL } }; -int bnep_str2svc(char *svc, uint16_t *uuid) +uint16_t bnep_service_id(const char *svc) { int i; - for (i = 0; __svc[i].str; i++) - if (!strcasecmp(svc, __svc[i].str)) { - *uuid = __svc[i].uuid; - return 0; + + /* Friendly service name */ + for (i = 0; __svc[i].name; i++) + if (!strcasecmp(svc, __svc[i].name)) { + return __svc[i].id; + } + + /* UUID 128 string */ + for (i = 0; __svc[i].uuid128; i++) + if (!strcasecmp(svc, __svc[i].uuid128)) { + return __svc[i].id; } - return -1; + + /* FIXME: Missing HEX string verification */ + + return 0; } -char *bnep_svc2str(uint16_t uuid) +const char *bnep_uuid(uint16_t id) { int i; - for (i = 0; __svc[i].str; i++) - if (__svc[i].uuid == uuid) - return __svc[i].str; + + for (i = 0; __svc[i].uuid128; i++) + if (__svc[i].id == id) + return __svc[i].uuid128; return NULL; } -- cgit From 696c7534eca66f0dd64de6aba2ab26e8a4b66eea Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 23 Mar 2007 20:33:54 +0000 Subject: network: Added hexadecimal verification for Manager.CreateServer --- network/common.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index 1be7bbe4..7fbfee91 100644 --- a/network/common.c +++ b/network/common.c @@ -69,6 +69,7 @@ static struct { uint16_t bnep_service_id(const char *svc) { int i; + uint16_t id; /* Friendly service name */ for (i = 0; __svc[i].name; i++) @@ -82,9 +83,12 @@ uint16_t bnep_service_id(const char *svc) return __svc[i].id; } - /* FIXME: Missing HEX string verification */ + /* Try convert to HEX */ + id = strtol(svc, NULL, 16); + if ((id < BNEP_SVC_PANU) || (id > BNEP_SVC_GN)) + return 0; - return 0; + return id; } const char *bnep_uuid(uint16_t id) -- cgit From ef3649fd9e62bd989ff67a125a05c962d5640fd3 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 23 Mar 2007 21:04:08 +0000 Subject: network: using service class identifier instead of the uuid 128 string for server registration --- network/common.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index 7fbfee91..ec10cc34 100644 --- a/network/common.c +++ b/network/common.c @@ -60,9 +60,9 @@ static struct { const char *uuid128; /* UUID 128 */ uint16_t id; /* Service class identifier */ } __svc[] = { - { "PANU", PANU_UUID, BNEP_SVC_PANU }, - { "GN", GN_UUID, BNEP_SVC_GN }, - { "NAP", NAP_UUID, BNEP_SVC_NAP }, + { "panu", PANU_UUID, BNEP_SVC_PANU }, + { "gn", GN_UUID, BNEP_SVC_GN }, + { "nap", NAP_UUID, BNEP_SVC_NAP }, { NULL } }; @@ -101,6 +101,16 @@ const char *bnep_uuid(uint16_t id) return NULL; } +const char *bnep_name(uint16_t id) +{ + int i; + + for (i = 0; __svc[i].name; i++) + if (__svc[i].id == id) + return __svc[i].name; + return NULL; +} + int bnep_init(void) { ctl = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_BNEP); -- cgit From e7b6b11e91bb59eccf844abe4bb47b015b0c3cdf Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 27 Mar 2007 22:11:29 +0000 Subject: Get rid of old ioctl compability hack. --- network/common.c | 51 +++++++++------------------------------------------ 1 file changed, 9 insertions(+), 42 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index ec10cc34..593ea83c 100644 --- a/network/common.c +++ b/network/common.c @@ -44,17 +44,6 @@ static int ctl; #define NAP_UUID "00001116-0000-1000-8000-00805f9b34fb" #define GN_UUID "00001117-0000-1000-8000-00805f9b34fb" -/* Compatibility with old ioctls */ -#define OLD_BNEPCONADD 1 -#define OLD_BNEPCONDEL 2 -#define OLD_BNEPGETCONLIST 3 -#define OLD_BNEPGETCONINFO 4 - -static unsigned long bnepconnadd; -static unsigned long bnepconndel; -static unsigned long bnepgetconnlist; -static unsigned long bnepgetconninfo; - static struct { const char *name; /* Friendly name */ const char *uuid128; /* UUID 128 */ @@ -114,32 +103,10 @@ const char *bnep_name(uint16_t id) int bnep_init(void) { ctl = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_BNEP); + if (ctl < 0) { error("Failed to open control socket"); - return 1; - } - - /* Temporary ioctl compatibility hack */ - { - struct bnep_connlist_req req; - struct bnep_conninfo ci[1]; - - req.cnum = 1; - req.ci = ci; - - if (!ioctl(ctl, BNEPGETCONNLIST, &req)) { - /* New ioctls */ - bnepconnadd = BNEPCONNADD; - bnepconndel = BNEPCONNDEL; - bnepgetconnlist = BNEPGETCONNLIST; - bnepgetconninfo = BNEPGETCONNINFO; - } else { - /* Old ioctls */ - bnepconnadd = OLD_BNEPCONADD; - bnepconndel = OLD_BNEPCONDEL; - bnepgetconnlist = OLD_BNEPGETCONLIST; - bnepgetconninfo = OLD_BNEPGETCONINFO; - } + return -1; } return 0; @@ -151,14 +118,13 @@ int bnep_cleanup(void) return 0; } -int bnep_kill_connection(const char *addr) +int bnep_kill_connection(bdaddr_t *dst) { struct bnep_conndel_req req; - uint8_t *dst = (void *) strtoba(addr); - memcpy(req.dst, dst, ETH_ALEN); + baswap((bdaddr_t *)&req.dst, dst); req.flags = 0; - if (ioctl(ctl, bnepconndel, &req)) { + if (ioctl(ctl, BNEPCONNDEL, &req)) { error("Failed to kill connection"); return -1; } @@ -173,7 +139,7 @@ int bnep_kill_all_connections(void) req.cnum = 48; req.ci = ci; - if (ioctl(ctl, bnepgetconnlist, &req)) { + if (ioctl(ctl, BNEPGETCONNLIST, &req)) { error("Failed to get connection list"); return -1; } @@ -182,7 +148,8 @@ int bnep_kill_all_connections(void) struct bnep_conndel_req req; memcpy(req.dst, ci[i].dst, ETH_ALEN); req.flags = 0; - ioctl(ctl, bnepconndel, &req); + if (ioctl(ctl, BNEPCONNDEL, &req)) + error("Failed to kill connection"); } return 0; } @@ -195,7 +162,7 @@ int bnep_connadd(int sk, uint16_t role, char *dev) req.device[15] = '\0'; req.sock = sk; req.role = role; - if (ioctl(ctl, bnepconnadd, &req)) { + if (ioctl(ctl, BNEPCONNADD, &req)) { error("Failed to add device %s", dev); return -1; } -- cgit From fdacbf3a77476dc525425ee060bbf5809383b885 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Wed, 28 Mar 2007 15:24:22 +0000 Subject: network: Added more debug error information for ioctl BNEPCONNADD call --- network/common.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index 593ea83c..c486ad7f 100644 --- a/network/common.c +++ b/network/common.c @@ -163,8 +163,10 @@ int bnep_connadd(int sk, uint16_t role, char *dev) req.sock = sk; req.role = role; if (ioctl(ctl, BNEPCONNADD, &req)) { - error("Failed to add device %s", dev); - return -1; + int err = errno; + error("Failed to add device %s: %s(%d)", + dev, strerror(err), err); + return -err; } strncpy(dev, req.device, 16); return 0; -- cgit From ead055c1bc5bf032488d2b71838596a3e355a707 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 29 Mar 2007 13:33:27 +0000 Subject: Lower number of possible interfaces from 48 to 7 and other minor fixes. --- network/common.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index c486ad7f..d9f60374 100644 --- a/network/common.c +++ b/network/common.c @@ -105,8 +105,10 @@ int bnep_init(void) ctl = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_BNEP); if (ctl < 0) { - error("Failed to open control socket"); - return -1; + int err = errno; + error("Failed to open control socket: %s (%d)", + strerror(err), err); + return -err; } return 0; @@ -125,8 +127,10 @@ int bnep_kill_connection(bdaddr_t *dst) baswap((bdaddr_t *)&req.dst, dst); req.flags = 0; if (ioctl(ctl, BNEPCONNDEL, &req)) { - error("Failed to kill connection"); - return -1; + int err = errno; + error("Failed to kill connection: %s (%d)", + strerror(err), err); + return -err; } return 0; } @@ -134,22 +138,24 @@ int bnep_kill_connection(bdaddr_t *dst) int bnep_kill_all_connections(void) { struct bnep_connlist_req req; - struct bnep_conninfo ci[48]; + struct bnep_conninfo ci[7]; int i; - req.cnum = 48; + memset(&req, 0, sizeof(req)); + req.cnum = 7; req.ci = ci; if (ioctl(ctl, BNEPGETCONNLIST, &req)) { - error("Failed to get connection list"); - return -1; + int err = errno; + error("Failed to get connection list: %s (%d)", + strerror(err), err); + return -err; } for (i=0; i < req.cnum; i++) { struct bnep_conndel_req req; memcpy(req.dst, ci[i].dst, ETH_ALEN); req.flags = 0; - if (ioctl(ctl, BNEPCONNDEL, &req)) - error("Failed to kill connection"); + ioctl(ctl, BNEPCONNDEL, &req); } return 0; } -- cgit From ef29c39ffc97adc9893841165f9e9a3f6a1e9a0a Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Mon, 16 Apr 2007 20:54:02 +0000 Subject: Move code to bring up interface to common and use it on connection. --- network/common.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index d9f60374..0a11d306 100644 --- a/network/common.c +++ b/network/common.c @@ -30,6 +30,9 @@ #include #include #include +#include +#include +#include #include #include @@ -139,13 +142,13 @@ int bnep_kill_all_connections(void) { struct bnep_connlist_req req; struct bnep_conninfo ci[7]; - int i; + int i, err; memset(&req, 0, sizeof(req)); req.cnum = 7; req.ci = ci; if (ioctl(ctl, BNEPGETCONNLIST, &req)) { - int err = errno; + err = errno; error("Failed to get connection list: %s (%d)", strerror(err), err); return -err; @@ -168,12 +171,36 @@ int bnep_connadd(int sk, uint16_t role, char *dev) req.device[15] = '\0'; req.sock = sk; req.role = role; - if (ioctl(ctl, BNEPCONNADD, &req)) { + if (ioctl(ctl, BNEPCONNADD, &req) < 0) { int err = errno; error("Failed to add device %s: %s(%d)", dev, strerror(err), err); return -err; } + strncpy(dev, req.device, 16); return 0; } + +int bnep_if_up(const char *devname, int up) +{ + int sd, err; + struct ifreq ifr; + + sd = socket(AF_INET6, SOCK_DGRAM, 0); + strcpy(ifr.ifr_name, devname); + + if (up) + ifr.ifr_flags |= IFF_UP; + else + ifr.ifr_flags &= ~IFF_UP; + + if((ioctl(sd, SIOCSIFFLAGS, (caddr_t) &ifr)) < 0) { + err = errno; + error("Could not bring up %d. %s(%d)", devname, strerror(err), + err); + return -err; + } + + return 0; +} -- cgit From 1b9cc018822ca0edde9d0485c382a13a90253e43 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Wed, 29 Aug 2007 17:50:49 +0000 Subject: network: concat remote name and service name to the connection name --- network/common.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index 0a11d306..d818829a 100644 --- a/network/common.c +++ b/network/common.c @@ -40,6 +40,7 @@ #include "logging.h" #include "common.h" +#include "textfile.h" static int ctl; @@ -204,3 +205,21 @@ int bnep_if_up(const char *devname, int up) return 0; } + +int read_remote_name(bdaddr_t *src, bdaddr_t *dst, char *buf, size_t size) +{ + char filename[PATH_MAX + 1], addr[18], *str; + + ba2str(src, addr); + create_name(filename, PATH_MAX, STORAGEDIR, addr, "names"); + + ba2str(dst, addr); + str = textfile_get(filename, addr); + if (!str) + return -ENOENT; + + snprintf(buf, size, "%s", str); + free(str); + + return 0; +} -- cgit From a87f1daabf62c0f45dfb9e1c5f21cec75477d342 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 28 Sep 2007 13:21:42 +0000 Subject: Add support for script execution. --- network/common.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 88 insertions(+), 7 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index d818829a..dce12415 100644 --- a/network/common.c +++ b/network/common.c @@ -32,17 +32,21 @@ #include #include #include +#include #include #include #include #include +#include + #include "logging.h" #include "common.h" #include "textfile.h" static int ctl; +static GSList *pids; #define PANU_UUID "00001115-0000-1000-8000-00805f9b34fb" #define NAP_UUID "00001116-0000-1000-8000-00805f9b34fb" @@ -59,6 +63,27 @@ static struct { { NULL } }; +struct bnep_data { + char *devname; + int pid; +}; + +static void script_exited(GPid pid, gint status, gpointer data) +{ + struct bnep_data *bnep = data; + + if (WIFEXITED(status)) + debug("%d exited with status %d", pid, WEXITSTATUS(status)); + else + debug("%d was killed by signal %d", pid, WTERMSIG(status)); + + g_spawn_close_pid(pid); + pid = 0; + + g_free(bnep->devname); + pids = g_slist_remove(pids, bnep); +} + uint16_t bnep_service_id(const char *svc) { int i; @@ -183,26 +208,82 @@ int bnep_connadd(int sk, uint16_t role, char *dev) return 0; } -int bnep_if_up(const char *devname, int up) +static void bnep_setup(gpointer data) { - int sd, err; +} + +int bnep_if_up(const char *devname, const char *script) +{ + int sd, err, pid; struct ifreq ifr; + const char *argv[3]; + struct bnep_data *bnep; sd = socket(AF_INET6, SOCK_DGRAM, 0); + memset(&ifr, 0, sizeof(ifr)); strcpy(ifr.ifr_name, devname); - if (up) - ifr.ifr_flags |= IFF_UP; - else - ifr.ifr_flags &= ~IFF_UP; + ifr.ifr_flags |= IFF_UP; - if((ioctl(sd, SIOCSIFFLAGS, (caddr_t) &ifr)) < 0) { + if ((ioctl(sd, SIOCSIFFLAGS, (caddr_t) &ifr)) < 0) { err = errno; error("Could not bring up %d. %s(%d)", devname, strerror(err), err); return -err; } + if (!script) + return 0; + + argv[0] = script; + argv[1] = devname; + argv[2] = NULL; + if (!g_spawn_async(NULL, (char **) argv, NULL, + G_SPAWN_DO_NOT_REAP_CHILD, bnep_setup, + (gpointer) devname, &pid, NULL)) { + error("Unable to execute %s", argv[0]); + return -1; + } + + bnep = g_new0(struct bnep_data, 1); + bnep->devname = g_strdup(devname); + bnep->pid = pid; + pids = g_slist_append(pids, bnep); + g_child_watch_add(pid, script_exited, bnep); + + return pid; +} + +int bnep_if_down(const char *devname) +{ + int sd, err; + struct ifreq ifr; + GSList *l; + + sd = socket(AF_INET6, SOCK_DGRAM, 0); + memset(&ifr, 0, sizeof(ifr)); + strcpy(ifr.ifr_name, devname); + + ifr.ifr_flags &= ~IFF_UP; + + if ((ioctl(sd, SIOCSIFFLAGS, (caddr_t) &ifr)) < 0) { + err = errno; + error("Could not bring down %d. %s(%d)", devname, strerror(err), + err); + return -err; + } + + for(l = pids; l; l = g_slist_next(l)) { + struct bnep_data *bnep = l->data; + + if (strcmp(devname, bnep->devname) == 0) { + if (kill(bnep->pid, SIGTERM) < 0) + error("kill(%d, SIGTERM): %s (%d)", bnep->pid, + strerror(errno), errno); + break; + } + } + return 0; } -- cgit From 6113615ecfb8026a6a3ce0af38fc79ec8abec748 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 28 Sep 2007 13:23:51 +0000 Subject: Rework configuration file to use roles. --- network/common.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index dce12415..991073ec 100644 --- a/network/common.c +++ b/network/common.c @@ -63,6 +63,10 @@ static struct { { NULL } }; +static const char *panu = NULL; +static const char *gn = NULL; +static const char *nap = NULL; + struct bnep_data { char *devname; int pid; @@ -129,7 +133,8 @@ const char *bnep_name(uint16_t id) return NULL; } -int bnep_init(void) +int bnep_init(const char *panu_script, const char *gn_script, + const char *nap_script) { ctl = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_BNEP); @@ -140,6 +145,9 @@ int bnep_init(void) return -err; } + panu = panu_script; + gn = gn_script; + nap = nap_script; return 0; } @@ -212,11 +220,11 @@ static void bnep_setup(gpointer data) { } -int bnep_if_up(const char *devname, const char *script) +int bnep_if_up(const char *devname, uint16_t id) { int sd, err, pid; struct ifreq ifr; - const char *argv[3]; + const char *argv[3], *script; struct bnep_data *bnep; sd = socket(AF_INET6, SOCK_DGRAM, 0); @@ -232,6 +240,16 @@ int bnep_if_up(const char *devname, const char *script) return -err; } + if (!id) + return 0; + + if (id == BNEP_SVC_PANU) + script = panu; + else if (id == BNEP_SVC_GN) + script = gn; + else + script = nap; + if (!script) return 0; -- cgit From ec7083e9e5ba28b679f231c7bc341330feddf2ce Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 28 Sep 2007 13:25:27 +0000 Subject: Fixes codestyle, bridge creation and some code cleanup. --- network/common.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index 991073ec..96821f84 100644 --- a/network/common.c +++ b/network/common.c @@ -226,6 +226,7 @@ int bnep_if_up(const char *devname, uint16_t id) struct ifreq ifr; const char *argv[3], *script; struct bnep_data *bnep; + GSpawnFlags flags; sd = socket(AF_INET6, SOCK_DGRAM, 0); memset(&ifr, 0, sizeof(ifr)); @@ -256,8 +257,8 @@ int bnep_if_up(const char *devname, uint16_t id) argv[0] = script; argv[1] = devname; argv[2] = NULL; - if (!g_spawn_async(NULL, (char **) argv, NULL, - G_SPAWN_DO_NOT_REAP_CHILD, bnep_setup, + flags = G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH; + if (!g_spawn_async(NULL, (char **) argv, NULL, flags, bnep_setup, (gpointer) devname, &pid, NULL)) { error("Unable to execute %s", argv[0]); return -1; -- cgit From 76b8a8707dbb1887e94f812c4a9ca8b65d3353fd Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 28 Sep 2007 13:28:09 +0000 Subject: Fix interface down. --- network/common.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index 96821f84..d7174a18 100644 --- a/network/common.c +++ b/network/common.c @@ -279,6 +279,18 @@ int bnep_if_down(const char *devname) struct ifreq ifr; GSList *l; + for(l = pids; l; l = g_slist_next(l)) { + struct bnep_data *bnep = l->data; + + if (strcmp(devname, bnep->devname) == 0) { + if (kill(bnep->pid, SIGTERM) < 0) + error("kill(%d, SIGTERM): %s (%d)", bnep->pid, + strerror(errno), errno); + pids = g_slist_remove(pids, bnep); + break; + } + } + sd = socket(AF_INET6, SOCK_DGRAM, 0); memset(&ifr, 0, sizeof(ifr)); strcpy(ifr.ifr_name, devname); @@ -292,17 +304,6 @@ int bnep_if_down(const char *devname) return -err; } - for(l = pids; l; l = g_slist_next(l)) { - struct bnep_data *bnep = l->data; - - if (strcmp(devname, bnep->devname) == 0) { - if (kill(bnep->pid, SIGTERM) < 0) - error("kill(%d, SIGTERM): %s (%d)", bnep->pid, - strerror(errno), errno); - break; - } - } - return 0; } -- cgit From da7741d54263d6de3475b8c10db3c1dd3ebaebaf Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 28 Sep 2007 13:32:50 +0000 Subject: Improve bridge and network interfaces manipulation. --- network/common.c | 51 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 16 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index d7174a18..e634ac43 100644 --- a/network/common.c +++ b/network/common.c @@ -72,6 +72,14 @@ struct bnep_data { int pid; }; +static gint find_devname(gconstpointer a, gconstpointer b) +{ + struct bnep_data *data = (struct bnep_data *) a; + const char *devname = b; + + return strcmp(data->devname, devname); +} + static void script_exited(GPid pid, gint status, gpointer data) { struct bnep_data *bnep = data; @@ -228,6 +236,9 @@ int bnep_if_up(const char *devname, uint16_t id) struct bnep_data *bnep; GSpawnFlags flags; + if (g_slist_find_custom(pids, devname, find_devname)) + return 0; + sd = socket(AF_INET6, SOCK_DGRAM, 0); memset(&ifr, 0, sizeof(ifr)); strcpy(ifr.ifr_name, devname); @@ -241,8 +252,11 @@ int bnep_if_up(const char *devname, uint16_t id) return -err; } + bnep = g_new0(struct bnep_data, 1); + bnep->devname = g_strdup(devname); + if (!id) - return 0; + goto done; if (id == BNEP_SVC_PANU) script = panu; @@ -252,7 +266,7 @@ int bnep_if_up(const char *devname, uint16_t id) script = nap; if (!script) - return 0; + goto done; argv[0] = script; argv[1] = devname; @@ -261,34 +275,37 @@ int bnep_if_up(const char *devname, uint16_t id) if (!g_spawn_async(NULL, (char **) argv, NULL, flags, bnep_setup, (gpointer) devname, &pid, NULL)) { error("Unable to execute %s", argv[0]); - return -1; + return -EINVAL; } - bnep = g_new0(struct bnep_data, 1); - bnep->devname = g_strdup(devname); bnep->pid = pid; - pids = g_slist_append(pids, bnep); g_child_watch_add(pid, script_exited, bnep); - return pid; +done: + pids = g_slist_append(pids, bnep); + + return bnep->pid; } int bnep_if_down(const char *devname) { int sd, err; struct ifreq ifr; + struct bnep_data *data; GSList *l; - for(l = pids; l; l = g_slist_next(l)) { - struct bnep_data *bnep = l->data; + l = g_slist_find_custom(pids, devname, find_devname); + if (!l) + return 0; - if (strcmp(devname, bnep->devname) == 0) { - if (kill(bnep->pid, SIGTERM) < 0) - error("kill(%d, SIGTERM): %s (%d)", bnep->pid, - strerror(errno), errno); - pids = g_slist_remove(pids, bnep); - break; - } + data = l->data; + if (data->pid) { + err = kill(data->pid, SIGTERM); + if (err < 0) + error("kill(%d, SIGTERM): %s (%d)", data->pid, + strerror(errno), errno); + else + data->pid = 0; } sd = socket(AF_INET6, SOCK_DGRAM, 0); @@ -304,6 +321,8 @@ int bnep_if_down(const char *devname) return -err; } + pids = g_slist_remove(pids, data); + return 0; } -- cgit From f3314791b10f4c7ccc17ab4fd51c9642a670e0a7 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 28 Sep 2007 13:35:08 +0000 Subject: Fix interface removal on script exit. --- network/common.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index e634ac43..b5f42b19 100644 --- a/network/common.c +++ b/network/common.c @@ -89,11 +89,8 @@ static void script_exited(GPid pid, gint status, gpointer data) else debug("%d was killed by signal %d", pid, WTERMSIG(status)); - g_spawn_close_pid(pid); - pid = 0; - - g_free(bnep->devname); - pids = g_slist_remove(pids, bnep); + g_spawn_close_pid(bnep->pid); + bnep->pid = 0; } uint16_t bnep_service_id(const char *svc) -- cgit From 11275793e04e21cb7e26d6a7d289f98005a3c478 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 28 Sep 2007 13:39:38 +0000 Subject: Fix memory leak. --- network/common.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index b5f42b19..cf351153 100644 --- a/network/common.c +++ b/network/common.c @@ -82,15 +82,12 @@ static gint find_devname(gconstpointer a, gconstpointer b) static void script_exited(GPid pid, gint status, gpointer data) { - struct bnep_data *bnep = data; - if (WIFEXITED(status)) debug("%d exited with status %d", pid, WEXITSTATUS(status)); else debug("%d was killed by signal %d", pid, WTERMSIG(status)); - g_spawn_close_pid(bnep->pid); - bnep->pid = 0; + g_spawn_close_pid(pid); } uint16_t bnep_service_id(const char *svc) @@ -288,21 +285,19 @@ int bnep_if_down(const char *devname) { int sd, err; struct ifreq ifr; - struct bnep_data *data; + struct bnep_data *bnep; GSList *l; l = g_slist_find_custom(pids, devname, find_devname); if (!l) return 0; - data = l->data; - if (data->pid) { - err = kill(data->pid, SIGTERM); + bnep = l->data; + if (bnep->pid) { + err = kill(bnep->pid, SIGTERM); if (err < 0) - error("kill(%d, SIGTERM): %s (%d)", data->pid, + error("kill(%d, SIGTERM): %s (%d)", bnep->pid, strerror(errno), errno); - else - data->pid = 0; } sd = socket(AF_INET6, SOCK_DGRAM, 0); @@ -318,7 +313,9 @@ int bnep_if_down(const char *devname) return -err; } - pids = g_slist_remove(pids, data); + pids = g_slist_remove(pids, bnep); + g_free(bnep->devname); + g_free(bnep); return 0; } -- cgit From a67fa98d477404a1b65e283b646db77914106c35 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 31 Oct 2007 14:48:55 +0000 Subject: Remove bridge creation of NAP and make a better use of ahavi-autoipd. --- network/common.c | 85 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 68 insertions(+), 17 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index cf351153..7a88a1bd 100644 --- a/network/common.c +++ b/network/common.c @@ -69,6 +69,7 @@ static const char *nap = NULL; struct bnep_data { char *devname; + char *script; int pid; }; @@ -226,12 +227,29 @@ int bnep_if_up(const char *devname, uint16_t id) { int sd, err, pid; struct ifreq ifr; - const char *argv[3], *script; + const char *argv[5]; struct bnep_data *bnep; GSpawnFlags flags; + GSList *l; - if (g_slist_find_custom(pids, devname, find_devname)) - return 0; + /* Check if a script is running */ + if ((l = g_slist_find_custom(pids, devname, find_devname))) { + bnep = l->data; + + if (bnep->script && !strcmp(bnep->script, "avahi-autoipd")) { + argv[0] = bnep->script; + argv[1] = devname; + argv[2] = "--refresh"; + argv[3] = NULL; + + flags = G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH; + g_spawn_async(NULL, (char **) argv, NULL, flags, + bnep_setup, (gpointer) devname, &pid, + NULL); + + return bnep->pid; + } + } sd = socket(AF_INET6, SOCK_DGRAM, 0); memset(&ifr, 0, sizeof(ifr)); @@ -241,7 +259,7 @@ int bnep_if_up(const char *devname, uint16_t id) if ((ioctl(sd, SIOCSIFFLAGS, (caddr_t) &ifr)) < 0) { err = errno; - error("Could not bring up %d. %s(%d)", devname, strerror(err), + error("Could not bring up %s. %s(%d)", devname, strerror(err), err); return -err; } @@ -253,18 +271,25 @@ int bnep_if_up(const char *devname, uint16_t id) goto done; if (id == BNEP_SVC_PANU) - script = panu; + bnep->script = g_strdup(panu); else if (id == BNEP_SVC_GN) - script = gn; + bnep->script = g_strdup(gn); else - script = nap; + bnep->script = g_strdup(nap); - if (!script) + if (!bnep->script) goto done; - argv[0] = script; + argv[0] = bnep->script; argv[1] = devname; - argv[2] = NULL; + + if (!strcmp(bnep->script, "avahi-autoipd")) { + argv[2] = "--no-drop-root"; + argv[3] = "--no-chroot"; + argv[4] = NULL; + } else + argv[2] = NULL; + flags = G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH; if (!g_spawn_async(NULL, (char **) argv, NULL, flags, bnep_setup, (gpointer) devname, &pid, NULL)) { @@ -283,29 +308,49 @@ done: int bnep_if_down(const char *devname) { - int sd, err; + int sd, err, pid; struct ifreq ifr; struct bnep_data *bnep; GSList *l; + GSpawnFlags flags; + const char *argv[4]; l = g_slist_find_custom(pids, devname, find_devname); if (!l) return 0; bnep = l->data; - if (bnep->pid) { - err = kill(bnep->pid, SIGTERM); - if (err < 0) - error("kill(%d, SIGTERM): %s (%d)", bnep->pid, - strerror(errno), errno); + + if (!bnep->pid) + goto done; + + if (bnep->script && !strcmp (bnep->script, "avahi-autoipd")) { + argv[0] = bnep->script; + argv[1] = devname; + argv[2] = "--kill"; + argv[3] = NULL; + + flags = G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH; + g_spawn_async(NULL, (char **) argv, NULL, flags, bnep_setup, + (gpointer) devname, &pid, NULL); + + goto done; } + /* Kill script */ + err = kill(bnep->pid, SIGTERM); + if (err < 0) + error("kill(%d, SIGTERM): %s (%d)", bnep->pid, + strerror(errno), errno); + +done: sd = socket(AF_INET6, SOCK_DGRAM, 0); memset(&ifr, 0, sizeof(ifr)); strcpy(ifr.ifr_name, devname); ifr.ifr_flags &= ~IFF_UP; + /* Bring down the interface */ if ((ioctl(sd, SIOCSIFFLAGS, (caddr_t) &ifr)) < 0) { err = errno; error("Could not bring down %d. %s(%d)", devname, strerror(err), @@ -314,7 +359,13 @@ int bnep_if_down(const char *devname) } pids = g_slist_remove(pids, bnep); - g_free(bnep->devname); + + if (bnep->devname) + g_free(bnep->devname); + + if (bnep->script) + g_free(bnep->script); + g_free(bnep); return 0; -- cgit From 1884104ecb9b6b6a9ef6cc02d04e4861c9f1f6f6 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 31 Oct 2007 14:50:35 +0000 Subject: Add MULTICAST flag so interfaces could get announced by avahi-daemon. --- network/common.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index 7a88a1bd..c7610a47 100644 --- a/network/common.c +++ b/network/common.c @@ -246,9 +246,9 @@ int bnep_if_up(const char *devname, uint16_t id) g_spawn_async(NULL, (char **) argv, NULL, flags, bnep_setup, (gpointer) devname, &pid, NULL); - - return bnep->pid; } + + return bnep->pid; } sd = socket(AF_INET6, SOCK_DGRAM, 0); @@ -256,6 +256,7 @@ int bnep_if_up(const char *devname, uint16_t id) strcpy(ifr.ifr_name, devname); ifr.ifr_flags |= IFF_UP; + ifr.ifr_flags |= IFF_MULTICAST; if ((ioctl(sd, SIOCSIFFLAGS, (caddr_t) &ifr)) < 0) { err = errno; -- cgit From e823c15e43a6f924779e466d434c51157002d9ee Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 2 Feb 2008 03:37:05 +0000 Subject: Update copyright information --- network/common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index c7610a47..50105272 100644 --- a/network/common.c +++ b/network/common.c @@ -2,7 +2,7 @@ * * BlueZ - Bluetooth protocol stack for Linux * - * Copyright (C) 2004-2007 Marcel Holtmann + * Copyright (C) 2004-2008 Marcel Holtmann * * * This program is free software; you can redistribute it and/or modify -- cgit From d6f0804e827a829edb7faef9ddbd53332c1ad8cb Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 6 May 2008 21:46:05 +0000 Subject: Fix bug that prevent bnep interfaces to come up on reconnection. --- network/common.c | 64 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 30 deletions(-) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index 50105272..3d0fefb7 100644 --- a/network/common.c +++ b/network/common.c @@ -164,6 +164,7 @@ int bnep_kill_connection(bdaddr_t *dst) { struct bnep_conndel_req req; + memset(&req, 0, sizeof(req)); baswap((bdaddr_t *)&req.dst, dst); req.flags = 0; if (ioctl(ctl, BNEPCONNDEL, &req)) { @@ -192,10 +193,12 @@ int bnep_kill_all_connections(void) } for (i=0; i < req.cnum; i++) { - struct bnep_conndel_req req; - memcpy(req.dst, ci[i].dst, ETH_ALEN); - req.flags = 0; - ioctl(ctl, BNEPCONNDEL, &req); + struct bnep_conndel_req del; + + memset(&del, 0, sizeof(del)); + memcpy(del.dst, ci[i].dst, ETH_ALEN); + del.flags = 0; + ioctl(ctl, BNEPCONNDEL, &del); } return 0; } @@ -204,6 +207,7 @@ int bnep_connadd(int sk, uint16_t role, char *dev) { struct bnep_connadd_req req; + memset(&req, 0, sizeof(req)); strncpy(req.device, dev, 16); req.device[15] = '\0'; req.sock = sk; @@ -223,17 +227,31 @@ static void bnep_setup(gpointer data) { } +static int bnep_exec(const char **argv) +{ + int pid; + GSpawnFlags flags = G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH; + + if (!g_spawn_async(NULL, (char **) argv, NULL, flags, bnep_setup, NULL, + &pid, NULL)) { + error("Unable to execute %s %s", *argv[0], *argv[1]); + return -EINVAL; + } + + return pid; +} + int bnep_if_up(const char *devname, uint16_t id) { - int sd, err, pid; + int sd, err; struct ifreq ifr; const char *argv[5]; - struct bnep_data *bnep; - GSpawnFlags flags; + struct bnep_data *bnep = NULL; GSList *l; /* Check if a script is running */ - if ((l = g_slist_find_custom(pids, devname, find_devname))) { + l = g_slist_find_custom(pids, devname, find_devname); + if (l) { bnep = l->data; if (bnep->script && !strcmp(bnep->script, "avahi-autoipd")) { @@ -242,13 +260,8 @@ int bnep_if_up(const char *devname, uint16_t id) argv[2] = "--refresh"; argv[3] = NULL; - flags = G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH; - g_spawn_async(NULL, (char **) argv, NULL, flags, - bnep_setup, (gpointer) devname, &pid, - NULL); + bnep->pid = bnep_exec(argv); } - - return bnep->pid; } sd = socket(AF_INET6, SOCK_DGRAM, 0); @@ -265,6 +278,9 @@ int bnep_if_up(const char *devname, uint16_t id) return -err; } + if (bnep) + return bnep->pid; + bnep = g_new0(struct bnep_data, 1); bnep->devname = g_strdup(devname); @@ -291,15 +307,8 @@ int bnep_if_up(const char *devname, uint16_t id) } else argv[2] = NULL; - flags = G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH; - if (!g_spawn_async(NULL, (char **) argv, NULL, flags, bnep_setup, - (gpointer) devname, &pid, NULL)) { - error("Unable to execute %s", argv[0]); - return -EINVAL; - } - - bnep->pid = pid; - g_child_watch_add(pid, script_exited, bnep); + bnep->pid = bnep_exec(argv); + g_child_watch_add(bnep->pid, script_exited, bnep); done: pids = g_slist_append(pids, bnep); @@ -325,7 +334,7 @@ int bnep_if_down(const char *devname) if (!bnep->pid) goto done; - if (bnep->script && !strcmp (bnep->script, "avahi-autoipd")) { + if (bnep->script && !strcmp(bnep->script, "avahi-autoipd")) { argv[0] = bnep->script; argv[1] = devname; argv[2] = "--kill"; @@ -352,12 +361,7 @@ done: ifr.ifr_flags &= ~IFF_UP; /* Bring down the interface */ - if ((ioctl(sd, SIOCSIFFLAGS, (caddr_t) &ifr)) < 0) { - err = errno; - error("Could not bring down %d. %s(%d)", devname, strerror(err), - err); - return -err; - } + ioctl(sd, SIOCSIFFLAGS, (caddr_t) &ifr); pids = g_slist_remove(pids, bnep); -- cgit From 30751fe0c0430e0757c018de4f8e6bceee5e85f7 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 20 May 2008 21:54:12 +0000 Subject: Fix issues with missing include for PATH_MAX --- network/common.c | 1 + 1 file changed, 1 insertion(+) (limited to 'network/common.c') diff --git a/network/common.c b/network/common.c index 3d0fefb7..f1dbe1c5 100644 --- a/network/common.c +++ b/network/common.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include -- cgit