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