shortspecialbus icon

main.c

shortspecialbus | PRO | 05/19/21 08:45:46 PM UTC | 0 ⭐ | 1163 👁️ | Never ⏰ | []
C |

2.31 KB

|

None

|

0 👍

/

0 👎

/*
 * cs537 Project 1 - Shell
 *
 * Written by Stefan Strandberg ([email protected])
 * $Id: main.c,v 1.8 2004/09/23 22:00:27 stefan Exp $
 *
 */
 
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include "shell.h"
#include "job.h"
 
/*
 * TODO:
 * 
 * Fix horrible memory leaks...they're better than they were, but they're still
 * there.
 *
 * Figure out why the heck my waitpid keeps getting -1.  Maybe I'm reaping
 * Wrong or something.  Meh.
 *
 */
 
int main(int argc, char *argv[]) {
    
    
    int should_exit = 0;
    int interactive = 1;
    int jobnum = 1;
    int c;
    FILE *fp = NULL;
    FILE *inbuffer = stdin;
    action_t action;
    int status;
 
    // turn off friggen buffering...it ruins our day!!
    setbuf(stdout, NULL);
    switch (argc) {
        case 1:
            break;
        case 2:
            fp = fopen(argv[1], "r");
            if (fp == NULL) {
                fprintf(stderr, "Error: unable to open file %s\n", argv[1]);
                return 1;
            }
            interactive = 0;
            inbuffer = fp;
            break;
        default:
            fprintf(stderr, "Invalid number of command line arguments: %i\n",
                    (argc - 1));
            return 1;
    }
    shell_t *turtle_shell = create_shell();
    job_t *jobs[MAX_JOBS]; // we aren't freeing these...memory leak!!
 
    while(!should_exit) {
        jobs[jobnum - 1] = malloc(sizeof(job_t));
        if((jobs[jobnum - 1]) == NULL) {
            fprintf(stderr, "Unable to malloc() a job in main()!!\n");
            exit(1);
        }
        action = run_shell(turtle_shell, interactive, &jobnum, jobs[jobnum - 1],
                         inbuffer);
        switch (action) {
            case WAITERROR:
                fprintf(stderr, "Invalid jid\n");
                break;
            case EXITVAL:
                should_exit = 1;
                break;
            case JOBVAL:
                do_jobcmd(jobs, jobnum);
                break;
            case NORMAL:
                break; // nothing, just run our loop again
            case CHILDEXIT:
                exit(1);
            default:
                if (action < (jobnum))  
                    do_waitcmd(jobs[action - 1]);
                
                else 
                    printf("Invalid jid %d\n", action);
                
        }
 
        // reap our children here i guess.  we're doing a lot of dumb
        // algorithms in this program (with reaping and the "j" command and
        // such, but I'm sleepy and I haven't gotten any sleep in forever.
        // this bad algorithm reaps zombies every command
        for (c = 0 ; c < jobnum - 1 ; c++)
            waitpid(jobs[c]->pid, &status, WNOHANG);
    }
    if (argc > 1)
        fclose(fp);
    for (c = 0 ; c < jobnum - 1; c++) {
        remove_job(jobs[c]);
    }
    return 0;
}
 

Comments