]> git.ipfire.org Git - thirdparty/iw.git/commitdiff
clean up error handling
authorJohannes Berg <johannes@sipsolutions.net>
Tue, 16 Sep 2008 16:13:12 +0000 (18:13 +0200)
committerJohannes Berg <johannes@sipsolutions.net>
Tue, 16 Sep 2008 16:13:12 +0000 (18:13 +0200)
info.c
interface.c
iw.c
iw.h
mpath.c
phy.c
reg.c
station.c

diff --git a/info.c b/info.c
index 0b3973cac0b80d9101a1d2530177f0550d24e1c6..08025a02deaff022c1bced53020c7eab9c2c3287 100644 (file)
--- a/info.c
+++ b/info.c
@@ -129,7 +129,7 @@ static int handle_info(struct nl80211_state *state,
                       struct nl_msg *msg,
                       int argc, char **argv)
 {
-       int err = -1;
+       int err = -ENOMEM;
        struct nl_cb *cb;
        int finished;
 
@@ -143,19 +143,14 @@ static int handle_info(struct nl80211_state *state,
        nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, print_phy_handler, NULL);
        nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_wait_handler, &finished);
 
-       err = nl_recvmsgs(state->nl_handle, cb);
+       nl_recvmsgs(state->nl_handle, cb);
+       err = 0;
 
        if (!finished)
                err = nl_wait_for_ack(state->nl_handle);
 
-       if (err < 0)
-               goto out;
-       err = 0;
-
  out:
        nl_cb_put(cb);
-       if (err)
-               fprintf(stderr, "failed to get information: %d\n", err);
        return err;
 }
 TOPLEVEL(info, NULL, NL80211_CMD_GET_WIPHY, 0, CIB_PHY, handle_info);
index 57c3f0a7a4e2790022a7811c7bb42c70bdcccbae..ad8fc88cf73e8554babb23a40e98bd562b75c93b 100644 (file)
@@ -66,39 +66,31 @@ static int handle_interface_add(struct nl80211_state *state,
        int tpset, err = -ENOBUFS;
 
        if (argc < 1)
-               return -1;
+               return 1;
 
        name = argv[0];
        argc--;
        argv++;
 
        tpset = get_if_type(&argc, &argv, &type);
-       if (tpset == 0)
-               fprintf(stderr, "you must specify an interface type\n");
        if (tpset <= 0)
-               return -1;
+               return 1;
 
        if (argc) {
-               if (strcmp(argv[0], "mesh_id") != 0) {
-                       fprintf(stderr, "option %s not supported\n", argv[0]);
-                       return -1;
-               }
+               if (strcmp(argv[0], "mesh_id") != 0)
+                       return 1;
                argc--;
                argv++;
 
-               if (!argc) {
-                       fprintf(stderr, "not enough arguments\n");
-                       return -1;
-               }
+               if (!argc)
+                       return 1;
                mesh_id = argv[0];
                argc--;
                argv++;
        }
 
-       if (argc) {
-               fprintf(stderr, "too many arguments\n");
-               return -1;
-       }
+       if (argc)
+               return 1;
 
        NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, name);
        if (tpset)
@@ -106,14 +98,12 @@ static int handle_interface_add(struct nl80211_state *state,
        if (mesh_id)
                NLA_PUT(msg, NL80211_ATTR_MESH_ID, strlen(mesh_id), mesh_id);
 
-       if ((err = nl_send_auto_complete(state->nl_handle, msg)) < 0 ||
-           (err = nl_wait_for_ack(state->nl_handle)) < 0) {
- nla_put_failure:
-               fprintf(stderr, "failed to create interface: %d\n", err);
-               return 1;
-       }
+       err = nl_send_auto_complete(state->nl_handle, msg);
+       if (err > 0)
+               err = nl_wait_for_ack(state->nl_handle);
 
-       return 0;
+ nla_put_failure:
+       return err;
 }
 COMMAND(interface, add, "<name> type <type> [mesh_id <meshid>]",
        NL80211_CMD_NEW_INTERFACE, 0, CIB_PHY, handle_interface_add);
@@ -124,16 +114,13 @@ static int handle_interface_del(struct nl80211_state *state,
                                struct nl_msg *msg,
                                int argc, char **argv)
 {
-       int err = -ENOBUFS;
+       int err;
 
-       if ((err = nl_send_auto_complete(state->nl_handle, msg)) < 0 ||
-           (err = nl_wait_for_ack(state->nl_handle)) < 0) {
-               fprintf(stderr, "failed to remove interface: %d\n", err);
-               nlmsg_free(msg);
-               return 1;
-       }
+       err = nl_send_auto_complete(state->nl_handle, msg);
+       if (err > 0)
+               err = nl_wait_for_ack(state->nl_handle);
 
-       return 0;
+       return err;
 }
 TOPLEVEL(del, NULL, NL80211_CMD_DEL_INTERFACE, 0, CIB_NETDEV, handle_interface_del);
 
@@ -175,22 +162,21 @@ static int handle_interface_info(struct nl80211_state *state,
        if (!cb)
                goto out;
 
-       if (nl_send_auto_complete(state->nl_handle, msg) < 0)
+       err = nl_send_auto_complete(state->nl_handle, msg);
+       if (err)
                goto out;
 
        nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, print_iface_handler, NULL);
        nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_wait_handler, &finished);
 
-       err = nl_recvmsgs(state->nl_handle, cb);
+       nl_recvmsgs(state->nl_handle, cb);
+       err = 0;
 
        if (!finished)
                err = nl_wait_for_ack(state->nl_handle);
 
-       if (err)
-               fprintf(stderr, "failed to get information: %d\n", err);
-
  out:
        nl_cb_put(cb);
-       return 0;
+       return err;
 }
 TOPLEVEL(info, NULL, NL80211_CMD_GET_INTERFACE, 0, CIB_NETDEV, handle_interface_info);
diff --git a/iw.c b/iw.c
index 9aa118a1a4502985c7afac74919e4a2966e8d023..7901fb50e7137c1126e08a2dd5347ce4e3db4a2e 100644 (file)
--- a/iw.c
+++ b/iw.c
@@ -122,7 +122,7 @@ static int handle_cmd(struct nl80211_state *state,
        const char *command, *section;
 
        if (argc <= 1 && idby != CIB_NONE)
-               return -1;
+               return 1;
 
        switch (idby) {
        case CIB_PHY:
@@ -152,7 +152,7 @@ static int handle_cmd(struct nl80211_state *state,
                        /* this is a bit icky ... */
                        if (command == section) {
                                if (argc <= 0)
-                                       return -1;
+                                       return 1;
                                command = *argv;
                                argc--;
                                argv++;
@@ -167,12 +167,12 @@ static int handle_cmd(struct nl80211_state *state,
        }
 
        if (cmd == &__stop___cmd)
-               return -1;
+               return 1;
 
        msg = nlmsg_alloc();
        if (!msg) {
                fprintf(stderr, "out of memory\n");
-               return 1;
+               return -ENOMEM;
        }
 
        genlmsg_put(msg, 0, 0, genl_family_get_id(state->nl80211), 0,
@@ -192,7 +192,7 @@ static int handle_cmd(struct nl80211_state *state,
        return cmd->handler(state, msg, argc, argv);
  nla_put_failure:
        fprintf(stderr, "building message failed\n");
-       return 1;
+       return -ENOMEM;
 }
 
 int main(int argc, char **argv)
@@ -225,8 +225,10 @@ int main(int argc, char **argv)
        } else
                err = handle_cmd(&nlstate, CIB_NONE, argc, argv);
 
-       if (err < 0)
+       if (err == 1)
                usage(argv0);
+       if (err < 0)
+               fprintf(stderr, "command failed: %s", strerror(err));
 
  out:
        nl80211_cleanup(&nlstate);
diff --git a/iw.h b/iw.h
index 5c3bbb895c71bbeb2c752943ae16cdaf21b16392..0e2d771754090a09a66030702d1f2097c836d6cf 100644 (file)
--- a/iw.h
+++ b/iw.h
@@ -27,6 +27,11 @@ struct cmd {
        const enum nl80211_commands cmd;
        int nl_msg_flags;
        const enum command_identify_by idby;
+       /*
+        * The handler should return a negative error code,
+        * zero on success, 1 if the arguments were wrong
+        * and the usage message should and 2 otherwise.
+        */
        int (*handler)(struct nl80211_state *state,
                       struct nl_msg *msg,
                       int argc, char **argv);
diff --git a/mpath.c b/mpath.c
index bb8c4463e7af6ad8f1c043a82100191f5645134e..dd634d9e9fa10ec72418e28ad4dd007768ba6df5 100644 (file)
--- a/mpath.c
+++ b/mpath.c
@@ -114,23 +114,22 @@ static int handle_mpath_get(struct nl80211_state *state,
                            int argc, char **argv)
 {
        struct nl_cb *cb = NULL;
-       int ret = -1;
-       int err;
+       int err = -ENOMEM;
        int finished = 0;
        unsigned char dst[ETH_ALEN];
 
        if (argc < 1)
-               return -1;
+               return 1;
 
        if (mac_addr_a2n(dst, argv[0])) {
                fprintf(stderr, "invalid mac address\n");
-               return 1;
+               return 2;
        }
        argc--;
        argv++;
 
        if (argc)
-               return -1;
+               return 1;
 
        NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, dst);
 
@@ -145,20 +144,16 @@ static int handle_mpath_get(struct nl80211_state *state,
        nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, wait_handler, &finished);
        nl_cb_err(cb, NL_CB_CUSTOM, error_handler, NULL);
 
-       err = nl_recvmsgs(state->nl_handle, cb);
+       nl_recvmsgs(state->nl_handle, cb);
+       err = 0;
 
        if (!finished)
                err = nl_wait_for_ack(state->nl_handle);
 
-       if (err < 0)
-               goto out;
-
-       ret = 0;
-
  out:
        nl_cb_put(cb);
  nla_put_failure:
-       return ret;
+       return err;
 }
 COMMAND(mpath, get, "<MAC address>",
        NL80211_CMD_GET_MPATH, 0, CIB_NETDEV, handle_mpath_get);
@@ -170,36 +165,35 @@ static int handle_mpath_set(struct nl80211_state *state,
                            int argc, char **argv)
 {
        struct nl_cb *cb = NULL;
-       int ret = -1;
-       int err;
+       int err = -ENOMEM;
        int finished = 0;
        unsigned char dst[ETH_ALEN];
        unsigned char next_hop[ETH_ALEN];
 
        if (argc < 3)
-               return -1;
+               return 1;
 
        if (mac_addr_a2n(dst, argv[0])) {
                fprintf(stderr, "invalid destination mac address\n");
-               return 1;
+               return 2;
        }
        argc--;
        argv++;
 
        if (strcmp("next_hop", argv[0]) != 0)
-               return -1;
+               return 1;
        argc--;
        argv++;
 
        if (mac_addr_a2n(next_hop, argv[0])) {
                fprintf(stderr, "invalid next hop mac address\n");
-               return 1;
+               return 2;
        }
        argc--;
        argv++;
 
        if (argc)
-               return -1;
+               return 1;
 
        msg = nlmsg_alloc();
        if (!msg)
@@ -212,27 +206,23 @@ static int handle_mpath_set(struct nl80211_state *state,
        if (!cb)
                goto out;
 
-       if (nl_send_auto_complete(state->nl_handle, msg) < 0)
+       if ((err = nl_send_auto_complete(state->nl_handle, msg)) < 0)
                goto out;
 
        nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, print_mpath_handler, NULL);
        nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, wait_handler, &finished);
        nl_cb_err(cb, NL_CB_CUSTOM, error_handler, NULL);
 
-       err = nl_recvmsgs(state->nl_handle, cb);
+       nl_recvmsgs(state->nl_handle, cb);
+       err = 0;
 
        if (!finished)
                err = nl_wait_for_ack(state->nl_handle);
 
-       if (err < 0)
-               goto out;
-
-       ret = 0;
-
  out:
        nl_cb_put(cb);
  nla_put_failure:
-       return ret;
+       return err;
 }
 COMMAND(mpath, new, "<destination MAC address> next_hop <next hop MAC address>",
        NL80211_CMD_NEW_MPATH, 0, CIB_NETDEV, handle_mpath_set);
@@ -244,30 +234,28 @@ static int handle_mpath_dump(struct nl80211_state *state,
                             int argc, char **argv)
 {
        struct nl_cb *cb = NULL;
-       int ret = 1;
-       int err;
+       int err = -ENOMEM;
        int finished = 0;
 
        cb = nl_cb_alloc(NL_CB_CUSTOM);
        if (!cb)
                goto out;
 
-       if (nl_send_auto_complete(state->nl_handle, msg) < 0)
+       if ((err = nl_send_auto_complete(state->nl_handle, msg)) < 0)
                goto out;
 
        nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, print_mpath_handler, NULL);
        nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, wait_handler, &finished);
 
-       err = nl_recvmsgs(state->nl_handle, cb);
-
-       if (err < 0)
-               goto out;
+       nl_recvmsgs(state->nl_handle, cb);
+       err = 0;
 
-       ret = 0;
+       if (!finished)
+               err = nl_wait_for_ack(state->nl_handle);
 
  out:
        nl_cb_put(cb);
-       return ret;
+       return err;
 }
 COMMAND(mpath, dump, NULL,
        NL80211_CMD_GET_MPATH, NLM_F_DUMP, CIB_NETDEV, handle_mpath_dump);
diff --git a/phy.c b/phy.c
index 518356722743f9d4247b3b0af4bd851c09b6be9a..43fa1d58c50037d368c8e37f3d8233c1d7b74b7c 100644 (file)
--- a/phy.c
+++ b/phy.c
@@ -14,11 +14,11 @@ static int handle_name(struct nl80211_state *state,
                       struct nl_msg *msg,
                       int argc, char **argv)
 {
-       int err = 1;
+       int err = -ENOMEM;
        struct nl_cb *cb;
 
        if (argc != 1)
-               return -1;
+               return 1;
 
        NLA_PUT_STRING(msg, NL80211_ATTR_WIPHY_NAME, *argv);
 
@@ -26,7 +26,7 @@ static int handle_name(struct nl80211_state *state,
        if (!cb)
                goto out;
 
-       if (nl_send_auto_complete(state->nl_handle, msg) < 0)
+       if ((err = nl_send_auto_complete(state->nl_handle, msg)) < 0)
                goto out;
 
        err = nl_wait_for_ack(state->nl_handle);
@@ -34,10 +34,6 @@ static int handle_name(struct nl80211_state *state,
  out:
        nl_cb_put(cb);
  nla_put_failure:
-       if (err) {
-               fprintf(stderr, "failed set name: %d\n", err);
-               return 1;
-       }
        return err;
 }
 COMMAND(set, name, "<new name>", NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_name);
diff --git a/reg.c b/reg.c
index 059f13a617415dcf1d03003fe0817b472eb81632..31d9cca152391f1e6a57f5da582c616e5cb6243c 100644 (file)
--- a/reg.c
+++ b/reg.c
 
 #include "iw.h"
 
-static int wait_handler(struct nl_msg *msg, void *arg)
-{
-       int *finished = arg;
-
-       *finished = 1;
-       return NL_STOP;
-}
-
-static int error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err,
-                        void *arg)
-{
-       fprintf(stderr, "nl80211 error %d\n", err->error);
-       exit(err->error);
-}
-
-static int reg_handler(struct nl_msg *msg, void *arg)
-{
-        return NL_SKIP;
-}
-
 int isalpha_upper(char letter)
 {
        if (letter >= 65 && letter <= 90)
@@ -58,19 +38,17 @@ static int handle_reg_set(struct nl80211_state *state,
                          int argc, char **argv)
 {
        struct nl_cb *cb = NULL;
-       int ret = 1;
-       int err;
-       int finished = 0;
+       int err = -ENOMEM;
        char alpha2[3];
 
        if (argc < 1)
-               return -1;
+               return 1;
 
        if (!is_alpha2(argv[0]) && !is_world_regdom(argv[0])) {
                fprintf(stderr, "not a valid ISO/IEC 3166-1 alpha2\n");
                fprintf(stderr, "Special non-alph2 usable entries:\n");
                fprintf(stderr, "\t00\tWorld Regulatory domain\n");
-               return 1;
+               return 2;
        }
 
        alpha2[0] = argv[0][0];
@@ -81,7 +59,7 @@ static int handle_reg_set(struct nl80211_state *state,
        argv++;
 
        if (argc)
-               return -1;
+               return 1;
 
        NLA_PUT_STRING(msg, NL80211_ATTR_REG_ALPHA2, alpha2);
 
@@ -91,29 +69,15 @@ static int handle_reg_set(struct nl80211_state *state,
 
        err = nl_send_auto_complete(state->nl_handle, msg);
 
-       if (err < 0) {
-               fprintf(stderr, "failed to send reg set command\n");
-               goto out;
-       }
-
-       nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, reg_handler, NULL);
-       nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, wait_handler, &finished);
-       nl_cb_err(cb, NL_CB_CUSTOM, error_handler, NULL);
-
-       err = nl_recvmsgs(state->nl_handle, cb);
-
-       if (!finished)
-               err = nl_wait_for_ack(state->nl_handle);
-
        if (err < 0)
                goto out;
 
-       ret = 0;
+       err = nl_wait_for_ack(state->nl_handle);
 
  out:
        nl_cb_put(cb);
  nla_put_failure:
-       return ret;
+       return err;
 }
 COMMAND(reg, set, "<ISO/IEC 3166-1 alpha2>",
        NL80211_CMD_REQ_SET_REG, 0, CIB_NONE, handle_reg_set);
index 055de0404fffa88ae6f7022a3657d0fa30f4281e..8f5e6e8e2ebd570b0d7d87fc9da5d423ccf663af 100644 (file)
--- a/station.c
+++ b/station.c
@@ -136,24 +136,23 @@ static int handle_station_get(struct nl80211_state *state,
                              int argc, char **argv)
 {
        struct nl_cb *cb = NULL;
-       int ret = 1;
-       int err;
+       int err = -ENOMEM;
        int finished = 0;
        unsigned char mac_addr[ETH_ALEN];
 
        if (argc < 1)
-               return -1;
+               return 1;
 
        if (mac_addr_a2n(mac_addr, argv[0])) {
                fprintf(stderr, "invalid mac address\n");
-               return 1;
+               return 2;
        }
 
        argc--;
        argv++;
 
        if (argc)
-               return -1;
+               return 1;
 
        NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr);
 
@@ -168,20 +167,16 @@ static int handle_station_get(struct nl80211_state *state,
        nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, wait_handler, &finished);
        nl_cb_err(cb, NL_CB_CUSTOM, error_handler, NULL);
 
-       err = nl_recvmsgs(state->nl_handle, cb);
+       nl_recvmsgs(state->nl_handle, cb);
+       err = 0;
 
        if (!finished)
                err = nl_wait_for_ack(state->nl_handle);
 
-       if (err < 0)
-               goto out;
-
-       ret = 0;
-
  out:
        nl_cb_put(cb);
  nla_put_failure:
-       return ret;
+       return err;
 }
 COMMAND(station, get, "<MAC address>",
        NL80211_CMD_GET_STATION, 0, CIB_NETDEV, handle_station_get);
@@ -193,18 +188,17 @@ static int handle_station_set(struct nl80211_state *state,
                              int argc, char **argv)
 {
        struct nl_cb *cb = NULL;
-       int ret = 1;
-       int err;
+       int err = -ENOMEM;
        int finished = 0;
        unsigned char plink_action;
        unsigned char mac_addr[ETH_ALEN];
 
        if (argc < 3)
-               return -1;
+               return 1;
 
        if (mac_addr_a2n(mac_addr, argv[0])) {
                fprintf(stderr, "invalid mac address\n");
-               return 1;
+               return 2;
        }
        argc--;
        argv++;
@@ -220,13 +214,13 @@ static int handle_station_set(struct nl80211_state *state,
                plink_action = PLINK_ACTION_BLOCK;
        else {
                fprintf(stderr, "plink action not supported\n");
-               return 1;
+               return 2;
        }
        argc--;
        argv++;
 
        if (argc)
-               return -1;
+               return 1;
 
        NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr);
        NLA_PUT_U8(msg, NL80211_ATTR_STA_PLINK_ACTION, plink_action);
@@ -235,27 +229,23 @@ static int handle_station_set(struct nl80211_state *state,
        if (!cb)
                goto out;
 
-       if (nl_send_auto_complete(state->nl_handle, msg) < 0)
+       if ((err = nl_send_auto_complete(state->nl_handle, msg)) < 0)
                goto out;
 
        nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, print_sta_handler, NULL);
        nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, wait_handler, &finished);
        nl_cb_err(cb, NL_CB_CUSTOM, error_handler, NULL);
 
-       err = nl_recvmsgs(state->nl_handle, cb);
+       nl_recvmsgs(state->nl_handle, cb);
+       err = 0;
 
        if (!finished)
                err = nl_wait_for_ack(state->nl_handle);
 
-       if (err < 0)
-               goto out;
-
-       ret = 0;
-
  out:
        nl_cb_put(cb);
  nla_put_failure:
-       return ret;
+       return err;
 }
 COMMAND(station, set, "<MAC address> plink_action <open|block>",
        NL80211_CMD_SET_STATION, 0, CIB_NETDEV, handle_station_set);
@@ -265,33 +255,31 @@ static int handle_station_dump(struct nl80211_state *state,
                               int argc, char **argv)
 {
        struct nl_cb *cb = NULL;
-       int ret = 1;
-       int err;
+       int err = -ENOMEM;
        int finished = 0;
 
        if (argc)
-               return -1;
+               return 1;
 
        cb = nl_cb_alloc(NL_CB_CUSTOM);
        if (!cb)
                goto out;
 
-       if (nl_send_auto_complete(state->nl_handle, msg) < 0)
+       if ((err = nl_send_auto_complete(state->nl_handle, msg)) < 0)
                goto out;
 
        nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, print_sta_handler, NULL);
        nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, wait_handler, &finished);
 
-       err = nl_recvmsgs(state->nl_handle, cb);
-
-       if (err < 0)
-               goto out;
+       nl_recvmsgs(state->nl_handle, cb);
+       err = 0;
 
-       ret = 0;
+       if (!finished)
+               err = nl_wait_for_ack(state->nl_handle);
 
  out:
        nl_cb_put(cb);
-       return ret;
+       return err;
 }
 COMMAND(station, dump, NULL,
        NL80211_CMD_SET_STATION, NLM_F_DUMP, CIB_NETDEV, handle_station_dump);