Update to Unicode 3.1.
[kopensolaris-gnu/glibc.git] / test-skeleton.c
index 5bb5c44..9126be0 100644 (file)
@@ -1,5 +1,5 @@
 /* Skeleton for test programs.
-   Copyright (C) 1998 Free Software Foundation, Inc.
+   Copyright (C) 1998, 2000 Free Software Foundation, Inc.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
    The GNU C Library is free software; you can redistribute it and/or
    Boston, MA 02111-1307, USA.  */
 
 #include <getopt.h>
+#include <search.h>
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 #include <sys/resource.h>
 #include <sys/wait.h>
@@ -52,8 +54,43 @@ static int pid;
 /* Directory to place temporary files in.  */
 static const char *test_dir;
 
+/* List of temporary files.  */
+struct temp_name_list
+{
+  struct qelem q;
+  const char *name;
+} *temp_name_list;
+
+/* Add temporary files in list.  */
+static void
+add_temp_file (const char *name)
+{
+  struct temp_name_list *newp
+    = (struct temp_name_list *) calloc (sizeof (*newp), 1);
+  if (newp != NULL)
+    {
+      newp->name = name;
+      if (temp_name_list == NULL)
+       temp_name_list = (struct temp_name_list *) &newp->q;
+      else
+       insque (newp, temp_name_list);
+    }
+}
+
+/* Delete all temporary files.  */
+static void
+delete_temp_files (void)
+{
+  while (temp_name_list != NULL)
+    {
+      remove (temp_name_list->name);
+      temp_name_list = (struct temp_name_list *) temp_name_list->q.q_forw;
+    }
+}
+
 /* Timeout handler.  We kill the child and exit with an error.  */
-void
+static void
+__attribute__ ((noreturn))
 timeout_handler (int sig __attribute__ ((unused)))
 {
   int killed;
@@ -87,6 +124,10 @@ main (int argc, char *argv[])
   int status;
   int opt;
 
+#ifdef STDOUT_UNBUFFERED
+  setbuf (stdout, NULL);
+#endif
+
   while ((opt = getopt_long (argc, argv, "", options, NULL)) != -1)
     switch (opt)
       {
@@ -114,6 +155,27 @@ main (int argc, char *argv[])
          exit (1);
        }
     }
+  else
+    {
+      test_dir = getenv ("TMPDIR");
+      if (test_dir == NULL || test_dir[0] == '\0')
+       test_dir = "/tmp";
+    }
+
+  /* Make sure we see all message, even those on stdout.  */
+  setvbuf (stdout, NULL, _IONBF, 0);
+
+  /* make sure temporary files are deleted.  */
+  atexit (delete_temp_files);
+
+  /* Correct for the possible parameters.  */
+  argv += optind - 1;
+  argc -= optind - 1;
+
+  /* Call the initializing function, if one is available.  */
+#ifdef PREPARE
+  PREPARE (argc, argv);
+#endif
 
   /* If we are not expected to fork run the function immediately.  */
   if (direct)
@@ -166,8 +228,12 @@ main (int argc, char *argv[])
 #endif
   if (WTERMSIG (status) != EXPECTED_SIGNAL)
     {
-      fprintf (stderr, "Incorrect signal from child: got `%s', need `%s'\n",
-              strsignal (WTERMSIG (status)), strsignal (EXPECTED_SIGNAL));
+      if (EXPECTED_SIGNAL != 0)
+       fprintf (stderr, "Incorrect signal from child: got `%s', need `%s'\n",
+                strsignal (WTERMSIG (status)), strsignal (EXPECTED_SIGNAL));
+      else
+       fprintf (stderr, "Didn't expect signal from child: got `%s'\n",
+                strsignal (WTERMSIG (status)));
       exit (1);
     }