Browse Source

merge upstream changes

Waldemar Brodkorb 9 years ago
parent
commit
da932d5916

+ 1 - 1
Makefile.in

@@ -276,7 +276,7 @@ HEADERS_RM-$(UCLIBC_HAS_GETTEXT_AWARENESS)   += libintl.h
 HEADERS_RM-$(UCLIBC_HAS_GLIBC_CUSTOM_PRINTF) += printf.h
 HEADERS_RM-$(UCLIBC_HAS_GLOB)                += glob.h
 HEADERS_RM-$(UCLIBC_HAS_GNU_ERROR)           += error.h
-HEADERS_RM-$(UCLIBC_HAS_GNU_GETOPT)$(UCLIBC_HAS_GETOPT_LONG) += getopt.h
+HEADERS_RM-$(UCLIBC_HAS_GETOPT_LONG)         += getopt.h
 HEADERS_RM-$(UCLIBC_HAS_IPV6)                += netinet/ip6.h netinet/icmp6.h
 HEADERS_RM-$(UCLIBC_HAS_BACKTRACE)           += execinfo.h
 HEADERS_RM-$(UCLIBC_HAS_LOCALE)              += iconv.h bits/uClibc_ctype.h

+ 14 - 14
extra/Configs/Config.in

@@ -1449,6 +1449,13 @@ config UCLIBC_HAS_STRING_ARCH_OPT
 	  These are small and fast, the only reason _not_ to say Y here is
 	  for debugging purposes.
 
+config UCLIBC_HAS_STDIO_FUTEXES
+	bool "Use futexes for multithreaded I/O locking"
+	depends on UCLIBC_HAS_THREADS_NATIVE
+	help
+	  If you want to compile uClibc to use futexes for low-level
+	  I/O locking, answer Y.  Otherwise, answer N.
+
 config UCLIBC_HAS_CTYPE_TABLES
 	bool "Use Table Versions Of 'ctype.h' Functions."
 	default y
@@ -1905,32 +1912,25 @@ config UCLIBC_HAS_GNU_GETOPT
 	help
 	  Answer Y if you want to include full gnu getopt() instead of a
 	  (much smaller) SUSv3 compatible getopt().
+	  Note that getopt_long, getopt_long_only as well as getsubopt
+	  are implemented on top of this choice.
 
 	  Most people will answer Y.
 
-config UCLIBC_HAS_STDIO_FUTEXES
-	bool "Use futexes for multithreaded I/O locking"
-	depends on UCLIBC_HAS_THREADS_NATIVE
-	help
-	  If you want to compile uClibc to use futexes for low-level
-	  I/O locking, answer Y.  Otherwise, answer N.
-
 config UCLIBC_HAS_GETOPT_LONG
-	bool "Support getopt_long/getopt_long_only"
-	depends on !UCLIBC_HAS_GNU_GETOPT
+	bool "Support getopt_long/getopt_long_only (glibc-compat)"
 	default y
 	help
-	  Answer Y if you want to include getopt_long[_only() used by many
-	  apps, even busybox.
+	  Answer Y if you want to include getopt_long[_only()] used by many
+	  apps.
 
 	  Most people will answer Y.
 
 config UCLIBC_HAS_GNU_GETSUBOPT
-	bool "Support glibc getsubopt"
+	bool "Support getsubopt"
 	default y
 	help
-	  Answer Y if you want to include glibc getsubopt() instead of a
-	  smaller SUSv3 compatible getsubopt().
+	  Answer Y if you want to include getsubopt().
 
 	  Most people will answer Y.
 endmenu

+ 2 - 3
extra/config/conf.c

@@ -10,7 +10,6 @@
 #include <string.h>
 #include <time.h>
 #include <unistd.h>
-#include <getopt.h>
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <errno.h>
@@ -447,7 +446,7 @@ static void check_conf(struct menu *menu)
 }
 
 #if 00 // || !defined __UCLIBC__ || \
-	(defined UCLIBC_HAS_GETOPT_LONG || defined UCLIBC_HAS_GNU_GETOPT)
+	defined __UCLIBC_HAS_GETOPT_LONG__
 static struct option long_opts[] = {
 	{"oldaskconfig",    no_argument,       NULL, oldaskconfig},
 	{"oldconfig",       no_argument,       NULL, oldconfig},
@@ -526,7 +525,7 @@ int main(int ac, char **av)
 	tty_stdio = isatty(0) && isatty(1) && isatty(2);
 
 #if 00// !defined __UCLIBC__ || \
-	(defined UCLIBC_HAS_GETOPT_LONG || defined UCLIBC_HAS_GNU_GETOPT)
+	defined __UCLIBC_HAS_GETOPT_LONG__
 	while ((opt = getopt_long(ac, av, "", long_opts, NULL)) != -1)
 #else
 	char *gch = "asonymArDSld";

+ 1 - 1
include/getopt.h

@@ -1,4 +1,4 @@
-/* This file will not be installed if not using gnu getopt. */
+/* This file will not be installed if not using getopt_long. */
 
 #include <bits/getopt.h>
 

+ 7 - 6
libc/stdio/_fpmaxtostr.c

@@ -45,11 +45,6 @@
  */
 #define isnan(x)             ((x) != (x))
 
-/* Without seminumerical functions to examine the sign bit, this is
- * about the best we can do to test for '-0'.
- */
-#define zeroisnegative(x)    ((1./(x)) < 0)
-
 /*****************************************************************************/
 /* Don't change anything that follows peroid!!!  ;-)                         */
 /*****************************************************************************/
@@ -262,7 +257,13 @@ ssize_t _fpmaxtostr(FILE * fp, __fpmax_t x, struct printf_info *info,
 
 	if (x == 0) {				/* Handle 0 now to avoid false positive. */
 #ifdef __UCLIBC_HAVE_SIGNED_ZERO__
-		if (zeroisnegative(x)) { /* Handle 'signed' zero. */
+		union {
+			double x;
+			struct {
+				unsigned int l1, l2;
+			} i;
+		} u = {x};
+		if (u.i.l1 ^ u.i.l2) { /* Handle 'signed' zero. */
 			*sign_str = '-';
 		}
 #endif /* __UCLIBC_HAVE_SIGNED_ZERO__ */

+ 1 - 1
libc/sysdeps/linux/common/bits/getopt.h

@@ -126,7 +126,7 @@ extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
        __THROW;
 libc_hidden_proto(getopt)
 
-#if defined __UCLIBC_HAS_GNU_GETOPT__ || defined __UCLIBC_HAS_GETOPT_LONG__
+#if defined __UCLIBC_HAS_GETOPT_LONG__
 #ifndef __need_getopt
 extern int getopt_long (int ___argc, char *const *___argv,
 			const char *__shortopts,

+ 10 - 4
libc/unistd/Makefile.in

@@ -16,10 +16,16 @@ OMIT-$(ARCH_USE_MMU) += __exec_alloc.c
 OMIT-$(if $(UCLIBC_SUSV3_LEGACY),,y) += ualarm.c usleep.c
 #OMIT-$(UCLIBC_HAS_THREADS_NATIVE) += sleep.c
 
-# XXX: GNU_GETOPT comes with getopt_long unconditionally, which is wrong
-GO_LONG := $(if $(UCLIBC_HAS_GNU_GETOPT),getopt_long-simple.c)
-OMIT-y += $(if $(UCLIBC_HAS_GNU_GETOPT),getopt-susv3.c $(GO_LONG),getopt.c)
-OMIT-y += $(if $(UCLIBC_HAS_GNU_GETSUBOPT),getsubopt-susv3.c,getsubopt.c)
+ifeq ($(UCLIBC_HAS_GNU_GETOPT),y)
+# GNU getopt family
+OMIT-y += getopt-susv3.c getopt_long-simple.c getsubopt-susv3.c
+OMIT-y += $(if $(UCLIBC_HAS_GNU_GETSUBOPT),,getsubopt.c)
+else
+# SuS getopt family
+OMIT-y += getopt.c getsubopt.c
+OMIT-y += $(if $(UCLIBC_HAS_GETOPT_LONG),,getopt_long-simple.c)
+OMIT-y += $(if $(UCLIBC_HAS_GNU_GETSUBOPT),,getsubopt-susv3.c)
+endif
 
 CSRC-y := $(filter-out $(OMIT-y),$(CSRC-y))
 

+ 2 - 0
libc/unistd/getopt.c

@@ -1162,6 +1162,7 @@ getopt (int argc, char *const *argv, const char *optstring)
 }
 libc_hidden_def(getopt)
 
+#if defined __UCLIBC_HAS_GETOPT_LONG__
 int
 getopt_long (int argc, char *const *argv, const char *options,
 	     const struct option *long_options, int *opt_index)
@@ -1180,5 +1181,6 @@ getopt_long_only (int argc, char *const *argv, const char *options,
 {
   return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
 }
+#endif /* __UCLIBC_HAS_GETOPT_LONG__ */
 
 #endif	/* Not ELIDE_CODE.  */

+ 3 - 0
test/Rules.mak

@@ -78,6 +78,9 @@ CFLAGS         := -nostdinc -I$(top_builddir)$(LOCAL_INSTALL_PATH)/usr/include
 CFLAGS         += $(XCOMMON_CFLAGS) $(KERNEL_INCLUDES) $(CC_INC)
 CFLAGS         += $(OPTIMIZATION) $(CPU_CFLAGS) $(XWARNINGS)
 
+$(eval $(call check-gcc-var,-Wno-missing-field-initializers))
+CFLAGS         += $(CFLAG_-Wno-missing-field-initializers)
+
 # Can't add $(OPTIMIZATION) here, it may be target-specific.
 # Just adding -Os for now.
 HOST_CFLAGS    += $(XCOMMON_CFLAGS) -Os $(XWARNINGS) -std=gnu99

+ 8 - 0
test/misc/Makefile.in

@@ -13,6 +13,14 @@ TESTS_DISABLED += tst-statfs # assuming host has LFS on
 endif
 CFLAGS_dirent64 := -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
 
+ifeq ($(UCLIBC_LINUX_SPECIFIC),)
+TESTS_DISABLED += tst-inotify
+endif
+
+ifeq ($(UCLIBC_HAS_GLOB),)
+TESTS_DISABLED += bug-glob2
+endif
+
 DODIFF_dirent    := 1
 DODIFF_dirent64  := 1
 DODIFF_tst-statfs := 1

+ 0 - 1
test/misc/bug-glob2.c

@@ -18,7 +18,6 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <errno.h>
-#include <error.h>
 #include <dirent.h>
 #include <glob.h>
 #include <stdlib.h>

+ 3 - 4
test/misc/tst-inotify.c

@@ -11,7 +11,6 @@
 #include <string.h>
 #include <unistd.h>
 #include <errno.h>
-#include <error.h>
 #include <inttypes.h>
 #include <sys/inotify.h>
 #include <sys/fcntl.h>
@@ -39,7 +38,7 @@ do_test(void)
 	/* nonblocking inotify should return immediately with no events */
 	ret = read(ifd, &e, sizeof(e));
 	if (ret != -1 || errno != EAGAIN) {
-		error(0, 0, "first read() returned %d", ret);
+		fprintf(stderr, "first read() returned %d\n", ret);
 		result = 1;
 	}
 
@@ -49,12 +48,12 @@ do_test(void)
 	/* now check whether our event was seen */
 	ret = read(ifd, &e, sizeof(e));
 	if (ret != sizeof(e)) {
-		error(0, 0, "second read() returned %d", ret);
+		fprintf(stderr, "second read() returned %d\n", ret);
 		result = 1;
 	}
 
 	if (!(e.mask & IN_DELETE_SELF)) {
-		error(0, 0, "incorrect event mask: %" PRIx32, e.mask);
+		fprintf(stderr, "incorrect event mask: %" PRIx32 "\n", e.mask);
 		result = 1;
 	}
 

+ 25 - 20
test/misc/tst-utmp.c

@@ -18,7 +18,6 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <errno.h>
-#include <error.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/types.h>
@@ -69,8 +68,11 @@ do_prepare (int argc, char *argv[])
 
   /* Open our test file.  */
   fd = mkstemp (name);
-  if (fd == -1)
-    error (EXIT_FAILURE, errno, "cannot open test file `%s'", name);
+  if (fd == -1) {
+    fprintf (stderr, "cannot open test file `%s': ", name);
+    perror (NULL);
+    exit (EXIT_FAILURE);
+  }
 }
 
 struct utmp entry[] =
@@ -110,7 +112,7 @@ do_init (void)
     {
       if (pututline (&entry[n]) == NULL)
 	{
-	  error (0, errno, "cannot write UTMP entry");
+	  perror ("cannot write UTMP entry");
 	  return 1;
 	}
     }
@@ -135,7 +137,7 @@ do_check (void)
       if (n < num_entries &&
 	  memcmp (ut, &entry[n], sizeof (struct utmp)))
 	{
-	  error (0, 0, "UTMP entry does not match");
+	  fprintf (stderr, "UTMP entry does not match\n");
 	  return 1;
 	}
 
@@ -144,7 +146,7 @@ do_check (void)
 
   if (n != num_entries)
     {
-      error (0, 0, "number of UTMP entries is incorrect");
+      fprintf (stderr, "number of UTMP entries is incorrect\n");
       return 1;
     }
 
@@ -176,7 +178,7 @@ simulate_login (const char *line, const char *user)
 
 	  if (pututline (&entry[n]) == NULL)
 	    {
-	      error (0, errno, "cannot write UTMP entry");
+	      perror ("cannot write UTMP entry");
 	      return 1;
 	    }
 
@@ -186,7 +188,7 @@ simulate_login (const char *line, const char *user)
 	}
     }
 
-  error (0, 0, "no entries available");
+  fprintf (stderr, "no entries available\n");
   return 1;
 }
 
@@ -210,7 +212,7 @@ simulate_logout (const char *line)
 
 	  if (pututline (&entry[n]) == NULL)
 	    {
-	      error (0, errno, "cannot write UTMP entry");
+	      perror ("cannot write UTMP entry");
 	      return 1;
 	    }
 
@@ -220,7 +222,7 @@ simulate_logout (const char *line)
 	}
     }
 
-  error (0, 0, "no entry found for `%s'", line);
+  fprintf (stderr, "no entry found for `%s'\n", line);
   return 1;
 }
 
@@ -237,7 +239,8 @@ check_login (const char *line)
   up = getutline (&ut);
   if (up == NULL)
     {
-      error (0, errno, "cannot get entry for line `%s'", line);
+      fprintf (stderr, "cannot get entry for line `%s': ", line);
+	  perror(NULL);
       return 1;
     }
 
@@ -249,7 +252,7 @@ check_login (const char *line)
 	{
 	  if (memcmp (up, &entry[n], sizeof (struct utmp)))
 	    {
-	      error (0, 0, "UTMP entry does not match");
+	      fprintf (stderr, "UTMP entry does not match\n");
 	      return 1;
 	    }
 
@@ -257,7 +260,7 @@ check_login (const char *line)
 	}
     }
 
-  error (0, 0, "bogus entry for line `%s'", line);
+  fprintf (stderr, "bogus entry for line `%s'\n", line);
   return 1;
 }
 
@@ -271,7 +274,7 @@ check_logout (const char *line)
   strcpy (ut.ut_line, line);
   if (getutline (&ut) != NULL)
     {
-      error (0, 0, "bogus login entry for `%s'", line);
+      fprintf (stderr, "bogus login entry for `%s'\n", line);
       return 1;
     }
 
@@ -294,7 +297,8 @@ check_id (const char *id)
   up = getutid (&ut);
   if (up == NULL)
     {
-      error (0, errno, "cannot get entry for ID `%s'", id);
+      fprintf (stderr, "cannot get entry for ID `%s': ", id);
+	  perror (NULL);
       return 1;
     }
 
@@ -306,7 +310,7 @@ check_id (const char *id)
 	{
 	  if (memcmp (up, &entry[n], sizeof (struct utmp)))
 	    {
-	      error (0, 0, "UTMP entry does not match");
+	      fprintf (stderr, "UTMP entry does not match\n");
 	      return 1;
 	    }
 
@@ -314,7 +318,7 @@ check_id (const char *id)
 	}
     }
 
-  error (0, 0, "bogus entry for ID `%s'", id);
+  fprintf (stderr, "bogus entry for ID `%s'\n", id);
   return 1;
 }
 
@@ -331,7 +335,8 @@ check_type (int type)
   up = getutid (&ut);
   if (up == NULL)
     {
-      error (0, errno, "cannot get entry for type `%d'", type);
+      fprintf (stderr, "cannot get entry for type `%d': ", type);
+	  perror (NULL);
       return 1;
     }
 
@@ -343,7 +348,7 @@ check_type (int type)
 	{
 	  if (memcmp (up, &entry[n], sizeof (struct utmp)))
 	    {
-	      error (0, 0, "UTMP entry does not match");
+	      fprintf (stderr, "UTMP entry does not match\n");
 	      return 1;
 	    }
 
@@ -351,7 +356,7 @@ check_type (int type)
 	}
     }
 
-  error (0, 0, "bogus entry for type `%d'", type);
+  fprintf (stderr, "bogus entry for type `%d'\n", type);
   return 1;
 }
 

+ 5 - 2
test/nptl/tst-cancel7.c

@@ -196,13 +196,16 @@ do_cleanup (void)
 #define OPT_COMMAND	10000
 #define OPT_PIDFILE	10001
 #define CMDLINE_OPTIONS \
+	"c:p:"
+/*
   { "command", required_argument, NULL, OPT_COMMAND },	\
   { "pidfile", required_argument, NULL, OPT_PIDFILE },
+*/
 #define CMDLINE_PROCESS \
-  case OPT_COMMAND:	\
+  case 'c':	\
     command = optarg;	\
     break;		\
-  case OPT_PIDFILE:	\
+  case 'p':	\
     pidfile = optarg;	\
     break;
 // #define CLEANUP_HANDLER do_cleanup ()

+ 4 - 2
test/nptl/tst-mqueue7.c

@@ -32,10 +32,12 @@
 static mqd_t after_exec = (mqd_t) -1;
 
 #define CMDLINE_OPTIONS \
+	"a:"
+/*
   { "after-exec", required_argument, NULL, OPT_AFTEREXEC },
-
+*/
 #define CMDLINE_PROCESS \
-  case OPT_AFTEREXEC:					\
+  case 'a':					\
     after_exec = (mqd_t) strtoul (optarg, NULL, 0);	\
     break;
 

+ 6 - 5
test/pwd_grp/getgroups.c

@@ -13,7 +13,6 @@
 #include <sys/types.h>
 #include <pwd.h>
 #include <grp.h>
-#include <err.h>
 
 /* The number of errors encountered so far. */
 static int problems = 0;
@@ -25,7 +24,7 @@ static void print_group(gid_t gid)
 
 	grp = getgrgid(gid);
 	if (grp == NULL) {
-		warn("cannot find name for group ID %u", gid);
+		fprintf(stderr, "cannot find name for group ID %u\n", gid);
 		problems++;
 	}
 
@@ -46,12 +45,14 @@ static int xgetgroups(gid_t gid, int *n_groups, gid_t ** groups)
 
 	/* Add 1 just in case max_n_groups is zero.  */
 	g = (gid_t *) malloc(max_n_groups * sizeof(gid_t) + 1);
-	if (g == NULL)
-		err(EXIT_FAILURE, "out of memory");
+	if (g == NULL) {
+		fprintf(stderr, "out of memory\n");
+		exit(EXIT_FAILURE);
+	}
 	ng = getgroups(max_n_groups, g);
 
 	if (ng < 0) {
-		warn("cannot get supplemental group list");
+		fprintf(stderr, "cannot get supplemental group list\n");
 		++fail;
 		free(g);
 	}

+ 3 - 2
test/stdlib/Makefile.in

@@ -6,6 +6,7 @@ DODIFF_testatexit  := 1
 DODIFF_teston_exit := 1
 DODIFF_teststrtol  := 1
 
-ifeq ($(ARCH_USE_MMU),)
-TESTS_DISABLED := test-mkostemp-O_CLOEXEC
+TESTS_DISABLED :=
+ifeq ($(UCLIBC_HAS_PTY),)
+TESTS_DISABLED += ptytest
 endif

+ 5 - 0
test/stdlib/test-mkostemp-O_CLOEXEC.c

@@ -1,3 +1,4 @@
+#define _XOPEN_SOURCE_EXTENDED
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -8,6 +9,10 @@
 #include <sys/wait.h>
 #include <errno.h>
 
+#if !defined __ARCH_USE_MMU__
+# define fork vfork
+#endif
+
 int main(int argc, char *argv[]) {
     int fd, status;
     char buff[5];

+ 16 - 1
test/test-skeleton.c

@@ -18,7 +18,6 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <errno.h>
-#include <getopt.h>
 #include <malloc.h>
 #include <search.h>
 #include <signal.h>
@@ -46,6 +45,7 @@
 #define OPT_DIRECT 1000
 #define OPT_TESTDIR 1001
 
+#if 0 /* Not used in uClibc */
 static struct option options[] =
 {
 #ifdef CMDLINE_OPTIONS
@@ -55,6 +55,7 @@ static struct option options[] =
   { "test-dir", required_argument, NULL, OPT_TESTDIR },
   { NULL, 0, NULL, 0 }
 };
+#endif
 
 /* PID of the test itself.  */
 static pid_t pid;
@@ -144,7 +145,9 @@ signal_handler (int sig __attribute__ ((unused)))
   /* Wait for it to terminate.  */
   for (i = 0; i < 5; ++i)
     {
+#ifdef __UCLIBC_HAS_REALTIME__
       struct timespec ts;
+#endif
       killed = waitpid (pid, &status, WNOHANG|WUNTRACED);
       if (killed != 0)
 	break;
@@ -153,9 +156,14 @@ signal_handler (int sig __attribute__ ((unused)))
 	 nanosleep() call return prematurely, all the better.  We
 	 won't restart it since this probably means the child process
 	 finally died.  */
+#ifdef __UCLIBC_HAS_REALTIME__
       ts.tv_sec = 0;
       ts.tv_nsec = 100000000;
       nanosleep (&ts, NULL);
+#else
+	  /* No nanosleep, just sleep 1s instead of 0.1s */
+	  sleep(1);
+#endif
     }
   if (killed != 0 && killed != pid)
     {
@@ -234,7 +242,14 @@ main (int argc, char *argv[])
   setbuf (stdout, NULL);
 #endif
 
+#if 0 /* Not used in uClibc */
   while ((opt = getopt_long (argc, argv, "+", options, NULL)) != -1)
+#else
+# ifndef CMDLINE_OPTIONS
+#  define CMDLINE_OPTIONS ""
+# endif
+  while ((opt = getopt (argc, argv, "+" CMDLINE_OPTIONS)) >= 0)
+#endif
     switch (opt)
       {
       case '?':