fix: bug with cd path
This commit is contained in:
parent
a43436b20b
commit
8971ed233d
@ -9,3 +9,7 @@
|
|||||||
#define TYPE_FILE 1
|
#define TYPE_FILE 1
|
||||||
#define TYPE_DIRECTORY 3
|
#define TYPE_DIRECTORY 3
|
||||||
#define TYPE_SYMBOLIC_LINK 4
|
#define TYPE_SYMBOLIC_LINK 4
|
||||||
|
|
||||||
|
#define COLOR_BLUE "\x1b[34m"
|
||||||
|
#define COLOR_GREEN "\x1b[32m"
|
||||||
|
#define ESCAPE_COLOR "\x1b[0m"
|
||||||
18
src/disk.c
18
src/disk.c
@ -128,6 +128,8 @@ void write_in_file(disk *d, int file_index, char *data /*, char mode*/) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int find_dir_inode_by_name(char *name, int dir_index, disk *d) {
|
int find_dir_inode_by_name(char *name, int dir_index, disk *d) {
|
||||||
|
if (dir_index < 0 || dir_index >= MAX_INODE)
|
||||||
|
return -1;
|
||||||
|
|
||||||
int bloc = d->inodes[dir_index].blocs[0];
|
int bloc = d->inodes[dir_index].blocs[0];
|
||||||
|
|
||||||
@ -145,6 +147,9 @@ int find_dir_inode_by_name(char *name, int dir_index, disk *d) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int do_ls(disk *d, char *path) {
|
int do_ls(disk *d, char *path) {
|
||||||
|
|
||||||
|
// problème de path, il faut faire comme sur cd
|
||||||
|
|
||||||
char *path_to_process;
|
char *path_to_process;
|
||||||
|
|
||||||
if (path == NULL) {
|
if (path == NULL) {
|
||||||
@ -178,15 +183,18 @@ int do_ls(disk *d, char *path) {
|
|||||||
int bloc = dir_to_list.blocs[0];
|
int bloc = dir_to_list.blocs[0];
|
||||||
|
|
||||||
if (bloc == -1) {
|
if (bloc == -1) {
|
||||||
free(path_to_process);
|
free(path_to_process);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < MAX_BYTES_PER_BLOC; i += MAX_INODE_NAME + sizeof(int)) {
|
for (int i = 0; i < MAX_BYTES_PER_BLOC; i += MAX_INODE_NAME + sizeof(int)) {
|
||||||
if (d->blocs[bloc].datas[i] != '\0') {
|
if (d->blocs[bloc].datas[i] != '\0') {
|
||||||
int inode_id;
|
int inode_id;
|
||||||
memcpy(&inode_id, &d->blocs[bloc].datas[i + MAX_INODE_NAME], sizeof(int));
|
memcpy(&inode_id, &d->blocs[bloc].datas[i + MAX_INODE_NAME], sizeof(int));
|
||||||
dprintf(STDOUT_FILENO, "%-16s %d\n", &d->blocs[bloc].datas[i], inode_id);
|
dprintf(STDOUT_FILENO, "%s%-16s %s%d\n",
|
||||||
|
d->inodes[inode_id].filetype == TYPE_FILE ? COLOR_GREEN
|
||||||
|
: COLOR_BLUE,
|
||||||
|
&d->blocs[bloc].datas[i], ESCAPE_COLOR, inode_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -256,6 +264,10 @@ disk create_disk() {
|
|||||||
d.inodes[0].blocs[0] = 0; // utilise le bloc 0
|
d.inodes[0].blocs[0] = 0; // utilise le bloc 0
|
||||||
d.owned_blocs[0] = 1; // le bloc 1 est maintenant occupé
|
d.owned_blocs[0] = 1; // le bloc 1 est maintenant occupé
|
||||||
|
|
||||||
|
strncpy(&d.blocs[0].datas[0], ".", MAX_INODE_NAME);
|
||||||
|
int point_inode = 1;
|
||||||
|
memcpy(&d.blocs[0].datas[MAX_INODE_NAME], &point_inode, sizeof(int));
|
||||||
|
|
||||||
init_test_files(&d);
|
init_test_files(&d);
|
||||||
|
|
||||||
int n = fwrite(&d, sizeof(disk), 1, fptr);
|
int n = fwrite(&d, sizeof(disk), 1, fptr);
|
||||||
|
|||||||
@ -10,3 +10,4 @@
|
|||||||
disk create_disk();
|
disk create_disk();
|
||||||
disk open_disk(char* filename);
|
disk open_disk(char* filename);
|
||||||
int do_ls(disk *d, char* path);
|
int do_ls(disk *d, char* path);
|
||||||
|
int find_dir_inode_by_name(char *name, int dir_index, disk *d);
|
||||||
12
src/env.c
12
src/env.c
@ -45,3 +45,15 @@ char *get_env_value(char *key) {
|
|||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int set_env_value(char *key, char *value) {
|
||||||
|
env *envs = get_instance();
|
||||||
|
|
||||||
|
for (int i = 0; i < get_env_len(envs); i++) {
|
||||||
|
if (strcmp(envs[i].key, key) == 0) {
|
||||||
|
envs[i].value = strdup(value);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@ -4,5 +4,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
char* get_env_value(char* key);
|
char* get_env_value(char* key);
|
||||||
|
int set_env_value(char *key, char *value);
|
||||||
int get_env_len(env *envs);
|
int get_env_len(env *envs);
|
||||||
env* init_envs();
|
env* init_envs();
|
||||||
80
src/exec.c
80
src/exec.c
@ -1,41 +1,87 @@
|
|||||||
/** @file */
|
/** @file */
|
||||||
#include "exec.h"
|
#include "exec.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
|
#include "env.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
// à changer parce que je veux pas chercher dans le PATH, je veux juste executer
|
void canonicalize_path(char *path) {
|
||||||
// les futures primitives qui seront implémentées
|
char *tokens[100];
|
||||||
/*int execute_cmd(char **args) {
|
int depth = 0;
|
||||||
if (!is_builtin_cmd(args[0])) {
|
|
||||||
int pid = fork();
|
|
||||||
if (pid == -1)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (pid == 0) {
|
char *tmp = strdup(path);
|
||||||
// Ce que va exécuter l'enfant
|
char *token = strtok(tmp, "/");
|
||||||
int status_code = execvp(args[0], args);
|
|
||||||
perror(args[0]);
|
while (token != NULL) {
|
||||||
return status_code;
|
if (strcmp(token, "..") == 0) {
|
||||||
} else {
|
if (depth > 0) depth--;
|
||||||
// Ce que va exécuter le parent
|
} else if (strcmp(token, ".") != 0 && strlen(token) > 0) {
|
||||||
int status;
|
tokens[depth++] = token;
|
||||||
waitpid(pid, &status, WUNTRACED);
|
}
|
||||||
|
token = strtok(NULL, "/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
strcpy(path, "/");
|
||||||
|
for (int i = 0; i < depth; i++) {
|
||||||
|
strcat(path, tokens[i]);
|
||||||
|
if (i < depth - 1) strcat(path, "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
free(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
int do_cd(disk *d, char *path) {
|
||||||
|
char full_path[1024] = {0};
|
||||||
|
|
||||||
|
if (path == NULL || strcmp(path, "/") == 0 || strlen(path) == 0) {
|
||||||
|
strcpy(full_path, "/");
|
||||||
|
} else if (path[0] == '/') {
|
||||||
|
strncpy(full_path, path, 1023);
|
||||||
|
} else {
|
||||||
|
char *current_pwd = get_env_value("PWD");
|
||||||
|
snprintf(full_path, sizeof(full_path), "%s/%s",
|
||||||
|
strcmp(current_pwd, "/") == 0 ? "" : current_pwd, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *path_tmp = strdup(full_path);
|
||||||
|
int dir_index = 0;
|
||||||
|
char *token = strtok(path_tmp, "/");
|
||||||
|
|
||||||
|
while (token != NULL) {
|
||||||
|
dir_index = find_dir_inode_by_name(token, dir_index, d);
|
||||||
|
|
||||||
|
if (dir_index == -1 || d->inodes[dir_index].filetype != TYPE_DIRECTORY) {
|
||||||
|
dprintf(STDERR_FILENO, "cd: invalid path: %s\n", token);
|
||||||
|
free(path_tmp);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
token = strtok(NULL, "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
canonicalize_path(full_path);
|
||||||
|
|
||||||
|
set_env_value("PWD", full_path);
|
||||||
|
|
||||||
|
free(path_tmp);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
int child_process_job(disk *d, char **args) {
|
int child_process_job(disk *d, char **args) {
|
||||||
if (strcmp("ls", args[0]) == 0) {
|
if (strcmp("ls", args[0]) == 0) {
|
||||||
do_ls(d, args[1]);
|
do_ls(d, args[1]);
|
||||||
|
} else {
|
||||||
|
dprintf(STDERR_FILENO, "%s: no such command\n", args[0]);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int execute_cmd(disk *d, char **args) {
|
int execute_cmd(disk *d, char **args) {
|
||||||
|
if (strcmp(args[0], "cd") == 0) {
|
||||||
|
return do_cd(d, args[1]);
|
||||||
|
}
|
||||||
|
|
||||||
int pid = fork();
|
int pid = fork();
|
||||||
|
|
||||||
if (pid == 1) {
|
if (pid == 1) {
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
|
||||||
int is_builtin_cmd(char *executable);
|
int is_builtin_cmd(char *executable);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user