Add autoconf infrastructure
This commit is contained in:
parent
00dbb8de86
commit
07f094de73
|
@ -1,3 +1,40 @@
|
|||
/* $NetBSD: blacklistctl.c,v 1.5 2015/01/22 01:39:18 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2015 The NetBSD Foundation, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to The NetBSD Foundation
|
||||
* by Christos Zoulas.
|
||||
*
|
||||
* 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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"
|
||||
#include "port.h"
|
||||
#endif
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: blacklistctl.c,v 1.5 2015/01/22 01:39:18 christos Exp $");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: blacklistd.c,v 1.11 2015/01/21 23:26:26 christos Exp $ */
|
||||
/* $NetBSD: blacklistd.c,v 1.12 2015/01/22 01:39:18 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2015 The NetBSD Foundation, Inc.
|
||||
|
@ -28,8 +28,12 @@
|
|||
* 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"
|
||||
#include "port.h"
|
||||
#endif
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: blacklistd.c,v 1.11 2015/01/21 23:26:26 christos Exp $");
|
||||
__RCSID("$NetBSD: blacklistd.c,v 1.12 2015/01/22 01:39:18 christos Exp $");
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
|
@ -69,25 +73,25 @@ static sig_atomic_t rconf;
|
|||
static sig_atomic_t done;
|
||||
|
||||
static void
|
||||
sigusr1(int n)
|
||||
sigusr1(int n __unused)
|
||||
{
|
||||
debug++;
|
||||
}
|
||||
|
||||
static void
|
||||
sigusr2(int n)
|
||||
sigusr2(int n __unused)
|
||||
{
|
||||
debug--;
|
||||
}
|
||||
|
||||
static void
|
||||
sighup(int n)
|
||||
sighup(int n __unused)
|
||||
{
|
||||
rconf++;
|
||||
}
|
||||
|
||||
static void
|
||||
sigdone(int n)
|
||||
sigdone(int n __unused)
|
||||
{
|
||||
done++;
|
||||
}
|
||||
|
@ -123,12 +127,11 @@ process(bl_t bl)
|
|||
return;
|
||||
|
||||
if (debug)
|
||||
printf("got type=%d fd=%d msg=%s cred=[u=%lu, g=%lu]\n",
|
||||
printf("got type=%d fd=%d msg=%s uid=%lu\n",
|
||||
bi->bi_type, bi->bi_fd, bi->bi_msg,
|
||||
(unsigned long)bi->bi_cred.sc_euid,
|
||||
(unsigned long)bi->bi_cred.sc_egid);
|
||||
(unsigned long)bi->bi_uid);
|
||||
|
||||
if (conf_find(bi->bi_fd, bi->bi_cred.sc_euid, &c) == NULL)
|
||||
if (conf_find(bi->bi_fd, bi->bi_uid, &c) == NULL)
|
||||
goto out;
|
||||
|
||||
rfd = bi->bi_fd;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: run.c,v 1.4 2015/01/21 19:24:03 christos Exp $ */
|
||||
/* $NetBSD: run.c,v 1.5 2015/01/22 01:39:18 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2015 The NetBSD Foundation, Inc.
|
||||
|
@ -28,8 +28,13 @@
|
|||
* 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"
|
||||
#include "port.h"
|
||||
#endif
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: run.c,v 1.4 2015/01/21 19:24:03 christos Exp $");
|
||||
__RCSID("$NetBSD: run.c,v 1.5 2015/01/22 01:39:18 christos Exp $");
|
||||
|
||||
#include <stdio.h>
|
||||
#include <util.h>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: state.c,v 1.5 2015/01/21 23:09:44 christos Exp $ */
|
||||
/* $NetBSD: state.c,v 1.6 2015/01/22 01:39:18 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2015 The NetBSD Foundation, Inc.
|
||||
|
@ -28,9 +28,13 @@
|
|||
* 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"
|
||||
#include "port.h"
|
||||
#endif
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: state.c,v 1.5 2015/01/21 23:09:44 christos Exp $");
|
||||
__RCSID("$NetBSD: state.c,v 1.6 2015/01/22 01:39:18 christos Exp $");
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: bl.h,v 1.7 2015/01/21 16:16:00 christos Exp $ */
|
||||
/* $NetBSD: bl.h,v 1.8 2015/01/22 01:39:18 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2014 The NetBSD Foundation, Inc.
|
||||
|
@ -36,8 +36,6 @@
|
|||
#include <sys/socket.h>
|
||||
#include "blacklist.h"
|
||||
|
||||
struct sockcred;
|
||||
|
||||
typedef enum {
|
||||
BL_INVALID,
|
||||
BL_ADD,
|
||||
|
@ -47,10 +45,7 @@ typedef enum {
|
|||
typedef struct {
|
||||
bl_type_t bi_type;
|
||||
int bi_fd;
|
||||
union {
|
||||
char bi_space[SOCKCREDSIZE(NGROUPS_MAX)];
|
||||
struct sockcred _bi_cred;
|
||||
} bi_u;
|
||||
uid_t bi_uid;
|
||||
char bi_msg[1024];
|
||||
} bl_info_t;
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: bl.c,v 1.8 2015/01/21 16:16:00 christos Exp $ */
|
||||
/* $NetBSD: bl.c,v 1.9 2015/01/22 01:39:18 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2014 The NetBSD Foundation, Inc.
|
||||
|
@ -29,11 +29,12 @@
|
|||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: bl.c,v 1.8 2015/01/21 16:16:00 christos Exp $");
|
||||
__RCSID("$NetBSD: bl.c,v 1.9 2015/01/22 01:39:18 christos Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/un.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -86,7 +87,9 @@ bl_reset(bl_t b)
|
|||
static int
|
||||
bl_init(bl_t b, bool srv)
|
||||
{
|
||||
#ifdef LOCAL_CREDS
|
||||
static int one = 1;
|
||||
#endif
|
||||
/* AF_UNIX address of local logger */
|
||||
struct sockaddr_un sun = {
|
||||
.sun_family = AF_LOCAL,
|
||||
|
@ -100,6 +103,15 @@ bl_init(bl_t b, bool srv)
|
|||
if (srv)
|
||||
(void)unlink(b->b_path);
|
||||
|
||||
#ifndef SOCK_NONBLOCK
|
||||
#define SOCK_NONBLOCK 0
|
||||
#endif
|
||||
#ifndef SOCK_CLOEXEC
|
||||
#define SOCK_CLOEXEC 0
|
||||
#endif
|
||||
#ifndef SOCK_NOSIGPIPE
|
||||
#define SOCK_NOSIGPIPE 0
|
||||
#endif
|
||||
if (b->b_fd == -1) {
|
||||
b->b_fd = socket(PF_LOCAL,
|
||||
SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK|SOCK_NOSIGPIPE, 0);
|
||||
|
@ -108,6 +120,16 @@ bl_init(bl_t b, bool srv)
|
|||
__func__);
|
||||
return 0;
|
||||
}
|
||||
#if SOCK_CLOEXEC == 0
|
||||
fcntl(b->b_fd, F_SETFD, FD_CLOEXEC);
|
||||
#endif
|
||||
#if SOCK_NONBLOCK == 0
|
||||
fcntl(b->b_fd, F_SETFL, fcntl(b->b_fd, F_GETFL) | O_NONBLOCK);
|
||||
#endif
|
||||
#if SOCK_NOSIGPIPE == 0
|
||||
int o = 1;
|
||||
setsockopt(b->b_fd, SOL_SOCKET, SO_NOSIGPIPE, &o, sizeof(o));
|
||||
#endif
|
||||
}
|
||||
|
||||
if (b->b_connected)
|
||||
|
@ -124,12 +146,14 @@ bl_init(bl_t b, bool srv)
|
|||
}
|
||||
|
||||
b->b_connected = true;
|
||||
#ifdef LOCAL_CREDS
|
||||
if (setsockopt(b->b_fd, 0, LOCAL_CREDS,
|
||||
&one, (socklen_t)sizeof(one)) == -1) {
|
||||
(*b->b_fun)(LOG_ERR, "%s: setsockopt LOCAL_CREDS "
|
||||
"failed (%m)", __func__);
|
||||
goto out;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (srv)
|
||||
if (listen(b->b_fd, 5) == -1) {
|
||||
|
@ -182,7 +206,6 @@ bl_send(bl_t b, bl_type_t e, int pfd, const char *ctx)
|
|||
bl_message_t bl;
|
||||
char buf[512];
|
||||
} ub;
|
||||
int *fd;
|
||||
size_t ctxlen, tried;
|
||||
#define NTRIES 5
|
||||
|
||||
|
@ -210,8 +233,7 @@ bl_send(bl_t b, bl_type_t e, int pfd, const char *ctx)
|
|||
cmsg->cmsg_level = SOL_SOCKET;
|
||||
cmsg->cmsg_type = SCM_RIGHTS;
|
||||
|
||||
fd = CMSG_DATA(cmsg);
|
||||
*fd = pfd;
|
||||
memcpy(CMSG_DATA(cmsg), &pfd, sizeof(pfd));
|
||||
|
||||
tried = 0;
|
||||
again:
|
||||
|
@ -231,13 +253,20 @@ bl_recv(bl_t b)
|
|||
struct msghdr msg;
|
||||
struct iovec iov;
|
||||
union {
|
||||
char ctrl[CMSG_SPACE(sizeof(int)) +
|
||||
CMSG_SPACE(SOCKCREDSIZE(NGROUPS_MAX))];
|
||||
char ctrl[CMSG_SPACE(sizeof(int))
|
||||
#ifdef SOCKCREDSIZE
|
||||
+ CMSG_SPACE(SOCKCREDSIZE(NGROUPS_MAX))
|
||||
#endif
|
||||
];
|
||||
uint32_t fd;
|
||||
#ifdef SOCKCREDSIZE
|
||||
struct sockcred sc;
|
||||
#endif
|
||||
} ua;
|
||||
struct cmsghdr *cmsg;
|
||||
#ifdef SOCKCREDSIZE
|
||||
struct sockcred *sc;
|
||||
#endif
|
||||
union {
|
||||
bl_message_t bl;
|
||||
char buf[512];
|
||||
|
@ -278,14 +307,14 @@ bl_recv(bl_t b)
|
|||
CMSG_LEN(2 * sizeof(int)));
|
||||
continue;
|
||||
}
|
||||
fd = CMSG_DATA(cmsg);
|
||||
bi->bi_fd = *fd;
|
||||
memcpy(&bi->bi_fd, CMSG_DATA(cmsg), sizeof(bi->bi_fd));
|
||||
break;
|
||||
case SCM_CREDS:
|
||||
#ifdef SOCKCREDSIZE
|
||||
sc = (void *)CMSG_DATA(cmsg);
|
||||
if (sc->sc_ngroups > NGROUPS_MAX)
|
||||
sc->sc_ngroups = NGROUPS_MAX;
|
||||
memcpy(&bi->bi_cred, sc, SOCKCREDSIZE(sc->sc_ngroups));
|
||||
bi->bi_uid = sc->sc_euid;
|
||||
#else
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
(*b->b_fun)(LOG_ERR, "%s: unexpected cmsg_type %d",
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
#
|
||||
lib_LTLIBRARIES = libblacklist.la
|
||||
include_HEADERS = blacklist.h
|
||||
|
||||
bin_PROGRAMS = blacklistd blacklistctl
|
||||
|
||||
VPATH = ../bin:../lib:../test
|
||||
|
||||
AM_CPPFLAGS = -I../include -I../bin/include
|
||||
AM_CFLAGS = @WARNINGS@
|
||||
|
||||
libblacklist_la_SOURCES = bl.c blacklist.c
|
||||
libblacklist_la_LDFLAGS = -no-undefined -version-info 0:0:0
|
||||
libblacklist_la_LIBADD = $(LTLIBOBJS)
|
||||
|
||||
SRCS = internal.c util.c run.c conf.c state.c
|
||||
blacklistd_SOURCES = blacklistd.c ${SRCS}
|
||||
blacklistd_LDADD = libblacklist.la
|
||||
blacklistctl_SOURCES = blacklistctl.c ${SRCS}
|
||||
blacklistctl_LDADD = libblacklist.la
|
|
@ -0,0 +1,17 @@
|
|||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#include "port.h"
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
int
|
||||
clock_gettime(int clock __unused, struct timespec *ts)
|
||||
{
|
||||
struct timeval tv;
|
||||
if (gettimeofday(&tv, NULL) == -1)
|
||||
return -1;
|
||||
ts->tv_sec = tv.tv_sec;
|
||||
ts->tv_nsec = tv.tv_usec * 1000;
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
dnl Process this file with autoconf to produce a configure script.
|
||||
AC_INIT([blacklistd],[0.1],[christos@netbsd.com])
|
||||
AM_INIT_AUTOMAKE([subdir-objects foreign])
|
||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
AC_SUBST(WARNINGS)
|
||||
|
||||
dnl Checks for programs.
|
||||
AC_PROG_CC_STDC
|
||||
AC_USE_SYSTEM_EXTENSIONS
|
||||
AM_PROG_CC_C_O
|
||||
AC_C_BIGENDIAN
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_LN_S
|
||||
LT_INIT([disable-static pic-only])
|
||||
gl_VISIBILITY
|
||||
dnl Checks for headers
|
||||
AC_HEADER_STDC
|
||||
AC_HEADER_MAJOR
|
||||
AC_HEADER_SYS_WAIT
|
||||
AC_CHECK_HEADERS(stdint.h fcntl.h stdint.h inttypes.h unistd.h)
|
||||
AC_CHECK_HEADERS(sys/un.h sys/socket.h limits.h)
|
||||
AC_CHECK_HEADERS(arpa/inet.h getopt.h err.h xlocale.h)
|
||||
AC_CHECK_HEADERS(sys/types.h sys/utime.h sys/time.h time.h)
|
||||
|
||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
AC_TYPE_OFF_T
|
||||
AC_TYPE_SIZE_T
|
||||
AC_SYS_LARGEFILE
|
||||
|
||||
AC_TYPE_PID_T
|
||||
AC_TYPE_UINT8_T
|
||||
AC_TYPE_UINT16_T
|
||||
AC_TYPE_UINT32_T
|
||||
AC_TYPE_INT32_T
|
||||
AC_TYPE_UINT64_T
|
||||
AC_TYPE_INT64_T
|
||||
AC_TYPE_INTPTR_T
|
||||
AC_TYPE_UINTPTR_T
|
||||
|
||||
AC_MSG_CHECKING(for gcc compiler warnings)
|
||||
AC_ARG_ENABLE(warnings,
|
||||
[ --disable-warnings disable compiler warnings],
|
||||
[if test "${enableval}" = no -o "$GCC" = no; then
|
||||
AC_MSG_RESULT(no)
|
||||
WARNINGS=
|
||||
else
|
||||
AC_MSG_RESULT(yes)
|
||||
WARNINGS="-Wall -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith \
|
||||
-Wmissing-declarations -Wredundant-decls -Wnested-externs \
|
||||
-Wsign-compare -Wreturn-type -Wswitch -Wshadow \
|
||||
-Wcast-qual -Wwrite-strings -Wextra -Wunused-parameter -Wformat=2"
|
||||
fi], [
|
||||
if test "$GCC" = yes; then
|
||||
AC_MSG_RESULT(yes)
|
||||
WARNINGS="-Wall -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith \
|
||||
-Wmissing-declarations -Wredundant-decls -Wnested-externs \
|
||||
-Wsign-compare -Wreturn-type -Wswitch -Wshadow \
|
||||
-Wcast-qual -Wwrite-strings -Wextra -Wunused-parameter -Wformat=2"
|
||||
else
|
||||
WARNINGS=
|
||||
AC_MSG_RESULT(no)
|
||||
fi])
|
||||
|
||||
dnl Checks for functions
|
||||
AC_CHECK_FUNCS(strerror strndup strtoul mkstemp mkostemp utimes utime wcwidth strtof newlocale uselocale freelocale setlocal)
|
||||
|
||||
dnl Provide implementation of some required functions if necessary
|
||||
AC_REPLACE_FUNCS(strtoi sockaddr_snprintf popenve clock_gettime)
|
||||
|
||||
dnl See if we are cross-compiling
|
||||
AM_CONDITIONAL(IS_CROSS_COMPILE, test "$cross_compiling" = yes)
|
||||
|
||||
AC_CONFIG_FILES([Makefile])
|
||||
AC_OUTPUT
|
|
@ -0,0 +1 @@
|
|||
*.m4
|
|
@ -0,0 +1,275 @@
|
|||
/* $NetBSD: popenve.c,v 1.1 2015/01/22 01:39:18 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* This code is derived from software written by Ken Arnold and
|
||||
* published in UNIX Review, Vol. 6, No. 8.
|
||||
*
|
||||
* 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. 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 "port.h"
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)popen.c 8.3 (Berkeley) 5/3/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: popenve.c,v 1.1 2015/01/22 01:39:18 christos Exp $");
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <paths.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#ifdef __weak_alias
|
||||
__weak_alias(popen,_popen)
|
||||
__weak_alias(pclose,_pclose)
|
||||
#endif
|
||||
|
||||
static struct pid {
|
||||
struct pid *next;
|
||||
FILE *fp;
|
||||
#ifdef _REENTRANT
|
||||
int fd;
|
||||
#endif
|
||||
pid_t pid;
|
||||
} *pidlist;
|
||||
|
||||
#ifdef _REENTRANT
|
||||
static rwlock_t pidlist_lock = RWLOCK_INITIALIZER;
|
||||
#endif
|
||||
|
||||
static struct pid *
|
||||
pdes_get(int *pdes, const char **type)
|
||||
{
|
||||
struct pid *cur;
|
||||
int flags = strchr(*type, 'e') ? O_CLOEXEC : 0;
|
||||
int serrno;
|
||||
|
||||
if (strchr(*type, '+')) {
|
||||
#ifndef SOCK_CLOEXEC
|
||||
#define SOCK_CLOEXEC 0
|
||||
#endif
|
||||
int stype = flags ? (SOCK_STREAM | SOCK_CLOEXEC) : SOCK_STREAM;
|
||||
*type = "r+";
|
||||
if (socketpair(AF_LOCAL, stype, 0, pdes) < 0)
|
||||
return NULL;
|
||||
#if SOCK_CLOEXEC == 0
|
||||
fcntl(pdes[0], F_SETFD, FD_CLOEXEC);
|
||||
fcntl(pdes[1], F_SETFD, FD_CLOEXEC);
|
||||
#endif
|
||||
} else {
|
||||
*type = strrchr(*type, 'r') ? "r" : "w";
|
||||
#if SOCK_CLOEXEC != 0
|
||||
if (pipe2(pdes, flags) == -1)
|
||||
return NULL;
|
||||
#else
|
||||
if (pipe(pdes) == -1)
|
||||
return NULL;
|
||||
fcntl(pdes[0], F_SETFL, fcntl(pdes[0], F_GETFL) | flags);
|
||||
fcntl(pdes[1], F_SETFL, fcntl(pdes[1], F_GETFL) | flags);
|
||||
#endif
|
||||
}
|
||||
|
||||
if ((cur = malloc(sizeof(*cur))) != NULL)
|
||||
return cur;
|
||||
serrno = errno;
|
||||
(void)close(pdes[0]);
|
||||
(void)close(pdes[1]);
|
||||
errno = serrno;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
pdes_child(int *pdes, const char *type)
|
||||
{
|
||||
struct pid *old;
|
||||
|
||||
/* POSIX.2 B.3.2.2 "popen() shall ensure that any streams
|
||||
from previous popen() calls that remain open in the
|
||||
parent process are closed in the new child process. */
|
||||
for (old = pidlist; old; old = old->next)
|
||||
#ifdef _REENTRANT
|
||||
(void)close(old->fd); /* don't allow a flush */
|
||||
#else
|
||||
(void)close(fileno(old->fp)); /* don't allow a flush */
|
||||
#endif
|
||||
|
||||
if (type[0] == 'r') {
|
||||
(void)close(pdes[0]);
|
||||
if (pdes[1] != STDOUT_FILENO) {
|
||||
(void)dup2(pdes[1], STDOUT_FILENO);
|
||||
(void)close(pdes[1]);
|
||||
}
|
||||
if (type[1] == '+')
|
||||
(void)dup2(STDOUT_FILENO, STDIN_FILENO);
|
||||
} else {
|
||||
(void)close(pdes[1]);
|
||||
if (pdes[0] != STDIN_FILENO) {
|
||||
(void)dup2(pdes[0], STDIN_FILENO);
|
||||
(void)close(pdes[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
pdes_parent(int *pdes, struct pid *cur, pid_t pid, const char *type)
|
||||
{
|
||||
FILE *iop;
|
||||
|
||||
/* Parent; assume fdopen can't fail. */
|
||||
if (*type == 'r') {
|
||||
iop = fdopen(pdes[0], type);
|
||||
#ifdef _REENTRANT
|
||||
cur->fd = pdes[0];
|
||||
#endif
|
||||
(void)close(pdes[1]);
|
||||
} else {
|
||||
iop = fdopen(pdes[1], type);
|
||||
#ifdef _REENTRANT
|
||||
cur->fd = pdes[1];
|
||||
#endif
|
||||
(void)close(pdes[0]);
|
||||
}
|
||||
|
||||
/* Link into list of file descriptors. */
|
||||
cur->fp = iop;
|
||||
cur->pid = pid;
|
||||
cur->next = pidlist;
|
||||
pidlist = cur;
|
||||
}
|
||||
|
||||
static void
|
||||
pdes_error(int *pdes, struct pid *cur)
|
||||
{
|
||||
free(cur);
|
||||
(void)close(pdes[0]);
|
||||
(void)close(pdes[1]);
|
||||
}
|
||||
|
||||
FILE *
|
||||
popenve(const char *cmd, char *const *argv, char *const *envp, const char *type)
|
||||
{
|
||||
struct pid *cur;
|
||||
int pdes[2], serrno;
|
||||
pid_t pid;
|
||||
|
||||
if ((cur = pdes_get(pdes, &type)) == NULL)
|
||||
return NULL;
|
||||
|
||||
#ifdef _REENTRANT
|
||||
(void)rwlock_rdlock(&pidlist_lock);
|
||||
#endif
|
||||
switch (pid = vfork()) {
|
||||
case -1: /* Error. */
|
||||
serrno = errno;
|
||||
#ifdef _REENTRANT
|
||||
(void)rwlock_unlock(&pidlist_lock);
|
||||
#endif
|
||||
pdes_error(pdes, cur);
|
||||
errno = serrno;
|
||||
return NULL;
|
||||
/* NOTREACHED */
|
||||
case 0: /* Child. */
|
||||
pdes_child(pdes, type);
|
||||
execve(cmd, argv, envp);
|
||||
_exit(127);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
pdes_parent(pdes, cur, pid, type);
|
||||
|
||||
#ifdef _REENTRANT
|
||||
(void)rwlock_unlock(&pidlist_lock);
|
||||
#endif
|
||||
|
||||
return cur->fp;
|
||||
}
|
||||
|
||||
/*
|
||||
* pclose --
|
||||
* Pclose returns -1 if stream is not associated with a `popened' command,
|
||||
* if already `pclosed', or waitpid returns an error.
|
||||
*/
|
||||
int
|
||||
pcloseve(FILE *iop)
|
||||
{
|
||||
struct pid *cur, *last;
|
||||
int pstat;
|
||||
pid_t pid;
|
||||
|
||||
#ifdef _REENTRANT
|
||||
rwlock_wrlock(&pidlist_lock);
|
||||
#endif
|
||||
|
||||
/* Find the appropriate file pointer. */
|
||||
for (last = NULL, cur = pidlist; cur; last = cur, cur = cur->next)
|
||||
if (cur->fp == iop)
|
||||
break;
|
||||
if (cur == NULL) {
|
||||
#ifdef _REENTRANT
|
||||
(void)rwlock_unlock(&pidlist_lock);
|
||||
#endif
|
||||
errno = ESRCH;
|
||||
return -1;
|
||||
}
|
||||
|
||||
(void)fclose(iop);
|
||||
|
||||
/* Remove the entry from the linked list. */
|
||||
if (last == NULL)
|
||||
pidlist = cur->next;
|
||||
else
|
||||
last->next = cur->next;
|
||||
|
||||
#ifdef _REENTRANT
|
||||
(void)rwlock_unlock(&pidlist_lock);
|
||||
#endif
|
||||
|
||||
do {
|
||||
pid = waitpid(cur->pid, &pstat, 0);
|
||||
} while (pid == -1 && errno == EINTR);
|
||||
|
||||
free(cur);
|
||||
|
||||
return pid == -1 ? -1 : pstat;
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
#include <stdio.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#ifndef __unused
|
||||
#define __unused __attribute__((__unused__))
|
||||
#endif
|
||||
#ifndef __UNCONST
|
||||
#define __UNCONST(a) ((void *)(intptr_t)(a))
|
||||
#endif
|
||||
#ifndef __arraycount
|
||||
#define __arraycount(a) (sizeof(a) / sizeof(a[0]))
|
||||
#endif
|
||||
|
||||
FILE *popenve(const char *, char *const *, char *const *, const char *);
|
||||
int pcloseve(FILE *);
|
||||
struct sockaddr;
|
||||
int sockaddr_snprintf(char *, size_t, const char *, const struct sockaddr *);
|
||||
intmax_t strtoi(const char *, char **, int, intmax_t, intmax_t, int *);
|
||||
struct timespec;
|
||||
int clock_gettime(int, struct timespec *);
|
||||
#define CLOCK_REALTIME 0
|
|
@ -0,0 +1,326 @@
|
|||
/* $NetBSD: sockaddr_snprintf.c,v 1.1 2015/01/22 01:39:18 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2004 The NetBSD Foundation, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to The NetBSD Foundation
|
||||
* by Christos Zoulas.
|
||||
*
|
||||
* 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
__RCSID("$NetBSD: sockaddr_snprintf.c,v 1.1 2015/01/22 01:39:18 christos Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
#ifdef HAVE_NETATALK_AT_H
|
||||
#include <netatalk/at.h>
|
||||
#endif
|
||||
#include <net/if_dl.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <util.h>
|
||||
#include <netdb.h>
|
||||
|
||||
#ifdef HAVE_NETATALK_AT_H
|
||||
static int
|
||||
debug_at(char *str, size_t len, const struct sockaddr_at *sat)
|
||||
{
|
||||
return snprintf(str, len, "sat_len=%u, sat_family=%u, sat_port=%u, "
|
||||
"sat_addr.s_net=%u, sat_addr.s_node=%u, "
|
||||
"sat_range.r_netrange.nr_phase=%u, "
|
||||
"sat_range.r_netrange.nr_firstnet=%u, "
|
||||
"sat_range.r_netrange.nr_lastnet=%u",
|
||||
sat->sat_len, sat->sat_family, sat->sat_port,
|
||||
sat->sat_addr.s_net, sat->sat_addr.s_node,
|
||||
sat->sat_range.r_netrange.nr_phase,
|
||||
sat->sat_range.r_netrange.nr_firstnet,
|
||||
sat->sat_range.r_netrange.nr_lastnet);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
debug_in(char *str, size_t len, const struct sockaddr_in *sin)
|
||||
{
|
||||
return snprintf(str, len, "sin_len=%u, sin_family=%u, sin_port=%u, "
|
||||
"sin_addr.s_addr=%08x",
|
||||
sin->sin_len, sin->sin_family, sin->sin_port,
|
||||
sin->sin_addr.s_addr);
|
||||
}
|
||||
|
||||
static int
|
||||
debug_in6(char *str, size_t len, const struct sockaddr_in6 *sin6)
|
||||
{
|
||||
const uint8_t *s = sin6->sin6_addr.s6_addr;
|
||||
|
||||
return snprintf(str, len, "sin6_len=%u, sin6_family=%u, sin6_port=%u, "
|
||||
"sin6_flowinfo=%u, "
|
||||
"sin6_addr=%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:"
|
||||
"%02x:%02x:%02x:%02x:%02x:%02x, sin6_scope_id=%u",
|
||||
sin6->sin6_len, sin6->sin6_family, sin6->sin6_port,
|
||||
sin6->sin6_flowinfo, s[0x0], s[0x1], s[0x2], s[0x3], s[0x4], s[0x5],
|
||||
s[0x6], s[0x7], s[0x8], s[0x9], s[0xa], s[0xb], s[0xc], s[0xd],
|
||||
s[0xe], s[0xf], sin6->sin6_scope_id);
|
||||
}
|
||||
|
||||
static int
|
||||
debug_un(char *str, size_t len, const struct sockaddr_un *sun)
|
||||
{
|
||||
return snprintf(str, len, "sun_len=%u, sun_family=%u, sun_path=%*s",
|
||||
sun->sun_len, sun->sun_family, (int)sizeof(sun->sun_path),
|
||||
sun->sun_path);
|
||||
}
|
||||
|
||||
static int
|
||||
debug_dl(char *str, size_t len, const struct sockaddr_dl *sdl)
|
||||
{
|
||||
const uint8_t *s = (const void *)sdl->sdl_data;
|
||||
|
||||
return snprintf(str, len, "sdl_len=%u, sdl_family=%u, sdl_index=%u, "
|
||||
"sdl_type=%u, sdl_nlen=%u, sdl_alen=%u, sdl_slen=%u, sdl_data="
|
||||
"%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
|
||||
sdl->sdl_len, sdl->sdl_family, sdl->sdl_index,
|
||||
sdl->sdl_type, sdl->sdl_nlen, sdl->sdl_alen, sdl->sdl_slen,
|
||||
s[0x0], s[0x1], s[0x2], s[0x3], s[0x4], s[0x5],
|
||||
s[0x6], s[0x7], s[0x8], s[0x9], s[0xa], s[0xb]);
|
||||
}
|
||||
|
||||
int
|
||||
sockaddr_snprintf(char * const sbuf, const size_t len, const char * const fmt,
|
||||
const struct sockaddr * const sa)
|
||||
{
|
||||
const void *a = NULL;
|
||||
char abuf[1024], nbuf[1024], *addr = NULL, *w = NULL;
|
||||
char Abuf[1024], pbuf[32], *name = NULL, *port = NULL;
|
||||
char *ebuf = &sbuf[len - 1], *buf = sbuf;
|
||||
const char *ptr, *s;
|
||||
int p = -1;
|
||||
#ifdef HAVE_NETATALK_AT_H
|
||||
const struct sockaddr_at *sat = NULL;
|
||||
#endif
|
||||
const struct sockaddr_in *sin4 = NULL;
|
||||
const struct sockaddr_in6 *sin6 = NULL;
|
||||
const struct sockaddr_un *sun = NULL;
|
||||
const struct sockaddr_dl *sdl = NULL;
|
||||
int na = 1;
|
||||
|
||||
#define ADDC(c) do { if (buf < ebuf) *buf++ = c; else buf++; } \
|
||||
while (/*CONSTCOND*/0)
|
||||
#define ADDS(p) do { for (s = p; *s; s++) ADDC(*s); } \
|
||||
while (/*CONSTCOND*/0)
|
||||
#define ADDNA() do { if (na) ADDS("N/A"); } \
|
||||
while (/*CONSTCOND*/0)
|
||||
|
||||
switch (sa->sa_family) {
|
||||
case AF_UNSPEC:
|
||||
goto done;
|
||||
#ifdef HAVE_NETATALK_AT_H
|
||||
case AF_APPLETALK:
|
||||
sat = ((const struct sockaddr_at *)(const void *)sa);
|
||||
p = ntohs(sat->sat_port);
|
||||
(void)snprintf(addr = abuf, sizeof(abuf), "%u.%u",
|
||||
ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node);
|
||||
(void)snprintf(port = pbuf, sizeof(pbuf), "%d", p);
|
||||
break;
|
||||
#endif
|
||||
case AF_LOCAL:
|
||||
sun = ((const struct sockaddr_un *)(const void *)sa);
|
||||
(void)strlcpy(addr = abuf, sun->sun_path, sizeof(abuf));
|
||||
break;
|
||||
case AF_INET:
|
||||
sin4 = ((const struct sockaddr_in *)(const void *)sa);
|
||||
p = ntohs(sin4->sin_port);
|
||||
a = &sin4->sin_addr;
|
||||
break;
|
||||
case AF_INET6:
|
||||
sin6 = ((const struct sockaddr_in6 *)(const void *)sa);
|
||||
p = ntohs(sin6->sin6_port);
|
||||
a = &sin6->sin6_addr;
|
||||
break;
|
||||
case AF_LINK:
|
||||
sdl = ((const struct sockaddr_dl *)(const void *)sa);
|
||||
(void)strlcpy(addr = abuf, link_ntoa(sdl), sizeof(abuf));
|
||||
if ((w = strchr(addr, ':')) != 0) {
|
||||
*w++ = '\0';
|
||||
addr = w;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
errno = EAFNOSUPPORT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (addr == abuf)
|
||||
name = addr;
|
||||
|
||||
if (a && getnameinfo(sa, (socklen_t)sa->sa_len, addr = abuf,
|
||||
(unsigned int)sizeof(abuf), NULL, 0,
|
||||
NI_NUMERICHOST|NI_NUMERICSERV) != 0)
|
||||
return -1;
|
||||
|
||||
for (ptr = fmt; *ptr; ptr++) {
|
||||
if (*ptr != '%') {
|
||||
ADDC(*ptr);
|
||||
continue;
|
||||
}
|
||||
next_char:
|
||||
switch (*++ptr) {
|
||||
case '?':
|
||||
na = 0;
|
||||
goto next_char;
|
||||
case 'a':
|
||||
ADDS(addr);
|
||||
break;
|
||||
case 'p':
|
||||
if (p != -1) {
|
||||
(void)snprintf(nbuf, sizeof(nbuf), "%d", p);
|
||||
ADDS(nbuf);
|
||||
} else
|
||||
ADDNA();
|
||||
break;
|
||||
case 'f':
|
||||
(void)snprintf(nbuf, sizeof(nbuf), "%d", sa->sa_family);
|
||||
ADDS(nbuf);
|
||||
break;
|
||||
case 'l':
|
||||
(void)snprintf(nbuf, sizeof(nbuf), "%d", sa->sa_len);
|
||||
ADDS(nbuf);
|
||||
break;
|
||||
case 'A':
|
||||
if (name)
|
||||
ADDS(name);
|
||||
else if (!a)
|
||||
ADDNA();
|
||||
else {
|
||||
getnameinfo(sa, (socklen_t)sa->sa_len,
|
||||
name = Abuf,
|
||||
(unsigned int)sizeof(nbuf), NULL, 0, 0);
|
||||
ADDS(name);
|
||||
}
|
||||
break;
|
||||
case 'P':
|
||||
if (port)
|
||||
ADDS(port);
|
||||
else if (p == -1)
|
||||
ADDNA();
|
||||
else {
|
||||
getnameinfo(sa, (socklen_t)sa->sa_len, NULL, 0,
|
||||
port = pbuf,
|
||||
(unsigned int)sizeof(pbuf), 0);
|
||||
ADDS(port);
|
||||
}
|
||||
break;
|
||||
case 'I':
|
||||
if (sdl && addr != abuf) {
|
||||
ADDS(abuf);
|
||||
} else {
|
||||
ADDNA();
|
||||
}
|
||||
break;
|
||||
case 'F':
|
||||
if (sin6) {
|
||||
(void)snprintf(nbuf, sizeof(nbuf), "%d",
|
||||
sin6->sin6_flowinfo);
|
||||
ADDS(nbuf);
|
||||
break;
|
||||
} else {
|
||||
ADDNA();
|
||||
}
|
||||
break;
|
||||
case 'S':
|
||||
if (sin6) {
|
||||
(void)snprintf(nbuf, sizeof(nbuf), "%d",
|
||||
sin6->sin6_scope_id);
|
||||
ADDS(nbuf);
|
||||
break;
|
||||
} else {
|
||||
ADDNA();
|
||||
}
|
||||
break;
|
||||
case 'R':
|
||||
#ifdef HAVE_NETATALK_AT_H
|
||||
if (sat) {
|
||||
const struct netrange *n =
|
||||
&sat->sat_range.r_netrange;
|
||||
(void)snprintf(nbuf, sizeof(nbuf),
|
||||
"%d:[%d,%d]", n->nr_phase , n->nr_firstnet,
|
||||
n->nr_lastnet);
|
||||
ADDS(nbuf);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
ADDNA();
|
||||
}
|
||||
break;
|
||||
case 'D':
|
||||
switch (sa->sa_family) {
|
||||
#ifdef HAVE_NETATALK_AT_H
|
||||
case AF_APPLETALK:
|
||||
debug_at(nbuf, sizeof(nbuf), sat);
|
||||
break;
|
||||
#endif
|
||||
case AF_LOCAL:
|
||||
debug_un(nbuf, sizeof(nbuf), sun);
|
||||
break;
|
||||
case AF_INET:
|
||||
debug_in(nbuf, sizeof(nbuf), sin4);
|
||||
break;
|
||||
case AF_INET6:
|
||||
debug_in6(nbuf, sizeof(nbuf), sin6);
|
||||
break;
|
||||
case AF_LINK:
|
||||
debug_dl(nbuf, sizeof(nbuf), sdl);
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
ADDS(nbuf);
|
||||
break;
|
||||
default:
|
||||
ADDC('%');
|
||||
if (na == 0)
|
||||
ADDC('?');
|
||||
if (*ptr == '\0')
|
||||
goto done;
|
||||
/*FALLTHROUGH*/
|
||||
case '%':
|
||||
ADDC(*ptr);
|
||||
break;
|
||||
}
|
||||
na = 1;
|
||||
}
|
||||
done:
|
||||
if (buf < ebuf)
|
||||
*buf = '\0';
|
||||
else if (len != 0)
|
||||
sbuf[len - 1] = '\0';
|
||||
return (int)(buf - sbuf);
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
/* $NetBSD: strtoi.c,v 1.1 2015/01/22 01:39:18 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2005 The DragonFly Project. All rights reserved.
|
||||
* Copyright (c) 2003 Citrus Project,
|
||||
* 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.
|
||||
*
|
||||
* Created by Kamil Rytarowski, based on ID:
|
||||
* NetBSD: src/common/lib/libc/stdlib/strtoul.c,v 1.3 2008/08/20 19:58:34 oster Exp
|
||||
*/
|
||||
|
||||
#if HAVE__CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#include "port.h"
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: strtoi.c,v 1.1 2015/01/22 01:39:18 christos Exp $");
|
||||
|
||||
#if defined(_KERNEL)
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#include <lib/libkern/libkern.h>
|
||||
#elif defined(_STANDALONE)
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#include <lib/libkern/libkern.h>
|
||||
#include <lib/libsa/stand.h>
|
||||
#else
|
||||
#include <stddef.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
|
||||
#define _FUNCNAME strtoi
|
||||
#define __TYPE intmax_t
|
||||
#define __WRAPPED strtoimax
|
||||
|
||||
#if !HAVE_STRTOI
|
||||
#include "_strtoi.h"
|
||||
#endif
|
Loading…
Reference in New Issue