execl: 6502 support
authorAlan Cox <alan@linux.intel.com>
Sat, 19 Nov 2016 11:42:53 +0000 (11:42 +0000)
committerAlan Cox <alan@linux.intel.com>
Sat, 19 Nov 2016 11:42:53 +0000 (11:42 +0000)
Library/libs/execl.c

index b033002..e073313 100644 (file)
@@ -1,36 +1,36 @@
-/* execl.c\r
- *\r
- * function(s)\r
- *       execl - load and run a program\r
- */  \r
-    \r
-#include <unistd.h>\r
-#include <paths.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <stdio.h>\r
+/* execl.c
+ *
+ * function(s)
+ *       execl - load and run a program
+ */
+
+#include <unistd.h>
+#include <paths.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
 #include <errno.h>
-    \r
-/* Find file in pathes:\r
- * 1. /name or ./name or ../name is already qualified names\r
- * 2. else search in all pathes described in env var PATH (if this\r
- *    var is not exist, _PATH_DEFPATH is used)\r
- * 3. else search in current directory\r
- * 4. else return NULL (execve() interpretes NULL as non existent file!)\r
- */ \r
-const char *_findPath(const char *path) \r
+
+/* Find file in pathes:
+ * 1. /name or ./name or ../name is already qualified names
+ * 2. else search in all pathes described in env var PATH (if this
+ *    var is not exist, _PATH_DEFPATH is used)
+ * 3. else search in current directory
+ * 4. else return NULL (execve() interpretes NULL as non existent file!)
+ */
+const char *_findPath(const char *path)
 {
-       char *p;\r
+       char *p;
        const char *envp;
        static char name[PATHLEN + 1];
        if (*path == '/' || /* qualified name */ *path == '.')
                return path;
-\r
-       /* search for pathes list */ \r
+
+       /* search for pathes list */
        if ((envp = getenv("PATH")) == NULL)
                envp = _PATH_DEFPATH;
-\r
-       /* lookup all pathes */ \r
+
+       /* lookup all pathes */
        while (*envp) {
                p = name;
                while (*envp && (*p = *envp++) != ':') {
@@ -50,32 +50,70 @@ const char *_findPath(const char *path)
        if (access(path, 0) == 0)       /* file exist in current dir */
                return name;
        return NULL;
-}\r
-\r
+}
+
 #ifndef __CC65__
-\r
+
 /* FIXME: The 6502 calling sequence means these need a different implementation */
-int execl(const char *pathP, const char *arg0, ...) \r
+int execl(const char *pathP, const char *arg0, ...)
 {
        return execve(pathP, &arg0, environ);
 }
-\r
-int execlp(const char *pathP, const char *arg0, ...) \r
+
+int execlp(const char *pathP, const char *arg0, ...)
 {
        return execve(_findPath(pathP), &arg0, environ);
 }
 #else
-int execl(const char *pathP, const char *arg0, ...) \r
+
+/* This gets to be overexciting with the backward argument handling */
+#include <stdarg.h>
+
+int execl(const char *pathP, const char *arg0, ...)
 {
-       /* BUG: this should be ENOSYS, but Fuzix doesn't have that yet */
-       errno = EINVAL;
+       va_list ptr;
+       const char *arg[32];
+       const char **p = arg;
+
+       va_start(ptr, arg0);
+
+       *p++ = arg0;
+
+       while (p != &arg[32]) {
+               *p = va_arg(ptr, const char *);
+               if (*p++ == NULL) {
+                       va_end(ptr);
+                       return execve(pathP, (void *) arg,
+                                     (void *) environ);
+               }
+       }
+       va_end(ptr);
+       errno = E2BIG;
        return -1;
 }
-\r
-int execlp(const char *pathP, const char *arg0, ...) \r
+
+
+int execlp(const char *pathP, const char *arg0, ...)
 {
-       /* BUG: this should be ENOSYS, but Fuzix doesn't have that yet */
-       errno = EINVAL;
+       va_list ptr;
+       const char *arg[32];
+       const char **p = arg;
+
+       va_start(ptr, arg0);
+
+       *p++ = arg0;
+
+       while (p != &arg[32]) {
+               *p = va_arg(ptr, const char *);
+               if (*p++ == NULL) {
+                       va_end(ptr);
+                       return execve(_findPath(pathP), (void *) arg,
+                                     (void *) environ);
+               }
+       }
+       va_end(ptr);
+       errno = E2BIG;
        return -1;
 }
+
 #endif