home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
old
/
ckermit5a190
/
cku2tm.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-10-20
|
3KB
|
143 lines
#include <signal.h>
#include <stdio.h>
#include <setjmp.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/time.h>
#define CTIME 1
#define ASCTIME 2
#define TZSET 3
#define LOCALTIME 4
#define GMTIME 5
#define OFFTIME 6
extern struct tm *offtime();
jmp_buf env;
char *cp, junk[52];
long l, off;
int timeout(), checkppid();
struct tm tmtmp, *tp;
main()
{
register int i;
struct itimerval it;
u_char c;
signal(SIGPIPE, SIG_DFL);
for (i = getdtablesize(); --i > 2; )
close(i);
/*
* Need a timer running while we disassociate from the control terminal
* in case of a modem line which has lost carrier.
*/
timerclear(&it.it_interval);
it.it_value.tv_sec = 5;
it.it_value.tv_usec = 0;
signal(SIGALRM, timeout);
setitimer(ITIMER_REAL, &it, (struct itimerval *) NULL);
if (setjmp(env) == 0)
{
i = open("/dev/tty", 0);
if (i >= 0)
{
ioctl(i, TIOCNOTTY, NULL);
close(i);
}
}
/*
* Now start a timer with one minute refresh. In the signal service
* routine, check the parent process id to see if this process has
* been orphaned and if so exit. This is primarily aimed at removing
* the 'ctimed' process left behind by 'sendmail's multi-fork startup
* but may prove useful in preventing accumulation of 'ctimed' processes
* in other circumstances as well. Normally this process is short
* lived.
*/
it.it_interval.tv_sec = 60;
it.it_interval.tv_usec = 0;
it.it_value.tv_sec = 60;
it.it_value.tv_usec = 0;
signal(SIGALRM, checkppid);
setitimer(ITIMER_REAL, &it, (struct itimerval *) NULL);
while (read(fileno(stdin), &c, 1) == 1)
{
switch (c)
{
case CTIME:
l = 0L;
getb(fileno(stdin), &l, sizeof l);
cp = ctime(&l);
write(fileno(stdout), cp, 26);
break;
case ASCTIME:
getb(fileno(stdin), &tmtmp, sizeof tmtmp);
cp = asctime(&tmtmp);
write(fileno(stdout), cp, 26);
break;
case TZSET:
(void) tzset();
break;
case LOCALTIME:
l = 0L;
getb(fileno(stdin), &l, sizeof l);
tp = localtime(&l);
write(fileno(stdout), tp, sizeof (*tp));
strcpy(junk, tp->tm_zone);
junk[24] = '\0';
write(fileno(stdout), junk, 24);
break;
case GMTIME:
l = 0L;
getb(fileno(stdin), &l, sizeof l);
tp = gmtime(&l);
write(fileno(stdout), tp, sizeof (*tp));
strcpy(junk, tp->tm_zone);
junk[24] = '\0';
write(fileno(stdout), junk, 24);
break;
case OFFTIME:
getb(fileno(stdin), &l, sizeof l);
getb(fileno(stdin), &off, sizeof off);
tp = offtime(&l, off);
write(fileno(stdout), tp, sizeof (*tp));
break;
default:
abort("switch");
}
}
}
getb(f, p, n)
int f;
register char *p;
register int n;
{
register int i;
while (n)
{
i = read(f, p, n);
if (i <= 0)
return;
p += i;
n -= i;
}
}
timeout()
{
longjmp(env, 1);
}
checkppid()
{
if (getppid() == 1)
exit(0);
}