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