-
Notifications
You must be signed in to change notification settings - Fork 0
/
path.c
75 lines (67 loc) · 1.33 KB
/
path.c
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "hsh.h"
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
/**
* extract_path - extract directories from PATH variable.
*
* @ctx: shell context
*
* Return: NULL turminated array
*/
char **extract_path(context_t *ctx)
{
char *path, *tmp;
char **paths = { NULL };
/* Extracts the PATH variable in environ */
path = _strdup(_getenv("PATH", ctx));
tmp = path; /* free */
paths = split(path, ":");
free(tmp);
return (paths);
}
/**
* which - returns path to a binary or NULL
*
* @bin: binary name
* @ctx: shell context
*
* Return: full path, NULL when not found
*/
char *which(const char *bin, context_t *ctx)
{
char *filepath;
char **paths, **p;
struct stat buf;
if (*bin == '/' || *bin == '.')
{
if (stat(bin, &buf) == 0)
return (_strdup(bin));
else
return (NULL);
}
paths = extract_path(ctx);
if (paths == NULL)
return (NULL);
p = paths; /* for free */
/* Loop through dir paths in PATH */
while (*paths)
{
filepath = malloc(_strlen(*paths) + _strlen(bin) + 2);
filepath = _strcpy(filepath, *paths);
filepath = _strcat(filepath, "/");
filepath = _strcat(filepath, bin);
if (stat(filepath, &buf) == 0)
{
free_array(p);
return (filepath);
}
free(filepath);
filepath = NULL;
paths++;
}
free_array(p);
return (NULL);
}