Skip to content
Snippets Groups Projects
Commit 1241958d authored by Jaewon Choi's avatar Jaewon Choi
Browse files

Split built_in commands and add signal modality

parent 4a4d712a
No related branches found
No related tags found
No related merge requests found
......@@ -2,7 +2,7 @@
CC=gcc -std=c99
CFLAGS=-I./src -I./include
LIB=
OBJ=./src/utils.o ./src/commands.o
OBJ=./src/utils.o ./src/commands.o ./src/built_in.o
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
......
#ifndef BUILT_IN_H_
#define BUILT_IN_H_
typedef int (*built_in_command_do)(int, char**);
typedef int (*built_in_command_validate)(int, char**);
struct built_in_command
{
char command_name[512];
built_in_command_do command_do;
built_in_command_validate command_validate;
};
/**
do_cd(argc, argv)
params:
argc: # of arguments. argc must be 2. just "cd" doesn't be approved.
argv: a list of arguments.
returns:
If success, return 0.
Else if arguments are not valid, return -1.
*/
int do_cd(int argc, char** argv);
/**
do_pwd(argc, argv)
params:
argc: # of arguments. argc must be 1.
argv: a list of arguments.
returns:
If success, return 0.
Else if arguments are not valid, return -1.
*/
int do_pwd(int argc, char** argv);
int do_fg(int argc, char** argv);
/**
validate_cd_argv(argc, argv)
returns:
If success, return 1. (true)
Else return 0. (false)
*/
int validate_cd_argv(int argc, char** argv);
/**
validate_pwd_argv(argc, argv)
returns:
If success, return 1. (true)
Else return 0. (false)
*/
int validate_pwd_argv(int argc, char** argv);
int validate_fg_argv(int argc, char** argv);
#endif // BUILT_IN_H_
......@@ -7,47 +7,4 @@ struct single_command
char** argv;
};
/**
do_cd(argc, argv)
params:
argc: # of arguments. argc must be 2. just "cd" doesn't be approved.
argv: a list of arguments.
returns:
If success, return 0.
Else if arguments are not valid, return -1.
*/
int do_cd(int argc, char** argv);
/**
do_pwd(argc, argv)
params:
argc: # of arguments. argc must be 1.
argv: a list of arguments.
returns:
If success, return 0.
Else if arguments are not valid, return -1.
*/
int do_pwd(int argc, char** argv);
/**
validate_cd_argv(argc, argv)
returns:
If success, return 1. (true)
Else return 0. (false)
*/
int validate_cd_argv(int argc, char** argv);
/**
validate_pwd_argv(argc, argv)
returns:
If success, return 1. (true)
Else return 0. (false)
*/
int validate_pwd_argv(int argc, char** argv);
#endif // MYSH_COMMANDS_H_
#ifndef SIGNAL_H_
#define SIGNAL_H_
void catch_sigint(int);
void catch_sigtstp(int);
#endif // SIGNAL_H_
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/limits.h>
#include "built_in.h"
int do_cd(int argc, char** argv) {
if (!validate_cd_argv(argc, argv))
return -1;
if (chdir(argv[1]) == -1)
return -1;
return 0;
}
int do_pwd(int argc, char** argv) {
if (!validate_pwd_argv(argc, argv))
return -1;
char curdir[PATH_MAX];
if (getcwd(curdir, PATH_MAX) == NULL)
return -1;
printf("%s\n", curdir);
return 0;
}
int do_fg(int argc, char** argv) {
if (!validate_fg_argv(argc, argv))
return -1;
// TODO: Fill this.
return 0;
}
int validate_cd_argv(int argc, char** argv) {
if (argc != 2) return 0;
if (strcmp(argv[0], "cd") != 0) return 0;
struct stat buf;
stat(argv[1], &buf);
if (!S_ISDIR(buf.st_mode)) return 0;
return 1;
}
int validate_pwd_argv(int argc, char** argv) {
if (argc != 1) return 0;
if (strcmp(argv[0], "pwd") != 0) return 0;
return 1;
}
int validate_fg_argv(int argc, char** argv) {
if (argv != 1) return 0;
if (strcmp(argv[0], "fg") != 0) return 0;
return 1;
}
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/limits.h>
#include "commands.h"
#include "built_in.h"
int do_cd(int argc, char** argv) {
if (!validate_cd_argv(argc, argv))
return -1;
if (chdir(argv[1]) == -1)
return -1;
return 0;
}
int do_pwd(int argc, char** argv) {
if (!validate_pwd_argv(argc, argv))
return -1;
char curdir[PATH_MAX];
if (getcwd(curdir, PATH_MAX) == NULL)
return -1;
printf("%s\n", curdir);
return 0;
}
int validate_cd_argv(int argc, char** argv) {
if (argc != 2) return 0;
if (strcmp(argv[0], "cd") != 0) return 0;
struct stat buf;
stat(argv[1], &buf);
if (!S_ISDIR(buf.st_mode)) return 0;
return 1;
}
struct built_in_command built_in_commands[] = {
{ "cd", do_cd, validate_cd_argv },
{ "pwd", do_pwd, validate_pwd_argv },
{ "fg", do_fg, validate_fg_argv }
};
int validate_pwd_argv(int argc, char** argv) {
if (argc != 1) return 0;
if (strcmp(argv[0], "pwd") != 0) return 0;
return 1;
}
......@@ -3,10 +3,9 @@
#include <string.h>
#include "commands.h"
#include "built_in.h"
#include "utils.h"
static void release_argv(int argc, char*** argv);
int main()
{
char buf[8096];
......@@ -56,11 +55,3 @@ release_and_exit:
return 0;
}
static void release_argv(int argc, char*** argv) {
for (int i = 0; i < argc; ++i) {
free((*argv)[i]);
}
free(*argv);
*argv = NULL;
}
#include "signal.h"
void catch_sigint(int)
{
// TODO: File this!
}
void catch_sigtstp(int);
{
// TODO: File this!
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment