procmgmt: config
+${COMPILE_PART1} procmgmt ${COMPILE_PART2}
-util: procmgmt des lwp_depinstall rx_depinstall
+util: $(DIR_roken) procmgmt des lwp_depinstall rx_depinstall
+${COMPILE_PART1} util ${COMPILE_PART2}
audit: util rx rxkad fsint
${COMPILE_PART1} cmd ${COMPILE_PART2} ;; \
esac
-hcrypto: config
+hcrypto: config $(DIR_roken)
+${COMPILE_PART1} crypto/hcrypto ${COMPILE_PART2}
lwp: util lwp_depinstall
+${COMPILE_PART1} lwp ${COMPILE_PART2}
+roken: config
+ +${COMPILE_PART1} roken ${COMPILE_PART2}
+
rxgen: config
+${COMPILE_PART1} rxgen ${COMPILE_PART2}
dviced dvolser \
venus update xstat afsmonitor rxdebug libafsrpc hcrypto \
libafsauthent shlibafsrpc shlibafsauthent libadmin man-pages \
- platform kopenafs authtools
+ platform kopenafs authtools $(DIR_roken)
+${COMPILE_PART1} finale ${COMPILE_PART2}
finale_nolibafs: project cmd comerr afsd butc tbutc tbudb libuafs audit kauth log \
dviced dvolser \
venus update xstat afsmonitor rxdebug libafsrpc hcrypto \
libafsauthent shlibafsrpc shlibafsauthent libadmin man-pages \
- platform kopenafs authtools
+ platform kopenafs authtools $(DIR_roken)
+${COMPILE_PART1} finale ${COMPILE_PART2}
check test: finale
-${COMPILE_PART1} libuafs ${COMPILE_CLEAN}
-${COMPILE_PART1} tests ${COMPILE_CLEAN}
-${COMPILE_PART1} crypto/hcrypto ${COMPILE_CLEAN}
+ -${COMPILE_PART1} roken ${COMPILE_CLEAN}
-(cd src/libafs; /bin/rm -rf afs afsint config rx)
-(cd src/libuafs; /bin/rm -rf afs afsint config rx des)
-/bin/rm -rf ${TOP_INCDIR} ${TOP_LIBDIR} ${TOP_JLIBDIR}
src/procmgmt/test/Makefile \
src/ptserver/Makefile \
src/tptserver/Makefile \
+ src/roken/Makefile \
src/rx/Makefile \
src/rx/bulk.example/Makefile \
src/rx/bulktest/Makefile \
AC_HEADER_STDC
AC_HEADER_SYS_WAIT
AC_HEADER_DIRENT
-AC_CHECK_HEADERS(stdlib.h string.h unistd.h fcntl.h sys/time.h sys/file.h grp.h)
+AC_CHECK_HEADERS(stdlib.h stdint.h string.h unistd.h fcntl.h sys/time.h sys/file.h grp.h)
AC_CHECK_HEADERS(netinet/in.h netdb.h sys/fcntl.h sys/mnttab.h sys/mntent.h)
AC_CHECK_HEADERS(mntent.h sys/vfs.h sys/param.h sys/fs_types.h sys/fstyp.h)
AC_CHECK_HEADERS(sys/mount.h strings.h termios.h signal.h sys/pag.h)
AC_CHECK_HEADERS(windows.h direct.h sys/ipc.h sys/resource.h sys/un.h)
AC_CHECK_HEADERS(security/pam_modules.h ucontext.h regex.h sys/statvfs.h sys/statfs.h sys/bitypes.h)
+AC_CHECK_HEADERS(sys/socket.h sys/ioctl.h errno.h time.h syslog.h)
AC_CHECK_HEADERS(linux/errqueue.h,,,[#include <linux/types.h>])
AC_CHECK_HEADERS(et/com_err.h)
AC_CHECK_FUNCS([ \
arc4random \
- daemon \
flock \
fseeko64 \
ftello64 \
snprintf \
strcasestr \
strerror \
- strlcat \
- strlcpy \
timegm \
vsnprintf \
vsyslog \
])
+OPENAFS_ROKEN()
+OPENAFS_C_ATTRIBUTE()
+
+dnl Functions that Heimdal's libroken provides, but that we
+dnl haven't found a need for yet, and so haven't imported
+AC_CHECK_FUNCS([ \
+ chown \
+ fchown \
+ getdtablesize \
+ gethostname \
+ gettimeofday \
+ localtime_r \
+ lstat \
+ inet_aton \
+ inet_ntop \
+ inet_pton \
+ readv \
+ strdup \
+ strftime \
+ strndup \
+ strsep \
+])
+
dnl Functions that we're going to try and get from libroken
AC_REPLACE_FUNCS([ \
+ daemon \
+ ecalloc \
+ emalloc \
+ erealloc \
err \
errx \
+ getopt \
getprogname \
+ strcasecmp \
+ strlcat \
+ strnlen \
strlcpy \
verr \
verrx \
err.h \
])
+AC_CHECK_DECLS([h_errno], [], [], [
+#include <sys/types.h>
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+])
+
+AC_HEADER_TIME
+
ROKEN_HEADERS=
AS_IF([test "$ac_cv_header_err_h" != "yes" ],
- [ROKEN_HEADERS="$ROKEN_HEADERS err.h"],
+ [ROKEN_HEADERS="$ROKEN_HEADERS \$(TOP_INCDIR)/err.h"],
[])
AC_SUBST(ROKEN_HEADERS)
[#include <sys/types.h>
#include <sys/socket.h>])
AC_CHECK_TYPES(off64_t)
+AC_CHECK_TYPES([ssize_t], [], [], [#include <unistd.h>])
+AC_CHECK_TYPES([struct winsize], [], [], [
+#include <sys/termios.h>
+#include <sys/ioctl.h>])
+AC_CHECK_TYPES([sa_family_t, socklen_t, struct sockaddr,
+ struct sockaddr_storage],
+ [], [], [
+#include <sys/types.h>
+#include <sys/socket.h>
+])
+AC_CHECK_TYPES([sa_family_t], [], [], [
+#include <sys/types.h>
+#include <sys/socket.h>
+])
+AC_CHECK_TYPES([struct addrinfo], [], [], [
+#include <sys/types.h>
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+])
+
AC_SIZEOF_TYPE(long)
AC_HEADER_PAM_CONST
src/procmgmt/test/Makefile \
src/ptserver/Makefile \
src/tptserver/Makefile \
+src/roken/Makefile \
src/rx/Makefile \
src/rx/bulk.example/Makefile \
src/rx/bulktest/Makefile \
--- /dev/null
+dnl
+dnl $Id$
+dnl
+
+dnl
+dnl Test for __attribute__
+dnl
+
+AC_DEFUN([OPENAFS_C_ATTRIBUTE], [
+AC_MSG_CHECKING(for __attribute__)
+AC_CACHE_VAL(ac_cv___attribute__, [
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <stdlib.h>
+static void foo(void) __attribute__ ((noreturn));
+
+static void
+foo(void)
+{
+ exit(1);
+}
+]])],
+[ac_cv___attribute__=yes],
+[ac_cv___attribute__=no])])
+if test "$ac_cv___attribute__" = "yes"; then
+ AC_DEFINE(HAVE___ATTRIBUTE__, 1, [define if your compiler has __attribute__])
+fi
+AC_MSG_RESULT($ac_cv___attribute__)
+])
--- /dev/null
+
+AC_DEFUN([_OPENAFS_ROKEN_INTERNAL], [
+ DIR_roken=roken
+ CPPFLAGS_roken=
+ LDFLAGS_roken="-L\$(TOP_LIBDIR)"
+ LIB_roken=-lrokenafs
+])
+
+dnl _OPENAFS_ROKEN_CHECK($path,
+dnl $action-if-found,
+dnl $action-if-not-found)
+dnl Find a roken library at $path.
+dnl
+dnl If $path is not specified,
+dnl try to find one in the standard locations on the system.
+dnl
+dnl If we fail, and $path was given, then error out. Otherwise,
+dnl fall back to the internal roken implementation
+AC_DEFUN([_OPENAFS_ROKEN_CHECK], [
+ roken_path=$1
+
+ save_CPPFLAGS=$CPPFLAGS
+ save_LDFLAGS=$LDFLAGS
+ save_LIBS=$LIBS
+ AS_IF([test x"$roken_path" != x],
+ [CPPFLAGS="-I$roken_path/include $CPPFLAGS"
+ LDFLAGS="-L$roken_path/lib $LDFLAGS"])
+
+ dnl Need to be careful what we check for here, as libroken contains
+ dnl different symbols on different platforms.
+ AC_CHECK_LIB([roken], [ct_memcmp], [found_foundlib=true])
+ AC_CHECK_HEADER([roken], [roken_foundheader=true])
+ CPPFLAGS=$save_CPPFLAGS
+ LDFLAGS=$save_LDFLAGS
+
+ AS_IF([test x"$roken_foundlib" = xtrue && test x"roken_foundheader" = xtrue],
+ [AS_IF([test x"$roken_path" != x],
+ [CPPFLAGS_roken = "-I$roken_path/include"
+ LDFLAGS_roken="-I$roken_path/lib"
+ LIB_roken="-lroken"])
+ $2],
+ [$3])
+])
+
+AC_DEFUN([OPENAFS_ROKEN], [
+ roken_root=
+ AC_SUBST(LIB_roken)
+ AC_SUBST(CPPFLAGS_roken)
+ AC_SUBST(LDFLAGS_roken)
+ AC_SUBST(DIR_roken)
+
+ AC_ARG_WITH([roken],
+ [AS_HELP_STRING([--with-roken=DIR],
+ [Location of the roken library, or 'internal'])],
+ [AS_IF([test x"$withval" = xno],
+ [AC_ERROR("OpenAFS requires roken to build")],
+ [AS_IF([test x"$withval" != xyes],
+ [roken_root="$withval"])
+ ])
+ ])
+
+ AS_IF([test x"$roken_root" = xinteral],
+ [_OPENAFS_ROKEN_INTERNAL()],
+ [AS_IF([test x"$roken_root" = x],
+ [_OPENAFS_ROKEN_CHECK([], [], [_OPENAFS_ROKEN_INTERNAL()])],
+ [_OPENAFS_ROKEN_CHECK($roken_root,
+ [AC_MSG_ERROR([Cannot find roken at that location])])
+ ])
+ ])
+])
AFSD_LDFLAGS = @AFSD_LDFLAGS@
CC = @CC@
CPP = @CPP@
+CPPFLAGS_roken = @CPPFLAGS_roken@
CCOBJ = @CCOBJ@
CCXPG2 = @CCXPG2@
CFLAGS = @CFLAGS@
DARWIN_INFOFILE=@DARWIN_INFOFILE@
DBG = @DBG@
DEST = @DEST@
+DIR_roken = @DIR_roken@
FSINCLUDES = @FSINCLUDES@
INCLUDE_LIBINTL = @INCLUDE_libintl@
KERN_DBG = @KERN_DBG@
KERN_OPTMZ = @KERN_OPTMZ@
LD = @LD@
+LDFLAGS_roken = @LDFLAGS_roken@
LEX = @LEX@
LIB_AFSDB = @LIB_AFSDB@
LIB_crypt = @LIB_crypt@
LIB_hcrypto = @LIB_hcrypto@
+LIB_roken = @LIB_roken@
LIBS = @LIBS@
LIB_LIBINTL = @LIB_libintl@
LINUX_KERNEL_PATH = @LINUX_KERNEL_PATH@
COMMON_INCL=$(MODULE_INCLUDE) -I${TOP_OBJDIR}/src/config -I${TOP_INCDIR} \
-I${srcdir} -I.
-COMMON_CFLAGS=$(CFLAGS) ${DBG} ${OPTMZ} ${COMMON_INCL} ${INCLUDE_LIBINTL}
+COMMON_CFLAGS=$(CFLAGS) ${DBG} ${OPTMZ} ${COMMON_INCL} ${INCLUDE_LIBINTL} \
+ $(CPPFLAGS_libroken)
-COMMON_LDFLAGS=$(LDFLAGS) $(DBG) $(OPTMZ)
+COMMON_LDFLAGS=$(LDFLAGS) $(LDFLAGS_roken) $(DBG) $(OPTMZ)
# LWP Flags
LWP_CFLAGS=$(COMMON_CFLAGS) $(MODULE_CFLAGS) $(XCFLAGS) $(ARCHFLAGS)
UPSTREAM= ${TOP_SRCDIR}/external/heimdal
-MODULE_INCLUDE=-I${TOP_INCDIR}/hcrypto -I$(UPSTREAM)/hcrypto
+MODULE_INCLUDE=-I${srcdir} -I${TOP_INCDIR}/hcrypto -I$(UPSTREAM)/hcrypto
SHLIBOBJ= libafshcrypto.${SHLIB_SUFFIX}.${LIBMAJOR}.${LIBMINOR}
# out into a new libroken top level target, which allows the use of an
# existing libroken, if one is available.
-strlcpy.o: ${UPSTREAM}/roken/strlcpy.c
- $(AFS_CCRULE) $(UPSTREAM)/roken/strlcpy.c
+
+daemon.o: ${UPSTREAM}/roken/daemon.c
+ $(AFS_CCRULE) $(UPSTREAM)/roken/daemon.c
+
+ecalloc.o: ${UPSTREAM}/roken/ecalloc.c
+ $(AFS_CCRULE) $(UPSTREAM)/roken/ecalloc.c
+
+emalloc.o: ${UPSTREAM}/roken/emalloc.c
+ $(AFS_CCRULE) $(UPSTREAM)/roken/emalloc.c
+
+erealloc.o: ${UPSTREAM}/roken/erealloc.c
+ $(AFS_CCRULE) $(UPSTREAM)/roken/erealloc.c
err.h: ${UPSTREAM}/roken/err.hin
cp $? $@
errx.o: ${UPSTREAM}/roken/errx.c
$(AFS_CCRULE) $(UPSTREAM)/roken/errx.c
+getopt.o: ${UPSTREAM}/roken/getopt.c
+ $(AFS_CCRULE) $(UPSTREAM)/roken/getopt.c
+
getprogname.o: ${UPSTREAM}/roken/getprogname.c
$(AFS_CCRULE) $(UPSTREAM)/roken/getprogname.c
+socket.o: ${UPSTREAM}/roken/socket.c
+ $(AFS_CCRULE) $(UPSTREAM)/roken/socket.c
+
+strlcat.o: ${UPSTREAM}/roken/strlcat.c
+ $(AFS_CCRULE) $(UPSTREAM)/roken/strlcat.c
+
+strlcpy.o: ${UPSTREAM}/roken/strlcpy.c
+ $(AFS_CCRULE) $(UPSTREAM)/roken/strlcpy.c
+
+strnlen.o: ${UPSTREAM}/roken/strnlen.c
+ $(AFS_CCRULE) $(UPSTREAM)/roken/strnlen.c
+
verr.o: ${UPSTREAM}/roken/verr.c
$(AFS_CCRULE) $(UPSTREAM)/roken/verr.c
ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL getprogname(void);
#endif
+#ifndef _PATH_DEVNULL
+#define _PATH_DEVNULL "/dev/null"
+#endif
+
#endif /* OPENAFS_ROKEN_H */
--- /dev/null
+/librokenafs.exp
+/err.h
--- /dev/null
+# A roken library for AFS
+
+LIBMAJOR=1
+LIBMINOR=1
+
+srcdir=@srcdir@
+include @TOP_OBJDIR@/src/config/Makefile.config
+include @TOP_OBJDIR@/src/config/Makefile.shared
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+HEADERS = ${TOP_INCDIR}/roken.h \
+ ${TOP_INCDIR}/roken-common.h
+
+UPSTREAM = $(TOP_SRCDIR)/external/heimdal/roken
+
+SHLIBOBJ = librokenafs.${SHLIB_SUFFIX}.${LIBMAJOR}.${LIBMINOR}
+
+all: $(ROKEN_HEADERS) $(HEADERS) \
+ $(TOP_LIBDIR)/$(SHLIBOBJ) \
+ $(TOP_LIBDIR)/librokenafs.a
+
+install: librokenafs.a $(SHLIBOBJ)
+ $(TOP_OBJDIR)/src/config/shlib-install -d $(DESTDIR)$(libdir) \
+ -l librokenafs -M $(LIBMAJOR) -m $(LIBMINOR)
+ $(INSTALL_DATA) librokenafs.a $(DESTDIR)$(libdir)/librokenafs.a
+
+dest: librokenafs.a $(SHLIBOBJ)
+ $(TOP_OBJDIR)/src/config/shlib-install -d $(DEST)/lib \
+ -l librokenafs -M $(LIBMAJOR) -m $(LIBMINOR)
+ $(INSTALL_DATA) librokenafs.a $(DEST)/lib/librokenafs.a
+
+clean:
+ $(RM) -f $(OBJECTS) $(SHLIBOBJ) librokenafs.a librokenafs.exp
+
+OBJECTS = $(ROKEN_LIBOBJS) \
+ cloexec.o ct.o hex.o issuid.o net_read.o net_write.o socket.o \
+ warnerr.o
+
+$(TOP_LIBDIR)/$(SHLIBOBJ): $(SHLIBOBJ)
+ $(TOP_OBJDIR)/src/config/shlib-install -d $(TOP_LIBDIR) \
+ -l librokenafs -M $(LIBMAJOR) -m $(LIBMINOR)
+
+$(SHLIBOBJ): $(OBJECTS) librokenafs.map
+ $(TOP_OBJDIR)/src/config/shlib-build -i -d $(srcdir) -l librokenafs \
+ -M $(LIBMAJOR) -m $(LIBMINOR) -- \
+ $(OBJECTS) $(MT_LIBS)
+
+$(TOP_LIBDIR)/librokenafs.a: librokenafs.a
+ $(INSTALL_DATA) $? $@
+
+librokenafs.a: $(OBJECTS)
+ $(RM) -f $@
+ $(AR) crv $@ $(OBJECTS)
+ $(RANLIB) $@
+
+$(TOP_INCDIR)/err.h: ${UPSTREAM}/err.hin
+ cp $? $@
+
+$(TOP_INCDIR)/roken.h: $(UPSTREAM)/roken.h.in
+ $(INSTALL_DATA) $? $@
+
+$(TOP_INCDIR)/roken-common.h: $(UPSTREAM)/roken-common.h
+ $(INSTALL_DATA) $? $@
+
+err.h: ${UPSTREAM}/err.hin
+ cp $? $@
+
+cloexec.o: ${UPSTREAM}/cloexec.c
+ $(AFS_CCRULE) $(UPSTREAM)/cloexec.c
+
+ct.o: ${UPSTREAM}/ct.c
+ $(AFS_CCRULE) $(UPSTREAM)/ct.c
+
+daemon.o: ${UPSTREAM}/daemon.c
+ $(AFS_CCRULE) $(UPSTREAM)/daemon.c
+
+ecalloc.o: ${UPSTREAM}/ecalloc.c
+ $(AFS_CCRULE) $(UPSTREAM)/ecalloc.c
+
+emalloc.o: ${UPSTREAM}/emalloc.c
+ $(AFS_CCRULE) $(UPSTREAM)/emalloc.c
+
+erealloc.o: ${UPSTREAM}/erealloc.c
+ $(AFS_CCRULE) $(UPSTREAM)/erealloc.c
+
+err.o: ${UPSTREAM}/err.c err.h
+ $(AFS_CCRULE) $(UPSTREAM)/err.c
+
+errx.o: ${UPSTREAM}/errx.c err.h
+ $(AFS_CCRULE) $(UPSTREAM)/errx.c
+
+getopt.o: ${UPSTREAM}/getopt.c
+ $(AFS_CCRULE) $(UPSTREAM)/getopt.c
+
+getprogname.o: ${UPSTREAM}/getprogname.c
+ $(AFS_CCRULE) $(UPSTREAM)/getprogname.c
+
+hex.o: ${UPSTREAM}/hex.c
+ $(AFS_CCRULE) $(UPSTREAM)/hex.c
+
+issuid.o: ${UPSTREAM}/issuid.c
+ $(AFS_CCRULE) $(UPSTREAM)/issuid.c
+
+net_read.o: ${UPSTREAM}/net_read.c
+ $(AFS_CCRULE) $(UPSTREAM)/net_read.c
+
+net_write.o: ${UPSTREAM}/net_write.c
+ $(AFS_CCRULE) $(UPSTREAM)/net_write.c
+
+socket.o: ${UPSTREAM}/socket.c
+ $(AFS_CCRULE) $(UPSTREAM)/socket.c
+
+strlcat.o: ${UPSTREAM}/strlcat.c
+ $(AFS_CCRULE) $(UPSTREAM)/strlcat.c
+
+strlcpy.o: ${UPSTREAM}/strlcpy.c
+ $(AFS_CCRULE) $(UPSTREAM)/strlcpy.c
+
+strnlen.o: ${UPSTREAM}/strnlen.c
+ $(AFS_CCRULE) $(UPSTREAM)/strnlen.c
+
+verr.o: ${UPSTREAM}/verr.c err.h
+ $(AFS_CCRULE) $(UPSTREAM)/verr.c
+
+verrx.o: ${UPSTREAM}/verrx.c err.h
+ $(AFS_CCRULE) $(UPSTREAM)/verrx.c
+
+vwarn.o: ${UPSTREAM}/vwarn.c err.h
+ $(AFS_CCRULE) $(UPSTREAM)/vwarn.c
+
+vwarnx.o: ${UPSTREAM}/vwarnx.c err.h
+ $(AFS_CCRULE) $(UPSTREAM)/vwarnx.c
+
+warn.o: ${UPSTREAM}/warn.c err.h
+ $(AFS_CCRULE) $(UPSTREAM)/warn.c
+
+warnerr.o: ${UPSTREAM}/warnerr.c err.h
+ $(AFS_CCRULE) $(UPSTREAM)/warnerr.c
+
+warnx.o: ${UPSTREAM}/warnx.c err.h
+ $(AFS_CCRULE) $(UPSTREAM)/warnx.c
--- /dev/null
+/*
+ * Copyright (c) 2010 Your File System Inc. 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 `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 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 <afsconfig.h>
+#include <afs/param.h>
+
+#if defined(AFS_NT40_ENV)
+# define inline __inline
+#elif defined(AFS_HPUX_ENV) || defined(AFS_USR_HPUX_ENV)
+# define inline
+#elif defined(AFS_AIX_ENV) || defined(AFS_USR_AIX_ENV)
+# define inline
+#elif defined(AFS_SGI_ENV) || defined(AFS_USR_SGI_ENV)
+# define inline
+#elif defined(AFS_NBSD_ENV)
+# define inline __inline __attribute__((always_inline))
+#endif
--- /dev/null
+{
+ global:
+ ct_memcmp;
+ daemon;
+ err;
+ errx;
+ getopt;
+ getprogname;
+ issuid;
+ net_read;
+ net_write;
+ rk_cloexec;
+ rk_cloexec_file;
+ rk_ecalloc;
+ rk_emalloc;
+ rk_erealloc;
+ rk_hex_encode;
+ rk_print_version;
+ rk_socket;
+ rk_strcasecmp;
+ rk_strlcat;
+ rk_strnlen;
+ rk_strlcpy;
+ strcasecmp;
+ verr;
+ verrx;
+ vwarn;
+ vwarnx;
+ warn;
+ warnx;
+ local:
+ *;
+};