fix: verified file permision
This commit is contained in:
parent
449bc574b1
commit
a36b4ecdab
@ -57,6 +57,8 @@ int where(char** args, lst** env)
|
||||
|
||||
int builtin_execute(cmd_t* input, data_t *data, int fd_in, int fd_out)
|
||||
{
|
||||
if (input->executable == NULL)
|
||||
return 1;
|
||||
if (strcmp(input->executable, "cd") == 0)
|
||||
{
|
||||
change_directory(input->args, data->env);
|
||||
|
@ -14,13 +14,17 @@
|
||||
int execute(lst** cmds, cmd_t* cmd, lst** env)
|
||||
{
|
||||
int pid;
|
||||
if (cmd->executable != NULL)
|
||||
pid = fork();
|
||||
else
|
||||
if (cmd->input[0] == -2 || cmd->input[0] == -2)
|
||||
{
|
||||
dprintf(2, "Executable inconnu\n");
|
||||
return 1;
|
||||
pid = -1;
|
||||
return 0;
|
||||
}
|
||||
if (cmd->executable == NULL)
|
||||
{
|
||||
dprintf(2, "zzsh: command not found: %s\n", cmd->args[0]);
|
||||
return 0;
|
||||
}
|
||||
pid = fork();
|
||||
if (pid == -1)
|
||||
return 1;
|
||||
else if (pid == 0)
|
||||
@ -37,9 +41,7 @@ int execute(lst** cmds, cmd_t* cmd, lst** env)
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd->pid = pid;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -125,11 +127,7 @@ int cmds_list_exec(lst** cmds, data_t *data)
|
||||
add_fd(content->output, fds[1]);
|
||||
add_fd(((cmd_t*)current->next->content)->input, fds[0]);
|
||||
}
|
||||
if (content->args[0] == NULL)
|
||||
;
|
||||
else if (content->executable == NULL)
|
||||
dprintf(2, "zzsh: command not found: %s\n", content->args[0]);
|
||||
else if (builtin_execute(content, data, fds[0], fds[1]) == 1)
|
||||
if (builtin_execute(content, data, fds[0], fds[1]) == 1)
|
||||
{
|
||||
if (execute(cmds, content, data->env))
|
||||
{
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
char* get_path(const char* start_path)
|
||||
{
|
||||
@ -36,34 +37,40 @@ static size_t get_path_size(const char* str)
|
||||
return i;
|
||||
}
|
||||
|
||||
int redirection_fill(const char* str, size_t nb_symbols, cmd_t* command, const char *path)
|
||||
void redirection_fill(const char* str, size_t nb_symbols, cmd_t* command, const char *path)
|
||||
{
|
||||
int fd;
|
||||
if (str[0] == '>')
|
||||
{
|
||||
if (access(path, F_OK))
|
||||
dprintf(2, "zzsh: no such file or directory: %s\n", path);
|
||||
else if (access(path, R_OK))
|
||||
dprintf(2, "zzsh: permission denied: %s\n", path);
|
||||
if (nb_symbols == 1)
|
||||
fd = open(path, O_TRUNC | O_CREAT | O_WRONLY, 0644);
|
||||
else
|
||||
fd = open(path, O_APPEND | O_CREAT | O_WRONLY, 0644);
|
||||
if (command->input[0] > 2)
|
||||
close(command->input[0]);
|
||||
if (fd == -1)
|
||||
dprintf(2, "zzsh: \"%s\": file error\n", path);
|
||||
if (command->output[0] > 2)
|
||||
close(command->output[0]);
|
||||
command->output[0] = fd;
|
||||
return (fd == -1);
|
||||
fd = -2;
|
||||
command->input[0] = fd;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (access(path, F_OK))
|
||||
dprintf(2, "zzsh: no such file or directory: %s\n", path);
|
||||
else if (access(path, R_OK))
|
||||
dprintf(2, "zzsh: permission denied\n");
|
||||
if (nb_symbols == 1)
|
||||
fd = open(path, O_RDONLY);
|
||||
else
|
||||
fd = open(path, O_RDONLY);
|
||||
if (command->output[0] > 2)
|
||||
close(command->output[0]);
|
||||
if (fd == -1)
|
||||
dprintf(2, "zzsh: \"%s\": file error\n", path);
|
||||
if (command->input[0] > 2)
|
||||
close(command->input[0]);
|
||||
command->input[0] = fd;
|
||||
return (fd == -1);
|
||||
fd = -2;
|
||||
command->output[0] = fd;
|
||||
}
|
||||
}
|
||||
|
||||
@ -102,11 +109,7 @@ int get_redirections(char *str, cmd_t* command)
|
||||
path = get_path(redirection + redirection_type);
|
||||
if (path == NULL)
|
||||
return 1;
|
||||
if (redirection_fill(redirection, redirection_type, command, path))
|
||||
{
|
||||
free(path);
|
||||
return (1);
|
||||
}
|
||||
redirection_fill(redirection, redirection_type, command, path);
|
||||
str_shift(redirection, (get_path_size(redirection + redirection_type) + redirection_type) * -1);
|
||||
free(path);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user