1d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan/*
2d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * dhcpcd - DHCP client daemon
3d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * Copyright (c) 2009-2015 Roy Marples <roy@marples.name>
4d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * All rights reserved
5d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
6d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * Redistribution and use in source and binary forms, with or without
7d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * modification, are permitted provided that the following conditions
8d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * are met:
9d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * 1. Redistributions of source code must retain the above copyright
10d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan *    notice, this list of conditions and the following disclaimer.
11d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * 2. Redistributions in binary form must reproduce the above copyright
12d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan *    notice, this list of conditions and the following disclaimer in the
13d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan *    documentation and/or other materials provided with the distribution.
14d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan *
15d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * SUCH DAMAGE.
26d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan */
27d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
28d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan/*
29d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * THIS IS A NASTY HACK THAT SHOULD NEVER HAVE HAPPENED
30d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * Basically we cannot include linux/if.h and net/if.h because
31d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * they have conflicting structures.
32d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * Sadly, linux/wireless.h includes linux/if.h all the time.
33d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * Some kernel-header installs fix this and some do not.
34d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * This file solely exists for those who do not.
35d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan *
36d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * We *could* include wireless.h as that is designed for userspace,
37d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * but that then depends on the correct version of wireless-tools being
38d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * installed which isn't always the case.
39d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan */
40d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
41d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include <sys/ioctl.h>
42d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include <sys/socket.h>
43d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
44d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include <linux/types.h>
45d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include <linux/rtnetlink.h>
46d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan/* Support older kernels */
47d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifdef IFLA_WIRELESS
48d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan# include <linux/if.h>
49d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan# include <linux/wireless.h>
50d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#else
51d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan# define IFLA_WIRELESS (IFLA_MASTER + 1)
52d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif
53d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
54d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include <string.h>
55d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include <unistd.h>
56d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
57d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include "config.h"
58d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
59d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan/* We can't include if.h or dhcpcd.h because
60d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * they would pull in net/if.h, which defeats the purpose of this hack. */
61d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define IF_SSIDSIZE 33
62d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_getssid_wext(const char *ifname, uint8_t *ssid);
63d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
64d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint
65d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanif_getssid_wext(const char *ifname, uint8_t *ssid)
66d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan{
67d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifdef SIOCGIWESSID
68d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	int s, retval;
69d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	struct iwreq iwr;
70d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
71d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	if ((s = socket(PF_INET, SOCK_DGRAM, 0)) == -1)
72d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan		return -1;
73d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	memset(&iwr, 0, sizeof(iwr));
74d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	strlcpy(iwr.ifr_name, ifname, sizeof(iwr.ifr_name));
75d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	iwr.u.essid.pointer = ssid;
76d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	iwr.u.essid.length = IF_SSIDSIZE - 1;
77d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
78d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	if (ioctl(s, SIOCGIWESSID, &iwr) == 0) {
79d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan		retval = iwr.u.essid.length;
80d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan		ssid[retval] = '\0';
81d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	} else
82d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan		retval = -1;
83d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	close(s);
84d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	return retval;
85d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#else
86d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	/* Stop gcc warning about unused parameters */
87d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	ifname = ssid;
88d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	return -1;
89d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif
90d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan}
91