// Test that fork fails gracefully.
// Tiny executable so that the limit can be filling the proc table.

#include "types.h"
#include "stat.h"
#include "user.h"

#define N  1000

void printf(int fd, const char *s, ...)  {
    write(fd, s, strlen(s));
}

void forktest(void)      {
    int n, pid;

    printf(1, "fork test\n");

    for (n = 0; n < N; n++) {
        pid = fork();
        if (pid < 0) {
            break;
        }
        if (pid == 0) {
            exit();
        }
    }

    if (n == N) {
        printf(1, "fork claimed to work N times!\n", N);
        exit();
    }

    for (; n > 0; n--) {
        if (wait() < 0) {
            printf(1, "wait stopped early\n");
            exit();
        }
    }

    if (wait() != -1) {
        printf(1, "wait got too many\n");
        exit();
    }

    printf(1, "fork test OK\n");
}

int main(int argc, char* argv[])     {
    forktest();
    exit();
}