fgetws implementation.
[kopensolaris-gnu/glibc.git] / posix / execl.c
index ad6190c..5ea1c4e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1994, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 94, 97, 98, 99 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -22,6 +22,8 @@
 #include <stddef.h>
 #include <string.h>
 
+#include <stackinfo.h>
+
 #ifndef        HAVE_GNU_LD
 # define __environ     environ
 #endif
@@ -39,30 +41,34 @@ execl (const char *path, const char *arg, ...)
   argv[0] = arg;
 
   va_start (args, arg);
-  i = 1;
-  do
+  i = 0;
+  while (argv[i++] != NULL)
     {
       if (i == argv_max)
        {
          const char **nptr = alloca ((argv_max *= 2) * sizeof (const char *));
 
+#ifndef _STACK_GROWS_UP
          if ((char *) nptr + argv_max == (char *) argv)
            {
              /* Stack grows down.  */
              argv = (const char **) memcpy (nptr, argv, i);
              argv_max += i;
            }
-         else if ((char *) argv + i == (char *) nptr)
+         else
+#endif
+#ifndef _STACK_GROWS_DOWN
+           if ((char *) argv + i == (char *) nptr)
            /* Stack grows up.  */
            argv_max += i;
          else
+#endif
            /* We have a hole in the stack.  */
            argv = (const char **) memcpy (nptr, argv, i);
        }
 
       argv[i] = va_arg (args, const char *);
     }
-  while (argv[i++] != NULL);
   va_end (args);
 
   return __execve (path, (char *const *) argv, __environ);