Back to index

glibc  2.9
tst-_res1.c
Go to the documentation of this file.
00001 /* Copyright (C) 2003 Free Software Foundation, Inc.
00002    This file is part of the GNU C Library.
00003    Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
00004 
00005    The GNU C Library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Lesser General Public
00007    License as published by the Free Software Foundation; either
00008    version 2.1 of the License, or (at your option) any later version.
00009 
00010    The GNU C Library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Lesser General Public License for more details.
00014 
00015    You should have received a copy of the GNU Lesser General Public
00016    License along with the GNU C Library; if not, write to the Free
00017    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00018    02111-1307 USA.  */
00019 
00020 /* Test whether _res in glibc 2.1.x and earlier (before __res_state()
00021    was introduced) works.  Portable programs should never do the
00022    dirty things below.  */
00023 
00024 #include <pthread.h>
00025 #include <resolv.h>
00026 #include <stdlib.h>
00027 #include <stdio.h>
00028 
00029 void *tf (void *resp)
00030 {
00031   if (resp == &_res || resp == __res_state ())
00032     abort ();
00033   _res.retry = 24;
00034   return NULL;
00035 }
00036 
00037 void do_test (struct __res_state *resp)
00038 {
00039   if (resp != &_res || resp != __res_state ())
00040     abort ();
00041   if (_res.retry != 12)
00042     abort ();
00043 }
00044 
00045 int main (void)
00046 {
00047 #undef _res
00048   extern struct __res_state _res;
00049   pthread_t th;
00050 
00051   _res.retry = 12;
00052   if (pthread_create (&th, NULL, tf, &_res) != 0)
00053     {
00054       puts ("create failed");
00055       exit (1);
00056     }
00057 
00058   do_test (&_res);
00059 
00060   if (pthread_join (th, NULL) != 0)
00061     {
00062       puts ("join failed");
00063       exit (1);
00064     }
00065 
00066   do_test (&_res);
00067 
00068   exit (0);
00069 }