summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/lib/execvp.c
diff options
context:
space:
mode:
authorGuillaume Cottenceau <gc@mandriva.com>2001-01-04 20:04:45 +0000
committerGuillaume Cottenceau <gc@mandriva.com>2001-01-04 20:04:45 +0000
commit02fec4701cee79f875c1d02b8b4aee09380dbcb8 (patch)
treef4f291aedbb2e60ee58351481858a8cd3ec80b6b /mdk-stage1/dietlibc/lib/execvp.c
parent9887fe04751edf39e8389f2c3ec3f020b5e1c17d (diff)
downloaddrakx-backup-do-not-use-02fec4701cee79f875c1d02b8b4aee09380dbcb8.tar
drakx-backup-do-not-use-02fec4701cee79f875c1d02b8b4aee09380dbcb8.tar.gz
drakx-backup-do-not-use-02fec4701cee79f875c1d02b8b4aee09380dbcb8.tar.bz2
drakx-backup-do-not-use-02fec4701cee79f875c1d02b8b4aee09380dbcb8.tar.xz
drakx-backup-do-not-use-02fec4701cee79f875c1d02b8b4aee09380dbcb8.zip
integrate dietlibc/stdio per default for cdrom and disk only installs
Diffstat (limited to 'mdk-stage1/dietlibc/lib/execvp.c')
-rw-r--r--mdk-stage1/dietlibc/lib/execvp.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/mdk-stage1/dietlibc/lib/execvp.c b/mdk-stage1/dietlibc/lib/execvp.c
new file mode 100644
index 000000000..809252990
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/execvp.c
@@ -0,0 +1,55 @@
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <paths.h>
+#include <errno.h>
+
+extern char **environ;
+
+static int exec_shell(const char *file, char *const argv[]) {
+ int i;
+
+ for (i = 0; argv[i]; i++);
+
+ if (1) {
+ char *shell_argv[i + 1];
+ shell_argv[0] = _PATH_BSHELL;
+ shell_argv[1] = (char *) file;
+ for (; i > 1; i--)
+ shell_argv[i] = argv[i - 1];
+ return execve(_PATH_BSHELL, shell_argv, environ);
+ }
+}
+
+int execvp(const char *file, char *const argv[]) {
+ char *path=getenv("PATH");
+ char *cur,*next;
+ char buf[PATH_MAX];
+ if (strchr((char*)file,'/')) {
+ if (execve(file,argv,environ)==-1) {
+ if (errno==ENOEXEC) exec_shell(file,argv);
+ return -1;
+ }
+ }
+ if (!path) path=_PATH_DEFPATH;
+ for (cur=path; cur; cur=next) {
+ next=strchr(cur,':');
+ if (!next)
+ next=cur+strlen(cur);
+ if (next==cur) {
+ buf[0]='.';
+ cur--;
+ } else
+ memmove(buf,cur,next-cur);
+ buf[next-cur]='/';
+ memmove(&buf[next-cur+1],file,strlen(file)+1);
+ if (execve(buf,argv,environ)==-1) {
+ if (errno==ENOEXEC) return exec_shell(buf,argv);
+ if ((errno!=EACCES) && (errno!=ENOENT)) return -1;
+ }
+ if (*next==0) break;
+ next++;
+ }
+ return -1;
+}