| .vscode | ||
| eval | ||
| inc | ||
| lib | ||
| src | ||
| tests | ||
| .editorconfig | ||
| .gitignore | ||
| .gitmodules | ||
| compile_flags.txt | ||
| en.subject.pdf | ||
| Makefile | ||
| Makefile.old | ||
| minishell_test.cfg | ||
| readline.supp | ||
| README.md | ||
Minishell
A lot of amazing shell stuff
Dependencies
- libreadline-dev
- libncurses-dev
Comments on work
- Checked if path is a directory and send appropriate message
executor_absolute_path=> extracted some code into helpers to make it norminette compliantexecutor_child=> refactored putstr_fd into error_msg | checked if file on path is exectuable to show permission denied where applicablelexer_token_next=> extracted code for norminetteparser=> A LOT of work in all files for norminette compliancyexpander_parse_string=> Fixed so that $HOME/test.txt returns the correct path and file
Edge Cases
cat $PWD/testshould expand,cd -:bash: cd: OLDPWD not setcd ~: does not expand ?
Tester
TODO
- Find absolute path for command input ('/', './', 'cmd')
- Add heredoc to tokenizer
- Environment to
t_list - Get environment array (export)
- Set environment variable (export)
- Simple builtin export
- builtins
- Preliminary signals
- Define struct for commands, something like (
typedef struct s_command { char *command; char *path; char **args; int fd_in; int fd_out; } t_command;
)
- Make the
executor, run a command - Make a parser to create a command list
- Add redirects, appends, pipe etc. File descriptor functions a command can have multiple redirects but only the last is used for stdout Redirects take precedence over pipes, but pipes are still created and managed. should it close the unused pipe-end? all redirects are opened and closed, but only last fd is used. multiple HEREDOCs can be nested, only last is used.
- Expand $ vars & support $ ~?
- $var
- $?
- ~
- export without arguments
- ft_free_arr_safe in environment mess
- builtins not first in pipeline? wtf is happening HAHAHAHAHAH its not using builtin, but core-utils
- CB command to change banner
- Bonus: Command tree for &&, ||, *
Signals
In interactive mode
ctrl - Credisplay prompt status 130ctrl - Dexit shellctrl - \-- Done
During process
ctrl - CSIGINT to processs status 130ctrl - Dctrl - \SIGQUIT to process core dumped status 131 -- Shows ^C
During HEREDOC
ctrl - Credisplay prompt status 130ctrl - DSEND EOF error displayed but still works status:0ctrl - \nothing
Allowed Functions
<readline/readline.h>
readlinechar *readline(const char *prompt);- Reads a line from the terminal with editing capabilities.
rl_clear_historyvoid rl_clear_history(void);- Clears the history of lines read by readline.
rl_on_new_lineint rl_on_new_line(void);- Resets the state to indicate that a new line of input is being read.
rl_replace_lineint rl_replace_line(const char *text, int clear_undo);- Replaces the contents of the current line with text.
rl_redisplayint rl_redisplay(void);- Redisplays the current input line.
add_historyvoid add_history(const char *line);- Adds the line to the history list.
<stdio.h>
printfint printf(const char *format, ...);- Sends formatted output to stdout.
<stdlib.h>
mallocvoid *malloc(size_t size);- Allocates size bytes of memory and returns a pointer to the allocated memory.
freevoid free(void *ptr);- Frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc.
<unistd.h>
writessize_t write(int fd, const void *buf, size_t count);- Writes up to count bytes from the buffer starting at buf to the file referred to by the file descriptor fd.
accessint access(const char *pathname, int mode);- Checks the file named by pathname for accessibility according to the bit pattern contained in mode.
openint open(const char *pathname, int flags, ...);- Opens a file specified by pathname. The flags argument determines the file access mode and file status flags.
readssize_t read(int fd, void *buf, size_t count);- Reads up to count bytes from file descriptor fd into the buffer starting at buf.
closeint close(int fd);- Closes the file descriptor fd.
forkpid_t fork(void);- Creates a new process by duplicating the calling process.
<sys/wait.h>
waitpid_t wait(int *wstatus);- Suspends execution of the calling process until one of its children terminates.
waitpidpid_t waitpid(pid_t pid, int *wstatus, int options);- Suspends execution of the calling process until the child specified by pid changes state.
wait3pid_t wait3(int *wstatus, int options, struct rusage *rusage);- Similar to wait, but also returns resource usage information.
wait4pid_t wait4(pid_t pid, int *wstatus, int options, struct rusage *rusage);- Similar to waitpid, but also returns resource usage information.
<signal.h>
signalvoid (*signal(int signum, void (*handler)(int)))(int);- Sets a function to handle signal signum.
sigactionint sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);- Examines and changes the action associated with a specific signal.
sigemptysetint sigemptyset(sigset_t *set);- Initializes the signal set pointed to by set to exclude all signals.
sigaddsetint sigaddset(sigset_t *set, int signum);- Adds the individual signal specified by signum to the signal set pointed to by set.
killint kill(pid_t pid, int sig);- Sends the signal sig to the process specified by pid.
<stdlib.h>
exitvoid exit(int status);- Causes normal process termination and returns an exit status to the host environment.
<sys/stat.h>
statint stat(const char *pathname, struct stat *statbuf);- Retrieves information about the file pointed to by pathname and fills in the stat structure.
lstatint lstat(const char *pathname, struct stat *statbuf);- Similar to stat, but does not follow symbolic links.
fstatint fstat(int fd, struct stat *statbuf);- Retrieves information about the file referred to by the open file descriptor fd.
<unistd.h>
unlinkint unlink(const char *pathname);- Deletes a name from the filesystem.
pipeint pipe(int pipefd[2]);- Creates a pipe, a unidirectional data channel that can be used for interprocess communication.
dupint dup(int oldfd);- Duplicates the file descriptor oldfd.
dup2int dup2(int oldfd, int newfd);- Duplicates oldfd to newfd, closing newfd first if necessary.
execveint execve(const char *pathname, char *const argv[], char *const envp[]);- Executes the program referred to by pathname.
getcwdchar *getcwd(char *buf, size_t size);- Gets the current working directory and stores it in the buffer pointed to by buf.
chdirint chdir(const char *path);- Changes the current working directory to the directory specified in path.
<dirent.h>
opendirDIR *opendir(const char *name);- Opens a directory stream corresponding to the directory name, and returns a pointer to the directory stream.
readdirstruct dirent *readdir(DIR *dirp);- Reads the next directory entry from the directory stream pointed to by dirp.
closedirint closedir(DIR *dirp);- Closes the directory stream associated with dirp.
<string.h>
strerrorchar *strerror(int errnum);- Returns a pointer to the textual representation of the error number errnum.
perrorvoid perror(const char *s);- Prints a descriptive error message to stderr.
<unistd.h>
isattyint isatty(int fd);- Tests whether fd is an open file descriptor referring to a terminal.
ttynamechar *ttyname(int fd);- Returns a pointer to the null-terminated pathname of the terminal associated with fd.
ttyslotint ttyslot(void);- Returns the index of the current user's terminal in the user accounting file.
<sys/ioctl.h>
ioctlint ioctl(int fd, unsigned long request, ...);- Manipulates the underlying device parameters of special files.
<stdlib.h>
getenvchar *getenv(const char *name);- Searches the environment list for a string that matches the name.
<termios.h>
tcsetattrint tcsetattr(int fd, int optional_actions, const struct termios *termios_p);- Sets the parameters associated with the terminal referred to by fd.
tcgetattrint tcgetattr(int fd, struct termios *termios_p);- Gets the parameters associated with the terminal referred to by fd.
<term.h>
tgetentint tgetent(char *bp, const char *name);- Loads the entry for name from the termcap database.
tgetflagint tgetflag(const char *id);- Gets the boolean entry for id from the termcap database.
tgetnumint tgetnum(const char *id);- Gets the numeric entry for id from the termcap database.
tgetstrchar *tgetstr(const char *id, char **area);- Gets the string entry for id from the termcap database.
tgotochar *tgoto(const char *cap, int col, int row);- Returns a cursor addressing string for the given capability cap.
tputsint tputs(const char *str, int affcnt, int (*putc)(int));- Outputs the string str with padding.