|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T a
Length: 3317 (0xcf5)
Types: TextFile
Names: »account.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec8/mcp/src/account.c«
#include <stdio.h>
#include <sys/types.h>
#include <lastlog.h>
#include "sysdep.h"
#include "macros.h"
#include "mem.h"
#include "sort.h"
#include "lists.h"
#include "account.h"
extern struct list AccountList;
static FILE *acf = NULL;
static addr_t line[LONG_BUF];
static struct account acct;
setacent()
{
if ( !acf ) {
acf = fopen (ACFILE, "r" );
if (!acf) {
perr(ACFILE);
goodbye(1);
}
}
else
rewind( acf );
return;
}
endacent()
{
if ( acf ) {
(void) fclose( acf );
acf = NULL;
}
}
addr
acskip(pp,c)
addr pp;
register c;
{
flexaddr p;
register char *cp;
cp = (char *) pp;
while( *cp && *cp != c && (*cp != ':' || c != ',') )
++cp;
if ( *cp == ':' && c != ':' ) {
*(p.p_cp = cp) = '\0';
return( p.p_ap );
}
if ( *cp ) *cp++ = '\0';
p.p_cp = cp;
return( p.p_ap );
}
struct account *
getacent()
{
flexaddr p, oldp;
register struct list *q;
if (!acf)
setacent();
zerolist(&acct.ac_groups);
zerolist(&acct.ac_classes);
zerolist(&acct.ac_sigs);
#ifdef SENDMAIL
zerolist(&acct.ac_aliases);
#endif
if( !(p.p_cp = fgets( (char *)line, BUFSIZ, acf )) )
return(NULL);
acct.ac_name = p.p_ap;
acct.ac_realname = p.p_ap = acskip(p.p_ap, ':');
acct.ac_id = p.p_ap = acskip(p.p_ap, ':');
p.p_ap = acskip(p.p_ap,':');
acct.ac_uid = atoi(p.p_cp);
p.p_ap = acskip(p.p_ap,':');
acct.ac_gid = atoi(p.p_cp);
(void) acskip(p.p_ap,'\n');
oldp.p_ap = p.p_ap = acskip(p.p_ap,':');
q = &acct.ac_groups;
while( *p.p_cp && *p.p_cp != ':' ) {
oldp.p_ap = p.p_ap;
p.p_ap = acskip(p.p_ap,',');
strlistadd(q, oldp.p_cp);
}
sort_list(q, pstrcmp);
p.p_cp++;
q = &acct.ac_classes;
while( *p.p_cp && *p.p_cp != ':' ) {
oldp.p_ap = p.p_ap;
p.p_ap = acskip(p.p_ap,',');
strlistadd(q, oldp.p_cp);
}
sort_list(q, pstrcmp);
p.p_cp++;
q = &acct.ac_sigs;
while( *p.p_cp && *p.p_cp != ':' ) {
oldp.p_ap = p.p_ap;
p.p_ap = acskip(p.p_ap,',');
strlistadd(q, oldp.p_cp);
}
sort_list(q, pstrcmp);
#ifdef SENDMAIL
p.p_cp++;
q = &acct.ac_aliases;
while( *p.p_cp ) {
oldp.p_ap = p.p_ap;
p.p_ap = acskip(p.p_ap,',');
strlistadd(q, oldp.p_cp);
}
sort_list(q, pstrcmp);
#endif
return &acct;
}
struct account *
getacuid(uid)
int uid;
{
int found, index;
index = search_list(&AccountList, (char *)&uid, iacctcmp, &found);
if (found)
return (struct account *) AccountList.l_list[index];
return (struct account *) 0;
}
struct account *
getacid(id)
char *id;
{
int indx;
struct account *a;
for (indx=0; indx < AccountList.l_count; indx++) {
a = (struct account *) AccountList.l_list[indx];
if (eq(a->ac_id, id))
return a;
}
return (struct account *) 0;
}
struct account *
getacnam(name)
char *name;
{
struct account *a;
register int indx;
if (!userexists(name))
return (struct account *) 0;
for (indx=0; indx < AccountList.l_count; indx++) {
a = (struct account *) AccountList.l_list[indx];
if (eq(a->ac_name, name))
return a;
}
return (struct account *) 0;
}
/*
* Do a simply format check of the accounts file.
*/
int
acck()
{
FILE *f;
char b[BUFSIZ];
f = fopen(ACFILE, "r");
if (f == NULL) {
err1("can't open %s (read)", ACFILE);
return 0;
}
while (fgets(b, BUFSIZ, f) != NULL) {
if (coloncount(b) != 8) {
err1("%s: badly formed line", ACFILE);
return 0;
}
}
(void) fclose(f);
return 1;
}