summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2005-06-16 03:15:41 +0000
committerDan Williams <dcbw@redhat.com>2005-06-16 03:15:41 +0000
commit527d6da55803cee4c4104ea3890717f30234e3f2 (patch)
tree3a9307f3c0f34b44bc1bc31c052777984acdbc5d
parentff0da0b556efcd230c8db57a29c536e0417c08c0 (diff)
downloadNetworkManager-527d6da55803cee4c4104ea3890717f30234e3f2.tar.gz
2005-04-27 Dan Williams <dcbw@redhat.com>
Patch from Peter Jones: * Remove usage of varargs to fix crashes on PPC (RH #154336) git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/branches/FC4_BRANCH@676 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
-rw-r--r--ChangeLog5
-rw-r--r--src/NetworkManagerDevice.c139
-rw-r--r--src/NetworkManagerUtils.c75
-rw-r--r--src/NetworkManagerUtils.h18
4 files changed, 136 insertions, 101 deletions
diff --git a/ChangeLog b/ChangeLog
index 056f9afb6c..dbc1ecbc10 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2005-04-27 Dan Williams <dcbw@redhat.com>
+
+ Patch from Peter Jones:
+ * Remove usage of varargs to fix crashes on PPC (RH #154336)
+
2005-04-15 Dan Williams <dcbw@redhat.com>
* libnm_glib/libnm_glib: Fix up for dbus-0.32, and remove
diff --git a/src/NetworkManagerDevice.c b/src/NetworkManagerDevice.c
index 7e4dfd3108..64535481e8 100644
--- a/src/NetworkManagerDevice.c
+++ b/src/NetworkManagerDevice.c
@@ -258,6 +258,7 @@ NMDevice *nm_device_new (const char *iface, const char *udi, gboolean test_dev,
{
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);
@@ -390,11 +391,13 @@ NMDevice *nm_device_new (const char *iface, const char *udi, gboolean test_dev,
}
/* 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);
@@ -1584,16 +1587,13 @@ gboolean nm_device_is_up (NMDevice *dev)
}
/* 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)
+ * 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 = 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);
@@ -1618,13 +1618,17 @@ void nm_device_bring_up (NMDevice *dev)
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;
@@ -1637,11 +1641,11 @@ void nm_device_bring_down (NMDevice *dev)
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);
@@ -1659,13 +1663,17 @@ gboolean nm_completion_device_is_down_test(int tries, va_list args)
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;
@@ -1868,13 +1876,13 @@ static gboolean nm_device_activation_handle_cancel (NMDevice *dev)
}
-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);
@@ -1922,6 +1930,7 @@ static gboolean nm_device_wireless_wait_for_link (NMDevice *dev, const char *ess
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
@@ -1947,9 +1956,13 @@ static gboolean nm_device_wireless_wait_for_link (NMDevice *dev, const char *ess
* 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)
@@ -1958,10 +1971,10 @@ static gboolean nm_device_wireless_wait_for_link (NMDevice *dev, const char *ess
}
-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);
@@ -1980,10 +1993,13 @@ static gboolean nm_device_is_up_and_associated_wait (NMDevice *dev, int timeout,
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;
}
@@ -2249,11 +2265,11 @@ void invalidate_ap (NMDevice *dev, NMAccessPoint *ap)
/* 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);
@@ -2303,10 +2319,10 @@ static gboolean nm_wa_test (int tries, va_list args)
}
-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);
@@ -2341,6 +2357,7 @@ static gboolean nm_device_activate_wireless (NMDevice *dev)
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);
@@ -2366,7 +2383,11 @@ get_ap:
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:" */
@@ -2417,8 +2438,11 @@ need_key:
/* 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 */
@@ -2729,9 +2753,9 @@ gboolean nm_device_activation_should_cancel (NMDevice *dev)
}
-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);
@@ -2766,6 +2790,8 @@ static gboolean nm_ac_test (int tries, va_list args)
*/
void nm_device_activation_cancel (NMDevice *dev)
{
+ nm_completion_args args;
+
g_return_if_fail (dev != NULL);
if (nm_device_is_activating (dev))
@@ -2777,8 +2803,9 @@ void nm_device_activation_cancel (NMDevice *dev)
* 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));
}
}
@@ -3649,12 +3676,13 @@ static gboolean nm_device_wireless_process_scan_results (gpointer user_data)
}
-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 *);
- NMSock *sk = va_arg (args, NMSock *);
- 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);
@@ -3758,6 +3786,7 @@ static gboolean nm_device_wireless_scan (gpointer user_data)
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)
@@ -3773,9 +3802,13 @@ static gboolean nm_device_wireless_scan (gpointer user_data)
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 */
diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c
index 62b0150ce6..d60482f3a4 100644
--- a/src/NetworkManagerUtils.c
+++ b/src/NetworkManagerUtils.c
@@ -651,7 +651,7 @@ static void nm_v_wait_for_completion_or_timeout(
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 @@ static void nm_v_wait_for_completion_or_timeout(
}
}
+/* 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 @@ void nm_wait_for_completion(
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 @@ void nm_wait_for_timeout(
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 @@ gboolean nm_completion_boolean_test(int tries, va_list args)
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 @@ gboolean nm_completion_boolean_function1_test(int tries, va_list args)
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);
diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h
index 457c9e71b1..6def8fe05c 100644
--- a/src/NetworkManagerUtils.h
+++ b/src/NetworkManagerUtils.h
@@ -66,7 +66,9 @@ NMDriverSupportLevel nm_get_driver_support_level (LibHalContext *ctx, NMDevice
#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 @@ void nm_wait_for_completion(
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 @@ void nm_wait_for_completion_or_timeout(
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