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