AUSAM/source/S/date.c
#
/*
* date [[[[[yy]mm]dd]hh]mm]
*
* Piers Lauder Mar '78
*/
#include <local-system>
#ifdef AUSAM
long time();
long timbuf;
int dmsize[];
char *ijtime();
char *cbp;
char c;
#include <wtmp.h>
struct dtmp dtmp;
main(argc, argv)
int argc;
char **argv;
{
register int wf;
if(argc > 1)
{
cbp = argv[1];
timbuf = time();
dtmp.d_oldtime = timbuf;
dtmp.d_type = D_TYPE;
if(gtime())
{
write(1, "Bad conversion\n", 15);
return 1;
}
if( peopleon() )
{
prints(1, "Too many people logged on\n");
return 1;
}
if(timbuf < dtmp.d_oldtime || timbuf > dtmp.d_oldtime+3600)
{
if(timbuf < dtmp.d_oldtime)
prints(1, "The date you have given is prior to the current time");
else
prints(1, "The date given is more than one hour in advance");
prints(1, " confirm this change (y or n) : ");
read(0, &c, 1);
wf = c;
while(c != '\n' && read(0, &c, 1) == 1);
if(wf != 'y')
return 1;
}
if(stime(timbuf) < 0)
{
write(1, "No permission\n", 14);
return 1;
}
if((wf = open("/usr/adm/wtmp", 1)) >= 0)
{
dtmp.d_newtime = time();
seek(wf, 0, 2);
write(wf, &dtmp, sizeof dtmp);
}
}
cbp = ijtime();
write(1, cbp, 20);
write(1, "Sydney Time", 11);
write(1, cbp+19, 6);
return 0;
}
gtime()
{
register int i;
register int y;
register int *tvec;
int t, d, h, m;
extern int *localtime();
tvec = localtime(timbuf);
if((y = gpair()) < 0)
goto bad;
if((t = gpair()) < 0)
goto setmin;
if((d = gpair()) < 0)
goto sethrs;
if((h = gpair()) < 0)
goto setday;
if((m = gpair()) < 0)
goto setmon;
setime:
if(t < 1 || t > 12)
goto bad;
if(d < 1 || d > 31)
goto bad;
if(h >= 24)
{
if(h > 24)
goto bad;
h = 0;
if(++d > 31)
{
d = 1;
if(++t > 12)
{
t = 1;
y++;
}
}
}
if(m > 59)
goto bad;
timbuf = 0;
y =+ 1900;
for(i = 1970; i < y; i++)
timbuf =+ dysize(i);
/* Leap year */
if(dysize(y) == 366 && t >= 3)
timbuf++;
while(--t)
timbuf =+ dmsize[t-1];
timbuf =+ d-1;
timbuf = timbuf*24+h;
timbuf = timbuf*60+m;
timbuf =* 60;
return(0);
setmin:
m = y;
h = tvec[2];
getday:
d = tvec[3];
getmon:
t = tvec[4]+1;
getyrs:
y = tvec[5];
goto setime;
sethrs:
m = t;
h = y;
goto getday;
setday:
m = d;
h = t;
d = y;
goto getmon;
setmon:
m = h;
h = d;
d = t;
t = y;
goto getyrs;
bad:
return(1);
}
gpair()
{
register int c, d;
register char *cp;
cp = cbp;
if(*cp == 0)
return(-1);
c = (*cp++ -'0')*10;
if(c < 0 || c > 100)
return(-1);
if(*cp == 0)
return(-1);
if((d = *cp++ -'0') < 0 || d > 9)
return(-1);
cbp = cp;
return(c+d);
}
/*
* this routine checks if people other than root are logged on.
* and returns 1 if so.
*/
peopleon()
{
register ufd;
struct utmp u;
if((ufd = open("/etc/utmp", 0)) == -1)
{
perror("utmp");
return 1;
}
while(read(ufd, &u, sizeof u) == sizeof u)
{
if(u.u_u_name[0] != '\0' && u.u_u_id != 0)
{
close(ufd);
return 1;
}
}
close(ufd);
return 0;
}
#endif