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;
}
Beispiel #2
0
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);
            }
        }
    }
}
Beispiel #3
0
void builtin_jobs () {
    jobs_print(STOPPED | RUNNING, false);
}