Allow execution of external commands
This commit is contained in:
parent
acd001edbb
commit
e1d4fa88ac
74
src/main.c
74
src/main.c
@ -5,6 +5,9 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
#include "icmd.h"
|
#include "icmd.h"
|
||||||
|
|
||||||
@ -20,6 +23,19 @@ char *g_tokens[TOKENS_NUM_MAX];
|
|||||||
char g_args[TOKENS_ARGS_SIZE];
|
char g_args[TOKENS_ARGS_SIZE];
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
print(char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
va_start(args, format);
|
||||||
|
printf("psh: ");
|
||||||
|
vprintf(format, args);
|
||||||
|
putchar('\n');
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
die(int status, char *format, ...)
|
die(int status, char *format, ...)
|
||||||
{
|
{
|
||||||
@ -27,15 +43,18 @@ die(int status, char *format, ...)
|
|||||||
|
|
||||||
va_start(args, format);
|
va_start(args, format);
|
||||||
if (status != 0)
|
if (status != 0)
|
||||||
puts("Error: ");
|
puts("psh: error: ");
|
||||||
|
|
||||||
vprintf(format, args);
|
vprintf(format, args);
|
||||||
if (status != 0)
|
if (status != 0)
|
||||||
puts("! Exiting...");
|
puts("! exiting...");
|
||||||
|
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
if (status < 0)
|
if (status < 0)
|
||||||
perror("Reason");
|
perror("reason");
|
||||||
exit(status);
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
exit(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -79,6 +98,32 @@ tokenize(char *input)
|
|||||||
return argc;
|
return argc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
call_ecmd(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
char *err;
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
pid = fork();
|
||||||
|
|
||||||
|
if (pid == -1)
|
||||||
|
die(-1, "fork failed");
|
||||||
|
|
||||||
|
/* parent */
|
||||||
|
if (pid)
|
||||||
|
return wait(&status), status;
|
||||||
|
|
||||||
|
/* child */
|
||||||
|
execvp(argv[0], argv);
|
||||||
|
|
||||||
|
/* if we are here then called program failed */
|
||||||
|
err = strerror(errno);
|
||||||
|
print("%s: %s", argv[0], err);
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
@ -94,7 +139,7 @@ main(int argc, char **argv)
|
|||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
if (getcwd(cwd, sizeof(cwd)) == NULL)
|
if (getcwd(cwd, sizeof(cwd)) == NULL)
|
||||||
die(-1, "Could not get current directory");
|
die(1, "Could not get current directory");
|
||||||
|
|
||||||
printf("[%s] ", cwd);
|
printf("[%s] ", cwd);
|
||||||
|
|
||||||
@ -102,12 +147,25 @@ main(int argc, char **argv)
|
|||||||
die(0, "Caught ^D");
|
die(0, "Caught ^D");
|
||||||
|
|
||||||
if ((num_tokens = tokenize(input)) < 0)
|
if ((num_tokens = tokenize(input)) < 0)
|
||||||
die(1, "Could not parse tokens");
|
die(1, "Could not parse input");
|
||||||
|
|
||||||
|
/* no input, start again */
|
||||||
if (num_tokens == 0)
|
if (num_tokens == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ((ret = call_icmd(num_tokens, g_tokens) < 0))
|
/* search for internal commands first */
|
||||||
puts("Internal command failed!");
|
if ((ret = find_icmd(g_tokens[0])) >= 0)
|
||||||
|
{
|
||||||
|
ret = call_icmd(ret, num_tokens, g_tokens);
|
||||||
|
|
||||||
|
if (ret)
|
||||||
|
print("Internal command '%s' failed with error code: %d", g_tokens[0], ret);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = call_ecmd(num_tokens, g_tokens);
|
||||||
|
if (ret)
|
||||||
|
print("External command '%s' failed with error code: %d", g_tokens[0], ret);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user