#include <stdio.h>
#include <signal.h>
#include <pwd.h>
#include "nfs_prot.h"
#include "mp.h"
#include "version.h"
#include "config.h"

extern void nfs_program_2();

static char
  *dev  = DDEV,
  *user = DUSER,
  *dir  = DDIR;
static int
  speed = DSPEED;

int psionfd, gmtoffset, debug, exiting, psion_alive, dowakeup = 0;
fattr root_fattr = {NFDIR,0040500,1,0,0,BLOCKSIZE,BLOCKSIZE,FID,1,FID,1,0,0,0};
char *disconnprog, *connprog;
struct cache *readcache, *writecache, *attrcache;

void
usr1_handler()
{
  debug = (debug+1) & 3;
}

#ifdef hpux
void
usleep(usec)
int usec;
{
  struct timeval t;

  t.tv_sec = (long) (usec / 1000000);
  t.tv_usec= (long) (usec % 1000000);
  select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t);
}
#endif /* hpux */

void
main(ac, av)
  int ac;
  char *av[];
{
  struct passwd *pw;
  struct timeval tv;
  struct timezone tz;
  p_inode *rp;
  nfs_fh root_fh;

  while(ac > 1)
    {
      if(!strcmp(av[1], "-v"))
	{
	  debug++;
	}
      else if(!strcmp(av[1], "-dir"))
	{
	  dir = av[2]; ac--;av++;
	}
      else if(!strcmp(av[1], "-user") || !strcmp(av[1], "-u"))
	{
	  user = av[2]; ac--;av++;
	}
      else if(!strcmp(av[1], "-conn"))
	{
	  connprog = av[2]; ac--; av++;
	}
      else if(!strcmp(av[1], "-disconn"))
	{
	  disconnprog = av[2]; ac--; av++;
	}
      else if(!strcmp(av[1], "-wakeup"))
	{
	  dowakeup = 1;
	}
      else if(!strcmp(av[1], "-tty"))
	{
	  dev = av[2]; ac--;av++;
	}
      else if (!strcmp(av[1], "-speed"))
        {
	  speed = atoi(av[2]);
	  ac--; av++;
	}
      else
	{
	  printf("Usage: p3nfsd [-dir directory] [-user username] [-tty ser-dev] [-speed baudrate]\n");
	  printf("              [-conn prog] [-disconn prog] [-wakeup] [-v]\n");
	  printf("Defaults: -dir %s -user %s -tty %s -speed %d\n", DDIR, DUSER, DDEV, DSPEED);
	  exit(1);
	}
      ac--;av++;
    }
  
  if(!(pw = getpwnam(user)))
    {
      printf("User %s not found\n", user);
      exit(1);
    }
  root_fattr.uid = pw->pw_uid;
  root_fattr.gid = pw->pw_gid;
  endpwent();

  printf("p3nfsd: version %s, using %s (%d), mounting on %s\n", VERSION, dev, speed, dir);
  psionfd = init_serial(dev, speed, 0 /* flag XON/XOFF handshake here */);

  gettimeofday(&tv, &tz);
  gmtoffset = -tz.tz_minuteswest * 60;

  rp = get_nam("");
  inode2fh(rp->inode, root_fh.data);
  root_fattr.fileid = rp->inode;
  root_fattr.atime.seconds = root_fattr.mtime.seconds = 
  root_fattr.ctime.seconds = tv.tv_sec;

  signal(SIGUSR1, usr1_handler);

  mount_and_run(dir, nfs_program_2, &root_fh);
  exit(0);
}
