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

Patch from Peter Jones:
	* Remove usage of varargs to fix crashes on PPC (RH #154336)

	Patch from Bill Moss:
	* src/NetworkManagerSystem.c
		- Fix checking of return value from ioctl()


git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@592 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
Dan Williams
2005-04-28 02:50:54 +00:00
parent 0219e1746d
commit aac770c185
5 changed files with 144 additions and 105 deletions

View File

@@ -1,3 +1,12 @@
2005-04-27 Dan Williams <dcbw@redhat.com>
Patch from Peter Jones:
* Remove usage of varargs to fix crashes on PPC (RH #154336)
Patch from Bill Moss:
* src/NetworkManagerSystem.c
- Fix checking of return value from ioctl()
2005-04-27 Dan Williams <dcbw@redhat.com> 2005-04-27 Dan Williams <dcbw@redhat.com>
* Fix choosing of wireless networks and "Other wireless network..." from the applet * Fix choosing of wireless networks and "Other wireless network..." from the applet

View File

@@ -258,6 +258,7 @@ NMDevice *nm_device_new (const char *iface, const char *udi, gboolean test_dev,
{ {
NMDevice *dev; NMDevice *dev;
GError *error = NULL; GError *error = NULL;
nm_completion_args args;
g_return_val_if_fail (iface != NULL, NULL); g_return_val_if_fail (iface != NULL, NULL);
g_return_val_if_fail (strlen (iface) > 0, NULL); g_return_val_if_fail (strlen (iface) > 0, NULL);
@@ -391,11 +392,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. */ /* 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, nm_wait_for_completion (NM_COMPLETION_TRIES_INFINITY,
G_USEC_PER_SEC / 20, nm_completion_boolean_test, NULL, G_USEC_PER_SEC / 20, nm_completion_boolean_test, NULL, args);
&dev->worker_started,
"nm_device_new(): waiting for device's worker thread to start",
LOG_INFO, 0);
nm_info ("nm_device_new(): device's worker thread started, continuing."); nm_info ("nm_device_new(): device's worker thread started, continuing.");
return (dev); return (dev);
@@ -1564,16 +1567,13 @@ gboolean nm_device_is_up (NMDevice *dev)
} }
/* I really wish nm_v_wait_for_completion_or_timeout could translate these /* 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 * to first class args instead of a all this void * arg stuff, so these
* and _tiny_. * helpers could be nice and _tiny_. */
* gboolean nm_completion_device_is_up_test(int tries, nm_completion_args args)
* ... 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 *); NMDevice *dev = args[0];
gboolean *err = va_arg(args, gboolean *); gboolean *err = args[1];
gboolean cancelable = va_arg(args, gboolean); gboolean cancelable = (gboolean)args[2];
g_return_val_if_fail (dev != NULL, TRUE); g_return_val_if_fail (dev != NULL, TRUE);
g_return_val_if_fail (err != NULL, TRUE); g_return_val_if_fail (err != NULL, TRUE);
@@ -1598,13 +1598,17 @@ void nm_device_bring_up (NMDevice *dev)
gboolean nm_device_bring_up_wait (NMDevice *dev, gboolean cancelable) gboolean nm_device_bring_up_wait (NMDevice *dev, gboolean cancelable)
{ {
gboolean err = FALSE; gboolean err = FALSE;
nm_completion_args args;
g_return_val_if_fail (dev != NULL, TRUE); g_return_val_if_fail (dev != NULL, TRUE);
nm_device_bring_up (dev); 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_wait_for_completion(400, G_USEC_PER_SEC / 200, NULL,
nm_completion_device_is_up_test, dev, nm_completion_device_is_up_test, args);
&err, cancelable);
if (err) if (err)
nm_info ("failed to bring device up"); nm_info ("failed to bring device up");
return err; return err;
@@ -1617,11 +1621,11 @@ void nm_device_bring_down (NMDevice *dev)
nm_device_set_up_down (dev, FALSE); 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 *); NMDevice *dev = args[0];
gboolean *err = va_arg(args, gboolean *); gboolean *err = args[1];
gboolean cancelable = va_arg(args, gboolean); gboolean cancelable = (gboolean)args[2];
g_return_val_if_fail (dev != NULL, TRUE); g_return_val_if_fail (dev != NULL, TRUE);
g_return_val_if_fail (err != NULL, TRUE); g_return_val_if_fail (err != NULL, TRUE);
@@ -1639,13 +1643,17 @@ gboolean nm_completion_device_is_down_test (int tries, va_list args)
gboolean nm_device_bring_down_wait (NMDevice *dev, gboolean cancelable) gboolean nm_device_bring_down_wait (NMDevice *dev, gboolean cancelable)
{ {
gboolean err = FALSE; gboolean err = FALSE;
nm_completion_args args;
g_return_val_if_fail (dev != NULL, TRUE); g_return_val_if_fail (dev != NULL, TRUE);
nm_device_bring_down (dev); 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_wait_for_completion(400, G_USEC_PER_SEC / 200, NULL,
nm_completion_device_is_down_test, dev, nm_completion_device_is_down_test, args);
&err, cancelable);
if (err) if (err)
nm_info ("failed to bring device down"); nm_info ("failed to bring device down");
return err; return err;
@@ -1850,13 +1858,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 *); NMDevice *dev = args[0];
guint *assoc_count = va_arg (args, guint *); guint *assoc_count = args[1];
double *last_freq = va_arg (args, double *); double *last_freq = args[2];
char *essid = va_arg (args, char *); char *essid = args[3];
int required = va_arg (args, int); int required = (int)args[4];
double cur_freq = nm_device_get_frequency (dev); double cur_freq = nm_device_get_frequency (dev);
gboolean assoc = nm_device_wireless_is_associated (dev); gboolean assoc = nm_device_wireless_is_associated (dev);
@@ -1904,6 +1912,7 @@ static gboolean nm_device_wireless_wait_for_link (NMDevice *dev, const char *ess
double last_freq = 0; double last_freq = 0;
guint assoc_count = 0; guint assoc_count = 0;
struct timeval timeout = { .tv_sec = 0, .tv_usec = 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 /* we want to sleep for a very short amount of time, to minimize
* hysteresis on the boundaries of our required time. But we * hysteresis on the boundaries of our required time. But we
@@ -1929,9 +1938,13 @@ static gboolean nm_device_wireless_wait_for_link (NMDevice *dev, const char *ess
* associated, the driver stops scanning. To detect that, we look * associated, the driver stops scanning. To detect that, we look
* for the essid and frequency to remain constant for 3 seconds. * for the essid and frequency to remain constant for 3 seconds.
* When it remains constant, we assume it's a real link. */ * 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_wait_for_timeout (&timeout, G_USEC_PER_SEC / delay,
nm_dwwfl_test, nm_dwwfl_test, dev, &assoc, nm_dwwfl_test, nm_dwwfl_test, args);
&last_freq, essid, required_tries * 2);
/* If we've had a reasonable association count, we say we have a link */ /* If we've had a reasonable association count, we say we have a link */
if (assoc > required_tries) if (assoc > required_tries)
@@ -1940,10 +1953,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 *); NMDevice *dev = args[0];
gboolean *err = va_arg(args, gboolean *); gboolean *err = args[1];
g_return_val_if_fail (dev != NULL, TRUE); g_return_val_if_fail (dev != NULL, TRUE);
g_return_val_if_fail (err != NULL, TRUE); g_return_val_if_fail (err != NULL, TRUE);
@@ -1962,10 +1975,13 @@ static gboolean nm_device_is_up_and_associated_wait (NMDevice *dev, int timeout,
gboolean err; gboolean err;
const gint delay = (G_USEC_PER_SEC * nm_device_get_association_pause_value (dev)) / interval; const gint delay = (G_USEC_PER_SEC * nm_device_get_association_pause_value (dev)) / interval;
const gint max_cycles = timeout * interval; const gint max_cycles = timeout * interval;
nm_completion_args args;
g_return_val_if_fail (dev != NULL, TRUE); 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; return !err;
} }
@@ -2231,11 +2247,11 @@ void invalidate_ap (NMDevice *dev, NMAccessPoint *ap)
/* this gets called without the scan mutex held */ /* 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 *); NMDevice *dev = args[0];
NMAccessPoint **best_ap = va_arg (args, NMAccessPoint **); NMAccessPoint **best_ap = args[1];
gboolean *err = va_arg (args, gboolean *); gboolean *err = args[2];
g_return_val_if_fail (dev != NULL, TRUE); g_return_val_if_fail (dev != NULL, TRUE);
g_return_val_if_fail (best_ap != NULL, TRUE); g_return_val_if_fail (best_ap != NULL, TRUE);
@@ -2283,10 +2299,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 *); NMDevice *dev = args[0];
gboolean *err = va_arg (args, gboolean *); gboolean *err = args[1];
g_return_val_if_fail (dev != NULL, TRUE); g_return_val_if_fail (dev != NULL, TRUE);
g_return_val_if_fail (err != NULL, TRUE); g_return_val_if_fail (err != NULL, TRUE);
@@ -2321,6 +2337,7 @@ static gboolean nm_device_activate_wireless (NMDevice *dev)
gboolean need_key = FALSE; gboolean need_key = FALSE;
gboolean found_ap = FALSE; gboolean found_ap = FALSE;
gboolean err = FALSE; gboolean err = FALSE;
nm_completion_args args;
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);
@@ -2346,7 +2363,11 @@ get_ap:
nm_device_set_now_scanning (dev, TRUE); nm_device_set_now_scanning (dev, TRUE);
/* Get an access point to connect to */ /* 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) if (err)
{ {
/* Wierd as it may seem, we lock here to balance the unlock in "out:" */ /* Wierd as it may seem, we lock here to balance the unlock in "out:" */
@@ -2397,8 +2418,11 @@ need_key:
/* Wait for the key to come back */ /* Wait for the key to come back */
nm_debug ("Activation (%s/wireless): asking for user key.", nm_device_get_iface (dev)); 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)); nm_debug ("Activation (%s/wireless): user key received.", nm_device_get_iface (dev));
/* Done waiting, grab lock again */ /* Done waiting, grab lock again */
@@ -2706,9 +2730,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); g_return_val_if_fail (dev != NULL, TRUE);
@@ -2743,6 +2767,8 @@ static gboolean nm_ac_test (int tries, va_list args)
*/ */
void nm_device_activation_cancel (NMDevice *dev) void nm_device_activation_cancel (NMDevice *dev)
{ {
nm_completion_args args;
g_return_if_fail (dev != NULL); g_return_if_fail (dev != NULL);
if (nm_device_is_activating (dev)) if (nm_device_is_activating (dev))
@@ -2754,8 +2780,9 @@ void nm_device_activation_cancel (NMDevice *dev)
* The other problem with waiting here is that we hold up dbus traffic * The other problem with waiting here is that we hold up dbus traffic
* that we should respond to. * that we should respond to.
*/ */
args[0] = dev;
nm_wait_for_completion(NM_COMPLETION_TRIES_INFINITY, 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)); nm_debug ("Activation (%s/wireless): cancelled.", nm_device_get_iface(dev));
nm_schedule_state_change_signal_broadcast (dev->app_data); nm_schedule_state_change_signal_broadcast (dev->app_data);
} }
@@ -3646,12 +3673,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 *); NMDevice *dev = args[0];
gboolean *err = va_arg (args, gboolean *); gboolean *err = args[1];
NMSock *sk = va_arg (args, NMSock *); NMSock *sk = args[2];
NMWirelessScanResults *scan_results = va_arg (args, NMWirelessScanResults *); NMWirelessScanResults *scan_results = args[3];
int rc; int rc;
g_return_val_if_fail (dev != NULL, TRUE); g_return_val_if_fail (dev != NULL, TRUE);
@@ -3755,6 +3783,7 @@ static gboolean nm_device_wireless_scan (gpointer user_data)
double orig_freq = 0; double orig_freq = 0;
int orig_rate = 0; int orig_rate = 0;
const int max_wait = G_USEC_PER_SEC * nm_device_get_association_pause_value (dev) /2; 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); orig_mode = nm_device_get_mode (dev);
if (orig_mode == NETWORK_MODE_ADHOC) if (orig_mode == NETWORK_MODE_ADHOC)
@@ -3770,9 +3799,13 @@ static gboolean nm_device_wireless_scan (gpointer user_data)
nm_device_set_frequency (dev, 0); nm_device_set_frequency (dev, 0);
scan_results = g_malloc0 (sizeof (NMWirelessScanResults)); 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_wait_for_completion(max_wait, max_wait/20,
nm_completion_scan_has_results, NULL, nm_completion_scan_has_results, NULL, args);
dev, &err, sk, scan_results);
nm_device_set_mode (dev, orig_mode); nm_device_set_mode (dev, orig_mode);
/* Only set frequency if ad-hoc mode */ /* Only set frequency if ad-hoc mode */

View File

@@ -277,19 +277,19 @@ gboolean nm_system_device_set_up_down_with_iface (NMDevice *dev, const char *ifa
/* Get flags already there */ /* Get flags already there */
memset (&ifr, 0, sizeof (struct ifreq)); memset (&ifr, 0, sizeof (struct ifreq));
memcpy (ifr.ifr_name, iface, strlen (iface)); memcpy (ifr.ifr_name, iface, strlen (iface));
if (!ioctl (nm_dev_sock_get_fd (sk), SIOCGIFFLAGS, &ifr)) if (ioctl (nm_dev_sock_get_fd (sk), SIOCGIFFLAGS, &ifr) == -1)
nm_warning ("nm_system_device_set_up_down_with_iface() could not get flags for device %s. errno = %d", iface, errno );
else
{ {
/* If the interface doesn't have those flags already, set them on it. */ /* If the interface doesn't have those flags already, set them on it. */
if ((ifr.ifr_flags^flags) & IFF_UP) if ((ifr.ifr_flags^flags) & IFF_UP)
{ {
ifr.ifr_flags &= ~IFF_UP; ifr.ifr_flags &= ~IFF_UP;
ifr.ifr_flags |= IFF_UP & flags; ifr.ifr_flags |= IFF_UP & flags;
if (ioctl (nm_dev_sock_get_fd (sk), SIOCSIFFLAGS, &ifr)) if (ioctl (nm_dev_sock_get_fd (sk), SIOCSIFFLAGS, &ifr) == -1)
nm_warning ("nm_system_device_set_up_down_with_iface() could not bring device %s %s. errno = %d", iface, (up ? "up" : "down"), errno); nm_warning ("nm_system_device_set_up_down_with_iface() could not bring device %s %s. errno = %d", iface, (up ? "up" : "down"), errno);
} }
} }
else
nm_warning ("nm_system_device_set_up_down_with_iface() could not get flags for device %s. errno = %d", iface, errno );
nm_dev_sock_close (sk); nm_dev_sock_close (sk);
return success; return success;

View File

@@ -651,7 +651,7 @@ static void nm_v_wait_for_completion_or_timeout(
const guint interval_usecs, const guint interval_usecs,
nm_completion_func test_func, nm_completion_func test_func,
nm_completion_func action_func, nm_completion_func action_func,
va_list args) nm_completion_args args)
{ {
int try; int try;
gboolean finished = FALSE; 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( void nm_wait_for_completion_or_timeout(
const int max_tries, const int max_tries,
const struct timeval *max_time, const struct timeval *max_time,
const guint interval_usecs, const guint interval_usecs,
nm_completion_func test_func, nm_completion_func test_func,
nm_completion_func action_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, nm_v_wait_for_completion_or_timeout(max_tries, max_time,
interval_usecs, test_func, interval_usecs, test_func,
action_func, ap); action_func, args);
va_end(ap);
} }
void nm_wait_for_completion( void nm_wait_for_completion(
@@ -712,15 +710,11 @@ void nm_wait_for_completion(
const guint interval_usecs, const guint interval_usecs,
nm_completion_func test_func, nm_completion_func test_func,
nm_completion_func action_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, nm_v_wait_for_completion_or_timeout(max_tries, NULL,
interval_usecs, test_func, interval_usecs, test_func,
action_func, ap); action_func, args);
va_end(ap);
} }
void nm_wait_for_timeout( void nm_wait_for_timeout(
@@ -728,24 +722,19 @@ void nm_wait_for_timeout(
const guint interval_usecs, const guint interval_usecs,
nm_completion_func test_func, nm_completion_func test_func,
nm_completion_func action_func, nm_completion_func action_func,
...) nm_completion_args args)
{ {
va_list ap; nm_v_wait_for_completion_or_timeout(-1, max_time, interval_usecs,
va_start(ap, action_func); test_func, action_func, args);
nm_v_wait_for_completion_or_timeout(-1, max_time,
interval_usecs, test_func,
action_func, ap);
va_end(ap);
} }
/* you can use these, but they're really just examples */ /* 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 *); gboolean *condition = (gboolean *)args[0];
char *message = va_arg(args, char *); char *message = (char *)args[1];
int log_level = va_arg(args, int); int log_level = (int)args[2];
int log_interval = va_arg(args, int); int log_interval = (int)args[3];
g_return_val_if_fail (condition != NULL, TRUE); g_return_val_if_fail (condition != NULL, TRUE);
@@ -767,14 +756,16 @@ gboolean nm_completion_boolean_test(int tries, va_list args)
return FALSE; 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 = nm_completion_boolean_function_1 condition = args[0];
va_arg(args, nm_completion_boolean_function_1); char *message = args[1];
char *message = va_arg(args, char *); int log_level = (int)args[2];
int log_level = va_arg(args, int); int log_interval = (int)args[3];
int log_interval = va_arg(args, int); u_int64_t arg0;
u_int64_t arg0 = va_arg(args, unsigned long long);
memcpy(&arg0, &args[4], sizeof (arg0));
g_return_val_if_fail (condition, TRUE); g_return_val_if_fail (condition, TRUE);
@@ -788,15 +779,17 @@ gboolean nm_completion_boolean_function1_test(int tries, va_list args)
return FALSE; 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 = nm_completion_boolean_function_2 condition = args[0];
va_arg(args, nm_completion_boolean_function_2); char *message = args[1];
char *message = va_arg(args, char *); int log_level = (int)args[2];
int log_level = va_arg(args, int); int log_interval = (int)args[3];
int log_interval = va_arg(args, int); u_int64_t arg0, arg1;
u_int64_t arg0 = va_arg(args, unsigned long long);
u_int64_t arg1 = va_arg(args, unsigned long long); memcpy(&arg0, &args[4], sizeof (arg0));
memcpy(&arg1, &args[4]+sizeof (arg0), sizeof (arg1));
g_return_val_if_fail (condition, TRUE); g_return_val_if_fail (condition, TRUE);

View File

@@ -66,7 +66,9 @@ NMDriverSupportLevel nm_get_driver_support_level (LibHalContext *ctx, NMDevice
#define NM_COMPLETION_TRIES_INFINITY -1 #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_1)(u_int64_t arg);
typedef gboolean (*nm_completion_boolean_function_2)( typedef gboolean (*nm_completion_boolean_function_2)(
u_int64_t arg0, u_int64_t arg1); u_int64_t arg0, u_int64_t arg1);
@@ -76,7 +78,7 @@ void nm_wait_for_completion(
const guint interval_usecs, const guint interval_usecs,
nm_completion_func test_func, nm_completion_func test_func,
nm_completion_func action_func, nm_completion_func action_func,
...); nm_completion_args args);
void nm_wait_for_completion_or_timeout( void nm_wait_for_completion_or_timeout(
const int max_tries, const int max_tries,
@@ -84,18 +86,20 @@ void nm_wait_for_completion_or_timeout(
const guint interval_usecs, const guint interval_usecs,
nm_completion_func test_func, nm_completion_func test_func,
nm_completion_func action_func, nm_completion_func action_func,
...); nm_completion_args args);
void nm_wait_for_timeout( void nm_wait_for_timeout(
const struct timeval *max_time, const struct timeval *max_time,
const guint interval_usecs, const guint interval_usecs,
nm_completion_func test_func, nm_completion_func test_func,
nm_completion_func action_func, nm_completion_func action_func,
...); nm_completion_args args);
gboolean nm_completion_boolean_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, va_list args); gboolean nm_completion_boolean_function1_test(int tries,
gboolean nm_completion_boolean_function2_test(int tries, va_list args); 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 #define nm_completion_boolean_function_test nm_completion_boolean_function1_test
#endif #endif