summaryrefslogtreecommitdiffstats
path: root/usr.sbin/ppp/loadalias.c
diff options
context:
space:
mode:
authorbrian <brian@FreeBSD.org>1997-05-26 00:44:10 +0000
committerbrian <brian@FreeBSD.org>1997-05-26 00:44:10 +0000
commit12b254e3164dbf2f773ea486a20102fd4183173c (patch)
treef69d2306d93e872c8408a5c5f9931535f7ecf7b1 /usr.sbin/ppp/loadalias.c
parent8089164d6fdd97167753a3a56afb162c5a6f699c (diff)
downloadFreeBSD-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.c88
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;
+ }
+}
OpenPOWER on IntegriCloud