diff options
author | brian <brian@FreeBSD.org> | 1997-05-26 00:44:10 +0000 |
---|---|---|
committer | brian <brian@FreeBSD.org> | 1997-05-26 00:44:10 +0000 |
commit | 12b254e3164dbf2f773ea486a20102fd4183173c (patch) | |
tree | f69d2306d93e872c8408a5c5f9931535f7ecf7b1 /usr.sbin/ppp/loadalias.c | |
parent | 8089164d6fdd97167753a3a56afb162c5a6f699c (diff) | |
download | FreeBSD-src-12b254e3164dbf2f773ea486a20102fd4183173c.zip FreeBSD-src-12b254e3164dbf2f773ea486a20102fd4183173c.tar.gz |
De-couple ppp from libalias. If libalias isn't there, the
alias commands simply won't work. Only root may specify the
location of the alias lib (otherwise, it's hard-coded).
Make logprintf silently fail if LogOpen hasn't been called.
Suggested by: eivind
Diffstat (limited to 'usr.sbin/ppp/loadalias.c')
-rw-r--r-- | usr.sbin/ppp/loadalias.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/usr.sbin/ppp/loadalias.c b/usr.sbin/ppp/loadalias.c new file mode 100644 index 0000000..5e26bd4 --- /dev/null +++ b/usr.sbin/ppp/loadalias.c @@ -0,0 +1,88 @@ +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/param.h> +#include <netinet/in.h> +#include <stdlib.h> +#include <unistd.h> +#include <stdio.h> +#include <dlfcn.h> +#include "systems.h" +#include "mbuf.h" +#include "log.h" +#include "loadalias.h" +#include "vars.h" + +#define _PATH_ALIAS "/usr/lib/libalias.so.2.1" + +#define off(item) ((int)&(((struct aliasHandlers *)0)->item)) +#define entry(a) { off(a), "_" #a } + +static struct { + int offset; + char *name; +} map[] = { + entry(GetNextFragmentPtr), + entry(GetNextFragmentPtr), + entry(InitPacketAlias), + entry(PacketAliasIn), + entry(PacketAliasOut), + entry(PacketAliasRedirectAddr), + entry(PacketAliasRedirectPort), + entry(SaveFragmentPtr), + entry(SetPacketAliasAddress), + entry(SetPacketAliasMode), + entry(FragmentAliasIn), + { 0, 0 } +}; + +static void *dl; + +int loadAliasHandlers(struct aliasHandlers *h) +{ + char *path; + char *env; + char *err; + int i; + + path = _PATH_ALIAS; + env = getenv("_PATH_ALIAS"); + if (env) + if (OrigUid() == 0) + path = env; + else { + logprintf("Ignoring environment _PATH_ALIAS value (%s)\n", env); + printf("Ignoring environment _PATH_ALIAS value (%s)\n", env); + } + + dl = dlopen(path, RTLD_LAZY); + if (dl == (void *)0) { + err = dlerror(); + logprintf("_PATH_ALIAS (%s): Invalid lib: %s\n", path, err); + printf("_PATH_ALIAS (%s): Invalid lib: %s\n", path, err); + 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) { + err = dlerror(); + logprintf("_PATH_ALIAS (%s): %s: %s\n", path, map[i].name, err); + printf("_PATH_ALIAS (%s): %s: %s\n", path, map[i].name, err); + (void)dlclose(dl); + dl = (void *)0; + return -1; + } + } + + VarInitPacketAlias(); + + return 0; +} + +void unloadAliasHandlers() +{ + if (dl) { + dlclose(dl); + dl = (void *)0; + } +} |