/*
 * doit.c: Quick hack to play a sequence of GIF files.
 * 
 * Rob McCool
 *
 * This code is released into the public domain.  Do whatever 
 * you want with it.
 *
 * OK, I will...Ken Steube/SDSC
 *
 */

#include <sys/types.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>

char *images[] = {
	"Images/me.0.gif",
	"Images/me.1.gif",
	"Images/me.2.gif",
	"Images/me.3.gif",
	"Images/me.4.gif",
	"Images/me.5.gif",
	"Images/me.6.gif",
	"Images/me.7.gif",
	"Images/me.8.gif",
	"Images/me.9.gif",
	NULL };

#define HEADER \
"Content-type: multipart/x-mixed-replace;boundary=ThisRandomString\n" \

#define RANDOMSTRING "\n--ThisRandomString\n"
#define ENDSTRING    "\n--ThisRandomString--\n"
#define CTSTRING     "Content-type: image/gif\n\n"

int
main(argc, argv)
int argc;
char *argv[];
{
    struct stat fi;
    caddr_t fp;
    int fd, i = 0;

    if(write(STDOUT_FILENO, HEADER, strlen(HEADER)) == -1)
        exit(0);
    if(write(STDOUT_FILENO, RANDOMSTRING, strlen(RANDOMSTRING)) == -1)
        exit(0);

    while (images[i]) {
        if(write(STDOUT_FILENO, CTSTRING, strlen(CTSTRING)) == -1)
            exit(0);
        if( (fd = open(images[i], O_RDONLY)) == -1)
            continue;
        fstat(fd, &fi);
        fp = mmap(NULL, fi.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
        if(fp == (caddr_t) -1)
            exit(0);
        if(write(STDOUT_FILENO, (void *) fp, fi.st_size) == -1)
            exit(0);
        munmap(fp, fi.st_size);
        close(fd);
        if(write(STDOUT_FILENO, RANDOMSTRING, strlen(RANDOMSTRING)) == -1)
            exit(0);
	i++;
	sleep(2);
    }

    exit (0);
}
