diff options
author | brian <brian@cvs.openbsd.org> | 1997-11-23 20:27:41 +0000 |
---|---|---|
committer | brian <brian@cvs.openbsd.org> | 1997-11-23 20:27:41 +0000 |
commit | 2cb79b0580b6b5629530c4d142a73a9a654f282f (patch) | |
tree | 8b062ff5e99e22ec2c95145149e22b58b7fc0e22 /usr.sbin/ppp/loadalias.c | |
parent | 518c0071f44dfb9716d70e0d8781585db7a3bd7d (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.c | 92 |
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; + } +} |