-/* 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++) != ':') {
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