mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-04 11:58:52 +00:00
Version 0.1.7 from FTP
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@235 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -262,3 +262,8 @@ int usecount(void)
|
||||
STANDARD_USECOUNT(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
char *key()
|
||||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
@@ -78,3 +78,8 @@ int usecount(void)
|
||||
STANDARD_USECOUNT(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
char *key()
|
||||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
@@ -75,3 +75,8 @@ int usecount(void)
|
||||
STANDARD_USECOUNT(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
char *key()
|
||||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
@@ -68,3 +68,8 @@ int usecount(void)
|
||||
STANDARD_USECOUNT(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
char *key()
|
||||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
@@ -80,3 +80,8 @@ int usecount(void)
|
||||
STANDARD_USECOUNT(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
char *key()
|
||||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
@@ -478,3 +478,7 @@ char *description()
|
||||
return desc;
|
||||
}
|
||||
|
||||
char *key()
|
||||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -321,3 +321,8 @@ int usecount(void)
|
||||
STANDARD_USECOUNT(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
char *key()
|
||||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
@@ -350,3 +350,8 @@ char *description()
|
||||
return desc;
|
||||
}
|
||||
|
||||
|
||||
char *key()
|
||||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
@@ -293,3 +293,8 @@ char *description()
|
||||
return desc;
|
||||
}
|
||||
|
||||
|
||||
char *key()
|
||||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
@@ -353,3 +353,8 @@ char *description()
|
||||
return desc;
|
||||
}
|
||||
|
||||
|
||||
char *key()
|
||||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
@@ -584,3 +584,8 @@ char *description()
|
||||
return desc;
|
||||
}
|
||||
|
||||
|
||||
char *key()
|
||||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
@@ -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 */
|
||||
|
||||
|
62
loader.c
62
loader.c
@@ -21,20 +21,65 @@
|
||||
#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())) {
|
||||
|
@@ -494,3 +494,8 @@ char *description(void)
|
||||
{
|
||||
return dtext;
|
||||
}
|
||||
|
||||
char *key(void)
|
||||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
Reference in New Issue
Block a user