(root)/
glibc-2.38/
sysdeps/
pthread/
tst-_res1.c
       1  /* Copyright (C) 2003-2023 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  
      27  void *tf (void *resp)
      28  {
      29    if (resp == &_res || resp == __res_state ())
      30      abort ();
      31    _res.retry = 24;
      32    return NULL;
      33  }
      34  
      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  
      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  }