xref: /plan9/sys/src/cmd/gs/src/gp_unix.c (revision 3ff48bf5ed603850fcd251ddf13025d23d693782)
17dd7cddfSDavid du Colombier /* Copyright (C) 1989, 2000 Aladdin Enterprises.  All rights reserved.
27dd7cddfSDavid du Colombier 
3*3ff48bf5SDavid du Colombier   This file is part of AFPL Ghostscript.
47dd7cddfSDavid du Colombier 
5*3ff48bf5SDavid du Colombier   AFPL Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author or
6*3ff48bf5SDavid du Colombier   distributor accepts any responsibility for the consequences of using it, or
7*3ff48bf5SDavid du Colombier   for whether it serves any particular purpose or works at all, unless he or
8*3ff48bf5SDavid du Colombier   she says so in writing.  Refer to the Aladdin Free Public License (the
9*3ff48bf5SDavid du Colombier   "License") for full details.
107dd7cddfSDavid du Colombier 
11*3ff48bf5SDavid du Colombier   Every copy of AFPL Ghostscript must include a copy of the License, normally
12*3ff48bf5SDavid du Colombier   in a plain ASCII text file named PUBLIC.  The License grants you the right
13*3ff48bf5SDavid du Colombier   to copy, modify and redistribute AFPL Ghostscript, but only under certain
14*3ff48bf5SDavid du Colombier   conditions described in the License.  Among other things, the License
15*3ff48bf5SDavid du Colombier   requires that the copyright notice and this notice be preserved on all
16*3ff48bf5SDavid du Colombier   copies.
177dd7cddfSDavid du Colombier */
187dd7cddfSDavid du Colombier 
19*3ff48bf5SDavid du Colombier /*$Id: gp_unix.c,v 1.5 2001/04/08 08:43:24 ghostgum Exp $ */
207dd7cddfSDavid du Colombier /* Unix-specific routines for Ghostscript */
217dd7cddfSDavid du Colombier #include "pipe_.h"
227dd7cddfSDavid du Colombier #include "string_.h"
237dd7cddfSDavid du Colombier #include "time_.h"
247dd7cddfSDavid du Colombier #include "gx.h"
257dd7cddfSDavid du Colombier #include "gsexit.h"
267dd7cddfSDavid du Colombier #include "gp.h"
277dd7cddfSDavid du Colombier 
287dd7cddfSDavid du Colombier /*
297dd7cddfSDavid du Colombier  * This is the only place in Ghostscript that calls 'exit'.  Including
307dd7cddfSDavid du Colombier  * <stdlib.h> is overkill, but that's where it's declared on ANSI systems.
317dd7cddfSDavid du Colombier  * We don't have any way of detecting whether we have a standard library
327dd7cddfSDavid du Colombier  * (some GNU compilers perversely define __STDC__ but don't provide
337dd7cddfSDavid du Colombier  * an ANSI-compliant library), so we check __PROTOTYPES__ and
347dd7cddfSDavid du Colombier  * hope for the best.  We pick up getenv at the same time.
357dd7cddfSDavid du Colombier  */
367dd7cddfSDavid du Colombier #ifdef __PROTOTYPES__
377dd7cddfSDavid du Colombier #  include <stdlib.h>		/* for exit and getenv */
387dd7cddfSDavid du Colombier #else
397dd7cddfSDavid du Colombier extern void exit(P1(int));
407dd7cddfSDavid du Colombier extern char *getenv(P1(const char *));
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier #endif
437dd7cddfSDavid du Colombier 
447dd7cddfSDavid du Colombier /* Do platform-dependent initialization. */
457dd7cddfSDavid du Colombier void
467dd7cddfSDavid du Colombier gp_init(void)
477dd7cddfSDavid du Colombier {
487dd7cddfSDavid du Colombier }
497dd7cddfSDavid du Colombier 
507dd7cddfSDavid du Colombier /* Do platform-dependent cleanup. */
517dd7cddfSDavid du Colombier void
527dd7cddfSDavid du Colombier gp_exit(int exit_status, int code)
537dd7cddfSDavid du Colombier {
547dd7cddfSDavid du Colombier }
557dd7cddfSDavid du Colombier 
567dd7cddfSDavid du Colombier /* Exit the program. */
577dd7cddfSDavid du Colombier void
587dd7cddfSDavid du Colombier gp_do_exit(int exit_status)
597dd7cddfSDavid du Colombier {
607dd7cddfSDavid du Colombier }
617dd7cddfSDavid du Colombier 
627dd7cddfSDavid du Colombier /* ------ Miscellaneous ------ */
637dd7cddfSDavid du Colombier 
647dd7cddfSDavid du Colombier /* Get the string corresponding to an OS error number. */
657dd7cddfSDavid du Colombier /* Unix systems support this so inconsistently that we don't attempt */
667dd7cddfSDavid du Colombier /* to figure out whether it's available. */
677dd7cddfSDavid du Colombier const char *
687dd7cddfSDavid du Colombier gp_strerror(int errnum)
697dd7cddfSDavid du Colombier {
707dd7cddfSDavid du Colombier     return NULL;
717dd7cddfSDavid du Colombier }
727dd7cddfSDavid du Colombier 
737dd7cddfSDavid du Colombier /* ------ Date and time ------ */
747dd7cddfSDavid du Colombier 
757dd7cddfSDavid du Colombier /* Read the current time (in seconds since Jan. 1, 1970) */
767dd7cddfSDavid du Colombier /* and fraction (in nanoseconds). */
777dd7cddfSDavid du Colombier void
787dd7cddfSDavid du Colombier gp_get_realtime(long *pdt)
797dd7cddfSDavid du Colombier {
807dd7cddfSDavid du Colombier     struct timeval tp;
817dd7cddfSDavid du Colombier 
827dd7cddfSDavid du Colombier #if gettimeofday_no_timezone	/* older versions of SVR4 */
837dd7cddfSDavid du Colombier     {
847dd7cddfSDavid du Colombier 	if (gettimeofday(&tp) == -1) {
857dd7cddfSDavid du Colombier 	    lprintf("Ghostscript: gettimeofday failed!\n");
86*3ff48bf5SDavid du Colombier 	    tp.tv_sec = tp.tv_usec = 0;
877dd7cddfSDavid du Colombier 	}
887dd7cddfSDavid du Colombier     }
897dd7cddfSDavid du Colombier #else /* All other systems */
907dd7cddfSDavid du Colombier     {
917dd7cddfSDavid du Colombier 	struct timezone tzp;
927dd7cddfSDavid du Colombier 
937dd7cddfSDavid du Colombier 	if (gettimeofday(&tp, &tzp) == -1) {
947dd7cddfSDavid du Colombier 	    lprintf("Ghostscript: gettimeofday failed!\n");
95*3ff48bf5SDavid du Colombier 	    tp.tv_sec = tp.tv_usec = 0;
967dd7cddfSDavid du Colombier 	}
977dd7cddfSDavid du Colombier     }
987dd7cddfSDavid du Colombier #endif
997dd7cddfSDavid du Colombier 
1007dd7cddfSDavid du Colombier     /* tp.tv_sec is #secs since Jan 1, 1970 */
1017dd7cddfSDavid du Colombier     pdt[0] = tp.tv_sec;
1027dd7cddfSDavid du Colombier 
1037dd7cddfSDavid du Colombier     /* Some Unix systems (e.g., Interactive 3.2 r3.0) return garbage */
1047dd7cddfSDavid du Colombier     /* in tp.tv_usec.  Try to filter out the worst of it here. */
1057dd7cddfSDavid du Colombier     pdt[1] = tp.tv_usec >= 0 && tp.tv_usec < 1000000 ? tp.tv_usec * 1000 : 0;
1067dd7cddfSDavid du Colombier 
1077dd7cddfSDavid du Colombier #ifdef DEBUG_CLOCK
1087dd7cddfSDavid du Colombier     printf("tp.tv_sec = %d  tp.tv_usec = %d  pdt[0] = %ld  pdt[1] = %ld\n",
1097dd7cddfSDavid du Colombier 	   tp.tv_sec, tp.tv_usec, pdt[0], pdt[1]);
1107dd7cddfSDavid du Colombier #endif
1117dd7cddfSDavid du Colombier }
1127dd7cddfSDavid du Colombier 
1137dd7cddfSDavid du Colombier /* Read the current user CPU time (in seconds) */
1147dd7cddfSDavid du Colombier /* and fraction (in nanoseconds).  */
1157dd7cddfSDavid du Colombier void
1167dd7cddfSDavid du Colombier gp_get_usertime(long *pdt)
1177dd7cddfSDavid du Colombier {
1187dd7cddfSDavid du Colombier #if use_times_for_usertime
1197dd7cddfSDavid du Colombier     struct tms tms;
1207dd7cddfSDavid du Colombier     long ticks;
1217dd7cddfSDavid du Colombier     const long ticks_per_sec = CLK_TCK;
1227dd7cddfSDavid du Colombier 
1237dd7cddfSDavid du Colombier     times(&tms);
1247dd7cddfSDavid du Colombier     ticks = tms.tms_utime + tms.tms_stime + tms.tms_cutime + tms.tms_cstime;
1257dd7cddfSDavid du Colombier     pdt[0] = ticks / ticks_per_sec;
1267dd7cddfSDavid du Colombier     pdt[1] = (ticks % ticks_per_sec) * (1000000000 / ticks_per_sec);
1277dd7cddfSDavid du Colombier #else
1287dd7cddfSDavid du Colombier     gp_get_realtime(pdt);	/* Use an approximation on other hosts.  */
1297dd7cddfSDavid du Colombier #endif
1307dd7cddfSDavid du Colombier }
1317dd7cddfSDavid du Colombier 
1327dd7cddfSDavid du Colombier /* ------ Screen management ------ */
1337dd7cddfSDavid du Colombier 
1347dd7cddfSDavid du Colombier /* Get the environment variable that specifies the display to use. */
1357dd7cddfSDavid du Colombier const char *
1367dd7cddfSDavid du Colombier gp_getenv_display(void)
1377dd7cddfSDavid du Colombier {
1387dd7cddfSDavid du Colombier     return getenv("DISPLAY");
1397dd7cddfSDavid du Colombier }
1407dd7cddfSDavid du Colombier 
1417dd7cddfSDavid du Colombier /* ------ Printer accessing ------ */
1427dd7cddfSDavid du Colombier 
1437dd7cddfSDavid du Colombier /* Open a connection to a printer.  See gp.h for details. */
1447dd7cddfSDavid du Colombier FILE *
1457dd7cddfSDavid du Colombier gp_open_printer(char fname[gp_file_name_sizeof], int binary_mode)
1467dd7cddfSDavid du Colombier {
1477dd7cddfSDavid du Colombier     const char *fmode = (binary_mode ? "wb" : "w");
1487dd7cddfSDavid du Colombier 
1497dd7cddfSDavid du Colombier     return (strlen(fname) == 0 ? 0 : fopen(fname, fmode));
1507dd7cddfSDavid du Colombier }
1517dd7cddfSDavid du Colombier 
1527dd7cddfSDavid du Colombier /* Close the connection to the printer. */
1537dd7cddfSDavid du Colombier void
1547dd7cddfSDavid du Colombier gp_close_printer(FILE * pfile, const char *fname)
1557dd7cddfSDavid du Colombier {
1567dd7cddfSDavid du Colombier     if (fname[0] == '|')
1577dd7cddfSDavid du Colombier 	pclose(pfile);
1587dd7cddfSDavid du Colombier     else
1597dd7cddfSDavid du Colombier 	fclose(pfile);
1607dd7cddfSDavid du Colombier }
161