/************************************************************************/
/*	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;
    FILE *tfile;
    int iuid;

    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);
	}

    if( (tfile=popen("sort -u > /tmp/udfile","w")) == NULL )
	{
	perror("sort");
	exit(1);
	}
    for( key=dbm_firstkey(used); key.dptr; key=dbm_nextkey(used) )
	fprintf(tfile,"%d\n",(short*)key.dptr);
    fclose( tfile );
    if( (tfile=fopen("/tmp/udfile","r")) == NULL )
	{
	perror("/tmp/udfile");
	exit(1);
	}
    while( scanf("%d",&iuid) == 1 )
	{
	uid = iuid;
	key.dptr = (char*)&uid;
	key.dsize = sizeof(uid_t);
	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;
    }
