#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <dos.h>
#include <filedefs.h>

#include <exec/exec.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>


void
main (int argc, char **argv)
{
  FILE *fn, *idxfile;
  BPTR fo;
  unsigned char username[256], usernumber[256], buffer[256];
  unsigned char size = 0, i1 = 0, i2 = 0, i3 = 0, random = 0;
  unsigned char *p = NULL;
  unsigned char count = 0;
  unsigned short check = 0;
  unsigned int serialnumber;

  memset (username, 0, sizeof (username));
  memset (usernumber, 0, sizeof (usernumber));

  printf ("  -- GNetgrabber key maker --  \n");

  if ((fo = Open ("GNetGrabber.key", MODE_NEWFILE)))
    {
      printf ("\n\aEnter user name (max 256 chars): ");
      gets (username);

      // read serial number from "sernum.txt" file
      if ((fn = fopen ("sernum.txt", "r")))
        {
          fgets (usernumber, 256, fn);

          username[strlen (username) + 1] = '\0';
          usernumber[strlen (usernumber)] = '\0';

          serialnumber = atoi (usernumber) + 1;

          sprintf (usernumber, "%d", serialnumber);

          fclose (fn);
        }

      if ((fn = fopen ("sernum.txt", "w")))
        {
          fputs (usernumber, fn);
          fclose (fn);
        }

      if ((idxfile = fopen ("registered_users.idx", "a")))
        {
          printf ("User: %s\n", buffer);
          fprintf (idxfile, "User: %s\n", buffer);

          printf ("SerialNumber: %s\n", usernumber);
          fprintf (idxfile, "SerialNumber: %s\n", usernumber);

          printf ("Address#1: ");
          gets (buffer);
          fprintf (idxfile, "Address#1: %s\n", buffer);

          printf ("Address#2: ");
          gets (buffer);
          fprintf (idxfile, "Address#2: %s\n", buffer);

          printf ("Address#3: ");
          gets (buffer);
          fprintf (idxfile, "Address#3: %s\n", buffer);

          printf ("tel.: ");
          gets (buffer);
          fprintf (idxfile, "Tel.: %s\n", buffer);

          printf ("e-mail: ");
          gets (buffer);
          fprintf (idxfile, "e-mail: %s\n\n\n", buffer);

          fclose (idxfile);
        }



      i1 = size = strlen (username);
      size += 37;
      size ^= ~0;
      Write (fo, &size, sizeof (char));

      // Here I'd insert random data
      srand (time (NULL));
      random = (char) rand ();
      i3 = size = random;
      Write (fo, &size, sizeof (char));

      printf ("Random data: %d\n", (ULONG) i3);


      i2 = size = strlen (usernumber);
      size += 46;
      size ^= ~0;
      Write (fo, &size, sizeof (char));

      count = (char) i1 + i2;

      for (p = username; *p != '\0'; p++)
        {
          check += *p;
          *p ^= ~0;
          *p += count-- + *(p + 1);
        }

      for (p = usernumber; *p != '\0'; p++)
        {
          check += *p;
          *p ^= ~0;
          *p += count-- + *(p + 1);
        }

      Write (fo, username, i1);
      // save random data
      {
        char *randata;
        if ((randata = (char *) AllocVec (i3, MEMF_PUBLIC)))
          {
            size = i3;

            for (; i3 > 0; i3--)
              {
                srand (time (NULL) + rand ());
                randata[i3] = (char) rand ();
              }

            srand (time (NULL) + rand ());
            randata[0] = (char) rand ();

            Write (fo, randata, size);
            FreeVec (randata);
          }
        else
          printf ("Memory out!!!\n");

      }

      Write (fo, usernumber, i2);
      Write (fo, &check, sizeof (unsigned short));
    }

  Close (fo);
}

