Fix some warnings in door.c
[kopensolaris-gnu/glibc.git] / dlfcn / dlvsym.c
1 /* Look up a versioned symbol in a shared object loaded by `dlopen'.
2    Copyright (C) 1995-2000, 2004 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <dlfcn.h>
21 #include <stddef.h>
22
23 #include <ldsodefs.h>
24
25 #if !defined SHARED && defined IS_IN_libdl
26
27 void *
28 weak_function
29 dlvsym (void *handle, const char *name, const char *version_str)
30 {
31   return __dlvsym (handle, name, version_str, RETURN_ADDRESS (0));
32 }
33
34 #else
35
36 struct dlvsym_args
37 {
38   /* The arguments to dlvsym_doit.  */
39   void *handle;
40   const char *name;
41   const char *version;
42   void *who;
43
44   /* The return values of dlvsym_doit.  */
45   void *sym;
46 };
47
48
49 static void
50 dlvsym_doit (void *a)
51 {
52   struct dlvsym_args *args = (struct dlvsym_args *)a;
53
54   args->sym = _dl_vsym (args->handle, args->name, args->version, args->who);
55 }
56
57 void *
58 __dlvsym (void *handle, const char *name, const char *version_str
59           DL_CALLER_DECL)
60 {
61 # ifdef SHARED
62   if (__builtin_expect (_dlfcn_hook != NULL, 0))
63     return _dlfcn_hook->dlvsym (handle, name, version_str, DL_CALLER);
64 # endif
65
66   struct dlvsym_args args;
67   args.handle = handle;
68   args.name = name;
69   args.who = DL_CALLER;
70   args.version = version_str;
71
72   /* Protect against concurrent loads and unloads.  */
73   __rtld_lock_lock_recursive (GL(dl_load_lock));
74
75   void *result = (_dlerror_run (dlvsym_doit, &args) ? NULL : args.sym);
76
77   __rtld_lock_unlock_recursive (GL(dl_load_lock));
78
79   return result;
80 }
81 # ifdef SHARED
82 weak_alias (__dlvsym, dlvsym)
83 # endif
84 #endif