annotate libfdcore/extensions.c @ 1327:82b386714795

Set callback data also when only setting expire callback (and not answer callback as well). It is used when calling the expire callback, so not setting it makes no sense.
author Thomas Klausner <tk@giga.or.at>
date Mon, 27 Nov 2017 15:21:20 +0100
parents b25ca6134bdc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
1 /*********************************************************************************************************
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
2 * Software License Agreement (BSD License) *
740
4a9f08d6b6ba Updated my mail address
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 732
diff changeset
3 * Author: Sebastien Decugis <sdecugis@freediameter.net> *
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
4 * *
1127
1af09cc156d6 Updated copyright information
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1120
diff changeset
5 * Copyright (c) 2013, WIDE Project and NICT *
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
6 * All rights reserved. *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
7 * *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
8 * Redistribution and use of this software in source and binary forms, with or without modification, are *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
9 * permitted provided that the following conditions are met: *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
10 * *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
11 * * Redistributions of source code must retain the above *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
12 * copyright notice, this list of conditions and the *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
13 * following disclaimer. *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
14 * *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
15 * * Redistributions in binary form must reproduce the above *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
16 * copyright notice, this list of conditions and the *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
17 * following disclaimer in the documentation and/or other *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
18 * materials provided with the distribution. *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
19 * *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
20 * * Neither the name of the WIDE Project or NICT nor the *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
21 * names of its contributors may be used to endorse or *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
22 * promote products derived from this software without *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
23 * specific prior written permission of WIDE Project and *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
24 * NICT. *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
25 * *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
27 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
28 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
32 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
34 *********************************************************************************************************/
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
35
658
f198d16fa7f4 Initial commit for 1.1.0:
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 287
diff changeset
36 #include "fdcore-internal.h"
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
37
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
38 #include <dlfcn.h> /* We may use libtool's <ltdl.h> later for better portability.... */
812
677c32c48668 Fix compilation warning due to missing header, reported by Thomas
Sebastien Decugis <sdecugis@freediameter.net>
parents: 740
diff changeset
39 #include <libgen.h> /* for "basename" */
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
40
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
41 /* plugins management */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
42
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
43 /* List of extensions to load, from the configuration parsing */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
44 struct fd_ext_info {
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
45 struct fd_list chain; /* link in the list */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
46 char *filename; /* extension filename. must be a dynamic library with fd_ext_init symbol. */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
47 char *conffile; /* optional configuration file name for the extension */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
48 void *handler; /* object returned by dlopen() */
732
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
49 const char **depends; /* names of the other extensions this one depends on (if provided) */
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
50 char *ext_name; /* points to the extension name, either inside depends, or basename(filename) */
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
51 int free_ext_name; /* must be freed if it was malloc'd */
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
52 void (*fini)(void); /* optional address of the fd_ext_fini callback */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
53 };
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
54
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
55 /* list of extensions */
14
14cf6daf716d Some progress on peers module
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 10
diff changeset
56 static struct fd_list ext_list = FD_LIST_INITIALIZER(ext_list);
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
57
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
58 /* Add new extension */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
59 int fd_ext_add( char * filename, char * conffile )
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
60 {
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
61 struct fd_ext_info * new;
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
62
706
4ffbc9f1e922 Large UNTESTED commit with the following changes:
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 695
diff changeset
63 TRACE_ENTRY("%p %p", filename, conffile);
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
64
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
65 /* Check the filename is valid */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
66 CHECK_PARAMS( filename );
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
67
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
68 /* Create a new object in the list */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
69 CHECK_MALLOC( new = malloc( sizeof(struct fd_ext_info) ) );
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
70 memset(new, 0, sizeof(struct fd_ext_info));
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
71 fd_list_init(&new->chain, NULL);
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
72 new->filename = filename;
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
73 new->conffile = conffile;
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
74 fd_list_insert_before( &ext_list, &new->chain );
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
75 TRACE_DEBUG (FULL, "Extension %s added to the list.", filename);
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
76 return 0;
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
77 }
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
78
10
c5c99c73c2bf Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 9
diff changeset
79 /* Dump the list */
1220
cec3e9b579e1 Cleanup parameter that has become useless
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1218
diff changeset
80 DECLARE_FD_DUMP_PROTOTYPE(fd_ext_dump)
10
c5c99c73c2bf Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 9
diff changeset
81 {
c5c99c73c2bf Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 9
diff changeset
82 struct fd_list * li;
1094
eab8cad30b4c Additional cosmetics
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1093
diff changeset
83 FD_DUMP_HANDLE_OFFSET();
10
c5c99c73c2bf Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 9
diff changeset
84
1242
b25ca6134bdc Fix configuration dump when no extension is loaded
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1220
diff changeset
85 if (FD_IS_LIST_EMPTY(&ext_list)) {
b25ca6134bdc Fix configuration dump when no extension is loaded
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1220
diff changeset
86 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "-none-"), return NULL);
b25ca6134bdc Fix configuration dump when no extension is loaded
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1220
diff changeset
87 } else {
b25ca6134bdc Fix configuration dump when no extension is loaded
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1220
diff changeset
88 for (li = ext_list.next; li != &ext_list; li = li->next)
b25ca6134bdc Fix configuration dump when no extension is loaded
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1220
diff changeset
89 {
b25ca6134bdc Fix configuration dump when no extension is loaded
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1220
diff changeset
90 struct fd_ext_info * ext = (struct fd_ext_info *)li;
b25ca6134bdc Fix configuration dump when no extension is loaded
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1220
diff changeset
91 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "'%s'[%s], %sloaded%s",
b25ca6134bdc Fix configuration dump when no extension is loaded
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1220
diff changeset
92 ext->filename,
b25ca6134bdc Fix configuration dump when no extension is loaded
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1220
diff changeset
93 ext->conffile?:"(no config file)",
b25ca6134bdc Fix configuration dump when no extension is loaded
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1220
diff changeset
94 ext->handler ? "" : "not ", (li->next == &ext_list) ? "":"\n"), return NULL);
b25ca6134bdc Fix configuration dump when no extension is loaded
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1220
diff changeset
95 }
10
c5c99c73c2bf Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 9
diff changeset
96 }
1085
7d7266115a34 Cleaning of the traces in progress
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1006
diff changeset
97 return *buf;
10
c5c99c73c2bf Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 9
diff changeset
98 }
c5c99c73c2bf Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 9
diff changeset
99
732
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
100 /* Check the dependencies. The object must have been dlopened already. */
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
101 static int check_dependencies(struct fd_ext_info * ext)
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
102 {
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
103 int i = 1;
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
104 TRACE_ENTRY( "%p", ext );
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
105
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
106 /* Attempt to resolve the dependency array */
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
107 ext->depends = dlsym( ext->handler, "fd_ext_depends" );
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
108 if (!ext->depends) {
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
109 /* Duplicate the filename */
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
110 char * tmp = strdup(ext->filename);
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
111 ext->ext_name = strdup(basename(tmp));
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
112 free(tmp);
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
113 ext->free_ext_name = 1;
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
114 TRACE_DEBUG(FULL, "Old extension's [%s] API: missing dependencies (ignored)", ext->ext_name);
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
115 return 0;
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
116 }
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
117
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
118 ext->ext_name = (char *)ext->depends[0];
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
119
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
120 TRACE_DEBUG(FULL, "Checking dependencies for '%s'...", ext->ext_name);
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
121
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
122 while (ext->depends[i]) {
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
123 struct fd_list * li;
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
124 for (li = ext_list.next; li != &ext->chain; li = li->next)
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
125 {
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
126 struct fd_ext_info * e = (struct fd_ext_info *)li;
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
127 if (!strcasecmp(e->ext_name, ext->depends[i])) {
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
128 /* the dependency was already loaded */
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
129 break;
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
130 }
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
131 }
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
132
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
133 if (li == &ext->chain) {
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
134 /* the dependency was not found */
1144
799323958f02 Use FATAL level for extensions dependency problems
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1127
diff changeset
135 LOG_F("Error: extension [%s] depends on [%s] which was not loaded first. Please fix your configuration file.",
732
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
136 ext->ext_name, ext->depends[i]);
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
137 return ESRCH;
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
138 }
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
139
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
140 i++;
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
141 }
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
142
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
143 /* All dependencies resolved successfully */
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
144 return 0;
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
145 }
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
146
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
147 /* Load all extensions in the list */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
148 int fd_ext_load()
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
149 {
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
150 int ret;
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
151 int (*fd_ext_init)(int, int, char *) = NULL;
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
152 struct fd_list * li;
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
153
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
154 TRACE_ENTRY();
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
155
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
156 /* Loop on all extensions */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
157 for (li = ext_list.next; li != &ext_list; li = li->next)
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
158 {
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
159 struct fd_ext_info * ext = (struct fd_ext_info *)li;
1113
eb4ce68b6e5c Added calls to remaining hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1094
diff changeset
160 LOG_D( "Loading : %s", ext->filename);
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
161
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
162 /* Load the extension */
9
fc7c18867cf7 New extension mechanism committed
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 8
diff changeset
163 #ifndef DEBUG
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
164 ext->handler = dlopen(ext->filename, RTLD_LAZY | RTLD_GLOBAL);
9
fc7c18867cf7 New extension mechanism committed
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 8
diff changeset
165 #else /* DEBUG */
706
4ffbc9f1e922 Large UNTESTED commit with the following changes:
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 695
diff changeset
166 /* We resolve symbols immediatly so it's easier to find problems in ABI */
9
fc7c18867cf7 New extension mechanism committed
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 8
diff changeset
167 ext->handler = dlopen(ext->filename, RTLD_NOW | RTLD_GLOBAL);
fc7c18867cf7 New extension mechanism committed
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 8
diff changeset
168 #endif /* DEBUG */
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
169 if (ext->handler == NULL) {
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
170 /* An error occured */
1113
eb4ce68b6e5c Added calls to remaining hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1094
diff changeset
171 LOG_F("Loading of extension %s failed: %s", ext->filename, dlerror());
732
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
172 ext->handler = dlopen(ext->filename, RTLD_LAZY | RTLD_GLOBAL);
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
173 if (ext->handler) {
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
174 if (!check_dependencies(ext)) {
1144
799323958f02 Use FATAL level for extensions dependency problems
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1127
diff changeset
175 LOG_F("In addition, not all declared dependencies are satisfied (Internal Error!)");
732
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
176 }
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
177 }
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
178 return EINVAL;
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
179 }
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
180
732
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
181 /* Check if declared dependencies are satisfied. */
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
182 CHECK_FCT( check_dependencies(ext) );
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
183
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
184 /* Resolve the entry point of the extension */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
185 fd_ext_init = ( int (*) (int, int, char *) )dlsym( ext->handler, "fd_ext_init" );
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
186
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
187 if (fd_ext_init == NULL) {
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
188 /* An error occured */
1006
6ce8322f3b78 Report an error if a problem is big enough to break startup.
Thomas Klausner <tk@giga.or.at>
parents: 974
diff changeset
189 TRACE_ERROR("Unable to resolve symbol 'fd_ext_init' for extension %s: %s", ext->filename, dlerror());
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
190 return EINVAL;
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
191 }
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
192
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
193 /* Resolve the exit point of the extension, which is optional for extensions */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
194 ext->fini = ( void (*) (void) )dlsym( ext->handler, "fd_ext_fini" );
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
195
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
196 if (ext->fini == NULL) {
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
197 /* Not provided */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
198 TRACE_DEBUG (FULL, "Extension [%s] has no fd_ext_fini function.", ext->filename);
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
199 } else {
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
200 /* Provided */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
201 TRACE_DEBUG (FULL, "Extension [%s] fd_ext_fini has been resolved successfully.", ext->filename);
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
202 }
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
203
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
204 /* Now call the entry point to initialize the extension */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
205 ret = (*fd_ext_init)( FD_PROJECT_VERSION_MAJOR, FD_PROJECT_VERSION_MINOR, ext->conffile );
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
206 if (ret != 0) {
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
207 /* The extension was unable to load cleanly */
1006
6ce8322f3b78 Report an error if a problem is big enough to break startup.
Thomas Klausner <tk@giga.or.at>
parents: 974
diff changeset
208 TRACE_ERROR("Extension %s returned an error during initialization: %s", ext->filename, strerror(ret));
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
209 return ret;
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
210 }
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
211
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
212 /* Proceed to the next extension */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
213 }
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
214
1113
eb4ce68b6e5c Added calls to remaining hooks
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1094
diff changeset
215 LOG_N("All extensions loaded.");
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
216
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
217 /* We have finished. */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
218 return 0;
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
219 }
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
220
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
221 /* Now unload the extensions and free the memory */
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 14
diff changeset
222 int fd_ext_term( void )
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
223 {
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
224 TRACE_ENTRY();
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
225
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
226 /* Loop on all extensions, in FIFO order */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
227 while (!FD_IS_LIST_EMPTY(&ext_list))
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
228 {
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
229 struct fd_list * li = ext_list.next;
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
230 struct fd_ext_info * ext = (struct fd_ext_info *)li;
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
231
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
232 /* Unlink this element from the list */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
233 fd_list_unlink(li);
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
234
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
235 /* Call the exit point of the extension, if it was resolved */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
236 if (ext->fini != NULL) {
732
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
237 TRACE_DEBUG (FULL, "Calling [%s]->fd_ext_fini function.", ext->ext_name ?: ext->filename);
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
238 (*ext->fini)();
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
239 }
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
240
695
712a0bb8d3bf Add ability to skip dlclose() calls since it creates problems on FreeBSD8.1 64bits
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 662
diff changeset
241 #ifndef SKIP_DLCLOSE
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
242 /* Now unload the extension */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
243 if (ext->handler) {
732
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
244 TRACE_DEBUG (FULL, "Unloading %s", ext->ext_name ?: ext->filename);
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
245 if ( dlclose(ext->handler) != 0 ) {
974
2091bf698fb1 Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents: 837
diff changeset
246 TRACE_DEBUG (INFO, "Unloading [%s] failed : %s", ext->ext_name ?: ext->filename, dlerror());
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
247 }
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
248 }
695
712a0bb8d3bf Add ability to skip dlclose() calls since it creates problems on FreeBSD8.1 64bits
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 662
diff changeset
249 #endif /* SKIP_DLCLOSE */
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
250
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
251 /* Free the object and continue */
732
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
252 if (ext->free_ext_name)
4a0b61061a6d Added simple mechanism to declare dependencies between extensions
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 706
diff changeset
253 free(ext->ext_name);
8
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
254 free(ext->filename);
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
255 free(ext->conffile);
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
256 free(ext);
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
257 }
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
258
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
259 /* We always return 0 since we would not handle an error anyway... */
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
260 return 0;
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
261 }
3e143f047f78 Backup for the week-end
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
262
"Welcome to our mercurial repository"