{
char *end;
unsigned char bssid[6];
- int freq;
+ int freq, err;
if (argc < 1)
return 1;
}
}
- if (!argc)
- return 0;
+ if (argc) {
+ if (strcmp(*argv, "key") != 0 && strcmp(*argv, "keys") != 0)
+ return 1;
- if (strcmp(*argv, "key") != 0 && strcmp(*argv, "keys") != 0)
- return 1;
+ argv++;
+ argc--;
- argv++;
- argc--;
+ err = parse_keys(msg, argv, argc);
+ if (err)
+ return err;
+ }
+
+ return set_interface_up(state->ifname);
- return parse_keys(msg, argv, argc);
nla_put_failure:
return -ENOSPC;
}
{
char *end;
unsigned char abssid[6];
+ int err;
if (argc < 2)
return 1;
}
}
- if (!argc)
- return 0;
+ if (argc) {
+ if (strcmp(*argv, "key") != 0 && strcmp(*argv, "keys") != 0)
+ return 1;
- if (strcmp(*argv, "key") != 0 && strcmp(*argv, "keys") != 0)
- return 1;
+ argv++;
+ argc--;
- argv++;
- argc--;
+ err = parse_keys(msg, argv, argc);
+ if (err)
+ return err;
+ }
+
+ return set_interface_up(state->ifname);
- return parse_keys(msg, argv, argc);
nla_put_failure:
return -ENOSPC;
}
o_argc = argc;
o_argv = argv;
+ state->ifname = NULL;
+
switch (idby) {
case II_PHY_IDX:
command_idby = CIB_PHY;
break;
case II_NETDEV:
command_idby = CIB_NETDEV;
+ state->ifname = *argv;
devidx = if_nametoindex(*argv);
if (devidx == 0)
devidx = -1;
struct nl_sock *nl_sock;
struct nl_cache *nl_cache;
struct genl_family *nl80211;
+
+ const char *ifname;
};
enum command_identify_by {
const char *get_reason_str(uint16_t reason);
const char *get_status_str(uint16_t status);
+int set_interface_up(const char *ifname);
+
#endif /* __IW_H */
#include <netlink/attr.h>
#include <errno.h>
#include <stdbool.h>
+#include <net/if.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
#include "iw.h"
#include "nl80211.h"
"for example: d:2:6162636465 is the same as d:2:abcde\n");
return 2;
}
+
+int set_interface_up(const char *ifname)
+{
+ struct ifreq ifr;
+ int fd = socket(PF_INET, SOCK_DGRAM, 0);
+ int err = 0;
+
+ if (fd < 0)
+ return -errno;
+
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+ if (ioctl(fd, SIOCGIFFLAGS, &ifr)) {
+ err = -errno;
+ goto out;
+ }
+
+ if (ifr.ifr_flags & IFF_UP)
+ goto out;
+
+ ifr.ifr_flags |= IFF_UP;
+ if (ioctl(fd, SIOCSIFFLAGS, &ifr))
+ err = -errno;
+
+ out:
+ close(fd);
+ return err;
+}