patches/glibc/2.9/250-resolv-dynamic.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Oct 03 23:10:46 2010 +0200 (2010-10-03)
changeset 2130 b46ecc90d3ab
parent 1201 c9967a6e3b25
permissions -rw-r--r--
complibs: better deduce whether to backup complibs or not

To decide whether we need to backup the companion libraries,
do not rely on the !shared case. In the future other cases
may require not to save the companion libraries (eg. if using
the ones provided by the host distro).

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
     1 Original patch from: gentoo/src/patchsets/glibc/2.9/1055_all_glibc-resolv-dynamic.patch
     2 
     3 -= BEGIN original header =-
     4 ripped from SuSE
     5 
     6 if /etc/resolv.conf is updated, then make sure applications
     7 already running get the updated information.
     8 
     9 http://bugs.gentoo.org/177416
    10 
    11 -= END original header =-
    12 
    13 diff -durN glibc-2_9.orig/resolv/res_libc.c glibc-2_9/resolv/res_libc.c
    14 --- glibc-2_9.orig/resolv/res_libc.c	2006-10-11 10:59:28.000000000 +0200
    15 +++ glibc-2_9/resolv/res_libc.c	2009-02-02 22:00:57.000000000 +0100
    16 @@ -22,6 +22,7 @@
    17  #include <arpa/nameser.h>
    18  #include <resolv.h>
    19  #include <bits/libc-lock.h>
    20 +#include <sys/stat.h>
    21  
    22  
    23  /* The following bit is copied from res_data.c (where it is #ifdef'ed
    24 @@ -95,6 +96,20 @@
    25  __res_maybe_init (res_state resp, int preinit)
    26  {
    27  	if (resp->options & RES_INIT) {
    28 +		static time_t last_mtime, last_check;
    29 +		time_t now;
    30 +		struct stat statbuf;
    31 +		
    32 +		time (&now);
    33 +		if (now != last_check) {
    34 +			last_check = now;
    35 +			if (stat (_PATH_RESCONF, &statbuf) == 0 && last_mtime != statbuf.st_mtime) {
    36 +				last_mtime = statbuf.st_mtime;
    37 +				atomicinclock (lock);
    38 +				atomicinc (__res_initstamp);
    39 +				atomicincunlock (lock);
    40 +			}
    41 +		}
    42  		if (__res_initstamp != resp->_u._ext.initstamp) {
    43  			if (resp->nscount > 0) {
    44  				__res_iclose (resp, true);