annotate libfdcore/extensions.c @ 1562:6219359a36a9 default tip

Merge latest changes from proposed branch
author Sebastien Decugis <sdecugis@freediameter.net>
date Mon, 21 Jun 2021 19:08:18 +0800
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"