From 543ae4df3261e90262c4ff05554ddd89177d6195 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Sun, 26 Aug 2018 20:54:29 +0200 Subject: [PATCH] mescc: Mes C Library: Support diffutils: Add execl. * include/limits.h (CHAR_MAX): New macro. * lib/posix/execl.c: New file. * include/unistd.h: Declare it. --- include/limits.h | 1 + include/unistd.h | 1 + lib/libc+gnu.c | 2 ++ lib/posix/execl.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 lib/posix/execl.c diff --git a/include/limits.h b/include/limits.h index c4075606..5a19b10f 100644 --- a/include/limits.h +++ b/include/limits.h @@ -31,6 +31,7 @@ #define CHAR_BIT 8 #define UCHAR_MAX 255 +#define CHAR_MAX 255 #define UINT_MAX 4294967295U #define INT_MIN -2147483648 #define INT_MAX 2147483647 diff --git a/include/unistd.h b/include/unistd.h index 6eb7634c..0600a6e5 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -57,6 +57,7 @@ int access (char const *s, int mode); 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 execve (char const *file, char *const argv[], char *const env[]); int execvp (char const *file, char *const argv[]); int fork (void); diff --git a/lib/libc+gnu.c b/lib/libc+gnu.c index b8096adb..2d280bb5 100644 --- a/lib/libc+gnu.c +++ b/lib/libc+gnu.c @@ -103,3 +103,5 @@ #include #include #include + +#include diff --git a/lib/posix/execl.c b/lib/posix/execl.c new file mode 100644 index 00000000..2142acde --- /dev/null +++ b/lib/posix/execl.c @@ -0,0 +1,52 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +int +execl (char const *file_name, char const *arg, ...) +{ + if (__mes_debug () > 2) + { + eputs ("execl "); eputs (file_name); eputs ("\n"); + } + char *argv[1000]; // POSIX minimum 4096 + int i = 0; + + va_list ap; + va_start (ap, arg); + + argv[i++] = file_name; + arg = va_arg (ap, char const *); + while (arg) + { + argv[i++] = arg; + arg = va_arg (ap, char const *); + if (__mes_debug () > 2) + { + eputs ("arg["); eputs (itoa (i)); eputs ("]: "); eputs (argv[i-1]); eputs ("\n"); + } + } + argv[i] = 0; + int r = execv (file_name, argv); + va_end (ap); + return r; +}