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_GLIBC_CUSTOM_PRINTF) += printf.h
 HEADERS_RM-$(UCLIBC_HAS_GLOB)                += glob.h
 HEADERS_RM-$(UCLIBC_HAS_GLOB)                += glob.h
 HEADERS_RM-$(UCLIBC_HAS_GNU_ERROR)           += error.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_IPV6)                += netinet/ip6.h netinet/icmp6.h
 HEADERS_RM-$(UCLIBC_HAS_BACKTRACE)           += execinfo.h
 HEADERS_RM-$(UCLIBC_HAS_BACKTRACE)           += execinfo.h
 HEADERS_RM-$(UCLIBC_HAS_LOCALE)              += iconv.h bits/uClibc_ctype.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
 	  These are small and fast, the only reason _not_ to say Y here is
 	  for debugging purposes.
 	  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
 config UCLIBC_HAS_CTYPE_TABLES
 	bool "Use Table Versions Of 'ctype.h' Functions."
 	bool "Use Table Versions Of 'ctype.h' Functions."
 	default y
 	default y
@@ -1905,32 +1912,25 @@ config UCLIBC_HAS_GNU_GETOPT
 	help
 	help
 	  Answer Y if you want to include full gnu getopt() instead of a
 	  Answer Y if you want to include full gnu getopt() instead of a
 	  (much smaller) SUSv3 compatible getopt().
 	  (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.
 	  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
 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
 	default y
 	help
 	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.
 	  Most people will answer Y.
 
 
 config UCLIBC_HAS_GNU_GETSUBOPT
 config UCLIBC_HAS_GNU_GETSUBOPT
-	bool "Support glibc getsubopt"
+	bool "Support getsubopt"
 	default y
 	default y
 	help
 	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.
 	  Most people will answer Y.
 endmenu
 endmenu

+ 2 - 3
extra/config/conf.c

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

+ 7 - 6
libc/stdio/_fpmaxtostr.c

@@ -45,11 +45,6 @@
  */
  */
 #define isnan(x)             ((x) != (x))
 #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!!!  ;-)                         */
 /* 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. */
 	if (x == 0) {				/* Handle 0 now to avoid false positive. */
 #ifdef __UCLIBC_HAVE_SIGNED_ZERO__
 #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 = '-';
 			*sign_str = '-';
 		}
 		}
 #endif /* __UCLIBC_HAVE_SIGNED_ZERO__ */
 #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;
        __THROW;
 libc_hidden_proto(getopt)
 libc_hidden_proto(getopt)
 
 
-#if defined __UCLIBC_HAS_GNU_GETOPT__ || defined __UCLIBC_HAS_GETOPT_LONG__
+#if defined __UCLIBC_HAS_GETOPT_LONG__
 #ifndef __need_getopt
 #ifndef __need_getopt
 extern int getopt_long (int ___argc, char *const *___argv,
 extern int getopt_long (int ___argc, char *const *___argv,
 			const char *__shortopts,
 			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-$(if $(UCLIBC_SUSV3_LEGACY),,y) += ualarm.c usleep.c
 #OMIT-$(UCLIBC_HAS_THREADS_NATIVE) += sleep.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))
 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)
 libc_hidden_def(getopt)
 
 
+#if defined __UCLIBC_HAS_GETOPT_LONG__
 int
 int
 getopt_long (int argc, char *const *argv, const char *options,
 getopt_long (int argc, char *const *argv, const char *options,
 	     const struct option *long_options, int *opt_index)
 	     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);
   return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
 }
 }
+#endif /* __UCLIBC_HAS_GETOPT_LONG__ */
 
 
 #endif	/* Not ELIDE_CODE.  */
 #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         += $(XCOMMON_CFLAGS) $(KERNEL_INCLUDES) $(CC_INC)
 CFLAGS         += $(OPTIMIZATION) $(CPU_CFLAGS) $(XWARNINGS)
 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.
 # Can't add $(OPTIMIZATION) here, it may be target-specific.
 # Just adding -Os for now.
 # Just adding -Os for now.
 HOST_CFLAGS    += $(XCOMMON_CFLAGS) -Os $(XWARNINGS) -std=gnu99
 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
 endif
 CFLAGS_dirent64 := -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
 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_dirent    := 1
 DODIFF_dirent64  := 1
 DODIFF_dirent64  := 1
 DODIFF_tst-statfs := 1
 DODIFF_tst-statfs := 1

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

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

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

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

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

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

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

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

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

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

+ 6 - 5
test/pwd_grp/getgroups.c

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

+ 3 - 2
test/stdlib/Makefile.in

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

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

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

+ 16 - 1
test/test-skeleton.c

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