Mercurial > hg > freeDiameter
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 |
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 |