1#! /bin/sh
2#
3# The script is created for Cygnus by vmakarov@cygnus.com and based on
4# fixinc.wrap
5#
6# This script is designed for x86 with gnulibc of version 2.0 and less
7# for solution of problems with invalid asm-statements by creating
8# small wrappers around the include files containg the asm-statements.
9#
10# See README-fixinc for more information.
11
12
13# Directory in which to store the results.
14LIB=${1?"fixincludes: output directory not specified"}
15
16# Make sure it exists.
17if [ ! -d $LIB ]; then
18  mkdir $LIB || exit 1
19fi
20
21# Make LIB absolute if it is relative.
22# Don't do this if not necessary, since may screw up automounters.
23case $LIB in
24/*)
25	;;
26*)
27	cd $LIB; LIB=`${PWDCMD-pwd}`
28	;;
29esac
30
31echo Building fixed headers in ${LIB}
32  
33file=selectbits.h
34echo Fixed $file for glibc-2.0.x
35rm -f $LIB/$file
36cat <<'__EOF__' >$LIB/$file
37/* This file fixes __FD_ZERO bug for glibc-2.0.x. */
38#ifndef _SELECTBITS_H_WRAPPER
39#include <features.h>
40#include_next <selectbits.h>
41
42#if defined(__FD_ZERO) && defined(__GLIBC__) && defined(__GLIBC_MINOR__) && __GLIBC__ == 2 && __GLIBC_MINOR__ == 0
43#undef __FD_ZERO
44#define __FD_ZERO(fdsetp) \
45  do { \
46    int __d0, __d1; \
47  __asm__ __volatile__ ("cld; rep; stosl" \
48                        : "=&c" (__d0), "=&D" (__d1) \
49                        : "a" (0), "0" (sizeof (__fd_set) \
50                                        / sizeof (__fd_mask)), \
51                          "1" ((__fd_mask *) (fdsetp)) \
52                        : "memory"); \
53  } while (0)
54#endif
55
56#define _SELECTBITS_H_WRAPPER
57#endif /* _SELECTBITS_H_WRAPPER */
58__EOF__
59# Define _SELECTBITS_H_WRAPPER at the end of the wrapper, not
60# the start, so that if #include_next gets another instance of
61# the wrapper, this will follow the #include_next chain until
62# we arrive at the real <selectbits.h>.
63chmod a+r $LIB/$file
64
65# asm/posix_types.h for libc version 1.x
66file=asm/posix_types.h
67echo Fixed $file for glibc-1.x
68rm -f $LIB/$file
69dir=`dirname $LIB/$file`
70if [ ! -d $dir ]; then
71  mkdir -p $dir || exit 1
72fi
73cat <<'__EOF__' >$LIB/$file
74/* This file fixes __FD_ZERO bug for glibc-1.x. */
75#ifndef _POSIX_TYPES_H_WRAPPER
76#include <features.h>
77#include_next <asm/posix_types.h>
78
79#if defined(__FD_ZERO) && !defined(__GLIBC__)
80#undef __FD_ZERO
81#define __FD_ZERO(fdsetp) \
82  do { \
83    int __d0, __d1; \
84		__asm__ __volatile__("cld ; rep ; stosl" \
85			: "=&c" (__d0), "=&D" (__d1) \
86			: "a" (0), "0" (__FDSET_LONGS), \
87			  "1" ((__kernel_fd_set *) (fdsetp)) :"memory"); \
88  } while (0)
89#endif
90
91#define _POSIX_TYPES_H_WRAPPER
92#endif /* _POSIX_TYPES_H_WRAPPER */
93__EOF__
94# Define _POSIX_TYPES_H_WRAPPER at the end of the wrapper, not
95# the start, so that if #include_next gets another instance of
96# the wrapper, this will follow the #include_next chain until
97# we arrive at the real <asm/posix_types.h>.
98chmod a+r $LIB/$file
99
100# gnu/types.h for libc version 1.x
101file=gnu/types.h
102echo Fixed $file for glibc-1.x
103rm -f $LIB/$file
104dir=`dirname $LIB/$file`
105if [ ! -d $dir ]; then
106  mkdir -p $dir || exit 1
107fi
108cat <<'__EOF__' >$LIB/$file
109/* This file fixes __FD_ZERO bug for glibc-1.x. */
110#ifndef _TYPES_H_WRAPPER
111#include <features.h>
112#include_next <gnu/types.h>
113
114#if defined(__FD_ZERO) && !defined(__GLIBC__)
115#undef __FD_ZERO
116# define __FD_ZERO(fdsetp) \
117  do { \
118    int __d0, __d1; \
119	__asm__ __volatile__("cld ; rep ; stosl" \
120        	: "=&c" (__d0), "=&D" (__d1) \
121        	: "a" (0), "0" (__FDSET_LONGS), \
122		  "1" ((__fd_set *) (fdsetp)) :"memory"); \
123  } while (0)
124#endif
125
126#define _TYPES_H_WRAPPER
127#endif /* _TYPES_H_WRAPPER */
128__EOF__
129# Define _TYPES_H_WRAPPER at the end of the wrapper, not the start,
130# so that if #include_next gets another instance of the wrapper,
131# this will follow the #include_next chain until we arrive at
132# the real <gnu/types.h>.
133chmod a+r $LIB/$file
134
135if [ x${INSTALL_ASSERT_H} != x ]
136then
137  cd ${ORIG_DIR}
138  rm -f include/assert.h
139  cp ${srcdir}/assert.h include/assert.h || exit 1
140  chmod a+r include/assert.h
141fi
142
143exit 0
144