home *** CD-ROM | disk | FTP | other *** search
- /*
- ** This program turns off an idle NeXT printer after some given time,
- ** written by Yunliang Yu <yu@math.duke.edu>, 11/5/94
- **
- ** Modified by Art Isbell (art@cubicsol.com) to take idleLimit as an optional
- ** argument with 180 seconds the default idleLimit if no argument is
- ** specified. npoffd checks the printer idle time every checkPeriod (60 by
- ** default) seconds, so the actual idle limit can vary from idleLimit to
- ** idleLimit + checkPeriod seconds. If this behavior isn't ideal, modify
- ** checkPeriod.
- **
- ** npoffd fails to turn off the printer if a print job is aborted before any
- ** printing has occurred because npoffd depends on the modification time of the
- ** printer device which isn't updated until a page is printed. A fix for this
- ** situation is left as an exercise for the reader :-)
- **
- ** To build, as root:
- **
- ** cc -O2 -object -s -arch m68k npoffd.c -o /usr/local/etc/npoffd
- **
- ** To use, add the following to the /etc/rc.local file (assumes 180-second idle
- ** limit):
- **
- ** if [ -x /usr/local/etc/npoffd ]; then
- ** (sleep 5; /usr/local/etc/npoffd 180) &
- ** fi
- **
- ** Use at your own risk, if any.
- */
-
- #import <libc.h>
- #import <time.h>
- #import <syslog.h>
- #import <sys/types.h>
- #import <sys/stat.h>
- #import <sys/file.h>
- #import <sys/ioctl.h>
- #import <mach/m68k/boolean.h>
- #import <dev/m68k/npio.h>
-
- static const char *printerPort = "/dev/np0";
- static const char *syslogOpenMsg = "npoffd";
- static const char *syslogOffMsg = "printer off";
- static const char *syslogNoStatMsg = "can't stat %s, exit";
-
- /* minimal idle limit before turning off */
- static const int idleLimitDefault = 180;
-
- /* frequency the printer's idle time is checked */
- static const int checkPeriod = 60;
-
- int main(int argc, char *argv[])
- {
- char *chPtr;
-
- /* time printer port was last written. Used to determine whether printing
- ** has occurred within the past checkPeriod seconds. */
- time_t previousPrinterPortModifyTime = 0;
- int idleLimit;
- struct stat statBuffer;
-
- /* Get argument, if any. */
- if (argc != 2 || (idleLimit = (int)strtol(argv[1], &chPtr, 10)) <= 0)
- {
- idleLimit = idleLimitDefault;
- }
- /* Set up syslog. */
- openlog(syslogOpenMsg, LOG_PID, LOG_DAEMON);
- setlogmask(LOG_UPTO(LOG_ERR));
-
- /* Loop while printer port is accessible. */
- while (stat(printerPort, &statBuffer) != -1)
- {
- /* last time printer port was written */
- time_t printerPortModifyTime = statBuffer.st_mtime;
- int fileDescriptor;
-
- /* If printing has occurred and printer has been idle for more than
- ** idleLimit seconds, power off printer. */
- if (printerPortModifyTime != previousPrinterPortModifyTime &&
- time(0) - printerPortModifyTime > idleLimit &&
- (fileDescriptor = open(printerPort, O_WRONLY | O_NDELAY, 0)) > 0)
- {
- /* structure for NPIOCPOP - printer op command */
- struct npop printerOpStruct;
-
- printerOpStruct.np_op = NPSETPOWER;
- printerOpStruct.np_power = 0;
- ioctl(fileDescriptor, NPIOCPOP, &printerOpStruct);
- close(fileDescriptor);
- syslog(LOG_ERR, syslogOffMsg);
- previousPrinterPortModifyTime = printerPortModifyTime;
- }
- sleep(checkPeriod);
- }
- syslog(LOG_ERR, syslogNoStatMsg, printerPort);
- closelog();
- exit(1);
- }
-