-
Notifications
You must be signed in to change notification settings - Fork 0
/
exec_line.c
156 lines (139 loc) · 3.23 KB
/
exec_line.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include "shell.h"
/**
* splitstring - splits a string and makes it an array of pointers to words
* @str: the string to be split
* @delim: the delimiter
* Return: array of pointers to words
*/
char **splitstring(char *str, const char *delim)
{
int i = 0, wn = 0; /* declared variables */
char **array = NULL;
char *token = NULL;
char *copy = NULL;
copy = _calloc((_strlen(str) + 1), 1); /* allocate the space in */
if (!copy) /*memory of the string received */
{
perror(_getenv("_"));
return (NULL);
}
while (str[i]) /* Copy the string received into anothe variable */
{
copy[i] = str[i];
i++;
}
copy[i] = '\0';
token = strtok(copy, delim); /* Use the strtok to tokenize the string */
array = _calloc((sizeof(char *)), 1); /* Allocate memory for the array */
array[0] = _strdup(token); /* Copy the pointer of token into array */
i = 1; /* index */
wn = 2; /* variable to reallocate the memory */
while (token) /* Start the loop while token exits */
{
token = strtok(NULL, delim); /* Skip to the next token */
array = _realloc(array, (sizeof(char *) * (wn - 1)), (sizeof(char *) * wn));
array[i] = _strdup(token); /* Copy the pointer of token into array */
i++;
wn++;
}
free(copy); /* Free allocated memory */
return (array);
}
/**
* _calloc - allocates memory using malloc, and initializes it to zero
* @size: size of the memory block to be allocated
* @nmemb: number of elements
*
* Return: pointer to the address of the memory block
*/
void *_calloc(unsigned int nmemb, unsigned int size)
{
char *block = NULL;
unsigned int i = 0;
if (nmemb == 0 || size == 0)
return (NULL);
block = malloc(nmemb * size);
if (block)
{
for (i = 0; i < (nmemb * size); i++)
block[i] = 0;
return (block);
}
else
return (NULL);
}
/**
* _realloc - Reallocates memory block
* @ptr: previous pointer
* @old_size: old size of previous pointer
* @new_size: new size for our pointer
* Return: New resized Pointer
*/
void *_realloc(void *ptr, unsigned int old_size, unsigned int new_size)
{
char *new = NULL;
char *old = NULL;
unsigned int i;
if (!ptr)
return (_calloc(new_size, 1));
if (new_size == old_size)
return (ptr);
if (new_size == 0 && ptr)
{
free(ptr);
return (NULL);
}
new = _calloc(new_size, 1);
old = ptr;
if (!new)
return (NULL);
if (new_size > old_size)
{
for (i = 0; i < old_size; i++)
new[i] = old[i];
free(ptr);
for (i = old_size; i < new_size; i++)
new[i] = '\0';
}
if (new_size < old_size)
{
for (i = 0; i < new_size; i++)
new[i] = old[i];
free(ptr);
}
return (new);
}
/**
* execute - executes a command
* @arv: array of arguments
*/
void execute(char **arv)
{
int d = 0, status; /* declared variables */
if (!arv || !arv[0])
return;
d = fork(); /* fork the process */
if (d == -1) /* if the fork failed error*/
{
perror(_getenv("_"));
}
if (d == 0) /* if the fork succeeded execute the command */
{
execve(arv[0], arv, environ); /* replace the child process */
perror(arv[0]); /* if the execve failed error and exit*/
exit(EXIT_FAILURE);
}
freearv(arv);
wait(&status);
}
/**
* freearv - frees the array of pointers arv
*@arv: array of pointers
*/
void freearv(char **arv)
{
int i = 0;
for (i = 0; arv[i]; i++)
free(arv[i]);
free(arv);
}