Add support for a realtime sorcery module.
[asterisk/asterisk.git] / main / loader.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2006, Digium, Inc.
5  *
6  * Mark Spencer <markster@digium.com>
7  * Kevin P. Fleming <kpfleming@digium.com>
8  * Luigi Rizzo <rizzo@icir.org>
9  *
10  * See http://www.asterisk.org for more information about
11  * the Asterisk project. Please do not directly contact
12  * any of the maintainers of this project for assistance;
13  * the project provides a web site, mailing lists and IRC
14  * channels for your use.
15  *
16  * This program is free software, distributed under the terms of
17  * the GNU General Public License Version 2. See the LICENSE file
18  * at the top of the source tree.
19  */
20
21 /*! \file
22  *
23  * \brief Module Loader
24  * \author Mark Spencer <markster@digium.com>
25  * \author Kevin P. Fleming <kpfleming@digium.com>
26  * \author Luigi Rizzo <rizzo@icir.org>
27  * - See ModMngMnt
28  */
29
30 /*** MODULEINFO
31         <support_level>core</support_level>
32  ***/
33
34 #include "asterisk.h"
35
36 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
37
38 #include "asterisk/_private.h"
39 #include "asterisk/paths.h"     /* use ast_config_AST_MODULE_DIR */
40 #include <dirent.h>
41
42 #include "asterisk/linkedlists.h"
43 #include "asterisk/module.h"
44 #include "asterisk/config.h"
45 #include "asterisk/channel.h"
46 #include "asterisk/term.h"
47 #include "asterisk/acl.h"
48 #include "asterisk/manager.h"
49 #include "asterisk/cdr.h"
50 #include "asterisk/enum.h"
51 #include "asterisk/http.h"
52 #include "asterisk/lock.h"
53 #include "asterisk/features.h"
54 #include "asterisk/dsp.h"
55 #include "asterisk/udptl.h"
56 #include "asterisk/heap.h"
57 #include "asterisk/app.h"
58 #include "asterisk/test.h"
59
60 #include <dlfcn.h>
61
62 #include "asterisk/md5.h"
63 #include "asterisk/utils.h"
64
65 /*** DOCUMENTATION
66  ***/
67
68 #ifndef RTLD_NOW
69 #define RTLD_NOW 0
70 #endif
71
72 #ifndef RTLD_LOCAL
73 #define RTLD_LOCAL 0
74 #endif
75
76 struct ast_module_user {
77         struct ast_channel *chan;
78         AST_LIST_ENTRY(ast_module_user) entry;
79 };
80
81 AST_LIST_HEAD(module_user_list, ast_module_user);
82
83 static const unsigned char expected_key[] =
84 { 0x87, 0x76, 0x79, 0x35, 0x23, 0xea, 0x3a, 0xd3,
85   0x25, 0x2a, 0xbb, 0x35, 0x87, 0xe4, 0x22, 0x24 };
86
87 static char buildopt_sum[33] = AST_BUILDOPT_SUM;
88
89 static unsigned int embedding = 1; /* we always start out by registering embedded modules,
90                                       since they are here before we dlopen() any
91                                    */
92
93 struct ast_module {
94         const struct ast_module_info *info;
95         void *lib;                                      /* the shared lib, or NULL if embedded */
96         int usecount;                                   /* the number of 'users' currently in this module */
97         struct module_user_list users;                  /* the list of users in the module */
98         struct {
99                 unsigned int running:1;
100                 unsigned int declined:1;
101         } flags;
102         AST_LIST_ENTRY(ast_module) entry;
103         char resource[0];
104 };
105
106 static AST_LIST_HEAD_STATIC(module_list, ast_module);
107
108 const char *ast_module_name(const struct ast_module *mod)
109 {
110         if (!mod || !mod->info) {
111                 return NULL;
112         }
113
114         return mod->info->name;
115 }
116
117 /*
118  * module_list is cleared by its constructor possibly after
119  * we start accumulating embedded modules, so we need to
120  * use another list (without the lock) to accumulate them.
121  * Then we update the main list when embedding is done.
122  */
123 static struct module_list embedded_module_list;
124
125 struct loadupdate {
126         int (*updater)(void);
127         AST_LIST_ENTRY(loadupdate) entry;
128 };
129
130 static AST_LIST_HEAD_STATIC(updaters, loadupdate);
131
132 AST_MUTEX_DEFINE_STATIC(reloadlock);
133
134 struct reload_queue_item {
135         AST_LIST_ENTRY(reload_queue_item) entry;
136         char module[0];
137 };
138
139 static int do_full_reload = 0;
140
141 static AST_LIST_HEAD_STATIC(reload_queue, reload_queue_item);
142
143 /* when dynamic modules are being loaded, ast_module_register() will
144    need to know what filename the module was loaded from while it
145    is being registered
146 */
147 static struct ast_module *resource_being_loaded;
148
149 /* XXX: should we check for duplicate resource names here? */
150
151 void ast_module_register(const struct ast_module_info *info)
152 {
153         struct ast_module *mod;
154
155         if (embedding) {
156                 if (!(mod = ast_calloc(1, sizeof(*mod) + strlen(info->name) + 1)))
157                         return;
158                 strcpy(mod->resource, info->name);
159         } else {
160                 mod = resource_being_loaded;
161         }
162
163         mod->info = info;
164         AST_LIST_HEAD_INIT(&mod->users);
165
166         /* during startup, before the loader has been initialized,
167            there are no threads, so there is no need to take the lock
168            on this list to manipulate it. it is also possible that it
169            might be unsafe to use the list lock at that point... so
170            let's avoid it altogether
171         */
172         if (embedding) {
173                 AST_LIST_INSERT_TAIL(&embedded_module_list, mod, entry);
174         } else {
175                 AST_LIST_LOCK(&module_list);
176                 /* it is paramount that the new entry be placed at the tail of
177                    the list, otherwise the code that uses dlopen() to load
178                    dynamic modules won't be able to find out if the module it
179                    just opened was registered or failed to load
180                 */
181                 AST_LIST_INSERT_TAIL(&module_list, mod, entry);
182                 AST_LIST_UNLOCK(&module_list);
183         }
184
185         /* give the module a copy of its own handle, for later use in registrations and the like */
186         *((struct ast_module **) &(info->self)) = mod;
187 }
188
189 void ast_module_unregister(const struct ast_module_info *info)
190 {
191         struct ast_module *mod = NULL;
192
193         /* it is assumed that the users list in the module structure
194            will already be empty, or we cannot have gotten to this
195            point
196         */
197         AST_LIST_LOCK(&module_list);
198         AST_LIST_TRAVERSE_SAFE_BEGIN(&module_list, mod, entry) {
199                 if (mod->info == info) {
200                         AST_LIST_REMOVE_CURRENT(entry);
201                         break;
202                 }
203         }
204         AST_LIST_TRAVERSE_SAFE_END;
205         AST_LIST_UNLOCK(&module_list);
206
207         if (mod) {
208                 AST_LIST_HEAD_DESTROY(&mod->users);
209                 ast_free(mod);
210         }
211 }
212
213 struct ast_module_user *__ast_module_user_add(struct ast_module *mod, struct ast_channel *chan)
214 {
215         struct ast_module_user *u;
216
217         u = ast_calloc(1, sizeof(*u));
218         if (!u) {
219                 return NULL;
220         }
221
222         u->chan = chan;
223
224         AST_LIST_LOCK(&mod->users);
225         AST_LIST_INSERT_HEAD(&mod->users, u, entry);
226         AST_LIST_UNLOCK(&mod->users);
227
228         ast_atomic_fetchadd_int(&mod->usecount, +1);
229
230         ast_update_use_count();
231
232         return u;
233 }
234
235 void __ast_module_user_remove(struct ast_module *mod, struct ast_module_user *u)
236 {
237         if (!u) {
238                 return;
239         }
240
241         AST_LIST_LOCK(&mod->users);
242         u = AST_LIST_REMOVE(&mod->users, u, entry);
243         AST_LIST_UNLOCK(&mod->users);
244         if (!u) {
245                 /*
246                  * Was not in the list.  Either a bad pointer or
247                  * __ast_module_user_hangup_all() has been called.
248                  */
249                 return;
250         }
251
252         ast_atomic_fetchadd_int(&mod->usecount, -1);
253         ast_free(u);
254
255         ast_update_use_count();
256 }
257
258 void __ast_module_user_hangup_all(struct ast_module *mod)
259 {
260         struct ast_module_user *u;
261
262         AST_LIST_LOCK(&mod->users);
263         while ((u = AST_LIST_REMOVE_HEAD(&mod->users, entry))) {
264                 if (u->chan) {
265                         ast_softhangup(u->chan, AST_SOFTHANGUP_APPUNLOAD);
266                 }
267                 ast_atomic_fetchadd_int(&mod->usecount, -1);
268                 ast_free(u);
269         }
270         AST_LIST_UNLOCK(&mod->users);
271
272         ast_update_use_count();
273 }
274
275 /*! \note
276  * In addition to modules, the reload command handles some extra keywords
277  * which are listed here together with the corresponding handlers.
278  * This table is also used by the command completion code.
279  */
280 static struct reload_classes {
281         const char *name;
282         int (*reload_fn)(void);
283 } reload_classes[] = {  /* list in alpha order, longest match first for cli completion */
284         { "cdr",        ast_cdr_engine_reload },
285         { "dnsmgr",     dnsmgr_reload },
286         { "extconfig",  read_config_maps },
287         { "enum",       ast_enum_reload },
288         { "acl",        ast_named_acl_reload },
289         { "manager",    reload_manager },
290         { "http",       ast_http_reload },
291         { "logger",     logger_reload },
292         { "features",   ast_features_reload },
293         { "dsp",        ast_dsp_reload},
294         { "udptl",      ast_udptl_reload },
295         { "indications", ast_indications_reload },
296         { "cel",        ast_cel_engine_reload },
297         { "plc",        ast_plc_reload },
298         { NULL,         NULL }
299 };
300
301 static int printdigest(const unsigned char *d)
302 {
303         int x, pos;
304         char buf[256]; /* large enough so we don't have to worry */
305
306         for (pos = 0, x = 0; x < 16; x++)
307                 pos += sprintf(buf + pos, " %02x", *d++);
308
309         ast_debug(1, "Unexpected signature:%s\n", buf);
310
311         return 0;
312 }
313
314 static int key_matches(const unsigned char *key1, const unsigned char *key2)
315 {
316         int x;
317
318         for (x = 0; x < 16; x++) {
319                 if (key1[x] != key2[x])
320                         return 0;
321         }
322
323         return 1;
324 }
325
326 static int verify_key(const unsigned char *key)
327 {
328         struct MD5Context c;
329         unsigned char digest[16];
330
331         MD5Init(&c);
332         MD5Update(&c, key, strlen((char *)key));
333         MD5Final(digest, &c);
334
335         if (key_matches(expected_key, digest))
336                 return 0;
337
338         printdigest(digest);
339
340         return -1;
341 }
342
343 static int resource_name_match(const char *name1_in, const char *name2_in)
344 {
345         char *name1 = (char *) name1_in;
346         char *name2 = (char *) name2_in;
347
348         /* trim off any .so extensions */
349         if (!strcasecmp(name1 + strlen(name1) - 3, ".so")) {
350                 name1 = ast_strdupa(name1);
351                 name1[strlen(name1) - 3] = '\0';
352         }
353         if (!strcasecmp(name2 + strlen(name2) - 3, ".so")) {
354                 name2 = ast_strdupa(name2);
355                 name2[strlen(name2) - 3] = '\0';
356         }
357
358         return strcasecmp(name1, name2);
359 }
360
361 static struct ast_module *find_resource(const char *resource, int do_lock)
362 {
363         struct ast_module *cur;
364
365         if (do_lock)
366                 AST_LIST_LOCK(&module_list);
367
368         AST_LIST_TRAVERSE(&module_list, cur, entry) {
369                 if (!resource_name_match(resource, cur->resource))
370                         break;
371         }
372
373         if (do_lock)
374                 AST_LIST_UNLOCK(&module_list);
375
376         return cur;
377 }
378
379 #ifdef LOADABLE_MODULES
380 static void unload_dynamic_module(struct ast_module *mod)
381 {
382         void *lib = mod->lib;
383
384         /* WARNING: the structure pointed to by mod is going to
385            disappear when this operation succeeds, so we can't
386            dereference it */
387
388         if (lib)
389                 while (!dlclose(lib));
390 }
391
392 static enum ast_module_load_result load_resource(const char *resource_name, unsigned int global_symbols_only, struct ast_heap *resource_heap, int required);
393
394 static struct ast_module *load_dynamic_module(const char *resource_in, unsigned int global_symbols_only, struct ast_heap *resource_heap)
395 {
396         char fn[PATH_MAX] = "";
397         void *lib = NULL;
398         struct ast_module *mod;
399         unsigned int wants_global;
400         int space;      /* room needed for the descriptor */
401         int missing_so = 0;
402
403         space = sizeof(*resource_being_loaded) + strlen(resource_in) + 1;
404         if (strcasecmp(resource_in + strlen(resource_in) - 3, ".so")) {
405                 missing_so = 1;
406                 space += 3;     /* room for the extra ".so" */
407         }
408
409         snprintf(fn, sizeof(fn), "%s/%s%s", ast_config_AST_MODULE_DIR, resource_in, missing_so ? ".so" : "");
410
411         /* make a first load of the module in 'quiet' mode... don't try to resolve
412            any symbols, and don't export any symbols. this will allow us to peek into
413            the module's info block (if available) to see what flags it has set */
414
415         resource_being_loaded = ast_calloc(1, space);
416         if (!resource_being_loaded)
417                 return NULL;
418         strcpy(resource_being_loaded->resource, resource_in);
419         if (missing_so)
420                 strcat(resource_being_loaded->resource, ".so");
421
422         if (!(lib = dlopen(fn, RTLD_LAZY | RTLD_LOCAL))) {
423                 ast_log(LOG_WARNING, "Error loading module '%s': %s\n", resource_in, dlerror());
424                 ast_free(resource_being_loaded);
425                 return NULL;
426         }
427
428         /* the dlopen() succeeded, let's find out if the module
429            registered itself */
430         /* note that this will only work properly as long as
431            ast_module_register() (which is called by the module's
432            constructor) places the new module at the tail of the
433            module_list
434         */
435         if (resource_being_loaded != (mod = AST_LIST_LAST(&module_list))) {
436                 ast_log(LOG_WARNING, "Module '%s' did not register itself during load\n", resource_in);
437                 /* no, it did not, so close it and return */
438                 while (!dlclose(lib));
439                 /* note that the module's destructor will call ast_module_unregister(),
440                    which will free the structure we allocated in resource_being_loaded */
441                 return NULL;
442         }
443
444         wants_global = ast_test_flag(mod->info, AST_MODFLAG_GLOBAL_SYMBOLS);
445
446         /* if we are being asked only to load modules that provide global symbols,
447            and this one does not, then close it and return */
448         if (global_symbols_only && !wants_global) {
449                 while (!dlclose(lib));
450                 return NULL;
451         }
452
453         /* This section is a workaround for a gcc 4.1 bug that has already been
454          * fixed in later versions.  Unfortunately, some distributions, such as
455          * RHEL/CentOS 5, distribute gcc 4.1, so we're stuck with having to deal
456          * with this issue.  This basically ensures that optional_api modules are
457          * loaded before any module which requires their functionality. */
458 #if !defined(HAVE_ATTRIBUTE_weak_import) && !defined(HAVE_ATTRIBUTE_weakref)
459         if (!ast_strlen_zero(mod->info->nonoptreq)) {
460                 /* Force any required dependencies to load */
461                 char *each, *required_resource = ast_strdupa(mod->info->nonoptreq);
462                 while ((each = strsep(&required_resource, ","))) {
463                         struct ast_module *dependency;
464                         each = ast_strip(each);
465                         dependency = find_resource(each, 0);
466                         /* Is it already loaded? */
467                         if (!dependency) {
468                                 load_resource(each, global_symbols_only, resource_heap, 1);
469                         }
470                 }
471         }
472 #endif
473
474         while (!dlclose(lib));
475         resource_being_loaded = NULL;
476
477         /* start the load process again */
478         resource_being_loaded = ast_calloc(1, space);
479         if (!resource_being_loaded)
480                 return NULL;
481         strcpy(resource_being_loaded->resource, resource_in);
482         if (missing_so)
483                 strcat(resource_being_loaded->resource, ".so");
484
485         if (!(lib = dlopen(fn, wants_global ? RTLD_LAZY | RTLD_GLOBAL : RTLD_NOW | RTLD_LOCAL))) {
486                 ast_log(LOG_WARNING, "Error loading module '%s': %s\n", resource_in, dlerror());
487                 ast_free(resource_being_loaded);
488                 return NULL;
489         }
490
491         /* since the module was successfully opened, and it registered itself
492            the previous time we did that, we're going to assume it worked this
493            time too :) */
494
495         AST_LIST_LAST(&module_list)->lib = lib;
496         resource_being_loaded = NULL;
497
498         return AST_LIST_LAST(&module_list);
499 }
500 #endif
501
502 void ast_module_shutdown(void)
503 {
504         struct ast_module *mod;
505         int somethingchanged = 1, final = 0;
506
507         AST_LIST_LOCK(&module_list);
508
509         /*!\note Some resources, like timers, are started up dynamically, and thus
510          * may be still in use, even if all channels are dead.  We must therefore
511          * check the usecount before asking modules to unload. */
512         do {
513                 if (!somethingchanged) {
514                         /*!\note If we go through the entire list without changing
515                          * anything, ignore the usecounts and unload, then exit. */
516                         final = 1;
517                 }
518
519                 /* Reset flag before traversing the list */
520                 somethingchanged = 0;
521
522                 AST_LIST_TRAVERSE_SAFE_BEGIN(&module_list, mod, entry) {
523                         if (!final && mod->usecount) {
524                                 continue;
525                         }
526                         AST_LIST_REMOVE_CURRENT(entry);
527                         if (mod->flags.running && !mod->flags.declined && mod->info->unload) {
528                                 mod->info->unload();
529                         }
530                         AST_LIST_HEAD_DESTROY(&mod->users);
531                         free(mod);
532                         somethingchanged = 1;
533                 }
534                 AST_LIST_TRAVERSE_SAFE_END;
535         } while (somethingchanged && !final);
536
537         AST_LIST_UNLOCK(&module_list);
538 }
539
540 int ast_unload_resource(const char *resource_name, enum ast_module_unload_mode force)
541 {
542         struct ast_module *mod;
543         int res = -1;
544         int error = 0;
545
546         AST_LIST_LOCK(&module_list);
547
548         if (!(mod = find_resource(resource_name, 0))) {
549                 AST_LIST_UNLOCK(&module_list);
550                 ast_log(LOG_WARNING, "Unload failed, '%s' could not be found\n", resource_name);
551                 return -1;
552         }
553
554         if (!mod->flags.running || mod->flags.declined) {
555                 ast_log(LOG_WARNING, "Unload failed, '%s' is not loaded.\n", resource_name);
556                 error = 1;
557         }
558
559         if (!error && (mod->usecount > 0)) {
560                 if (force)
561                         ast_log(LOG_WARNING, "Warning:  Forcing removal of module '%s' with use count %d\n",
562                                 resource_name, mod->usecount);
563                 else {
564                         ast_log(LOG_WARNING, "Soft unload failed, '%s' has use count %d\n", resource_name,
565                                 mod->usecount);
566                         error = 1;
567                 }
568         }
569
570         if (!error) {
571                 /* Request any channels attached to the module to hangup. */
572                 __ast_module_user_hangup_all(mod);
573
574                 res = mod->info->unload();
575                 if (res) {
576                         ast_log(LOG_WARNING, "Firm unload failed for %s\n", resource_name);
577                         if (force <= AST_FORCE_FIRM) {
578                                 error = 1;
579                         } else {
580                                 ast_log(LOG_WARNING, "** Dangerous **: Unloading resource anyway, at user request\n");
581                         }
582                 }
583
584                 if (!error) {
585                         /*
586                          * Request hangup on any channels that managed to get attached
587                          * while we called the module unload function.
588                          */
589                         __ast_module_user_hangup_all(mod);
590                         sched_yield();
591                 }
592         }
593
594         if (!error)
595                 mod->flags.running = mod->flags.declined = 0;
596
597         AST_LIST_UNLOCK(&module_list);
598
599         if (!error && !mod->lib && mod->info && mod->info->restore_globals)
600                 mod->info->restore_globals();
601
602 #ifdef LOADABLE_MODULES
603         if (!error) {
604                 unload_dynamic_module(mod);
605                 ast_test_suite_event_notify("MODULE_UNLOAD", "Message: %s", resource_name);
606         }
607 #endif
608
609         if (!error)
610                 ast_update_use_count();
611
612         return res;
613 }
614
615 char *ast_module_helper(const char *line, const char *word, int pos, int state, int rpos, int needsreload)
616 {
617         struct ast_module *cur;
618         int i, which=0, l = strlen(word);
619         char *ret = NULL;
620
621         if (pos != rpos)
622                 return NULL;
623
624         AST_LIST_LOCK(&module_list);
625         AST_LIST_TRAVERSE(&module_list, cur, entry) {
626                 if (!strncasecmp(word, cur->resource, l) &&
627                     (cur->info->reload || !needsreload) &&
628                     ++which > state) {
629                         ret = ast_strdup(cur->resource);
630                         break;
631                 }
632         }
633         AST_LIST_UNLOCK(&module_list);
634
635         if (!ret) {
636                 for (i=0; !ret && reload_classes[i].name; i++) {
637                         if (!strncasecmp(word, reload_classes[i].name, l) && ++which > state)
638                                 ret = ast_strdup(reload_classes[i].name);
639                 }
640         }
641
642         return ret;
643 }
644
645 void ast_process_pending_reloads(void)
646 {
647         struct reload_queue_item *item;
648
649         if (!ast_fully_booted) {
650                 return;
651         }
652
653         AST_LIST_LOCK(&reload_queue);
654
655         if (do_full_reload) {
656                 do_full_reload = 0;
657                 AST_LIST_UNLOCK(&reload_queue);
658                 ast_log(LOG_NOTICE, "Executing deferred reload request.\n");
659                 ast_module_reload(NULL);
660                 return;
661         }
662
663         while ((item = AST_LIST_REMOVE_HEAD(&reload_queue, entry))) {
664                 ast_log(LOG_NOTICE, "Executing deferred reload request for module '%s'.\n", item->module);
665                 ast_module_reload(item->module);
666                 ast_free(item);
667         }
668
669         AST_LIST_UNLOCK(&reload_queue);
670 }
671
672 static void queue_reload_request(const char *module)
673 {
674         struct reload_queue_item *item;
675
676         AST_LIST_LOCK(&reload_queue);
677
678         if (do_full_reload) {
679                 AST_LIST_UNLOCK(&reload_queue);
680                 return;
681         }
682
683         if (ast_strlen_zero(module)) {
684                 /* A full reload request (when module is NULL) wipes out any previous
685                    reload requests and causes the queue to ignore future ones */
686                 while ((item = AST_LIST_REMOVE_HEAD(&reload_queue, entry))) {
687                         ast_free(item);
688                 }
689                 do_full_reload = 1;
690         } else {
691                 /* No reason to add the same module twice */
692                 AST_LIST_TRAVERSE(&reload_queue, item, entry) {
693                         if (!strcasecmp(item->module, module)) {
694                                 AST_LIST_UNLOCK(&reload_queue);
695                                 return;
696                         }
697                 }
698                 item = ast_calloc(1, sizeof(*item) + strlen(module) + 1);
699                 if (!item) {
700                         ast_log(LOG_ERROR, "Failed to allocate reload queue item.\n");
701                         AST_LIST_UNLOCK(&reload_queue);
702                         return;
703                 }
704                 strcpy(item->module, module);
705                 AST_LIST_INSERT_TAIL(&reload_queue, item, entry);
706         }
707         AST_LIST_UNLOCK(&reload_queue);
708 }
709
710 int ast_module_reload(const char *name)
711 {
712         struct ast_module *cur;
713         int res = 0; /* return value. 0 = not found, others, see below */
714         int i;
715
716         /* If we aren't fully booted, we just pretend we reloaded but we queue this
717            up to run once we are booted up. */
718         if (!ast_fully_booted) {
719                 queue_reload_request(name);
720                 return 0;
721         }
722
723         if (ast_mutex_trylock(&reloadlock)) {
724                 ast_verbose("The previous reload command didn't finish yet\n");
725                 return -1;      /* reload already in progress */
726         }
727         ast_lastreloadtime = ast_tvnow();
728
729         if (ast_opt_lock_confdir) {
730                 int try;
731                 int res;
732                 for (try = 1, res = AST_LOCK_TIMEOUT; try < 6 && (res == AST_LOCK_TIMEOUT); try++) {
733                         res = ast_lock_path(ast_config_AST_CONFIG_DIR);
734                         if (res == AST_LOCK_TIMEOUT) {
735                                 ast_log(LOG_WARNING, "Failed to grab lock on %s, try %d\n", ast_config_AST_CONFIG_DIR, try);
736                         }
737                 }
738                 if (res != AST_LOCK_SUCCESS) {
739                         ast_verbose("Cannot grab lock on %s\n", ast_config_AST_CONFIG_DIR);
740                         ast_mutex_unlock(&reloadlock);
741                         return -1;
742                 }
743         }
744
745         /* Call "predefined" reload here first */
746         for (i = 0; reload_classes[i].name; i++) {
747                 if (!name || !strcasecmp(name, reload_classes[i].name)) {
748                         if (!reload_classes[i].reload_fn()) {
749                                 ast_test_suite_event_notify("MODULE_RELOAD", "Message: %s", name);
750                         }
751                         res = 2;        /* found and reloaded */
752                 }
753         }
754
755         if (name && res) {
756                 if (ast_opt_lock_confdir) {
757                         ast_unlock_path(ast_config_AST_CONFIG_DIR);
758                 }
759                 ast_mutex_unlock(&reloadlock);
760                 return res;
761         }
762
763         AST_LIST_LOCK(&module_list);
764         AST_LIST_TRAVERSE(&module_list, cur, entry) {
765                 const struct ast_module_info *info = cur->info;
766
767                 if (name && resource_name_match(name, cur->resource))
768                         continue;
769
770                 if (!cur->flags.running || cur->flags.declined) {
771                         if (!name)
772                                 continue;
773                         ast_log(LOG_NOTICE, "The module '%s' was not properly initialized.  "
774                                 "Before reloading the module, you must run \"module load %s\" "
775                                 "and fix whatever is preventing the module from being initialized.\n",
776                                 name, name);
777                         res = 2; /* Don't report that the module was not found */
778                         break;
779                 }
780
781                 if (!info->reload) {    /* cannot be reloaded */
782                         /* Nothing to reload, so reload is successful */
783                         ast_test_suite_event_notify("MODULE_RELOAD", "Message: %s", cur->resource);
784                         if (res < 1)    /* store result if possible */
785                                 res = 1;        /* 1 = no reload() method */
786                         continue;
787                 }
788
789                 res = 2;
790                 ast_verb(3, "Reloading module '%s' (%s)\n", cur->resource, info->description);
791                 if (!info->reload()) {
792                         ast_test_suite_event_notify("MODULE_RELOAD", "Message: %s", cur->resource);
793                 }
794         }
795         AST_LIST_UNLOCK(&module_list);
796
797         if (ast_opt_lock_confdir) {
798                 ast_unlock_path(ast_config_AST_CONFIG_DIR);
799         }
800         ast_mutex_unlock(&reloadlock);
801
802         return res;
803 }
804
805 static unsigned int inspect_module(const struct ast_module *mod)
806 {
807         if (!mod->info->description) {
808                 ast_log(LOG_WARNING, "Module '%s' does not provide a description.\n", mod->resource);
809                 return 1;
810         }
811
812         if (!mod->info->key) {
813                 ast_log(LOG_WARNING, "Module '%s' does not provide a license key.\n", mod->resource);
814                 return 1;
815         }
816
817         if (verify_key((unsigned char *) mod->info->key)) {
818                 ast_log(LOG_WARNING, "Module '%s' did not provide a valid license key.\n", mod->resource);
819                 return 1;
820         }
821
822         if (!ast_strlen_zero(mod->info->buildopt_sum) &&
823             strcmp(buildopt_sum, mod->info->buildopt_sum)) {
824                 ast_log(LOG_WARNING, "Module '%s' was not compiled with the same compile-time options as this version of Asterisk.\n", mod->resource);
825                 ast_log(LOG_WARNING, "Module '%s' will not be initialized as it may cause instability.\n", mod->resource);
826                 return 1;
827         }
828
829         return 0;
830 }
831
832 static enum ast_module_load_result start_resource(struct ast_module *mod)
833 {
834         char tmp[256];
835         enum ast_module_load_result res;
836
837         if (mod->flags.running) {
838                 return AST_MODULE_LOAD_SUCCESS;
839         }
840
841         if (!mod->info->load) {
842                 return AST_MODULE_LOAD_FAILURE;
843         }
844
845         if (!ast_fully_booted) {
846                 ast_verb(1, "Loading %s.\n", mod->resource);
847         }
848         res = mod->info->load();
849
850         switch (res) {
851         case AST_MODULE_LOAD_SUCCESS:
852                 if (!ast_fully_booted) {
853                         ast_verb(1, "%s => (%s)\n", mod->resource, term_color(tmp, mod->info->description, COLOR_BROWN, COLOR_BLACK, sizeof(tmp)));
854                         if (ast_opt_console && !option_verbose) {
855                                 /* This never looks good on anything but the root console, so
856                                  * it's best not to try to funnel it through the logger. */
857                                 fprintf(stdout, ".");
858                         }
859                 } else {
860                         ast_verb(1, "Loaded %s => (%s)\n", mod->resource, mod->info->description);
861                 }
862
863                 mod->flags.running = 1;
864
865                 ast_update_use_count();
866                 break;
867         case AST_MODULE_LOAD_DECLINE:
868                 mod->flags.declined = 1;
869                 break;
870         case AST_MODULE_LOAD_FAILURE:
871         case AST_MODULE_LOAD_SKIP: /* modules should never return this value */
872         case AST_MODULE_LOAD_PRIORITY:
873                 break;
874         }
875
876         return res;
877 }
878
879 /*! loads a resource based upon resource_name. If global_symbols_only is set
880  *  only modules with global symbols will be loaded.
881  *
882  *  If the ast_heap is provided (not NULL) the module is found and added to the
883  *  heap without running the module's load() function.  By doing this, modules
884  *  added to the resource_heap can be initialized later in order by priority.
885  *
886  *  If the ast_heap is not provided, the module's load function will be executed
887  *  immediately */
888 static enum ast_module_load_result load_resource(const char *resource_name, unsigned int global_symbols_only, struct ast_heap *resource_heap, int required)
889 {
890         struct ast_module *mod;
891         enum ast_module_load_result res = AST_MODULE_LOAD_SUCCESS;
892
893         if ((mod = find_resource(resource_name, 0))) {
894                 if (mod->flags.running) {
895                         ast_log(LOG_WARNING, "Module '%s' already exists.\n", resource_name);
896                         return AST_MODULE_LOAD_DECLINE;
897                 }
898                 if (global_symbols_only && !ast_test_flag(mod->info, AST_MODFLAG_GLOBAL_SYMBOLS))
899                         return AST_MODULE_LOAD_SKIP;
900         } else {
901 #ifdef LOADABLE_MODULES
902                 if (!(mod = load_dynamic_module(resource_name, global_symbols_only, resource_heap))) {
903                         /* don't generate a warning message during load_modules() */
904                         if (!global_symbols_only) {
905                                 ast_log(LOG_WARNING, "Module '%s' could not be loaded.\n", resource_name);
906                                 return required ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_DECLINE;
907                         } else {
908                                 return required ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SKIP;
909                         }
910                 }
911 #else
912                 ast_log(LOG_WARNING, "Module support is not available. Module '%s' could not be loaded.\n", resource_name);
913                 return required ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_DECLINE;
914 #endif
915         }
916
917         if (inspect_module(mod)) {
918                 ast_log(LOG_WARNING, "Module '%s' could not be loaded.\n", resource_name);
919 #ifdef LOADABLE_MODULES
920                 unload_dynamic_module(mod);
921 #endif
922                 return required ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_DECLINE;
923         }
924
925         if (!mod->lib && mod->info->backup_globals && mod->info->backup_globals()) {
926                 ast_log(LOG_WARNING, "Module '%s' was unable to backup its global data.\n", resource_name);
927                 return required ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_DECLINE;
928         }
929
930         mod->flags.declined = 0;
931
932         if (resource_heap) {
933                 ast_heap_push(resource_heap, mod);
934                 res = AST_MODULE_LOAD_PRIORITY;
935         } else {
936                 res = start_resource(mod);
937         }
938
939         /* Now make sure that the list is sorted */
940         AST_LIST_LOCK(&module_list);
941         AST_LIST_REMOVE(&module_list, mod, entry);
942         AST_LIST_INSERT_SORTALPHA(&module_list, mod, entry, resource);
943         AST_LIST_UNLOCK(&module_list);
944
945         return res;
946 }
947
948 int ast_load_resource(const char *resource_name)
949 {
950         int res;
951         AST_LIST_LOCK(&module_list);
952         res = load_resource(resource_name, 0, NULL, 0);
953         if (!res) {
954                 ast_test_suite_event_notify("MODULE_LOAD", "Message: %s", resource_name);
955         }
956         AST_LIST_UNLOCK(&module_list);
957
958         return res;
959 }
960
961 struct load_order_entry {
962         char *resource;
963         int required;
964         AST_LIST_ENTRY(load_order_entry) entry;
965 };
966
967 AST_LIST_HEAD_NOLOCK(load_order, load_order_entry);
968
969 static struct load_order_entry *add_to_load_order(const char *resource, struct load_order *load_order, int required)
970 {
971         struct load_order_entry *order;
972
973         AST_LIST_TRAVERSE(load_order, order, entry) {
974                 if (!resource_name_match(order->resource, resource)) {
975                         /* Make sure we have the proper setting for the required field
976                            (we might have both load= and required= lines in modules.conf) */
977                         order->required |= required;
978                         return NULL;
979                 }
980         }
981
982         if (!(order = ast_calloc(1, sizeof(*order))))
983                 return NULL;
984
985         order->resource = ast_strdup(resource);
986         order->required = required;
987         AST_LIST_INSERT_TAIL(load_order, order, entry);
988
989         return order;
990 }
991
992 static int mod_load_cmp(void *a, void *b)
993 {
994         struct ast_module *a_mod = (struct ast_module *) a;
995         struct ast_module *b_mod = (struct ast_module *) b;
996         int res = -1;
997         /* if load_pri is not set, default is 128.  Lower is better*/
998         unsigned char a_pri = ast_test_flag(a_mod->info, AST_MODFLAG_LOAD_ORDER) ? a_mod->info->load_pri : 128;
999         unsigned char b_pri = ast_test_flag(b_mod->info, AST_MODFLAG_LOAD_ORDER) ? b_mod->info->load_pri : 128;
1000         if (a_pri == b_pri) {
1001                 res = 0;
1002         } else if (a_pri < b_pri) {
1003                 res = 1;
1004         }
1005         return res;
1006 }
1007
1008 /*! loads modules in order by load_pri, updates mod_count
1009         \return -1 on failure to load module, -2 on failure to load required module, otherwise 0
1010 */
1011 static int load_resource_list(struct load_order *load_order, unsigned int global_symbols, int *mod_count)
1012 {
1013         struct ast_heap *resource_heap;
1014         struct load_order_entry *order;
1015         struct ast_module *mod;
1016         int count = 0;
1017         int res = 0;
1018
1019         if(!(resource_heap = ast_heap_create(8, mod_load_cmp, -1))) {
1020                 return -1;
1021         }
1022
1023         /* first, add find and add modules to heap */
1024         AST_LIST_TRAVERSE_SAFE_BEGIN(load_order, order, entry) {
1025                 switch (load_resource(order->resource, global_symbols, resource_heap, order->required)) {
1026                 case AST_MODULE_LOAD_SUCCESS:
1027                 case AST_MODULE_LOAD_DECLINE:
1028                         AST_LIST_REMOVE_CURRENT(entry);
1029                         ast_free(order->resource);
1030                         ast_free(order);
1031                         break;
1032                 case AST_MODULE_LOAD_FAILURE:
1033                         ast_log(LOG_ERROR, "*** Failed to load module %s - %s\n", order->resource, order->required ? "Required" : "Not required");
1034                         fprintf(stderr, "*** Failed to load module %s - %s\n", order->resource, order->required ? "Required" : "Not required");
1035                         res = order->required ? -2 : -1;
1036                         goto done;
1037                 case AST_MODULE_LOAD_SKIP:
1038                         break;
1039                 case AST_MODULE_LOAD_PRIORITY:
1040                         AST_LIST_REMOVE_CURRENT(entry);
1041                         break;
1042                 }
1043         }
1044         AST_LIST_TRAVERSE_SAFE_END;
1045
1046         /* second remove modules from heap sorted by priority */
1047         while ((mod = ast_heap_pop(resource_heap))) {
1048                 switch (start_resource(mod)) {
1049                 case AST_MODULE_LOAD_SUCCESS:
1050                         count++;
1051                 case AST_MODULE_LOAD_DECLINE:
1052                         break;
1053                 case AST_MODULE_LOAD_FAILURE:
1054                         res = -1;
1055                         goto done;
1056                 case AST_MODULE_LOAD_SKIP:
1057                 case AST_MODULE_LOAD_PRIORITY:
1058                         break;
1059                 }
1060         }
1061
1062 done:
1063         if (mod_count) {
1064                 *mod_count += count;
1065         }
1066         ast_heap_destroy(resource_heap);
1067
1068         return res;
1069 }
1070
1071 int load_modules(unsigned int preload_only)
1072 {
1073         struct ast_config *cfg;
1074         struct ast_module *mod;
1075         struct load_order_entry *order;
1076         struct ast_variable *v;
1077         unsigned int load_count;
1078         struct load_order load_order;
1079         int res = 0;
1080         struct ast_flags config_flags = { 0 };
1081         int modulecount = 0;
1082
1083 #ifdef LOADABLE_MODULES
1084         struct dirent *dirent;
1085         DIR *dir;
1086 #endif
1087
1088         /* all embedded modules have registered themselves by now */
1089         embedding = 0;
1090
1091         ast_verb(1, "Asterisk Dynamic Loader Starting:\n");
1092
1093         AST_LIST_HEAD_INIT_NOLOCK(&load_order);
1094
1095         AST_LIST_LOCK(&module_list);
1096
1097         if (embedded_module_list.first) {
1098                 module_list.first = embedded_module_list.first;
1099                 module_list.last = embedded_module_list.last;
1100                 embedded_module_list.first = NULL;
1101         }
1102
1103         cfg = ast_config_load2(AST_MODULE_CONFIG, "" /* core, can't reload */, config_flags);
1104         if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEINVALID) {
1105                 ast_log(LOG_WARNING, "No '%s' found, no modules will be loaded.\n", AST_MODULE_CONFIG);
1106                 goto done;
1107         }
1108
1109         /* first, find all the modules we have been explicitly requested to load */
1110         for (v = ast_variable_browse(cfg, "modules"); v; v = v->next) {
1111                 if (!strcasecmp(v->name, preload_only ? "preload" : "load")) {
1112                         add_to_load_order(v->value, &load_order, 0);
1113                 }
1114                 if (!strcasecmp(v->name, preload_only ? "preload-require" : "require")) {
1115                         /* Add the module to the list and make sure it's required */
1116                         add_to_load_order(v->value, &load_order, 1);
1117                         ast_debug(2, "Adding module to required list: %s (%s)\n", v->value, v->name);
1118                 }
1119
1120         }
1121
1122         /* check if 'autoload' is on */
1123         if (!preload_only && ast_true(ast_variable_retrieve(cfg, "modules", "autoload"))) {
1124                 /* if so, first add all the embedded modules that are not already running to the load order */
1125                 AST_LIST_TRAVERSE(&module_list, mod, entry) {
1126                         /* if it's not embedded, skip it */
1127                         if (mod->lib)
1128                                 continue;
1129
1130                         if (mod->flags.running)
1131                                 continue;
1132
1133                         add_to_load_order(mod->resource, &load_order, 0);
1134                 }
1135
1136 #ifdef LOADABLE_MODULES
1137                 /* if we are allowed to load dynamic modules, scan the directory for
1138                    for all available modules and add them as well */
1139                 if ((dir = opendir(ast_config_AST_MODULE_DIR))) {
1140                         while ((dirent = readdir(dir))) {
1141                                 int ld = strlen(dirent->d_name);
1142
1143                                 /* Must end in .so to load it.  */
1144
1145                                 if (ld < 4)
1146                                         continue;
1147
1148                                 if (strcasecmp(dirent->d_name + ld - 3, ".so"))
1149                                         continue;
1150
1151                                 /* if there is already a module by this name in the module_list,
1152                                    skip this file */
1153                                 if (find_resource(dirent->d_name, 0))
1154                                         continue;
1155
1156                                 add_to_load_order(dirent->d_name, &load_order, 0);
1157                         }
1158
1159                         closedir(dir);
1160                 } else {
1161                         if (!ast_opt_quiet)
1162                                 ast_log(LOG_WARNING, "Unable to open modules directory '%s'.\n",
1163                                         ast_config_AST_MODULE_DIR);
1164                 }
1165 #endif
1166         }
1167
1168         /* now scan the config for any modules we are prohibited from loading and
1169            remove them from the load order */
1170         for (v = ast_variable_browse(cfg, "modules"); v; v = v->next) {
1171                 if (strcasecmp(v->name, "noload"))
1172                         continue;
1173
1174                 AST_LIST_TRAVERSE_SAFE_BEGIN(&load_order, order, entry) {
1175                         if (!resource_name_match(order->resource, v->value)) {
1176                                 AST_LIST_REMOVE_CURRENT(entry);
1177                                 ast_free(order->resource);
1178                                 ast_free(order);
1179                         }
1180                 }
1181                 AST_LIST_TRAVERSE_SAFE_END;
1182         }
1183
1184         /* we are done with the config now, all the information we need is in the
1185            load_order list */
1186         ast_config_destroy(cfg);
1187
1188         load_count = 0;
1189         AST_LIST_TRAVERSE(&load_order, order, entry)
1190                 load_count++;
1191
1192         if (load_count)
1193                 ast_log(LOG_NOTICE, "%d modules will be loaded.\n", load_count);
1194
1195         /* first, load only modules that provide global symbols */
1196         if ((res = load_resource_list(&load_order, 1, &modulecount)) < 0) {
1197                 goto done;
1198         }
1199
1200         /* now load everything else */
1201         if ((res = load_resource_list(&load_order, 0, &modulecount)) < 0) {
1202                 goto done;
1203         }
1204
1205 done:
1206         while ((order = AST_LIST_REMOVE_HEAD(&load_order, entry))) {
1207                 ast_free(order->resource);
1208                 ast_free(order);
1209         }
1210
1211         AST_LIST_UNLOCK(&module_list);
1212
1213         /* Tell manager clients that are aggressive at logging in that we're done
1214            loading modules. If there's a DNS problem in chan_sip, we might not
1215            even reach this */
1216         /*** DOCUMENTATION
1217                 <managerEventInstance>
1218                         <synopsis>Raised when all dynamic modules have finished their initial loading.</synopsis>
1219                         <syntax>
1220                                 <parameter name="ModuleSelection">
1221                                         <enumlist>
1222                                                 <enum name="Preload"/>
1223                                                 <enum name="All"/>
1224                                         </enumlist>
1225                                 </parameter>
1226                         </syntax>
1227                 </managerEventInstance>
1228         ***/
1229         manager_event(EVENT_FLAG_SYSTEM, "ModuleLoadReport", "ModuleLoadStatus: Done\r\nModuleSelection: %s\r\nModuleCount: %d\r\n", preload_only ? "Preload" : "All", modulecount);
1230
1231         return res;
1232 }
1233
1234 void ast_update_use_count(void)
1235 {
1236         /* Notify any module monitors that the use count for a
1237            resource has changed */
1238         struct loadupdate *m;
1239
1240         AST_LIST_LOCK(&updaters);
1241         AST_LIST_TRAVERSE(&updaters, m, entry)
1242                 m->updater();
1243         AST_LIST_UNLOCK(&updaters);
1244 }
1245
1246 int ast_update_module_list(int (*modentry)(const char *module, const char *description, int usecnt, const char *status, const char *like),
1247                            const char *like)
1248 {
1249         struct ast_module *cur;
1250         int unlock = -1;
1251         int total_mod_loaded = 0;
1252
1253         if (AST_LIST_TRYLOCK(&module_list))
1254                 unlock = 0;
1255
1256         AST_LIST_TRAVERSE(&module_list, cur, entry) {
1257                 total_mod_loaded += modentry(cur->resource, cur->info->description, cur->usecount,
1258                                                 cur->flags.running ? "Running" : "Not Running", like);
1259         }
1260
1261         if (unlock)
1262                 AST_LIST_UNLOCK(&module_list);
1263
1264         return total_mod_loaded;
1265 }
1266
1267 /*! \brief Check if module exists */
1268 int ast_module_check(const char *name)
1269 {
1270         struct ast_module *cur;
1271
1272         if (ast_strlen_zero(name))
1273                 return 0;       /* FALSE */
1274
1275         cur = find_resource(name, 1);
1276
1277         return (cur != NULL);
1278 }
1279
1280
1281 int ast_loader_register(int (*v)(void))
1282 {
1283         struct loadupdate *tmp;
1284
1285         if (!(tmp = ast_malloc(sizeof(*tmp))))
1286                 return -1;
1287
1288         tmp->updater = v;
1289         AST_LIST_LOCK(&updaters);
1290         AST_LIST_INSERT_HEAD(&updaters, tmp, entry);
1291         AST_LIST_UNLOCK(&updaters);
1292
1293         return 0;
1294 }
1295
1296 int ast_loader_unregister(int (*v)(void))
1297 {
1298         struct loadupdate *cur;
1299
1300         AST_LIST_LOCK(&updaters);
1301         AST_LIST_TRAVERSE_SAFE_BEGIN(&updaters, cur, entry) {
1302                 if (cur->updater == v)  {
1303                         AST_LIST_REMOVE_CURRENT(entry);
1304                         break;
1305                 }
1306         }
1307         AST_LIST_TRAVERSE_SAFE_END;
1308         AST_LIST_UNLOCK(&updaters);
1309
1310         return cur ? 0 : -1;
1311 }
1312
1313 struct ast_module *ast_module_ref(struct ast_module *mod)
1314 {
1315         if (!mod) {
1316                 return NULL;
1317         }
1318
1319         ast_atomic_fetchadd_int(&mod->usecount, +1);
1320         ast_update_use_count();
1321
1322         return mod;
1323 }
1324
1325 void ast_module_unref(struct ast_module *mod)
1326 {
1327         if (!mod) {
1328                 return;
1329         }
1330
1331         ast_atomic_fetchadd_int(&mod->usecount, -1);
1332         ast_update_use_count();
1333 }