summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/threads.txt540
1 files changed, 226 insertions, 314 deletions
diff --git a/docs/threads.txt b/docs/threads.txt
index 2d5d9e623..d31a56d58 100644
--- a/docs/threads.txt
+++ b/docs/threads.txt
@@ -33,9 +33,9 @@ http://www.vitanuova.com/inferno/index.html
None of these functions are currently implemented in the uClibc
library, so they must be added.
- flockfile <required> <---
- ftrylockfile <required> <---
- funlockfile <required> <---
+ flockfile <implemented>
+ ftrylockfile <implemented>
+ funlockfile <implemented>
1.2 Functions that must use buffer access mutexes, according to Butenhof
@@ -43,10 +43,10 @@ http://www.vitanuova.com/inferno/index.html
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> <---
+ getc <mutex required>
+ getchar <mutex required>
+ putc <mutex required>
+ putchar <mutex required>
1.3 Functions from glibc (libio) that use buffer access mutexes
@@ -57,21 +57,21 @@ http://www.vitanuova.com/inferno/index.html
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> <---
+ clearerr <mutex required>
+ feof <mutex required>
+ ferror <mutex required>
+ fputc <mutex required>
fputwc <not supported>
- freopen <mutex required> <---
- freopen64 <not supported>
- fseek <mutex required> <---
- fseeko <not supported>
- fseeko64 <not supported>
- ftello <not supported>
- ftello64 <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 <macro for fgetc>
- getchar <macro for fgetc>
+ getc <mutex required>
+ getchar <mutex required>
getwc <not supported>
getwchar <not supported>
iofclose <not supported>
@@ -102,49 +102,50 @@ http://www.vitanuova.com/inferno/index.html
oldiofsetpos <not supported>
oldiofsetpos64 <not supported>
peekc <not supported>
- putc <macro for fputc>
- putchar <macro for fputc>
+ putc <mutex required>
+ putchar <mutex required>
putwc <not supported>
putwchar <not supported>
- rewind <mutex required> <---
+ 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> <---
+ clearerr <mutex required>
+ fclose <mutex required>
+ fflush <mutex required>
+ fgetc <mutex required>
__getc <not supported>
fgetline <not supported>
- fgetpos <mutex required> <---
- fgets <mutex required> <---
+ fgetpos <mutex required>
+ fgetpos64 <mutex required>
+ fgets <mutex required>
fpurge <not supported>
- fputc <mutex required> <---
+ fputc <mutex required>
__putc <not supported>
- fputs <mutex required> <---
- fread <mutex required> <---
- freopen <mutex required> <---
- fscanf <mutex required> <---
- fseek <mutex required> <---
- ftell <mutex required> <---
+ 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 <macro for fgetc>
- getchar <mutex required> <---
- putc <macro for fputc>
- putchar <mutex required> <---
- puts <mutex required> <---
- putw <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> <---
+ rewind <mutex required>
+ scanf <mutex required>
+ setvbuf <mutex required>
+ ungetc <mutex required>
+ vfprintf <mutex required>
+ vscanf <mutex required>
1.5 Unlocked buffer access
@@ -155,10 +156,10 @@ http://www.vitanuova.com/inferno/index.html
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 <required> <---
- getchar_unlocked <required> <---
- putc_unlocked <required> <---
- putchar_unlocked <required> <---
+ getc_unlocked <implemented
+ getchar_unlocked <implemented
+ putc_unlocked <implemented
+ putchar_unlocked <implemented
1.6 Additional unlocked calls made in glibc
@@ -166,17 +167,17 @@ http://www.vitanuova.com/inferno/index.html
glibc library uses for unlocked buffer access. Though not strictly
necessary, these may be nice to have in uClibc.
- fileno_unlocked <desired> <---
- clearerr_unlocked <desired> <---
- feof_unlocked <desired> <---
- ferror_unlocked <desired> <---
- fputc_unlocked <desired> <---
- fgetc_unlocked <desired> <---
- fflush_unlocked <desired> <---
- fread_unlocked <desired> <---
- fwrite_unlocked <desired> <---
- fgets_unlocked <desired> <---
- fputs_unlocked <desired> <---
+ 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
@@ -203,16 +204,13 @@ http://www.vitanuova.com/inferno/index.html
2.1 User and terminal identification:
getlogin_r <implemented>
- ctermid <implemented> (1)
- ttyname_r <required> <---
+ ctermid <implemented>
+ ttyname_r <implemented>
- 1. ctermid is a special case. The signature has not changed, but a
- requirement has been added that its parameter point to a structure
- of exactly L_ctermid bytes.
2.2 Directory searching
- readdir_r <required> <---
+ readdir_r <implemented>
2.3 String token
@@ -227,7 +225,7 @@ http://www.vitanuova.com/inferno/index.html
2.5 Random number generation
- rand_r <required> <---
+ rand_r <implemented
2.6 Group and user database
@@ -244,12 +242,9 @@ http://www.vitanuova.com/inferno/index.html
thread-safe version. Those that do apply, but have not been
implemented yet are highlighted.
- __fgetpwent_r <not supported>
fgetpwent_r <implemented>
- __ttyname_r <not supported>
getttyname_r <not supported>
- __getmntent_r <not supported>
- getmntent_r <desired> <---
+ getmntent_r <implemented>
ecvt_r <not supported>
fcvt_r <not supported>
qecvt_r <not supported>
@@ -257,83 +252,86 @@ http://www.vitanuova.com/inferno/index.html
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>
- getspent_r <not supported>
__getspnam_r <not supported>
- getspnam_r <not supported>
__sgetspent_r <not supported>
- sgetspent_r <not supported>
__fgetspent_r <not supported>
- fgetspent_r <not supported>
__gethostbyaddr_r <not supported>
- gethostbyaddr_r <desired> <---
__gethostbyname2_r <not supported>
- gethostbyname2_r <not supported>
__gethostbyname_r <not supported>
- gethostbyname_r <desired> <---
__gethostent_r <not supported
- gethostent_r <not supported>
__getnetbyaddr_r <not supported>
- getnetbyaddr_r <desired> <---
__getnetent_r <not supported>
- getnetent_r <desired> <---
__getnetbyname_r <not supported>
- getnetbyname_r <desired> <---
__getprotobynumber_r <not supported>
- getprotobynumber_r <desired> <---
__getprotoent_r <not supported>
- getprotoent_r <desired> <---
__getprotobyname_r <not supported>
- getprotobyname_r <desired> <---
__getservbyname_r <not supported>
- getservbyname_r <desired> <---
__getservbyport_r <not supported>
- getservbyport_r <desired> <---
- __getservent_r <not supported>
- getservent_r <desired> <---
__getrpcent_r <not supported>
- getrpcent_r <desired> <---
+ __getservent_r <not supported>
__getrpcbyname_r <not supported>
- getrpcbyname_r <desired> <---
__getrpcbynumber_r <not supported>
- getrpcbynumber_r <desired> <---
- ether_aton_r <not supported>
- ether_ntoa_r <not supported>
__getnetgrent_r <not supported>
__internal_getnetgrent_r <not supported>
- getnetgrent_r <not supported>
__getaliasent_r <not supported>
- getaliasent_r <not supported>
__getaliasbyname_r <not supported>
- getaliasbyname_r <not supported>
__nscd_getpwnam_r <not supported>
__nscd_getpwuid_r <not supported>
- nscd_getpw_r <not supported>
__nscd_getgrgid_r <not supported>
__nscd_getgrnam_r <not supported>
- nscd_getgr_r <not supported>
__nscd_gethostbyaddr_r <not supported>
__nscd_gethostbyname2_r <not supported>
__nscd_gethostbyname_r <not supported>
- nscd_gethst_r <not supported>
- __getutent_r <desired> <---
- getutent_r <desired> <---
- getutent_r_unknown <not supported>
- getutid_r_unknown <not supported>
- getutline_r_unknown <not supported>
+ __getutent_r <not supported>
__getutid_r <not supported>
- getutid_r <desired> <---
__getutline_r <not supported>
- 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>
- ptsname_r <not supported>
2.8 Additional thread-safe functions implemented by Proventhreads
@@ -341,9 +339,9 @@ http://www.vitanuova.com/inferno/index.html
See description above. This applies only to the C library included
in the proventhreads distribution.
- inet_ntoa_r <desired> <---
- gethostbyaddr_r <desired> <---
- gethostbyname_r <desired> <---
+ inet_ntoa_r <implemented>
+ gethostbyaddr_r <implemented>
+ gethostbyname_r <implemented>
gethostent_r <not supported>
getnetbyaddr_r <desired> <---
getnetbyname_r <desired> <---
@@ -351,9 +349,9 @@ http://www.vitanuova.com/inferno/index.html
getprotobynumber_r <desired> <---
getprotoent_r <desired> <---
getprotobyname_r <desired> <---
- getservbyname_r <desired> <---
- getservbyport_r <desired> <---
- getservent_r <desired> <---
+ getservbyname_r <implemented>
+ getservbyport_r <implemented>
+ getservent_r <implemented>
3. List of functions in uClibc that use static data structures
@@ -375,11 +373,38 @@ http://www.vitanuova.com/inferno/index.html
--------------------------------------------------------------------
+ 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 unsigned char PADDING[64] <fix desired> <---
+ static const char __md5__magic[];
+ static const unsigned char __md5_itoa64[];
- NOTE: This is okay, but should use the const keyword.
+ __md5_crypt_r <implemented>
+
+ No problems here...
+
--------------------------------------------------------------------
@@ -387,7 +412,8 @@ http://www.vitanuova.com/inferno/index.html
static char buf[16];
- inet_ntoa <inet_ntoa_r not implemented> <---
+ inet_ntoa <implemented>
+ inet_ntoa_r <implemented>
--------------------------------------------------------------------
@@ -398,12 +424,12 @@ http://www.vitanuova.com/inferno/index.html
static struct netent net;
static char *net_aliases[MAXALIASES];
- setnetent <fix required> <---
- endnetent <fix required> <---
- getnetent <getnetent_r required> <---
+ setnetent <mutex required>
+ endnetent <mutex required>
+ getnetent <mutex required>
+ getnetent_r <not implemented>
NOTE: setnetent and endnetent are not implemented in glibc.
- Proventhreads uses pthread mutexes to protect this static data.
--------------------------------------------------------------------
@@ -415,14 +441,16 @@ http://www.vitanuova.com/inferno/index.html
static char *proto_aliases[MAXALIASES];
static int proto_stayopen;
- setprotoent <fix required> <---
- endprotoent <fix required> <---
- getprotoent <getprotoent_r required> <---
- getprotobyname <getprotobyname_r required> <---
- getprotobynumber <getprotobynumber required> <---
+ 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.
- Proventhreads uses pthread mutexes to protect this static data.
--------------------------------------------------------------------
@@ -434,48 +462,44 @@ http://www.vitanuova.com/inferno/index.html
static char *serv_aliases[MAXALIASES];
static int serv_stayopen;
- setservent <fix required> <---
- endservent <fix required> <---
- getservent <getservent_r required> <---
- getservbyname <getservbyname_r required> <---
- getservbyport <getservbyport_r required> <---
+ 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.
- Proventhreads uses pthread mutexes to protect this static data.
--------------------------------------------------------------------
- net/resolv.c:
+ static struct hostent h;
+ static char buf[xxx];
- static int id = 1;
- static int ns = 0;
+ gethostbyname <implemented>
- dns_lookup <fix required> <---
- NOTE: dns_lookup is not implemented by glibc or Proventhreads.
+ static struct hostent h;
+ static char buf[xxx];
- static struct hostent h;
- static char namebuf[256];
- static struct in_addr in;
- static struct in_addr *addr_list[2];
+ gethostbyname2 <implemented>
- gethostbyname <gethostbyname_r required> <---
+ static struct hostent h;
+ static char buf[xxx];
- static struct hostent h;
- static char namebuf[256];
- static struct in_addr in;
- static struct in_addr *addr_list[2];
+ gethostbyaddr <implemented>
- gethostbyaddr <gethostbyaddr_r required> <---
- static struct hostent h;
- static struct in_addr in;
- static struct in_addr *addr_list[2];
- static char line[80];
+ static int __stay_open;
+ static FILE * __gethostent_fp;
+ static struct hostent h;
+ static char buf[xxx];
- read_etc_hosts <fix required> <---
-
- NOTE: dns_lookup is not implemented by glibc or Proventhreads.
+ gethostent <mutex required>
+ sethostent <mutex required>
+ endhostent <mutex required>
--------------------------------------------------------------------
@@ -912,7 +936,10 @@ http://www.vitanuova.com/inferno/index.html
static uint64_t value;
- __gen_tempname <fix required> <---
+ __gen_tempname <no fix required>
+
+ This is supposed to be random trash, so the more threading
+ collisions the better...
--------------------------------------------------------------------
@@ -952,7 +979,8 @@ http://www.vitanuova.com/inferno/index.html
static char buff[MNTMAXSTR];
static struct mntent mnt;
- getmntent <getmntent_r required> <---
+ getmntent <mutex required>
+ getmntent_r <implemented>
--------------------------------------------------------------------
@@ -1086,19 +1114,20 @@ http://www.vitanuova.com/inferno/index.html
misc/utmp/utent.c:
- static int ut_fd = -1;
+ 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 <fix required> <---
- endutent <fix required> <---
- getutent <fix required> <---
- getutid <fix required> <---
- getutline <fix required> <---
- pututline <fix required> <---
- utmpname <fix required> <---
-
- static struct utmp utmp;
- __getutent <fix required> <---
+ setutent <ok>
+ endutent <ok>
+ getutent <ok>
+ getutid <ok>
+ getutline <ok>
+ pututline <ok>
+ utmpname <ok>
+ __getutent <ok>
--------------------------------------------------------------------
@@ -1191,16 +1220,21 @@ http://www.vitanuova.com/inferno/index.html
static int _bsearch;
- bsearch <fix required> <---
+ bsearch <ok>
--------------------------------------------------------------------
- stdlib/putenv.c:
+ stdlib/setenv.c:
- static char **mall_env = 0;
- static int extras = 0;
+ static char **last_environ;
- putenv <fix required> <---
+ __add_to_environ <ok>
+ unsetenv <ok>
+ setenv <ok>
+ clearenv <ok>
+ putenv <ok>
+
+ all ok now.
--------------------------------------------------------------------
@@ -1219,17 +1253,6 @@ http://www.vitanuova.com/inferno/index.html
--------------------------------------------------------------------
- stdlib/setenv.c:
-
- static pthread_once__t _once_block = pthread_once_init; (1)
- static pthread_mutex_t _setenv_mutex; (1)
- static char **last_environ = NULL; (1)
-
- 1: Obviously, nothing to do here. (Unless I change the way we
- deal with threads).
-
- --------------------------------------------------------------------
-
stdlib/malloc/avlmacro.h
static objname *__Avl_##objname##pr##_new_node;
@@ -1252,30 +1275,12 @@ http://www.vitanuova.com/inferno/index.html
stdlib/malloc-930716/malloc.c:
- static int heapsize;
- static int initialized;
- static size_t pagesize;
+ A bunch of stuff
- inititalize <fix required> <---
- morecore <fix required> <---
- malloc <fix required> <---
-
- --------------------------------------------------------------------
-
- stdlib/malloc-930716/valloc.c:
-
- static size_t pagesize;
-
- valloc <fix required> <---
-
- --------------------------------------------------------------------
-
- string/config.c:
-
- static char *args[16];
- static char cfgbuf[128];
-
- cfgread <fix required> <---
+ malloc <ok>
+ realloc <ok>
+ free <ok>
+ etc <ok>
--------------------------------------------------------------------
@@ -1285,7 +1290,7 @@ http://www.vitanuova.com/inferno/index.html
static char retbuf[33];
strerror <fix required> <---
- main <fix required> <---
+ strerror_r <fix required> <---
--------------------------------------------------------------------
@@ -1302,87 +1307,8 @@ http://www.vitanuova.com/inferno/index.html
static char *save = 0;
- strtok <strtok_r implemented> <---
-
- --------------------------------------------------------------------
-
- sysdeps/linux/common/kernel_version.c:
-
- static int __linux_kernel_version = -1;
-
- __get_linux_kernel_version <fix required> (1)
-
- 1: This static value never actually gets updated! This a bug.
-
- --------------------------------------------------------------------
-
- sysdeps/linux/i386/bits/huge_val.h:
-
- static __huge_val_t __huge_val <fix desired> <---
- static __huge_valf_t __huge_valf <fix desired> <---
- static __huge_vall_t __huge_vall <fix desired> <---
-
- NOTE: These are okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- sysdeps/linux/i386/bits/nan.h:
-
- static union { ... } __nan_union <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- sysdeps/linux/m68k/bits/huge_val.h:
-
- static union { ... } __huge_val <fix desired> <---
- static union { ... } __huge_valf <fix desired> <---
- static union { ... } __huge_vall <fix desired> <---
-
- NOTE: These are okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- sysdeps/linux/m68k/bits/nan.h:
-
- static union { ... } __nan_union <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- sysdeps/linux/sh/bits/huge_val.h:
-
- static __huge_val_t __huge_val <fix desired> <---
- static __huge_valf_t __huge_valf <fix desired> <---
-
- NOTE: These are okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- sysdeps/linux/sh/bits/nan.h:
-
- static union { ... } __nan_union <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- sysdeps/linux/sparc/bits/huge_val.h:
-
- static __huge_val_t __huge_val <fix desired> <---
- static __huge_valf_t __huge_valf <fix desired> <---
-
- NOTE: These are okay, but should use the const keyword.
-
- --------------------------------------------------------------------
-
- sysdeps/linux/sparc/bits/nan.h:
-
- static union { ... } __nan_union <fix desired> <---
-
- NOTE: This is okay, but should use the const keyword.
+ strtok <ok>
+ strtok_r <ok>
--------------------------------------------------------------------
@@ -1418,20 +1344,6 @@ http://www.vitanuova.com/inferno/index.html
--------------------------------------------------------------------
- unistd/getcwd.c:
-
- static char *path_buf;
- static int path_size;
- static dev_t root_dev;
- static ino_t root_ino;
- static struct stat st;
-
- getswd <fix required> <---
- recurser <fix required> <---
- search_dir <fix required> <---
-
- --------------------------------------------------------------------
-
unistd/getopt.c:
static int sp = 1;