1 /*
2  * Printer interface for DOS.
3  * Copyright (c) 1996-2001 Markku Rossi.
4  *
5  * Author: Markku Rossi <mtr@iki.fi>
6  */
7 
8 /*
9  * This file is part of GNU Enscript.
10  *
11  * Enscript is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation, either version 3 of the License, or
14  * (at your option) any later version.
15  *
16  * Enscript is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with Enscript.  If not, see <http://www.gnu.org/licenses/>.
23  */
24 
25 #include "gsint.h"
26 
27 /************************** Types and definitions ***************************/
28 
29 struct PrinterCtxRec
30 {
31   /* Output stream. */
32   FILE *fp;
33 
34   /* If using temporary file, this is its name. */
35   char tmpfile[512];
36 
37   /* Command to spool the temporary output.  This is NULL if we
38      already spooled the output to `fp' and there is no
39      post-processing to do. */
40   Buffer *command;
41 };
42 
43 typedef struct PrinterCtxRec PrinterCtxStruct;
44 typedef struct PrinterCtxRec *PrinterCtx;
45 
46 
47 /***************************** Global functions *****************************/
48 
49 FILE *
printer_open(char * cmd,char * options,char * queue_param,char * printer_name,void ** context_return)50 printer_open(char *cmd, char *options, char *queue_param, char *printer_name,
51 	     void **context_return)
52 {
53   PrinterCtx ctx;
54 
55   ctx = xcalloc(1, sizeof(*ctx));
56 
57   if (cmd && cmd[0])
58     {
59       if (tmpnam(ctx->tmpfile) == NULL)
60 	FATAL((stderr, _("could not create temporary spool file name: %s"),
61 	       strerror(errno)));
62 
63       /* Spool output to a temporary file and spool with with command
64 	 when the printer is closed. */
65 
66       ctx->command = buffer_alloc();
67 
68       buffer_append(ctx->command, cmd);
69       buffer_append(ctx->command, " ");
70 
71       if (options)
72 	{
73 	  buffer_append(ctx->command, options);
74 	  buffer_append(ctx->command, " ");
75 	}
76 
77       if (printer_name)
78 	{
79 	  buffer_append(ctx->command, queue_param);
80 	  buffer_append(ctx->command, printer_name);
81 	  buffer_append(ctx->command, " ");
82 	}
83 
84       buffer_append(ctx->command, ctx->tmpfile);
85 
86       /* Open the temporary spool file. */
87       ctx->fp = fopen(ctx->tmpfile, "wb");
88       if (ctx->fp == NULL)
89 	FATAL((stderr, _("Could not open temporary spool file `%s': %s"),
90 	       ctx->tmpfile, strerror(errno)));
91     }
92   else
93     {
94       /* Just open file pointer to the printer. */
95       ctx->fp = fopen(printer_name, "wb");
96       if (ctx->fp == NULL)
97 	FATAL((stderr, _("Could not open printer `%s': %s"), printer_name,
98 	      strerror(errno)));
99     }
100 
101   *context_return = ctx;
102 
103   return ctx->fp;
104 }
105 
106 
107 void
printer_close(void * context)108 printer_close(void *context)
109 {
110   PrinterCtx ctx = (PrinterCtx) context;
111 
112   /* Close the output stream. */
113   fclose(ctx->fp);
114 
115   /* Do we need to do post-processing (read spooling). */
116   if (ctx->command)
117     {
118       /* Yes. */
119       if (system(buffer_ptr(ctx->command)) == -1)
120 	FATAL((stderr, _("Could not spool temporary output `%s': %s"),
121 	       ctx->tmpfile, strerror(errno)));
122 
123       /* We do not need the spool command anymore. */
124       buffer_free(ctx->command);
125 
126       /* Unlink the temporary output file. */
127       (void) remove(ctx->tmpfile);
128     }
129 
130   /* Free context. */
131   xfree(ctx);
132 }
133