#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 in your first "
                       "disk drive if it's not already present.");
       if (doMount("fd0", "/tmp/bootdisk", "ext2", 1, 0))
           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;
}