/*
 * shred.c programmed by sparky4. Licence MIT.
 */
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <fcntl.h>
#include <time.h>
#include <sys/stat.h>

#define BUFFSIZE 512
//#define DEBUG

int shredder(const char *filename, int flag, unsigned int loop) {
  int handle;
  long file_size;
  long bytes_written;
  char buffer[BUFFSIZE];
  int i,to_write;
  unsigned int j;

  // Open in Read/Write binary mode
  handle = open(filename, O_RDWR | O_BINARY);
  if (handle == -1) {
    perror("Error opening file");
    return(-1);
  }

  // Get file size
  file_size = filelength(handle);
  if (file_size == -1L) {
    perror("Error getting file size");
    close(handle);
    return(-2);
  }

  for (j = 0; j < loop; j++) {
    switch(flag) {
      default:
        // Initialize PRNG
        if (j == 0) srand((unsigned)time(NULL));

#ifdef DEBUG
        printf("Overwriting with random data...\n");
#endif
        bytes_written = 0;
        lseek(handle, 0L, SEEK_SET);
        while (bytes_written < file_size) {
          to_write = (int)((file_size - bytes_written < BUFFSIZE) ? file_size - bytes_written : BUFFSIZE);
          for(i = 0; i < to_write; i++) {
            buffer[i] = (char)(rand() % 256);
          }
          write(handle, buffer, to_write);
          bytes_written += to_write;
        }
      break;
      case 1:
#ifdef DEBUG
        printf("Overwriting with zeros...\n");
#endif
        bytes_written = 0;
        lseek(handle, 0L, SEEK_SET);
        for (i = 0; i < BUFFSIZE; i++) buffer[i] = 0;
        while (bytes_written < file_size) {
          to_write = (int)((file_size - bytes_written < BUFFSIZE) ? file_size - bytes_written : BUFFSIZE);
          write(handle, buffer, to_write);
          bytes_written += to_write;
        }
      break;
    }
  }
  close(handle);
  return(0);
}


int main(int argc, char *argv[]) {
  int i,flag,loop,filefound;
  char *filename;
  int res;

  if (argc <= 1) {
    printf("Usage: %s [/0 /r /l<number>] <filename> [/0 /r /l<number>]\n", argv[0]);
    return 1;
  }
  flag = 0; loop = 1; filefound = 0;

  // sparky4 important to set the i = 1 because argv[0] is the program name lol
  for (i = 1; i < argc; i++) {
    if (argv[i][0] == '/') {
      switch (argv[i][1]) {
        case '0': // sparky4: 0's
          flag = 1;
        break;
        case 'l': // sparky4: do it this many times
          loop = argv[i][2];
        break;
//        case 'r': // sparky4: random data
        default: // sparky4: random data
          flag = 0;
        break;
      }
    } else {
#ifdef DEBUG
      printf("filefound == %d\n", filefound);
#endif
      switch (filefound) {
        case 0:
          filename = argv[i];
          filefound++;
        break;
        case 2:
          printf("Shred one file at a time please.\n");
          printf("Usage: %s [/0 /r /l<number>] <filename> [/0 /r /l<number>]\n", argv[0]);
          return 1;
        break;
      }
    }
#ifdef DEBUG
    printf("%s\n", argv[i]);
#endif
  }

  // sparky4: GRIND THIS FILE!
  res = shredder(filename, flag, loop);

  return(res);
}
