/************************************************************************/
/*	uiddbase_cvt.c							*/
/*	Routines to convert to and from uid binary database to ascii.	*/
/*	Mainline is in cvt.c						*/
/************************************************************************/

#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 int errno;
extern char *sys_errlist[];

makeascii( filename )	char *filename;
    {
    uid_t uid;
    char name[255];
    DBM *used;
    datum key, datump;

    if( filename == NULL ) filename = Uiddbase;

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

    for( key=dbm_firstkey(used); key.dptr; key=dbm_nextkey(used) )
	{
	printf("%d\n",*(short*)key.dptr);
	datump = dbm_fetch(used,key);
	printf("%.*s\n",datump.dsize,datump.dptr);
	}
    dbm_close(used);
    return(0);
    }

makedb( filename )	char *filename;
    {
    uid_t uid;
    char name[255];
    DBM *used;
    datum uidkey, val, datump;
    char uidbuf[2048];

    if( filename == NULL ) filename = Uiddbase;

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

    while ( gets( uidbuf ) )
	{
	uid = atoi(uidbuf);
	uidkey.dptr = (char *) &uid;
	uidkey.dsize = sizeof(uid_t);
	if( gets( name ) == NULL ) break;
	val.dsize = strlen(name);
	val.dptr = name;
	datump = dbm_fetch( used, uidkey );
	if( datump.dptr != NULL )
	    fprintf(stderr,"Uid %s(%d) conflicts with %.*s!\n",
		name, uid, datump.dsize, datump.dptr );
	else if (dbm_store(used, uidkey, val, DBM_REPLACE) < 0)
	    {
	    perror("dbm_store");
	    exit(1);
	    }
	}
    dbm_close(used);
    return 0;
    }
