#include<stdio.h>
#include<ndbm.h>
#include<string.h>
#include<sys/file.h>
#include<sys/errno.h>
#include<sys/types.h>

#include "inquir.h"

extern char *sys_errlist[];
extern int errno;

main()
    {
    int uidfile;
    uid_t uid;
    DBM *used;
    datum uidkey, val;


    setup_strings();

    if ((uidfile = open(Uidfile, O_RDWR, 777)) == -1) 
	{
	fprintf(stderr,"uidfile '%s' has gone bad:  %s\n",
	    Uidfile,sys_errlist[errno]);
	exit(-1);
	}

    alarm(60);  /* Wait one minute for a flock, then give up */

    if ((flock(uidfile, LOCK_EX) == -1))
	{
	fprintf(stderr,"flock(%s) failed:  %s\n",Uidfile,sys_errlist[errno]);
	exit(1);
	}

    alarm(0);  /* We have the lock, let's not panic anymore */

    if (read(uidfile, (char *) &uid, sizeof(uid_t)) == -1)
	{
	fprintf(stderr,"uidfile '%s' has gone bad:  %s\n",
	    Uidfile,sys_errlist[errno]); 
	exit(-1);
	}

    printf("%d\n",uid);

    if ((used = dbm_open(Uiddbase, O_RDONLY, 0664)) == NULL)
	{
	fprintf(stderr,"The dbase of used UIDs '%s' has gone bad: %s.\n",
	    Uiddbase, sys_errlist[errno]);
	exit(-1);
	}

    uidkey.dptr = (char *) &uid;
    uidkey.dsize = sizeof(uid_t);

    do	{
	uid++;
	if (!uid || (uid > MAXUID)) uid = MINUID;
	val = dbm_fetch(used,uidkey);
	} while (val.dptr);

    dbm_close(used);

    if (lseek(uidfile, (off_t) 0, L_SET) == -1) 
	{
	fprintf(stderr,"uidfile '%s' won't seek:  %s\n",
	    Uidfile,sys_errlist[errno]);
	exit (-2);
	}

    if (write(uidfile, (char *) &uid, sizeof(uid_t)) == -1)
	{
	fprintf(stderr,"Writing the uidfile '%s' is failing: %s\n",
	    Uidfile, sys_errlist[errno]);
	exit(-2);
	}

    if (flock(uidfile, LOCK_UN) == -1)
	{
	fprintf(stderr,"flock(%s) is failing:  %s\n",
	    Uidfile,sys_errlist[errno]);
	exit(1);
	}

    if (close(uidfile) == -1)
	{
	fprintf(stderr,"close(%s) is failing:  %s\n",
	    Uidfile,sys_errlist[errno]);
	exit(1);
	}

    return(0);
    }
