| .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 | ||
| sources.mk | ||
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
- 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
- Remove -c option parsing as split can break
- Only
""as input shows command not found, that invalid - CTRL+\ during
sleep 5should do nothing, but returns a new prompt - echo "hello" > /root/protected.txt gives the error but still prints
- cat < filenoexit returns
minishell: minishell: unable to write to temp file: No such file or directorybut we're not writin - 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.