diff options
| -rw-r--r-- | network/bridge.c | 10 | ||||
| -rw-r--r-- | network/common.c | 51 | ||||
| -rw-r--r-- | network/network.conf | 6 | ||||
| -rw-r--r-- | network/server.c | 6 | 
4 files changed, 46 insertions, 27 deletions
| diff --git a/network/bridge.c b/network/bridge.c index e481ca80..ad4fc72e 100644 --- a/network/bridge.c +++ b/network/bridge.c @@ -101,6 +101,7 @@ int bridge_remove(int id)  int bridge_add_interface(int id, const char *dev)  {  	struct ifreq ifr; +	int err;  	int ifindex = if_nametoindex(dev);  	const char *name = bridge_get_name(id); @@ -113,8 +114,13 @@ int bridge_add_interface(int id, const char *dev)  	strncpy(ifr.ifr_name, name, IFNAMSIZ);  	ifr.ifr_ifindex = ifindex; -	if (ioctl(bridge_socket, SIOCBRADDIF, &ifr) < 0) -		return -errno; +	err = ioctl(bridge_socket, SIOCBRADDIF, &ifr); +	if (err < 0) +		return err; + +	err = bnep_if_up(name, id); +	if (err < 0) +		return err;  	return 0;  } 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;  } diff --git a/network/network.conf b/network/network.conf index 51a873e7..8677bd7b 100644 --- a/network/network.conf +++ b/network/network.conf @@ -18,7 +18,7 @@  #Interface=  # PAN user connection interface up script. default:none -#Script=avahi-autoipd +Script=avahi-autoipd  [GN Role] @@ -26,7 +26,7 @@  #Interface=  # Group Network connection interface up script. default:none -#Script=avahi-autoipd +Script=avahi-autoipd  [NAP Role] @@ -34,4 +34,4 @@  #Interface=  # Network Access Point connection interface up script. default:none -#Script=dhclient +Script=dhclient diff --git a/network/server.c b/network/server.c index ac87ad19..a349bc32 100644 --- a/network/server.c +++ b/network/server.c @@ -80,7 +80,6 @@ struct network_server {  	char		*path;		/* D-Bus path */  	gboolean	enable;		/* Enable flag */  	gboolean	secure;		/* Security flag */ -	gboolean	up;		/* Interface up flag */  	uint32_t	record_id;	/* Service record id */  	uint16_t	id;		/* Service class identifier */  	GSList		*clients;	/* Active connections */ @@ -346,11 +345,6 @@ static void authorization_callback(DBusPendingCall *pcall, void *data)  		}  		bnep_if_up(devname, 0); -		if (!ns->up) { -			bnep_if_up(bridge, ns->id); -			ns->iface = g_strdup(bridge); -			ns->up = TRUE; -		}  	} else  		bnep_if_up(devname, ns->id); | 
