mescc: Mes C Library: Support GNU Tar: Add execlp.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 9 Jun 2019 22:56:42 +0000 (00:56 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 9 Jun 2019 22:56:42 +0000 (00:56 +0200)
* lib/posix/execl.c (vexec): New function.
(execl): Use it.
* lib/posix/execlp.c: New file.
* build-aux/configure-lib.sh (libc_tcc_SOURCES): Add it.
* lib/libc+gnu.c: Include it.
* include/unistd.h (execlp): Declare.
* lib/tests/posix/90-execlp.c: New file.
* lib/tests/posix/90-execlp.stdout: New file.
* build-aux/check-mescc.sh: Test it.

build-aux/check-mescc.sh
build-aux/configure-lib.sh
include/unistd.h
lib/posix/execl.c
lib/posix/execlp.c [new file with mode: 0644]
lib/tests/posix/90-execlp.c [new file with mode: 0644]
lib/tests/posix/90-execlp.stdout [new file with mode: 0644]

index 84158697150597b52abbe64797accd74b8d9b395..b688b40fdfbbd8356f48967cf14c8e0b69ccc845 100755 (executable)
@@ -200,6 +200,7 @@ if test -z "$bootstrap"; then
     TESTS="$TESTS
 lib/tests/dirent/90-readdir.c
 lib/tests/io/90-stat.c
+lib/tests/posix/90-execlp.c
 lib/tests/posix/90-unsetenv.c
 lib/tests/signal/90-signal.c
 lib/tests/stdio/90-fopen.c
index 1dd7f0e55cad11d63b8bf18dad8e6f0c651653c7..a3c8551f420d14d6f934b7779d2dca60148da8a8 100644 (file)
@@ -227,6 +227,7 @@ lib/math/fabs.c
 lib/mes/fdgets.c
 lib/posix/alarm.c
 lib/posix/execl.c
+lib/posix/execlp.c
 lib/posix/mktemp.c
 lib/posix/raise.c
 lib/posix/sbrk.c
index 44792f90b807c8386419667a72fd4b4362b56001..53c68561b4712ef5a531c17b4c00653fbca12b4f 100644 (file)
@@ -62,6 +62,7 @@ unsigned int alarm (unsigned int seconds);
 int close (int fd);
 int execv (char const *file_name, char *const argv[]);
 int execl (char const *file_name, char const *arg, ...);
+int execlp (char const *file_name, char const *arg, ...);
 int execve (char const *file, char *const argv[], char *const env[]);
 int execvp (char const *file, char *const argv[]);
 int fork (void);
index ae65151030d5c6c3dd710f1668ddfe8bd08e8ad5..45135864b096bd9fa1fd5b193fb04eb8e2ae15be 100644 (file)
 #include <unistd.h>
 
 int
-execl (char const *file_name, char const *arg, ...)
+vexec (char const *file_name, va_list ap)
 {
-  if (__mes_debug () > 2)
-    {
-      eputs ("execl ");
-      eputs (file_name);
-      eputs ("\n");
-    }
+  char *arg = va_arg (ap, char *);
   char *argv[1000];             // POSIX minimum 4096
   int i = 0;
 
-  va_list ap;
-  va_start (ap, arg);
-
-  argv[i++] = (char *)file_name;
-  arg = (char *) va_arg (ap, char const *);
+  argv[i++] = (char *) file_name;
   while (arg)
     {
       argv[i++] = arg;
@@ -57,3 +48,20 @@ execl (char const *file_name, char const *arg, ...)
   va_end (ap);
   return r;
 }
+
+int
+execl (char const *file_name, char const *arg, ...)
+{
+  va_list ap;
+  int r;
+  va_start (ap, arg);
+  if (__mes_debug () > 2)
+    {
+      eputs ("execl ");
+      eputs (file_name);
+      eputs ("\n");
+    }
+  r = vexec (file_name, ap);
+  va_end (ap);
+  return r;
+}
diff --git a/lib/posix/execlp.c b/lib/posix/execlp.c
new file mode 100644 (file)
index 0000000..48a239a
--- /dev/null
@@ -0,0 +1,47 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <mes/lib.h>
+#include <errno.h>
+#include <stdarg.h>
+
+int
+execlp (char const *file_name, char const *arg, ...)
+{
+  va_list ap;
+  int r;
+  va_start (ap, arg);
+  if (file_name[0] != '/')
+    file_name = search_path (file_name);
+  if (__mes_debug () > 2)
+    {
+      eputs ("execlp ");
+      eputs (file_name ? file_name : "0");
+      eputs ("\n");
+    }
+  if (!file_name)
+    {
+      errno = ENOENT;
+      return -1;
+    }
+  r = vexec (file_name, ap);
+  va_end (ap);
+  return r;
+}
diff --git a/lib/tests/posix/90-execlp.c b/lib/tests/posix/90-execlp.c
new file mode 100644 (file)
index 0000000..450575b
--- /dev/null
@@ -0,0 +1,28 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "unistd.h"
+
+int
+main (int argc, char const *argv[])
+{
+  execlp ("echo", "echo", "Hello", "World!", 0);
+  return 0;
+}
diff --git a/lib/tests/posix/90-execlp.stdout b/lib/tests/posix/90-execlp.stdout
new file mode 100644 (file)
index 0000000..980a0d5
--- /dev/null
@@ -0,0 +1 @@
+Hello World!