f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * CDDL HEADER START
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * The contents of this file are subject to the terms of the
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Common Development and Distribution License (the "License").
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * You may not use this file except in compliance with the License.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * or http://www.opensolaris.org/os/licensing.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * See the License for the specific language governing permissions
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * and limitations under the License.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * When distributing Covered Code, include this CDDL HEADER in each
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * If applicable, add the following below this CDDL HEADER, with the
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * fields enclosed by brackets "[]" replaced with your own identifying
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * information: Portions Copyright [yyyy] [name of copyright owner]
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * CDDL HEADER END
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Use is subject to license terms.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#pragma ident "%Z%%M% %I% %E% SMI"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Add TSOL banner, trailer, page header/footers to a print job
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* system header files */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <stdio.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <stdlib.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <string.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <time.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <limits.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <errno.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <signal.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <locale.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <tsol/label.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* typedefs */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricatypedef int BOOL;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* constants */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#ifndef FALSE
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define FALSE 0
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#endif
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#ifndef TRUE
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define TRUE 1
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#endif
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define ME "lp.tsol_separator"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define POSTSCRIPTLIB "/usr/lib/lp/postscript"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define SEPARATORPS "tsol_separator.ps"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define BANNERPS "tsol_banner.ps"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define TRAILERPS "tsol_trailer.ps"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define MAXUSERLEN 32
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define MAXHOSTLEN 32
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* external variables */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaint optind; /* Used by getopt */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricachar *optarg; /* Used by getopt */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* prototypes for static functions */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int ProcessArgs(int argc, char **argv);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void Usage(void);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void ParseUsername(char *input, char *user, char *host);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void EmitPSFile(const char *name);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic BOOL EmitFile(FILE *file);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void EmitJobData(void);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void EmitPrologue(void);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void EmitCommandLineInfo(void);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void EmitClockBasedInfo(void);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void EmitLabelInfo(void);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void CopyStdin(void);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* static variables */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic char *ArgSeparatorPS;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic char *ArgBannerPS;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic char *ArgTrailerPS;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic char *ArgPSLib;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic char *ArgPrinter;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic char *ArgJobID;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic char *ArgUser;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic char *ArgTitle;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic char *ArgFile;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic BOOL ArgReverse;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic BOOL ArgNoPageLabels;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int ArgDebugLevel;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic FILE *ArgLogFile;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic m_label_t *FileLabel;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic char *remoteLabel;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaint
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricamain(int argc, char *argv[])
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica int err;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Run immune from typical interruptions, so that
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * we stand a chance to get the fault message.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * EOF (or startup error) is the only way out.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) signal(SIGHUP, SIG_IGN);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) signal(SIGINT, SIG_IGN);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) signal(SIGQUIT, SIG_IGN);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) signal(SIGTERM, SIG_IGN);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) setlocale(LC_ALL, "");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#if !defined(TEXT_DOMAIN)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define TEXT_DOMAIN "SYS_TEST"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#endif
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) textdomain(TEXT_DOMAIN);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (ProcessArgs(argc, argv) != 0)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((FileLabel = m_label_alloc(MAC_LABEL)) == NULL)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * If the job was submitted via remotely, the label of the
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * remote peer will be set in the SLABEL environment variable
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * by copying it out of the SECURE structure.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * If there is no SLABEL value, the job was submitted locally
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * via the named pipe, and the file label can be determined
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * from its pathname.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((remoteLabel = getenv("SLABEL")) != NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica m_label_free(FileLabel);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica FileLabel = NULL;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (str_to_label(remoteLabel, &FileLabel, MAC_LABEL,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica L_NO_CORRECTION, &err) == -1) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica perror("str_to_label");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else if (getlabel(ArgFile, FileLabel) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("%1$s: cannot get label of %2$s: %3$s\n"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ME, ArgFile, strerror(errno));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* All of these functions exit if they encounter an error */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica EmitJobData();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica EmitPSFile(ArgSeparatorPS);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (ArgReverse)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica EmitPSFile(ArgTrailerPS);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica else
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica EmitPSFile(ArgBannerPS);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica CopyStdin();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (ArgReverse)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica EmitPSFile(ArgBannerPS);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica else
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica EmitPSFile(ArgTrailerPS);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (ArgDebugLevel >= 1)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, gettext("Done.\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica m_label_free(FileLabel);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaEmitJobData(void)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica EmitPrologue();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica EmitCommandLineInfo();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica EmitClockBasedInfo();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica EmitLabelInfo();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* Emit ending PostScript code */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("end\n\n");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("%%%% End of code generated by lp.tsol_separator\n\n");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaEmitPrologue(void)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* Emit preliminary PostScript code */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("%%!\n\n");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("%%%% Begin code generated by lp.tsol_separator\n\n");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("%%%% Create JobDict if it doesn't exist\n");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("userdict /JobDict known not {\n");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf(" userdict /JobDict 100 dict put\n");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("} if\n\n");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("%%%% Define job parameters, including TSOL security "
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica "info\n");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("JobDict\n");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("begin\n");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* Emit parameters obtained from command line options */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaEmitCommandLineInfo(void)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char user[MAXUSERLEN + 1];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char host[MAXHOSTLEN + 1];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("\t/Job_Printer (%s) def\n", ArgPrinter);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ParseUsername(ArgUser, user, host);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("\t/Job_Host (%s) def\n", host);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("\t/Job_User (%s) def\n", user);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("\t/Job_JobID (%s) def\n", ArgJobID);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("\t/Job_Title (%s) def\n", ArgTitle);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("\t/Job_DoPageLabels (%s) def\n",
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgNoPageLabels ? "NO" : "YES");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("\n");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* Emit parameters generated from the system clock */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaEmitClockBasedInfo(void)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char timebuf[80];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica struct timeval clockval;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) gettimeofday(&clockval, NULL);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strftime(timebuf, sizeof (timebuf), NULL,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica localtime(&clockval.tv_sec));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("\t/Job_Date (%s) def\n", timebuf);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("\t/Job_Hash (%ld) def\n", clockval.tv_usec % 100000L);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("\n");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* Emit parameters derived from the SL and IL of the file being printed. */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaEmitLabelInfo(void)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char *header = NULL; /* DIA banner page fields */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char *label = NULL;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char *caveats = NULL;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char *channels = NULL;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char *page_label = NULL; /* interior pages label */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (label_to_str(FileLabel, &header, PRINTER_TOP_BOTTOM,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica DEF_NAMES) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("%s: label_to_str PRINTER_TOP_BOTTOM: %s.\n"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ME, strerror(errno));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (label_to_str(FileLabel, &label, PRINTER_LABEL,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica DEF_NAMES) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("%s: label_to_str PRINTER_LABEL: %s.\n"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ME, strerror(errno));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (label_to_str(FileLabel, &caveats, PRINTER_CAVEATS,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica DEF_NAMES) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("%s: label_to_str PRINTER_CAVEATS: %s.\n"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ME, strerror(errno));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (label_to_str(FileLabel, &channels, PRINTER_CHANNELS,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica DEF_NAMES) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("%s: label_to_str PRINTER_CHANNELS: %s.\n"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ME, strerror(errno));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (label_to_str(FileLabel, &page_label, M_LABEL,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica LONG_NAMES) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("%s: label_to_str M_LABEL: %s.\n"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ME, strerror(errno));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("\t/Job_Classification (%s) def\n", header);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("\t/Job_Protect (%s) def\n", label);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("\t/Job_Caveats (%s) def\n", caveats);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("\t/Job_Channels (%s) def\n", channels);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) printf("\t/Job_SL_Internal (%s) def\n", page_label);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* Free memory allocated label_to_str */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica free(header);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica free(label);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica free(caveats);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica free(channels);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica free(page_label);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Parse input "host!user" to separate host and user names.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaParseUsername(char *input, char *user, char *host)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char *cp;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((cp = strchr(input, '@')) != NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* user@host */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strlcpy(host, cp + 1, MAXHOSTLEN + 1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *cp = '\0';
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strlcpy(user, input, MAXUSERLEN + 1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *cp = '@';
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else if ((cp = strchr(input, '!')) != NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* host!user */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strlcpy(user, cp + 1, MAXUSERLEN + 1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *cp = '\0';
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strlcpy(host, input, MAXHOSTLEN + 1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *cp = '!';
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* user */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strlcpy(user, input, MAXUSERLEN + 1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica host[0] = '\0';
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaCopyStdin(void)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (!EmitFile(stdin)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("%s: Error copying stdin to stdout\n"), ME);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic BOOL
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaEmitFile(FILE *file)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica int len;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define BUFLEN 1024
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char buf[BUFLEN];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica while ((len = fread(buf, 1, BUFLEN, file)) > 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (fwrite(buf, 1, len, stdout) != len)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (FALSE);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (!feof(file))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (FALSE);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (TRUE);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaEmitPSFile(const char *name)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char path[PATH_MAX];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica FILE *file;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica BOOL emitted;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (name[0] != '/') {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strlcpy(path, ArgPSLib, sizeof (path));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strlcat(path, "/", sizeof (path));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strlcat(path, name, sizeof (path));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strlcpy(path, name, sizeof (path));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica file = fopen(path, "r");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (file == NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("%s: Error opening PostScript file %s. %s.\n"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ME, path, strerror(errno));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica emitted = EmitFile(file);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fclose(file);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (!emitted) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, gettext(
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica "%s: Error copying PostScript file %s to stdout.\n"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ME, path);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaProcessArgs(int argc, char *argv[])
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica int option_letter;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char *options_string = "lrd:e:s:b:t:L:";
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* set default values for arguments */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgSeparatorPS = SEPARATORPS;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgBannerPS = BANNERPS;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgTrailerPS = TRAILERPS;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgPSLib = POSTSCRIPTLIB;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgNoPageLabels = ArgReverse = FALSE;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgDebugLevel = 0;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgLogFile = stderr;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* read switch arguments once to get error log file */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica while ((option_letter = getopt(argc, argv, options_string)) != EOF) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica switch (option_letter) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 'd':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgDebugLevel = atoi(optarg);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 'e':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgLogFile = fopen(optarg, "a");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (ArgLogFile == NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("Cannot open log file %s\n"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica optarg);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (-1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case '?': /* ? or unrecognized option */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica Usage();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (-1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (ArgDebugLevel > 0)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("Processing switch arguments\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* re-read switch arguments */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica optind = 1;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica while ((option_letter = getopt(argc, argv, options_string)) != EOF) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica switch (option_letter) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 'd':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgDebugLevel = atoi(optarg);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 'e':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* This was handled in earlier pass through args */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 'l':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgNoPageLabels = TRUE;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 'r':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgReverse = TRUE;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 's':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgSeparatorPS = optarg;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 'b':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgBannerPS = optarg;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 't':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgTrailerPS = optarg;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 'L':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgPSLib = optarg;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case '?': /* ? or unrecognized option */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica Usage();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (-1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* Adjust arguments to skip over options */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica argc -= optind; /* Number of remaining(non-switch) args */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica argv += optind; /* argv[0] is first(non-switch) args */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (argc != 5) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("Wrong number of arguments.\n\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica Usage();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (-1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgPrinter = argv++[0];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgJobID = argv++[0];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgUser = argv++[0];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgTitle = argv++[0];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgFile = argv++[0];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (ArgDebugLevel >= 1) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, gettext("Arguments processed\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, gettext("Printer: %s\n"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ArgPrinter);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, gettext("Job ID: %s\n"), ArgJobID);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, gettext("User: %s\n"), ArgUser);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, gettext("Title: %s\n"), ArgTitle);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, gettext("File: %s\n"), ArgFile);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaUsage(void)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica static const char *OPTFMT = " %-8s %-9s %s\n";
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("Usage: lp.tsol_separator [OPTIONS] %s\n"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("PRINTER JOBID HOST!USER TITLE FILE"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, gettext(" OPTIONS:\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, OPTFMT, "-r", gettext("Reverse"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("Reverse banner/trailer order"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, OPTFMT, "-l", gettext("Labels"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("Suppress page header/footer labels"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, OPTFMT, gettext("-b FILE"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("Banner"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("PostScript program for banner (default tsol_banner.ps)"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, OPTFMT, gettext("-s FILE"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("Separator"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("PostScript program for separator "
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica "(default tsol_separator.ps)"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, OPTFMT, gettext("-t FILE"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("Trailer"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("PostScript program for trailer "
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica "(default tsol_trailer.ps)"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, OPTFMT, gettext("-L DIR"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("Library"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("Directory to search for PostScript programs"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, OPTFMT, "", "",
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("(default /usr/lib/lp/postscript)"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, OPTFMT, gettext("-d N"), gettext("Debug"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("Set debug level to N"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(ArgLogFile, OPTFMT, gettext("-e FILE"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("Error File"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("Append error and debugging output to FILE"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}