summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2011-09-02 17:07:45 +0000
committerGreg Hudson <ghudson@mit.edu>2011-09-02 17:07:45 +0000
commit6ef4ba5b6ac16653034583cabfeb6297b30025a7 (patch)
tree19cd275f4852c38798031c7beca42c869ee3c156
parenta10ffe0492a13ae01530459981ee0bb885a8f0c7 (diff)
downloadkrb5-6ef4ba5b6ac16653034583cabfeb6297b30025a7.tar.gz
krb5-6ef4ba5b6ac16653034583cabfeb6297b30025a7.tar.xz
krb5-6ef4ba5b6ac16653034583cabfeb6297b30025a7.zip
Create k5ev verto module from libev sources
Add configure and build support for libverto and the libverto-k5ev module. Fix the version script rules to work for libraries with hyphens in their names. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@25127 dc483132-0cff-0310-8789-dd5450dbe970
-rw-r--r--src/config/lib.in8
-rw-r--r--src/config/pre.in6
-rw-r--r--src/configure.in28
-rw-r--r--src/util/Makefile.in4
-rw-r--r--src/util/k5ev/Makefile.in42
-rw-r--r--src/util/k5ev/README29
-rw-r--r--src/util/k5ev/deps7
-rw-r--r--src/util/k5ev/k5ev.c36
-rw-r--r--src/util/k5ev/libverto-k5ev.exports1
-rw-r--r--src/util/k5ev/verto-k5ev.c163
-rw-r--r--src/util/verto/Makefile.in45
-rw-r--r--src/util/verto/deps5
-rw-r--r--src/util/verto/libverto.exports26
13 files changed, 396 insertions, 4 deletions
diff --git a/src/config/lib.in b/src/config/lib.in
index 66422e01f..46727fe0a 100644
--- a/src/config/lib.in
+++ b/src/config/lib.in
@@ -54,7 +54,8 @@ lib$(LIBBASE)$(SHLIBEXT): lib$(LIBBASE)$(SHLIBVEXT)
$(LN_S) lib$(LIBBASE)$(SHLIBVEXT) $@
binutils.versions: $(SHLIB_EXPORT_FILE) Makefile
- echo > binutils.versions "$(LIBBASE)_$(LIBMAJOR)_MIT {"
+ base=`echo "$(LIBBASE)" | sed -e 's/-/_/'`; \
+ echo > binutils.versions "$${base}_$(LIBMAJOR)_MIT {"
sed >> binutils.versions < $(SHLIB_EXPORT_FILE) "s/$$/;/"
echo >> binutils.versions "};"
echo >> binutils.versions "HIDDEN { local: __*; _rest*; _save*; *; };"
@@ -89,8 +90,9 @@ hpux10.exports: $(SHLIB_EXPORT_FILE) Makefile
else :; fi; \
done; echo "$$a" >> hpux10.tmp
echo "+e errno" >> hpux10.tmp
- echo "+e _GLOBAL__FD_lib$(LIBBASE)_$(LIBMAJOR)_$(LIBMINOR)" >> hpux10.tmp
- echo "+e _GLOBAL__FI_lib$(LIBBASE)_$(LIBMAJOR)_$(LIBMINOR)" >> hpux10.tmp
+ base=`echo "$(LIBBASE)" | sed -e 's/-/_/'`; \
+ echo "+e _GLOBAL__FD_lib$${base}_$(LIBMAJOR)_$(LIBMINOR)" >> hpux10.tmp; \
+ echo "+e _GLOBAL__FI_lib$${base}_$(LIBMAJOR)_$(LIBMINOR)" >> hpux10.tmp
mv -f hpux10.tmp hpux10.exports
lib$(LIBBASE)$(PFLIBEXT): $(PFOBJLISTS)
diff --git a/src/config/pre.in b/src/config/pre.in
index 67117d6b4..1ec893725 100644
--- a/src/config/pre.in
+++ b/src/config/pre.in
@@ -378,6 +378,12 @@ SS_LIB-sys = @SS_LIB@
SS_LIB-k5 = $(TOPLIBD)/libss.a $(RL_LIBS)
KDB5_LIB = -lkdb5 $(KDB5_PLUGIN_LIBS)
+VERTO_DEPLIB = $(VERTO_DEPLIB-@VERTO_VERSION@)
+VERTO_DEPLIB-sys = # empty
+VERTO_DEPLIB-k5 = $(TOPLIBD)/libverto$(DEPLIBEXT)
+VERTO_CFLAGS = @VERTO_CFLAGS@
+VERTO_LIBS = @VERTO_LIBS@
+
DL_LIB = @DL_LIB@
LDAP_LIBS = @LDAP_LIBS@
diff --git a/src/configure.in b/src/configure.in
index 4e61e8f59..5d3f5264d 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -1142,10 +1142,38 @@ fi
AC_SUBST([RL_CFLAGS])
AC_SUBST([RL_LIBS])
+AC_ARG_WITH([system-verto],
+ [AC_HELP_STRING([--with-system-verto], [always use system verto library])],
+ [], [with_system_verto=default])
+VERTO_CFLAGS=
+VERTO_LIBS=-lverto
+VERTO_VERSION=k5
+if test "x$with_system_verto" != xno; then
+ if verto_cflags=`pkg-config --cflags libverto 2>&1`; then
+ VERTO_CFLAGS=$verto_cflags
+ VERTO_LIBS=`pkg-config --libs libverto`
+ VERTO_VERSION=sys
+ else
+ AC_CHECK_LIB([verto], [verto_run], [VERTO_VERSION=sys],
+ [if test "x$with_system_verto" = xyes; then
+ AC_MSG_ERROR([cannot detect system libverto])
+ fi])
+ fi
+fi
+if test "x$VERTO_VERSION" = xsys; then
+ AC_MSG_NOTICE([Using system libverto])
+else
+ AC_MSG_RESULT([Using built-in libverto])
+fi
+AC_SUBST([VERTO_CFLAGS])
+AC_SUBST([VERTO_LIBS])
+AC_SUBST([VERTO_VERSION])
+
AC_CONFIG_FILES(krb5-config, [chmod +x krb5-config])
V5_AC_OUTPUT_MAKEFILE(.
util util/support util/profile util/profile/testmod util/send-pr
+ util/verto util/k5ev
lib lib/kdb
diff --git a/src/util/Makefile.in b/src/util/Makefile.in
index b6e7af6e2..6c7f8a7ff 100644
--- a/src/util/Makefile.in
+++ b/src/util/Makefile.in
@@ -4,7 +4,7 @@ mydir=util
# configure scripts, so hide this.
##WIN32##!if 0
SUBDIRS=support $(MAYBE_ET_@COM_ERR_VERSION@) $(MAYBE_SS_@SS_VERSION@) \
- profile send-pr gss-kernel-lib
+ profile send-pr gss-kernel-lib $(MAYBE_VERTO_@VERTO_VERSION@)
##WIN32##!endif
WINSUBDIRS=windows support et profile
BUILDTOP=$(REL)..
@@ -14,6 +14,8 @@ MAYBE_SS_k5 = ss
MAYBE_ET_sys =
MAYBE_ET_intlsys =
MAYBE_SS_sys =
+MAYBE_VERTO_sys =
+MAYBE_VERTO_k5 = verto k5ev
all-recurse:
diff --git a/src/util/k5ev/Makefile.in b/src/util/k5ev/Makefile.in
new file mode 100644
index 000000000..857a85b08
--- /dev/null
+++ b/src/util/k5ev/Makefile.in
@@ -0,0 +1,42 @@
+mydir=util$(S)k5ev
+BUILDTOP=$(REL)..$(S)..
+RELDIR=../util/k5ev
+DEFS=
+
+SED = sed
+
+LIBBASE=verto-k5ev
+LIBMAJOR=0
+LIBMINOR=0
+
+LOCALINCLUDES=-I. -I$(srcdir)/../verto
+
+# Turn off extra warnings since we're not going to clean up libev's code.
+WARN_CFLAGS=
+
+STLIBOBJS=verto-k5ev.o
+LIBOBJS=$(OUTPRE)verto-k5ev.$(OBJEXT)
+SRCS=verto-k5ev.c
+
+STOBJLISTS=OBJS.ST
+SHLIB_EXPLIBS= $(LIBS) -lverto -lm # libm needed for ceil() currently.
+SHLIB_DIRS=-L$(TOPLIBD)
+SHLIB_RDIRS=$(KRB5_LIBDIR)
+
+all-unix:: all-liblinks
+
+install-unix:: install-libs
+
+clean-unix:: clean-liblinks clean-libs clean-libobjs
+
+rename.h: $(srcdir)/Symbols.ev
+ $(RM) $@
+ $(SED) -e 's/.*/#define & k5&/' < $(srcdir)/Symbols.ev > $@
+
+clean::
+ $(RM) rename.h
+
+depend:: rename.h
+
+@lib_frag@
+@libobj_frag@
diff --git a/src/util/k5ev/README b/src/util/k5ev/README
new file mode 100644
index 000000000..1165f37f7
--- /dev/null
+++ b/src/util/k5ev/README
@@ -0,0 +1,29 @@
+This directory builds a private libverto module using an embedded
+libev with renamed symbols (so we don't leak libev symbols into the
+namespace on platforms where we can't control the export list). The
+module is not intended to be used directly by applications, so it has
+no header file.
+
+libev has built-in support for this kind of embedding, so we don't
+have to modify the libev sources. Following libev's documentation,
+the following files have been copied from the ev sources:
+
+ ev.h
+ ev_vars.h
+ ev_wrap.h
+ ev.c
+ ev_select.c
+ ev_poll.c
+ ev_win32.c
+ Symbols.ev
+
+(Symbols.ev wasn't included in the 4.04 tar file due to an oversight,
+so it is taken from the appropriate tag in libev's source repository.)
+
+To rename the exported symbols, we create rename.h from Symbols.ev.
+We also use Symbols.ev to construct the library export list.
+(Renaming libev's symbols would be unnecessary if libev's embedding
+had support for making its API symbols static, but it currently does
+not.) The source file verto-k5ev.c wraps ev.c with appropriate
+embedding defines, and then defines the libverto module functions
+using the slightly modified contents of libverto's verto-ev.c.
diff --git a/src/util/k5ev/deps b/src/util/k5ev/deps
new file mode 100644
index 000000000..2921c31e2
--- /dev/null
+++ b/src/util/k5ev/deps
@@ -0,0 +1,7 @@
+#
+# Generated makefile dependencies follow.
+#
+verto-k5ev.so verto-k5ev.po $(OUTPRE)verto-k5ev.$(OBJEXT): \
+ $(BUILDTOP)/include/autoconf.h $(BUILDTOP)/include/verto.h \
+ $(srcdir)/../verto/verto-module.h ev.c ev.h ev_poll.c \
+ ev_vars.h ev_wrap.h rename.h verto-k5ev.c
diff --git a/src/util/k5ev/k5ev.c b/src/util/k5ev/k5ev.c
new file mode 100644
index 000000000..42e4df877
--- /dev/null
+++ b/src/util/k5ev/k5ev.c
@@ -0,0 +1,36 @@
+/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/* util/k5ev/k5ev.c - Wrapper to create libk5ev from libev sources */
+/*
+ * Copyright (C) 2011 by the Massachusetts Institute of Technology.
+ * All rights reserved.
+ *
+ * Export of this software from the United States of America may
+ * require a specific license from the United States Government.
+ * It is the responsibility of any person or organization contemplating
+ * export to obtain such a license before exporting.
+ *
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
+ * distribute this software and its documentation for any purpose and
+ * without fee is hereby granted, provided that the above copyright
+ * notice appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation, and that
+ * the name of M.I.T. not be used in advertising or publicity pertaining
+ * to distribution of the software without specific, written prior
+ * permission. Furthermore if you modify this software you must label
+ * your software as modified software and not distribute it in such a
+ * fashion that it might be confused with the original M.I.T. software.
+ * M.I.T. makes no representations about the suitability of
+ * this software for any purpose. It is provided "as is" without express
+ * or implied warranty.
+ */
+
+#include "rename.h"
+#include "autoconf.h"
+#define EV_STANDALONE 1
+#define EV_FEATURES 0x5f /* Everything but back ends */
+#ifdef HAVE_POLL_H
+#define EV_USE_POLL 1
+#else
+#define EV_USE_SELECT 1
+#endif
+#include "ev.c"
diff --git a/src/util/k5ev/libverto-k5ev.exports b/src/util/k5ev/libverto-k5ev.exports
new file mode 100644
index 000000000..ee1b8d00e
--- /dev/null
+++ b/src/util/k5ev/libverto-k5ev.exports
@@ -0,0 +1 @@
+verto_module_table
diff --git a/src/util/k5ev/verto-k5ev.c b/src/util/k5ev/verto-k5ev.c
new file mode 100644
index 000000000..947085b85
--- /dev/null
+++ b/src/util/k5ev/verto-k5ev.c
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2011 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* An edited version of verto's verto-libev.c, using an embedded libev with
+ * renamed symbols. */
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include <verto.h>
+#include <verto-module.h>
+#include "rename.h"
+#include "autoconf.h"
+#define EV_STANDALONE 1
+#define EV_FEATURES 0x5f /* Everything but back ends */
+#ifdef HAVE_POLL_H
+#define EV_USE_POLL 1
+#else
+#define EV_USE_SELECT 1
+#endif
+#include "ev.c"
+
+static void
+libev_ctx_free(void *ctx)
+{
+ if (ctx != EV_DEFAULT)
+ ev_loop_destroy(ctx);
+}
+
+static void
+libev_ctx_run(void *ctx)
+{
+ ev_run(ctx, 0);
+}
+
+static void
+libev_ctx_run_once(void *ctx)
+{
+ ev_run(ctx, EVRUN_ONCE);
+}
+
+static void
+libev_ctx_break(void *ctx)
+{
+ ev_break(ctx, EVBREAK_ONE);
+}
+
+static void
+libev_callback(EV_P_ ev_watcher *w, int revents)
+{
+ if (verto_get_type(w->data) == VERTO_EV_TYPE_CHILD)
+ verto_set_proc_status(w->data, ((ev_child*) w)->rstatus);
+
+ verto_fire(w->data);
+}
+
+#define setuptype(type, priv, ...) \
+ type ## w = malloc(sizeof(ev_ ## type)); \
+ if (!type ## w) \
+ return NULL; \
+ ev_ ## type ## _init(type ## w, (EV_CB(type, (*))) __VA_ARGS__); \
+ type ## w->data = (void *) priv; \
+ ev_ ## type ## _start(ctx, type ## w); \
+ return type ## w
+
+static void *
+libev_ctx_add(void *ctx, const verto_ev *ev, verto_ev_flag *flags)
+{
+ ev_io *iow = NULL;
+ ev_timer *timerw = NULL;
+ ev_idle *idlew = NULL;
+ ev_signal *signalw = NULL;
+ ev_child *childw = NULL;
+ ev_tstamp interval;
+ int events = EV_NONE;
+
+ *flags |= VERTO_EV_FLAG_PERSIST;
+ switch (verto_get_type(ev)) {
+ case VERTO_EV_TYPE_IO:
+ if (verto_get_flags(ev) & VERTO_EV_FLAG_IO_READ)
+ events |= EV_READ;
+ if (verto_get_flags(ev) & VERTO_EV_FLAG_IO_WRITE)
+ events |= EV_WRITE;
+ setuptype(io, ev, libev_callback, verto_get_fd(ev), events);
+ case VERTO_EV_TYPE_TIMEOUT:
+ interval = ((ev_tstamp) verto_get_interval(ev)) / 1000.0;
+ setuptype(timer, ev, libev_callback, interval, interval);
+ case VERTO_EV_TYPE_IDLE:
+ setuptype(idle, ev, libev_callback);
+ case VERTO_EV_TYPE_SIGNAL:
+ setuptype(signal, ev, libev_callback, verto_get_signal(ev));
+ case VERTO_EV_TYPE_CHILD:
+ *flags &= ~VERTO_EV_FLAG_PERSIST; /* Child events don't persist */
+ setuptype(child, ev, libev_callback, verto_get_proc(ev), 0);
+ default:
+ return NULL; /* Not supported */
+ }
+}
+
+static void
+libev_ctx_del(void *ctx, const verto_ev *ev, void *evpriv)
+{
+ switch (verto_get_type(ev)) {
+ case VERTO_EV_TYPE_IO:
+ ev_io_stop(ctx, evpriv);
+ case VERTO_EV_TYPE_TIMEOUT:
+ ev_timer_stop(ctx, evpriv);
+ case VERTO_EV_TYPE_IDLE:
+ ev_idle_stop(ctx, evpriv);
+ case VERTO_EV_TYPE_SIGNAL:
+ ev_signal_stop(ctx, evpriv);
+ case VERTO_EV_TYPE_CHILD:
+ ev_child_stop(ctx, evpriv);
+ default:
+ break;
+ }
+
+ free(evpriv);
+}
+
+static verto_ctx *verto_new_libev(void);
+static verto_ctx *verto_default_libev(void);
+
+VERTO_MODULE(libev, ev_loop_new,
+ VERTO_EV_TYPE_IO |
+ VERTO_EV_TYPE_TIMEOUT |
+ VERTO_EV_TYPE_IDLE |
+ VERTO_EV_TYPE_SIGNAL |
+ VERTO_EV_TYPE_CHILD);
+
+static verto_ctx *
+verto_new_libev()
+{
+ return verto_convert(libev, ev_loop_new(EVFLAG_AUTO));
+}
+
+static verto_ctx *
+verto_default_libev()
+{
+ return verto_convert(libev, ev_default_loop(EVFLAG_AUTO));
+}
diff --git a/src/util/verto/Makefile.in b/src/util/verto/Makefile.in
new file mode 100644
index 000000000..3e07227e2
--- /dev/null
+++ b/src/util/verto/Makefile.in
@@ -0,0 +1,45 @@
+mydir=util$(S)verto
+BUILDTOP=$(REL)..$(S)..
+RELDIR=../util/verto
+
+LIBBASE=verto
+LIBMAJOR=0
+LIBMINOR=0
+
+LOCALINCLUDES=-I$(srcdir)
+DEFINES=-DDEFAULT_LIBRARY=\"k5ev\"
+
+# Turn off extra warnings since we're not going to clean up libverto's code.
+WARN_CFLAGS=
+
+STLIBOBJS=verto.o
+LIBOBJS=$(OUTPRE)verto.$(OBJEXT)
+SRCS=verto.c
+
+STOBJLISTS=OBJS.ST
+SHLIB_EXPLIBS= $(DL_LIB)
+SHLIB_DIRS=
+SHLIB_RDIRS=$(KRB5_LIBDIR)
+
+VERTO_HDR=$(BUILDTOP)$(S)include$(S)verto.h
+
+all-unix:: all-liblinks includes
+
+install-unix:: install-libs
+
+clean-unix:: clean-liblinks clean-libs clean-libobjs
+ $(RM) $(VERTO_HDR)
+
+includes:: $(VERTO_HDR)
+
+$(VERTO_HDR): $(srcdir)/verto.h
+ $(RM) $@
+ $(CP) $(srcdir)/verto.h $@
+
+install::
+ $(INSTALL_DATA) $(srcdir)/verto.h $(DESTDIR)$(KRB5_INCDIR)/verto.h
+ $(INSTALL_DATA) $(srcdir)/verto-module.h \
+ $(DESTDIR)$(KRB5_INCDIR)/verto-module.h
+
+@lib_frag@
+@libobj_frag@
diff --git a/src/util/verto/deps b/src/util/verto/deps
new file mode 100644
index 000000000..b64cc8235
--- /dev/null
+++ b/src/util/verto/deps
@@ -0,0 +1,5 @@
+#
+# Generated makefile dependencies follow.
+#
+verto.so verto.po $(OUTPRE)verto.$(OBJEXT): $(BUILDTOP)/include/verto.h \
+ verto-module.h verto.c
diff --git a/src/util/verto/libverto.exports b/src/util/verto/libverto.exports
new file mode 100644
index 000000000..dcf395696
--- /dev/null
+++ b/src/util/verto/libverto.exports
@@ -0,0 +1,26 @@
+verto_add_child
+verto_add_idle
+verto_add_io
+verto_add_signal
+verto_add_timeout
+verto_break
+verto_convert_funcs
+verto_default
+verto_del
+verto_fire
+verto_free
+verto_get_fd
+verto_get_flags
+verto_get_interval
+verto_get_private
+verto_get_proc
+verto_get_proc_status
+verto_get_signal
+verto_get_supported_types
+verto_get_type
+verto_new
+verto_run
+verto_run_once
+verto_set_default
+verto_set_private
+verto_set_proc_status