rpms/NetworkManager/devel NetworkManager-0.4-aplist-fix-hidden.patch, NONE, 1.1 NetworkManager-0.4-assert-fix.patch, NONE, 1.1 NetworkManager-0.4-devup.patch, NONE, 1.1 NetworkManager-0.4-leak-fixes.patch, NONE, 1.1 NetworkManager-0.4-novarargs.patch, NONE, 1.1 NetworkManager-0.4-use-thread-join.patch, NONE, 1.1 NetworkManager.spec, 1.42, 1.43
fedora-cvs-commits at redhat.com
fedora-cvs-commits at redhat.com
Wed May 4 18:33:17 UTC 2005
Author: dcbw
Update of /cvs/dist/rpms/NetworkManager/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv32344
Modified Files:
NetworkManager.spec
Added Files:
NetworkManager-0.4-aplist-fix-hidden.patch
NetworkManager-0.4-assert-fix.patch
NetworkManager-0.4-devup.patch
NetworkManager-0.4-leak-fixes.patch
NetworkManager-0.4-novarargs.patch
NetworkManager-0.4-use-thread-join.patch
Log Message:
* Wed May 4 2005 Dan Williams <dcbw at redhat.com> - 0.4-9.cvs20050404
- Fix some memory leaks (Tom Parker)
- Join to threads rather than spinning for their completion (Tom Parker)
- Fix misuse of a g_assert() (Colin Walters)
- Fix return checking of an ioctl() (Bill Moss)
- Better detection and matching of hidden access points (Bill Moss)
- Don't use varargs, and therefore don't crash on PPC (Peter Jones)
NetworkManager-0.4-aplist-fix-hidden.patch:
NetworkManagerAPList.c | 145 ++++++++++++++++++++++++++++++++++++++++---------
NetworkManagerAPList.h | 1
NetworkManagerPolicy.c | 2
3 files changed, 123 insertions(+), 25 deletions(-)
--- NEW FILE NetworkManager-0.4-aplist-fix-hidden.patch ---
--- NetworkManager-0.4/src/NetworkManagerPolicy.c.aplist-fix-hidden 2005-03-31 12:02:41.000000000 -0500
+++ NetworkManager-0.4/src/NetworkManagerPolicy.c 2005-05-04 11:36:18.000000000 -0400
@@ -515,6 +515,8 @@
}
else
nm_device_copy_allowed_to_dev_list (dev, data->allowed_ap_list);
+
+ nm_ap_list_remove_duplicate_essids (nm_device_ap_list_get (dev));
}
}
--- NetworkManager-0.4/src/NetworkManagerAPList.h.aplist-fix-hidden 2005-02-25 16:19:21.000000000 -0500
+++ NetworkManager-0.4/src/NetworkManagerAPList.h 2005-05-04 11:37:17.000000000 -0400
@@ -38,6 +38,7 @@
void nm_ap_list_append_ap (NMAccessPointList *list, NMAccessPoint *ap);
void nm_ap_list_remove_ap (NMAccessPointList *list, NMAccessPoint *ap);
+void nm_ap_list_remove_duplicate_essids (NMAccessPointList *list);
NMAccessPoint * nm_ap_list_get_ap_by_essid (NMAccessPointList *list, const char *network);
NMAccessPoint * nm_ap_list_get_ap_by_address (NMAccessPointList *list, const struct ether_addr *addr);
--- NetworkManager-0.4/src/NetworkManagerAPList.c.aplist-fix-hidden 2005-05-04 11:31:13.000000000 -0400
+++ NetworkManager-0.4/src/NetworkManagerAPList.c 2005-05-04 11:36:18.000000000 -0400
@@ -192,6 +192,80 @@
nm_ap_list_unlock (list);
}
+/* nm_ap_list_remove_duplicate_essids
+ *
+ */
+void nm_ap_list_remove_duplicate_essids (NMAccessPointList *list)
+{
+ NMAccessPoint *removal_ap;
+ NMAccessPoint *list_ap_max;
+ GSList *elt_i = NULL;
+ GSList *elt_j = NULL;
+ GSList *elt_max = NULL;
+ GSList *removal_list = NULL;
+ GSList *elt;
+ gint8 max_strength = 0;
+ gint8 strengthj = 0;
+
+ g_return_if_fail (list != NULL);
+
+ if (!nm_ap_list_lock (list))
+ {
+ nm_warning ("nm_ap_list_append_ap() could not acquire AP list mutex." );
+ return;
+ }
+
+ for (elt_i = list->ap_list; elt_i; elt_i = g_slist_next (elt_i))
+ {
+ NMAccessPoint *list_ap_i = (NMAccessPoint *)(elt_i->data);
+ gboolean found = FALSE;
+
+ for (elt_j = list->ap_list; elt_j < elt_i; elt_j = g_slist_next (elt_j))
+ {
+ NMAccessPoint *list_ap_j = (NMAccessPoint *)(elt_j->data);
+
+ if ((found = (nm_null_safe_strcmp (nm_ap_get_essid (list_ap_i), nm_ap_get_essid (list_ap_j)) == 0)))
+ break;
+ }
+
+ if (found)
+ continue;
+
+ elt_max = elt_i;
+ list_ap_max = (NMAccessPoint *)(elt_i->data);
+ max_strength = nm_ap_get_strength (list_ap_i);
+
+ for (elt_j = g_slist_next (elt_i); elt_j; elt_j = g_slist_next (elt_j))
+ {
+ NMAccessPoint *list_ap_j = (NMAccessPoint *)(elt_j->data);
+
+ strengthj = nm_ap_get_strength (list_ap_j);
+ if (nm_null_safe_strcmp (nm_ap_get_essid (list_ap_i), nm_ap_get_essid (list_ap_j)) == 0)
+ {
+ if (strengthj > max_strength)
+ {
+ removal_list = g_slist_append (removal_list, list_ap_max);
+ list_ap_max = list_ap_j;
+ max_strength = strengthj;
+ }
+ else
+ removal_list = g_slist_append (removal_list, list_ap_j);
+ }
+ }
+ }
+ nm_ap_list_unlock (list);
+
+ for (elt = removal_list; elt; elt = g_slist_next (elt))
+ {
+ if ((removal_ap = (NMAccessPoint *)(elt->data)))
+ {
+ nm_ap_list_remove_ap (list, removal_ap);
+ }
+ }
+ g_slist_free (removal_list);
+
+}
+
/*
* nm_ap_list_get_ap_by_essid
@@ -382,49 +456,70 @@
gboolean nm_ap_list_merge_scanned_ap (NMAccessPointList *list, NMAccessPoint *merge_ap,
gboolean *new, gboolean *strength_changed)
{
- NMAccessPoint *list_ap;
- gboolean success = FALSE;
+ NMAccessPoint *list_ap_addr, *list_ap_essid;
+ gboolean success = FALSE;
g_return_val_if_fail (list != NULL, FALSE);
g_return_val_if_fail (merge_ap != NULL, FALSE);
g_return_val_if_fail (new != NULL, FALSE);
g_return_val_if_fail (strength_changed != NULL, FALSE);
- if (!(list_ap = nm_ap_list_get_ap_by_address (list, nm_ap_get_address (merge_ap))))
- list_ap = nm_ap_list_get_ap_by_essid (list, nm_ap_get_essid (merge_ap));
+ if ((list_ap_addr = nm_ap_list_get_ap_by_address (list, nm_ap_get_address (merge_ap))))
+ {
- if (list_ap)
+ /* First, we check for an address match. If the merge AP has the
+ * same address as a list AP, the merge AP and the list AP
+ * must be the same physical AP. The list AP properties must be from
+ * a previous scan so the time_last_seen's are not equal.
+ * Update encryption, authentication method,
+ * strength, and the time_last_seen. */
+
+ const GTimeVal *merge_ap_seen = nm_ap_get_last_seen (merge_ap);
+ const GTimeVal *list_ap_addr_seen = nm_ap_get_last_seen (list_ap_addr);
+
+ nm_ap_set_encrypted (list_ap_addr, nm_ap_get_encrypted (merge_ap));
+ nm_ap_set_auth_method (list_ap_addr, nm_ap_get_auth_method (merge_ap));
+ if (nm_ap_get_strength (merge_ap) != nm_ap_get_strength (list_ap_addr))
+ {
+ nm_ap_set_strength (list_ap_addr, nm_ap_get_strength (merge_ap));
+ *strength_changed = TRUE;
+ }
+ nm_ap_set_last_seen (list_ap_addr, merge_ap_seen);
+ }
+ else if ((list_ap_essid = nm_ap_list_get_ap_by_essid (list, nm_ap_get_essid (merge_ap))))
{
- const GTimeVal *merge_ap_seen = nm_ap_get_last_seen (merge_ap);
- const GTimeVal *list_ap_seen = nm_ap_get_last_seen (list_ap);
- /* Merge some properties on the AP that are new from scan to scan. */
- nm_ap_set_encrypted (list_ap, nm_ap_get_encrypted (merge_ap));
- nm_ap_set_auth_method (list_ap, nm_ap_get_auth_method (merge_ap));
-
- /* Don't update the strength on the existing AP if the timestamp is
- * the same as the AP we're going to merge (which means that they were
- * found in the same scan, have the same ESSID, but are different APs)
- * and the existing AP's strength is greater than the one we're about
- * to merge. This helps keep the ESSID's reported strength that of the
- * strongest AP we can see.
- */
- if (!( (list_ap_seen->tv_sec == merge_ap_seen->tv_sec)
- && (nm_ap_get_strength (list_ap) > nm_ap_get_strength (merge_ap))))
+ /* Second, we check for an ESSID match. In this case,
+ * a list AP has the same non-NULL ESSID as the merge AP. Update the
+ * encryption and authentication method. Update the strength and address
+ * except when the time_last_seen of the list AP is the same as the
+ * time_last_seen of the merge AP and the strength of the list AP is greater
+ * than or equal to the strength of the merge AP. If the time_last_seen's are
+ * equal, the merge AP and the list AP come from the same scan.
+ * Update the time_last_seen. */
+
+ const GTimeVal *merge_ap_seen = nm_ap_get_last_seen (merge_ap);
+ const GTimeVal *list_ap_essid_seen = nm_ap_get_last_seen (list_ap_essid);
+
+ nm_ap_set_encrypted (list_ap_essid, nm_ap_get_encrypted (merge_ap));
+ nm_ap_set_auth_method (list_ap_essid, nm_ap_get_auth_method (merge_ap));
+
+ if (!((list_ap_essid_seen->tv_sec == merge_ap_seen->tv_sec)
+ && (nm_ap_get_strength (list_ap_essid) >= nm_ap_get_strength (merge_ap))))
{
- nm_ap_set_strength (list_ap, nm_ap_get_strength (merge_ap));
+ nm_ap_set_strength (list_ap_essid, nm_ap_get_strength (merge_ap));
+ nm_ap_set_address (list_ap_essid, nm_ap_get_address (merge_ap));
*strength_changed = TRUE;
}
-
- nm_ap_set_last_seen (list_ap, merge_ap_seen);
+ nm_ap_set_last_seen (list_ap_essid, merge_ap_seen);
}
else
{
- /* Add the whole AP, list takes ownership. */
+ /* Add the merge AP to the list. */
+
nm_ap_list_append_ap (list, merge_ap);
*new = TRUE;
}
-
return TRUE;
}
NetworkManager-0.4-assert-fix.patch:
nm-dbus-nm.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletion(-)
--- NEW FILE NetworkManager-0.4-assert-fix.patch ---
--- NetworkManager-0.4/src/nm-dbus-nm.c.assert-fix 2005-05-04 11:24:05.000000000 -0400
+++ NetworkManager-0.4/src/nm-dbus-nm.c 2005-05-04 11:24:41.000000000 -0400
@@ -129,7 +129,10 @@
* (something which should never happen), die.
*/
if (!appended)
- g_assert ("Device list existed, but no devices were in it.");
+ {
+ nm_warning ("Device list existed, but no devices were in it.");
+ g_assert_not_reached ();
+ }
dbus_message_iter_close_container (&iter, &iter_array);
nm_unlock_mutex (data->data->dev_list_mutex, __FUNCTION__);
NetworkManager-0.4-devup.patch:
NetworkManagerDevice.c | 5 ++---
1 files changed, 2 insertions(+), 3 deletions(-)
--- NEW FILE NetworkManager-0.4-devup.patch ---
--- NetworkManager-0.4/src/NetworkManagerDevice.c.devup 2005-05-04 11:28:55.000000000 -0400
+++ NetworkManager-0.4/src/NetworkManagerDevice.c 2005-05-04 11:29:37.000000000 -0400
@@ -1557,8 +1557,7 @@
/* Get flags already there */
strcpy (ifr.ifr_name, nm_device_get_iface (dev));
- err = ioctl (sk, SIOCGIFFLAGS, &ifr);
- if (!err)
+ if (ioctl (sk, SIOCGIFFLAGS, &ifr) != -1)
{
/* If the interface doesn't have those flags already,
* set them on it.
@@ -1567,7 +1566,7 @@
{
ifr.ifr_flags &= ~IFF_UP;
ifr.ifr_flags |= IFF_UP & flags;
- if ((err = ioctl (sk, SIOCSIFFLAGS, &ifr)))
+ if (ioctl (sk, SIOCSIFFLAGS, &ifr) == -1)
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
NetworkManager-0.4-leak-fixes.patch:
NetworkManager.c | 2 ++
NetworkManagerAPList.c | 1 +
NetworkManagerDevice.c | 3 ++-
NetworkManagerUtils.c | 1 +
nm-netlink-monitor.c | 4 +++-
5 files changed, 9 insertions(+), 2 deletions(-)
--- NEW FILE NetworkManager-0.4-leak-fixes.patch ---
Index: src/NetworkManager.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManager.c,v
retrieving revision 1.67
diff -u -r1.67 NetworkManager.c
--- src/NetworkManager.c 6 Apr 2005 16:45:48 -0000 1.67
+++ src/NetworkManager.c 14 Apr 2005 11:12:17 -0000
@@ -526,6 +526,8 @@
g_main_loop_unref (data->main_loop);
g_main_context_unref (data->main_context);
+ g_io_channel_unref(data->sigterm_iochannel);
+
memset (data, 0, sizeof (NMData));
}
Index: src/NetworkManagerAPList.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerAPList.c,v
retrieving revision 1.36
diff -u -r1.36 NetworkManagerAPList.c
--- src/NetworkManagerAPList.c 6 Apr 2005 19:05:10 -0000 1.36
+++ src/NetworkManagerAPList.c 14 Apr 2005 11:12:17 -0000
@@ -116,6 +116,7 @@
nm_unlock_mutex (list->mutex, __FUNCTION__);
g_mutex_free (list->mutex);
+ g_free(list);
}
}
Index: src/NetworkManagerDevice.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerDevice.c,v
retrieving revision 1.121
diff -u -r1.121 NetworkManagerDevice.c
--- src/NetworkManagerDevice.c 6 Apr 2005 19:16:31 -0000 1.121
+++ src/NetworkManagerDevice.c 14 Apr 2005 11:12:17 -0000
@@ -842,7 +842,8 @@
if (g_file_get_contents (carrier_path, &contents, &length, NULL)) {
link = (gboolean) atoi (contents);
g_free (contents);
- }
+ }
+ g_free(carrier_path);
/* We say that non-carrier-detect devices always have a link, because
* they never get auto-selected by NM. User has to force them on us,
Index: src/NetworkManagerUtils.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerUtils.c,v
retrieving revision 1.33
diff -u -r1.33 NetworkManagerUtils.c
--- src/NetworkManagerUtils.c 6 Apr 2005 16:45:48 -0000 1.33
+++ src/NetworkManagerUtils.c 14 Apr 2005 11:12:17 -0000
@@ -448,6 +448,7 @@
if (parent_udi && libhal_device_property_exists (ctx, parent_udi, "info.linux.driver", NULL))
driver_name = libhal_device_get_property_string (ctx, parent_udi, "info.linux.driver", NULL);
+ g_free(parent_udi);
}
return (driver_name);
Index: src/nm-netlink-monitor.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/nm-netlink-monitor.c,v
retrieving revision 1.4
diff -u -r1.4 nm-netlink-monitor.c
--- src/nm-netlink-monitor.c 17 Mar 2005 21:43:21 -0000 1.4
+++ src/nm-netlink-monitor.c 14 Apr 2005 11:12:17 -0000
@@ -569,7 +569,7 @@
NmNetlinkMonitor *monitor)
{
GError *error;
- gchar *received_bytes;
+ gchar *received_bytes=NULL;
gboolean processing_is_done;
gsize num_received_bytes;
guint num_bytes_to_process;
@@ -711,6 +711,8 @@
g_free (interface_name);
}
}
+ if (received_bytes!=NULL)
+ g_free(received_bytes);
return TRUE;
}
NetworkManager-0.4-novarargs.patch:
src/NetworkManagerDevice.c | 141 ++++++++++++++++++++++---------------
src/NetworkManagerUtils.c | 75 ++++++++-----------
src/NetworkManagerUtils.h | 18 ++--
vpn-daemons/vpnc/nm-vpnc-service.c | 0
4 files changed, 132 insertions(+), 102 deletions(-)
--- NEW FILE NetworkManager-0.4-novarargs.patch ---
Index: src/NetworkManagerDevice.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerDevice.c,v
retrieving revision 1.123
diff -u -r1.123 NetworkManagerDevice.c
--- src/NetworkManagerDevice.c 15 Apr 2005 20:00:28 -0000 1.123
+++ src/NetworkManagerDevice.c 21 Apr 2005 18:01:19 -0000
@@ -259,6 +259,7 @@
{
NMDevice *dev;
GError *error = NULL;
+ nm_completion_args args;
g_return_val_if_fail (iface != NULL, NULL);
g_return_val_if_fail (strlen (iface) > 0, NULL);
@@ -392,11 +393,13 @@
}
/* Block until our device thread has actually had a chance to start. */
+ args[0] = &dev->worker_started;
+ args[1] = "nm_device_new(): waiting for device's worker thread to start";
+ args[2] = (void *)LOG_INFO;
+ args[3] = 0;
nm_wait_for_completion (NM_COMPLETION_TRIES_INFINITY,
- G_USEC_PER_SEC / 20, nm_completion_boolean_test, NULL,
- &dev->worker_started,
- "nm_device_new(): waiting for device's worker thread to start",
- LOG_INFO, 0);
+ G_USEC_PER_SEC / 20, nm_completion_boolean_test, NULL, args);
+
nm_info ("nm_device_new(): device's worker thread started, continuing.");
return (dev);
@@ -1564,16 +1567,13 @@
}
/* I really wish nm_v_wait_for_completion_or_timeout could translate these
- * to first class args instead of a va_list, so these helpers could be nice
- * and _tiny_.
- *
- * ... and we can probably do that with __builtin_apply(), or libffi,
- * but that's kindof cheating. */
-gboolean nm_completion_device_is_up_test(int tries, va_list args)
-{
- NMDevice *dev = va_arg(args, NMDevice *);
- gboolean *err = va_arg(args, gboolean *);
- gboolean cancelable = va_arg(args, gboolean);
+ * to first class args instead of a all this void * arg stuff, so these
+ * helpers could be nice and _tiny_. */
+gboolean nm_completion_device_is_up_test(int tries, nm_completion_args args)
+{
+ NMDevice *dev = args[0];
+ gboolean *err = args[1];
+ gboolean cancelable = (gboolean)args[2];
g_return_val_if_fail(dev != NULL, TRUE);
g_return_val_if_fail(err != NULL, TRUE);
@@ -1598,13 +1598,17 @@
gboolean nm_device_bring_up_wait (NMDevice *dev, gboolean cancelable)
{
gboolean err = FALSE;
+ nm_completion_args args;
g_return_val_if_fail (dev != NULL, TRUE);
nm_device_bring_up (dev);
+
+ args[0] = dev;
+ args[1] = &err;
+ args[2] = (void *)cancelable;
nm_wait_for_completion(400, G_USEC_PER_SEC / 200, NULL,
- nm_completion_device_is_up_test, dev,
- &err, cancelable);
+ nm_completion_device_is_up_test, args);
if (err)
nm_info ("failed to bring device up");
return err;
@@ -1617,11 +1621,11 @@
nm_device_set_up_down (dev, FALSE);
}
-gboolean nm_completion_device_is_down_test(int tries, va_list args)
+gboolean nm_completion_device_is_down_test(int tries, nm_completion_args args)
{
- NMDevice *dev = va_arg(args, NMDevice *);
- gboolean *err = va_arg(args, gboolean *);
- gboolean cancelable = va_arg(args, gboolean);
+ NMDevice *dev = args[0];
+ gboolean *err = args[1];
+ gboolean cancelable = (gboolean)args[2];
g_return_val_if_fail(dev != NULL, TRUE);
g_return_val_if_fail(err != NULL, TRUE);
@@ -1639,13 +1643,17 @@
gboolean nm_device_bring_down_wait (NMDevice *dev, gboolean cancelable)
{
gboolean err = FALSE;
+ nm_completion_args args;
g_return_val_if_fail (dev != NULL, TRUE);
nm_device_bring_down (dev);
+
+ args[0] = dev;
+ args[1] = &err;
+ args[2] = (void *)cancelable;
nm_wait_for_completion(400, G_USEC_PER_SEC / 200, NULL,
- nm_completion_device_is_down_test, dev,
- &err, cancelable);
+ nm_completion_device_is_down_test, args);
if (err)
nm_info ("failed to bring device down");
return err;
@@ -1848,13 +1856,13 @@
}
-static gboolean nm_dwwfl_test (int tries, va_list args)
+static gboolean nm_dwwfl_test (int tries, nm_completion_args args)
{
- NMDevice *dev = va_arg (args, NMDevice *);
- guint *assoc_count = va_arg (args, guint *);
- double *last_freq = va_arg (args, double *);
- char *essid = va_arg (args, char *);
- int required = va_arg (args, int);
+ NMDevice *dev = args[0];
+ guint *assoc_count = args[1];
+ double *last_freq = args[2];
+ char *essid = args[3];
+ int required = (int)args[4];
double cur_freq = nm_device_get_frequency (dev);
gboolean assoc = nm_device_wireless_is_associated (dev);
@@ -1902,6 +1910,7 @@
double last_freq = 0;
guint assoc_count = 0;
struct timeval timeout = { .tv_sec = 0, .tv_usec = 0 };
+ nm_completion_args args;
/* we want to sleep for a very short amount of time, to minimize
* hysteresis on the boundaries of our required time. But we
@@ -1927,9 +1936,13 @@
* associated, the driver stops scanning. To detect that, we look
* for the essid and frequency to remain constant for 3 seconds.
* When it remains constant, we assume it's a real link. */
+ args[0] = dev;
+ args[1] = &assoc;
+ args[2] = &last_freq;
+ args[3] = (void *)essid;
+ args[4] = (void *)(required_tries * 2);
nm_wait_for_timeout (&timeout, G_USEC_PER_SEC / delay,
- nm_dwwfl_test, nm_dwwfl_test, dev, &assoc,
- &last_freq, essid, required_tries * 2);
+ nm_dwwfl_test, nm_dwwfl_test, args);
/* If we've had a reasonable association count, we say we have a link */
if (assoc > required_tries)
@@ -1938,10 +1951,10 @@
}
-static gboolean nm_device_link_test(int tries, va_list args)
+static gboolean nm_device_link_test(int tries, nm_completion_args args)
{
- NMDevice *dev = va_arg(args, NMDevice *);
- gboolean *err = va_arg(args, gboolean *);
+ NMDevice *dev = args[0];
+ gboolean *err = args[1];
g_return_val_if_fail(dev != NULL, TRUE);
g_return_val_if_fail(err != NULL, TRUE);
@@ -1960,10 +1973,13 @@
gboolean err;
const gint delay = (G_USEC_PER_SEC * nm_device_get_association_pause_value (dev)) / interval;
const gint max_cycles = timeout * interval;
+ nm_completion_args args;
g_return_val_if_fail (dev != NULL, TRUE);
- nm_wait_for_completion (max_cycles, delay, NULL, nm_device_link_test, dev, &err);
+ args[0] = dev;
+ args[1] = &err;
+ nm_wait_for_completion (max_cycles, delay, NULL, nm_device_link_test, args);
return !err;
}
@@ -2229,11 +2245,11 @@
/* this gets called without the scan mutex held */
-static gboolean nm_wa_test (int tries, va_list args)
+static gboolean nm_wa_test (int tries, nm_completion_args args)
{
- NMDevice *dev = va_arg (args, NMDevice *);
- NMAccessPoint **best_ap = va_arg (args, NMAccessPoint **);
- gboolean *err = va_arg (args, gboolean *);
+ NMDevice *dev = args[0];
+ NMAccessPoint **best_ap = args[1];
+ gboolean *err = args[2];
g_return_val_if_fail(dev != NULL, TRUE);
g_return_val_if_fail(best_ap != NULL, TRUE);
@@ -2283,10 +2299,10 @@
}
-static gboolean nm_dukr_test (int tries, va_list args)
+static gboolean nm_dukr_test (int tries, nm_completion_args args)
{
- NMDevice *dev = va_arg (args, NMDevice *);
- gboolean *err = va_arg (args, gboolean *);
+ NMDevice *dev = args[0];
+ gboolean *err = args[1];
g_return_val_if_fail (dev != NULL, TRUE);
g_return_val_if_fail (err != NULL, TRUE);
@@ -2321,6 +2337,7 @@
gboolean need_key = FALSE;
gboolean found_ap = FALSE;
gboolean err = FALSE;
+ nm_completion_args args;
g_return_val_if_fail (dev != NULL, FALSE);
g_return_val_if_fail (dev->app_data != NULL, FALSE);
@@ -2346,7 +2363,11 @@
nm_device_set_now_scanning (dev, TRUE);
/* Get an access point to connect to */
- nm_wait_for_completion (NM_COMPLETION_TRIES_INFINITY, G_USEC_PER_SEC / 50, nm_wa_test, NULL, dev, &best_ap, &err);
+ args[0] = dev;
+ args[1] = &best_ap;
+ args[2] = &err;
+ nm_wait_for_completion (NM_COMPLETION_TRIES_INFINITY, G_USEC_PER_SEC / 50,
+ nm_wa_test, NULL, args);
if (err)
{
/* Wierd as it may seem, we lock here to balance the unlock in "out:" */
@@ -2397,8 +2418,11 @@
/* Wait for the key to come back */
nm_debug ("Activation (%s/wireless): asking for user key.", nm_device_get_iface (dev));
- nm_wait_for_completion (NM_COMPLETION_TRIES_INFINITY, G_USEC_PER_SEC / 20,
- nm_dukr_test, nm_dukr_test, dev, &err);
+
+ args[0] = dev;
+ args[1] = &err;
+ nm_wait_for_completion (NM_COMPLETION_TRIES_INFINITY,
+ G_USEC_PER_SEC / 20, nm_dukr_test, nm_dukr_test, args);
nm_debug ("Activation (%s/wireless): user key received.", nm_device_get_iface (dev));
/* Done waiting, grab lock again */
@@ -2706,9 +2730,9 @@
}
-static gboolean nm_ac_test (int tries, va_list args)
+static gboolean nm_ac_test (int tries, nm_completion_args args)
{
- NMDevice *dev = va_arg (args, NMDevice *);
+ NMDevice *dev = args[0];
g_return_val_if_fail (dev != NULL, TRUE);
@@ -2743,6 +2767,8 @@
*/
void nm_device_activation_cancel (NMDevice *dev)
{
+ nm_completion_args args;
+
g_return_if_fail (dev != NULL);
if (nm_device_is_activating (dev))
@@ -2754,8 +2780,9 @@
* The other problem with waiting here is that we hold up dbus traffic
* that we should respond to.
*/
+ args[0] = dev;
nm_wait_for_completion(NM_COMPLETION_TRIES_INFINITY,
- G_USEC_PER_SEC / 20, nm_ac_test, NULL, dev);
+ G_USEC_PER_SEC / 20, nm_ac_test, NULL, args);
nm_debug ("Activation (%s/wireless): cancelled.", nm_device_get_iface(dev));
}
}
@@ -3638,12 +3665,13 @@
}
-static gboolean nm_completion_scan_has_results (int tries, va_list args)
+static gboolean nm_completion_scan_has_results (int tries,
+ nm_completion_args args)
{
- NMDevice *dev = va_arg (args, NMDevice *);
- gboolean *err = va_arg (args, gboolean *);
- int sk = va_arg (args, int);
- NMWirelessScanResults *scan_results = va_arg (args, NMWirelessScanResults *);
+ NMDevice *dev = args[0];
+ gboolean *err = args[1];
+ NMSock *sk = args[2];
+ NMWirelessScanResults *scan_results = args[3];
int rc;
g_return_val_if_fail (dev != NULL, TRUE);
@@ -3747,6 +3775,7 @@
double orig_freq = 0;
int orig_rate = 0;
const int max_wait = G_USEC_PER_SEC * nm_device_get_association_pause_value (dev) /2;
+ nm_completion_args args;
orig_mode = nm_device_get_mode (dev);
if (orig_mode == NETWORK_MODE_ADHOC)
@@ -3762,9 +3791,13 @@
nm_device_set_frequency (dev, 0);
scan_results = g_malloc0 (sizeof (NMWirelessScanResults));
+
+ args[0] = dev;
+ args[1] = &err;
+ args[2] = sk;
+ args[3] = scan_results;
nm_wait_for_completion(max_wait, max_wait/20,
- nm_completion_scan_has_results, NULL,
- dev, &err, sk, scan_results);
+ nm_completion_scan_has_results, NULL, args);
nm_device_set_mode (dev, orig_mode);
/* Only set frequency if ad-hoc mode */
Index: src/NetworkManagerUtils.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerUtils.c,v
retrieving revision 1.34
diff -u -r1.34 NetworkManagerUtils.c
--- src/NetworkManagerUtils.c 15 Apr 2005 20:00:28 -0000 1.34
+++ src/NetworkManagerUtils.c 21 Apr 2005 18:01:23 -0000
@@ -651,7 +651,7 @@
const guint interval_usecs,
nm_completion_func test_func,
nm_completion_func action_func,
- va_list args)
+ nm_completion_args args)
{
int try;
gboolean finished = FALSE;
@@ -690,21 +690,19 @@
}
}
+/* these should probably be moved to NetworkManagerUtils.h as macros
+ * since they don't do varargs stuff any more */
void nm_wait_for_completion_or_timeout(
const int max_tries,
const struct timeval *max_time,
const guint interval_usecs,
nm_completion_func test_func,
nm_completion_func action_func,
- ...)
+ nm_completion_args args)
{
- va_list ap;
- va_start(ap, action_func);
-
nm_v_wait_for_completion_or_timeout(max_tries, max_time,
interval_usecs, test_func,
- action_func, ap);
- va_end(ap);
+ action_func, args);
}
void nm_wait_for_completion(
@@ -712,15 +710,11 @@
const guint interval_usecs,
nm_completion_func test_func,
nm_completion_func action_func,
- ...)
+ nm_completion_args args)
{
- va_list ap;
- va_start(ap, action_func);
-
nm_v_wait_for_completion_or_timeout(max_tries, NULL,
interval_usecs, test_func,
- action_func, ap);
- va_end(ap);
+ action_func, args);
}
void nm_wait_for_timeout(
@@ -728,24 +722,19 @@
const guint interval_usecs,
nm_completion_func test_func,
nm_completion_func action_func,
- ...)
+ nm_completion_args args)
{
- va_list ap;
- va_start(ap, action_func);
-
- nm_v_wait_for_completion_or_timeout(-1, max_time,
- interval_usecs, test_func,
- action_func, ap);
- va_end(ap);
+ nm_v_wait_for_completion_or_timeout(-1, max_time, interval_usecs,
+ test_func, action_func, args);
}
/* you can use these, but they're really just examples */
-gboolean nm_completion_boolean_test(int tries, va_list args)
+gboolean nm_completion_boolean_test(int tries, nm_completion_args args)
{
- gboolean *condition = va_arg(args, gboolean *);
- char *message = va_arg(args, char *);
- int log_level = va_arg(args, int);
- int log_interval = va_arg(args, int);
+ gboolean *condition = (gboolean *)args[0];
+ char *message = (char *)args[1];
+ int log_level = (int)args[2];
+ int log_interval = (int)args[3];
g_return_val_if_fail (condition != NULL, TRUE);
@@ -767,14 +756,16 @@
return FALSE;
}
-gboolean nm_completion_boolean_function1_test(int tries, va_list args)
+gboolean nm_completion_boolean_function1_test(int tries,
+ nm_completion_args args)
{
- nm_completion_boolean_function_1 condition =
- va_arg(args, nm_completion_boolean_function_1);
- char *message = va_arg(args, char *);
- int log_level = va_arg(args, int);
- int log_interval = va_arg(args, int);
- u_int64_t arg0 = va_arg(args, unsigned long long);
+ nm_completion_boolean_function_1 condition = args[0];
+ char *message = args[1];
+ int log_level = (int)args[2];
+ int log_interval = (int)args[3];
+ u_int64_t arg0;
+
+ memcpy(&arg0, &args[4], sizeof (arg0));
g_return_val_if_fail (condition, TRUE);
@@ -788,15 +779,17 @@
return FALSE;
}
-gboolean nm_completion_boolean_function2_test(int tries, va_list args)
+gboolean nm_completion_boolean_function2_test(int tries,
+ nm_completion_args args)
{
- nm_completion_boolean_function_2 condition =
- va_arg(args, nm_completion_boolean_function_2);
- char *message = va_arg(args, char *);
- int log_level = va_arg(args, int);
- int log_interval = va_arg(args, int);
- u_int64_t arg0 = va_arg(args, unsigned long long);
- u_int64_t arg1 = va_arg(args, unsigned long long);
+ nm_completion_boolean_function_2 condition = args[0];
+ char *message = args[1];
+ int log_level = (int)args[2];
+ int log_interval = (int)args[3];
+ u_int64_t arg0, arg1;
+
+ memcpy(&arg0, &args[4], sizeof (arg0));
+ memcpy(&arg1, &args[4]+sizeof (arg0), sizeof (arg1));
g_return_val_if_fail (condition, TRUE);
Index: src/NetworkManagerUtils.h
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerUtils.h,v
retrieving revision 1.13
diff -u -r1.13 NetworkManagerUtils.h
--- src/NetworkManagerUtils.h 6 Apr 2005 16:45:48 -0000 1.13
+++ src/NetworkManagerUtils.h 21 Apr 2005 18:01:23 -0000
@@ -66,7 +66,9 @@
#define NM_COMPLETION_TRIES_INFINITY -1
-typedef gboolean (*nm_completion_func)(int tries, va_list args);
+typedef void * nm_completion_args[8];
+
+typedef gboolean (*nm_completion_func)(int tries, nm_completion_args args);
typedef gboolean (*nm_completion_boolean_function_1)(u_int64_t arg);
typedef gboolean (*nm_completion_boolean_function_2)(
u_int64_t arg0, u_int64_t arg1);
@@ -76,7 +78,7 @@
const guint interval_usecs,
nm_completion_func test_func,
nm_completion_func action_func,
- ...);
+ nm_completion_args args);
void nm_wait_for_completion_or_timeout(
const int max_tries,
@@ -84,18 +86,20 @@
const guint interval_usecs,
nm_completion_func test_func,
nm_completion_func action_func,
- ...);
+ nm_completion_args args);
void nm_wait_for_timeout(
const struct timeval *max_time,
const guint interval_usecs,
nm_completion_func test_func,
nm_completion_func action_func,
- ...);
+ nm_completion_args args);
-gboolean nm_completion_boolean_test(int tries, va_list args);
-gboolean nm_completion_boolean_function1_test(int tries, va_list args);
-gboolean nm_completion_boolean_function2_test(int tries, va_list args);
+gboolean nm_completion_boolean_test(int tries, nm_completion_args args);
+gboolean nm_completion_boolean_function1_test(int tries,
+ nm_completion_args args);
+gboolean nm_completion_boolean_function2_test(int tries,
+ nm_completion_args args);
#define nm_completion_boolean_function_test nm_completion_boolean_function1_test
#endif
Index: vpn-daemons/vpnc/nm-vpnc-service.c
NetworkManager-0.4-use-thread-join.patch:
NetworkManagerDevice.c | 9 ++++-----
NetworkManagerDevicePrivate.h | 2 +-
2 files changed, 5 insertions(+), 6 deletions(-)
--- NEW FILE NetworkManager-0.4-use-thread-join.patch ---
Index: src/NetworkManagerDevice.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerDevice.c,v
retrieving revision 1.121
diff -u -r1.121 NetworkManagerDevice.c
--- src/NetworkManagerDevice.c 6 Apr 2005 19:16:31 -0000 1.121
+++ src/NetworkManagerDevice.c 14 Apr 2005 14:13:32 -0000
@@ -381,7 +381,8 @@
nm_system_device_update_config_info (dev);
}
- if (!g_thread_create (nm_device_worker, dev, FALSE, &error))
+ dev->worker = g_thread_create (nm_device_worker, dev, TRUE, &error);
+ if (!dev->worker)
{
nm_error ("could not create device worker thread. (glib said: '%s')", error->message);
g_error_free (error);
@@ -512,7 +513,6 @@
dev->loop = NULL;
dev->context = NULL;
- dev->worker_done = TRUE;
nm_device_unref (dev);
return NULL;
@@ -525,9 +525,8 @@
if (dev->loop)
g_main_loop_quit (dev->loop);
- nm_wait_for_completion(NM_COMPLETION_TRIES_INFINITY, 300,
- nm_completion_boolean_test, NULL, &dev->worker_done,
- NULL, NULL, 0);
+ g_thread_join(dev->worker);
+ dev->worker = NULL;
}
Index: src/NetworkManagerDevicePrivate.h
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerDevicePrivate.h,v
retrieving revision 1.11
diff -u -r1.11 NetworkManagerDevicePrivate.h
--- src/NetworkManagerDevicePrivate.h 1 Apr 2005 21:30:12 -0000 1.11
+++ src/NetworkManagerDevicePrivate.h 14 Apr 2005 14:13:32 -0000
@@ -106,7 +106,7 @@
GMainContext *context;
GMainLoop *loop;
- gboolean worker_done;
+ GThread *worker;
gboolean worker_started;
guint renew_timeout;
guint rebind_timeout;
Index: NetworkManager.spec
===================================================================
RCS file: /cvs/dist/rpms/NetworkManager/devel/NetworkManager.spec,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -r1.42 -r1.43
--- NetworkManager.spec 27 Apr 2005 05:17:34 -0000 1.42
+++ NetworkManager.spec 4 May 2005 18:33:15 -0000 1.43
@@ -13,6 +13,12 @@
URL: http://people.redhat.com/dcbw/NetworkManager/
Source: %{name}-%{version}.cvs20050404.tar.gz
Patch0: NetworkManager-0.4-newdbus.patch
+Patch1: NetworkManager-0.4-leak-fixes.patch
+Patch2: NetworkManager-0.4-use-thread-join.patch
+Patch3: NetworkManager-0.4-assert-fix.patch
+Patch4: NetworkManager-0.4-devup.patch
+Patch5: NetworkManager-0.4-aplist-fix-hidden.patch
+Patch6: NetworkManager-0.4-novarargs.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-root
PreReq: chkconfig
@@ -86,7 +92,13 @@
%prep
%setup -q
-%patch0 -p1
+%patch0 -p1 -b .dbus-0.32
+%patch1 -p0 -b .leak-fixes
+%patch2 -p0 -b .use-thread-join
+%patch3 -p1 -b .assert-fix
+%patch4 -p1 -b .devup
+%patch5 -p1 -b .aplist-fix-hidden
+%patch6 -p0 -b .no-varargs
%build
@@ -168,6 +180,14 @@
%changelog
+* Wed May 4 2005 Dan Williams <dcbw at redhat.com> - 0.4-9.cvs20050404
+- Fix some memory leaks (Tom Parker)
+- Join to threads rather than spinning for their completion (Tom Parker)
+- Fix misuse of a g_assert() (Colin Walters)
+- Fix return checking of an ioctl() (Bill Moss)
+- Better detection and matching of hidden access points (Bill Moss)
+- Don't use varargs, and therefore don't crash on PPC (Peter Jones)
+
* Wed Apr 27 2005 Jeremy Katz <katzj at redhat.com> - 0.4-8.cvs20050404
- fix build with newer dbus
More information about the fedora-cvs-commits
mailing list