*** 3000shell.c 2021-01-22 00:57:39.000000000 -0500 --- 3000shell-pipe.c 2025-02-22 20:02:17.463704228 -0500 *************** *** 27,32 **** --- 27,34 ---- #define COMM_SIZE 32 const char *proc_prefix = "/proc"; + int pipeline = 0; + void parse_args(char *buffer, char** args, size_t args_size, size_t *nargs) *************** *** 249,258 **** } } void prompt_loop(char *username, char *path, char *envp[]) { char buffer[BUFFER_SIZE]; ! char *args[ARR_SIZE]; int background; size_t nargs; --- 251,297 ---- } } + void run_programs(char *args1, char *args2, char *path, char *envp[]) + { + pid_t pid1, pid2; + int pipefd[2], *ret_status = NULL; + char buffer[BUFFER_SIZE]; + FILE *a, *b; + char c; + + a = popen(args1, "r"); + b = popen(args2, "w"); + + printf("a=%s\n", args1); + printf("b=%s\n", args2); + + while ((c = fgetc(a)) != EOF) + { + fputc(c, b); + } + + pclose(a); + pclose(b); + + } + + char **split_pipeline(char *buffer) + { + static char *stages[2]; + if ((strchr(buffer, '|') != strrchr(buffer, '|')) || (NULL == strchr(buffer, '|'))) + return NULL; + char *buffer2 = strdup(buffer); + stages[0] = strtok(buffer2, "|"); + stages[1] = strtok(NULL, "|"); + pipeline = 1; + return stages; + } + void prompt_loop(char *username, char *path, char *envp[]) { char buffer[BUFFER_SIZE]; ! char backup[BUFFER_SIZE]; ! char *args[ARR_SIZE], *args2[ARR_SIZE]; int background; size_t nargs; *************** *** 269,276 **** printf("\n"); exit(0); } ! ! parse_args(buffer, args, ARR_SIZE, &nargs); if (nargs==0) continue; --- 308,324 ---- printf("\n"); exit(0); } ! ! pipeline = 0; ! ! char **l = split_pipeline(buffer); ! if (l != NULL){ ! printf("stage1=%s\n", l[0]); ! printf("stage2=%s\n", l[1]); ! strcpy(backup, l[0]); ! } ! ! parse_args(l==NULL?buffer:l[0], args, ARR_SIZE, &nargs); if (nargs==0) continue; *************** *** 304,311 **** break; } } ! ! run_program(args, background, stdout_fn, path, envp); } } --- 352,363 ---- break; } } ! ! if (pipeline) { ! run_programs(backup, l[1], path, envp); ! } ! else ! run_program(args, background, stdout_fn, path, envp); } }