aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorshemminger <shemminger>2004-05-11 19:46:58 +0000
committershemminger <shemminger>2004-05-11 19:46:58 +0000
commit914abde5566e3c03bf144a93ff9c2f051da55c3e (patch)
treeea6a4cdf8c33c238405a26e6c42d711a74c87d76
parent9e65dd9b37f465fc8a62e0e2baa9084d79657d0b (diff)
downloadandroid_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.c2
-rw-r--r--libbridge/Makefile.in8
-rw-r--r--libbridge/if_index.c259
-rw-r--r--libbridge/libbridge_compat.c35
-rw-r--r--libbridge/libbridge_devif.c10
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);
}