2005-04-06 Dan Williams <dcbw@redhat.com>

Add debug code for socket/file descriptor leaks.  We register every socket
	that we open (except for stuff in dhcpcd/) for tracking, and print out the
	list of sockets that we forgot to close on shutdown.  This also consolidates
	about 4 places where we opened sockets into 1 function in NetworkManagerUtils.c


git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@559 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
Dan Williams
2005-04-06 16:45:48 +00:00
parent 04c1ebf3d5
commit 7136220856
7 changed files with 349 additions and 226 deletions

View File

@@ -1,3 +1,10 @@
2005-04-06 Dan Williams <dcbw@redhat.com>
Add debug code for socket/file descriptor leaks. We register every socket
that we open (except for stuff in dhcpcd/) for tracking, and print out the
list of sockets that we forgot to close on shutdown. This also consolidates
about 4 places where we opened sockets into 1 function in NetworkManagerUtils.c
2005-04-06 Dan Williams <dcbw@redhat.com> 2005-04-06 Dan Williams <dcbw@redhat.com>
* dhcpcd/dhcpcd.c * dhcpcd/dhcpcd.c

View File

@@ -925,6 +925,8 @@ int main( int argc, char *argv[] )
/* Wheeee!!! */ /* Wheeee!!! */
g_main_loop_run (nm_data->main_loop); g_main_loop_run (nm_data->main_loop);
nm_print_open_socks ();
/* Cleanup */ /* Cleanup */
libhal_ctx_shutdown (nm_data->hal_ctx, &dbus_error); libhal_ctx_shutdown (nm_data->hal_ctx, &dbus_error);

View File

@@ -76,10 +76,10 @@ typedef struct
*/ */
static gboolean nm_device_test_wireless_extensions (NMDevice *dev) static gboolean nm_device_test_wireless_extensions (NMDevice *dev)
{ {
int sk; int err = -1;
int err; char ioctl_buf[64];
char ioctl_buf[64]; NMSock *sk;
g_return_val_if_fail (dev != NULL, FALSE); g_return_val_if_fail (dev != NULL, FALSE);
/* We obviously cannot probe test devices (since they don't /* We obviously cannot probe test devices (since they don't
@@ -89,11 +89,13 @@ static gboolean nm_device_test_wireless_extensions (NMDevice *dev)
return (FALSE); return (FALSE);
ioctl_buf[63] = 0; ioctl_buf[63] = 0;
strncpy(ioctl_buf, nm_device_get_iface(dev), 63); strncpy (ioctl_buf, nm_device_get_iface(dev), 63);
sk = iw_sockets_open (); if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
err = ioctl(sk, SIOCGIWNAME, ioctl_buf); {
close (sk); err = ioctl (nm_dev_sock_get_fd (sk), SIOCGIWNAME, ioctl_buf);
nm_dev_sock_close (sk);
}
return (err == 0); return (err == 0);
} }
@@ -106,10 +108,10 @@ static gboolean nm_device_test_wireless_extensions (NMDevice *dev)
*/ */
static gboolean nm_device_supports_wireless_scan (NMDevice *dev) static gboolean nm_device_supports_wireless_scan (NMDevice *dev)
{ {
int sk; NMSock *sk;
int err; int err;
gboolean can_scan = TRUE; gboolean can_scan = TRUE;
wireless_scan_head scan_data; wireless_scan_head scan_data;
g_return_val_if_fail (dev != NULL, FALSE); g_return_val_if_fail (dev != NULL, FALSE);
g_return_val_if_fail (dev->type == DEVICE_TYPE_WIRELESS_ETHERNET, FALSE); g_return_val_if_fail (dev->type == DEVICE_TYPE_WIRELESS_ETHERNET, FALSE);
@@ -117,13 +119,15 @@ static gboolean nm_device_supports_wireless_scan (NMDevice *dev)
/* A test wireless device can always scan (we generate fake scan data for it) */ /* A test wireless device can always scan (we generate fake scan data for it) */
if (dev->test_device) if (dev->test_device)
return (TRUE); return (TRUE);
sk = iw_sockets_open (); if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
err = iw_scan (sk, (char *)nm_device_get_iface (dev), WIRELESS_EXT, &scan_data); {
nm_dispose_scan_results (scan_data.result); err = iw_scan (nm_dev_sock_get_fd (sk), (char *)nm_device_get_iface (dev), WIRELESS_EXT, &scan_data);
if ((err == -1) && (errno == EOPNOTSUPP)) nm_dispose_scan_results (scan_data.result);
can_scan = FALSE; if ((err == -1) && (errno == EOPNOTSUPP))
close (sk); can_scan = FALSE;
nm_dev_sock_close (sk);
}
return (can_scan); return (can_scan);
} }
@@ -308,7 +312,7 @@ NMDevice *nm_device_new (const char *iface, const char *udi, gboolean test_dev,
/* Initialize wireless-specific options */ /* Initialize wireless-specific options */
if (nm_device_is_wireless (dev)) if (nm_device_is_wireless (dev))
{ {
int sk; NMSock *sk;
NMDeviceWirelessOptions *opts = &(dev->options.wireless); NMDeviceWirelessOptions *opts = &(dev->options.wireless);
nm_device_set_mode (dev, NETWORK_MODE_INFRA); nm_device_set_mode (dev, NETWORK_MODE_INFRA);
@@ -332,10 +336,10 @@ NMDevice *nm_device_new (const char *iface, const char *udi, gboolean test_dev,
if (opts->supports_wireless_scan == FALSE) if (opts->supports_wireless_scan == FALSE)
nm_device_copy_allowed_to_dev_list (dev, app_data->allowed_ap_list); nm_device_copy_allowed_to_dev_list (dev, app_data->allowed_ap_list);
if ((sk = iw_sockets_open ()) >= 0) if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
{ {
iwrange range; iwrange range;
if (iw_get_range_info (sk, nm_device_get_iface (dev), &range) >= 0) if (iw_get_range_info (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), &range) >= 0)
{ {
int i; int i;
@@ -353,7 +357,7 @@ NMDevice *nm_device_new (const char *iface, const char *udi, gboolean test_dev,
for (i = 0; i < opts->num_freqs; i++) for (i = 0; i < opts->num_freqs; i++)
opts->freqs[i] = iw_freq2float (&(range.freq[i])); opts->freqs[i] = iw_freq2float (&(range.freq[i]));
} }
close (sk); nm_dev_sock_close (sk);
} }
} }
else if (nm_device_is_wired (dev)) else if (nm_device_is_wired (dev))
@@ -557,32 +561,6 @@ void nm_device_set_removed (NMDevice *dev, const gboolean removed)
} }
/*
* nm_device_open_sock
*
* Get a control socket for network operations.
*
*/
int nm_device_open_sock (void)
{
int fd;
/* Try to grab a control socket */
fd = socket(PF_INET, SOCK_DGRAM, 0);
if (fd >= 0)
return (fd);
fd = socket(PF_PACKET, SOCK_DGRAM, 0);
if (fd >= 0)
return (fd);
fd = socket(PF_INET6, SOCK_DGRAM, 0);
if (fd >= 0)
return (fd);
nm_warning ("could not get network control socket.");
return (-1);
}
/* /*
* Return the amount of time we should wait for the device * Return the amount of time we should wait for the device
* to get a link, based on the # of frequencies it has to * to get a link, based on the # of frequencies it has to
@@ -757,9 +735,9 @@ gboolean nm_device_get_supports_carrier_detect (NMDevice *dev)
*/ */
static gboolean nm_device_wireless_is_associated (NMDevice *dev) static gboolean nm_device_wireless_is_associated (NMDevice *dev)
{ {
struct iwreq wrq; struct iwreq wrq;
int sk; NMSock *sk;
gboolean associated = FALSE; gboolean associated = FALSE;
g_return_val_if_fail (dev != NULL, FALSE); g_return_val_if_fail (dev != NULL, FALSE);
g_return_val_if_fail (dev->app_data != NULL, FALSE); g_return_val_if_fail (dev->app_data != NULL, FALSE);
@@ -768,13 +746,13 @@ static gboolean nm_device_wireless_is_associated (NMDevice *dev)
if (dev->test_device) if (dev->test_device)
return (nm_device_has_active_link (dev)); return (nm_device_has_active_link (dev));
if ((sk = iw_sockets_open ()) < 0) if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)) == NULL)
return (FALSE); return (FALSE);
/* Some cards, for example ipw2x00 cards, can short-circuit the MAC /* Some cards, for example ipw2x00 cards, can short-circuit the MAC
* address check using this check on IWNAME. Its faster. * address check using this check on IWNAME. Its faster.
*/ */
if (iw_get_ext (sk, nm_device_get_iface (dev), SIOCGIWNAME, &wrq) >= 0) if (iw_get_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCGIWNAME, &wrq) >= 0)
{ {
if (!strcmp(wrq.u.name, "unassociated")) if (!strcmp(wrq.u.name, "unassociated"))
{ {
@@ -791,13 +769,13 @@ static gboolean nm_device_wireless_is_associated (NMDevice *dev)
* Is there a better way? Some cards don't work too well with this check, ie * Is there a better way? Some cards don't work too well with this check, ie
* Lucent WaveLAN. * Lucent WaveLAN.
*/ */
if (iw_get_ext (sk, nm_device_get_iface (dev), SIOCGIWAP, &wrq) >= 0) if (iw_get_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCGIWAP, &wrq) >= 0)
if (nm_ethernet_address_is_valid ((struct ether_addr *)(&(wrq.u.ap_addr.sa_data)))) if (nm_ethernet_address_is_valid ((struct ether_addr *)(&(wrq.u.ap_addr.sa_data))))
associated = TRUE; associated = TRUE;
} }
out: out:
close (sk); nm_dev_sock_close (sk);
return (associated); return (associated);
} }
@@ -917,8 +895,8 @@ void nm_device_update_link_state (NMDevice *dev)
*/ */
char * nm_device_get_essid (NMDevice *dev) char * nm_device_get_essid (NMDevice *dev)
{ {
int sk; NMSock *sk;
int err; int err;
g_return_val_if_fail (dev != NULL, NULL); g_return_val_if_fail (dev != NULL, NULL);
g_return_val_if_fail (nm_device_is_wireless (dev), NULL); g_return_val_if_fail (nm_device_is_wireless (dev), NULL);
@@ -940,12 +918,11 @@ char * nm_device_get_essid (NMDevice *dev)
return (essid); return (essid);
} }
sk = iw_sockets_open (); if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
if (sk >= 0)
{ {
wireless_config info; wireless_config info;
err = iw_get_basic_config(sk, nm_device_get_iface (dev), &info); err = iw_get_basic_config (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), &info);
if (err >= 0) if (err >= 0)
{ {
if (dev->options.wireless.cur_essid) if (dev->options.wireless.cur_essid)
@@ -955,7 +932,7 @@ char * nm_device_get_essid (NMDevice *dev)
else else
nm_warning ("nm_device_get_essid(): error getting ESSID for device %s. errno = %d", nm_device_get_iface (dev), errno); nm_warning ("nm_device_get_essid(): error getting ESSID for device %s. errno = %d", nm_device_get_iface (dev), errno);
close (sk); nm_dev_sock_close (sk);
} }
return (dev->options.wireless.cur_essid); return (dev->options.wireless.cur_essid);
@@ -969,10 +946,10 @@ char * nm_device_get_essid (NMDevice *dev)
*/ */
void nm_device_set_essid (NMDevice *dev, const char *essid) void nm_device_set_essid (NMDevice *dev, const char *essid)
{ {
int sk; NMSock *sk;
int err; int err;
struct iwreq wreq; struct iwreq wreq;
unsigned char safe_essid[IW_ESSID_MAX_SIZE + 1] = "\0"; unsigned char safe_essid[IW_ESSID_MAX_SIZE + 1] = "\0";
g_return_if_fail (dev != NULL); g_return_if_fail (dev != NULL);
g_return_if_fail (nm_device_is_wireless (dev)); g_return_if_fail (nm_device_is_wireless (dev));
@@ -995,18 +972,17 @@ void nm_device_set_essid (NMDevice *dev, const char *essid)
safe_essid[IW_ESSID_MAX_SIZE] = '\0'; safe_essid[IW_ESSID_MAX_SIZE] = '\0';
} }
sk = iw_sockets_open (); if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
if (sk >= 0)
{ {
wreq.u.essid.pointer = (caddr_t) safe_essid; wreq.u.essid.pointer = (caddr_t) safe_essid;
wreq.u.essid.length = strlen (safe_essid) + 1; wreq.u.essid.length = strlen (safe_essid) + 1;
wreq.u.essid.flags = 1; /* Enable essid on card */ wreq.u.essid.flags = 1; /* Enable essid on card */
err = iw_set_ext (sk, nm_device_get_iface (dev), SIOCSIWESSID, &wreq); err = iw_set_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCSIWESSID, &wreq);
if (err == -1) if (err == -1)
nm_warning ("nm_device_set_essid(): error setting ESSID '%s' for device %s. errno = %d", safe_essid, nm_device_get_iface (dev), errno); nm_warning ("nm_device_set_essid(): error setting ESSID '%s' for device %s. errno = %d", safe_essid, nm_device_get_iface (dev), errno);
close (sk); nm_dev_sock_close (sk);
/* Orinoco cards seem to need extra time here to not screw /* Orinoco cards seem to need extra time here to not screw
* up the firmware, which reboots when you set the ESSID. * up the firmware, which reboots when you set the ESSID.
@@ -1026,9 +1002,9 @@ void nm_device_set_essid (NMDevice *dev, const char *essid)
*/ */
double nm_device_get_frequency (NMDevice *dev) double nm_device_get_frequency (NMDevice *dev)
{ {
int sk; NMSock *sk;
int err; int err;
double freq = 0; double freq = 0;
g_return_val_if_fail (dev != NULL, 0); g_return_val_if_fail (dev != NULL, 0);
g_return_val_if_fail (nm_device_is_wireless (dev), 0); g_return_val_if_fail (nm_device_is_wireless (dev), 0);
@@ -1037,18 +1013,17 @@ double nm_device_get_frequency (NMDevice *dev)
if (dev->test_device) if (dev->test_device)
return 703000000; return 703000000;
sk = iw_sockets_open (); if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
if (sk >= 0)
{ {
struct iwreq wrq; struct iwreq wrq;
err = iw_get_ext (sk, nm_device_get_iface (dev), SIOCGIWFREQ, &wrq); err = iw_get_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCGIWFREQ, &wrq);
if (err >= 0) if (err >= 0)
freq = iw_freq2float (&wrq.u.freq); freq = iw_freq2float (&wrq.u.freq);
if (err == -1) if (err == -1)
nm_warning ("nm_device_get_frequency(): error getting frequency for device %s. errno = %d", nm_device_get_iface (dev), errno); nm_warning ("nm_device_get_frequency(): error getting frequency for device %s. errno = %d", nm_device_get_iface (dev), errno);
close (sk); nm_dev_sock_close (sk);
} }
return (freq); return (freq);
} }
@@ -1063,8 +1038,8 @@ double nm_device_get_frequency (NMDevice *dev)
*/ */
void nm_device_set_frequency (NMDevice *dev, const double freq) void nm_device_set_frequency (NMDevice *dev, const double freq)
{ {
int sk; NMSock *sk;
int err; int err;
/* HACK FOR NOW */ /* HACK FOR NOW */
if (freq <= 0) if (freq <= 0)
@@ -1080,8 +1055,7 @@ void nm_device_set_frequency (NMDevice *dev, const double freq)
if (nm_device_get_frequency (dev) == freq) if (nm_device_get_frequency (dev) == freq)
return; return;
sk = iw_sockets_open (); if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
if (sk >= 0)
{ {
struct iwreq wrq; struct iwreq wrq;
@@ -1111,7 +1085,7 @@ void nm_device_set_frequency (NMDevice *dev, const double freq)
wrq.u.freq.flags = IW_FREQ_FIXED; wrq.u.freq.flags = IW_FREQ_FIXED;
iw_float2freq (freq, &wrq.u.freq); iw_float2freq (freq, &wrq.u.freq);
} }
err = iw_set_ext (sk, nm_device_get_iface (dev), SIOCSIWFREQ, &wrq); err = iw_set_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCSIWFREQ, &wrq);
if (err == -1) if (err == -1)
{ {
gboolean success = FALSE; gboolean success = FALSE;
@@ -1121,12 +1095,12 @@ void nm_device_set_frequency (NMDevice *dev, const double freq)
wrq.u.freq.m = -1; wrq.u.freq.m = -1;
wrq.u.freq.e = 0; wrq.u.freq.e = 0;
wrq.u.freq.flags = 0; wrq.u.freq.flags = 0;
if (iw_set_ext (sk, nm_device_get_iface (dev), SIOCSIWFREQ, &wrq) != -1) if (iw_set_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCSIWFREQ, &wrq) != -1)
success = TRUE; success = TRUE;
} }
} }
close (sk); nm_dev_sock_close (sk);
} }
} }
@@ -1140,9 +1114,9 @@ void nm_device_set_frequency (NMDevice *dev, const double freq)
*/ */
int nm_device_get_bitrate (NMDevice *dev) int nm_device_get_bitrate (NMDevice *dev)
{ {
int sk; NMSock *sk;
int err = -1; int err = -1;
struct iwreq wrq; struct iwreq wrq;
g_return_val_if_fail (dev != NULL, 0); g_return_val_if_fail (dev != NULL, 0);
g_return_val_if_fail (nm_device_is_wireless (dev), 0); g_return_val_if_fail (nm_device_is_wireless (dev), 0);
@@ -1151,11 +1125,10 @@ int nm_device_get_bitrate (NMDevice *dev)
if (dev->test_device) if (dev->test_device)
return 11; return 11;
sk = iw_sockets_open (); if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
if (sk >= 0)
{ {
err = iw_get_ext (sk, nm_device_get_iface (dev), SIOCGIWRATE, &wrq); err = iw_get_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCGIWRATE, &wrq);
close (sk); nm_dev_sock_close (sk);
} }
return ((err >= 0) ? wrq.u.bitrate.value / 1000 : 0); return ((err >= 0) ? wrq.u.bitrate.value / 1000 : 0);
@@ -1171,7 +1144,7 @@ int nm_device_get_bitrate (NMDevice *dev)
*/ */
void nm_device_set_bitrate (NMDevice *dev, const int Mbps) void nm_device_set_bitrate (NMDevice *dev, const int Mbps)
{ {
int sk; NMSock *sk;
g_return_if_fail (dev != NULL); g_return_if_fail (dev != NULL);
g_return_if_fail (nm_device_is_wireless (dev)); g_return_if_fail (nm_device_is_wireless (dev));
@@ -1183,8 +1156,7 @@ void nm_device_set_bitrate (NMDevice *dev, const int Mbps)
if (nm_device_get_bitrate (dev) == Mbps) if (nm_device_get_bitrate (dev) == Mbps)
return; return;
sk = iw_sockets_open (); if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
if (sk >= 0)
{ {
struct iwreq wrq; struct iwreq wrq;
@@ -1200,9 +1172,9 @@ void nm_device_set_bitrate (NMDevice *dev, const int Mbps)
wrq.u.bitrate.fixed = 0; wrq.u.bitrate.fixed = 0;
} }
/* Silently fail as not all drivers support setting bitrate yet (ipw2x00 for example) */ /* Silently fail as not all drivers support setting bitrate yet (ipw2x00 for example) */
iw_set_ext (sk, nm_device_get_iface (dev), SIOCSIWRATE, &wrq); iw_set_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCSIWRATE, &wrq);
close (sk); nm_dev_sock_close (sk);
} }
} }
@@ -1215,8 +1187,8 @@ void nm_device_set_bitrate (NMDevice *dev, const int Mbps)
*/ */
void nm_device_get_ap_address (NMDevice *dev, struct ether_addr *addr) void nm_device_get_ap_address (NMDevice *dev, struct ether_addr *addr)
{ {
int iwlib_socket; NMSock *sk;
struct iwreq wrq; struct iwreq wrq;
g_return_if_fail (dev != NULL); g_return_if_fail (dev != NULL);
g_return_if_fail (addr != NULL); g_return_if_fail (addr != NULL);
@@ -1235,12 +1207,14 @@ void nm_device_get_ap_address (NMDevice *dev, struct ether_addr *addr)
return; return;
} }
iwlib_socket = iw_sockets_open (); if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
if (iw_get_ext (iwlib_socket, nm_device_get_iface (dev), SIOCGIWAP, &wrq) >= 0) {
memcpy (addr, &(wrq.u.ap_addr.sa_data), sizeof (struct ether_addr)); if (iw_get_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCGIWAP, &wrq) >= 0)
else memcpy (addr, &(wrq.u.ap_addr.sa_data), sizeof (struct ether_addr));
memset (addr, 0, sizeof (struct ether_addr)); else
close (iwlib_socket); memset (addr, 0, sizeof (struct ether_addr));
nm_dev_sock_close (sk);
}
} }
@@ -1255,7 +1229,7 @@ void nm_device_get_ap_address (NMDevice *dev, struct ether_addr *addr)
*/ */
void nm_device_set_enc_key (NMDevice *dev, const char *key, NMDeviceAuthMethod auth_method) void nm_device_set_enc_key (NMDevice *dev, const char *key, NMDeviceAuthMethod auth_method)
{ {
int sk; NMSock *sk;
int err; int err;
struct iwreq wreq; struct iwreq wreq;
int keylen; int keylen;
@@ -1278,8 +1252,7 @@ void nm_device_set_enc_key (NMDevice *dev, const char *key, NMDeviceAuthMethod a
safe_key[IW_ENCODING_TOKEN_MAX] = '\0'; safe_key[IW_ENCODING_TOKEN_MAX] = '\0';
} }
sk = iw_sockets_open (); if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
if (sk >= 0)
{ {
wreq.u.data.pointer = (caddr_t) NULL; wreq.u.data.pointer = (caddr_t) NULL;
wreq.u.data.length = 0; wreq.u.data.length = 0;
@@ -1300,7 +1273,7 @@ void nm_device_set_enc_key (NMDevice *dev, const char *key, NMDeviceAuthMethod a
{ {
unsigned char parsed_key[IW_ENCODING_TOKEN_MAX + 1]; unsigned char parsed_key[IW_ENCODING_TOKEN_MAX + 1];
keylen = iw_in_key_full (sk, nm_device_get_iface (dev), safe_key, &parsed_key[0], &wreq.u.data.flags); keylen = iw_in_key_full (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), safe_key, &parsed_key[0], &wreq.u.data.flags);
if (keylen > 0) if (keylen > 0)
{ {
switch (auth_method) switch (auth_method)
@@ -1323,12 +1296,11 @@ void nm_device_set_enc_key (NMDevice *dev, const char *key, NMDeviceAuthMethod a
if (set_key) if (set_key)
{ {
err = iw_set_ext (sk, nm_device_get_iface (dev), SIOCSIWENCODE, &wreq); if (iw_set_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCSIWENCODE, &wreq) == -1)
if (err == -1)
nm_warning ("nm_device_set_enc_key(): error setting key for device %s. errno = %d", nm_device_get_iface (dev), errno); nm_warning ("nm_device_set_enc_key(): error setting key for device %s. errno = %d", nm_device_get_iface (dev), errno);
} }
close (sk); nm_dev_sock_close (sk);
} else nm_warning ("nm_device_set_enc_key(): could not get wireless control socket."); } else nm_warning ("nm_device_set_enc_key(): could not get wireless control socket.");
} }
@@ -1362,8 +1334,8 @@ gint8 nm_device_get_signal_strength (NMDevice *dev)
*/ */
void nm_device_update_signal_strength (NMDevice *dev) void nm_device_update_signal_strength (NMDevice *dev)
{ {
gboolean has_range; gboolean has_range = FALSE;
int sk; NMSock *sk;
iwrange range; iwrange range;
iwstats stats; iwstats stats;
int percent = -1; int percent = -1;
@@ -1392,14 +1364,16 @@ void nm_device_update_signal_strength (NMDevice *dev)
goto out; goto out;
} }
sk = iw_sockets_open (); if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
has_range = (iw_get_range_info (sk, nm_device_get_iface (dev), &range) >= 0);
if (iw_get_stats (sk, nm_device_get_iface (dev), &stats, &range, has_range) == 0)
{ {
percent = nm_wireless_qual_to_percent (&stats.qual, (const iwqual *)(&dev->options.wireless.max_qual), has_range = (iw_get_range_info (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), &range) >= 0);
(const iwqual *)(&dev->options.wireless.avg_qual)); if (iw_get_stats (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), &stats, &range, has_range) == 0)
{
percent = nm_wireless_qual_to_percent (&stats.qual, (const iwqual *)(&dev->options.wireless.max_qual),
(const iwqual *)(&dev->options.wireless.avg_qual));
}
nm_dev_sock_close (sk);
} }
close (sk);
/* Try to smooth out the strength. Atmel cards, for example, will give no strength /* Try to smooth out the strength. Atmel cards, for example, will give no strength
* one second and normal strength the next. * one second and normal strength the next.
@@ -1433,7 +1407,7 @@ void nm_device_update_ip4_address (NMDevice *dev)
{ {
guint32 new_address; guint32 new_address;
struct ifreq req; struct ifreq req;
int sk; NMSock *sk;
int err; int err;
g_return_if_fail (dev != NULL); g_return_if_fail (dev != NULL);
@@ -1447,13 +1421,13 @@ void nm_device_update_ip4_address (NMDevice *dev)
return; return;
} }
if ((sk = nm_device_open_sock ()) < 0) if ((sk = nm_dev_sock_open (dev, DEV_GENERAL, __FUNCTION__, NULL)) == NULL)
return; return;
memset (&req, 0, sizeof (struct ifreq)); memset (&req, 0, sizeof (struct ifreq));
strncpy ((char *)(&req.ifr_name), nm_device_get_iface (dev), strlen (nm_device_get_iface (dev))); strncpy ((char *)(&req.ifr_name), nm_device_get_iface (dev), strlen (nm_device_get_iface (dev)));
err = ioctl (sk, SIOCGIFADDR, &req); err = ioctl (nm_dev_sock_get_fd (sk), SIOCGIFADDR, &req);
close (sk); nm_dev_sock_close (sk);
if (err != 0) if (err != 0)
return; return;
@@ -1499,7 +1473,7 @@ void nm_device_get_hw_address(NMDevice *dev, unsigned char *eth_addr)
void nm_device_update_hw_address (NMDevice *dev) void nm_device_update_hw_address (NMDevice *dev)
{ {
struct ifreq req; struct ifreq req;
int sk; NMSock *sk;
int err; int err;
g_return_if_fail (dev != NULL); g_return_if_fail (dev != NULL);
@@ -1513,13 +1487,13 @@ void nm_device_update_hw_address (NMDevice *dev)
return; return;
} }
if ((sk = nm_device_open_sock ()) < 0) if ((sk = nm_dev_sock_open (dev, DEV_GENERAL, __FUNCTION__, NULL)) == NULL)
return; return;
memset (&req, 0, sizeof (struct ifreq)); memset (&req, 0, sizeof (struct ifreq));
strncpy ((char *)(&req.ifr_name), nm_device_get_iface (dev), strlen (nm_device_get_iface (dev))); strncpy ((char *)(&req.ifr_name), nm_device_get_iface (dev), strlen (nm_device_get_iface (dev)));
err = ioctl (sk, SIOCGIFHWADDR, &req); err = ioctl (nm_dev_sock_get_fd (sk), SIOCGIFHWADDR, &req);
close (sk); nm_dev_sock_close (sk);
if (err != 0) if (err != 0)
return; return;
@@ -1536,7 +1510,7 @@ void nm_device_update_hw_address (NMDevice *dev)
static void nm_device_set_up_down (NMDevice *dev, gboolean up) static void nm_device_set_up_down (NMDevice *dev, gboolean up)
{ {
struct ifreq ifr; struct ifreq ifr;
int sk; NMSock *sk;
int err; int err;
guint32 flags = up ? IFF_UP : ~IFF_UP; guint32 flags = up ? IFF_UP : ~IFF_UP;
@@ -1549,13 +1523,12 @@ static void nm_device_set_up_down (NMDevice *dev, gboolean up)
return; return;
} }
sk = nm_device_open_sock (); if ((sk = nm_dev_sock_open (dev, DEV_GENERAL, __FUNCTION__, NULL)) == NULL)
if (sk < 0)
return; return;
/* Get flags already there */ /* Get flags already there */
strcpy (ifr.ifr_name, nm_device_get_iface (dev)); strcpy (ifr.ifr_name, nm_device_get_iface (dev));
err = ioctl (sk, SIOCGIFFLAGS, &ifr); err = ioctl (nm_dev_sock_get_fd (sk), SIOCGIFFLAGS, &ifr);
if (!err) if (!err)
{ {
/* If the interface doesn't have those flags already, /* If the interface doesn't have those flags already,
@@ -1565,7 +1538,7 @@ static void nm_device_set_up_down (NMDevice *dev, gboolean up)
{ {
ifr.ifr_flags &= ~IFF_UP; ifr.ifr_flags &= ~IFF_UP;
ifr.ifr_flags |= IFF_UP & flags; ifr.ifr_flags |= IFF_UP & flags;
if ((err = ioctl (sk, SIOCSIFFLAGS, &ifr))) if ((err = ioctl (nm_dev_sock_get_fd (sk), SIOCSIFFLAGS, &ifr)))
nm_warning ("nm_device_set_up_down() could not bring device %s %s. errno = %d", nm_device_get_iface (dev), (up ? "up" : "down"), errno ); nm_warning ("nm_device_set_up_down() could not bring device %s %s. errno = %d", nm_device_get_iface (dev), (up ? "up" : "down"), errno );
} }
/* Make sure we have a valid MAC address, some cards reload firmware when they /* Make sure we have a valid MAC address, some cards reload firmware when they
@@ -1577,7 +1550,7 @@ static void nm_device_set_up_down (NMDevice *dev, gboolean up)
else else
nm_warning ("nm_device_set_up_down() could not get flags for device %s. errno = %d", nm_device_get_iface (dev), errno ); nm_warning ("nm_device_set_up_down() could not get flags for device %s. errno = %d", nm_device_get_iface (dev), errno );
close (sk); nm_dev_sock_close (sk);
} }
@@ -1587,7 +1560,7 @@ static void nm_device_set_up_down (NMDevice *dev, gboolean up)
*/ */
gboolean nm_device_is_up (NMDevice *dev) gboolean nm_device_is_up (NMDevice *dev)
{ {
int sk; NMSock *sk;
struct ifreq ifr; struct ifreq ifr;
int err; int err;
@@ -1596,14 +1569,13 @@ gboolean nm_device_is_up (NMDevice *dev)
if (dev->test_device) if (dev->test_device)
return (dev->test_device_up); return (dev->test_device_up);
sk = nm_device_open_sock (); if ((sk = nm_dev_sock_open (dev, DEV_GENERAL, __FUNCTION__, NULL)) == NULL)
if (sk < 0)
return (FALSE); return (FALSE);
/* Get device's flags */ /* Get device's flags */
strcpy (ifr.ifr_name, nm_device_get_iface (dev)); strcpy (ifr.ifr_name, nm_device_get_iface (dev));
err = ioctl (sk, SIOCGIFFLAGS, &ifr); err = ioctl (nm_dev_sock_get_fd (sk), SIOCGIFFLAGS, &ifr);
close (sk); nm_dev_sock_close (sk);
if (!err) if (!err)
return (!((ifr.ifr_flags^IFF_UP) & IFF_UP)); return (!((ifr.ifr_flags^IFF_UP) & IFF_UP));
@@ -1708,21 +1680,19 @@ gboolean nm_device_bring_down_wait (NMDevice *dev, gboolean cancelable)
*/ */
NMNetworkMode nm_device_get_mode (NMDevice *dev) NMNetworkMode nm_device_get_mode (NMDevice *dev)
{ {
int sk; NMSock *sk;
NMNetworkMode mode = NETWORK_MODE_UNKNOWN; NMNetworkMode mode = NETWORK_MODE_UNKNOWN;
g_return_val_if_fail (dev != NULL, NETWORK_MODE_UNKNOWN); g_return_val_if_fail (dev != NULL, NETWORK_MODE_UNKNOWN);
g_return_val_if_fail (nm_device_is_wireless (dev), NETWORK_MODE_UNKNOWN); g_return_val_if_fail (nm_device_is_wireless (dev), NETWORK_MODE_UNKNOWN);
/* Force the card into Managed/Infrastructure mode */ /* Force the card into Managed/Infrastructure mode */
sk = iw_sockets_open (); if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
if (sk >= 0)
{ {
struct iwreq wrq; struct iwreq wrq;
int err; int err;
err = iw_get_ext (sk, nm_device_get_iface (dev), SIOCGIWMODE, &wrq); if (iw_get_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCGIWMODE, &wrq) == 0)
if (err == 0)
{ {
switch (wrq.u.mode) switch (wrq.u.mode)
{ {
@@ -1738,7 +1708,7 @@ NMNetworkMode nm_device_get_mode (NMDevice *dev)
} }
else else
nm_warning ("nm_device_get_mode (%s): error getting card mode. errno = %d", nm_device_get_iface (dev), errno); nm_warning ("nm_device_get_mode (%s): error getting card mode. errno = %d", nm_device_get_iface (dev), errno);
close (sk); nm_dev_sock_close (sk);
} }
return (mode); return (mode);
@@ -1753,8 +1723,8 @@ NMNetworkMode nm_device_get_mode (NMDevice *dev)
*/ */
gboolean nm_device_set_mode (NMDevice *dev, const NMNetworkMode mode) gboolean nm_device_set_mode (NMDevice *dev, const NMNetworkMode mode)
{ {
int sk; NMSock *sk;
gboolean success = FALSE; gboolean success = FALSE;
g_return_val_if_fail (dev != NULL, FALSE); g_return_val_if_fail (dev != NULL, FALSE);
g_return_val_if_fail (nm_device_is_wireless (dev), FALSE); g_return_val_if_fail (nm_device_is_wireless (dev), FALSE);
@@ -1764,8 +1734,7 @@ gboolean nm_device_set_mode (NMDevice *dev, const NMNetworkMode mode)
return TRUE; return TRUE;
/* Force the card into Managed/Infrastructure mode */ /* Force the card into Managed/Infrastructure mode */
sk = iw_sockets_open (); if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
if (sk >= 0)
{ {
struct iwreq wreq; struct iwreq wreq;
int err; int err;
@@ -1787,8 +1756,7 @@ gboolean nm_device_set_mode (NMDevice *dev, const NMNetworkMode mode)
} }
if (mode_good) if (mode_good)
{ {
err = iw_set_ext (sk, nm_device_get_iface (dev), SIOCSIWMODE, &wreq); if (iw_set_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCSIWMODE, &wreq) == 0)
if (err == 0)
success = TRUE; success = TRUE;
else else
nm_warning ("nm_device_set_mode (%s): error setting card to %s mode. errno = %d", nm_warning ("nm_device_set_mode (%s): error setting card to %s mode. errno = %d",
@@ -1796,7 +1764,7 @@ gboolean nm_device_set_mode (NMDevice *dev, const NMNetworkMode mode)
mode == NETWORK_MODE_INFRA ? "Infrastructure" : (mode == NETWORK_MODE_ADHOC ? "adhoc" : "unknown"), mode == NETWORK_MODE_INFRA ? "Infrastructure" : (mode == NETWORK_MODE_ADHOC ? "adhoc" : "unknown"),
errno); errno);
} }
close (sk); nm_dev_sock_close (sk);
} }
return (success); return (success);
@@ -2114,7 +2082,8 @@ static gboolean nm_device_activate_wireless_adhoc (NMDevice *dev, NMAccessPoint
int num_freqs = 0, i; int num_freqs = 0, i;
double freq_to_use = 0; double freq_to_use = 0;
iwrange range; iwrange range;
int sk; NMSock *sk;
int err;
g_return_val_if_fail (dev != NULL, FALSE); g_return_val_if_fail (dev != NULL, FALSE);
g_return_val_if_fail (ap != NULL, FALSE); g_return_val_if_fail (ap != NULL, FALSE);
@@ -2143,15 +2112,13 @@ static gboolean nm_device_activate_wireless_adhoc (NMDevice *dev, NMAccessPoint
} }
nm_ap_list_iter_free (iter); nm_ap_list_iter_free (iter);
if ((sk = iw_sockets_open ()) < 0) if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)) == NULL)
return FALSE; return FALSE;
if (iw_get_range_info (sk, nm_device_get_iface (dev), &range) < 0) err = iw_get_range_info (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), &range);
{ nm_dev_sock_close (sk);
close (sk); if (err < 0)
return FALSE; return FALSE;
}
close (sk);
/* Ok, find the first non-zero freq in our table and use it. /* Ok, find the first non-zero freq in our table and use it.
* For now we only try to use a channel in the 802.11b channel * For now we only try to use a channel in the 802.11b channel
@@ -3686,7 +3653,7 @@ static gboolean nm_completion_scan_has_results (int tries, va_list args)
{ {
NMDevice *dev = va_arg (args, NMDevice *); NMDevice *dev = va_arg (args, NMDevice *);
gboolean *err = va_arg (args, gboolean *); gboolean *err = va_arg (args, gboolean *);
int sk = va_arg (args, int); NMSock *sk = va_arg (args, NMSock *);
NMWirelessScanResults *scan_results = va_arg (args, NMWirelessScanResults *); NMWirelessScanResults *scan_results = va_arg (args, NMWirelessScanResults *);
int rc; int rc;
@@ -3694,7 +3661,7 @@ static gboolean nm_completion_scan_has_results (int tries, va_list args)
g_return_val_if_fail (err != NULL, TRUE); g_return_val_if_fail (err != NULL, TRUE);
g_return_val_if_fail (scan_results != NULL, TRUE); g_return_val_if_fail (scan_results != NULL, TRUE);
rc = iw_scan(sk, (char *)nm_device_get_iface (dev), WIRELESS_EXT, &(scan_results->scan_head)); rc = iw_scan (nm_dev_sock_get_fd (sk), (char *)nm_device_get_iface (dev), WIRELESS_EXT, &(scan_results->scan_head));
*err = FALSE; *err = FALSE;
if (rc == -1 && errno == ETIME) if (rc == -1 && errno == ETIME)
{ {
@@ -3742,7 +3709,6 @@ static gboolean nm_device_wireless_scan (gpointer user_data)
{ {
NMWirelessScanCB *scan_cb = (NMWirelessScanCB *)(user_data); NMWirelessScanCB *scan_cb = (NMWirelessScanCB *)(user_data);
NMDevice *dev = NULL; NMDevice *dev = NULL;
int sk;
NMWirelessScanResults *scan_results = NULL; NMWirelessScanResults *scan_results = NULL;
g_return_val_if_fail (scan_cb != NULL, FALSE); g_return_val_if_fail (scan_cb != NULL, FALSE);
@@ -3774,7 +3740,8 @@ static gboolean nm_device_wireless_scan (gpointer user_data)
/* Grab the scan mutex */ /* Grab the scan mutex */
if (nm_try_acquire_mutex (dev->options.wireless.scan_mutex, __FUNCTION__)) if (nm_try_acquire_mutex (dev->options.wireless.scan_mutex, __FUNCTION__))
{ {
gboolean devup_err; NMSock *sk;
gboolean devup_err;
/* Device must be up before we can scan */ /* Device must be up before we can scan */
devup_err = nm_device_bring_up_wait(dev, 1); devup_err = nm_device_bring_up_wait(dev, 1);
@@ -3784,7 +3751,7 @@ static gboolean nm_device_wireless_scan (gpointer user_data)
goto reschedule; goto reschedule;
} }
if ((sk = iw_sockets_open ()) >= 0) if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
{ {
int err; int err;
NMNetworkMode orig_mode = NETWORK_MODE_INFRA; NMNetworkMode orig_mode = NETWORK_MODE_INFRA;
@@ -3818,7 +3785,7 @@ static gboolean nm_device_wireless_scan (gpointer user_data)
nm_device_set_bitrate (dev, orig_rate); nm_device_set_bitrate (dev, orig_rate);
} }
close (sk); nm_dev_sock_close (sk);
if (!scan_results->scan_head.result) if (!scan_results->scan_head.result)
{ {
@@ -3945,14 +3912,14 @@ typedef u_int64_t u64;
static gboolean supports_ethtool_carrier_detect (NMDevice *dev) static gboolean supports_ethtool_carrier_detect (NMDevice *dev)
{ {
int sk; NMSock *sk;
struct ifreq ifr; struct ifreq ifr;
gboolean supports_ethtool = FALSE; gboolean supports_ethtool = FALSE;
struct ethtool_cmd edata; struct ethtool_cmd edata;
g_return_val_if_fail (dev != NULL, FALSE); g_return_val_if_fail (dev != NULL, FALSE);
if ((sk = socket (AF_INET, SOCK_DGRAM, 0)) < 0) if ((sk = nm_dev_sock_open (dev, DEV_GENERAL, __FUNCTION__, NULL)) == NULL)
{ {
nm_warning ("cannot open socket on interface %s for MII detect; errno=%d", nm_device_get_iface (dev), errno); nm_warning ("cannot open socket on interface %s for MII detect; errno=%d", nm_device_get_iface (dev), errno);
return (FALSE); return (FALSE);
@@ -3961,13 +3928,13 @@ static gboolean supports_ethtool_carrier_detect (NMDevice *dev)
strncpy (ifr.ifr_name, nm_device_get_iface (dev), sizeof(ifr.ifr_name)-1); strncpy (ifr.ifr_name, nm_device_get_iface (dev), sizeof(ifr.ifr_name)-1);
edata.cmd = ETHTOOL_GLINK; edata.cmd = ETHTOOL_GLINK;
ifr.ifr_data = (char *) &edata; ifr.ifr_data = (char *) &edata;
if (ioctl(sk, SIOCETHTOOL, &ifr) == -1) if (ioctl (nm_dev_sock_get_fd (sk), SIOCETHTOOL, &ifr) == -1)
goto out; goto out;
supports_ethtool = TRUE; supports_ethtool = TRUE;
out: out:
close (sk); nm_dev_sock_close (sk);
return (supports_ethtool); return (supports_ethtool);
} }
@@ -3978,17 +3945,17 @@ out:
/**************************************/ /**************************************/
#include <linux/mii.h> #include <linux/mii.h>
static int mdio_read (int sk, struct ifreq *ifr, int location) static int mdio_read (NMSock *sk, struct ifreq *ifr, int location)
{ {
struct mii_ioctl_data *mii; struct mii_ioctl_data *mii;
g_return_val_if_fail (sk >= 0, -1); g_return_val_if_fail (sk != NULL, -1);
g_return_val_if_fail (ifr != NULL, -1); g_return_val_if_fail (ifr != NULL, -1);
mii = (struct mii_ioctl_data *) &(ifr->ifr_data); mii = (struct mii_ioctl_data *) &(ifr->ifr_data);
mii->reg_num = location; mii->reg_num = location;
if (ioctl (sk, SIOCGMIIREG, ifr) < 0) if (ioctl (nm_dev_sock_get_fd (sk), SIOCGMIIREG, ifr) < 0)
return -1; return -1;
return (mii->val_out); return (mii->val_out);
@@ -3996,29 +3963,29 @@ static int mdio_read (int sk, struct ifreq *ifr, int location)
static gboolean supports_mii_carrier_detect (NMDevice *dev) static gboolean supports_mii_carrier_detect (NMDevice *dev)
{ {
int sk; NMSock *sk;
struct ifreq ifr; struct ifreq ifr;
int bmsr; int bmsr;
gboolean supports_mii = FALSE; gboolean supports_mii = FALSE;
g_return_val_if_fail (dev != NULL, FALSE); g_return_val_if_fail (dev != NULL, FALSE);
if ((sk = socket (AF_INET, SOCK_DGRAM, 0)) < 0) if ((sk = nm_dev_sock_open (dev, DEV_GENERAL, __FUNCTION__, NULL)) == NULL)
{ {
nm_warning ("cannot open socket on interface %s for MII detect; errno=%d", nm_device_get_iface (dev), errno); nm_warning ("cannot open socket on interface %s for MII detect; errno=%d", nm_device_get_iface (dev), errno);
return (FALSE); return (FALSE);
} }
strncpy (ifr.ifr_name, nm_device_get_iface (dev), sizeof(ifr.ifr_name)-1); strncpy (ifr.ifr_name, nm_device_get_iface (dev), sizeof(ifr.ifr_name)-1);
if (ioctl(sk, SIOCGMIIPHY, &ifr) < 0) if (ioctl (nm_dev_sock_get_fd (sk), SIOCGMIIPHY, &ifr) < 0)
goto out; goto out;
/* If we can read the BMSR register, we assume that the card supports MII link detection */ /* If we can read the BMSR register, we assume that the card supports MII link detection */
bmsr = mdio_read(sk, &ifr, MII_BMSR); bmsr = mdio_read (sk, &ifr, MII_BMSR);
supports_mii = (bmsr != -1) ? TRUE : FALSE; supports_mii = (bmsr != -1) ? TRUE : FALSE;
out: out:
close (sk); nm_dev_sock_close (sk);
return (supports_mii); return (supports_mii);
} }

View File

@@ -41,42 +41,29 @@
#include <glib.h> #include <glib.h>
#include "NetworkManagerSystem.h" #include "NetworkManagerSystem.h"
#include "NetworkManagerDevice.h" #include "NetworkManagerDevice.h"
#include "NetworkManagerUtils.h"
#include "nm-utils.h" #include "nm-utils.h"
static int nm_system_open_sock (void)
{
int fd;
/* Try to grab a control socket */
fd = socket (AF_PACKET, SOCK_PACKET, htons (ETH_P_ALL));
if (fd >= 0)
return (fd);
nm_warning ("nm_system_open_sock() could not get network control socket.");
return (-1);
}
gboolean nm_system_device_set_ip4_address (NMDevice *dev, int ip4_address) gboolean nm_system_device_set_ip4_address (NMDevice *dev, int ip4_address)
{ {
struct ifreq ifr; struct ifreq ifr;
const char *iface; const char *iface;
int sk; NMSock *sk;
gboolean success = FALSE; gboolean success = FALSE;
struct sockaddr_in *p = (struct sockaddr_in *)&(ifr.ifr_addr); struct sockaddr_in *p = (struct sockaddr_in *)&(ifr.ifr_addr);
g_return_val_if_fail (dev != NULL, FALSE); g_return_val_if_fail (dev != NULL, FALSE);
iface = nm_device_get_iface (dev); if ((sk = nm_dev_sock_open (dev, NETWORK_CONTROL, __FUNCTION__, NULL)) == NULL)
sk = nm_system_open_sock ();
if (sk < 0)
return FALSE; return FALSE;
memset (&ifr, 0, sizeof(struct ifreq)); memset (&ifr, 0, sizeof(struct ifreq));
iface = nm_device_get_iface (dev);
memcpy (ifr.ifr_name, iface, strlen (iface)); memcpy (ifr.ifr_name, iface, strlen (iface));
p->sin_family = AF_INET; p->sin_family = AF_INET;
p->sin_addr.s_addr = ip4_address; p->sin_addr.s_addr = ip4_address;
if (ioctl (sk, SIOCSIFADDR, &ifr) == -1) if (ioctl (nm_dev_sock_get_fd (sk), SIOCSIFADDR, &ifr) == -1)
nm_warning ("nm_system_device_set_ip4_address (%s): failed to set IPv4 address!", iface); nm_warning ("nm_system_device_set_ip4_address (%s): failed to set IPv4 address!", iface);
else else
{ {
@@ -86,7 +73,7 @@ gboolean nm_system_device_set_ip4_address (NMDevice *dev, int ip4_address)
((unsigned char *)&ip4_address)[2], ((unsigned char *)&ip4_address)[3]); ((unsigned char *)&ip4_address)[2], ((unsigned char *)&ip4_address)[3]);
} }
close (sk); nm_dev_sock_close (sk);
return (success); return (success);
} }
@@ -95,27 +82,27 @@ gboolean nm_system_device_set_ip4_netmask (NMDevice *dev, int ip4_netmask)
{ {
struct ifreq ifr; struct ifreq ifr;
const char *iface; const char *iface;
int sk; NMSock *sk;
gboolean success = FALSE; gboolean success = FALSE;
struct sockaddr_in *p = (struct sockaddr_in *)&(ifr.ifr_addr); struct sockaddr_in *p = (struct sockaddr_in *)&(ifr.ifr_addr);
g_return_val_if_fail (dev != NULL, FALSE); g_return_val_if_fail (dev != NULL, FALSE);
iface = nm_device_get_iface (dev); if ((sk = nm_dev_sock_open (dev, NETWORK_CONTROL, __FUNCTION__, NULL)) == NULL)
sk = nm_system_open_sock ();
if (sk < 0)
return FALSE; return FALSE;
memset (&ifr, 0, sizeof(struct ifreq)); memset (&ifr, 0, sizeof(struct ifreq));
iface = nm_device_get_iface (dev);
memcpy (ifr.ifr_name, iface, strlen (iface)); memcpy (ifr.ifr_name, iface, strlen (iface));
p->sin_family = AF_INET; p->sin_family = AF_INET;
p->sin_addr.s_addr = ip4_netmask; p->sin_addr.s_addr = ip4_netmask;
if (ioctl (sk, SIOCSIFNETMASK, &ifr) == -1) if (ioctl (nm_dev_sock_get_fd (sk), SIOCSIFNETMASK, &ifr) == -1)
nm_warning ("nm_system_device_set_ip4_netmask (%s): failed to set IPv4 netmask! errno = %s", iface, strerror (errno)); nm_warning ("nm_system_device_set_ip4_netmask (%s): failed to set IPv4 netmask! errno = %s", iface, strerror (errno));
else else
success = TRUE; success = TRUE;
close (sk); nm_dev_sock_close (sk);
return (success); return (success);
} }
@@ -124,27 +111,26 @@ gboolean nm_system_device_set_ip4_broadcast (NMDevice *dev, int ip4_broadcast)
{ {
struct ifreq ifr; struct ifreq ifr;
const char *iface; const char *iface;
int sk; NMSock *sk;
gboolean success = FALSE; gboolean success = FALSE;
struct sockaddr_in *p = (struct sockaddr_in *)&(ifr.ifr_addr); struct sockaddr_in *p = (struct sockaddr_in *)&(ifr.ifr_addr);
g_return_val_if_fail (dev != NULL, FALSE); g_return_val_if_fail (dev != NULL, FALSE);
iface = nm_device_get_iface (dev); if ((sk = nm_dev_sock_open (dev, NETWORK_CONTROL, __FUNCTION__, NULL)) == NULL)
sk = nm_system_open_sock ();
if (sk < 0)
return FALSE; return FALSE;
memset (&ifr, 0, sizeof(struct ifreq)); memset (&ifr, 0, sizeof(struct ifreq));
iface = nm_device_get_iface (dev);
memcpy (ifr.ifr_name, iface, strlen (iface)); memcpy (ifr.ifr_name, iface, strlen (iface));
p->sin_family = AF_INET; p->sin_family = AF_INET;
p->sin_addr.s_addr = ip4_broadcast; p->sin_addr.s_addr = ip4_broadcast;
if (ioctl (sk, SIOCSIFBRDADDR, &ifr) == -1) if (ioctl (nm_dev_sock_get_fd (sk), SIOCSIFBRDADDR, &ifr) == -1)
nm_warning ("nm_system_device_set_ip4_netmask (%s): failed to set IPv4 netmask!", iface); nm_warning ("nm_system_device_set_ip4_netmask (%s): failed to set IPv4 netmask!", iface);
else else
success = TRUE; success = TRUE;
close (sk); nm_dev_sock_close (sk);
return (success); return (success);
} }
@@ -152,18 +138,18 @@ gboolean nm_system_device_set_ip4_broadcast (NMDevice *dev, int ip4_broadcast)
gboolean nm_system_device_set_ip4_default_route (NMDevice *dev, int ip4_def_route) gboolean nm_system_device_set_ip4_default_route (NMDevice *dev, int ip4_def_route)
{ {
const char *iface; const char *iface;
int sk; NMSock *sk;
gboolean success = FALSE; gboolean success = FALSE;
struct rtentry rtent; struct rtentry rtent;
struct sockaddr_in *p; struct sockaddr_in *p;
g_return_val_if_fail (dev != NULL, FALSE); g_return_val_if_fail (dev != NULL, FALSE);
iface = nm_device_get_iface (dev); if ((sk = nm_dev_sock_open (dev, NETWORK_CONTROL, __FUNCTION__, NULL)) == NULL)
sk = nm_system_open_sock ();
if (sk < 0)
return FALSE; return FALSE;
iface = nm_device_get_iface (dev);
memset (&rtent, 0, sizeof (struct rtentry)); memset (&rtent, 0, sizeof (struct rtentry));
p = (struct sockaddr_in *)&rtent.rt_dst; p = (struct sockaddr_in *)&rtent.rt_dst;
p->sin_family = AF_INET; p->sin_family = AF_INET;
@@ -179,7 +165,7 @@ gboolean nm_system_device_set_ip4_default_route (NMDevice *dev, int ip4_def_rout
rtent.rt_window = 0; rtent.rt_window = 0;
rtent.rt_flags = RTF_UP | RTF_GATEWAY | ( rtent.rt_window ? RTF_WINDOW : 0); rtent.rt_flags = RTF_UP | RTF_GATEWAY | ( rtent.rt_window ? RTF_WINDOW : 0);
if (ioctl (sk, SIOCADDRT, &rtent) == -1) if (ioctl (nm_dev_sock_get_fd (sk), SIOCADDRT, &rtent) == -1)
{ {
if (errno == ENETUNREACH) /* possibly gateway is over the bridge */ if (errno == ENETUNREACH) /* possibly gateway is over the bridge */
{ /* try adding a route to gateway first */ { /* try adding a route to gateway first */
@@ -198,9 +184,9 @@ gboolean nm_system_device_set_ip4_default_route (NMDevice *dev, int ip4_def_rout
rtent2.rt_metric = 0; rtent2.rt_metric = 0;
rtent2.rt_flags = RTF_UP | RTF_HOST; rtent2.rt_flags = RTF_UP | RTF_HOST;
if ( ioctl (sk, SIOCADDRT, &rtent2) == 0 ) if (ioctl (nm_dev_sock_get_fd (sk), SIOCADDRT, &rtent2) == 0 )
{ {
if ( ioctl (sk, SIOCADDRT, &rtent) == 0 ) if (ioctl (nm_dev_sock_get_fd (sk), SIOCADDRT, &rtent) == 0 )
success = TRUE; success = TRUE;
else else
nm_warning ("nm_system_device_set_ip4_default_route (%s): failed to set IPv4 default route! errno = %d", iface, errno); nm_warning ("nm_system_device_set_ip4_default_route (%s): failed to set IPv4 default route! errno = %d", iface, errno);
@@ -212,7 +198,7 @@ gboolean nm_system_device_set_ip4_default_route (NMDevice *dev, int ip4_def_rout
else else
success = TRUE; success = TRUE;
close (sk); nm_dev_sock_close (sk);
return (success); return (success);
} }

View File

@@ -29,12 +29,24 @@
#include <sys/time.h> #include <sys/time.h>
#include <string.h> #include <string.h>
#include <signal.h> #include <signal.h>
#include <iwlib.h>
#include "NetworkManager.h" #include "NetworkManager.h"
#include "NetworkManagerUtils.h" #include "NetworkManagerUtils.h"
#include "nm-utils.h" #include "nm-utils.h"
struct NMSock
{
int fd;
char *func;
char *desc;
NMDevice *dev;
};
static GSList *sock_list = NULL;
static GStaticMutex sock_list_mutex = G_STATIC_MUTEX_INIT;
typedef struct MutexDesc typedef struct MutexDesc
{ {
GMutex *mutex; GMutex *mutex;
@@ -155,6 +167,141 @@ void nm_unlock_mutex (GMutex *mutex, const char *func)
} }
/*
* nm_dev_sock_open
*
* Open a socket to a network device and store some debug info about it.
*
*/
NMSock *nm_dev_sock_open (NMDevice *dev, SockType type, const char *func_name, const char *desc)
{
NMSock *sock = NULL;
sock = g_malloc0 (sizeof (NMSock));
sock->fd = -1;
switch (type)
{
case DEV_WIRELESS:
sock->fd = iw_sockets_open ();
break;
case DEV_GENERAL:
if ((sock->fd = socket (PF_INET, SOCK_DGRAM, 0)) < 0)
if ((sock->fd = socket (PF_PACKET, SOCK_DGRAM, 0)) < 0)
sock->fd = socket (PF_INET6, SOCK_DGRAM, 0);
break;
case NETWORK_CONTROL:
sock->fd = socket (AF_PACKET, SOCK_PACKET, htons (ETH_P_ALL));
break;
default:
break;
}
if (sock->fd < 0)
{
g_free (sock);
nm_warning ("Could not open control socket for device '%s'.", dev ? nm_device_get_iface (dev) : "none");
return NULL;
}
sock->func = func_name ? g_strdup (func_name) : NULL;
sock->desc = desc ? g_strdup (desc) : NULL;
sock->dev = dev;
if (sock->dev)
nm_device_ref (sock->dev);
/* Add the sock to our global sock list for tracking */
g_static_mutex_lock (&sock_list_mutex);
sock_list = g_slist_append (sock_list, sock);
g_static_mutex_unlock (&sock_list_mutex);
return sock;
}
/*
* nm_dev_sock_close
*
* Close a socket and free its debug data.
*
*/
void nm_dev_sock_close (NMSock *sock)
{
GSList *elt;
g_return_if_fail (sock != NULL);
close (sock->fd);
g_free (sock->func);
g_free (sock->desc);
if (sock->dev)
nm_device_unref (sock->dev);
memset (sock, 0, sizeof (NMSock));
g_static_mutex_lock (&sock_list_mutex);
for (elt = sock_list; elt; elt = g_slist_next (elt))
{
NMSock *temp_sock = (NMSock *)(elt->data);
if (temp_sock == sock)
{
sock_list = g_slist_remove_link (sock_list, elt);
g_slist_free (elt);
break;
}
}
g_static_mutex_unlock (&sock_list_mutex);
g_free (sock);
}
/*
* nm_dev_sock_get_fd
*
* Return the fd associated with an NMSock
*
*/
int nm_dev_sock_get_fd (NMSock *sock)
{
g_return_val_if_fail (sock != NULL, -1);
return sock->fd;
}
/*
* nm_print_open_socks
*
* Print a list of currently open and registered NMSocks.
*
*/
void nm_print_open_socks (void)
{
GSList *elt = NULL;
int i = 0;
nm_debug ("Open Sockets List:");
g_static_mutex_lock (&sock_list_mutex);
for (elt = sock_list; elt; elt = g_slist_next (elt))
{
NMSock *sock = (NMSock *)(elt->data);
if (sock)
{
i++;
nm_debug (" %d: %s fd:%d F:'%s' D:'%s'", i, sock->dev ? nm_device_get_iface (sock->dev) : "",
sock->fd, sock->func, sock->desc);
}
}
g_static_mutex_unlock (&sock_list_mutex);
nm_debug ("Open Sockets List Done.");
}
/* /*
* nm_null_safe_strcmp * nm_null_safe_strcmp
* *

View File

@@ -34,12 +34,26 @@
#include "NetworkManagerMain.h" #include "NetworkManagerMain.h"
#include "NetworkManagerDevice.h" #include "NetworkManagerDevice.h"
typedef enum SockType
{
DEV_WIRELESS,
DEV_GENERAL,
NETWORK_CONTROL
} SockType;
typedef struct NMSock NMSock;
gboolean nm_try_acquire_mutex (GMutex *mutex, const char *func); gboolean nm_try_acquire_mutex (GMutex *mutex, const char *func);
void nm_lock_mutex (GMutex *mutex, const char *func); void nm_lock_mutex (GMutex *mutex, const char *func);
void nm_unlock_mutex (GMutex *mutex, const char *func); void nm_unlock_mutex (GMutex *mutex, const char *func);
void nm_register_mutex_desc (GMutex *mutex, char *string); void nm_register_mutex_desc (GMutex *mutex, char *string);
NMSock * nm_dev_sock_open (NMDevice *dev, SockType type, const char *func_name, const char *desc);
void nm_dev_sock_close (NMSock *sock);
int nm_dev_sock_get_fd (NMSock *sock);
void nm_print_open_socks (void);
int nm_null_safe_strcmp (const char *s1, const char *s2); int nm_null_safe_strcmp (const char *s1, const char *s2);
gboolean nm_ethernet_address_is_valid (struct ether_addr *test_addr); gboolean nm_ethernet_address_is_valid (struct ether_addr *test_addr);

View File

@@ -33,6 +33,7 @@
#include "NetworkManager.h" #include "NetworkManager.h"
#include "NetworkManagerDevice.h" #include "NetworkManagerDevice.h"
#include "NetworkManagerMain.h" #include "NetworkManagerMain.h"
#include "NetworkManagerUtils.h"
#include "nm-utils.h" #include "nm-utils.h"
// Times here are in seconds // Times here are in seconds
@@ -57,7 +58,7 @@ static struct ether_addr broadcast_addr = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}
/** /**
* Pick a random link local IP address. * Pick a random link local IP address.
*/ */
static void pick(struct in_addr *ip) static void pick (struct in_addr *ip)
{ {
ip->s_addr = htonl (LINKLOCAL_ADDR | ((abs(random()) % 0xFD00) + (abs(random()) % 0x0100))); ip->s_addr = htonl (LINKLOCAL_ADDR | ((abs(random()) % 0xFD00) + (abs(random()) % 0x0100)));
@@ -175,7 +176,7 @@ gboolean get_autoip (NMDevice *dev, struct in_addr *out_ip)
arpMessage p; arpMessage p;
struct ether_addr addr; struct ether_addr addr;
struct in_addr ip = {0}; struct in_addr ip = {0};
int fd; NMSock *sk;
int nprobes = 0; int nprobes = 0;
int nannounce = 0; int nannounce = 0;
gboolean success = FALSE; gboolean success = FALSE;
@@ -191,14 +192,14 @@ gboolean get_autoip (NMDevice *dev, struct in_addr *out_ip)
strncpy (saddr.sa_data, nm_device_get_iface (dev), sizeof (saddr.sa_data)); strncpy (saddr.sa_data, nm_device_get_iface (dev), sizeof (saddr.sa_data));
/* open an ARP socket */ /* open an ARP socket */
if ((fd = socket (PF_PACKET, SOCK_PACKET, htons (ETH_P_ARP))) < 0) if ((sk = nm_dev_sock_open (dev, NETWORK_CONTROL, __FUNCTION__, NULL)) == NULL)
{ {
nm_warning ("%s: Couldn't open network control socket.", nm_device_get_iface (dev)); nm_warning ("%s: Couldn't open network control socket.", nm_device_get_iface (dev));
goto out; goto out;
} }
/* bind to the ARP socket */ /* bind to the ARP socket */
if (bind (fd, &saddr, sizeof (saddr)) < 0) if (bind (nm_dev_sock_get_fd (sk), &saddr, sizeof (saddr)) < 0)
{ {
nm_warning ("%s: Couldn't bind to the device.", nm_device_get_iface (dev)); nm_warning ("%s: Couldn't bind to the device.", nm_device_get_iface (dev));
goto out; goto out;
@@ -228,7 +229,7 @@ gboolean get_autoip (NMDevice *dev, struct in_addr *out_ip)
if (nprobes < PROBE_NUM) if (nprobes < PROBE_NUM)
{ {
nm_info ("autoip: Sending probe #%d for IP address %s.", nprobes, inet_ntoa (ip)); nm_info ("autoip: Sending probe #%d for IP address %s.", nprobes, inet_ntoa (ip));
arp (fd, &saddr, ARPOP_REQUEST, &addr, null_ip, &null_addr, ip); arp (nm_dev_sock_get_fd (sk), &saddr, ARPOP_REQUEST, &addr, null_ip, &null_addr, ip);
nprobes++; nprobes++;
gettimeofday (&timeout, NULL); gettimeofday (&timeout, NULL);
if (nprobes == PROBE_NUM) if (nprobes == PROBE_NUM)
@@ -248,7 +249,7 @@ gboolean get_autoip (NMDevice *dev, struct in_addr *out_ip)
else if (nannounce < ANNOUNCE_NUM) else if (nannounce < ANNOUNCE_NUM)
{ {
nm_info ("autoip: Sending announce #%d for IP address %s.", nannounce, inet_ntoa (ip)); nm_info ("autoip: Sending announce #%d for IP address %s.", nannounce, inet_ntoa (ip));
arp (fd, &saddr, ARPOP_REQUEST, &addr, ip, &addr, ip); arp (nm_dev_sock_get_fd (sk), &saddr, ARPOP_REQUEST, &addr, ip, &addr, ip);
nannounce++; nannounce++;
gettimeofday (&timeout, NULL); gettimeofday (&timeout, NULL);
timeout.tv_sec += ANNOUNCE_INTERVAL; timeout.tv_sec += ANNOUNCE_INTERVAL;
@@ -263,7 +264,7 @@ gboolean get_autoip (NMDevice *dev, struct in_addr *out_ip)
} }
nm_info ("autoip: Waiting for reply..."); nm_info ("autoip: Waiting for reply...");
err = peekfd (dev, fd, &timeout); err = peekfd (dev, nm_dev_sock_get_fd (sk), &timeout);
if ((err == RET_DHCP_ERROR) || (err == RET_DHCP_CEASED)) if ((err == RET_DHCP_ERROR) || (err == RET_DHCP_CEASED))
goto out; goto out;
@@ -273,7 +274,7 @@ gboolean get_autoip (NMDevice *dev, struct in_addr *out_ip)
nm_info ("autoip: Got some data to check for reply packet."); nm_info ("autoip: Got some data to check for reply packet.");
/* read ARP packet */ /* read ARP packet */
if (recv (fd, &p, sizeof (p), 0) < 0) if (recv (nm_dev_sock_get_fd (sk), &p, sizeof (p), 0) < 0)
{ {
nm_warning ("autoip: packet receive failure, ignoring it."); nm_warning ("autoip: packet receive failure, ignoring it.");
continue; continue;
@@ -310,7 +311,6 @@ gboolean get_autoip (NMDevice *dev, struct in_addr *out_ip)
} }
out: out:
if (fd >= 0) nm_dev_sock_close (sk);
close (fd);
return (success); return (success);
} }