summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.in2
-rw-r--r--extra/config/Makefile2
-rw-r--r--include/resolv.h14
-rw-r--r--ldso/include/ldso.h5
-rw-r--r--libc/inet/resolv.c54
-rw-r--r--libc/misc/internals/__uClibc_main.c6
-rw-r--r--libc/misc/time/ftime.c6
-rw-r--r--libc/sysdeps/linux/common/bits/syscalls-common.h17
-rw-r--r--libc/sysdeps/linux/common/clock_gettime.c10
-rw-r--r--libc/sysdeps/linux/common/prctl.c2
-rw-r--r--libc/sysdeps/linux/common/time.c13
-rw-r--r--libc/sysdeps/linux/common/times.c2
-rw-r--r--libc/sysdeps/linux/powerpc/bits/sysdep.h10
-rw-r--r--libc/sysdeps/linux/sparc/sigaction.c9
-rw-r--r--libm/Makefile.in4
-rw-r--r--libm/float_wrappers.c7
-rw-r--r--test/inet/gethostid.c6
-rw-r--r--test/math/compile_test.c4
18 files changed, 115 insertions, 58 deletions
diff --git a/Makefile.in b/Makefile.in
index 31c1754cd..c89d6fedd 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -264,7 +264,7 @@ HEADERS_RM-$(UCLIBC_HAS_BSD_ERR) += err.h
HEADERS_RM-$(UCLIBC_HAS_CRYPT) += crypt.h
HEADERS_RM-$(UCLIBC_HAS_EPOLL) += sys/epoll.h
HEADERS_RM-$(UCLIBC_HAS_FENV) += fenv.h bits/fenv.h bits/fenvinline.h
-HEADERS_RM-$(if $(findstring y,$(UCLIBC_HAS_FTW)$(UCLIBC_HAS_NFTW)),,y) += ftw.h
+HEADERS_RM-$(findstring y,$(UCLIBC_HAS_FTW)$(UCLIBC_HAS_NFTW)) += ftw.h
HEADERS_RM-$(UCLIBC_HAS_GETTEXT_AWARENESS) += libintl.h
HEADERS_RM-$(UCLIBC_HAS_GLIBC_CUSTOM_PRINTF) += printf.h
HEADERS_RM-$(UCLIBC_HAS_GLOB) += glob.h
diff --git a/extra/config/Makefile b/extra/config/Makefile
index 04175e541..ce406adc2 100644
--- a/extra/config/Makefile
+++ b/extra/config/Makefile
@@ -74,7 +74,7 @@ $(obj)/%:: $(top_srcdir)$(src)/%_shipped
$(Q)cat $< > $@
endif
menuconfig_clean:
- $(do_rm) $(clean-files) conf $(wildcard *.o)
+ $(do_rm) $(clean-files) $(lxdialog) conf $(wildcard *.o)
distclean: clean
$(do_rm) $(lxdialog) $(conf-objs) $(mconf-objs) \
$(kxgettext-objs) \
diff --git a/include/resolv.h b/include/resolv.h
index e0cd35db1..6f69806c4 100644
--- a/include/resolv.h
+++ b/include/resolv.h
@@ -114,22 +114,20 @@ typedef res_sendhookact (*res_send_rhook) (const struct sockaddr_in *ns,
* I guess it's safe to set that to N.
*/
struct __res_state {
-#ifdef __UCLIBC_HAS_COMPAT_RES_STATE__
- int retrans; /* retransmission time interval */
- int retry; /* number of times to retransmit */
-#endif
+ /*int retrans, retry; - moved, was here */
u_int32_t options; /* (was: ulong) option flags - see below. */
struct sockaddr_in nsaddr_list[MAXNS]; /* address of name server */
#define nsaddr nsaddr_list[0] /* for backward compatibility */
char *dnsrch[MAXDNSRCH + 1]; /* components of domain to search */
+ /*char defdname[256]; - moved, was here */
+ u_int8_t nscount; /* (was: int) number of name servers */
+ u_int8_t ndots; /* (was: unsigned:4) threshold for initial abs. query */
+ u_int8_t retrans; /* (was: int) retransmission time interval */
+ u_int8_t retry; /* (was: int) number of times to retransmit */
#ifdef __UCLIBC_HAS_COMPAT_RES_STATE__
/* googling for "_res.defdname" says it's still sometimes used.
* Pity. It's huge, I want to move it to EXTRA_COMPAT... */
char defdname[256]; /* default domain (deprecated) */
-#endif
- u_int8_t nscount; /* (was: int) number of name servers */
- u_int8_t ndots; /* (was: unsigned:4) threshold for initial abs. query */
-#ifdef __UCLIBC_HAS_COMPAT_RES_STATE__
u_int8_t nsort; /* (was: unsigned:4) number of elements in sort_list[] */
u_int16_t pfcode; /* (was: ulong) RES_PRF_ flags. Used by dig. */
unsigned short id; /* current message id */
diff --git a/ldso/include/ldso.h b/ldso/include/ldso.h
index 99dcf839c..e5669057c 100644
--- a/ldso/include/ldso.h
+++ b/ldso/include/ldso.h
@@ -72,6 +72,11 @@ extern char *_dl_ldsopath; /* Where the shared lib loader was found
extern const char *_dl_progname; /* The name of the executable being run */
extern size_t _dl_pagesize; /* Store the page size for use later */
+#ifdef USE_TLS
+extern void _dl_add_to_slotinfo (struct link_map *l);
+extern void ** __attribute__ ((const)) _dl_initial_error_catch_tsd (void);
+#endif
+
#ifdef __SUPPORT_LD_DEBUG__
extern char *_dl_debug;
extern char *_dl_debug_symbols;
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)
diff --git a/libm/Makefile.in b/libm/Makefile.in
index 56b2d76c3..6eb935851 100644
--- a/libm/Makefile.in
+++ b/libm/Makefile.in
@@ -75,7 +75,7 @@ libm_CSRC := \
s_remquo.c w_exp2.c
# Not implemented [yet?], see comment in float_wrappers.c:
-# exp2f.o fdimf.o fmaf.o fmaxf.o fminf.o log2f.o
+# fdimf.o fmaf.o fmaxf.o fminf.o
# nearbyintf.o remquof.o scalblnf.o tgammaf.o
FL_MOBJ := \
acosf.o \
@@ -93,6 +93,7 @@ FL_MOBJ := \
coshf.o \
erfcf.o \
erff.o \
+ exp2f.o \
expf.o \
expm1f.o \
fabsf.o \
@@ -108,6 +109,7 @@ FL_MOBJ := \
llroundf.o \
log10f.o \
log1pf.o \
+ log2f.o \
logbf.o \
logf.o \
lrintf.o \
diff --git a/libm/float_wrappers.c b/libm/float_wrappers.c
index 93d56c3c9..a13aac93a 100644
--- a/libm/float_wrappers.c
+++ b/libm/float_wrappers.c
@@ -40,13 +40,12 @@ long long func##f (float x) \
/* For the time being, do _NOT_ implement these functions
- * that are defined by SuSv3 [why?] */
-#undef L_exp2f /*float exp2f(float);*/
+ * that are defined by SuSv3 [because we don't need them
+ * and nobody asked to include them] */
#undef L_fdimf /*float fdimf(float, float);*/
#undef L_fmaf /*float fmaf(float, float, float);*/
#undef L_fmaxf /*float fmaxf(float, float);*/
#undef L_fminf /*float fminf(float, float);*/
-#undef L_log2f /*float log2f(float);*/
#undef L_nearbyintf /*float nearbyintf(float);*/
#undef L_nexttowardf /*float nexttowardf(float, long double);*/
#undef L_remquof /*float remquof(float, float, int *);*/
@@ -70,6 +69,7 @@ float cosf(float);
float coshf(float);
float erfcf(float);
float erff(float);
+float exp2f(float);
float expf(float);
float expm1f(float);
float fabsf(float);
@@ -83,6 +83,7 @@ float lgammaf(float);
long long llroundf(float);
float log10f(float);
float log1pf(float);
+float log2f(float);
float logbf(float);
float logf(float);
long lroundf(float);
diff --git a/test/inet/gethostid.c b/test/inet/gethostid.c
new file mode 100644
index 000000000..295166536
--- /dev/null
+++ b/test/inet/gethostid.c
@@ -0,0 +1,6 @@
+#include <unistd.h>
+#include <stdio.h>
+int main(void) {
+ printf("hostid=%d\n", gethostid());
+ return 0;
+}
diff --git a/test/math/compile_test.c b/test/math/compile_test.c
index 61488857a..ab8c40c48 100644
--- a/test/math/compile_test.c
+++ b/test/math/compile_test.c
@@ -18,7 +18,7 @@ r += cosf(float_x);
r += coshf(float_x);
r += erfcf(float_x);
r += erff(float_x);
-/*r += exp2f(float_x); - uclibc does not have it (yet?) */
+r += exp2f(float_x);
r += expf(float_x);
r += expm1f(float_x);
r += fabsf(float_x);
@@ -38,7 +38,7 @@ r += llrintf(float_x);
r += llroundf(float_x);
r += log10f(float_x);
r += log1pf(float_x);
-/*r += log2f(float_x); - uclibc does not have it (yet?) */
+r += log2f(float_x);
r += logbf(float_x);
r += logf(float_x);
r += lrintf(float_x);