diff options
author | shemminger <shemminger> | 2004-05-11 19:46:58 +0000 |
---|---|---|
committer | shemminger <shemminger> | 2004-05-11 19:46:58 +0000 |
commit | 914abde5566e3c03bf144a93ff9c2f051da55c3e (patch) | |
tree | ea6a4cdf8c33c238405a26e6c42d711a74c87d76 | |
parent | 9e65dd9b37f465fc8a62e0e2baa9084d79657d0b (diff) | |
download | android_external_brctl-914abde5566e3c03bf144a93ff9c2f051da55c3e.tar.gz android_external_brctl-914abde5566e3c03bf144a93ff9c2f051da55c3e.tar.bz2 android_external_brctl-914abde5566e3c03bf144a93ff9c2f051da55c3e.zip |
Update for 1.0. Use new ioct interface.
-rw-r--r-- | brctl/brctl.c | 2 | ||||
-rw-r--r-- | libbridge/Makefile.in | 8 | ||||
-rw-r--r-- | libbridge/if_index.c | 259 | ||||
-rw-r--r-- | libbridge/libbridge_compat.c | 35 | ||||
-rw-r--r-- | libbridge/libbridge_devif.c | 10 |
5 files changed, 10 insertions, 304 deletions
diff --git a/brctl/brctl.c b/brctl/brctl.c index 267170f..2dc4f27 100644 --- a/brctl/brctl.c +++ b/brctl/brctl.c @@ -23,7 +23,7 @@ #include "libbridge.h" #include "brctl.h" -const char *version = "0.9.8"; +const char *version = "0.9.9"; const char *help_message = "commands:\n" diff --git a/libbridge/Makefile.in b/libbridge/Makefile.in index 505994a..0997fee 100644 --- a/libbridge/Makefile.in +++ b/libbridge/Makefile.in @@ -12,15 +12,7 @@ exec_prefix=@exec_prefix@ includedir=@includedir@ libdir=@libdir@ -ifndef HAVE_IF_INDEX -COMPAT_SOURCES= \ - libbridge_compat.c -else -COMPAT_SOURCES= -endif - libbridge_SOURCES= \ - $(COMPAT_SOURCES) \ libbridge_devif.c \ libbridge_if.c \ libbridge_init.c \ diff --git a/libbridge/if_index.c b/libbridge/if_index.c deleted file mode 100644 index ad07dc0..0000000 --- a/libbridge/if_index.c +++ /dev/null @@ -1,259 +0,0 @@ -/* Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include <errno.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <net/if.h> -#include <sys/socket.h> -#include <sys/ioctl.h> -//#include <bits/libc-lock.h> - -/* Try to get a socket to talk to the kernel. */ -#if defined SIOCGIFINDEX || defined SIOCGIFNAME -static int -internal_function -opensock (void) -{ - /* Cache the last AF that worked, to avoid many redundant calls to - socket(). */ - static int sock_af = -1; - int fd = -1; - __libc_lock_define_initialized (static, lock); - - if (sock_af != -1) - { - fd = __socket (sock_af, SOCK_DGRAM, 0); - if (fd != -1) - return fd; - } - - __libc_lock_lock (lock); - - if (sock_af != -1) - fd = __socket (sock_af, SOCK_DGRAM, 0); - - if (fd == -1) - { - fd = __socket (sock_af = AF_INET6, SOCK_DGRAM, 0); - if (fd < 0) - fd = __socket (sock_af = AF_INET, SOCK_DGRAM, 0); - if (fd < 0) - fd = __socket (sock_af = AF_IPX, SOCK_DGRAM, 0); - if (fd < 0) - fd = __socket (sock_af = AF_AX25, SOCK_DGRAM, 0); - if (fd < 0) - fd = __socket (sock_af = AF_APPLETALK, SOCK_DGRAM, 0); - } - - __libc_lock_unlock (lock); - return fd; -} -#endif - -unsigned int -if_nametoindex (const char *ifname) -{ -#ifndef SIOCGIFINDEX - __set_errno (ENOSYS); - return 0; -#else - struct ifreq ifr; - int fd = opensock (); - - if (fd < 0) - return 0; - - strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name)); - if (__ioctl (fd, SIOCGIFINDEX, &ifr) < 0) - { - int saved_errno = errno; - close (fd); - if (saved_errno == EINVAL) - __set_errno (ENOSYS); - return 0; - } - close (fd); - return ifr.ifr_ifindex; -#endif -} - -void -if_freenameindex (struct if_nameindex *ifn) -{ - struct if_nameindex *ptr = ifn; - while (ptr->if_name || ptr->if_index) - { - if (ptr->if_name) - free (ptr->if_name); - ++ptr; - } - free (ifn); -} - -struct if_nameindex * -if_nameindex (void) -{ -#ifndef SIOCGIFINDEX - __set_errno (ENOSYS); - return NULL; -#else - int fd = opensock (); - struct ifconf ifc; - unsigned int nifs, i; - int rq_len; - struct if_nameindex *idx = NULL; - static int old_siocgifconf; -#define RQ_IFS 4 - - if (fd < 0) - return NULL; - - ifc.ifc_buf = NULL; - - /* We may be able to get the needed buffer size directly, rather than - guessing. */ - if (! old_siocgifconf) - { - ifc.ifc_buf = NULL; - ifc.ifc_len = 0; - if (__ioctl (fd, SIOCGIFCONF, &ifc) < 0 || ifc.ifc_len == 0) - { - old_siocgifconf = 1; - rq_len = RQ_IFS * sizeof (struct ifreq); - } - else - rq_len = ifc.ifc_len; - } - else - rq_len = RQ_IFS * sizeof (struct ifreq); - - /* Read all the interfaces out of the kernel. */ - do - { - ifc.ifc_buf = alloca (ifc.ifc_len = rq_len); - if (ifc.ifc_buf == NULL || __ioctl (fd, SIOCGIFCONF, &ifc) < 0) - { - close (fd); - return NULL; - } - rq_len *= 2; - } - while (ifc.ifc_len == rq_len && old_siocgifconf); - - nifs = ifc.ifc_len / sizeof (struct ifreq); - - idx = malloc ((nifs + 1) * sizeof (struct if_nameindex)); - if (idx == NULL) - { - close (fd); - return NULL; - } - - for (i = 0; i < nifs; ++i) - { - struct ifreq *ifr = &ifc.ifc_req[i]; - idx[i].if_name = strdup (ifr->ifr_name); - if (idx[i].if_name == NULL - || __ioctl (fd, SIOCGIFINDEX, ifr) < 0) - { - int saved_errno = errno; - unsigned int j; - - for (j = 0; j < i; ++j) - free (idx[j].if_name); - free (idx); - close (fd); - if (saved_errno == EINVAL) - __set_errno (ENOSYS); - return NULL; - } - idx[i].if_index = ifr->ifr_ifindex; - } - - idx[i].if_index = 0; - idx[i].if_name = NULL; - - close (fd); - return idx; -#endif -} - -char * -if_indextoname (unsigned int ifindex, char *ifname) -{ -#ifndef SIOCGIFINDEX - __set_errno (ENOSYS); - return NULL; -#else - struct if_nameindex *idx; - struct if_nameindex *p; - char *result = NULL; - -#ifdef SIOCGIFNAME - /* We may be able to do the conversion directly, rather than searching a - list. This ioctl is not present in kernels before version 2.1.50. */ - struct ifreq ifr; - int fd; - static int siocgifname_works_not; - - if (!siocgifname_works_not) - { - int serrno = errno; - - fd = opensock (); - - if (fd < 0) - return NULL; - - ifr.ifr_ifindex = ifindex; - if (__ioctl (fd, SIOCGIFNAME, &ifr) < 0) - { - if (errno == EINVAL) - siocgifname_works_not = 1; /* Don't make the same mistake twice. */ - } - else - { - close (fd); - return strncpy (ifname, ifr.ifr_name, IFNAMSIZ); - } - - close (fd); - - __set_errno (serrno); - } -#endif - - idx = if_nameindex (); - - if (idx != NULL) - { - for (p = idx; p->if_index || p->if_name; ++p) - if (p->if_index == ifindex) - { - result = strncpy (ifname, p->if_name, IFNAMSIZ); - break; - } - - if_freenameindex (idx); - } - return result; -#endif -} diff --git a/libbridge/libbridge_compat.c b/libbridge/libbridge_compat.c deleted file mode 100644 index 5b9d97b..0000000 --- a/libbridge/libbridge_compat.c +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Compatability glue for systems lacking the if_nametoindex and - * if_indextoname functions. - * - * The file 'if_index.c' was taken verbatimly from the GNU C Library - * version 2.1 (990920) and is Copyright (C) 1997, 1998, 1999 Free - * Software Foundation, Inc. - */ - -/* - * On how to use this file: Serge Caron writes: - * - * I installed compat-glibc-6.2-2.1.3.2.i386.rpm in my Red Hat 5.2 box - * - * from the directory where libbridge is stored I ran - * - * gcc -Wall -g -nostdinc -I- -I. - * -I /usr/i386-glibc21-linux/include - * -I /usr/lib/gcc-lib/i386-redhat-linux/2.7.23/include - * -c libbridge_compat.c - * - * Now this gives a nice .o file that keeps make happy. Running make in the top - * directory builds brctl and brctld against glibc-2.0.7. - */ - -#define _BITS_LIBC_LOCK_H 1 -#define __libc_lock_define_initialized(a,b) -#define __libc_lock_lock(a) -#define __libc_lock_unlock(a) -#define __ioctl ioctl -#define __set_errno(a) {errno = (a);} -#define __socket socket -#define internal_function - -#include "if_index.c" diff --git a/libbridge/libbridge_devif.c b/libbridge/libbridge_devif.c index 085eaea..d4f5265 100644 --- a/libbridge/libbridge_devif.c +++ b/libbridge/libbridge_devif.c @@ -23,6 +23,7 @@ #include <sys/fcntl.h> #include <sys/ioctl.h> #include <sys/time.h> + #include "libbridge.h" #include "libbridge_private.h" @@ -39,7 +40,14 @@ int br_device_ioctl(const struct bridge *br, unsigned long arg0, strncpy(ifr.ifr_name, br->ifname, IFNAMSIZ); ((unsigned long *)(&ifr.ifr_data))[0] = (unsigned long)args; - +#ifdef SIOCBRDEV + { int err = ioctl(br_socket_fd, SIOCBRDEV, &ifr); + if (err >= 0) + return err; + } +#else +#warn SIOCBRDEV not defined +#endif return ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr); } |