summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compat/Makefile.am3
-rw-r--r--compat/ether.c52
-rw-r--r--compat/ether.h49
-rw-r--r--configure.ac6
-rw-r--r--nslcd/ether.c4
5 files changed, 108 insertions, 6 deletions
diff --git a/compat/Makefile.am b/compat/Makefile.am
index d71d087..601b65b 100644
--- a/compat/Makefile.am
+++ b/compat/Makefile.am
@@ -24,7 +24,8 @@ AM_CFLAGS = -fPIC
EXTRA_DIST = getopt_long.c getopt_long.h \
daemon.c daemon.h \
- pagectrl.c pagectrl.h
+ pagectrl.c pagectrl.h \
+ ether.c ether.h
libcompat_a_SOURCES = getpeercred.c getpeercred.h
libcompat_a_LIBADD = @LIBOBJS@
diff --git a/compat/ether.c b/compat/ether.c
new file mode 100644
index 0000000..1374f97
--- /dev/null
+++ b/compat/ether.c
@@ -0,0 +1,52 @@
+/*
+ ether.c - useful ethernet functions for systems lacking those
+
+ Copyright (C) 2008 Arthur de Jong
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA
+*/
+
+#include "config.h"
+
+#include <string.h>
+
+#include "ether.h"
+
+/* these functions are not really reentrant */
+
+#ifndef HAVE_ETHER_NTOA_R
+char *ether_ntoa_r(const struct ether_addr *addr,char *buf)
+{
+ char *tmp;
+ tmp=ether_ntoa(addr);
+ if (tmp==NULL)
+ return NULL;
+ strcpy(buf,tmp);
+ return buf;
+}
+#endif /* not HAVE_ETHER_NTOA_R */
+
+#ifndef HAVE_ETHER_ATON_R
+struct ether_addr *ether_aton_r(const char *asc,struct ether_addr *addr)
+{
+ struct ether_addr *tmp;
+ tmp=ether_aton(asc);
+ if (tmp==NULL)
+ return NULL;
+ memcpy(addr,tmp,sizeof(struct ether_addr));
+ return addr;
+}
+#endif /* not HAVE_ETHER_ATON_R */
diff --git a/compat/ether.h b/compat/ether.h
new file mode 100644
index 0000000..fc4a2ff
--- /dev/null
+++ b/compat/ether.h
@@ -0,0 +1,49 @@
+/*
+ ether.h - ethernet definitions for systems lacking those
+
+ Copyright (C) 2008 Arthur de Jong
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA
+*/
+
+#ifndef _COMPAT_ETHER_H
+#define _COMPAT_ETHER_H 1
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <netinet/if_ether.h>
+#ifdef HAVE_NETINET_ETHER_H
+#include <netinet/ether.h>
+#endif
+
+#ifndef HAVE_STRUCT_ETHER_ADDR
+struct ether_addr {
+ uint8_t ether_addr_octet[6];
+};
+#endif /* not HAVE_STRUCT_ETHER_ADDR */
+
+#ifndef HAVE_ENTHER_NTOA_R
+char *ether_ntoa_r(const struct ether_addr *addr,char *buf);
+#endif /* not HAVE_ENTHER_NTOA_R */
+
+#ifndef HAVE_ENTHER_NTOA_R
+struct ether_addr *ether_aton_r(const char *asc,struct ether_addr *addr);
+#endif /* not HAVE_ENTHER_NTOA_R */
+
+#endif /* not _COMPAT_ETHER_H */
+
diff --git a/configure.ac b/configure.ac
index 7692a44..ba66a7e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -189,18 +189,20 @@ LIBS="$save_LIBS"
AC_CHECK_FUNCS(sigaction)
AC_CHECK_FUNCS(snprintf)
AC_CHECK_FUNCS(gethostbyname)
-AC_CHECK_FUNCS(ether_aton_r)
-AC_CHECK_FUNCS(ether_ntoa_r)
AC_CHECK_FUNCS(setgroups)
AC_CHECK_FUNCS(getpeereid)
AC_CHECK_FUNCS(getpeerucred)
AC_CHECK_FUNCS(__nss_configure_lookup)
+
# replace getopt_long() function if it is not on the system
AC_REPLACE_FUNCS(getopt_long)
# replace daemon() function if it is not on the system
AC_SEARCH_LIBS(daemon,bsd)
AC_REPLACE_FUNCS(daemon)
+# replace ether_ntoa_r() and ether_aton_r() if they are not found
+AC_CHECK_FUNCS(ether_aton_r ether_ntoa_r,,[AC_CHECK_FUNCS(ether_aton ether_ntoa)
+ AC_LIBOBJ(ether)])
# checks for types
AC_C_CONST
diff --git a/nslcd/ether.c b/nslcd/ether.c
index e6d739c..3cfbc9e 100644
--- a/nslcd/ether.c
+++ b/nslcd/ether.c
@@ -28,9 +28,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#ifdef HAVE_NETINET_ETHER_H
-#include <netinet/ether.h>
-#endif
#ifdef HAVE_STDINT_H
#include <stdint.h>
#endif /* HAVE_STDINT_H */
@@ -40,6 +37,7 @@
#include "myldap.h"
#include "cfg.h"
#include "attmap.h"
+#include "compat/ether.h"
#ifndef HAVE_STRUCT_ETHER_ADDR
struct ether_addr {