Version 0.1.7 from FTP
authorMark Spencer <markster@digium.com>
Wed, 7 Mar 2001 00:52:22 +0000 (00:52 +0000)
committerMark Spencer <markster@digium.com>
Wed, 7 Mar 2001 00:52:22 +0000 (00:52 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@235 65c4cc65-6c06-0410-ace0-fbb531ad65f3

15 files changed:
apps/app_directory.c
apps/app_echo.c
apps/app_playback.c
apps/app_skel.c
apps/app_system.c
channels/chan_modem_aopen.c
channels/chan_modem_i4l.c
codecs/codec_mp3_d.c
formats/format_g723.c
formats/format_mp3.c
formats/format_wav.c
formats/format_wav_gsm.c
include/asterisk/module.h
loader.c
pbx/pbx_gtkconsole.c

index be76d4b..e22a2cc 100755 (executable)
@@ -262,3 +262,8 @@ int usecount(void)
        STANDARD_USECOUNT(res);
        return res;
 }
+
+char *key()
+{
+       return ASTERISK_GPL_KEY;
+}
index 370dc68..7d0647d 100755 (executable)
@@ -78,3 +78,8 @@ int usecount(void)
        STANDARD_USECOUNT(res);
        return res;
 }
+
+char *key()
+{
+       return ASTERISK_GPL_KEY;
+}
index d7e023d..945686b 100755 (executable)
@@ -75,3 +75,8 @@ int usecount(void)
        STANDARD_USECOUNT(res);
        return res;
 }
+
+char *key()
+{
+       return ASTERISK_GPL_KEY;
+}
index 419b8f4..8ca4113 100755 (executable)
@@ -68,3 +68,8 @@ int usecount(void)
        STANDARD_USECOUNT(res);
        return res;
 }
+
+char *key()
+{
+       return ASTERISK_GPL_KEY;
+}
index 7e140a4..9915cbd 100755 (executable)
@@ -80,3 +80,8 @@ int usecount(void)
        STANDARD_USECOUNT(res);
        return res;
 }
+
+char *key()
+{
+       return ASTERISK_GPL_KEY;
+}
index f344cb1..37c5a8b 100755 (executable)
@@ -478,3 +478,7 @@ char *description()
        return desc;
 }
 
+char *key()
+{
+       return ASTERISK_GPL_KEY;
+}
index 3a8dbd8..f1e521a 100755 (executable)
@@ -358,6 +358,8 @@ static struct ast_frame *i4l_read(struct ast_modem_pvt *p)
                        if (f)
                                break;
                }
+               if (f)
+                       return f;
                /* If we get here, we have a complete voice frame */
                p->fr.frametype = AST_FRAME_VOICE;
                p->fr.subclass = AST_FORMAT_SLINEAR;
@@ -570,3 +572,7 @@ char *description()
        return desc;
 }
 
+char *key()
+{
+       return ASTERISK_GPL_KEY;
+}
index 95e1fb5..aad6d75 100755 (executable)
@@ -321,3 +321,8 @@ int usecount(void)
        STANDARD_USECOUNT(res);
        return res;
 }
+
+char *key()
+{
+       return ASTERISK_GPL_KEY;
+}
index 8314437..c437add 100755 (executable)
@@ -350,3 +350,8 @@ char *description()
        return desc;
 }
 
+
+char *key()
+{
+       return ASTERISK_GPL_KEY;
+}
index 85abdbc..a3e25d4 100755 (executable)
@@ -293,3 +293,8 @@ char *description()
        return desc;
 }
 
+
+char *key()
+{
+       return ASTERISK_GPL_KEY;
+}
index 9ba4fdc..071c24f 100755 (executable)
@@ -353,3 +353,8 @@ char *description()
        return desc;
 }
 
+
+char *key()
+{
+       return ASTERISK_GPL_KEY;
+}
index b901a40..94e2bff 100755 (executable)
@@ -584,3 +584,8 @@ char *description()
        return desc;
 }
 
+
+char *key()
+{
+       return ASTERISK_GPL_KEY;
+}
index e7bda62..9a8a715 100755 (executable)
@@ -25,6 +25,17 @@ int unload_module(void);             /* Cleanup all module structures,
                                           sockets, etc */
 int usecount(void);                    /* How many channels provided by this module are in use? */
 char *description(void);               /* Description of this module */
+char *key(void);               /* Return the below mentioned key, unmodified */
+
+int reload(void);
+
+#define ASTERISK_GPL_KEY \
+       "This paragraph is Copyright (C) 2000, Linux Support Services, Inc.  \
+In order for your module to load, it must return this key via a function \
+called \"key\".  Any code which includes this paragraph must be licensed under \
+the GNU General Public License version 2 or later (at your option).   Linux \
+Support Services, Inc. reserves the right to allow other parties to license \
+this paragraph under other terms as well."
 
 #define AST_MODULE_CONFIG "modules.conf" /* Module configuration file */
 
index 63c44df..b216a07 100755 (executable)
--- a/loader.c
+++ b/loader.c
 #include <asterisk/config.h>
 #include <asterisk/logger.h>
 #include <dlfcn.h>
+#include <asterisk/md5.h>
 #define __USE_GNU
 #include <pthread.h>
 #include "asterisk.h"
 
+static char expected_key[] =
+{ 0x8e, 0x93, 0x22, 0x83, 0xf5, 0xc3, 0xc0, 0x75,
+  0xff, 0x8b, 0xa9, 0xbe, 0x7c, 0x43, 0x74, 0x63 };
+
 struct module {
        int (*load_module)(void);
        int (*unload_module)(void);
        int (*usecount)(void);
        char *(*description)(void);
+       char *(*key)(void);
+       int (*reload)(void);
        void *lib;
        char resource[256];
        struct module *next;
 };
 
+static int printdigest(unsigned char *d)
+{
+       int x;
+       char buf[256];
+       char buf2[16];
+       snprintf(buf, sizeof(buf), "Unexpected signature:");
+       for (x=0;x<16;x++) {
+               snprintf(buf2, sizeof(buf2), " %02x", *(d++));
+               strcat(buf, buf2);
+       }
+       strcat(buf, "\n");
+       ast_log(LOG_DEBUG, buf);
+       return 0;
+}
+
+static int key_matches(char *key1, char *key2)
+{
+       int match = 1;
+       int x;
+       for (x=0;x<16;x++) {
+               match &= (key1[x] == key2[x]);
+       }
+       return match;
+}
+
+static int verify_key(char *key)
+{
+       struct MD5Context c;
+       char digest[16];
+       MD5Init(&c);
+       MD5Update(&c, key, strlen(key));
+       MD5Final(digest, &c);
+       if (key_matches(expected_key, digest))
+               return 0;
+       printdigest(digest);
+       return -1;
+}
+
 static struct loadupdate {
        int (*updater)(void);
        struct loadupdate *next;
@@ -94,6 +139,7 @@ int ast_load_resource(char *resource_name)
        struct module *m;
        int flags=0;
        char *val;
+       char *key;
        int o;
        struct ast_config *cfg;
        /* Keep the module file parsing silent */
@@ -158,6 +204,21 @@ int ast_load_resource(char *resource_name)
                ast_log(LOG_WARNING, "No description in module %s\n", fn);
                errors++;
        }
+       m->key = dlsym(m->lib, "key");
+       if (!m->key) {
+               ast_log(LOG_WARNING, "No key routine in module %s\n", fn);
+               errors++;
+       }
+       m->reload = dlsym(m->lib, "reload");
+       if (m->key && !(key = m->key())) {
+               ast_log(LOG_WARNING, "Key routine returned NULL in module %s\n", fn);
+               errors++;
+       } else
+               key = NULL;
+       if (key && verify_key(key)) {
+               ast_log(LOG_WARNING, "Unexpected key returned by module %s\n", fn);
+               errors++;
+       }
        if (errors) {
                ast_log(LOG_WARNING, "%d error(s) loading module %s, aborted\n", errors, fn);
                dlclose(m->lib);
@@ -175,6 +236,7 @@ int ast_load_resource(char *resource_name)
                        ast_verbose(VERBOSE_PREFIX_1 "Loaded %s => (%s)\n", fn, m->description());
        }
        m->next = module_list;
+       
        module_list = m;
        pthread_mutex_unlock(&modlock);
        if ((res = m->load_module())) {
index 52a4ecb..f8f233c 100755 (executable)
@@ -494,3 +494,8 @@ char *description(void)
 {
        return dtext;
 }
+
+char *key(void)
+{
+       return ASTERISK_GPL_KEY;
+}