You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2013/04/15 22:46:42 UTC

[35/50] git commit: Drop in libloader code.

Drop in libloader code.

Necessary build and docs to follow.


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/b18645b3
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/b18645b3
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/b18645b3

Branch: refs/heads/3.3.x
Commit: b18645b324db59753844c502c6440e14d8aa0b3e
Parents: bb75f4a
Author: niq <ni...@apache.org>
Authored: Sat Apr 6 00:32:59 2013 +0100
Committer: Leif Hedstrom <zw...@apache.org>
Committed: Mon Apr 15 14:45:44 2013 -0600

----------------------------------------------------------------------
 plugins/libloader/libloader.c |   85 ++++++++++++++++++++++++++++++++++++
 1 files changed, 85 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b18645b3/plugins/libloader/libloader.c
----------------------------------------------------------------------
diff --git a/plugins/libloader/libloader.c b/plugins/libloader/libloader.c
new file mode 100644
index 0000000..ef84c2f
--- /dev/null
+++ b/plugins/libloader/libloader.c
@@ -0,0 +1,85 @@
+/*****************************************************************************
+ * Copyright (C) 2011-13 Qualys, Inc
+ * Copyright (C) 2013 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * QUALYS licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ****************************************************************************/
+
+/* libloader: load libraries, making all symbols exported
+ * universally visible.  Equivalent to LoadFile in HTTPD.
+ *
+ * Written for ironbee plugin, whose module architecture
+ * is not compatible with trafficserver's plugins.
+ * May be useful for other plugins with non-trivial
+ * library dependencies.
+ */
+
+#include <dlfcn.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ts/ts.h>
+
+typedef struct {
+    void *handle;
+    void *next;
+} link_handle;
+
+static link_handle *libs = NULL;
+
+static void unloadlibs(void)
+{
+    link_handle *p = libs;
+    while (p != NULL) {
+        link_handle *next = p->next;
+        dlclose(p->handle);
+        TSfree(p);
+        p = next;
+    }
+    libs = NULL;
+}
+
+void TSPluginInit(int argc, const char *argv[])
+{
+    int i;
+    TSPluginRegistrationInfo info;
+
+    info.plugin_name = (char *)"libloader";
+    info.vendor_name = (char *)"Apache Software Foundation";
+    info.support_email = (char *)"users@trafficserver.apache.org";
+
+    if (TSPluginRegister(TS_SDK_VERSION_3_0, &info) != TS_SUCCESS) {
+        TSError("[libloader] Plugin registration failed.\n");
+        return;
+    }
+
+    atexit(unloadlibs);
+
+    for (i = 1; i < argc; ++i) {
+        const char *lib = argv[i];
+        void *handle = dlopen(lib, RTLD_GLOBAL|RTLD_NOW);
+        if (handle) {
+            link_handle *l = TSmalloc(sizeof(link_handle));
+            l->handle = handle;
+            l->next = libs;
+            libs = l;
+            TSDebug("libloader", " loaded %s\n", lib);
+        }
+        else {
+            TSError("[libloader] failed to load %s: %s\n", lib, dlerror());
+        }
+    }
+    return;
+}