Fix some warnings in door.c
[kopensolaris-gnu/glibc.git] / dlfcn / tst-dlinfo.c
1 /* Test for dlinfo.
2    Copyright (C) 2003 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 <stdio.h>
22 #include <stdlib.h>
23 #include <error.h>
24
25 #define TEST_FUNCTION do_test ()
26
27 static int
28 do_test (void)
29 {
30   int status = 0;
31
32   void *handle = dlopen ("glreflib3.so", RTLD_NOW);
33   if (handle == NULL)
34     error (EXIT_FAILURE, 0, "cannot load: glreflib1.so: %s", dlerror ());
35
36 #define TRY(req, arg)                                                         \
37   if (dlinfo (handle, req, arg) != 0)                                         \
38     {                                                                         \
39       printf ("dlinfo failed for %s: %s\n", #req, dlerror ());                \
40       status = 1;                                                             \
41     }                                                                         \
42   else
43
44   struct link_map *l;
45   TRY (RTLD_DI_LINKMAP, &l)
46     {
47       if (l != handle)
48         {
49           printf ("bogus link_map? %p != %p\n", l, handle);
50           status = 1;
51         }
52     }
53
54   char origin[8192];            /* >= PATH_MAX, in theory */
55   TRY (RTLD_DI_ORIGIN, origin)
56     {
57       printf ("origin: %s\n", origin);
58     }
59
60   Dl_serinfo counts;
61   TRY (RTLD_DI_SERINFOSIZE, &counts)
62     {
63       Dl_serinfo *buf = alloca (counts.dls_size);
64       buf->dls_cnt = counts.dls_cnt;
65       buf->dls_size = counts.dls_size;
66       printf ("%u library directories\n", buf->dls_cnt);
67       TRY (RTLD_DI_SERINFO, buf)
68         {
69           if (counts.dls_cnt != buf->dls_cnt)
70             {
71               printf ("??? became %u library directories\n", buf->dls_cnt);
72               status = 1;
73             }
74           for (unsigned int i = 0; i < buf->dls_cnt; ++i)
75             printf ("\t%#02x\t%s\n",
76                     buf->dls_serpath[i].dls_flags,
77                     buf->dls_serpath[i].dls_name);
78         }
79     }
80
81   unsigned long int lmid = 0xdeadbeefUL;
82   if (dlinfo (handle, RTLD_DI_LMID, &lmid) != 0)
83     printf ("dlinfo refuses RTLD_DI_LMID: %s\n", dlerror ());
84   else
85     {
86       printf ("dlinfo RTLD_DI_LMID worked? %#lx\n", lmid);
87       status = lmid == 0xdeadbeefUL;
88     }
89
90 #undef TRY
91   dlclose (handle);
92
93   return status;
94 }
95
96 #include "../test-skeleton.c"