correct variadic prototypes for execl* family
authorRich Felker <dalias@aerifal.cx>
Wed, 27 Apr 2011 20:06:33 +0000 (16:06 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 27 Apr 2011 20:06:33 +0000 (16:06 -0400)
the old versions worked, but conflicted with programs which declared
their own prototypes and generated warnings with some versions of gcc.

include/unistd.h
src/process/execl.c
src/process/execle.c
src/process/execlp.c

index 05180de06a86c4dc702f958f1fcd3a5ddafc9600..a64d99b7353a7ac163dbe68860b28edfdd2b6ca6 100644 (file)
@@ -81,10 +81,10 @@ int pause(void);
 pid_t fork(void);
 int execve(const char *, char *const [], char *const []);
 int execv(const char *, char *const []);
-int execle(const char *, ...);
-int execl(const char *, ...);
+int execle(const char *, const char *, ...);
+int execl(const char *, const char *, ...);
 int execvp(const char *, char *const []);
-int execlp(const char *, ...);
+int execlp(const char *, const char *, ...);
 int fexecve(int, char *const [], char *const []);
 void _exit(int);
 
index 4c6eaa94a756cea090300979da1a78cef79b2e26..327d78b288118b12cc85e0fb6839556f6a51d90e 100644 (file)
@@ -1,18 +1,19 @@
 #include <unistd.h>
 #include <stdarg.h>
 
-int execl(const char *path, ...)
+int execl(const char *path, const char *argv0, ...)
 {
        int argc;
        va_list ap;
-       va_start(ap, path);
-       for (argc=0; va_arg(ap, const char *); argc++);
+       va_start(ap, argv0);
+       for (argc=1; va_arg(ap, const char *); argc++);
        va_end(ap);
        {
                int i;
                char *argv[argc+1];
-               va_start(ap, path);
-               for (i=0; i<argc; i++)
+               va_start(ap, argv0);
+               argv[0] = (char *)argv0;
+               for (i=1; i<argc; i++)
                        argv[i] = va_arg(ap, char *);
                argv[i] = NULL;
                return execv(path, argv);
index 37f629d96752274f6626753487d9dc694e8fab76..6490836612b2573783a8c5b3f92963e92addec63 100644 (file)
@@ -1,19 +1,20 @@
 #include <unistd.h>
 #include <stdarg.h>
 
-int execle(const char *path, ...)
+int execle(const char *path, const char *argv0, ...)
 {
        int argc;
        va_list ap;
-       va_start(ap, path);
-       for (argc=0; va_arg(ap, const char *); argc++);
+       va_start(ap, argv0);
+       for (argc=1; va_arg(ap, const char *); argc++);
        va_end(ap);
        {
                int i;
                char *argv[argc+1];
                char **envp;
-               va_start(ap, path);
-               for (i=0; i<argc; i++)
+               va_start(ap, argv0);
+               argv[0] = (char *)argv0;
+               for (i=1; i<argc; i++)
                        argv[i] = va_arg(ap, char *);
                argv[i] = NULL;
                envp = va_arg(ap, char **);
index 33fb0f7f3bf1da083ca8b1f05a22defa31730f24..c7b3f51389eba341edee086981a068e137f87b3b 100644 (file)
@@ -1,18 +1,19 @@
 #include <unistd.h>
 #include <stdarg.h>
 
-int execlp(const char *file, ...)
+int execlp(const char *file, const char *argv0, ...)
 {
        int argc;
        va_list ap;
-       va_start(ap, file);
-       for (argc=0; va_arg(ap, const char *); argc++);
+       va_start(ap, argv0);
+       for (argc=1; va_arg(ap, const char *); argc++);
        va_end(ap);
        {
                int i;
                char *argv[argc+1];
-               va_start(ap, file);
-               for (i=0; i<argc; i++)
+               va_start(ap, argv0);
+               argv[0] = (char *)argv0;
+               for (i=1; i<argc; i++)
                        argv[i] = va_arg(ap, char *);
                argv[i] = NULL;
                return execvp(file, argv);