#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <err.h>
#include <sys/wait.h>

int
main(int argc, char *argv[])
{
    int fd, flags;
    char template[] = "/tmp/testXXXXXX";

    setbuf(stdout, NULL);       /* Disable buffering of stdout */

    fd = mkstemp(template);
    if (fd == -1)
        err(EXIT_FAILURE, "mkstemp");

    printf("File offset before fork(): %lld\n",
            (long long) lseek(fd, 0, SEEK_CUR));

    flags = fcntl(fd, F_GETFL);
    if (flags == -1)
        err(EXIT_FAILURE, "fcntl - F_GETFL");

    printf("O_APPEND flag before fork() is: %s\n",
            (flags & O_APPEND) ? "on" : "off");

    switch (fork()) {
    case -1:
        err(EXIT_FAILURE, "fork");

    case 0:
        if (lseek(fd, 1000, SEEK_SET) == -1)
            err(EXIT_FAILURE, "lseek - child");

        flags = fcntl(fd, F_GETFL);
        if (flags == -1)
            err(EXIT_FAILURE, "fcntl - F_GETFL");

        flags |= O_APPEND;      // turn O_APPEND on
        if (fcntl(fd, F_SETFL, flags) == -1)
            err(EXIT_FAILURE, "fcntl - F_SETFL");
        _exit(EXIT_SUCCESS);

    default:
        if (wait(NULL) == -1)
            err(EXIT_FAILURE, "wait");
        printf("child has exited\n");

        printf("File offset in parent: %lld\n",
                (long long) lseek(fd, 0, SEEK_CUR));

        flags = fcntl(fd, F_GETFL);
        if (flags == -1)
            err(EXIT_FAILURE, "fcntl - F_GETFL");
        printf("O_APPEND flag in parent is: %s\n",
                (flags & O_APPEND) ? "on" : "off");
        exit(EXIT_SUCCESS);
    }
}
