|
|
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 l
Length: 5373 (0x14fd)
Types: TextFile
Names: »list.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec8/untamo/list.c«
#ifdef PUCC
#include <sys/types.h>
#include <rld.h>
#endif PUCC
#include <sys/file.h>
#include "untamo.h"
#include "y.tab.h"
extern char *malloc(), *strcpy(), *ctime();
extern strlen();
time_t time();
long lseek();
/*
* addlist -- adds a record to the list "list". Uses the
* insque(3) call for speed.
* list -- which list to add the rule to (rules or exempt)
* type -- what kind of rule (LOGIN, GROUP, etc)
* name -- who it applies to (ajw, console, etc)
* num -- who it applies to (1505 (rld), 5 (group staff) )
* flag -- idle time for a "rule" rule, or exemption type
* for "exempt" rule: IDLE, MULTIPLE, etc.
*/
addlist(list, type, name, num, flag)
struct qelem *list;
char *name;
int type, flag, num;
{
struct qelem *new_node;
struct qelem *ptr;
struct item *new_data;
/*
* make all the new structures
*/
new_node = (struct qelem *) malloc( sizeof(struct qelem) );
new_data = (struct item *) malloc( sizeof(struct item ) );
new_data->name_t = type;
new_data->name = name;
new_data->num = num;
new_data->flag = flag;
new_node->q_item = new_data;
/*
* find where to insert it in the list
*/
ptr = list->q_forw;
while (ptr != list) {
if (ptr->q_item->name_t <= new_data->name_t)
break;
ptr = ptr->q_forw;
}
/*
* and insert it
*/
(void) insque(new_node,ptr->q_back);
}
/*
* freelist -- frees up the space in the list pointed to
* by ptr. Uses free.
*/
freelist(ptr)
struct qelem *ptr;
{
struct qelem *dead;
struct qelem *start;
start = ptr;
ptr = ptr->q_forw;
while ( ptr != start ) {
dead = ptr;
ptr = ptr->q_forw;
(void) free( (char *) dead->q_item); /* kill the data */
(void) free( (char *) dead ); /* now get the node */
}
start->q_forw = start; /* reset pointers for a null list */
start->q_back = start;
}
/*
* setlimits -- looks through the rules list and uses the most
* specific rule for users[i], then looks through
* the exceptions and uses the (again) most specific
* exemption for the user.
*/
setlimits(i)
int i;
{
struct qelem *ptr;
int rule;
time_t tempus;
/*
* look down the rules list and set the
* most specific rule that applies to
* this user
*/
rule = 0;
(void) time(&tempus);
ptr = rules->q_back; /* start at the end of the list */
users[i].warned = 0; /* clear his warning and exempt flag */
users[i].exempt = 0; /* to avoid granularity problems */
users[i].next = tempus; /* next time is set to now, so */
/* the new rules (or exemptions) */
/* take affect immediately */
/*
* while we haven't looked through the whole list,
* and we haven't found a rule...
*/
while ( (ptr != rules) && (!rule) ) {
if ( (rule = find(ptr, i)) ) {
users[i].idle = (ptr->q_item)->flag * 60;
users[i].exempt &= ~IS_IDLE;
} else
ptr = ptr->q_back; /* move back one */
}
rule = 0;
ptr = session->q_back;
while ( (ptr != session) && (!rule) ){
if ( (rule = find(ptr, i)) ) {
users[i].session = (ptr->q_item)->flag * 60;
users[i].exempt &= ~IS_LIMIT;
} else
ptr = ptr->q_back; /* move back one */
}
/*
* now look down the exemptions list and
* set the first exemptions for this user.
*/
rule = 0;
ptr = exmpt->q_back; /* start at the end of the list */
while ( (ptr != exmpt) && (!rule) ) {
if ( (rule = find(ptr, i)) ) {
if ( (ptr->q_item)->flag == ALL)
users[i].exempt |= IS_IDLE|IS_MULT|IS_LIMIT;
else if ( (ptr->q_item)->flag == IDLE)
users[i].exempt |= IS_IDLE;
else if ( (ptr->q_item)->flag == MULTIPLE)
users[i].exempt |= IS_MULT;
else if ( (ptr->q_item)->flag == SESSION)
users[i].exempt |= IS_LIMIT;
} else
ptr = ptr->q_back; /* move back one */
}
}
/*
* find -- given a rule (or exemption) and a users, see if it applies.
* Example: If the rule is a LOGIN type rule, compare the name with that
* of the user to see if it applies. If we find a match, return 1,
* else return 0.
*/
find(ptr,i)
int i;
struct qelem *ptr;
{
switch ( (ptr->q_item)->name_t ) {
case LOGIN:
if (!strcmp( (ptr->q_item)->name, users[i].uid) )
return(1);
break;
case TTY:
if (!strcmp( (ptr->q_item)->name, (users[i].line+5) ) )
return(1);
break;
case GROUP:
if ( (ptr->q_item)->num == users[i].ugroup )
return(1);
break;
#ifdef PUCC
case CLUSTER:
if (!strcmp( (ptr->q_item)->name, users[i].clust) )
return(1);
break;
case RLD:
if ( (ptr->q_item)->num == users[i].rld )
return(1);
break;
#endif PUCC
case DEFAULT:
return(1);
break;
}
return(0);
}
#ifdef PUCC
#define makestr(Z) (strcpy(malloc( (unsigned) strlen(Z)+1),Z))
/*
* findcluster -- passes an rld number, it returns a char *
* to the name of the cluster associated with it
*/
char *
findcluster(rld)
int rld;
{
int fd;
static struct rld_data data;
#ifdef BSD2_9
if ( (fd = open(RLD_FILE,O_RDONLY) ) < 0 ) {
#else BSD2_9
if ( (fd = open(RLD_FILE,O_RDONLY,0) ) < 0 ) {
#endif BSD2_9
(void) error("Can't open rld file.");
exit(1);
}
/*
* seek to the proper rld and read it.
*/
(void) lseek(fd, rld*sizeof(data), 0);
(void) read(fd, (char *) &data, sizeof(data) );
(void) close(fd);
/*
* return the cluster name, if null, return "public"
*/
if (data.rld_cluster)
return(makestr(data.rld_cluster));
else
return(makestr("public"));
}
#endif PUCC