initial import of gmodule.
[platform/upstream/glib.git] / gmodule / testgmodule.c
1 /* testgmodule.c - test program for GMODULE
2  * Copyright (C) 1998 Tim Janik
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19 #include        <gmodule.h>
20
21
22 void
23 g_clash_func (void)
24 {
25   g_print ("GModule: Hello global clash\n");
26 }
27
28 typedef void (*SimpleFunc) (void);
29 typedef void (*GModuleFunc) (GModule *);
30
31 SimpleFunc gplugin_clash_func;
32
33      
34 int
35 main (int   arg,
36       char *argv[])
37 {
38   GModule *module_self, *module_a, *module_b;
39   gchar *string;
40   gchar *plugin_a, *plugin_b;
41   SimpleFunc f_a, f_b, f_self;
42   GModuleFunc gmod_f;
43
44   string = g_get_current_dir ();
45   g_print ("testgmodule (%s):\n", string);
46
47   plugin_a = g_strconcat (string, "/.libs/", "libgplugin_a.so", NULL);
48   plugin_b = g_strconcat (string, "/.libs/", "libgplugin_b.so", NULL);
49   g_free (string);
50
51   /* module handles
52    */
53   g_print ("get main module handle\n");
54   module_self = g_module_open (NULL, G_MODULE_BIND_LAZY);
55   if (!module_self)
56     {
57       g_print ("error: %s\n", g_module_error ());
58       return 1;
59     }
60   g_print ("load plugin from \"%s\"\n", plugin_a);
61   module_a = g_module_open (plugin_a, G_MODULE_BIND_LAZY);
62   if (!module_a)
63     {
64       g_print ("error: %s\n", g_module_error ());
65       return 1;
66     }
67   g_print ("load plugin from \"%s\"\n", plugin_b);
68   module_b = g_module_open (plugin_b, G_MODULE_BIND_LAZY);
69   if (!module_b)
70     {
71       g_print ("error: %s\n", g_module_error ());
72       return 1;
73     }
74
75   /* get plugin specific symbols and call them
76    */
77   string = "gplugin_a_func";
78   g_print ("retrive symbol `%s' from \"%s\"\n", string, g_basename (g_module_name (module_a)));
79   if (!g_module_symbol (module_a, string, &f_a))
80     {
81       g_print ("error: %s\n", g_module_error ());
82       return 1;
83     }
84   string = "gplugin_b_func";
85   g_print ("retrive symbol `%s' from \"%s\"\n", string, g_basename (g_module_name (module_b)));
86   if (!g_module_symbol (module_b, string, &f_b))
87     {
88       g_print ("error: %s\n", g_module_error ());
89       return 1;
90     }
91   g_print ("call plugin function(%p) A: ", f_a);
92   f_a ();
93   g_print ("call plugin function(%p) B: ", f_b);
94   f_b ();
95
96   /* get and call globally clashing functions
97    */
98   string = "g_clash_func";
99   g_print ("retrive symbol `%s' from \"%s\"\n", string, g_basename (g_module_name (module_self)));
100   if (!g_module_symbol (module_self, string, &f_self))
101     {
102       g_print ("error: %s\n", g_module_error ());
103       return 1;
104     }
105   g_print ("retrive symbol `%s' from \"%s\"\n", string, g_basename (g_module_name (module_a)));
106   if (!g_module_symbol (module_a, string, &f_a))
107     {
108       g_print ("error: %s\n", g_module_error ());
109       return 1;
110     }
111   g_print ("retrive symbol `%s' from \"%s\"\n", string, g_basename (g_module_name (module_b)));
112   if (!g_module_symbol (module_b, string, &f_b))
113     {
114       g_print ("error: %s\n", g_module_error ());
115       return 1;
116     }
117   g_print ("call plugin function(%p) self: ", f_self);
118   f_self ();
119   g_print ("call plugin function(%p) A: ", f_a);
120   f_a ();
121   g_print ("call plugin function(%p) B: ", f_b);
122   f_b ();
123
124   /* get and call clashing plugin functions
125    */
126   string = "gplugin_clash_func";
127   g_print ("retrive symbol `%s' from \"%s\"\n", string, g_basename (g_module_name (module_a)));
128   if (!g_module_symbol (module_a, string, &f_a))
129     {
130       g_print ("error: %s\n", g_module_error ());
131       return 1;
132     }
133   g_print ("retrive symbol `%s' from \"%s\"\n", string, g_basename (g_module_name (module_b)));
134   if (!g_module_symbol (module_b, string, &f_b))
135     {
136       g_print ("error: %s\n", g_module_error ());
137       return 1;
138     }
139   g_print ("call plugin function(%p) A: ", f_a);
140   gplugin_clash_func = f_a;
141   gplugin_clash_func ();
142   g_print ("call plugin function(%p) B: ", f_b);
143   gplugin_clash_func = f_b;
144   gplugin_clash_func ();
145
146   /* call gmodule function form A
147    */
148   string = "gplugin_a_module_func";
149   g_print ("retrive symbol `%s' from \"%s\"\n", string, g_basename (g_module_name (module_a)));
150   if (!g_module_symbol (module_a, string, &gmod_f))
151     {
152       g_print ("error: %s\n", g_module_error ());
153       return 1;
154     }
155   g_print ("call plugin A's module function(%p):\n{\n", gmod_f);
156   gmod_f (module_b);
157   g_print ("}\n");
158
159   
160   /* unload plugins
161    */
162   g_print ("unload plugin A:\n");
163   if (!g_module_close (module_a))
164     g_print ("error: %s\n", g_module_error ());
165   g_print ("unload plugin B:\n");
166   if (!g_module_close (module_b))
167     g_print ("error: %s\n", g_module_error ());
168
169   return 0;
170 }