[Glibc-bsd-commits] r4872 - in trunk/freebsd-glue: debian include include/net src

Robert Millan rmh at alioth.debian.org
Tue Aug 6 12:10:54 UTC 2013


Author: rmh
Date: 2013-08-06 12:10:54 +0000 (Tue, 06 Aug 2013)
New Revision: 4872

Added:
   trunk/freebsd-glue/include/net/if_dl.h
   trunk/freebsd-glue/src/linkaddr.c
   trunk/freebsd-glue/src/trimdomain.c
Modified:
   trunk/freebsd-glue/debian/changelog
   trunk/freebsd-glue/debian/copyright
   trunk/freebsd-glue/include/libutil.h
   trunk/freebsd-glue/src/Makefile
Log:
Add trimdomain, link_addr and link_ntoa.

Modified: trunk/freebsd-glue/debian/changelog
===================================================================
--- trunk/freebsd-glue/debian/changelog	2013-08-06 11:41:44 UTC (rev 4871)
+++ trunk/freebsd-glue/debian/changelog	2013-08-06 12:10:54 UTC (rev 4872)
@@ -5,6 +5,7 @@
   * FreeBSD <stdio.h> and <sys/types.h> have a kludge to declare
     lseek(). Duplicate the Glibc declaration here.
   * <sys/stat.h> implicitly includes <sys/time.h>.
+  * Add trimdomain, link_addr and link_ntoa.
 
  -- Robert Millan <rmh at debian.org>  Sun, 04 Aug 2013 18:20:40 +0200
 

Modified: trunk/freebsd-glue/debian/copyright
===================================================================
--- trunk/freebsd-glue/debian/copyright	2013-08-06 11:41:44 UTC (rev 4871)
+++ trunk/freebsd-glue/debian/copyright	2013-08-06 12:10:54 UTC (rev 4872)
@@ -21,7 +21,8 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 Files:		include/sys/cdefs.h
-Copyright:	1991, 1993, The Regents of the University of California.
+		src/linkaddr.c
+Copyright:	1990, 1991, 1993, The Regents of the University of California.
  * This code is derived from software contributed to Berkeley by
  * Berkeley Software Design, Inc.
  *
@@ -122,6 +123,30 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
 
+Files:		src/trimdomain.c
+Copyright:	2001 Brian Somers <brian at Awfulhak.org>
+		Based on original work by Atsushi Murai <amurai at FreeBSD.org>
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+
 Files:		include/__want_lseek.h
 Copyright:	1991-2009, 2010 Free Software Foundation, Inc.
 License:	LGPL-2.1

Modified: trunk/freebsd-glue/include/libutil.h
===================================================================
--- trunk/freebsd-glue/include/libutil.h	2013-08-06 11:41:44 UTC (rev 4871)
+++ trunk/freebsd-glue/include/libutil.h	2013-08-06 12:10:54 UTC (rev 4872)
@@ -1 +1,14 @@
+#ifndef _FREEBSD_LIBUTIL_H_
+#define _FREEBSD_LIBUTIL_H_
+
 #include <bsd/libutil.h>
+
+#include <sys/cdefs.h>
+#include <sys/_types.h>
+#include <sys/_stdint.h>
+
+__BEGIN_DECLS
+void trimdomain(char *_fullhost, int _hostsize);
+__END_DECLS
+
+#endif

Added: trunk/freebsd-glue/include/net/if_dl.h
===================================================================
--- trunk/freebsd-glue/include/net/if_dl.h	                        (rev 0)
+++ trunk/freebsd-glue/include/net/if_dl.h	2013-08-06 12:10:54 UTC (rev 4872)
@@ -0,0 +1,10 @@
+#include_next <net/if_dl.h>
+
+#ifdef __FreeBSD_kernel__
+
+__BEGIN_DECLS
+void	link_addr(const char *, struct sockaddr_dl *);
+char	*link_ntoa(const struct sockaddr_dl *);
+__END_DECLS
+
+#endif

Modified: trunk/freebsd-glue/src/Makefile
===================================================================
--- trunk/freebsd-glue/src/Makefile	2013-08-06 11:41:44 UTC (rev 4871)
+++ trunk/freebsd-glue/src/Makefile	2013-08-06 12:10:54 UTC (rev 4872)
@@ -3,6 +3,15 @@
 	exec.c \
 	feature_present.c \
 	getosreldate.c \
+	trimdomain.c \
+	linkaddr.c \
 	${NULL}
 
+SYS!=	dpkg-architecture -qDEB_HOST_GNU_SYSTEM
+
+.if ${SYS} == "kfreebsd-gnu"
+SRCS+=	\
+	${NULL}
+.endif
+
 .include <bsd.lib.mk>

Added: trunk/freebsd-glue/src/linkaddr.c
===================================================================
--- trunk/freebsd-glue/src/linkaddr.c	                        (rev 0)
+++ trunk/freebsd-glue/src/linkaddr.c	2013-08-06 12:10:54 UTC (rev 4872)
@@ -0,0 +1,155 @@
+/*-
+ * Copyright (c) 1990, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)linkaddr.c	8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+#include <sys/cdefs.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <net/if_dl.h>
+#include <string.h>
+
+/* States*/
+#define NAMING	0
+#define GOTONE	1
+#define GOTTWO	2
+#define RESET	3
+/* Inputs */
+#define	DIGIT	(4*0)
+#define	END	(4*1)
+#define DELIM	(4*2)
+#define LETTER	(4*3)
+
+void
+link_addr(addr, sdl)
+	const char *addr;
+	struct sockaddr_dl *sdl;
+{
+	char *cp = sdl->sdl_data;
+	char *cplim = sdl->sdl_len + (char *)sdl;
+	int byte = 0, state = NAMING, new;
+
+	bzero((char *)&sdl->sdl_family, sdl->sdl_len - 1);
+	sdl->sdl_family = AF_LINK;
+	do {
+		state &= ~LETTER;
+		if ((*addr >= '0') && (*addr <= '9')) {
+			new = *addr - '0';
+		} else if ((*addr >= 'a') && (*addr <= 'f')) {
+			new = *addr - 'a' + 10;
+		} else if ((*addr >= 'A') && (*addr <= 'F')) {
+			new = *addr - 'A' + 10;
+		} else if (*addr == 0) {
+			state |= END;
+		} else if (state == NAMING &&
+			   (((*addr >= 'A') && (*addr <= 'Z')) ||
+			   ((*addr >= 'a') && (*addr <= 'z'))))
+			state |= LETTER;
+		else
+			state |= DELIM;
+		addr++;
+		switch (state /* | INPUT */) {
+		case NAMING | DIGIT:
+		case NAMING | LETTER:
+			*cp++ = addr[-1];
+			continue;
+		case NAMING | DELIM:
+			state = RESET;
+			sdl->sdl_nlen = cp - sdl->sdl_data;
+			continue;
+		case GOTTWO | DIGIT:
+			*cp++ = byte;
+			/* FALLTHROUGH */
+		case RESET | DIGIT:
+			state = GOTONE;
+			byte = new;
+			continue;
+		case GOTONE | DIGIT:
+			state = GOTTWO;
+			byte = new + (byte << 4);
+			continue;
+		default: /* | DELIM */
+			state = RESET;
+			*cp++ = byte;
+			byte = 0;
+			continue;
+		case GOTONE | END:
+		case GOTTWO | END:
+			*cp++ = byte;
+			/* FALLTHROUGH */
+		case RESET | END:
+			break;
+		}
+		break;
+	} while (cp < cplim);
+	sdl->sdl_alen = cp - LLADDR(sdl);
+	new = cp - (char *)sdl;
+	if (new > sizeof(*sdl))
+		sdl->sdl_len = new;
+	return;
+}
+
+static char hexlist[] = "0123456789abcdef";
+
+char *
+link_ntoa(sdl)
+	const struct sockaddr_dl *sdl;
+{
+	static char obuf[64];
+	char *out = obuf;
+	int i;
+	u_char *in = (u_char *)LLADDR(sdl);
+	u_char *inlim = in + sdl->sdl_alen;
+	int firsttime = 1;
+
+	if (sdl->sdl_nlen) {
+		bcopy(sdl->sdl_data, obuf, sdl->sdl_nlen);
+		out += sdl->sdl_nlen;
+		if (sdl->sdl_alen)
+			*out++ = ':';
+	}
+	while (in < inlim) {
+		if (firsttime)
+			firsttime = 0;
+		else
+			*out++ = '.';
+		i = *in++;
+		if (i > 0xf) {
+			out[1] = hexlist[i & 0xf];
+			i >>= 4;
+			out[0] = hexlist[i];
+			out += 2;
+		} else
+			*out++ = hexlist[i];
+	}
+	*out = 0;
+	return (obuf);
+}

Added: trunk/freebsd-glue/src/trimdomain.c
===================================================================
--- trunk/freebsd-glue/src/trimdomain.c	                        (rev 0)
+++ trunk/freebsd-glue/src/trimdomain.c	2013-08-06 12:10:54 UTC (rev 4872)
@@ -0,0 +1,113 @@
+/*-
+ * Copyright (c) 2001 Brian Somers <brian at Awfulhak.org>
+ *   Based on original work by Atsushi Murai <amurai at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+#include <sys/param.h>
+
+#include <libutil.h>
+#include <string.h>
+#include <unistd.h>
+
+static int	isDISP(const char *);
+
+/*-
+ * Trim the current domain name from fullhost, but only if the result
+ * is less than or equal to hostsize in length.
+ *
+ * This function understands $DISPLAY type fullhosts.
+ *
+ * For example:
+ *
+ *     trimdomain("abcde.my.domain", 5)       ->   "abcde"
+ *     trimdomain("abcde.my.domain", 4)       ->   "abcde.my.domain"
+ *     trimdomain("abcde.my.domain:0.0", 9)   ->   "abcde:0.0"
+ *     trimdomain("abcde.my.domain:0.0", 8)   ->   "abcde.my.domain:0.0"
+ */
+void
+trimdomain(char *fullhost, int hostsize)
+{
+	static size_t dlen;
+	static int first = 1;
+	static char domain[MAXHOSTNAMELEN];
+	char *end, *s;
+	size_t len;
+
+	if (first) {
+		/* XXX: Should we assume that our domain is this persistent ? */
+		first = 0;
+		if (gethostname(domain, sizeof(domain) - 1) == 0 &&
+		    (s = strchr(domain, '.')) != NULL)
+			memmove(domain, s + 1, strlen(s + 1) + 1);
+		else
+			domain[0] = '\0';
+		dlen = strlen(domain);
+	}
+
+	if (domain[0] == '\0')
+		return;
+
+	s = fullhost;
+	end = s + hostsize + 1;
+	if ((s = memchr(s, '.', (size_t)(end - s))) != NULL) {
+		if (strncasecmp(s + 1, domain, dlen) == 0) {
+			if (s[dlen + 1] == '\0') {
+				/* Found -- lose the domain. */
+				*s = '\0';
+			} else if (s[dlen + 1] == ':' &&
+			    isDISP(s + dlen + 2) &&
+			    (len = strlen(s + dlen + 1)) < (size_t)(end - s)) {
+				/* Found -- shuffle the DISPLAY back. */
+				memmove(s, s + dlen + 1, len + 1);
+			}
+		}
+	}
+}
+
+/*
+ * Is the given string NN or NN.NN where ``NN'' is an all-numeric string ?
+ */
+static int
+isDISP(const char *disp)
+{
+	size_t w;
+	int res;
+
+	w = strspn(disp, "0123456789");
+	res = 0;
+	if (w > 0) {
+		if (disp[w] == '\0')
+			res = 1;	/* NN */
+		else if (disp[w] == '.') {
+			disp += w + 1;
+			w = strspn(disp, "0123456789");
+			if (w > 0 && disp[w] == '\0')
+				res = 1;	/* NN.NN */
+		}
+	}
+	return (res);
+}




More information about the Glibc-bsd-commits mailing list