summaryrefslogtreecommitdiffstats
path: root/network/common.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2007-09-28 13:32:50 +0000
committerLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2007-09-28 13:32:50 +0000
commitda7741d54263d6de3475b8c10db3c1dd3ebaebaf (patch)
tree20eed92b955623017d616241d9ca6a8de7e0fb36 /network/common.c
parent123ef726b4bb5c465cd8a5e7b7c003e55443b219 (diff)
Improve bridge and network interfaces manipulation.
Diffstat (limited to 'network/common.c')
-rw-r--r--network/common.c51
1 files changed, 35 insertions, 16 deletions
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;
}