This is idled.c in view mode; [Download] [Up]
/*
* idled.c -- Show correct idle time for console
*
* $Header: /Users/marcel/src/idled/RCS/idled.c,v 1.1 1996/07/21 18:22:46 mwa Exp $
*
* (c) 1996 Marcel Waldvogel, mwa@nice.ch
*
* History
* =======
* 960721 mwa Created
*/
#import <libc.h>
#import <drivers/event_status_driver.h>
/*
* The interval in which we check for user actions.
* One could choose anything shorter than 1 minute
* (1 minute is the minimum idle time being shown).
* The smaller the time, the smaller is also the update latency
* (the time between your typing or mousing and the clearing of the
* idle time), but the CPU load increases.
*/
#define INTERVAL 15
#define CONSOLE "/dev/console"
void
usage(const char *prog)
{
fprintf(stderr, "Usage: %s\n", prog);
fputs("Keeps the idle time for the console accurately", stderr);
exit(1);
}
void
daemonize(void)
{
/*
* This code was inspired by the xntpd source
*/
int fid;
u_long s;
int max_fd;
if (fork())
exit(0);
max_fd = getdtablesize();
for (s = 3; s < max_fd; s++)
close(s);
/*
* You could also start closing at 0 and add the following:
* But then you would have to care for perror()s etc.
open("/", 0);
dup2(0, 1);
dup2(0, 2);
*/
chdir("/");
fid = open("/dev/tty", 2);
if (fid >= 0) {
ioctl(fid, (u_long) TIOCNOTTY, (char *) 0);
close(fid);
}
setpgrp(0, getpid());
}
int
idle(NXEventHandle evs)
{
#if NX_CURRENT_COMPILER_RELEASE >= 330
/*
* It is bogous to check for the compiler release, we should check
* for the current system release. NXIdleTime() is only supported
* since NS 3.3
*/
return (int)NXIdleTime(evs);
#else
/*
* Not supported directly, so we calculate it ourselves
*/
return (int)(NXAutoDimThreshold(evs) - NXAutoDimTime(evs));
#endif
}
void
update(NXEventHandle evs)
{
if (idle(evs) < INTERVAL) {
/*
* Reset the idle timer if the user has been doing something lately
*/
struct stat console;
if (stat(CONSOLE, &console) == 0) {
struct timeval tv[2];
/*
* Build a structure suitable for utimes(), preserving the file's
* modification time but changing the access time to now
*/
gettimeofday(&tv[0], NULL);
tv[1].tv_usec = 0;
tv[1].tv_sec = console.st_mtime;
utimes(CONSOLE, tv);
}
}
}
/*
* Daemon: update idle time in regular intervals
*/
void
main(int argc, char *argv[])
{
NXEventHandle evs;
/* Did we get any argument? */
if (argc > 1)
usage(argv[0]);
daemonize();
evs = NXOpenEventStatus();
if (evs == NULL) {
perror("NXOpenEventStatus");
exit(1);
}
/* Otherwise, go into "daemon" mode */
while (1) {
update(evs);
sleep(INTERVAL);
}
/*
* Do it if the while() condition should ever change...
NXCloseEventStatus(evs);
*/
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.