#! /bin/sh # # The script is created for Cygnus by vmakarov@cygnus.com and based on # fixinc.wrap # # This script is designed for x86 with gnulibc of version 2.0 and less # for solution of problems with invalid asm-statements by creating # small wrappers around the include files containg the asm-statements. # # See README-fixinc for more information. # Directory in which to store the results. LIB=${1?"fixincludes: output directory not specified"} # Make sure it exists. if [ ! -d $LIB ]; then mkdir $LIB || exit 1 fi # Make LIB absolute if it is relative. # Don't do this if not necessary, since may screw up automounters. case $LIB in /*) ;; *) cd $LIB; LIB=`${PWDCMD-pwd}` ;; esac echo Building fixed headers in ${LIB} file=selectbits.h echo Fixed $file for glibc-2.0.x rm -f $LIB/$file cat <<'__EOF__' >$LIB/$file /* This file fixes __FD_ZERO bug for glibc-2.0.x. */ #ifndef _SELECTBITS_H_WRAPPER #include #include_next #if defined(__FD_ZERO) && defined(__GLIBC__) && defined(__GLIBC_MINOR__) && __GLIBC__ == 2 && __GLIBC_MINOR__ == 0 #undef __FD_ZERO #define __FD_ZERO(fdsetp) \ do { \ int __d0, __d1; \ __asm__ __volatile__ ("cld; rep; stosl" \ : "=m" (((__fd_mask *) \ (fdsetp))[__FDELT (__FD_SETSIZE)]), \ "=&c" (__d0), "=&D" (__d1) \ : "a" (0), "1" (sizeof (__fd_set) \ / sizeof (__fd_mask)), \ "2" ((__fd_mask *) (fdsetp)) \ : "memory"); \ } while (0) #endif #define _SELECTBITS_H_WRAPPER #endif /* _SELECTBITS_H_WRAPPER */ __EOF__ # Define _SELECTBITS_H_WRAPPER at the end of the wrapper, not # the start, so that if #include_next gets another instance of # the wrapper, this will follow the #include_next chain until # we arrive at the real . chmod a+r $LIB/$file # asm/posix_types.h for libc version 1.x file=asm/posix_types.h echo Fixed $file for glibc-1.x rm -f $LIB/$file dir=`dirname $LIB/$file` if [ ! -d $dir ]; then mkdir -p $dir || exit 1 fi cat <<'__EOF__' >$LIB/$file /* This file fixes __FD_ZERO bug for glibc-1.x. */ #ifndef _POSIX_TYPES_H_WRAPPER #include #include_next #if defined(__FD_ZERO) && !defined(__GLIBC__) #undef __FD_ZERO #define __FD_ZERO(fdsetp) \ do { \ int __d0, __d1; \ __asm__ __volatile__("cld ; rep ; stosl" \ : "=m" (*(__kernel_fd_set *) (fdsetp)), \ "=&c" (__d0), "=&D" (__d1) \ : "a" (0), "1" (__FDSET_LONGS), \ "2" ((__kernel_fd_set *) (fdsetp)) :"memory"); \ } while (0) #endif #define _POSIX_TYPES_H_WRAPPER #endif /* _POSIX_TYPES_H_WRAPPER */ __EOF__ # Define _POSIX_TYPES_H_WRAPPER at the end of the wrapper, not # the start, so that if #include_next gets another instance of # the wrapper, this will follow the #include_next chain until # we arrive at the real . chmod a+r $LIB/$file # gnu/types.h for libc version 1.x file=gnu/types.h echo Fixed $file for glibc-1.x rm -f $LIB/$file dir=`dirname $LIB/$file` if [ ! -d $dir ]; then mkdir -p $dir || exit 1 fi cat <<'__EOF__' >$LIB/$file /* This file fixes __FD_ZERO bug for glibc-1.x. */ #ifndef _TYPES_H_WRAPPER #include #include_next #if defined(__FD_ZERO) && !defined(__GLIBC__) #undef __FD_ZERO # define __FD_ZERO(fdsetp) \ do { \ int __d0, __d1; \ __asm__ __volatile__("cld ; rep ; stosl" \ : "=m" (*(__fd_set *) (fdsetp)), \ "=&c" (__d0), "=&D" (__d1) \ : "a" (0), "1" (__FDSET_LONGS), \ "2" ((__fd_set *) (fdsetp)) :"memory"); \ } while (0) #endif #define _TYPES_H_WRAPPER #endif /* _TYPES_H_WRAPPER */ __EOF__ # Define _TYPES_H_WRAPPER at the end of the wrapper, not the start, # so that if #include_next gets another instance of the wrapper, # this will follow the #include_next chain until we arrive at # the real . chmod a+r $LIB/$file exit 0