summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bin/Makefile.am2
-rw-r--r--bin/Makefile.in17
-rw-r--r--bin/wimaxll-pl-state-get.c96
-rw-r--r--include/wimaxll.h1
-rw-r--r--lib/Makefile.am1
-rw-r--r--lib/Makefile.in17
-rw-r--r--lib/op-state-get.c112
7 files changed, 240 insertions, 6 deletions
diff --git a/bin/Makefile.am b/bin/Makefile.am
index c8df30d..04fc860 100644
--- a/bin/Makefile.am
+++ b/bin/Makefile.am
@@ -38,6 +38,7 @@ plugindir = $(pkglibdir)/plugins
plugin_LTLIBRARIES = \
wimaxll-pl-reset.la \
wimaxll-pl-rfkill.la \
+ wimaxll-pl-state-get.la \
wimaxll-pl-wfsc.la
plugin_LDFLAGS = -no-undefined -module -avoid-version \
@@ -45,4 +46,5 @@ plugin_LDFLAGS = -no-undefined -module -avoid-version \
wimaxll_pl_reset_la_LDFLAGS = $(plugin_LDFLAGS)
wimaxll_pl_rfkill_la_LDFLAGS = $(plugin_LDFLAGS)
+wimaxll_pl_state_get_la_LDFLAGS = $(plugin_LDFLAGS)
wimaxll_pl_wfsc_la_LDFLAGS = $(plugin_LDFLAGS)
diff --git a/bin/Makefile.in b/bin/Makefile.in
index 655cc60..edbe3a7 100644
--- a/bin/Makefile.in
+++ b/bin/Makefile.in
@@ -67,6 +67,12 @@ wimaxll_pl_rfkill_la_OBJECTS = wimaxll-pl-rfkill.lo
wimaxll_pl_rfkill_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(wimaxll_pl_rfkill_la_LDFLAGS) $(LDFLAGS) -o $@
+wimaxll_pl_state_get_la_LIBADD =
+wimaxll_pl_state_get_la_SOURCES = wimaxll-pl-state-get.c
+wimaxll_pl_state_get_la_OBJECTS = wimaxll-pl-state-get.lo
+wimaxll_pl_state_get_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(wimaxll_pl_state_get_la_LDFLAGS) $(LDFLAGS) -o $@
wimaxll_pl_wfsc_la_LIBADD =
wimaxll_pl_wfsc_la_SOURCES = wimaxll-pl-wfsc.c
wimaxll_pl_wfsc_la_OBJECTS = wimaxll-pl-wfsc.lo
@@ -96,10 +102,10 @@ CCLD = $(CC)
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
-SOURCES = wimaxll-pl-reset.c wimaxll-pl-rfkill.c wimaxll-pl-wfsc.c \
- wimaxll.c
+SOURCES = wimaxll-pl-reset.c wimaxll-pl-rfkill.c \
+ wimaxll-pl-state-get.c wimaxll-pl-wfsc.c wimaxll.c
DIST_SOURCES = wimaxll-pl-reset.c wimaxll-pl-rfkill.c \
- wimaxll-pl-wfsc.c wimaxll.c
+ wimaxll-pl-state-get.c wimaxll-pl-wfsc.c wimaxll.c
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -244,6 +250,7 @@ plugindir = $(pkglibdir)/plugins
plugin_LTLIBRARIES = \
wimaxll-pl-reset.la \
wimaxll-pl-rfkill.la \
+ wimaxll-pl-state-get.la \
wimaxll-pl-wfsc.la
plugin_LDFLAGS = -no-undefined -module -avoid-version \
@@ -251,6 +258,7 @@ plugin_LDFLAGS = -no-undefined -module -avoid-version \
wimaxll_pl_reset_la_LDFLAGS = $(plugin_LDFLAGS)
wimaxll_pl_rfkill_la_LDFLAGS = $(plugin_LDFLAGS)
+wimaxll_pl_state_get_la_LDFLAGS = $(plugin_LDFLAGS)
wimaxll_pl_wfsc_la_LDFLAGS = $(plugin_LDFLAGS)
all: all-am
@@ -318,6 +326,8 @@ wimaxll-pl-reset.la: $(wimaxll_pl_reset_la_OBJECTS) $(wimaxll_pl_reset_la_DEPEND
$(wimaxll_pl_reset_la_LINK) -rpath $(plugindir) $(wimaxll_pl_reset_la_OBJECTS) $(wimaxll_pl_reset_la_LIBADD) $(LIBS)
wimaxll-pl-rfkill.la: $(wimaxll_pl_rfkill_la_OBJECTS) $(wimaxll_pl_rfkill_la_DEPENDENCIES)
$(wimaxll_pl_rfkill_la_LINK) -rpath $(plugindir) $(wimaxll_pl_rfkill_la_OBJECTS) $(wimaxll_pl_rfkill_la_LIBADD) $(LIBS)
+wimaxll-pl-state-get.la: $(wimaxll_pl_state_get_la_OBJECTS) $(wimaxll_pl_state_get_la_DEPENDENCIES)
+ $(wimaxll_pl_state_get_la_LINK) -rpath $(plugindir) $(wimaxll_pl_state_get_la_OBJECTS) $(wimaxll_pl_state_get_la_LIBADD) $(LIBS)
wimaxll-pl-wfsc.la: $(wimaxll_pl_wfsc_la_OBJECTS) $(wimaxll_pl_wfsc_la_DEPENDENCIES)
$(wimaxll_pl_wfsc_la_LINK) -rpath $(plugindir) $(wimaxll_pl_wfsc_la_OBJECTS) $(wimaxll_pl_wfsc_la_LIBADD) $(LIBS)
install-binPROGRAMS: $(bin_PROGRAMS)
@@ -379,6 +389,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wimaxll-pl-reset.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wimaxll-pl-rfkill.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wimaxll-pl-state-get.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wimaxll-pl-wfsc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wimaxll.Po@am__quote@
diff --git a/bin/wimaxll-pl-state-get.c b/bin/wimaxll-pl-state-get.c
new file mode 100644
index 0000000..c41d7e0
--- /dev/null
+++ b/bin/wimaxll-pl-state-get.c
@@ -0,0 +1,96 @@
+/*
+ * Linux WiMax
+ * Swiss-army WiMAX knife
+ *
+ *
+ * Copyright (C) 2007-2008 Intel Corporation. All rights reserved.
+ * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Intel Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#define _GNU_SOURCE
+#include <argp.h>
+#include <error.h>
+#include <wimaxll.h>
+#include <wimaxll/version.h>
+#include <wimaxll/cmd.h>
+
+
+static
+struct argp_option state_get_options[] = {
+ { 0 }
+};
+
+static
+int state_get_parser(int key, char *arg, struct argp_state *state)
+{
+ return ARGP_ERR_UNKNOWN;
+}
+
+static
+int state_get_fn(struct cmd *cmd, struct wimaxll_handle *wmx,
+ int argc, char **argv)
+{
+ int result;
+ result = argp_parse(&cmd->argp, argc, argv,
+ ARGP_IN_ORDER | ARGP_PARSE_ARGV0, 0, NULL);
+ if (result < 0)
+ goto error_argp_parse;
+ w_cmd_need_if(wmx);
+ result = wimaxll_state_get(wmx);
+ if (result >= 0)
+ w_print("%s\n", wimaxll_state_to_name(result));
+error_argp_parse:
+ return result;
+}
+
+static
+struct cmd state_get_cmd = {
+ .name = "state-get",
+ .argp = {
+ .options = state_get_options,
+ .parser = state_get_parser,
+ .args_doc = "",
+ .doc = "Gets a WiMAX device's state\n",
+ },
+ .fn = state_get_fn,
+};
+
+static
+int state_get_init(void)
+{
+ return w_cmd_register(&state_get_cmd);
+}
+
+static
+void state_get_exit(void)
+{
+ w_cmd_unregister(&state_get_cmd);
+}
+
+
+PLUGIN("state_get", WIMAXLL_VERSION, state_get_init, state_get_exit);
diff --git a/include/wimaxll.h b/include/wimaxll.h
index ece869b..24e7250 100644
--- a/include/wimaxll.h
+++ b/include/wimaxll.h
@@ -336,6 +336,7 @@ void wimaxll_msg_free(void *);
/* generic API */
int wimaxll_rfkill(struct wimaxll_handle *, enum wimax_rf_state);
int wimaxll_reset(struct wimaxll_handle *);
+int wimaxll_state_get(struct wimaxll_handle *);
void wimaxll_get_cb_state_change(
struct wimaxll_handle *, wimaxll_state_change_cb_f *,
diff --git a/lib/Makefile.am b/lib/Makefile.am
index c42b2c5..77e1cee 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -17,6 +17,7 @@ libwimaxll_sources = \
op-msg.c \
op-reset.c \
op-rfkill.c \
+ op-state-get.c \
re-state-change.c \
wimax.c
diff --git a/lib/Makefile.in b/lib/Makefile.in
index cfec307..f197709 100644
--- a/lib/Makefile.in
+++ b/lib/Makefile.in
@@ -64,7 +64,8 @@ libwimaxll_a_AR = $(AR) $(ARFLAGS)
libwimaxll_a_LIBADD =
am__objects_2 = genl.$(OBJEXT) log.$(OBJEXT) misc.$(OBJEXT) \
op-open.$(OBJEXT) op-msg.$(OBJEXT) op-reset.$(OBJEXT) \
- op-rfkill.$(OBJEXT) re-state-change.$(OBJEXT) wimax.$(OBJEXT)
+ op-rfkill.$(OBJEXT) op-state-get.$(OBJEXT) \
+ re-state-change.$(OBJEXT) wimax.$(OBJEXT)
am_libwimaxll_a_OBJECTS = $(am__objects_2)
libwimaxll_a_OBJECTS = $(am_libwimaxll_a_OBJECTS)
libLTLIBRARIES_INSTALL = $(INSTALL)
@@ -81,8 +82,8 @@ libwimaxll_la_LIBADD =
am__objects_4 = libwimaxll_la-genl.lo libwimaxll_la-log.lo \
libwimaxll_la-misc.lo libwimaxll_la-op-open.lo \
libwimaxll_la-op-msg.lo libwimaxll_la-op-reset.lo \
- libwimaxll_la-op-rfkill.lo libwimaxll_la-re-state-change.lo \
- libwimaxll_la-wimax.lo
+ libwimaxll_la-op-rfkill.lo libwimaxll_la-op-state-get.lo \
+ libwimaxll_la-re-state-change.lo libwimaxll_la-wimax.lo
am_libwimaxll_la_OBJECTS = $(am__objects_4)
libwimaxll_la_OBJECTS = $(am_libwimaxll_la_OBJECTS)
libwimaxll_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
@@ -246,6 +247,7 @@ libwimaxll_sources = \
op-msg.c \
op-reset.c \
op-rfkill.c \
+ op-state-get.c \
re-state-change.c \
wimax.c
@@ -406,6 +408,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwimaxll_la-op-open.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwimaxll_la-op-reset.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwimaxll_la-op-rfkill.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwimaxll_la-op-state-get.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwimaxll_la-re-state-change.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwimaxll_la-wimax.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Po@am__quote@
@@ -414,6 +417,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/op-open.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/op-reset.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/op-rfkill.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/op-state-get.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/re-state-change.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wimax.Po@am__quote@
@@ -494,6 +498,13 @@ libwimaxll_la-op-rfkill.lo: op-rfkill.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libwimaxll_la_CFLAGS) $(CFLAGS) -c -o libwimaxll_la-op-rfkill.lo `test -f 'op-rfkill.c' || echo '$(srcdir)/'`op-rfkill.c
+libwimaxll_la-op-state-get.lo: op-state-get.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libwimaxll_la_CFLAGS) $(CFLAGS) -MT libwimaxll_la-op-state-get.lo -MD -MP -MF $(DEPDIR)/libwimaxll_la-op-state-get.Tpo -c -o libwimaxll_la-op-state-get.lo `test -f 'op-state-get.c' || echo '$(srcdir)/'`op-state-get.c
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libwimaxll_la-op-state-get.Tpo $(DEPDIR)/libwimaxll_la-op-state-get.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='op-state-get.c' object='libwimaxll_la-op-state-get.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libwimaxll_la_CFLAGS) $(CFLAGS) -c -o libwimaxll_la-op-state-get.lo `test -f 'op-state-get.c' || echo '$(srcdir)/'`op-state-get.c
+
libwimaxll_la-re-state-change.lo: re-state-change.c
@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libwimaxll_la_CFLAGS) $(CFLAGS) -MT libwimaxll_la-re-state-change.lo -MD -MP -MF $(DEPDIR)/libwimaxll_la-re-state-change.Tpo -c -o libwimaxll_la-re-state-change.lo `test -f 're-state-change.c' || echo '$(srcdir)/'`re-state-change.c
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libwimaxll_la-re-state-change.Tpo $(DEPDIR)/libwimaxll_la-re-state-change.Plo
diff --git a/lib/op-state-get.c b/lib/op-state-get.c
new file mode 100644
index 0000000..9822bf8
--- /dev/null
+++ b/lib/op-state-get.c
@@ -0,0 +1,112 @@
+/*
+ * Linux WiMax
+ * Export the kernel's WiMAX stack wimaxll_state_get() function
+ *
+ *
+ * Copyright (C) 2009 Darius Augulis <augulis.darius@gmail.com>
+ *
+ * Based on op-rfkill.c
+ *
+ * Copyright (C) 2007-2008 Intel Corporation. All rights reserved.
+ * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Intel Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#define _GNU_SOURCE
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <assert.h>
+#include <linux/types.h>
+#include <netlink/msg.h>
+#include <netlink/netlink.h>
+#include <netlink/genl/genl.h>
+#include <wimaxll.h>
+#include "internal.h"
+#define D_LOCAL 0
+#include "debug.h"
+
+
+/**
+ * Get Wimax device status from kernel and return it to user space
+ *
+ * \param wmx WiMAX device handle
+ *
+ * \return Negative errno code on error. Otherwise, one from Wimax device
+ * status value, defined in enum wimax_st.
+ *
+ * Allows the caller to get the state of the Wimax device.
+ *
+ * \ingroup device_management
+ * \internal
+ *
+ */
+int wimaxll_state_get(struct wimaxll_handle *wmx)
+{
+ ssize_t result;
+ struct nl_msg *msg;
+
+ result = -EBADF;
+ if (wmx->ifidx == 0)
+ goto error_not_any;
+ msg = nlmsg_new();
+ if (msg == NULL) {
+ result = errno;
+ wimaxll_msg(wmx, "E: STATE_GET: cannot allocate generic"
+ "netlink message: %m\n");
+ goto error_msg_alloc;
+ }
+ if (genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ,
+ wimaxll_family_id(wmx), 0, 0,
+ WIMAX_GNL_OP_STATE_GET, WIMAX_GNL_VERSION) == NULL) {
+ result = -ENOMEM;
+ wimaxll_msg(wmx, "E: STATE_GET: error preparing message: "
+ "%d 0x%08x\n", result, result);
+ goto error_msg_prep;
+ }
+ nla_put_u32(msg, WIMAX_GNL_STGET_IFIDX, (__u32) wmx->ifidx);
+ result = nl_send_auto_complete(wmx->nlh_tx, msg);
+ if (result < 0) {
+ wimaxll_msg(wmx, "E: STATE_GET: error sending message: %zd\n",
+ result);
+ goto error_msg_send;
+ }
+ /* Read the message ACK from netlink */
+ result = wimaxll_wait_for_ack(wmx);
+ if (result < 0 && result != -ENODEV)
+ wimaxll_msg(wmx, "E: STATE_GET: operation failed: %zd\n", result);
+error_msg_prep:
+error_msg_send:
+ nlmsg_free(msg);
+error_msg_alloc:
+error_not_any:
+ d_fnend(3, wmx, "(wmx %p) = %d\n", wmx, result);
+ return result;
+}