Browse Source

Update status of reentrance support

Eric Andersen 22 years ago
parent
commit
d9ae112a70
1 changed files with 33 additions and 2156 deletions
  1. 33 2156
      docs/threads.txt

+ 33 - 2156
docs/threads.txt

@@ -1,2187 +1,64 @@
 uClibc thread-safety analysis
-By Steve Thayer <sthayer@coactive.com>
-with updates by Erik Andersen <andersee@debian.org>
 
-Introduction:
+Things that are still known to be needed for thread safety:
 
-The purpose of this document is to identify the things that need to be done
-to the uClibc C library in order to make it thread-safe.  The goal is to be
-able to use a pthreads thread implementation under uClinux, using the uClibc
-C library.  To help identify the things that require changing, I used David R.
-Butenhof's book Programming With POSIX Threads, the source code for the
-glibc 2.1.3 C library, and the source code for the C library included in the
-Proventhreads distribution.
+        getgrgid_r		<not implemented, required by SuSv3>
+        getgrnam_r		<not implemented, required by SuSv3>
 
-References:
 
-Butenhof, David R., Programming With POSIX Threads,  Addison Wesley Longman, Inc., Reading, MA, ISBN 0-201-63392-2, 1997.
 
 
-The GNU C library is available from the Free Software Foundation 
-http://www.gnu.org/software/libc/libc.html
 
-Proventhreads is part of the Inferno Operating system.
-http://www.vitanuova.com/inferno/index.html
+Things that might be nice, but are not required:
 
+        gethostent_r            <desired, but not required for SuSv3>
+        getnetbyaddr_r          <desired, but not required for SuSv3>
+        getnetent_r             <desired, but not required for SuSv3>
+        getnetbyname_r          <desired, but not required for SuSv3>
+        getprotobynumber_r      <desired, but not required for SuSv3>
+        getprotoent_r           <desired, but not required for SuSv3>
+        getprotobyname_r        <desired, but not required for SuSv3>
+        getnetbyaddr_r          <desired, but not required for SuSv3>
+        getnetbyname_r          <desired, but not required for SuSv3>
+        getnetent_r             <desired, but not required for SuSv3>
+        getprotobynumber_r      <desired, but not required for SuSv3>
+        getprotoent_r           <desired, but not required for SuSv3>
+        getprotobyname_r        <desired, but not required for SuSv3>
 
-1. Stdio:
 
-1.1 Buffer access mutexes
 
-        The following functions are required in order to protect shared
-        I/O buffers from being accessed by more than one thread at a time.
-        None of these functions are currently implemented in the uClibc
-        library, so they must be added.
+Functions that use static data and may still need locking:
 
-        flockfile               <implemented>
-        ftrylockfile            <implemented>
-        funlockfile             <implemented>
 
-1.2 Functions that must use buffer access mutexes, according to Butenhof
-
-        The following functions are identified by Butenhof as needing to use
-        buffer access mutexes.  This does not represent all functions that
-        need to use the mutexes.
-
-        getc                    <mutex required>
-        getchar                 <mutex required>
-        putc                    <mutex required>
-        putchar                 <mutex required>
-
-1.3 Functions from glibc (libio) that use buffer access mutexes
-
-        The following functions are functions found in glibc that currently
-        use the buffer access mutexes.  Comments in brackets represent
-        status of uClibc with regard to these functions.  Most of these
-        functions aren't even supported under uClibc, so no work is required.
-        The rest may require the access mutex. (These must be analyzed on a
-        case-by-case basis.)
-
-        clearerr                <mutex required>
-        feof                    <mutex required>
-        ferror                  <mutex required>
-        fputc                   <mutex required>
-        fputwc                  <not supported>
-        freopen                 <mutex required>
-        freopen64               <mutex required>
-        fseek                   <mutex required>
-        fseeko                  <mutex required>
-        fseeko64                <mutex required>
-        ftello                  <mutex required>
-        ftello64                <mutex required>
-        fwide                   <not supported>
-        getc                    <mutex required>
-        getchar                 <mutex required>
-        getwc                   <not supported>
-        getwchar                <not supported>
-        iofclose                <not supported>
-        iofflush                <not supported>
-        iofgetpos               <not supported>
-        iofgetpos64             <not supported>
-        iofgets                 <not supported>
-        iofgetws                <not supported>
-        iofputs                 <not supported>
-        iofputws                <not supported>
-        iofread                 <not supported>
-        iofsetpos               <not supported>
-        iofsetpos64             <not supported>
-        ioftell                 <not supported>
-        iofwrite                <not supported>
-        iogetdelim              <not supported>
-        iogets                  <not supported>
-        ioputs                  <not supported>
-        ioseekoff               <not supported>
-        ioseekpos               <not supported>
-        iosetbuffer             <not supported>
-        iosetvbuf               <not supported>
-        ioungetc                <not supported>
-        ioungetwc               <not supported>
-        oldiofclose             <not supported>
-        oldiofgetpos            <not supported>
-        oldiofgetpos64          <not supported>
-        oldiofsetpos            <not supported>
-        oldiofsetpos64          <not supported>
-        peekc                   <not supported>
-        putc                    <mutex required>
-        putchar                 <mutex required>
-        putwc                   <not supported>
-        putwchar                <not supported>
-        rewind                  <mutex required>
-
-1.4 Functions from Proventhreads that use buffer access mutexes
-
-        See description above.  This applies only to the C library included
-        in the proventhreads distribution.
-
-        clearerr                <mutex required>
-        fclose                  <mutex required>
-        fflush                  <mutex required>
-        fgetc                   <mutex required>
-        __getc                  <not supported>
-        fgetline                <not supported>
-        fgetpos                 <mutex required>
-        fgetpos64               <mutex required>
-        fgets                   <mutex required>
-        fpurge                  <not supported>
-        fputc                   <mutex required>
-        __putc                  <not supported>
-        fputs                   <mutex required>
-        fread                   <mutex required>
-        freopen                 <mutex required>
-        fscanf                  <mutex required>
-        fseek                   <mutex required>
-        ftell                   <mutex required>
-        fwalk                   <not supported>
-        fwrite                  <mutex required>
-        getc                    <mutex required>
-        getchar                 <mutex required>
-        putc                    <mutex required>
-        putchar                 <mutex required>
-        puts                    <mutex required>
-        putw                    <mutex _not_ required>
-        refill                  <not supported>
-        rewind                  <mutex required>
-        scanf                   <mutex required>
-        setvbuf                 <mutex required>
-        ungetc                  <mutex required>
-        vfprintf                <mutex required>
-        vscanf                  <mutex required>
-
-1.5 Unlocked buffer access
-
-        These functions get used in situations where speed is important,
-        and locking isn't necessary, or for use in a section of code that
-        is already locked.  For example, a for-loop that makes multiple calls
-        to getc could make an exlicit call to flockfile outside the loop, and
-        then use getc_unlocked within the loop for speed.  That way, the lock
-        only needs to be grabbed and released once, rather than for each call.
-
-        getc_unlocked           <implemented
-        getchar_unlocked        <implemented
-        putc_unlocked           <implemented
-        putchar_unlocked        <implemented
-
-1.6 Additional unlocked calls made in glibc
-
-        These are additional functions (not mentioned by Butenhof) that the
-        glibc library uses for unlocked buffer access.  Though not strictly
-        necessary, these may be nice to have in uClibc.
-
-        fileno_unlocked         <implemented
-        clearerr_unlocked       <implemented
-        feof_unlocked           <implemented
-        ferror_unlocked         <implemented
-        fputc_unlocked          <implemented
-        fgetc_unlocked          <implemented
-        fflush_unlocked         <implemented
-        fread_unlocked          <implemented
-        fwrite_unlocked         <implemented
-        fgets_unlocked          <implemented
-        fputs_unlocked          <implemented
-
-1.7 Additional unlocked calls made in Proventhreads
-
-        Proventhreads only provides the four unlocked function calls above.
-
-        <none>
-
-
-2. Thread-safe functions:
-
-	There are some functions in the C library standard that are
-	simply not thread-safe and cannot be thread-safe using their
-	current interface.  For example, any function that returns a
-	pointer to static data, or requires static context between
-	calls.  To resolve this problem, new functions were added to
-	the standard that perform the same basic task, but use a new
-	interface that does not require static data.  These functions
-	share their name with the old unsafe functions, but have an
-	"_r" appended to the name.  By definition, these functions are
-	reentrant and thread-safe.  It is important to note that these
-	functions to do not depend on <pthread.h> and can be used even
-	if threading is not supported.
-
-2.1 User and terminal identification:
-
-        getlogin_r              <implemented>
-        ctermid                 <implemented>
-        ttyname_r               <implemented>
-
-
-2.2 Directory searching
-
-        readdir_r               <implemented>
-
-2.3 String token
-
-        strtok_r                <implemented>
-
-2.4 Time representation
-
-        asctime_r               <implemented>
-        ctime_r                 <implemented>
-        gmtime_r                <implemented>
-        localtime_r             <implemented>
-
-2.5 Random number generation
-
-        rand_r                  <implemented
-
-2.6 Group and user database
-
-        getgrgid_r              <required>                              <---
-        getgrnam_r              <required>                              <---
-        getpwuid_r              <implemented>
-        getpwnam_r              <implemented>
-
-2.7 Additional thread-safe functions implemented by glibc
-
-        The following is a list of additional functions implemented by glibc
-        that also provide thread-safe functionality.  Most of these functions
-        are not supported by uClibc, so there is no need to implement the
-        thread-safe version.  Those that do apply, but have not been
-        implemented yet are highlighted.
-
-        fgetpwent_r                     <implemented>
-        getttyname_r                    <not supported>
-        getmntent_r                     <implemented>
-        ecvt_r                          <not supported>
-        fcvt_r                          <not supported>
-        qecvt_r                         <not supported>
-        qfcvt_r                         <not supported>
-        hcreate_r                       <not supported>
-        hdestroy_r                      <not supported>
-        hsearch_r                       <not supported>
-        getspent_r                      <implemented>
-        getspnam_r                      <implemented>
-        sgetspent_r                     <implemented>
-        fgetspent_r                     <implemented>
-        gethostbyaddr_r                 <implemented>
-        gethostbyname2_r                <implemented>
-        gethostbyname_r                 <implemented>
-        gethostent_r                    <desired>                       <---
-        getnetbyaddr_r                  <desired>                       <---
-        getnetent_r                     <desired>                       <---
-        getnetbyname_r                  <desired>                       <---
-        getprotobynumber_r              <desired>                       <---
-        getprotoent_r                   <desired>                       <---
-        getprotobyname_r                <desired>                       <---
-        getservbyname_r                 <implemented>
-        getservbyport_r                 <implemented>
-        getservent_r                    <implemented>
-        getrpcent_r                     <desired>                       <---
-        getrpcbyname_r                  <desired>                       <---
-        getrpcbynumber_r                <implemented>
-        ether_aton_r                    <not supported>
-        ether_ntoa_r                    <not supported>
-        getnetgrent_r                   <not supported>
-        getaliasent_r                   <not supported>
-        getaliasbyname_r                <not supported>
-        nscd_getpw_r                    <not supported>
-        nscd_getgr_r                    <not supported>
-        nscd_gethst_r                   <not supported>
-        getutent_r                      <desired>                       <---
-        getutent_r_unknown              <not supported>
-        getutid_r_unknown               <not supported>
-        getutline_r_unknown             <not supported>
-        getutid_r                       <desired>                       <---
-        getutline_r                     <required>                      <---
-        getutent_r_file                 <not supported>
-        getutid_r_file                  <not supported>
-        getutline_r_file                <not supported>
-        internal_getut_r                <not supported>
-        getutent_r_daemon               <not supported>
-        getutid_r_daemon                <not supported>
-        getutline_r_daemon              <not supported>
-        ptsname_r                       <not supported>
-        __fgetpwent_r                   <not supported>
-        __ttyname_r                     <not supported>
-        __getmntent_r                   <not supported>
-        __getspent_r                    <not supported>
-        __getspnam_r                    <not supported>
-        __sgetspent_r                   <not supported>
-        __fgetspent_r                   <not supported>
-        __gethostbyaddr_r               <not supported>
-        __gethostbyname2_r              <not supported>
-        __gethostbyname_r               <not supported>
-        __gethostent_r                  <not supported
-        __getnetbyaddr_r                <not supported>
-        __getnetent_r                   <not supported>
-        __getnetbyname_r                <not supported>
-        __getprotobynumber_r            <not supported>
-        __getprotoent_r                 <not supported>
-        __getprotobyname_r              <not supported>
-        __getservbyname_r               <not supported>
-        __getservbyport_r               <not supported>
-        __getrpcent_r                   <not supported>
-        __getservent_r                  <not supported>
-        __getrpcbyname_r                <not supported>
-        __getrpcbynumber_r              <not supported>
-        __getnetgrent_r                 <not supported>
-        __internal_getnetgrent_r        <not supported>
-        __getaliasent_r                 <not supported>
-        __getaliasbyname_r              <not supported>
-        __nscd_getpwnam_r               <not supported>
-        __nscd_getpwuid_r               <not supported>
-        __nscd_getgrgid_r               <not supported>
-        __nscd_getgrnam_r               <not supported>
-        __nscd_gethostbyaddr_r          <not supported>
-        __nscd_gethostbyname2_r         <not supported>
-        __nscd_gethostbyname_r          <not supported>
-        __getutent_r                    <not supported>
-        __getutid_r                     <not supported>
-        __getutline_r                   <not supported>
-        __ptsname_r                     <not supported>
-
-
-2.8 Additional thread-safe functions implemented by Proventhreads
-
-        See description above.  This applies only to the C library included
-        in the proventhreads distribution.
-
-        inet_ntoa_r             <implemented>
-        gethostbyaddr_r         <implemented>
-        gethostbyname_r         <implemented>
-        gethostent_r            <not supported>
-        getnetbyaddr_r          <desired>                               <---
-        getnetbyname_r          <desired>                               <---
-        getnetent_r             <desired>                               <---
-        getprotobynumber_r      <desired>                               <---
-        getprotoent_r           <desired>                               <---
-        getprotobyname_r        <desired>                               <---
-        getservbyname_r         <implemented>
-        getservbyport_r         <implemented>
-        getservent_r            <implemented>
-
-
-3. List of functions in uClibc that use static data structures
-
-        The following is a list of static data structures found in uClibc,
-        and the functions that use them.  In most cases, static data is not
-        thread-safe, since multiple threads can access the same data at the
-        same time.  This is an attempt to identify all of the static data that
-        is not considered thread-safe.  Some of these problems will get
-        resolved by the changes outlines above.
-
-        crypt/crypt.c:
-
-        static struct crypt_data __crypt_data;
-
-        crypt                   <crypt_r implemented>
-        setkey                  <setkey_r implemented>
-        encrypt                 <encrypt_r implemented>
-
-        --------------------------------------------------------------------
-
-        crypt/des.c:
-
-	static u_char   inv_key_perm[64];
-	static u_char   inv_comp_perm[56];
-	static u_char   u_sbox[8][64];
-	static u_char   u_key_perm[56];
-	static u_char   un_pbox[32];
-	static u_int32_t en_keysl[16], en_keysr[16];
-	static u_int32_t de_keysl[16], de_keysr[16];
-	static u_int32_t ip_maskl[8][256], ip_maskr[8][256];
-	static u_int32_t fp_maskl[8][256], fp_maskr[8][256];
-	static u_int32_t key_perm_maskl[8][128], key_perm_maskr[8][128];
-	static u_int32_t comp_maskl[8][128], comp_maskr[8][128];
-	static u_int32_t saltbits;
-
-        __des_crypt_r		<implemented badly!>                    <---
-
-	This needs to be fixed to actually be reentrant.   Right now it
-	just fakes it, which is pretty lame....  All the above should be
-	moved into a 'struct des_context' or some such... 
-
-        --------------------------------------------------------------------
-
-        crypt/md5.c:
-
-	static const char __md5__magic[];
-	static const unsigned char __md5_itoa64[];
-
-        __md5_crypt_r		<implemented>
-
-	No problems here...
-        
-
-        --------------------------------------------------------------------
-
-        inet/addr.c:
-
-        static char buf[16];
-
-        inet_ntoa               <implemented>
-        inet_ntoa_r             <implemented>
-
-        --------------------------------------------------------------------
-
-        inet/getnetent.c:
-
-        static FILE *netf = NULL;
-        static char line[BUFSIZ+1];
-        static struct netent net;
-        static char *net_aliases[MAXALIASES];
-
-        setnetent               <mutex required>
-        endnetent               <mutex required>
-        getnetent               <mutex required>
-        getnetent_r             <not implemented>
-
-        NOTE: setnetent and endnetent are not implemented in glibc.
-
-        --------------------------------------------------------------------
-
-        inet/getproto.c:
-
-        static FILE *protof = NULL;
-        static char line[BUFSIZ+1];
-        static struct protoent proto;
-        static char *proto_aliases[MAXALIASES];
-        static int proto_stayopen;
-
-        setprotoent             <mutex required>
-        endprotoent             <mutex required>
-        getprotoent             <mutex required>
-        getprotoent_r           <implemented>
-        getprotobyname          <implemented>
-        getprotobyname_r        <not implemented>
-        getprotobynumber        <implemented>
-        getprotobynumber_r      <not implemented>
-
-        NOTE: setprotoent and endprotoent are not implemented in glibc.
-
-        --------------------------------------------------------------------
-
-        inet/getservice.c:
-
-        static FILE *servf = NULL;
-        static char line[BUFSIZ+1];
-        static struct servent serv;
-        static char *serv_aliases[MAXALIASES];
-        static int serv_stayopen;
-
-        setservent              <mutex required>
-        endservent              <fix mutex required>
-        getservent              <mutex required>
-        getservent_r            <implemented>
-        getservbyname           <mutex required>
-        getservbyname_r         <implemented>
-        getservbyport           <mutex required>
-        getservbyport_r         <implemented>
-
-        NOTE: setservent and endservent are not implemented in glibc.
-
-        --------------------------------------------------------------------
-
-	static struct hostent h;
-	static char buf[xxx];
-
-        gethostbyname           <implemented>
-
-
-	static struct hostent h;
-	static char buf[xxx];
-
-        gethostbyname2          <implemented>
-
-	static struct hostent h;
-	static char buf[xxx];
-
-        gethostbyaddr           <implemented>
-
-
-	static int __stay_open;
-	static FILE * __gethostent_fp;
-	static struct hostent h;
-	static char buf[xxx];
-
-        gethostent              <mutex required>
-        sethostent              <mutex required>
-        endhostent              <mutex required>
-
-        --------------------------------------------------------------------
-
-        inet/rpc/auth_none.c:
-
-        static struct auth_ops ops
-        static struct authnone_private
-
-        authnone_create         <fix required>                          <---
-        authnone_marshal        <fix required>                          <---
-
-        NOTE: This file makes a lot of use of this static variable and
-        also a global allocated authentication structure.  Care should
-        be taken in fixing this to make it thread-safe.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/auth_unix.c:
-
-        static struct auth_ops auth_unix_ops
-
-        authunix_create         <fix required>                          <---
-        marshal_new_auth        <fix required>                          <---
-
-        NOTE: This file makes a lot of use of this static variable and
-        also a global allocated authentication structure.  Care should
-        be taken in fixing this to make it thread-safe.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/bindresvport.c:
-
-        static short port;
-
-        bindresvport            <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        inet/rpc/clnt_perror.c:
-
-        static char *buf;
-        static struct rpc_errtab rpc_errlist[]
-        static struct auth_errtab auth_errlist[]
-
-        NOTE: These static structures all have #if 0 around them, so they
-        do not get compiled in.  Hopefully, we don't have to worry about
-        them right now, but prehaps a comment should be added to the code
-        indicating that it is not thread-safe.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/clnt_raw.c:
-
-        static struct clntraw_private
-        static struct clnt_ops client_ops
-        
-        clntraw_create          <fix required>                          <---
-        clntraw_call            <fix required>                          <---
-        clntraw_freeres         <fix required>                          <---
-
-        NOTE: This file makes a lot of use of these static variables and
-        also a global allocated client structure.  Care should
-        be taken in fixing this to make it thread-safe.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/clnt_simple.c:
-
-        static struct callrpc_private
-
-        callrpc                 <fix required>                          <---
-        
-        --------------------------------------------------------------------
-
-        inet/rpc/clnt_tcp.c:
-
-        static struct clnt_ops tcp_ops
-
-        clnttcp_create
-
-        NOTE: This static structure is just a group of function pointers.
-        It could probably be made const, but this might affect the function
-        signature.  This should be investigated further.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/clnt_udp.c:
-
-        static struct clnt_ops udp_ops
-
-        clntudp_bufcreate
-
-        NOTE: This static structure is just a group of function pointers.
-        It could probably be made const, but this might affect the function
-        signature.  This should be investigated further.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/getrpcent.c:
-
-        static char RPCDB[]     <fix desired>                           <---
-
-        NOTE: This is okay, but should use the const keyword.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/pmap_clnt.c:
-
-        static struct timeval timeout           <fix desired>           <---
-        static struct timeval tottimeout        <fix desired>           <---
-
-        NOTE: These are okay, but should use the const keyword.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/pmap_getport.c:
-
-        static struct timeval timeout           <fix desired>           <---
-        static struct timeval tottimeout        <fix desired>           <---
-
-        NOTE: These are okay, but should use the const keyword.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/pmap_rmt.c:
-
-        static struct timeval timeout           <fix desired>           <---
-
-        NOTE: This is okay, but should use the const keyword.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/rpc_dtablesize.c:
-
-        static int size;
-
-        _rpc_dtablesize         <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        inet/rpc/rpc_prot.c:
-
-        static struct xdr_discrim reply_dscrm[3]        <fix desired>   <---
-
-        NOTE: This is okay, but should use the const keyword.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/svc.c:
-
-        static SVCXPRT **xports;
-        static SVCXPRT *xports[NOFILE];
-        static struct svc_callout
-
-        xprt_register           <fix required>                          <---
-        xprt_unregister         <fix required>                          <---
-        svc_getreqset           <fix required>                          <---
-        svc_register            <fix required>                          <---
-        svc_unregister          <fix required>                          <---
-        svc_callout             <fix required>                          <---
-
-        NOTE: This is intricate code, and care should be taken when making
-        this thread-safe.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/svc_auth.c:
-
-        static struct svcauthsw         <fix desired>                   <---
-
-        NOTE: This is okay, but should use the const keyword.
-
-        --------------------------------------------------------------------
-
-        net/rpc/svc_raw.c:      
-
-        static struct svcraw_private
-        static struct xp_ops server_ops
-
-        svcraw_create           <fix required>                          <---
-        svcraw_recv             <fix required>                          <---
-        svcraw_reply            <fix required>                          <---
-        svcraw_getargs          <fix required>                          <---
-        svcraw_freeargs         <fix required>                          <---
-
-        NOTE: This is intricate code, and care should be taken when making
-        this thread-safe.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/svc_simple.c:
-
-        static struct proglst
-        static SVCXPRT *transp;
-
-        registerrpc             <fix required>                          <---
-        universal               <fix required>                          <---
-
-        NOTE: This is intricate code, and care should be taken when making
-        this thread-safe.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/svc_tcp.c:
-
-        static struct xp_ops svctcp_op
-        static struct xp_ops svctcp_rendezvous_op
-
-        svctcp_create           <fix required>                          <---
-        makefd_xprt             <fix required>                          <---
-
-        NOTE: This static structure is just a group of function pointers.
-        It could probably be made const, but this might affect the function
-        signature.  This should be investigated further.
-
-        static struct timeval wait_per_try
-
-        readtcp                 <fix required>                          <---
-
-        NOTE: This looks like a bug.  This static timeout value is passed
-        by reference to a select() call.  According to the linux man page
-        for select:
-
-                "On  Linux,  timeout  is  modified to reflect the amount of
-                time not slept; most other implementations do not do this.
-                This  causes  problems  both  when  Linux code which reads
-                timeout is ported to other  operating  systems,  and  when
-                code  is  ported to Linux that reuses a struct timeval for
-                multiple selects in  a  loop  without  reinitializing  it.
-                Consider timeout to be undefined after select returns."
-
-        Unless the implementation of select is different than that of Linux,
-        this needs to be fixed!
-
-        --------------------------------------------------------------------
-
-        inet/rpc/svc_udp.c:
-
-        static struct xp_ops svcudp_op          <fix desired>           (1)
-
-        svcudp_bufcreate
-
-        1: This static structure is just a group of function pointers.
-        It could probably be made const, but this might affect the function
-        signature.  This should be investigated further.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/xdr.c: 
-
-        static char xdr_zero[BYTES_PER_XDR_UNIT]        <fix desired>   <---
-
-        NOTE: This is okay, but should use the const keyword.
-
-        static u_long crud[BYTES_PER_XDR_UNIT]
-
-        NOTE: This looks like it doesn't matter what's in this array.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/xdr_float.c:
-
-        static struct sgl_limits        <fix desired>                   <---
-        static struct dbl_limits        <fix desired>                   <---
-
-        NOTE: These are okay, but should use the const keyword.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/xdr_mem.c:
-
-        static struct xdr_ops xdrmem_ops        <fix desired>           (1)
-
-        xdrmem_create
-
-        1: This static structure is just a group of function pointers.
-        It could probably be made const, but this might affect the function
-        signature.  This should be investigated further.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/xdr_rec.c:
-
-        static struct xdr_ops xdrrec_ops        <fix desired>           (1)
-
-        xdrrec_create
-
-        1: This static structure is just a group of function pointers.
-        It could probably be made const, but this might affect the function
-        signature.  This should be investigated further.
-
-        --------------------------------------------------------------------
-
-        inet/rpc/xdr_stdio.c:
-
-        static struct xdr_ops xdrstdio_ops      <fix desired>           (1)
-
-        xdrstdio_create
-
-        1: This static structure is just a group of function pointers.
-        It could probably be made const, but this might affect the function
-        signature.  This should be investigated further.
-
-        --------------------------------------------------------------------
-
-        ld.so-1/d-link/boot1.c:
-
-        static char *_dl_malloc_addr
-        static char *_dl_mmap_zero
-        static char *_dl_not_lazy
-        static char *_dl_warn
-        static char *_dl_trace_loaded_objects
-
-        _dl_boot                <fix required>                          <---
-        _dl_malloc              <fix required>                          <---
-        _dl_fixup               <fix required>                          <---
-
-	These are all part of the shared library loader, and are not
-	used by applications directly.  Therefore, fixing these is not 
-	a high priority item. 
-        
-        --------------------------------------------------------------------
-
-        ld.so-1/d-link/readelflib1.c:
-
-        static caddr_t _dl_cache_addr
-        static size_t _dl_cache_size
-
-        _dl_map_cache           <fix required>                          <---
-        _dl_unmap_cache         <fix required>                          <---
-        _dl_load_shared_library <fix required>                          <---
-	
-	These are all part of the shared library loader, and are not
-	used by applications directly.  Therefore, fixing these is not 
-	a high priority item. 
-        
-        --------------------------------------------------------------------
-
-        ld.so-1/d-link/string.h:
-
-        static char local[22]
-
-        _dl_simple_ltoa         <fix required>                          <---
-        _dl_simple_ltoahex      <fix required>                          <---
-
-	These are all part of the shared library loader, and are not
-	used by applications directly.  Therefore, fixing these is not 
-	a high priority item. 
-
-        --------------------------------------------------------------------
-
-        ld.so-1/d-link/arm/elfinterp.c:
-
-        static char *_dl_reltypes[]     <fix desired>                   <---
-
-        NOTE: This is okay, but should use the const keyword.
-
-        --------------------------------------------------------------------
-
-        ld.so-1/d-link/i386/elfinterp.c:
-
-        static char *_dl_reltypes[]     <fix desired>                   <---
-
-        NOTE: This is okay, but should use the const keyword.
-	
-	These are all part of the shared library loader, and are not
-	used by applications directly.  Therefore, fixing these is not 
-	a high priority item. 
-
-        --------------------------------------------------------------------
-
-        ld.so-1/d-link/m68k/elfinterp.c:
-
-        static char *_dl_reltypes[]     <fix desired>                   <---
-
-        NOTE: This is okay, but should use the const keyword.
-
-	These are all part of the shared library loader, and are not
-	used by applications directly.  Therefore, fixing these is not 
-	a high priority item. 
-
-        --------------------------------------------------------------------
-
-        ld.so-1/d-link/sparc/elfinterp.c:
-
-        static char *_dl_reltypes[]     <fix desired>                   <---
-
-        NOTE: This is okay, but should use the const keyword.
-
-	These are all part of the shared library loader, and are not
-	used by applications directly.  Therefore, fixing these is not 
-	a high priority item. 
-
-        --------------------------------------------------------------------
-
-        ld.so-1/libdl/dlib.c:
-
-        static int dl_init
-
-        _dlopen                 <fix required>                          <---
-
-        static int __attribute__ ((unused)) foobar1     <fix required?> (1)
-
-        NOTE: The comment for this says it all: "This is a real hack." ;-)
-	
-
-        static char *type[]     <fix desired>                           <---
-
-        NOTE: This is okay, but should use the const keyword.
-
-	These are all part of the shared library loader, and are not
-	used by applications directly.  Therefore, fixing these is not 
-	a high priority item. 
-
-        --------------------------------------------------------------------
-
-        ld.so-1/util/ldconfig.c:
-
-        static header_t magic   <fix desired>                           <---
-
-        NOTE: This is okay, but should use the const keyword.
-
-        static liblist_t *lib_head
-
-        cache_dolib             <fix required>                          <---
-        cache_write             <fix required>                          <---
-        
-	This is not actually part of the C library, and is not built by
-	default, so fixing these is not a high priority item. 
-
-        --------------------------------------------------------------------
-
-        misc/internals/tempname.c:
-
-        static uint64_t value;
-
-        __gen_tempname          <no fix required>
-
-	This is supposed to be random trash, so the more threading
-	collisions the better...
-
-        --------------------------------------------------------------------
-
-        misc/locale/locale.c:
-
-        static char C_LOCALE_NAME[]="C";        <fix desired>           <---
-
-        NOTE: This is okay, but should use the const keyword.
-
-        static struct SAV_LOADED_LOCALE sav_loaded_locale [1]
-        static struct SAV_LOADED_LOCALE * old_locale
-
-        setlocale               <fix required>                          <---
-
-        NOTE: Can different threads use different locales?  I don't see
-        why not.
-
-        --------------------------------------------------------------------
-
-        misc/locale/localeconv.c:
-
-        static struct lconv result;
-
-        localeconv              <fix required>                          <---
-
-        NOTE: This function returns a pointer to a static data structure.
-
-        static char *blank = "";        <fix desired>                   <---
-        static char *decimal = ".";     <fix desired>                   <---
-
-        NOTE: These are okay, but should use the const keyword.
-
-        --------------------------------------------------------------------
-
-        misc/mntent/mntent.c:
-
-        static char buff[MNTMAXSTR];
-        static struct mntent mnt;
-
-        getmntent               <mutex required>
-        getmntent_r             <implemented>
-
-        --------------------------------------------------------------------
-
-        misc/regex/regex.c:
-
-        static char re_syntax_table[CHAR_SET_SIZE];
-        static int done = 0;
-
-        init_syntax_table       <fix required>                          <---
-
-        static int debug;
-
-        <several functions>     <fix required>                          <---
-
-        NOTE: This is used to turn on debugging, and is used in several
-        functions.  It will need to be fixed if you want differing debug
-        levels per thread.
-
-        static char reg_unset_dummy;
-
-        <REG_UNSET...>          <fix required>                          <---
-
-        static fail_stack_type fail_stack;
-
-        regex_compile           <fix required>                          <---
-        <FREE_VARIABLES>        <fix required>                          <---
-        <FAIL_STACK_EMPTY>      <fix required>                          <---
-        <FAIL_STACK_PTR_EMPTY>  <fix required>                          <---
-        <FAIL_STACK_FULL>       <fix required>                          <---
-        <INIT_FAIL_STACK>       <fix required>                          <---
-        <RESET_FAIL_STACK>      <fix required>                          <---
-        <DOUBLE_FAIL_STACK>     <fix required>                          <---
-        <PUSH_FAILURE_POINTER>  <fix required>                          <---
-        <PUSH_FAILURE_INT>      <fix required>                          <---
-        <PUSH_FAILURE_ELT>      <fix required>                          <---
-        <POP_FAILURE_POINTER>   <fix required>                          <---
-        <POP_FAILURE_INT>       <fix required>                          <---
-        <POP_FAILURE_ELT>       <fix required>                          <---
-        <REMAINING_AVAIL_SLOTS> <fix required>                          <---
-
-        static int regs_allocated_size;
-
-        regs_grow_registers     <fix required>                          <---
-
-        static register_info_type *reg_info;
-        static register_info_type *reg_info_dummy;
-        static unsigned failure_id;
-        static struct re_pattern_buffer re_comp_buf;
-
-        <too many to list>      <fix required>                          <---
-        
-        NOTE: This is just a NASTY file for static variables.  A lot of
-        work needs to be done here to clean this up.  But I'm not even
-        sure if it matters.  This code is taken directly from glibc.
-
-	This code is also very large (adds over 30k to the C library
-	all by itself).  This file needs a complete rewrite.
-
-        --------------------------------------------------------------------
-
-        misc/syslog/syslog.c:
-
-        static pthread_once__t _once_block = pthread_once_init;
-        static pthread_mutex_t _syslog_mutex;
-        
-        NOTE: I think these are okay. ;-)
-
-        static int LogFile = -1;
-        static int connected;
-        static int LogStat = 0;
-        static int LogFacility = LOG_USER;
-        static int LogMask = 0xff;
-        static char truncate_msg[12]
-        static struct sockaddr SyslogAddr;
-
-        NOTE: These are already protected.
-
-        --------------------------------------------------------------------
-
-        misc/time/asctime.c:
-
-        static char timebuf[26];
-
-        asctime                 <asctime_r implemented>
-
-        --------------------------------------------------------------------
-
-        misc/time/ctime.c:
-
-        static char cbuf[26];
-
-        ctime                   <ctime_r implemented>
-
-        --------------------------------------------------------------------
-
-        misc/time/gmtime.c:
-
-        static struct tm tmb;
-
-        gmtime                  <gmtime_r implemented>
-
-        --------------------------------------------------------------------
-
-        misc/time/localtime.c:
-
-        static struct tm tmb;
-
-        localtime               <localtime_r implemented>
-
-        --------------------------------------------------------------------
-
-        misc/time/mktime.c:
-
-        static tz_rule tz_rules[2];
-
-        tzset                   <fix required>                          <---
-
-        static time_t localtime_offset;
-
-        mktime                  <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        misc/time/tm_conv.c:
-
-        static int moffset[]    <fix desired>                           <---
-        
-        NOTE: This is okay, but should use the const keyword.
-
-        --------------------------------------------------------------------
-
-        misc/utmp/utent.c:
-
-	static int static_fd = -1;
-	static struct utmp static_utmp;
-	static const char default_file_name[] = _PATH_UTMP;
-	static const char *static_ut_name = (const char *) default_file_name;
-
-
-        setutent                <ok>
-        endutent                <ok>
-        getutent                <ok>
-        getutid                 <ok>
-        getutline               <ok>
-        pututline               <ok>
-        utmpname                <ok>
-        __getutent              <ok>
-
-        --------------------------------------------------------------------
-
-        pwd_grp/__getgrent.c:
-
-        static char line_buff[GR_MAX_LINE_LEN];
-        static char *members[GR_MAX_MEMBERS];
-        static char *line_buff = NULL;
-        static char **members = NULL;
-        static struct group group;
-
-        __getgrent              <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        pwd_grp/fgetpwent.c:
-
-        static char line_buff[PWD_BUFFER_SIZE];
-        static struct passwd pwd;
-
-        fgetpwent               <fgetpwent_r implemented>
-
-        --------------------------------------------------------------------
-
-        pwd_grp/getpwnam.c:
-
-        static char line_buff[PWD_BUFFER_SIZE];
-        static struct passwd pwd;
-
-        getpwnam                <getpwnam_r implemented>
-
-        --------------------------------------------------------------------
-
-        pwd_grp/getpwuid.c:
-
-        static char line_buff[PWD_BUFFER_SIZE];
-        static struct passwd pwd;
-
-        getpwuid                <getpwuid_r implemented>
-
-        --------------------------------------------------------------------
-
-        pwd_grp/grent.c:
-
-        static int grp_fd = -1;
-
-        setgrent                <fix required>                          <---
-        endgrent                <fix required>                          <---
-        getgrent                <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        pwd_grp/pwent.c:
-
-        static int pw_fd = -1;
-
-        setpwent                <fix required>                          <---
-        endpwent                <fix required>                          <---
-        getpwent_r              <fix required>                          <---
-
-        NOTE: Yeah, this looks weird, but getpwent_r isn't completely
-        thread-safe.
-
-        static char line_buff[PWD_BUFFER_SIZE]; 
-        static struct passwd pwd;
-
-        getpwent                <getpwent_r implemented>                <---
-
-        --------------------------------------------------------------------
-
-        stdio/tmpnam.c:
-
-        static char tmpnam_buffer[L_tmpnam];
-
-        tmpnam                  <tmpnam_r implemented>
-
-        --------------------------------------------------------------------
-
-        stdlib/atexit.c:
-
-        static vfuncp __atexit_table[__UCLIBC_MAX_ATEXIT];
-        static int __atexit_count = 0;
-
-        atexit_handler          <fix required>                          <---
-        atexit                  <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        stdlib/bsearch.c:
-
-        static int _bsearch;
-
-        bsearch                 <ok>
-
-        --------------------------------------------------------------------
-
-        stdlib/setenv.c:
-
-	static char **last_environ;
-
-        __add_to_environ        <ok>
-        unsetenv                <ok>
-        setenv                  <ok>
-        clearenv                <ok>
-        putenv                  <ok>
-
-	all ok now.
-
-        --------------------------------------------------------------------
-
-        stdlib/random.c:
-
-        static long int seed1 = 1;
-        static long int seed2 = 1;
-        static long int seed3 = 1;
-
-        random                  <fix required?>                         (1)
-        srandom                 <fix required?>                         (1)
-
-        1: I'm not sure if it matters if these are static, since they
-        are random number seeds.  Who cares if more than one thread changes
-        their value?
-
-        --------------------------------------------------------------------
-
-        stdlib/malloc/avlmacro.h
-
-        static objname *__Avl_##objname##pr##_new_node;
-
-        Avl_Tree_no_replace     <fix required>                          <---
-
-        NOTE: This will take a bit of study to figure out if it needs fixing.
-
-        --------------------------------------------------------------------
-
-        stdlib/malloc/malloc.c:
-
-        //static mutex_t malloc_lock = MUTEX_INITIALIZER;               <---
-
-        NOTE: Basically, thread support in malloc is broken and must be
-        fixed.  It looks like the infrastructure is there, but more
-        investigation is required.
-
-        --------------------------------------------------------------------
-
-        stdlib/malloc-930716/malloc.c:
-
-        A bunch of stuff
-        
-        malloc                  <ok>
-        realloc                 <ok>
-        free                    <ok>
-        etc                     <ok>
-
-        --------------------------------------------------------------------
-
-        string/strerror.c:
-
-        static char retbuf[48];
-        static char retbuf[33];
-
-        strerror                <fix required>                          <---
-        strerror_r              <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        string/strsignal.c:
-
-        static char retbuf[28];
-
-        strsignal               <fix required>                          <---
-        main                    <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        string/strtok.c:
-
-        static char *save = 0;
-
-        strtok                  <ok>
-        strtok_r                <ok>
-
-        --------------------------------------------------------------------
-
-        termios/tcgetsid.c:
-
-        static int tiocgsid_does_not_work;
-
-        tcgestsid               <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        termios/ttyname.c:
-
-        static char dev[] = "/dev";
-
-        ttyname                 <fix desired>                           <---
-
-        NOTE: This is okay, but should use the const keyword.
-
-        static char name[NAME_MAX];
-
-        ttyname                 <ttyname_r required>                    <---
-
-        --------------------------------------------------------------------
-
-        test/testsuite.h:
-
-        static int failures
-
-        error_msg               <fix required>                          <---
-        done_testing            <fix required>                          <---
-        init_testsuite          <fix required>                          <---
-        
-        --------------------------------------------------------------------
-
-        unistd/getopt.c:
-
-        static int sp = 1;
-
-        getopt                  <fix required>                          <---
-        
-        --------------------------------------------------------------------
-
-        unistd/getpass.c:
-
-        static char buf[PWD_BUFFER_SIZE];
-
-        getpass                 <fix required>                          <---
-        
-        NOTE: This function returns a pointer to a static data structure.
-        This seems like it requires an _r version of this function.  Glibc
-        does the same thing.  Oops!  So much for thread-safe glibc!
-
-        --------------------------------------------------------------------
-
-        unistd/gnu_getopt.c:
-
-        static char *nextchar;
-        static enum ordering;
-        static int first_nonopt;
-        static int last_nonopt;
-
-        _getopt_initialize      <fix required>                          <---
-        _getopt_internal        <fix required>                          <---
-        exchange                <fix required>                          <---
-
-        static struct option long_options[]     <fix desired>           <---
-
-        NOTE: This is okay, but should use the const keyword.
-
-        --------------------------------------------------------------------
-
-        unistd/sysconf.c:
-
-        static long int ret_vals[_UCLIBC_SYSCONF_NUM_VALID_ARGS];
-
-        find_or_add_in_table    <fix required?>                         <---
-        main                    <fix required?>                         <---
-
-        NOTE: I'm not sure if this needs to be multi-threaded or not.
-
-        --------------------------------------------------------------------
-
-        unistd/sysconf_src.c:
-
-        static long int ret_vals[_UCLIBC_SYSCONF_NUM_VALID_ARGS];
-
-        find_or_add_in_table    <fix required?>                         <---
-        main                    <fix required?>                         <---
-
-        NOTE: I'm not sure if this needs to be multi-threaded or not.
-
-        --------------------------------------------------------------------
-
-        unistd/sysconf_i386.c:
-
-        static long int ret_vals[_UCLIBC_SYSCONF_NUM_VALID_ARGS];
-
-        find_or_add_in_table    <fix required?>                         <---
-        main                    <fix required?>                         <---
-
-        NOTE: I'm not sure if this needs to be multi-threaded or not.
-
-        --------------------------------------------------------------------
-
-
-4. List of functions that use global variables
-
-	The following is a list of functions that make use of global
-	variables.  Since multiple threads can access the same global
-	variable at the same time, access should be considered unsafe.
-	This is an attempt to identify all the areas where global
-	variables are used.  This does not necessarily mean that each
-	of these is unsafe.  It just means that there is a potential
-	for them to be unsafe.  If this code never runs in more than
-	one thread, then there's no problem.  More ivestigation will be
-	required to determine if changes are really required.
-
-        Global variable:
-
-        __environ (misc/internals/__uClibc_main.c)
-
-        __uClibc_main.c:
-
-        __uClibc_main           <fix required?>                         (1)
-
-        1: This should only get executed once, so it is probably fine.
-        
-        stdlib/getenv.c:
-
-        getenv                  <fix required>                          <---
-
-        stdlib/putenv.c:
-
-        putenv                  <fix required>                          <---
-
-        stdlib/setenv.c:
-
-        setenv                  <fix required>                          <---
-        unsetenv                <fix required>                          <---
-
-        test/args/arg_test.c:
-
-        main                    <fix required>                          <---
-
-        unistd/execl.c:
-
-        execl                   <fix required>                          <---
-
-        unistd/execlp.c:
-
-        execlp                  <fix required>                          <---
-
-        unistd/execv.c:
-
-        execv                   <fix required>                          <---
-
-        unistd/execvp.c:
-
-        execvep                 <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        __uClibc_cleanup (misc/internals/__uClibc_main.c)
-
-        stdlib/abort.c:
-
-        abort                   <fix required>                          <---
-
-        stdlib/atexit.c:
-
-        atexit_handler          <fix required>                          <---
-        atexit                  <fix required>                          <---
-        exit                    <fix required>                          <---
-
-        NOTE: Not sure if multiple threads can be in this code or not.
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        environ (misc/internals/__uClibc_main.c)
-
-        NOTE: This is a weak alias for __environ, but it doesn't ever get
-        used in the uClibc library.
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        timezone (misc/time/tm_conv.c)
-
-        misc/time/tm_conv.c:
-
-        __tm_conv               <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        re_max_failures (misc/regex/regex.c)
-
-        misc/regex/regex.c:
-
-        DOUBLE_FAIL_STACK       <fix required>                          <---
-        regex_compile           <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        re_syntax_options (misc/regex/regex.c)
-
-        misc/regex/regex.c:
-
-        re_set_syntax           <fix required>                          <---
-        re_compile_pattern      <fix required>                          <---
-        re_comp                 <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        __IO_list (stdio/stdio.c)
-
-        stdio/stdio.c:
-
-        fflush                  <fix required>                          <---
-        __fopen                 <fix required>                          <---
-        fclose                  <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        _fixed_buffers (stdio/stdio.c)
-
-        stdio/stdio.c:
-
-        _alloc_stdio_buffer             <fix required>                  <---
-        _free_stdio_buffer_of_file      <fix required>                  <---
-        __init_stdio                    <fix required>                  <---
-        
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        _free_buffer_index (stdio/stdio.c)
-
-        stdio/stdio.c:
-
-        _alloc_stdio_buffer             <fix required>                  <---
-        _free_stdio_buffer_of_file      <fix required>                  <---
-        __init_stdio                    <fix required>                  <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        _free_file_list (stdio/stdio.c)
-
-        stdio/stdio.c:
-
-        __init_stdio            <fix required>                          <---
-        _alloc_stdio_stream     <fix required>                          <---
-        _free_stdio_stream      <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        _stderr (stdio/stdio.c)
-
-        ld.so-1/util/ldconfig.c:
-
-        warn                    <fix required>                          <---
-        error                   <fix required>                          <---
-        usage                   <fix required>                          <---
-
-        ld.so-1/util/ldd.c:
-
-        warn                    <fix required>                          <---
-        error                   <fix required>                          <---
-        is_bin                  <fix required>                          <---
-        main                    <fix required>                          <---
-        
-        misc/locale/locale.c:
-
-        setlocale               <fix required>                          <---
-        
-        misc/regex/regex.c:
-
-        printchar               <fix required>                          <---
-
-        stdio/perror.c:
-
-        perror                  <fix required>                          <---
-
-        stdlib/malloc/alloc.c:
-
-        calloc_dbg              <fix required>                          <---
-        malloc_dbg              <fix required>                          <---
-        free_dbg                <fix required>                          <---
-
-        stdlib/malloc/malloc.c:
-
-        __hunk_alloc            <fix required?>                         (1)
-        __malloc_init           <fix required?>                         (1)
-        malloc                  <fix required?>                         (1)
-
-        1: These are commented out with C++ style comments.
-
-        stdlib/malloc-simple/alloc.c:
-
-        calloc_dbg              <fix required>                          <---
-        malloc_dbg              <fix required>                          <---
-        free_dbg                <fix required>                          <---
-
-        string/strsignal.c:
-
-        psignal                 <fix required>                          <---
-
-        test/args/arg_test.c:
-
-        main                    <fix required>                          <---
-
-        test/assert/assert.c:
-
-        main                    <fix required>                          <---
-
-        unistd/getopt.c:
-
-        Err                     <fix required>                          <---
-
-        unistd/getpass.c:
-
-        getpass                 <fix required>                          <---
-
-        unistd/gnu_getopt.c:
-
-        _getopt_internal        <fix required>                          <---
-
-        unistd/sysconf.c:
-
-        main                    <fix required>                          <---
-
-        unistd/sysconf_src.c:
-
-        main                    <fix required>                          <---
-
-        unistd/sysconf_i386.c:
-
-        main                    <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        _stdin (stdio/stdio.c)
-
-        include/stdio.h:
-
-        getchar                 <fix required>                          <---
-
-        include/bits/stdio.h:
-
-        getchar                 <fix required>                          <---
-        getchar_unlocked        <fix required>                          <---
-
-        stdio/scanf.c:
-
-        scanf                   <fix required>                          <---
-        vscanf                  <fix required>                          <---
-
-        stdio/stdio.c
-
-        gets                    <fix required>                          <---
-        getchar                 <fix required>                          <---
-
-        sysdeps/linux/i386/bits/stdio.h:
-
-        getchar                 <fix required>                          <---
-        getchar_unlocked        <fix required>                          <---
-
-        sysdeps/linux/m68k/bits/stdio.h:
-
-        getchar                 <fix required>                          <---
-        getchar_unlocked        <fix required>                          <---
-
-        sysdeps/linux/sh/bits/stdio.h:
-
-        getchar                 <fix required>                          <---
-        getchar_unlocked        <fix required>                          <---
-
-        sysdeps/linux/sparc/bits/stdio.h:
-
-        getchar                 <fix required>                          <---
-        getchar_unlocked        <fix required>                          <---
-
-        unistd/getpass.c:
-
-        getpass                 <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        _stdio_streams (stdio/stdio.c)
-
-        stdio/stdio.c:
-
-        __init_stdio            <fix required>                          <---
-        _free_stdio_stream      <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        _stdout (stdio/stdio.c)
-
-        include/stdio.h:
-
-        putchar                 <fix required>                          <---
-
-        include/bits/stdio.h:
-
-        vprintf                 <fix required>                          <---
-        putchar                 <fix required>                          <---
-        putchar_unlocked        <fix required>                          <---
-
-        ld.so-1/util/ldconfig.c:
-
-        warn                    <fix required>                          <---
-        error                   <fix required>                          <---
-
-        ld.so-1/util/ldd.c:
-
-        warn                    <fix required>                          <---
-        error                   <fix required>                          <---
-        main                    <fix required>                          <---
-
-        stdio/printf.c:
-
-        printf                  <fix required>                          <---
-        vprintf                 <fix required>                          <---
-
-        stdio/stdio.c:
-
-        puts                    <fix required>                          <---
-        _uClibc_fread           <fix required>                          <---
-        putchar                 <fix required>                          <---
-
-        sysdeps/linux/i386/bits/stdio.h:
-
-        vprintf                 <fix required>                          <---
-        putchar                 <fix required>                          <---
-        putchar_unlocked        <fix required>                          <---
-
-        sysdeps/linux/m68k/bits/stdio.h:
-
-        vprintf                 <fix required>                          <---
-        putchar                 <fix required>                          <---
-        putchar_unlocked        <fix required>                          <---
-
-        sysdeps/linux/sh/bits/stdio.h:
-
-        vprintf                 <fix required>                          <---
-        putchar                 <fix required>                          <---
-        putchar_unlocked        <fix required>                          <---
-
-        sysdeps/linux/sparc/bits/stdio.h:
-
-        vprintf                 <fix required>                          <---
-        putchar                 <fix required>                          <---
-        putchar_unlocked        <fix required>                          <---
-
-        test/pwd_grp/test_grp.c:
-
-        main                    <fix required>                          <---
-
-        test/pwd_grp/test_pwd.c:
-
-        main                    <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        dns_caught_signal (inet/resolv.c)
-
-        inet/resolv.c:
-
-        dns_catch_signal        <fix required>                          <---
-        dns_lookup              <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        nameserver (inet/resolv.c)
-        nameservers (inet/resolv.c)
-
-        inet/resolv.c:
-
-        open_nameservers        <fix required>                          <---
-        close_nameservers       <fix required>                          <---
-        resolve_name            <fix required>                          <---
-        gethostbyname           <fix required>                          <---
-        res_query               <fix required>                          <---
-        gethostbyaddr           <fix required>                          <---
-        
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        searchdomain (inet/resolv.c)
-        searchdomains (inet/resolv.c)
-
-        inet/resolv.c:
-
-        dns_lookup              <fix required>                          <---
-        
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        _net_stayopen (inet/getnetent.c)
-
-        inet/getnetbyad.c:
-
-        getnetbyaddr            <fix required>                          <---
-
-        inet/getnetbynm.c:
-
-        getnetbyname            <fix required>                          <---
-
-        inet/getnetent.c:
-
-        setnetent               <fix required>                          <---
-        endnetent               <fix required>                          <---
-        
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        rpcdata (inet/rpc/getrpcent.c)
-
-        inet/rpc/getrpcent.c:
-
-        _rpcdata                <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        _null_auth (inet/rpc/rpc_commondata.c)  <fix desired>           <---
-
-        NOTE: _null_auth is never actually initialized.  It never gets written,
-        only read.  So it should be thread safe.  But it should be declared
-        as a const if that is the case.  It should also be initialized.
-
-        inet/rpc/auth_none.c:
-
-        authnone_create 
-
-        inet/rpc/auth_unix.c:
-
-        authunix_create
-
-        inet/rpc/clnt_raw.c:
-
-        clntraw_call
-
-        inet/rpc/clnt_tcp.c:
-
-        clnttcp_call
-
-        inet/rpc/clnt_udp.c:
-
-        clntudp_call
-
-        inet/rpc/pmap_rmt.c:
-
-        clnt_broadcast
-
-        inet/rpc/svc_auth.c:
-
-        _authenticate
-
-        inet/rpc/svc_tcp.c:
-
-        svctcp_create
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        rpc_createerr (inet/rpc/rpc_commondata.c)
-
-        inet/rpc/clnt_generic.c:
-
-        clnt_create             <fix required>                          <---
-        
-        inet/rpc/clnt_perror.c:
-
-        clnt_spcreateerror      <fix desired?>                          <---
-
-        NOTE: This piece of code has an "#if 0" around it.
-
-        inet/rpc/clnt_simple.c:
-
-        callrpc                 <fix required>                          <---
-
-        inet/rpc/clnt_tcp.c:
-
-        clnttcp_create          <fix required>                          <---
-
-        inet/rpc/clnt_udp.c:
-
-        clntudp_bufcreate       <fix required>                          <---
-
-        inet/rpc/pmap_getport.c:
-
-        pmap_getport            <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        svc_fdset (inet/rpc/rpc_commondata.c)
-
-        inet/rpc/svc.c:
-
-        xprt_register           <fix required>                          <---
-        xprt_unregister         <fix required>                          <---
-        svc_getreq              <fix required>                          <---
-
-        inet/rpc/svc_run.c:
-
-        svc_run                 <fix required>                          <---
-
-        NOTE: Be careful to also fix the uses of the "svc_fds" #define.
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        pl (inet/rpc/svc_simple.c)
-
-        registerrpc             <fix required>                          <---
-
-        NOTE: proglst is set up to point at pl, so it needs fixing as well.
-        (See proglst earlier in this document.)
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        _sigintr (signal/signal.c)
-
-        signal/bsd_sig.c:
-
-        __bsd_signal            <fix required>                          <---
-
-        signal/sigintr.c:
-
-        siginterrupt            <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        __Avl_Block_tfree_mem_tree (stdlib/malloc/malloc.c)
-
-        stdlib/malloc/malloc.c:
-
-        __free_mem_del_block    <fix required>                          <---
-        bl_alloc                <fix required>                          <---
-        __malloc_init           <fix required>                          <---
-
-        NOTE: This code is very tricky stuff.
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        __Avl_Block_tptrs_tree (stdlib/malloc/malloc.c)
-
-        stdlib/malloc/malloc.c:
-
-        __bl_free               <fix required>                          <---
-        __malloc_init           <fix required>                          <---
-        free                    <fix required>                          <---
-        _realloc_no_move        <fix required>                          <---
-        realloc                 <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        __bl_last (stdlib/malloc/malloc.c)
-
-        stdlib/malloc/malloc.c:
-
-        COMBINE_BLOCKS          <fix required>                          <---
-        SPLIT_BLOCK             <fix required>                          <---
-        bl_mapnew               <fix required>                          <---
-        bl_alloc                <fix required>                          <---
-        __malloc_init           <fix required>                          <---
-        
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        __free_h (stdlib/malloc/malloc.c)
-
-        stdlib/malloc/malloc.c:
-
-        __hunk_alloc            <fix required>                          <---
-        __hunk_free             <fix required>                          <---
-        __malloc_init           <fix required>                          <---
-        
         --------------------------------------------------------------------
 
-        Global variable:
-
-        __malloc_initialized (stdlib/malloc/malloc.c)
+        libc/inet/rpc/rpc_thread.c:
 
-        stdlib/malloc/malloc.c:
+	__rpc_thread_variables is currently disabled, since thread
+	local storage seems to not be correctly specified as 
+	weak functions.
 
-        __malloc_init           <fix required>                          <---
-        malloc                  <fix required>                          <---
-        free                    <fix required>                          <---
-        _realloc_no_move        <fix required>                          <---
-        
         --------------------------------------------------------------------
 
-        Global variable:
-
-        __total_h (stdlib/malloc/malloc.c)
+        unistd/getpass.c:
 
-        stdlib/malloc/malloc.c:
+        static char buf[PWD_BUFFER_SIZE];
 
-        __hunk_alloc            <fix required>                          <---
-        __malloc_init           <fix required>                          <---
+        getpass                 <fix required>                          <---
         
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        errno (sysdeps/linux/common/errno.c)
-
-        sysdeps/linux/common/errno.c:
-
-        __errno_location        <fix required>                          <---
-
-        NOTE: Obviously, errno gets used all over the place.  I won't list
-        them all here.
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        ___brk_addr (sysdeps/linux/i386/__init_brk.c)
-
-        sysdeps/linux/i386/__init_brk.c:
-
-        __init_brk              <fix required>                          <---
-
-        sysdeps/linux/i386/brk.c:
-
-        brk                     <fix required>                          <---
-
-        sysdeps/linux/i386/sbrk.c:
-
-        sbrk                    <fix required>                          <---
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        optarg (unistd/getopt_vars.c)
-
-        extra/locale/gen_ctype_from_glibc.c:
-
-        main                    <fix required?>                         (1)
-
-        ld.so-1/util/ldconfig.c:
-
-        main                    <fix required?>                         (1)
-
-        unistd/getopt.c:
-
-        getopt                  <fix required>                          <---
-
-        unistd/gnu_getopt.c:
-
-        _getopt_internal        <fix required>                          <---
-        main                    <fix required?>                         (1)
-
-        1: Probably not required unless this program is run on multiple
-        threads.
-
-        --------------------------------------------------------------------
-
-        Global variable:
-
-        opterr (unistd/getopt_vars.c)
-
-        ld.so-1/util/ldconfig.c:
-
-        main                    <fix required?>                         (1)
-
-        unistd/getopt.c:
-
-        Err                     <fix required>                          <---
-        getopt                  <fix required>                          <---
-
-        unistd/gnu_getopt.c:
-
-        _getopt_internal        <fix required>                          <---
-
-        1: Probably not required unless this program is run on multiple
-        threads.
+        NOTE: This function returns a pointer to a static data structure.
+        This seems like it requires an _r version of this function.  Glibc
+        does the same thing.  Oops!  So much for thread-safe glibc!
 
         --------------------------------------------------------------------
 
-        Global variable:
-
-        optind (unistd/getopt_vars.c)
-
-        extra/locale/gen_ctype_from_glibc.c:
-
-        main                    <fix required?>                         (1)
-        
-        ld.so-1/util/ldconfig.c:
-
-        main                    <fix required?>                         (1)
-
-        ld.so-1/util/ldd.c:
-
-        main                    <fix required?>                         (1)
-        
-        unistd/getopt.c:
-
-        Err                     <fix required>                          <---
-        getopt                  <fix required>                          <---
+        unistd/sysconf.c:
 
-        unistd/gnu_getopt.c:
+        static long int ret_vals[_UCLIBC_SYSCONF_NUM_VALID_ARGS];
 
-        exchange                <fix required>                          <---
-        _getopt_initialize      <fix required>                          <---
-        _getopt_internal        <fix required>                          <---
-        main                    <fix required?>                         (1)
-        main (2nd one)          <fix required?>                         (1)
+        find_or_add_in_table    <fix required?>                         <---
+        main                    <fix required?>                         <---
 
-        1: Probably not required unless this program is run on multiple
-        threads.
+        NOTE: I'm not sure if this needs to be made reentrant...
 
         --------------------------------------------------------------------
-
-        Global variable:
-
-        optopt (unistd/getopt_vars.c)
-
-        unistd/getopt.c:
-
-        Err                     <fix required>                          <---
-        getopt                  <fix required>                          <---
-
-        unistd/gnu_getopt.c:
-
-        _getopt_internal        <fix required>                          <---
-