summaryrefslogtreecommitdiff
path: root/usr.sbin/ppp/loadalias.c
diff options
context:
space:
mode:
authorbrian <brian@cvs.openbsd.org>1997-11-23 20:27:41 +0000
committerbrian <brian@cvs.openbsd.org>1997-11-23 20:27:41 +0000
commit2cb79b0580b6b5629530c4d142a73a9a654f282f (patch)
tree8b062ff5e99e22ec2c95145149e22b58b7fc0e22 /usr.sbin/ppp/loadalias.c
parent518c0071f44dfb9716d70e0d8781585db7a3bd7d (diff)
Import version 1.5 of ppp.
<sales> This is a user-level ppp implementation that uses the tun driver. It was originally created by a Japanese ISP. It's now piled with features. Check the man pages for details. </sales> The sources are identical to the ones in FreeBSD, except for the Makefile. IP aliasing (NAT) is disabled, and can be enabled by simply doing a ``make install'' of libalias, then rebuilding ppp. I'll create libalias as a port soon.
Diffstat (limited to 'usr.sbin/ppp/loadalias.c')
-rw-r--r--usr.sbin/ppp/loadalias.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/usr.sbin/ppp/loadalias.c b/usr.sbin/ppp/loadalias.c
new file mode 100644
index 00000000000..3e4cf3bc4ed
--- /dev/null
+++ b/usr.sbin/ppp/loadalias.c
@@ -0,0 +1,92 @@
+/*
+ * $Id: loadalias.c,v 1.1 1997/11/23 20:27:34 brian Exp $
+ */
+
+#include <sys/param.h>
+#include <netinet/in.h>
+
+#include <alias.h>
+#include <dlfcn.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <unistd.h>
+
+#include "command.h"
+#include "mbuf.h"
+#include "log.h"
+#include "systems.h"
+#include "id.h"
+#include "loadalias.h"
+#include "defs.h"
+#include "vars.h"
+
+#define _PATH_ALIAS "/usr/lib/libalias.so." ## __libalias_version
+
+#define off(item) ((int)&(((struct aliasHandlers *)0)->item))
+#define entry(a) { off(a), "_" #a }
+
+static struct {
+ int offset;
+ const char *name;
+} map[] = {
+ entry(PacketAliasGetFragment),
+ entry(PacketAliasInit),
+ entry(PacketAliasIn),
+ entry(PacketAliasOut),
+ entry(PacketAliasRedirectAddr),
+ entry(PacketAliasRedirectPort),
+ entry(PacketAliasSaveFragment),
+ entry(PacketAliasSetAddress),
+ entry(PacketAliasSetMode),
+ entry(PacketAliasFragmentIn),
+ { 0, 0 }
+};
+
+static void *dl;
+
+int
+loadAliasHandlers(struct aliasHandlers * h)
+{
+ const char *path;
+ const char *env;
+ int i;
+
+ path = _PATH_ALIAS;
+ env = getenv("_PATH_ALIAS");
+ if (env)
+ if (ID0realuid() == 0)
+ path = env;
+ else
+ LogPrintf(LogALERT, "Ignoring environment _PATH_ALIAS value (%s)\n", env);
+
+ dl = dlopen(path, RTLD_LAZY);
+ if (dl == (void *) 0) {
+ LogPrintf(LogWARN, "_PATH_ALIAS (%s): Invalid lib: %s\n",
+ path, dlerror());
+ return -1;
+ }
+ for (i = 0; map[i].name; i++) {
+ *(void **) ((char *) h + map[i].offset) = dlsym(dl, map[i].name);
+ if (*(void **) ((char *) h + map[i].offset) == (void *) 0) {
+ LogPrintf(LogWARN, "_PATH_ALIAS (%s): %s: %s\n", path,
+ map[i].name, dlerror());
+ (void) dlclose(dl);
+ dl = (void *) 0;
+ return -1;
+ }
+ }
+
+ VarPacketAliasInit();
+
+ return 0;
+}
+
+void
+unloadAliasHandlers()
+{
+ if (dl) {
+ dlclose(dl);
+ dl = (void *) 0;
+ }
+}