#include <errno.h>
#include <fcntl.h>
#include <newt.h>
#include <string.h>
#include <unistd.h>

#include "fs.h"
#include "install.h"
#include "kernel.h"
#include "log.h"
#include "windows.h"

static int copyFile(char * sourceName, char * destName) {
    int source, dest, i;
    char buf[16384];
    int olderrno;

    logMessage("coping %s to %s\n", sourceName, destName);

    source = open(sourceName, O_RDONLY);
    if (source < 0) {
	logMessage("file %s missing from source directory",
		    sourceName);
	messageWindow("Error", "file %s missing from source directory",
		    sourceName);
	return INST_ERROR;
    }

    dest = creat(destName, 0644);
    if (dest < 0) {
	logMessage("failed to create file %s", destName);
	messageWindow("Error", "failed to create file %s", destName);
	close(source);
	return INST_ERROR;
    }

    while ((i = read(source, buf, sizeof(buf))) > 0) {
	if (write(dest, buf, i) != i) {
	    olderrno = errno;

	    logMessage("error writing to file %s: %s",
		       destName, strerror(olderrno));
	    messageWindow("Error", "error writing to file %s: %s",
		       destName, strerror(olderrno));

	    close(source);
	    close(dest);
	    unlink(destName);
	    return 1;
	}
    }

    if (i < 0) {
	olderrno = errno;

	logMessage("error reading from file %s: %s", sourceName, 
			strerror(olderrno));
	messageWindow("Error", "error reading from file %s: %s", sourceName, 
			strerror(olderrno));
    }

    close(source);
    close(dest);
    
    if (i < 0)
	return 1;

    return 0;
}

int kernelCopy(char * filename) {
    int rc = 0;

    if (!filename) {
	messageWindow("Kernel", "Please insert your boot disk "
			"first disk drive if it's not already present.");
	if (doMount("fd0", "/tmp/bootdisk", "ext2", 1))
	    return INST_ERROR;

	winStatus(34, 3, "Kernel", "Copying kernel from floppy...");
	rc = copyFile("/tmp/bootdisk/vmlinux.gz", "/mnt/vmlinux.gz");
	sync();
	newtPopWindow();
    } else {
	winStatus(34, 3, "Kernel", "Copying kernel from floppy...");
	rc = copyFile(filename, "/mnt/vmlinux.gz");
	sync();
	newtPopWindow();
    }

    return rc;
}
