├── my_script ├── src ├── error.o ├── main.o ├── footer.o ├── header.o ├── parsing.o ├── my_forkpty.o ├── my_granpt.o ├── my_openpty.o ├── my_ptsname.o ├── my_script.o ├── open_file.o ├── run_script.o ├── select_fd.o ├── get_commands.o ├── init_select.o ├── my_login_tty.o ├── my_unlockpt.o ├── set_capabilities.o ├── main.c ├── my_granpt.c ├── my_unlockpt.c ├── error.c ├── init_select.c ├── my_ptsname.c ├── my_login_tty.c ├── set_capabilities.c ├── get_commands.c ├── run_script.c ├── my_openpty.c ├── my_forkpty.c ├── select_fd.c ├── my_script.c ├── header.c ├── open_file.c ├── footer.c └── parsing.c ├── set_capabilities.c ├── .gitattributes ├── .gitignore ├── Makefile ├── include └── my_script.h └── typescript /my_script: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/my_script -------------------------------------------------------------------------------- /src/error.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/error.o -------------------------------------------------------------------------------- /src/main.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/main.o -------------------------------------------------------------------------------- /src/footer.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/footer.o -------------------------------------------------------------------------------- /src/header.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/header.o -------------------------------------------------------------------------------- /src/parsing.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/parsing.o -------------------------------------------------------------------------------- /src/my_forkpty.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/my_forkpty.o -------------------------------------------------------------------------------- /src/my_granpt.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/my_granpt.o -------------------------------------------------------------------------------- /src/my_openpty.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/my_openpty.o -------------------------------------------------------------------------------- /src/my_ptsname.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/my_ptsname.o -------------------------------------------------------------------------------- /src/my_script.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/my_script.o -------------------------------------------------------------------------------- /src/open_file.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/open_file.o -------------------------------------------------------------------------------- /src/run_script.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/run_script.o -------------------------------------------------------------------------------- /src/select_fd.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/select_fd.o -------------------------------------------------------------------------------- /src/get_commands.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/get_commands.o -------------------------------------------------------------------------------- /src/init_select.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/init_select.o -------------------------------------------------------------------------------- /src/my_login_tty.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/my_login_tty.o -------------------------------------------------------------------------------- /src/my_unlockpt.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/my_unlockpt.o -------------------------------------------------------------------------------- /src/set_capabilities.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kefranabg/MyScript/master/src/set_capabilities.o -------------------------------------------------------------------------------- /set_capabilities.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** set_capabilities.c for set_capabilities.c in /home/abgral_f/rendu/PSU_2013_myscript 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Mon Apr 7 18:27:35 2014 abgral_f 8 | ** Last update Mon Apr 7 18:27:37 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include "projet.h" 13 | 14 | void projet_fonction() 15 | { 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** main.c for main.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sat Feb 22 23:07:09 2014 abgral_f 8 | ** Last update Sun Feb 23 16:29:45 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include "my_script.h" 13 | 14 | int main(int argc, char **argv) 15 | { 16 | (void)argc; 17 | return (my_script(argv)); 18 | } 19 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /src/my_granpt.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** my_granpt.c for my_granpt.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sun Feb 23 17:14:52 2014 abgral_f 8 | ** Last update Tue Feb 25 17:21:01 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include 13 | #include "my_script.h" 14 | 15 | int my_granpt(int fd) 16 | { 17 | if (chmod(my_ptsname(fd), S_IRUSR | S_IWUSR | S_IWGRP) == -1) 18 | return (EXIT_FAILURE); 19 | return (EXIT_SUCCESS); 20 | } 21 | -------------------------------------------------------------------------------- /src/my_unlockpt.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** my_unlockpt.c for my_unlockpt.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sun Feb 23 17:15:38 2014 abgral_f 8 | ** Last update Sun Mar 2 12:15:22 2014 abgral_f 9 | */ 10 | 11 | 12 | #include 13 | #include 14 | #include 15 | #include "my_script.h" 16 | 17 | int my_unlockpt(int fd) 18 | { 19 | int op; 20 | 21 | op = 0; 22 | if (ioctl(fd, TIOCSPTLCK, &op) == -1) 23 | return (EXIT_FAILURE); 24 | return (EXIT_SUCCESS); 25 | } 26 | -------------------------------------------------------------------------------- /src/error.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** error.c for error.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sat Feb 22 23:26:24 2014 abgral_f 8 | ** Last update Sun Feb 23 16:07:29 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include "my_script.h" 16 | 17 | int error(const char *message, t_script *script) 18 | { 19 | if (script->set == 1) 20 | ioctl(0, TCSETS, &script->old_cap); 21 | write(2, message, strlen(message)); 22 | return (EXIT_FAILURE); 23 | } 24 | -------------------------------------------------------------------------------- /src/init_select.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** init_select.c for init_select.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sun Feb 23 12:09:52 2014 abgral_f 8 | ** Last update Sun Feb 23 12:13:47 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include "my_script.h" 13 | 14 | int init_select(t_script *script, fd_set *readfds) 15 | { 16 | FD_ZERO(readfds); 17 | FD_SET(script->master, readfds); 18 | FD_SET(0, readfds); 19 | if (select(script->master + 1, readfds, NULL, NULL, NULL) == -1) 20 | return (error(SELECT_ERR, script)); 21 | return (EXIT_SUCCESS); 22 | } 23 | -------------------------------------------------------------------------------- /src/my_ptsname.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** my_ptsname.c for my_ptsname.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sun Feb 23 17:12:50 2014 abgral_f 8 | ** Last update Mon Feb 24 13:32:01 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include 13 | #include 14 | #include "my_script.h" 15 | 16 | char *my_ptsname(int fd) 17 | { 18 | static char name[516]; 19 | int op; 20 | 21 | if (ioctl(fd, TIOCGPTN, &op) == -1) 22 | return (NULL); 23 | if (sprintf(name, "/dev/pts/%i", op) < 0) 24 | return (NULL); 25 | return (name); 26 | } 27 | -------------------------------------------------------------------------------- /src/my_login_tty.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** my_login_tty.c for my_login_tty.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sun Feb 23 17:11:44 2014 abgral_f 8 | ** Last update Sun Feb 23 20:33:58 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include "my_script.h" 17 | 18 | int my_login_tty(int fd) 19 | { 20 | if (setsid() == -1) 21 | return (EXIT_FAILURE); 22 | if (dup2(fd, 0) == -1) 23 | return (EXIT_FAILURE); 24 | if (dup2(fd, 1) == -1) 25 | return (EXIT_FAILURE); 26 | if (dup2(fd, 2) == -1) 27 | return (EXIT_FAILURE); 28 | return (EXIT_SUCCESS); 29 | } 30 | -------------------------------------------------------------------------------- /src/set_capabilities.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** set_capabilities.c for set_capabilities.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sun Feb 23 00:03:50 2014 abgral_f 8 | ** Last update Mon Feb 24 13:36:43 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include 13 | #include "my_script.h" 14 | 15 | int set_capabilities(t_script *script) 16 | { 17 | struct termios cap; 18 | 19 | if (ioctl(0, TCGETS, &cap) == -1) 20 | return (error(IOCTL_ERR, script)); 21 | script->old_cap = cap; 22 | cap.c_lflag &= ~(ICANON | ECHO | ISIG); 23 | if (ioctl(0, TCSETS, &cap) == -1) 24 | return (error(IOCTL_ERR, script)); 25 | script->set = 1; 26 | return (EXIT_SUCCESS); 27 | } 28 | -------------------------------------------------------------------------------- /src/get_commands.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** get_commands.c for get_commands.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sat Feb 22 23:58:30 2014 abgral_f 8 | ** Last update Wed Apr 9 14:22:21 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include 13 | #include "my_script.h" 14 | 15 | int get_commands(t_script *script) 16 | { 17 | fd_set readfds; 18 | 19 | if (set_capabilities(script) == EXIT_FAILURE) 20 | return (EXIT_FAILURE); 21 | while (42) 22 | { 23 | if (init_select(script, &readfds) == EXIT_FAILURE) 24 | return (EXIT_FAILURE); 25 | else 26 | { 27 | if (fd_select(script, &readfds) == EXIT_FAILURE) 28 | return (EXIT_FAILURE); 29 | } 30 | } 31 | return (EXIT_SUCCESS); 32 | } 33 | -------------------------------------------------------------------------------- /src/run_script.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** run_script.c for run_script.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sun Feb 23 12:18:11 2014 abgral_f 8 | ** Last update Tue Feb 25 17:51:36 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include 13 | #include 14 | #include "my_script.h" 15 | 16 | int run_script(t_script *script) 17 | { 18 | int ret; 19 | 20 | if (open_file(script) == EXIT_FAILURE) 21 | return (EXIT_FAILURE); 22 | if (header(script) == EXIT_FAILURE) 23 | return (EXIT_FAILURE); 24 | ret = get_commands(script); 25 | ioctl(0, TCSETS, &script->old_cap); 26 | if (footer(script) == EXIT_FAILURE) 27 | return (EXIT_FAILURE); 28 | close(script->fd_script); 29 | return (ret); 30 | } 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear in the root of a volume 35 | .DocumentRevisions-V100 36 | .fseventsd 37 | .Spotlight-V100 38 | .TemporaryItems 39 | .Trashes 40 | .VolumeIcon.icns 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | .apdisk 48 | -------------------------------------------------------------------------------- /src/my_openpty.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** my_openpty.c for my_openpty.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sun Feb 23 17:09:45 2014 abgral_f 8 | ** Last update Sun Feb 23 18:42:12 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include "my_script.h" 16 | 17 | int my_openpty(int *amaster, int *aslave) 18 | { 19 | char *path; 20 | 21 | if ((*amaster = open(PATH, O_RDWR)) == -1) 22 | return (EXIT_FAILURE); 23 | if ((path = my_ptsname(*amaster)) == NULL) 24 | return (EXIT_FAILURE); 25 | if (my_granpt(*amaster) == EXIT_FAILURE) 26 | return (EXIT_FAILURE); 27 | if (my_unlockpt(*amaster) == EXIT_FAILURE) 28 | return (EXIT_FAILURE); 29 | if ((*aslave = open(path, O_RDWR)) == -1) 30 | return (EXIT_FAILURE); 31 | return (EXIT_SUCCESS); 32 | } 33 | -------------------------------------------------------------------------------- /src/my_forkpty.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** my_forkpty.c for my_forkpty.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sun Feb 23 16:34:04 2014 abgral_f 8 | ** Last update Tue Feb 25 17:16:39 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include 13 | #include "my_script.h" 14 | 15 | pid_t my_forkpty(int *amaster) 16 | { 17 | int aslave; 18 | pid_t pid; 19 | 20 | if (my_openpty(amaster, &aslave) == EXIT_FAILURE) 21 | return (EXIT_FAILURE); 22 | if ((pid = fork()) == -1) 23 | { 24 | close(*amaster); 25 | close(aslave); 26 | return (EXIT_FAILURE); 27 | } 28 | if (pid == 0) 29 | { 30 | close(*amaster); 31 | if (my_login_tty(aslave) == EXIT_FAILURE) 32 | return (EXIT_FAILURE); 33 | } 34 | else 35 | { 36 | close(aslave); 37 | return (pid); 38 | } 39 | return (EXIT_SUCCESS); 40 | } 41 | -------------------------------------------------------------------------------- /src/select_fd.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** select_fd.c for select_fd.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sun Feb 23 12:01:36 2014 abgral_f 8 | ** Last update Tue Apr 8 18:38:28 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include "my_script.h" 13 | 14 | int fd_select(t_script *script, fd_set *readfds) 15 | { 16 | char buffer[SIZE_BUFF]; 17 | int ret; 18 | 19 | if (FD_ISSET(0, readfds)) 20 | { 21 | if ((ret = read(0, buffer, SIZE_BUFF)) == -1) 22 | return (EXIT_FAILURE); 23 | else 24 | write(script->master, buffer, SIZE_BUFF); 25 | } 26 | if (FD_ISSET(script->master, readfds)) 27 | { 28 | if ((ret = read(script->master, buffer, SIZE_BUFF)) == -1) 29 | return (EXIT_FAILURE); 30 | else 31 | { 32 | write(1, buffer, SIZE_BUFF); 33 | write(script->fd_script, buffer, SIZE_BUFF); 34 | } 35 | } 36 | return (EXIT_SUCCESS); 37 | } 38 | -------------------------------------------------------------------------------- /src/my_script.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** my_script.c for my_script.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sat Feb 22 23:13:59 2014 abgral_f 8 | ** Last update Tue Apr 8 15:41:27 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include 13 | #include "my_script.h" 14 | 15 | int my_script(char **argv) 16 | { 17 | t_script script; 18 | pid_t pid; 19 | char *shell_name; 20 | 21 | if (parsing(&script, argv) == EXIT_FAILURE) 22 | return (EXIT_FAILURE); 23 | if ((shell_name = getenv(SHELL_ENV)) == NULL) 24 | shell_name = BOURNE_SHELL; 25 | pid = my_forkpty(&script.master); 26 | if (pid == -1) 27 | return (error(FORKPTY_ERR, &script)); 28 | if (pid == 0) 29 | { 30 | if (script.opt_c == 0) 31 | execl(shell_name, shell_name, NULL); 32 | else 33 | execl(shell_name, shell_name, "-c", script.cmd, NULL); 34 | } 35 | else 36 | return (run_script(&script)); 37 | return (EXIT_SUCCESS); 38 | } 39 | -------------------------------------------------------------------------------- /src/header.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** header.c for header.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sun Feb 23 12:48:37 2014 abgral_f 8 | ** Last update Thu Feb 27 17:27:39 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include "my_script.h" 17 | 18 | int header(t_script *script) 19 | { 20 | char date[SIZE_DATE]; 21 | time_t timestamp; 22 | 23 | 24 | if ((timestamp = time(NULL)) == -1) 25 | return (error(TIME_ERR, script)); 26 | strftime(date, sizeof(date), FORMAT, localtime(×tamp)); 27 | if (script->opt_q == 0) 28 | { 29 | write(1, SCRIPT_START, strlen(SCRIPT_START)); 30 | write(1, script->file_name, strlen(script->file_name)); 31 | write(1, "\n", 1); 32 | } 33 | write(script->fd_script, SCRIPT_START_FD, strlen(SCRIPT_START_FD)); 34 | write(script->fd_script, date, strlen(date)); 35 | write(script->fd_script, "\n", 1); 36 | return (EXIT_SUCCESS); 37 | } 38 | -------------------------------------------------------------------------------- /src/open_file.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** open_file.c for open_file.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sun Feb 23 12:22:48 2014 abgral_f 8 | ** Last update Tue Feb 25 17:18:48 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include "my_script.h" 16 | 17 | int open_file(t_script *script) 18 | { 19 | if (script->file_name == NULL) 20 | script->file_name = SCRIPT_NAME; 21 | if (access(script->file_name, F_OK) == 0) 22 | { 23 | if (access(script->file_name, W_OK) == -1) 24 | return (error(ACCESS_ERR, script)); 25 | } 26 | if (script->opt_a == 0) 27 | { 28 | if ((script->fd_script = open(script->file_name, 29 | FLAG_O_OPEN, FLAG_S_OPEN)) == -1) 30 | return (error(OPEN_ERR, script)); 31 | } 32 | else 33 | { 34 | if ((script->fd_script = open(script->file_name, 35 | FLAG_OPT_A, FLAG_S_OPEN)) == -1) 36 | return (error(OPEN_ERR, script)); 37 | } 38 | return (EXIT_SUCCESS); 39 | } 40 | -------------------------------------------------------------------------------- /src/footer.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** footer.c for footer.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sun Feb 23 13:51:42 2014 abgral_f 8 | ** Last update Thu Feb 27 17:28:05 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include "my_script.h" 17 | 18 | int footer(t_script *script) 19 | { 20 | char date[SIZE_DATE]; 21 | time_t timestamp; 22 | 23 | if ((timestamp = time(NULL)) == -1) 24 | return (error(TIME_ERR, script)); 25 | strftime(date, sizeof(date), FORMAT, localtime(×tamp)); 26 | if (script->opt_q == 0) 27 | { 28 | write(1, SCRIPT_DONE, strlen(SCRIPT_DONE)); 29 | write(1, script->file_name, strlen(script->file_name)); 30 | write(1, "\n", 1); 31 | } 32 | write(script->fd_script, "\n", 1); 33 | write(script->fd_script, SCRIPT_DONE_FD, strlen(SCRIPT_DONE_FD)); 34 | write(script->fd_script, date, strlen(date)); 35 | write(script->fd_script, "\n", 1); 36 | return (EXIT_SUCCESS); 37 | } 38 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ## 2 | ## Makefile for Makefile in /home/abgral_f/dev/my_script 3 | ## 4 | ## Made by abgral_f 5 | ## Login 6 | ## 7 | ## Started on Sat Feb 22 23:01:39 2014 abgral_f 8 | ## Last update Tue Feb 25 17:12:07 2014 abgral_f 9 | ## 10 | 11 | CC = gcc 12 | 13 | RM = rm -f 14 | 15 | NAME = my_script 16 | 17 | PATH1 = include/ 18 | 19 | PATH2 = src/ 20 | 21 | SRCS = $(PATH2)main.c \ 22 | $(PATH2)my_script.c \ 23 | $(PATH2)error.c \ 24 | $(PATH2)get_commands.c \ 25 | $(PATH2)set_capabilities.c \ 26 | $(PATH2)select_fd.c \ 27 | $(PATH2)init_select.c \ 28 | $(PATH2)run_script.c \ 29 | $(PATH2)open_file.c \ 30 | $(PATH2)header.c \ 31 | $(PATH2)footer.c \ 32 | $(PATH2)parsing.c \ 33 | $(PATH2)my_forkpty.c \ 34 | $(PATH2)my_openpty.c \ 35 | $(PATH2)my_login_tty.c \ 36 | $(PATH2)my_ptsname.c \ 37 | $(PATH2)my_granpt.c \ 38 | $(PATH2)my_unlockpt.c \ 39 | 40 | OBJS = $(SRCS:.c=.o) 41 | 42 | CFLAGS = -W -Wall -Werror -Wextra -Wshadow -I$(PATH1) 43 | 44 | all: $(NAME) 45 | 46 | $(NAME): $(OBJS) 47 | $(CC) -o $(NAME) $(OBJS) 48 | 49 | clean: 50 | $(RM) $(OBJS) 51 | 52 | fclean: clean 53 | $(RM) $(NAME) 54 | 55 | re: fclean all 56 | -------------------------------------------------------------------------------- /src/parsing.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** parsing.c for parsing.c in /home/abgral_f/dev/my_script/src 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sun Feb 23 15:21:52 2014 abgral_f 8 | ** Last update Fri Feb 28 14:15:03 2014 abgral_f 9 | */ 10 | 11 | #include 12 | #include 13 | #include "my_script.h" 14 | 15 | int usage(char *cmd) 16 | { 17 | write(2, USAGE_ONE, strlen(USAGE_ONE)); 18 | write(2, cmd, strlen(cmd)); 19 | write(2, USAGE_TWO, strlen(USAGE_TWO)); 20 | write(2, USAGE_THREE, strlen(USAGE_THREE)); 21 | write(2, USAGE_FOUR, strlen(USAGE_FOUR)); 22 | write(2, USAGE_FIVE, strlen(USAGE_FIVE)); 23 | return (EXIT_FAILURE); 24 | } 25 | 26 | int opt_c(t_script *script, int *count, char **argv) 27 | { 28 | if (argv[*count + 1] != NULL) 29 | { 30 | script->cmd = argv[*count + 1]; 31 | (*count)++; 32 | } 33 | else 34 | return (usage(argv[*count])); 35 | script->opt_c = 1; 36 | return (EXIT_SUCCESS); 37 | } 38 | 39 | void init_opt(t_script *script) 40 | { 41 | script->opt_a = 0; 42 | script->opt_q = 0; 43 | script->opt_c = 0; 44 | 45 | } 46 | 47 | int check_opt(t_script *script, int *count, char **argv) 48 | { 49 | if (strcmp(argv[*count], OPT_A) == 0) 50 | script->opt_a = 1; 51 | else if (strcmp(argv[*count], OPT_Q) == 0) 52 | script->opt_q = 1; 53 | else if (strcmp(argv[*count], OPT_C) == 0) 54 | { 55 | if (opt_c(script, count, argv) == EXIT_FAILURE) 56 | return (EXIT_FAILURE); 57 | } 58 | else 59 | return (usage(argv[*count])); 60 | return (EXIT_SUCCESS); 61 | } 62 | 63 | int parsing(t_script *script, char **argv) 64 | { 65 | int count; 66 | 67 | init_opt(script); 68 | script->file_name = NULL; 69 | count = 1; 70 | while (argv[count] != NULL) 71 | { 72 | if (argv[count][0] == '-') 73 | { 74 | if (check_opt(script, &count, argv) == EXIT_FAILURE) 75 | return (EXIT_FAILURE); 76 | } 77 | else 78 | { 79 | if (script->file_name == NULL) 80 | script->file_name = argv[count]; 81 | } 82 | count++; 83 | } 84 | return (EXIT_SUCCESS); 85 | } 86 | -------------------------------------------------------------------------------- /include/my_script.h: -------------------------------------------------------------------------------- 1 | /* 2 | ** my_script.h for my_script.h in /home/abgral_f/dev/my_script/include 3 | ** 4 | ** Made by abgral_f 5 | ** Login 6 | ** 7 | ** Started on Sat Feb 22 23:06:35 2014 abgral_f 8 | ** Last update Thu Feb 27 17:52:33 2014 abgral_f 9 | */ 10 | 11 | #ifndef MY_SCRIPT_H_ 12 | # define MY_SCRIPT_H_ 13 | 14 | /* Includes */ 15 | 16 | #include 17 | #include 18 | 19 | /* Defines */ 20 | 21 | #define BOURNE_SHELL "/bin/sh" 22 | 23 | #define PATH "/dev/ptmx" 24 | 25 | #define SHELL_ENV "SHELL" 26 | #define SCRIPT_NAME "typescript" 27 | #define SCRIPT_START_FD "Script started on " 28 | #define SCRIPT_START "Script started, file is " 29 | #define SCRIPT_DONE_FD "Script done on " 30 | #define SCRIPT_DONE "Script done, file is " 31 | 32 | #define OPT_A "-a" 33 | #define OPT_Q "-q" 34 | #define OPT_C "-c" 35 | 36 | #define FORMAT "%a %d %b %Y %I:%M:%S %p %Z" 37 | 38 | #define SIZE_BUFF 1 39 | #define SIZE_DATE 512 40 | 41 | /* Flags */ 42 | 43 | #define FLAG_O_OPEN O_WRONLY | O_CREAT | O_TRUNC 44 | #define FLAG_S_OPEN S_IWUSR | S_IRUSR | S_IROTH | S_IRGRP 45 | #define FLAG_OPT_A O_WRONLY | O_CREAT | O_APPEND 46 | 47 | /* Error */ 48 | 49 | #define USAGE_ONE "script: invalid option '" 50 | #define USAGE_TWO "'\n\nUsage:\n script [options] [file]\n\n" 51 | #define USAGE_THREE "Options:\n\t-a, --append\tappend the output\n" 52 | #define USAGE_FOUR "\t-q, --quiet\tbe quiett\n" 53 | #define USAGE_FIVE "\t-c, --command \tbe quiett\n" 54 | 55 | #define FORKPTY_ERR "script: Error on my_forkpty.\n" 56 | #define SHELL_NAME_ERR "script: Shell name not found on the environnement.\n" 57 | #define IOCTL_ERR "script: Error on ioctl.\n" 58 | #define SELECT_ERR "script: Error on select.\n" 59 | #define READ_ERR "script: Error on read.\n" 60 | #define OPEN_ERR "script: Error on open.\n" 61 | #define ACCESS_ERR "script: Open failed: Permission denied.\n" 62 | #define TIME_ERR "script: Error on time.\n" 63 | 64 | /* Structures */ 65 | 66 | typedef struct s_struct 67 | { 68 | int opt_a; 69 | int opt_q; 70 | int opt_c; 71 | char *cmd; 72 | int fd_script; 73 | int master; 74 | char *file_name; 75 | int set; 76 | struct termios old_cap; 77 | } t_script; 78 | 79 | /* Functions */ 80 | 81 | int error(const char *, t_script *); 82 | int my_script(char **); 83 | int get_commands(t_script *); 84 | int set_capabilities(t_script *); 85 | int fd_select(t_script *, fd_set *); 86 | int init_select(t_script *, fd_set *); 87 | int run_script(t_script *); 88 | int open_file(t_script *); 89 | int header(t_script *); 90 | int footer(t_script *); 91 | int parsing(t_script *, char **); 92 | 93 | /* Pseudo Terminals */ 94 | 95 | pid_t my_forkpty(int *); 96 | int my_openpty(int *, int *); 97 | int my_login_tty(int); 98 | int my_granpt(int); 99 | int my_unlockpt(int); 100 | char *my_ptsname(int); 101 | 102 | 103 | #endif /* MY_SCRIPT */ 104 | -------------------------------------------------------------------------------- /typescript: -------------------------------------------------------------------------------- 1 | Script started on Thu 10 Apr 2014 12:58:20 AM CEST 2 | (abgral_f@pc-abgral_f 1)ls 3 | include Makefile my_script set_capabilities.c src typescript 4 | (abgral_f@pc-abgral_f 2)pwd 5 | /home/abgral_f/rendu/PSU_2013_myscript 6 | (abgral_f@pc-abgral_f 3)htop 7 | [?1049h(B[?7h[?1h=[?25l[?1000h(B 1 (B[0.0%](B Tasks: (B117(B, (B168(B thr; (B1(B running2 (B[0.0%](B Load average: (B0.05 (B0.07 (B0.11 (B3 (B[(B|||||||||||||||(B 46.2%](B Uptime: (B05:41:57(B4 (B[0.0%](BMem(B[(B|||||||||||||||||(B 1454/3912MB](BSwp(B[0/4093MB] (B PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command 15588 abgral_f 20 0 14968 1848 1188 R 23.1 0.0 0:00.08 htop(B1473 (Broot (B 20 0  180M 52(B648 12(B192 S 7.7 1.3 3:43.53 /usr/bin/X -nolis1 (Broot (B 20 0 46(B072  4(B692  2(B152 S 0.0 0.1 0:00.99 /sbin/init showop274 (Broot (B 20 0  288M 9(B940  9(B576 S 0.0 0.2 0:04.63 /usr/lib/systemd/300 (Broot (B 20 0 39(B260  2(B392  1(B196 S 0.0 0.1 0:00.36 /usr/lib/systemd/588 (Broot (B 20 0 17(B104  2(B056  1(B780 S 0.0 0.1 0:00.00 /usr/sbin/bluetoo590 (Bavahi (B 20 0 20(B100  1(B704  1(B452 S 0.0 0.0 0:00.07 avahi-daemon: run608 (Bnscd (B 20 0  781M 1(B660  1(B200 S 0.0 0.0 0:00.06 /usr/sbin/nscd --609 (Bnscd (B 20 0  781M 1(B660  1(B200 S 0.0 0.0 0:00.01 /usr/sbin/nscd --610 (Bnscd (B 20 0  781M 1(B660  1(B200 S 0.0 0.0 0:00.00 /usr/sbin/nscd --611 (Bnscd (B 20 0  781M 1(B660  1(B200 S 0.0 0.0 0:00.00 /usr/sbin/nscd --612 (Bnscd (B 20 0  781M 1(B660  1(B200 S 0.0 0.0 0:00.00 /usr/sbin/nscd --613 (Bnscd (B 20 0  781M 1(B660  1(B200 S 0.0 0.0 0:00.46 /usr/sbin/nscd --614 (Bnscd (B 20 0  781M 1(B660  1(B200 S 0.0 0.0 0:00.46 /usr/sbin/nscd --F1Help (BF2Setup (BF3Search(BF4Filter(BF5Tree (BF6SortBy(BF7Nice -(BF8Nice +(BF9Kill (BF10Quit(B||(B5.3(B||(B3.3(B||(B  6.58(B||(B1.3 (B 1473 root  180M 52648 12192 S 3.3 1.3 3:43.59 /usr/bin/X -nolis(B15474 abgral_f 657M 39(B244 19(B252 S 3.3 1.0 0:00.82python /15588 abgral_f 14(B968  1(B956  1(B284 R (B 2.6 0.012 htop 15564 abgral_f 4(B224 556 472 S 2.6 0.0 0:00.04 ./my_script 11599 abgral_f  956M 77(B080 24(B624 S 2.0 1.9 0:14.51 /opt/google/chrom8280 abgral_f  761M 128M 48(B200 S 1.3 3.3 1:59.09 /opt/google/chrom9491 abgral_f 1016M 134M 25(B728 S 1.3 3.4 1:42.42 /opt/google/chrom11603 abgral_f 956M 77(B080 24(B624 S 1.3 1.970 /opt/google/chrom2185 abgral_f 223M 17(B724 11(B3487 0.4 0:45.28 xfwm4  8311 abgral_f 61M 128M 48(B7 3.3 0:25.32 /opt/google/chrom 1 (Broot(B46(B072  4(B692  2(B152199 /sbin/init showop274 (Broot(B288M 9(B940  9(B5762 0:04.63lib/systemd/300 (Broot(B39(B260  2(B392  1(B19613lib/systemd/588 (Broot(B17(B104  2(B056  1(B78100bluetoo[?12l[?25h[?1000l[?1049l [?1l>(abgral_f@pc-abgral_f 4)quit 8 | If 'quit' is not a typo you can use command-not-found to lookup the package that contains it, like this: 9 | cnf quit 10 | (abgral_f@pc-abgral_f 5)exit 11 | 12 | Script done on Thu 10 Apr 2014 12:58:31 AM CEST 13 | --------------------------------------------------------------------------------