--- network/server.c.orig 2008-02-10 21:38:30.000000000 +0200 +++ network/server.c 2008-04-29 22:39:37.000000000 +0300 @@ -344,7 +344,7 @@ goto failed; } - bnep_if_up(devname, 0); + bnep_if_up(devname, ns->id); } else bnep_if_up(devname, ns->id); --- network/common.c.orig 2008-02-02 01:16:33.000000000 +0200 +++ network/common.c 2008-04-29 23:27:07.000000000 +0300 @@ -81,13 +81,34 @@ return strcmp(data->devname, devname); } -static void script_exited(GPid pid, gint status, gpointer data) +static gint find_devname_by_pid(gconstpointer a, gconstpointer b) { + struct bnep_data *data = (struct bnep_data *) a; + const GPid* pid= (GPid*)b; + + if(data->pid == *pid) return 0; + if(data->pid > *pid) return 1; + if(data->pid < *pid) return -1; +} + +static void script_exited(GPid pid, gint status, gpointer data) +{ + struct bnep_data *bnep; + if (WIFEXITED(status)) debug("%d exited with status %d", pid, WEXITSTATUS(status)); else debug("%d was killed by signal %d", pid, WTERMSIG(status)); - + + + GSList* l = g_slist_find_custom(pids, &pid, find_devname_by_pid); + + bnep = l->data; + + info("Resetting PID - %s %d", bnep->devname, bnep->pid); + + bnep->pid = 0; + g_spawn_close_pid(pid); } @@ -231,24 +252,27 @@ struct bnep_data *bnep; GSpawnFlags flags; 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 != NULL ) { 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); + if(bnep->pid != 0) { + 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); + } + info("%s script is running", devname); + return bnep->pid; } - - return bnep->pid; } sd = socket(AF_INET6, SOCK_DGRAM, 0); @@ -315,7 +339,7 @@ GSList *l; GSpawnFlags flags; const char *argv[4]; - + info("bringing down %s", devname); l = g_slist_find_custom(pids, devname, find_devname); if (!l) return 0;