diff options
author | Austin Foxley <austinf@cetoncorp.com> | 2010-02-05 11:10:14 -0800 |
---|---|---|
committer | Austin Foxley <austinf@cetoncorp.com> | 2010-02-05 11:10:32 -0800 |
commit | f7eba78a7464c7b31326abf92dab254608835028 (patch) | |
tree | 5558a9e8d2c7c4484387030427701d81bd8b83e5 /libc | |
parent | 3e808a4c28f214314e8457672fae0f5d17f5450a (diff) | |
parent | df1580676a48dc3a9faf7e508ad3ec822a8e5a05 (diff) |
Merge commit 'origin/master' into nptl
Signed-off-by: Austin Foxley <austinf@cetoncorp.com>
Diffstat (limited to 'libc')
-rw-r--r-- | libc/inet/resolv.c | 54 | ||||
-rw-r--r-- | libc/misc/internals/__uClibc_main.c | 6 | ||||
-rw-r--r-- | libc/misc/time/ftime.c | 6 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/bits/syscalls-common.h | 17 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/clock_gettime.c | 10 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/prctl.c | 2 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/time.c | 13 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/times.c | 2 | ||||
-rw-r--r-- | libc/sysdeps/linux/powerpc/bits/sysdep.h | 10 | ||||
-rw-r--r-- | libc/sysdeps/linux/sparc/sigaction.c | 9 |
10 files changed, 87 insertions, 42 deletions
diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c index ee1323e76..0a6fd7aaf 100644 --- a/libc/inet/resolv.c +++ b/libc/inet/resolv.c @@ -407,6 +407,8 @@ __UCLIBC_MUTEX_EXTERN(__resolv_lock); /* Protected by __resolv_lock */ extern void (*__res_sync)(void) attribute_hidden; /*extern uint32_t __resolv_opts attribute_hidden; */ +extern uint8_t __resolv_timeout attribute_hidden; +extern uint8_t __resolv_attempts attribute_hidden; extern unsigned __nameservers attribute_hidden; extern unsigned __searchdomains attribute_hidden; extern sockaddr46_t *__nameserver attribute_hidden; @@ -499,7 +501,7 @@ extern void __close_nameservers(void) attribute_hidden; * Allows addresses returned by gethostbyname to be sorted. * Not supported. * options option[ option]... - * (so far we support none) + * (so far we support timeout:n and attempts:n) * $RES_OPTIONS (space-separated list) is to be added to "options" * debug sets RES_DEBUG in _res.options * ndots:n how many dots there should be so that name will be tried @@ -526,7 +528,7 @@ extern void __close_nameservers(void) attribute_hidden; * * We will read and analyze /etc/resolv.conf as needed before * we do a DNS request. This happens in __dns_lookup. - * (TODO: also re-parse it after a timeout, to catch updates). + * It is reread if its mtime is changed. * * BSD has res_init routine which is used to initialize resolver state * which is held in global structure _res. @@ -903,6 +905,8 @@ __UCLIBC_MUTEX_INIT(__resolv_lock, PTHREAD_MUTEX_INITIALIZER); /* Protected by __resolv_lock */ void (*__res_sync)(void); /*uint32_t __resolv_opts; */ +uint8_t __resolv_timeout; +uint8_t __resolv_attempts; unsigned __nameservers; unsigned __searchdomains; sockaddr46_t *__nameserver; @@ -970,6 +974,9 @@ void attribute_hidden __open_nameservers(void) if (__nameservers) goto sync; + __resolv_timeout = RES_TIMEOUT; + __resolv_attempts = RES_DFLRETRY; + fp = fopen("/etc/resolv.conf", "r"); #ifdef FALLBACK_TO_CONFIG_RESOLVCONF if (!fp) { @@ -1048,7 +1055,24 @@ void attribute_hidden __open_nameservers(void) continue; } /* if (strcmp(keyword, "sortlist") == 0)... */ - /* if (strcmp(keyword, "options") == 0)... */ + if (strcmp(keyword, "options") == 0) { + char *p1; + uint8_t *what; + + if (p == NULL || (p1 = strchr(p, ':')) == NULL) + continue; + *p1++ = '\0'; + if (p1 == NULL) + continue; + if (strcmp(p, "timeout") == 0) + what = &__resolv_timeout; + else if (strcmp(p, "attempts") == 0) + what = &__resolv_attempts; + else + continue; + *what = atoi(p1); + DPRINTF("option %s:%d\n", p, *what); + } } fclose(fp); } @@ -1285,8 +1309,7 @@ int attribute_hidden __dns_lookup(const char *name, local_ns_num = 0; if (_res.options & RES_ROTATE) */ local_ns_num = last_ns_num; -/*TODO: use _res.retry */ - retries_left = __nameservers * RES_DFLRETRY; + retries_left = __nameservers * __resolv_attempts; } retries_left--; if (local_ns_num >= __nameservers) @@ -1345,8 +1368,7 @@ int attribute_hidden __dns_lookup(const char *name, send(fd, packet, packet_len, 0); #ifdef USE_SELECT -/*TODO: use _res.retrans*/ - reply_timeout = RES_TIMEOUT; + reply_timeout = __resolv_timeout; wait_again: FD_ZERO(&fds); FD_SET(fd, &fds); @@ -1360,7 +1382,7 @@ int attribute_hidden __dns_lookup(const char *name, } reply_timeout--; #else - reply_timeout = RES_TIMEOUT * 1000; + reply_timeout = __resolv_timeout * 1000; wait_again: fds.fd = fd; fds.events = POLLIN; @@ -2878,6 +2900,8 @@ static void res_sync_func(void) __nameserver[n].sa4 = rp->nsaddr_list[n]; /* struct copy */ #endif } + __resolv_timeout = rp->retrans; + __resolv_attempts = rp->retry; /* Extend and comment what program is known * to use which _res.XXX member(s). @@ -2904,13 +2928,17 @@ int res_init(void) memset(rp, 0, sizeof(*rp)); rp->options = RES_INIT; -#ifdef __UCLIBC_HAS_COMPAT_RES_STATE__ rp->retrans = RES_TIMEOUT; - rp->retry = 4; -/*TODO: pulls in largish static buffers... use simpler one? */ - rp->id = random(); -#endif + rp->retry = RES_DFLRETRY; rp->ndots = 1; +#ifdef __UCLIBC_HAS_COMPAT_RES_STATE__ + /* Was: "rp->id = random();" but: + * - random() pulls in largish static buffers + * - isn't actually random unless, say, srandom(time(NULL)) was called + * - is not used by uclibc anyway :) + */ + /* rp->id = 0; - memset did it */ +#endif #ifdef __UCLIBC_HAS_EXTRA_COMPAT_RES_STATE__ rp->_vcsock = -1; #endif diff --git a/libc/misc/internals/__uClibc_main.c b/libc/misc/internals/__uClibc_main.c index c5feedeba..f7e45c60c 100644 --- a/libc/misc/internals/__uClibc_main.c +++ b/libc/misc/internals/__uClibc_main.c @@ -179,11 +179,9 @@ extern void __uClibc_init(void); libc_hidden_proto(__uClibc_init) void __uClibc_init(void) { - static smallint been_there_done_that; - - if (been_there_done_that) + /* Don't recurse */ + if (__pagesize) return; - been_there_done_that++; /* Setup an initial value. This may not be perfect, but is * better than malloc using __pagesize=0 for atexit, ctors, etc. */ diff --git a/libc/misc/time/ftime.c b/libc/misc/time/ftime.c index b2273860c..ff78d418a 100644 --- a/libc/misc/time/ftime.c +++ b/libc/misc/time/ftime.c @@ -25,8 +25,10 @@ int ftime(struct timeb *timebuf) struct timeval tv; struct timezone tz; - if (gettimeofday (&tv, &tz) < 0) - return -1; + /* In Linux, gettimeofday fails only on bad parameter. + * We know that here parameters aren't bad. + */ + gettimeofday (&tv, &tz); timebuf->time = tv.tv_sec; timebuf->millitm = (tv.tv_usec + 999) / 1000; diff --git a/libc/sysdeps/linux/common/bits/syscalls-common.h b/libc/sysdeps/linux/common/bits/syscalls-common.h index 78bbf6c22..5e4e350c5 100644 --- a/libc/sysdeps/linux/common/bits/syscalls-common.h +++ b/libc/sysdeps/linux/common/bits/syscalls-common.h @@ -33,6 +33,9 @@ #ifndef INLINE_SYSCALL # define INLINE_SYSCALL(name, nr, args...) INLINE_SYSCALL_NCS(__NR_##name, nr, args) #endif +#ifndef INLINE_SYSCALL_NOERR +# define INLINE_SYSCALL_NOERR(name, nr, args...) INLINE_SYSCALL_NOERR_NCS(__NR_##name, nr, args) +#endif /* Just like INLINE_SYSCALL(), but take a non-constant syscall (NCS) argument */ #ifndef INLINE_SYSCALL_NCS @@ -47,6 +50,14 @@ __res; \ }) #endif +#ifndef INLINE_SYSCALL_NOERR_NCS +# define INLINE_SYSCALL_NOERR_NCS(name, nr, args...) \ +({ \ + INTERNAL_SYSCALL_DECL(__err); \ + long __res = INTERNAL_SYSCALL_NCS(name, __err, nr, args); \ + __res; \ +}) +#endif /* No point in forcing people to implement both when they only need one */ #ifndef INTERNAL_SYSCALL @@ -80,8 +91,14 @@ type name(C_DECL_ARGS_##nargs(args)) { \ return (type)INLINE_SYSCALL(name, nargs, C_ARGS_##nargs(args)); \ } +#define SYSCALL_NOERR_FUNC(nargs, type, name, args...) \ +type name(C_DECL_ARGS_##nargs(args)) { \ + return (type)INLINE_SYSCALL_NOERR(name, nargs, C_ARGS_##nargs(args)); \ +} + #define _syscall0(args...) SYSCALL_FUNC(0, args) #define _syscall1(args...) SYSCALL_FUNC(1, args) +#define _syscall_noerr1(args...) SYSCALL_NOERR_FUNC(1, args) #define _syscall2(args...) SYSCALL_FUNC(2, args) #define _syscall3(args...) SYSCALL_FUNC(3, args) #define _syscall4(args...) SYSCALL_FUNC(4, args) diff --git a/libc/sysdeps/linux/common/clock_gettime.c b/libc/sysdeps/linux/common/clock_gettime.c index 888cd64b0..d3755a7a8 100644 --- a/libc/sysdeps/linux/common/clock_gettime.c +++ b/libc/sysdeps/linux/common/clock_gettime.c @@ -23,10 +23,12 @@ int clock_gettime(clockid_t clock_id, struct timespec* tp) switch (clock_id) { case CLOCK_REALTIME: - retval = gettimeofday(&tv, NULL); - if (retval == 0) { - TIMEVAL_TO_TIMESPEC(&tv, tp); - } + /* In Linux, gettimeofday fails only on bad parameter. + * We know that here parameter isn't bad. + */ + gettimeofday(&tv, NULL); + TIMEVAL_TO_TIMESPEC(&tv, tp); + retval = 0; break; default: diff --git a/libc/sysdeps/linux/common/prctl.c b/libc/sysdeps/linux/common/prctl.c index a6764c532..39c0d4fb0 100644 --- a/libc/sysdeps/linux/common/prctl.c +++ b/libc/sysdeps/linux/common/prctl.c @@ -13,5 +13,5 @@ #ifdef __NR_prctl extern int prctl (int, long, long, long, long); -_syscall5(int, prctl, int, option, long, arg2, long, arg3, long, arg4, long, arg5) +_syscall5(int, prctl, int, option, long, _a2, long, _a3, long, _a4, long, _a5) #endif diff --git a/libc/sysdeps/linux/common/time.c b/libc/sysdeps/linux/common/time.c index 0d9e412bf..e13b44f4d 100644 --- a/libc/sysdeps/linux/common/time.c +++ b/libc/sysdeps/linux/common/time.c @@ -13,19 +13,18 @@ #ifdef __NR_time -_syscall1(time_t, time, time_t *, t) +_syscall_noerr1(time_t, time, time_t *, t) #else - time_t time(time_t * t) { time_t result; struct timeval tv; - if (gettimeofday(&tv, (struct timezone *) NULL)) { - result = (time_t) - 1; - } else { - result = (time_t) tv.tv_sec; - } + /* In Linux, gettimeofday fails only on bad parameter. + * We know that here parameter isn't bad. + */ + gettimeofday(&tv, NULL); + result = (time_t) tv.tv_sec; if (t != NULL) { *t = result; } diff --git a/libc/sysdeps/linux/common/times.c b/libc/sysdeps/linux/common/times.c index e71d1bd71..37ae040d4 100644 --- a/libc/sysdeps/linux/common/times.c +++ b/libc/sysdeps/linux/common/times.c @@ -11,5 +11,5 @@ #include <sys/times.h> -_syscall1(clock_t, times, struct tms *, buf) +_syscall_noerr1(clock_t, times, struct tms *, buf) libc_hidden_def(times) diff --git a/libc/sysdeps/linux/powerpc/bits/sysdep.h b/libc/sysdeps/linux/powerpc/bits/sysdep.h index c42efbabd..478ebdd7a 100644 --- a/libc/sysdeps/linux/powerpc/bits/sysdep.h +++ b/libc/sysdeps/linux/powerpc/bits/sysdep.h @@ -182,7 +182,6 @@ # undef INTERNAL_SYSCALL_DECL # define INTERNAL_SYSCALL_DECL(err) long int err -# undef INTERNAL_SYSCALL # define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ ({ \ register long int r0 __asm__ ("r0"); \ @@ -196,7 +195,7 @@ register long int r10 __asm__ ("r10"); \ register long int r11 __asm__ ("r11"); \ register long int r12 __asm__ ("r12"); \ - LOADARGS_##nr(name, args); \ + LOADARGS_##nr(name, args); \ __asm__ __volatile__ \ ("sc \n\t" \ "mfcr %0" \ @@ -208,6 +207,7 @@ err = r0; \ (int) r3; \ }) +# undef INTERNAL_SYSCALL # define INTERNAL_SYSCALL(name, err, nr, args...) \ INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, ##args) @@ -218,11 +218,11 @@ # undef INTERNAL_SYSCALL_ERRNO # define INTERNAL_SYSCALL_ERRNO(val, err) (val) -# define LOADARGS_0(name, dummy) \ +# define LOADARGS_0(name, dummy) \ r0 = name # define LOADARGS_1(name, __arg1) \ - long int arg1 = (long int) (__arg1); \ - LOADARGS_0(name, 0); \ + long int arg1 = (long int) (__arg1); \ + LOADARGS_0(name, 0); \ extern void __illegally_sized_syscall_arg1 (void); \ if (__builtin_classify_type (__arg1) != 5 && sizeof (__arg1) > 4) \ __illegally_sized_syscall_arg1 (); \ diff --git a/libc/sysdeps/linux/sparc/sigaction.c b/libc/sysdeps/linux/sparc/sigaction.c index a22ac40af..7140fd3a4 100644 --- a/libc/sysdeps/linux/sparc/sigaction.c +++ b/libc/sysdeps/linux/sparc/sigaction.c @@ -34,7 +34,8 @@ _syscall5(int, rt_sigaction, int, a, int, b, int, c, int, d, int, e); static void __rt_sigreturn_stub(void); static void __sigreturn_stub(void); -int __libc_sigaction(int sig, const struct sigaction *act, struct sigaction *oact) +libc_hidden_proto(sigaction) +int sigaction(int sig, const struct sigaction *act, struct sigaction *oact) { int ret; struct sigaction kact, koact; @@ -65,10 +66,8 @@ int __libc_sigaction(int sig, const struct sigaction *act, struct sigaction *oac return ret; } -#ifndef LIBC_SIGACTION -weak_alias(__libc_sigaction,sigaction) -libc_hidden_weak(sigaction) -#endif +libc_hidden_def(sigaction) +weak_alias(sigaction,__libc_sigaction) static void __rt_sigreturn_stub(void) |