#include <stdio.h>
#include <sys/times.h>
#include <sys/types.h>
#include <time.h>
#include <getopt.h>
#include <stdarg.h>
#include <syslog.h>
#include <errno.h>
#include <linux/errno.h>
#include <fcntl.h>

#define MAXLINE 4096

double get_seconds() { /* routine to read time */
  struct timeval t[1];
  gettimeofday (t, NULL);
  return t->tv_sec * 1000 + t->tv_usec / 1000;
}

void err_doit (int errnoflag, int level, const char *fmt, va_list ap)
{
  int errno_save, n;
  char buf[MAXLINE];

  errno_save = errno;             /* value caller might want printed */
  vsnprintf (buf, sizeof(buf), fmt, ap);
  n = strlen (buf);
  if (errnoflag)
    snprintf (buf+n, sizeof(buf) - n, ": %s", strerror(errno_save));
  strcat (buf, "\n");

  fflush (stdout);
  fputs (buf, stderr);
  fflush (stderr);
}

void err_quit (char *fmt, ...)
{
  va_list ap;
  va_start (ap, fmt);
  err_doit (0, LOG_ERR, fmt, ap);
  va_end(ap);
  exit(1);
}

void err_sys (char *fmt, ...)
{
  va_list ap;
  va_start (ap, fmt);
  err_doit (1, LOG_ERR, fmt, ap);
  va_end(ap);
  exit(1);
}

int main(int argc, char *argv[]) {
  int n, i, c;
  double t1, t2, t3;
  int osync = 0;
  int buff_size = 1024;
  int num_writes = 1;
  int file_size;
  char *buffer;
  int fd;
  char *filename = "output.dat";
  
  opterr = 0;
  while ( (c = getopt (argc, argv, "sb:w:")) != -1) {
    switch (c) {
    case 's':
      osync = 1;
      break;
    case 'b':
      if ( (buff_size = atoi(optarg)) < 1) {
	err_quit ("invalid -b value (min_ttl)");
      }
      break;
    case 'w':
      if ( (num_writes = atoi(optarg)) < 1) {
	err_quit ("invalid -w value (min_ttl)");
      }
      break;
    }
  }
  buffer = (char *) malloc (buff_size);
  for (i=0; i<buff_size; i++) {
    buffer[i] = i;
  }
  t1 = get_seconds();
  file_size = buff_size * num_writes;

  fd = open(filename, O_WRONLY | O_CREAT);
  for (i=0; i<num_writes; i++) {
    n = write(fd, buffer, buff_size);
    if (n != buff_size) {
      err_sys ("write failed");
    }
  }
  close(fd);
  return 0;
}


