#ident "%Z%%M% %I% %E% SMI"
#include "uucp.h"
#include "log.h"
#include <pwd.h>
#define FS ' '
#define STD 'S'
#define LOGCHECK { if (Collecting == FALSE) return; }
struct acData
{
char uid[MODSTR];
char jobID[MODSTR];
off_t jobsize;
char status;
char service;
char jobgrade[MODSTR];
char time[MODSTR];
char origSystem[MODSTR];
char origUser[MODSTR];
char rmtSystem[MODSTR];
char rmtUser[MODSTR];
char device[MODSTR];
char netid[MODSTR];
char type[MODSTR];
char path[BUFSIZ];
};
static int Collecting = FALSE;
static int LogFile = CLOSED;
static char LogName[] = ACCOUNT;
static char Record[LOGSIZE];
static struct acData Acct;
STATIC_FUNC void reportJob();
STATIC_FUNC void
reportJob ()
{
static char format[] = "%s%c%s%c%ld%c%c%c%c%c%s%c%s%c%s%c(%s)%c%s%c%s%c%s%c%s%c%s%c%s%c";
register struct acData * acptr;
acptr = &Acct;
sprintf(Record, format,
acptr->uid, FS,
acptr->jobID, FS,
acptr->jobsize, FS,
acptr->status, FS,
acptr->service, FS,
acptr->jobgrade, FS,
acptr->origSystem, FS,
acptr->origUser, FS,
acptr->time, FS,
acptr->rmtSystem, FS,
acptr->rmtUser, FS,
acptr->device, FS,
acptr->netid, FS,
acptr->type, FS,
acptr->path, FS);
(void) strcat(Record, EOR);
writeLog(Record,&LogFile,LogName,&Collecting);
}
void
acConnected (remote, device)
char * remote;
char * device;
{
register struct acData * acptr = &Acct;
LOGCHECK;
copyText(acptr->rmtSystem, sizeof(acptr->rmtSystem), remote);
copyText(acptr->device, sizeof(acptr->device), device);
acptr->service = 'S';
}
void
acDojob(jobid, system, user)
char * jobid;
char * system;
char * user;
{
register struct acData * acptr = &Acct;
struct passwd *passent;
LOGCHECK;
if (strcmp(acptr->jobID,jobid) == 0)
return;
if ((*acptr->jobID != NULLCHAR) && (acptr->jobsize != 0)){
reportJob();
}
copyText(acptr->jobID, sizeof(acptr->jobID), jobid);
copyText(acptr->origSystem, sizeof(acptr->origSystem), system);
copyText(acptr->origUser, sizeof(acptr->origUser), user);
copyText(acptr->time, sizeof(acptr->time), timeStamp());
acptr->jobgrade[0] = jobid[strlen(jobid)-5];
acptr->jobgrade[1] = NULLCHAR;
acptr->jobsize = 0;
while ((passent = getpwent()) != NULL){
if (strcmp(passent->pw_name,user) == 0){
sprintf(acptr->uid,"%ld",(long) passent->pw_uid);
break;
}
}
}
void
acEnd(status)
char status;
{
register struct acData * acptr = &Acct;
LOGCHECK;
if (((*acptr->jobID != NULLCHAR) && (acptr->jobsize != 0))
|| (status == PARTIAL)){
acptr->status = status;
reportJob();
}
}
void
acInc()
{
register struct acData * acptr = &Acct;
LOGCHECK;
acptr->jobsize += getfilesize();
}
void
acInit (type)
char * type;
{
register struct acData * acptr = &Acct;
if (openLog(&LogFile,LogName) == SUCCESS){
Collecting = TRUE;
acptr->service = STD;
acptr->status = COMPLETE;
copyText(acptr->jobgrade, sizeof(acptr->jobgrade), NOTAVAIL);
copyText(acptr->uid, sizeof(acptr->uid), NOTAVAIL);
copyText(acptr->origSystem, sizeof(acptr->origSystem), NOTAVAIL);
copyText(acptr->origUser, sizeof(acptr->origUser), NOTAVAIL);
copyText(acptr->rmtSystem, sizeof(acptr->rmtSystem), NOTAVAIL);
copyText(acptr->rmtUser, sizeof(acptr->rmtUser), NOTAVAIL);
copyText(acptr->device, sizeof(acptr->device), NOTAVAIL);
copyText(acptr->netid, sizeof(acptr->netid), NOTAVAIL);
copyText(acptr->path, sizeof(acptr->path), NOTAVAIL);
copyText(acptr->type, sizeof(acptr->type), type);
}
else
Collecting = FALSE;
}
void
acRexe(jobid,origsys,origuser,connsys,connuser,cmd)
char * jobid;
char * origsys;
char * origuser;
char * connsys;
char * connuser;
char * cmd;
{
register struct acData * acptr = &Acct;
LOGCHECK;
copyText(acptr->jobID, sizeof(acptr->jobID), jobid);
copyText(acptr->origSystem, sizeof(acptr->origSystem), origsys);
copyText(acptr->origUser, sizeof(acptr->origUser), origuser);
copyText(acptr->rmtSystem, sizeof(acptr->rmtSystem), connsys);
copyText(acptr->rmtUser, sizeof(acptr->rmtUser), connuser);
copyText(acptr->path, sizeof(acptr->path), cmd);
copyText(acptr->time, sizeof(acptr->time), timeStamp());
}
void
acEndexe(cycle,status)
time_t cycle;
char status;
{
register struct acData * acptr = &Acct;
LOGCHECK;
acptr->jobsize = cycle;
acptr->status = status;
reportJob();
}
time_t
cpucycle()
{
struct tms tbuf;
time_t rval;
static time_t utime,stime;
times(&tbuf);
rval = ((tbuf.tms_utime-utime) + (tbuf.tms_stime-stime))*1000/HZ;
utime = tbuf.tms_utime;
stime = tbuf.tms_stime;
return(rval);
}