int cmp_addjob(int sock,struct tx_struct *data) { int ret; char job_name[400]; if (cmpstr_min(data->id,"gpvdmaddjob")==0) { sprintf(job_name,"job%d",njobs); jobs_add(job_name,data->target); jobs_print(); return 0; } return -1; }
int main() { struct jobs_ls *jobs = NULL; printf("Variante %d: %s\n", VARIANTE, VARIANTE_STRING); while (1) { struct cmdline *l; char *prompt = "ensishell>"; l = readcmd(prompt); /* If input stream closed, normal termination */ if (!l) { printf("exit\n"); exit(EXIT_SUCCESS); } if (l->err) { /* Syntax error, read another command */ printf("error: %s\n", l->err); continue; } /*print_cmd(l);*/ get_finish_jobs(&jobs); // execute command if (l->seq[0] != 0) { // jobs if (!strcmp(l->seq[0][0], "jobs")) { jobs_print(jobs); } // exit if (!strcmp(l->seq[0][0], "exit")) { printf("exit\n"); exit(EXIT_SUCCESS); } // other commands else { int nb_cmd; for(nb_cmd = 0; l->seq[nb_cmd] != 0; nb_cmd++) { ;} int last_pipe[2] = {0,1}; pid_t pid; for(int i = 0; i < nb_cmd; i++) { int crnt_pipe[2]; if (i < nb_cmd - 1) { pipe(crnt_pipe); } pid = fork(); if (!pid) { if ((l->in) && (i == 0)) { freopen(l->in, "r", stdin); } if ((l->out) && (i == nb_cmd -1)) { freopen(l->out, "w", stdout); } if (i < nb_cmd -1) { dup2(crnt_pipe[1], 1); close(crnt_pipe[0]); close(crnt_pipe[1]); } if (i > 0) { dup2(last_pipe[0], 0); close(last_pipe[1]); close(last_pipe[0]); close(crnt_pipe[1]); close(crnt_pipe[0]); } char **cmd = l->seq[i]; if (l->seq[i][1] != 0) { // expand jockers glob_t globbuf; int flags = GLOB_DOOFFS | GLOB_NOCHECK | GLOB_MARK | GLOB_BRACE | GLOB_TILDE; globbuf.gl_offs = 1; glob(l->seq[i][1], flags, NULL, &globbuf); for(int j = 2; l->seq[i][j] != 0; j++) { fprintf(stderr, "%s\n", l->seq[i][j]); glob(l->seq[i][j], flags | GLOB_APPEND, NULL, &globbuf); } globbuf.gl_pathv[0] = l->seq[i][0]; cmd = globbuf.gl_pathv; } int err; err = execvp(l->seq[i][0], cmd); fprintf(stderr, "error %d\n", err); exit(EXIT_FAILURE); } if (pid < 0) { perror("Cannot fork\n"); } if (i > 0) { close(last_pipe[1]); close(last_pipe[0]); } last_pipe[0] = crnt_pipe[0]; last_pipe[1] = crnt_pipe[1]; } if (nb_cmd > 1) { close(last_pipe[1]); close(last_pipe[0]); } father(l->seq[0], l->bg, &jobs, pid); } } } }
void builtin_jobs () { jobs_print(STOPPED | RUNNING, false); }