1*f875b4ebSrica /*
2*f875b4ebSrica * CDDL HEADER START
3*f875b4ebSrica *
4*f875b4ebSrica * The contents of this file are subject to the terms of the
5*f875b4ebSrica * Common Development and Distribution License (the "License").
6*f875b4ebSrica * You may not use this file except in compliance with the License.
7*f875b4ebSrica *
8*f875b4ebSrica * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*f875b4ebSrica * or http://www.opensolaris.org/os/licensing.
10*f875b4ebSrica * See the License for the specific language governing permissions
11*f875b4ebSrica * and limitations under the License.
12*f875b4ebSrica *
13*f875b4ebSrica * When distributing Covered Code, include this CDDL HEADER in each
14*f875b4ebSrica * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*f875b4ebSrica * If applicable, add the following below this CDDL HEADER, with the
16*f875b4ebSrica * fields enclosed by brackets "[]" replaced with your own identifying
17*f875b4ebSrica * information: Portions Copyright [yyyy] [name of copyright owner]
18*f875b4ebSrica *
19*f875b4ebSrica * CDDL HEADER END
20*f875b4ebSrica */
21*f875b4ebSrica
22*f875b4ebSrica /*
23*f875b4ebSrica * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
24*f875b4ebSrica * Use is subject to license terms.
25*f875b4ebSrica */
26*f875b4ebSrica
27*f875b4ebSrica #pragma ident "%Z%%M% %I% %E% SMI"
28*f875b4ebSrica
29*f875b4ebSrica /*
30*f875b4ebSrica * Add TSOL banner, trailer, page header/footers to a print job
31*f875b4ebSrica */
32*f875b4ebSrica
33*f875b4ebSrica /* system header files */
34*f875b4ebSrica
35*f875b4ebSrica #include <stdio.h>
36*f875b4ebSrica #include <stdlib.h>
37*f875b4ebSrica #include <string.h>
38*f875b4ebSrica #include <time.h>
39*f875b4ebSrica #include <limits.h>
40*f875b4ebSrica #include <errno.h>
41*f875b4ebSrica #include <signal.h>
42*f875b4ebSrica #include <locale.h>
43*f875b4ebSrica #include <tsol/label.h>
44*f875b4ebSrica
45*f875b4ebSrica /* typedefs */
46*f875b4ebSrica
47*f875b4ebSrica typedef int BOOL;
48*f875b4ebSrica
49*f875b4ebSrica /* constants */
50*f875b4ebSrica
51*f875b4ebSrica #ifndef FALSE
52*f875b4ebSrica #define FALSE 0
53*f875b4ebSrica #endif
54*f875b4ebSrica #ifndef TRUE
55*f875b4ebSrica #define TRUE 1
56*f875b4ebSrica #endif
57*f875b4ebSrica
58*f875b4ebSrica #define ME "lp.tsol_separator"
59*f875b4ebSrica #define POSTSCRIPTLIB "/usr/lib/lp/postscript"
60*f875b4ebSrica #define SEPARATORPS "tsol_separator.ps"
61*f875b4ebSrica #define BANNERPS "tsol_banner.ps"
62*f875b4ebSrica #define TRAILERPS "tsol_trailer.ps"
63*f875b4ebSrica #define MAXUSERLEN 32
64*f875b4ebSrica #define MAXHOSTLEN 32
65*f875b4ebSrica
66*f875b4ebSrica /* external variables */
67*f875b4ebSrica
68*f875b4ebSrica int optind; /* Used by getopt */
69*f875b4ebSrica char *optarg; /* Used by getopt */
70*f875b4ebSrica
71*f875b4ebSrica /* prototypes for static functions */
72*f875b4ebSrica
73*f875b4ebSrica static int ProcessArgs(int argc, char **argv);
74*f875b4ebSrica static void Usage(void);
75*f875b4ebSrica static void ParseUsername(char *input, char *user, char *host);
76*f875b4ebSrica static void EmitPSFile(const char *name);
77*f875b4ebSrica static BOOL EmitFile(FILE *file);
78*f875b4ebSrica static void EmitJobData(void);
79*f875b4ebSrica static void EmitPrologue(void);
80*f875b4ebSrica static void EmitCommandLineInfo(void);
81*f875b4ebSrica static void EmitClockBasedInfo(void);
82*f875b4ebSrica static void EmitLabelInfo(void);
83*f875b4ebSrica static void CopyStdin(void);
84*f875b4ebSrica
85*f875b4ebSrica /* static variables */
86*f875b4ebSrica
87*f875b4ebSrica static char *ArgSeparatorPS;
88*f875b4ebSrica static char *ArgBannerPS;
89*f875b4ebSrica static char *ArgTrailerPS;
90*f875b4ebSrica static char *ArgPSLib;
91*f875b4ebSrica static char *ArgPrinter;
92*f875b4ebSrica static char *ArgJobID;
93*f875b4ebSrica static char *ArgUser;
94*f875b4ebSrica static char *ArgTitle;
95*f875b4ebSrica static char *ArgFile;
96*f875b4ebSrica static BOOL ArgReverse;
97*f875b4ebSrica static BOOL ArgNoPageLabels;
98*f875b4ebSrica static int ArgDebugLevel;
99*f875b4ebSrica static FILE *ArgLogFile;
100*f875b4ebSrica static m_label_t *FileLabel;
101*f875b4ebSrica static char *remoteLabel;
102*f875b4ebSrica
103*f875b4ebSrica int
main(int argc,char * argv[])104*f875b4ebSrica main(int argc, char *argv[])
105*f875b4ebSrica {
106*f875b4ebSrica int err;
107*f875b4ebSrica /*
108*f875b4ebSrica * Run immune from typical interruptions, so that
109*f875b4ebSrica * we stand a chance to get the fault message.
110*f875b4ebSrica * EOF (or startup error) is the only way out.
111*f875b4ebSrica */
112*f875b4ebSrica (void) signal(SIGHUP, SIG_IGN);
113*f875b4ebSrica (void) signal(SIGINT, SIG_IGN);
114*f875b4ebSrica (void) signal(SIGQUIT, SIG_IGN);
115*f875b4ebSrica (void) signal(SIGTERM, SIG_IGN);
116*f875b4ebSrica
117*f875b4ebSrica (void) setlocale(LC_ALL, "");
118*f875b4ebSrica #if !defined(TEXT_DOMAIN)
119*f875b4ebSrica #define TEXT_DOMAIN "SYS_TEST"
120*f875b4ebSrica #endif
121*f875b4ebSrica (void) textdomain(TEXT_DOMAIN);
122*f875b4ebSrica
123*f875b4ebSrica if (ProcessArgs(argc, argv) != 0)
124*f875b4ebSrica exit(1);
125*f875b4ebSrica
126*f875b4ebSrica if ((FileLabel = m_label_alloc(MAC_LABEL)) == NULL)
127*f875b4ebSrica exit(1);
128*f875b4ebSrica /*
129*f875b4ebSrica * If the job was submitted via remotely, the label of the
130*f875b4ebSrica * remote peer will be set in the SLABEL environment variable
131*f875b4ebSrica * by copying it out of the SECURE structure.
132*f875b4ebSrica *
133*f875b4ebSrica * If there is no SLABEL value, the job was submitted locally
134*f875b4ebSrica * via the named pipe, and the file label can be determined
135*f875b4ebSrica * from its pathname.
136*f875b4ebSrica */
137*f875b4ebSrica if ((remoteLabel = getenv("SLABEL")) != NULL) {
138*f875b4ebSrica m_label_free(FileLabel);
139*f875b4ebSrica FileLabel = NULL;
140*f875b4ebSrica if (str_to_label(remoteLabel, &FileLabel, MAC_LABEL,
141*f875b4ebSrica L_NO_CORRECTION, &err) == -1) {
142*f875b4ebSrica perror("str_to_label");
143*f875b4ebSrica exit(1);
144*f875b4ebSrica }
145*f875b4ebSrica } else if (getlabel(ArgFile, FileLabel) != 0) {
146*f875b4ebSrica (void) fprintf(ArgLogFile,
147*f875b4ebSrica gettext("%1$s: cannot get label of %2$s: %3$s\n"),
148*f875b4ebSrica ME, ArgFile, strerror(errno));
149*f875b4ebSrica exit(1);
150*f875b4ebSrica }
151*f875b4ebSrica
152*f875b4ebSrica /* All of these functions exit if they encounter an error */
153*f875b4ebSrica EmitJobData();
154*f875b4ebSrica EmitPSFile(ArgSeparatorPS);
155*f875b4ebSrica if (ArgReverse)
156*f875b4ebSrica EmitPSFile(ArgTrailerPS);
157*f875b4ebSrica else
158*f875b4ebSrica EmitPSFile(ArgBannerPS);
159*f875b4ebSrica CopyStdin();
160*f875b4ebSrica if (ArgReverse)
161*f875b4ebSrica EmitPSFile(ArgBannerPS);
162*f875b4ebSrica else
163*f875b4ebSrica EmitPSFile(ArgTrailerPS);
164*f875b4ebSrica if (ArgDebugLevel >= 1)
165*f875b4ebSrica (void) fprintf(ArgLogFile, gettext("Done.\n"));
166*f875b4ebSrica m_label_free(FileLabel);
167*f875b4ebSrica return (0);
168*f875b4ebSrica }
169*f875b4ebSrica
170*f875b4ebSrica static void
EmitJobData(void)171*f875b4ebSrica EmitJobData(void)
172*f875b4ebSrica {
173*f875b4ebSrica EmitPrologue();
174*f875b4ebSrica EmitCommandLineInfo();
175*f875b4ebSrica EmitClockBasedInfo();
176*f875b4ebSrica EmitLabelInfo();
177*f875b4ebSrica
178*f875b4ebSrica /* Emit ending PostScript code */
179*f875b4ebSrica (void) printf("end\n\n");
180*f875b4ebSrica (void) printf("%%%% End of code generated by lp.tsol_separator\n\n");
181*f875b4ebSrica
182*f875b4ebSrica }
183*f875b4ebSrica
184*f875b4ebSrica static void
EmitPrologue(void)185*f875b4ebSrica EmitPrologue(void)
186*f875b4ebSrica {
187*f875b4ebSrica /* Emit preliminary PostScript code */
188*f875b4ebSrica (void) printf("%%!\n\n");
189*f875b4ebSrica (void) printf("%%%% Begin code generated by lp.tsol_separator\n\n");
190*f875b4ebSrica
191*f875b4ebSrica (void) printf("%%%% Create JobDict if it doesn't exist\n");
192*f875b4ebSrica (void) printf("userdict /JobDict known not {\n");
193*f875b4ebSrica (void) printf(" userdict /JobDict 100 dict put\n");
194*f875b4ebSrica (void) printf("} if\n\n");
195*f875b4ebSrica
196*f875b4ebSrica (void) printf("%%%% Define job parameters, including TSOL security "
197*f875b4ebSrica "info\n");
198*f875b4ebSrica (void) printf("JobDict\n");
199*f875b4ebSrica (void) printf("begin\n");
200*f875b4ebSrica }
201*f875b4ebSrica
202*f875b4ebSrica /* Emit parameters obtained from command line options */
203*f875b4ebSrica
204*f875b4ebSrica static void
EmitCommandLineInfo(void)205*f875b4ebSrica EmitCommandLineInfo(void)
206*f875b4ebSrica {
207*f875b4ebSrica char user[MAXUSERLEN + 1];
208*f875b4ebSrica char host[MAXHOSTLEN + 1];
209*f875b4ebSrica
210*f875b4ebSrica (void) printf("\t/Job_Printer (%s) def\n", ArgPrinter);
211*f875b4ebSrica ParseUsername(ArgUser, user, host);
212*f875b4ebSrica (void) printf("\t/Job_Host (%s) def\n", host);
213*f875b4ebSrica (void) printf("\t/Job_User (%s) def\n", user);
214*f875b4ebSrica (void) printf("\t/Job_JobID (%s) def\n", ArgJobID);
215*f875b4ebSrica (void) printf("\t/Job_Title (%s) def\n", ArgTitle);
216*f875b4ebSrica (void) printf("\t/Job_DoPageLabels (%s) def\n",
217*f875b4ebSrica ArgNoPageLabels ? "NO" : "YES");
218*f875b4ebSrica (void) printf("\n");
219*f875b4ebSrica }
220*f875b4ebSrica
221*f875b4ebSrica /* Emit parameters generated from the system clock */
222*f875b4ebSrica
223*f875b4ebSrica static void
EmitClockBasedInfo(void)224*f875b4ebSrica EmitClockBasedInfo(void)
225*f875b4ebSrica {
226*f875b4ebSrica char timebuf[80];
227*f875b4ebSrica struct timeval clockval;
228*f875b4ebSrica
229*f875b4ebSrica (void) gettimeofday(&clockval, NULL);
230*f875b4ebSrica (void) strftime(timebuf, sizeof (timebuf), NULL,
231*f875b4ebSrica localtime(&clockval.tv_sec));
232*f875b4ebSrica (void) printf("\t/Job_Date (%s) def\n", timebuf);
233*f875b4ebSrica (void) printf("\t/Job_Hash (%ld) def\n", clockval.tv_usec % 100000L);
234*f875b4ebSrica (void) printf("\n");
235*f875b4ebSrica }
236*f875b4ebSrica
237*f875b4ebSrica /* Emit parameters derived from the SL and IL of the file being printed. */
238*f875b4ebSrica
239*f875b4ebSrica static void
EmitLabelInfo(void)240*f875b4ebSrica EmitLabelInfo(void)
241*f875b4ebSrica {
242*f875b4ebSrica char *header = NULL; /* DIA banner page fields */
243*f875b4ebSrica char *label = NULL;
244*f875b4ebSrica char *caveats = NULL;
245*f875b4ebSrica char *channels = NULL;
246*f875b4ebSrica char *page_label = NULL; /* interior pages label */
247*f875b4ebSrica
248*f875b4ebSrica if (label_to_str(FileLabel, &header, PRINTER_TOP_BOTTOM,
249*f875b4ebSrica DEF_NAMES) != 0) {
250*f875b4ebSrica (void) fprintf(ArgLogFile,
251*f875b4ebSrica gettext("%s: label_to_str PRINTER_TOP_BOTTOM: %s.\n"),
252*f875b4ebSrica ME, strerror(errno));
253*f875b4ebSrica exit(1);
254*f875b4ebSrica }
255*f875b4ebSrica if (label_to_str(FileLabel, &label, PRINTER_LABEL,
256*f875b4ebSrica DEF_NAMES) != 0) {
257*f875b4ebSrica (void) fprintf(ArgLogFile,
258*f875b4ebSrica gettext("%s: label_to_str PRINTER_LABEL: %s.\n"),
259*f875b4ebSrica ME, strerror(errno));
260*f875b4ebSrica exit(1);
261*f875b4ebSrica }
262*f875b4ebSrica if (label_to_str(FileLabel, &caveats, PRINTER_CAVEATS,
263*f875b4ebSrica DEF_NAMES) != 0) {
264*f875b4ebSrica (void) fprintf(ArgLogFile,
265*f875b4ebSrica gettext("%s: label_to_str PRINTER_CAVEATS: %s.\n"),
266*f875b4ebSrica ME, strerror(errno));
267*f875b4ebSrica exit(1);
268*f875b4ebSrica }
269*f875b4ebSrica if (label_to_str(FileLabel, &channels, PRINTER_CHANNELS,
270*f875b4ebSrica DEF_NAMES) != 0) {
271*f875b4ebSrica (void) fprintf(ArgLogFile,
272*f875b4ebSrica gettext("%s: label_to_str PRINTER_CHANNELS: %s.\n"),
273*f875b4ebSrica ME, strerror(errno));
274*f875b4ebSrica exit(1);
275*f875b4ebSrica }
276*f875b4ebSrica if (label_to_str(FileLabel, &page_label, M_LABEL,
277*f875b4ebSrica LONG_NAMES) != 0) {
278*f875b4ebSrica (void) fprintf(ArgLogFile,
279*f875b4ebSrica gettext("%s: label_to_str M_LABEL: %s.\n"),
280*f875b4ebSrica ME, strerror(errno));
281*f875b4ebSrica exit(1);
282*f875b4ebSrica }
283*f875b4ebSrica
284*f875b4ebSrica (void) printf("\t/Job_Classification (%s) def\n", header);
285*f875b4ebSrica (void) printf("\t/Job_Protect (%s) def\n", label);
286*f875b4ebSrica (void) printf("\t/Job_Caveats (%s) def\n", caveats);
287*f875b4ebSrica (void) printf("\t/Job_Channels (%s) def\n", channels);
288*f875b4ebSrica (void) printf("\t/Job_SL_Internal (%s) def\n", page_label);
289*f875b4ebSrica
290*f875b4ebSrica /* Free memory allocated label_to_str */
291*f875b4ebSrica free(header);
292*f875b4ebSrica free(label);
293*f875b4ebSrica free(caveats);
294*f875b4ebSrica free(channels);
295*f875b4ebSrica free(page_label);
296*f875b4ebSrica }
297*f875b4ebSrica
298*f875b4ebSrica /*
299*f875b4ebSrica * Parse input "host!user" to separate host and user names.
300*f875b4ebSrica */
301*f875b4ebSrica
302*f875b4ebSrica static void
ParseUsername(char * input,char * user,char * host)303*f875b4ebSrica ParseUsername(char *input, char *user, char *host)
304*f875b4ebSrica {
305*f875b4ebSrica char *cp;
306*f875b4ebSrica
307*f875b4ebSrica if ((cp = strchr(input, '@')) != NULL) {
308*f875b4ebSrica /* user@host */
309*f875b4ebSrica (void) strlcpy(host, cp + 1, MAXHOSTLEN + 1);
310*f875b4ebSrica *cp = '\0';
311*f875b4ebSrica (void) strlcpy(user, input, MAXUSERLEN + 1);
312*f875b4ebSrica *cp = '@';
313*f875b4ebSrica } else if ((cp = strchr(input, '!')) != NULL) {
314*f875b4ebSrica /* host!user */
315*f875b4ebSrica (void) strlcpy(user, cp + 1, MAXUSERLEN + 1);
316*f875b4ebSrica *cp = '\0';
317*f875b4ebSrica (void) strlcpy(host, input, MAXHOSTLEN + 1);
318*f875b4ebSrica *cp = '!';
319*f875b4ebSrica } else {
320*f875b4ebSrica /* user */
321*f875b4ebSrica (void) strlcpy(user, input, MAXUSERLEN + 1);
322*f875b4ebSrica host[0] = '\0';
323*f875b4ebSrica }
324*f875b4ebSrica }
325*f875b4ebSrica
326*f875b4ebSrica
327*f875b4ebSrica static void
CopyStdin(void)328*f875b4ebSrica CopyStdin(void)
329*f875b4ebSrica {
330*f875b4ebSrica if (!EmitFile(stdin)) {
331*f875b4ebSrica (void) fprintf(ArgLogFile,
332*f875b4ebSrica gettext("%s: Error copying stdin to stdout\n"), ME);
333*f875b4ebSrica exit(1);
334*f875b4ebSrica }
335*f875b4ebSrica }
336*f875b4ebSrica
337*f875b4ebSrica
338*f875b4ebSrica static BOOL
EmitFile(FILE * file)339*f875b4ebSrica EmitFile(FILE *file)
340*f875b4ebSrica {
341*f875b4ebSrica int len;
342*f875b4ebSrica #define BUFLEN 1024
343*f875b4ebSrica char buf[BUFLEN];
344*f875b4ebSrica
345*f875b4ebSrica while ((len = fread(buf, 1, BUFLEN, file)) > 0) {
346*f875b4ebSrica if (fwrite(buf, 1, len, stdout) != len)
347*f875b4ebSrica return (FALSE);
348*f875b4ebSrica }
349*f875b4ebSrica if (!feof(file))
350*f875b4ebSrica return (FALSE);
351*f875b4ebSrica return (TRUE);
352*f875b4ebSrica }
353*f875b4ebSrica
354*f875b4ebSrica
355*f875b4ebSrica static void
EmitPSFile(const char * name)356*f875b4ebSrica EmitPSFile(const char *name)
357*f875b4ebSrica {
358*f875b4ebSrica char path[PATH_MAX];
359*f875b4ebSrica FILE *file;
360*f875b4ebSrica BOOL emitted;
361*f875b4ebSrica
362*f875b4ebSrica if (name[0] != '/') {
363*f875b4ebSrica (void) strlcpy(path, ArgPSLib, sizeof (path));
364*f875b4ebSrica (void) strlcat(path, "/", sizeof (path));
365*f875b4ebSrica (void) strlcat(path, name, sizeof (path));
366*f875b4ebSrica } else {
367*f875b4ebSrica (void) strlcpy(path, name, sizeof (path));
368*f875b4ebSrica }
369*f875b4ebSrica
370*f875b4ebSrica file = fopen(path, "r");
371*f875b4ebSrica if (file == NULL) {
372*f875b4ebSrica (void) fprintf(ArgLogFile,
373*f875b4ebSrica gettext("%s: Error opening PostScript file %s. %s.\n"),
374*f875b4ebSrica ME, path, strerror(errno));
375*f875b4ebSrica exit(1);
376*f875b4ebSrica }
377*f875b4ebSrica
378*f875b4ebSrica emitted = EmitFile(file);
379*f875b4ebSrica (void) fclose(file);
380*f875b4ebSrica if (!emitted) {
381*f875b4ebSrica (void) fprintf(ArgLogFile, gettext(
382*f875b4ebSrica "%s: Error copying PostScript file %s to stdout.\n"),
383*f875b4ebSrica ME, path);
384*f875b4ebSrica exit(1);
385*f875b4ebSrica }
386*f875b4ebSrica }
387*f875b4ebSrica
388*f875b4ebSrica
389*f875b4ebSrica static int
ProcessArgs(int argc,char * argv[])390*f875b4ebSrica ProcessArgs(int argc, char *argv[])
391*f875b4ebSrica {
392*f875b4ebSrica int option_letter;
393*f875b4ebSrica char *options_string = "lrd:e:s:b:t:L:";
394*f875b4ebSrica
395*f875b4ebSrica /* set default values for arguments */
396*f875b4ebSrica ArgSeparatorPS = SEPARATORPS;
397*f875b4ebSrica ArgBannerPS = BANNERPS;
398*f875b4ebSrica ArgTrailerPS = TRAILERPS;
399*f875b4ebSrica ArgPSLib = POSTSCRIPTLIB;
400*f875b4ebSrica ArgNoPageLabels = ArgReverse = FALSE;
401*f875b4ebSrica ArgDebugLevel = 0;
402*f875b4ebSrica ArgLogFile = stderr;
403*f875b4ebSrica
404*f875b4ebSrica /* read switch arguments once to get error log file */
405*f875b4ebSrica while ((option_letter = getopt(argc, argv, options_string)) != EOF) {
406*f875b4ebSrica switch (option_letter) {
407*f875b4ebSrica case 'd':
408*f875b4ebSrica ArgDebugLevel = atoi(optarg);
409*f875b4ebSrica break;
410*f875b4ebSrica case 'e':
411*f875b4ebSrica ArgLogFile = fopen(optarg, "a");
412*f875b4ebSrica if (ArgLogFile == NULL) {
413*f875b4ebSrica (void) fprintf(stderr,
414*f875b4ebSrica gettext("Cannot open log file %s\n"),
415*f875b4ebSrica optarg);
416*f875b4ebSrica return (-1);
417*f875b4ebSrica }
418*f875b4ebSrica break;
419*f875b4ebSrica case '?': /* ? or unrecognized option */
420*f875b4ebSrica Usage();
421*f875b4ebSrica return (-1);
422*f875b4ebSrica }
423*f875b4ebSrica }
424*f875b4ebSrica
425*f875b4ebSrica if (ArgDebugLevel > 0)
426*f875b4ebSrica (void) fprintf(ArgLogFile,
427*f875b4ebSrica gettext("Processing switch arguments\n"));
428*f875b4ebSrica
429*f875b4ebSrica /* re-read switch arguments */
430*f875b4ebSrica optind = 1;
431*f875b4ebSrica while ((option_letter = getopt(argc, argv, options_string)) != EOF) {
432*f875b4ebSrica switch (option_letter) {
433*f875b4ebSrica case 'd':
434*f875b4ebSrica ArgDebugLevel = atoi(optarg);
435*f875b4ebSrica break;
436*f875b4ebSrica case 'e':
437*f875b4ebSrica /* This was handled in earlier pass through args */
438*f875b4ebSrica break;
439*f875b4ebSrica case 'l':
440*f875b4ebSrica ArgNoPageLabels = TRUE;
441*f875b4ebSrica break;
442*f875b4ebSrica case 'r':
443*f875b4ebSrica ArgReverse = TRUE;
444*f875b4ebSrica break;
445*f875b4ebSrica case 's':
446*f875b4ebSrica ArgSeparatorPS = optarg;
447*f875b4ebSrica break;
448*f875b4ebSrica case 'b':
449*f875b4ebSrica ArgBannerPS = optarg;
450*f875b4ebSrica break;
451*f875b4ebSrica case 't':
452*f875b4ebSrica ArgTrailerPS = optarg;
453*f875b4ebSrica break;
454*f875b4ebSrica case 'L':
455*f875b4ebSrica ArgPSLib = optarg;
456*f875b4ebSrica break;
457*f875b4ebSrica case '?': /* ? or unrecognized option */
458*f875b4ebSrica Usage();
459*f875b4ebSrica return (-1);
460*f875b4ebSrica }
461*f875b4ebSrica }
462*f875b4ebSrica
463*f875b4ebSrica /* Adjust arguments to skip over options */
464*f875b4ebSrica argc -= optind; /* Number of remaining(non-switch) args */
465*f875b4ebSrica argv += optind; /* argv[0] is first(non-switch) args */
466*f875b4ebSrica
467*f875b4ebSrica if (argc != 5) {
468*f875b4ebSrica (void) fprintf(ArgLogFile,
469*f875b4ebSrica gettext("Wrong number of arguments.\n\n"));
470*f875b4ebSrica Usage();
471*f875b4ebSrica return (-1);
472*f875b4ebSrica }
473*f875b4ebSrica
474*f875b4ebSrica ArgPrinter = argv++[0];
475*f875b4ebSrica ArgJobID = argv++[0];
476*f875b4ebSrica ArgUser = argv++[0];
477*f875b4ebSrica ArgTitle = argv++[0];
478*f875b4ebSrica ArgFile = argv++[0];
479*f875b4ebSrica
480*f875b4ebSrica if (ArgDebugLevel >= 1) {
481*f875b4ebSrica (void) fprintf(ArgLogFile, gettext("Arguments processed\n"));
482*f875b4ebSrica (void) fprintf(ArgLogFile, gettext("Printer: %s\n"),
483*f875b4ebSrica ArgPrinter);
484*f875b4ebSrica (void) fprintf(ArgLogFile, gettext("Job ID: %s\n"), ArgJobID);
485*f875b4ebSrica (void) fprintf(ArgLogFile, gettext("User: %s\n"), ArgUser);
486*f875b4ebSrica (void) fprintf(ArgLogFile, gettext("Title: %s\n"), ArgTitle);
487*f875b4ebSrica (void) fprintf(ArgLogFile, gettext("File: %s\n"), ArgFile);
488*f875b4ebSrica }
489*f875b4ebSrica
490*f875b4ebSrica return (0);
491*f875b4ebSrica }
492*f875b4ebSrica
493*f875b4ebSrica
494*f875b4ebSrica static void
Usage(void)495*f875b4ebSrica Usage(void)
496*f875b4ebSrica {
497*f875b4ebSrica static const char *OPTFMT = " %-8s %-9s %s\n";
498*f875b4ebSrica
499*f875b4ebSrica (void) fprintf(ArgLogFile,
500*f875b4ebSrica gettext("Usage: lp.tsol_separator [OPTIONS] %s\n"),
501*f875b4ebSrica gettext("PRINTER JOBID HOST!USER TITLE FILE"));
502*f875b4ebSrica (void) fprintf(ArgLogFile, gettext(" OPTIONS:\n"));
503*f875b4ebSrica (void) fprintf(ArgLogFile, OPTFMT, "-r", gettext("Reverse"),
504*f875b4ebSrica gettext("Reverse banner/trailer order"));
505*f875b4ebSrica (void) fprintf(ArgLogFile, OPTFMT, "-l", gettext("Labels"),
506*f875b4ebSrica gettext("Suppress page header/footer labels"));
507*f875b4ebSrica (void) fprintf(ArgLogFile, OPTFMT, gettext("-b FILE"),
508*f875b4ebSrica gettext("Banner"),
509*f875b4ebSrica gettext("PostScript program for banner (default tsol_banner.ps)"));
510*f875b4ebSrica (void) fprintf(ArgLogFile, OPTFMT, gettext("-s FILE"),
511*f875b4ebSrica gettext("Separator"),
512*f875b4ebSrica gettext("PostScript program for separator "
513*f875b4ebSrica "(default tsol_separator.ps)"));
514*f875b4ebSrica (void) fprintf(ArgLogFile, OPTFMT, gettext("-t FILE"),
515*f875b4ebSrica gettext("Trailer"),
516*f875b4ebSrica gettext("PostScript program for trailer "
517*f875b4ebSrica "(default tsol_trailer.ps)"));
518*f875b4ebSrica (void) fprintf(ArgLogFile, OPTFMT, gettext("-L DIR"),
519*f875b4ebSrica gettext("Library"),
520*f875b4ebSrica gettext("Directory to search for PostScript programs"));
521*f875b4ebSrica (void) fprintf(ArgLogFile, OPTFMT, "", "",
522*f875b4ebSrica gettext("(default /usr/lib/lp/postscript)"));
523*f875b4ebSrica (void) fprintf(ArgLogFile, OPTFMT, gettext("-d N"), gettext("Debug"),
524*f875b4ebSrica gettext("Set debug level to N"));
525*f875b4ebSrica (void) fprintf(ArgLogFile, OPTFMT, gettext("-e FILE"),
526*f875b4ebSrica gettext("Error File"),
527*f875b4ebSrica gettext("Append error and debugging output to FILE"));
528*f875b4ebSrica }
529