1 /* Copyright (C) 2003-2022 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C 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    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
17 
18 /* Test whether _res in glibc 2.1.x and earlier (before __res_state()
19    was introduced) works.  Portable programs should never do the
20    dirty things below.  */
21 
22 #include <pthread.h>
23 #include <resolv.h>
24 #include <stdlib.h>
25 #include <stdio.h>
26 
tf(void * resp)27 void *tf (void *resp)
28 {
29   if (resp == &_res || resp == __res_state ())
30     abort ();
31   _res.retry = 24;
32   return NULL;
33 }
34 
do_test(struct __res_state * resp)35 void do_test (struct __res_state *resp)
36 {
37   if (resp != &_res || resp != __res_state ())
38     abort ();
39   if (_res.retry != 12)
40     abort ();
41 }
42 
main(void)43 int main (void)
44 {
45 #undef _res
46   extern struct __res_state _res;
47   pthread_t th;
48 
49   _res.retry = 12;
50   if (pthread_create (&th, NULL, tf, &_res) != 0)
51     {
52       puts ("create failed");
53       exit (1);
54     }
55 
56   do_test (&_res);
57 
58   if (pthread_join (th, NULL) != 0)
59     {
60       puts ("join failed");
61       exit (1);
62     }
63 
64   do_test (&_res);
65 
66   exit (0);
67 }
68