A bit of cleanup.
[kopensolaris-gnu/glibc.git] / test-skeleton.c
index 39c6073..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
@@ -22,6 +22,7 @@
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 #include <sys/resource.h>
 #include <sys/wait.h>
@@ -54,40 +55,42 @@ static int pid;
 static const char *test_dir;
 
 /* List of temporary files.  */
-struct name_list
+struct temp_name_list
 {
   struct qelem q;
   const char *name;
-} *name_list;
+} *temp_name_list;
 
 /* Add temporary files in list.  */
-void
+static void
 add_temp_file (const char *name)
 {
-  struct name_list *newp = (struct name_list *) calloc (sizeof (*newp), 1);
+  struct temp_name_list *newp
+    = (struct temp_name_list *) calloc (sizeof (*newp), 1);
   if (newp != NULL)
     {
       newp->name = name;
-      if (name_list == NULL)
-       name_list = (struct name_list *) &newp->q;
+      if (temp_name_list == NULL)
+       temp_name_list = (struct temp_name_list *) &newp->q;
       else
-       insque (newp, name_list);
+       insque (newp, temp_name_list);
     }
 }
 
 /* Delete all temporary files.  */
-void
+static void
 delete_temp_files (void)
 {
-  while (name_list != NULL)
+  while (temp_name_list != NULL)
     {
-      remove (name_list->name);
-      name_list = (struct name_list *) name_list->q.q_forw;
+      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;
@@ -121,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)
       {
@@ -155,13 +162,25 @@ main (int argc, char *argv[])
        test_dir = "/tmp";
     }
 
-  /* If we are not expected to fork run the function immediately.  */
-  if (direct)
-    return TEST_FUNCTION;
+  /* 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)
+    return TEST_FUNCTION;
+
   /* Set up the test environment:
      - prevent core dumps
      - set up the timer
@@ -213,7 +232,7 @@ main (int argc, char *argv[])
        fprintf (stderr, "Incorrect signal from child: got `%s', need `%s'\n",
                 strsignal (WTERMSIG (status)), strsignal (EXPECTED_SIGNAL));
       else
-       fprintf (stderr, "Incorrect signal from child: got `%s'\n",
+       fprintf (stderr, "Didn't expect signal from child: got `%s'\n",
                 strsignal (WTERMSIG (status)));
       exit (1);
     }