aboutsummaryrefslogtreecommitdiff
path: root/lib/exec/exec.c
blob: 42fd2c18db523348d640deb673c9222455c986dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "exec.h"
#include "../sys/execve.h"
#include "../env/env.h"
#include "../cstr/cstr.h"
#include "../malloc/malloc.h"

int exec(const char **argv)
{
	const char *path = getenv("PATH");
	const char *end;
	char *filename;

	while (*path) {
		end = path;

		while (*end && *end != ':') ++end;

		filename = malloc((end - path) + cstr_length(argv[0]) + 2);

		for (int i = 0; i < end - path; ++i)
			filename[i] = path[i];

		filename[end - path] = '/';

		for (int i = 0; i < cstr_length(argv[0]) + 1; ++i)
			filename[(end - path) + i + 1] = argv[0][i];

		execve(filename, argv, getenvp());
		free(filename);

		path = end;

		if (*path == ':')
			++path;
	}

	return execve(argv[0], argv, getenvp());
}