9
9
#include < stdlib.h>
10
10
#include < sys/ioctl.h>
11
11
#include < sys/types.h>
12
+ #include < fcntl.h>
12
13
#include < Kernel/Syscall.h>
13
14
#include < AK/Vector.h>
15
+ #include < AK/AKString.h>
14
16
15
17
extern " C" {
16
18
@@ -28,7 +30,7 @@ pid_t fork()
28
30
29
31
int execv (const char * path, char * const argv[])
30
32
{
31
- return execve (path, argv, nullptr );
33
+ return execve (path, argv, environ );
32
34
}
33
35
34
36
int execve (const char * filename, char * const argv[], char * const envp[])
@@ -39,8 +41,25 @@ int execve(const char* filename, char* const argv[], char* const envp[])
39
41
40
42
int execvp (const char * filename, char * const argv[])
41
43
{
42
- // FIXME: This should do some sort of shell-like path resolution!
43
- return execve (filename, argv, nullptr );
44
+ int rc = execve (filename, argv, nullptr );
45
+ if (rc < 0 && errno != ENOENT) {
46
+ printf (" execvp failed on first with %s\n " , strerror (errno));
47
+ return rc;
48
+ }
49
+ String path = getenv (" PATH" );
50
+ if (path.is_empty ())
51
+ path = " /bin:/usr/bin" ;
52
+ auto parts = path.split (' :' );
53
+ for (auto & part : parts) {
54
+ auto candidate = String::format (" %s/%s" , part.characters (), filename);
55
+ rc = execve (candidate.characters (), argv, environ);
56
+ if (rc < 0 && errno != ENOENT) {
57
+ printf (" execvp failed on attempt (%s) with %s\n " , candidate.characters (), strerror (errno));
58
+ return rc;
59
+ }
60
+ }
61
+ errno = ENOENT;
62
+ return -1 ;
44
63
}
45
64
46
65
int execl (const char * filename, const char * arg0, ...)
@@ -58,7 +77,7 @@ int execl(const char* filename, const char* arg0, ...)
58
77
}
59
78
va_end (ap);
60
79
args.append (nullptr );
61
- return execve (filename, (char * const *)args.data (), nullptr );
80
+ return execve (filename, (char * const *)args.data (), environ );
62
81
}
63
82
64
83
uid_t getuid ()
@@ -125,6 +144,11 @@ pid_t getpgrp()
125
144
__RETURN_WITH_ERRNO (rc, rc, -1 );
126
145
}
127
146
147
+ int creat (const char * path, mode_t mode)
148
+ {
149
+ return open (path, O_CREAT, mode);
150
+ }
151
+
128
152
int open (const char * path, int options, ...)
129
153
{
130
154
va_list ap;
0 commit comments