diff options
author | Ali Abdulkadir <autostart.ini@gmail.com> | 2017-10-24 08:11:33 +0300 |
---|---|---|
committer | Ali Abdulkadir <autostart.ini@gmail.com> | 2017-10-24 08:11:33 +0300 |
commit | 18568bc04425a1a51e234fcb97c308dfb6a2a251 (patch) | |
tree | 40c5fcaaffa29791056442c9d26b5fb2ae9e4a1d | |
parent | b70db04d088f917495bf4b5eddf2ed15f747a10f (diff) | |
download | tcpdump-18568bc04425a1a51e234fcb97c308dfb6a2a251.tar.gz |
Made up for missing getservent() and endservent()
-rw-r--r-- | Makefile.in | 2 | ||||
-rw-r--r-- | addrtoname.c | 3 | ||||
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | getservent.h | 67 | ||||
-rw-r--r-- | missing/getservent.c | 143 |
5 files changed, 216 insertions, 1 deletions
diff --git a/Makefile.in b/Makefile.in index 49e2060c..e29b59f0 100644 --- a/Makefile.in +++ b/Makefile.in @@ -381,6 +381,8 @@ datalinks.o: $(srcdir)/missing/datalinks.c $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/datalinks.c dlnames.o: $(srcdir)/missing/dlnames.c $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/dlnames.c +getservent.o: $(srcdir)/missing/getservent.c + $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/getservent.c getopt_long.o: $(srcdir)/missing/getopt_long.c $(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/getopt_long.c snprintf.o: $(srcdir)/missing/snprintf.c diff --git a/addrtoname.c b/addrtoname.c index 01e33093..731439c3 100644 --- a/addrtoname.c +++ b/addrtoname.c @@ -57,6 +57,9 @@ extern int ether_ntohost(char *, const struct ether_addr *); #include <pcap.h> #include <pcap-namedb.h> +#ifndef HAVE_GETSERVENT +#include <getservent.h> +#endif #include <signal.h> #include <stdio.h> #include <string.h> diff --git a/configure.in b/configure.in index 7f4169d3..c24cd46e 100644 --- a/configure.in +++ b/configure.in @@ -400,7 +400,7 @@ if test "$td_cv_decl_netdnet_dnetdb_h_dnet_htoa" = yes; then [define if you have a dnet_htoa declaration in <netdnet/dnetdb.h>]) fi -AC_REPLACE_FUNCS(vfprintf strlcat strlcpy strdup strsep getopt_long) +AC_REPLACE_FUNCS(vfprintf strlcat strlcpy strdup strsep getservent getopt_long) AC_CHECK_FUNCS(fork vfork strftime) AC_CHECK_FUNCS(setlinebuf alarm) diff --git a/getservent.h b/getservent.h new file mode 100644 index 00000000..95ef2354 --- /dev/null +++ b/getservent.h @@ -0,0 +1,67 @@ +/* +* Copyright (c) 1983, 1993 The Regents of the University of California. +* Copyright (c) 1993 Digital Equipment Corporation. +* Copyright (c) 2012 G. Vanem <gvanem@yahoo.no>. +* Copyright (c) 2017 Ali Abdulkadir <autostart.ini@gmail.com>. +* 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. +* 3. All advertising materials mentioning features or use of this software +* must display the following acknowledgement: +* This product includes software developed by the University of +* California, Berkeley and its contributors. +* 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. +*/ + +#ifndef _GETSERVENT_H +#define _GETSERVENT_H + +#ifdef _NETDB_H_ +/* Just in case... */ +#error netdb.h and getservent.h are incompatible +#else +#define _NETDB_H_ +#endif + +#ifdef _WIN32 +#define __PATH_SYSROOT "SYSTEMROOT" +#define __PATH_ETC_INET "\\System32\\drivers\\etc\\" +#define __PATH_SERVICES "services" +#else +/* +* The idea here is to be able to replace "PREFIX" in __PATH_SYSROOT with a variable +* that could, for example, point to an alternative install location. +*/ +#define __PATH_SYSROOT "PREFIX" +#define __PATH_ETC_INET "/etc/" +#define __PATH_SERVICES __PATH_SYSROOT__PATH_ETC_INET"services" +#endif + +#define MAXALIASES 35 + +void endservent (void); +struct servent *getservent(void); +void setservent (int f); + +#endif /* !_GETSERVENT_H */ diff --git a/missing/getservent.c b/missing/getservent.c new file mode 100644 index 00000000..c2dc620d --- /dev/null +++ b/missing/getservent.c @@ -0,0 +1,143 @@ +/* + * Copyright (c) 1983, 1993 The Regents of the University of California. + * Copyright (c) 1993 Digital Equipment Corporation. + * Copyright (c) 2012 G. Vanem <gvanem@yahoo.no>. + * Copyright (c) 2017 Ali Abdulkadir <autostart.ini@gmail.com>. + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <netdissect-stdinc.h> +#include <getservent.h> + +static FILE *servf = NULL; +static char line[BUFSIZ+1]; +static struct servent serv; +static char *serv_aliases[MAXALIASES]; +int _serv_stayopen; +const char *etc_path(const char *file); + +/* +* Return either "%SYSTEMROOT%\System32\drivers\etc\<file>", +* $PREFIX/etc/<file> or simply "<file>" if those failed. +* "<file>" is aka __PATH_SERVICES (aka "services" on Windows and +* "/etc/services" on other platforms that would need this) +*/ +const char *etc_path(const char *file) +{ + const char *env = getenv(__PATH_SYSROOT); + static char path[_MAX_PATH]; + + if (!env) +/* +* #ifdef _DEBUG +* printf("Warning: Environment Variable \"%s\" invalid\nResorting to [CurrentDirectory]/%s\n", +* __PATH_SYSROOT, file); +* #endif +*/ + return (file); + + snprintf(path, sizeof(path), "%s%s%s", env, __PATH_ETC_INET, file); + return (path); +} + +void +setservent(int f) +{ + if (servf == NULL) + servf = fopen(etc_path(__PATH_SERVICES), "r"); + else + rewind(servf); + _serv_stayopen |= f; +} + +void +endservent(void) +{ + if (servf) { + fclose(servf); + servf = NULL; + } + _serv_stayopen = 0; +} + +struct servent * +getservent(void) +{ + char *p; + register char *cp, **q; + + if (servf == NULL && (servf = fopen(etc_path(__PATH_SERVICES), "r")) == NULL) + return (NULL); + +again: + if ((p = fgets(line, BUFSIZ, servf)) == NULL) + return (NULL); + if (*p == '#') + goto again; + cp = strpbrk(p, "#\n"); + if (cp == NULL) + goto again; + *cp = '\0'; + serv.s_name = p; + p = strpbrk(p, " \t"); + if (p == NULL) + goto again; + *p++ = '\0'; + while (*p == ' ' || *p == '\t') + p++; + cp = strpbrk(p, ",/"); + if (cp == NULL) + goto again; + *cp++ = '\0'; + serv.s_port = htons((u_short)atoi(p)); + serv.s_proto = cp; + q = serv.s_aliases = serv_aliases; + cp = strpbrk(cp, " \t"); + if (cp != NULL) + *cp++ = '\0'; + while (cp && *cp) { + if (*cp == ' ' || *cp == '\t') { + cp++; + continue; + } + if (q < &serv_aliases[MAXALIASES - 1]) + *q++ = cp; + cp = strpbrk(cp, " \t"); + if (cp != NULL) + *cp++ = '\0'; + } + *q = NULL; + return (&serv); +} |