2 Unix SMB/Netbios implementation.
4 printing command routines
5 Copyright (C) Andrew Tridgell 1992-2000
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 * Generic printing interface definitions...
29 static int generic_job_delete(int snum
, struct printjob
*pjob
);
30 static int generic_job_pause(int snum
, struct printjob
*pjob
);
31 static int generic_job_resume(int snum
, struct printjob
*pjob
);
32 static int generic_job_submit(int snum
, struct printjob
*pjob
);
33 static int generic_queue_get(int snum
, print_queue_struct
**q
,
34 print_status_struct
*status
);
35 static int generic_queue_pause(int snum
);
36 static int generic_queue_resume(int snum
);
39 struct printif generic_printif
=
50 /****************************************************************************
51 run a given print command
52 a null terminated list of value/substitute pairs is provided
53 for local substitution strings
54 ****************************************************************************/
55 static int print_run_command(int snum
,char *command
, int *outfd
, ...)
64 if (!command
|| !*command
) return -1;
66 if (!VALID_SNUM(snum
)) {
67 DEBUG(0,("Invalid snum %d for command %s\n", snum
, command
));
71 pstrcpy(syscmd
, command
);
73 while ((arg
= va_arg(ap
, char *))) {
74 char *value
= va_arg(ap
,char *);
75 pstring_sub(syscmd
, arg
, value
);
79 p
= PRINTERNAME(snum
);
81 pstring_sub(syscmd
, "%p", p
);
82 standard_sub_snum(snum
,syscmd
,sizeof(syscmd
));
84 /* Convert script args to unix-codepage */
86 ret
= smbrun(syscmd
,outfd
);
88 DEBUG(3,("Running the command `%s' gave %d\n",syscmd
,ret
));
94 /****************************************************************************
96 ****************************************************************************/
97 static int generic_job_delete(int snum
, struct printjob
*pjob
)
101 /* need to delete the spooled entry */
102 slprintf(jobstr
, sizeof(jobstr
)-1, "%d", pjob
->sysjob
);
103 return print_run_command(
105 lp_lprmcommand(snum
), NULL
,
107 "%T", http_timestring(pjob
->starttime
),
111 /****************************************************************************
113 ****************************************************************************/
114 static int generic_job_pause(int snum
, struct printjob
*pjob
)
118 /* need to pause the spooled entry */
119 slprintf(jobstr
, sizeof(jobstr
)-1, "%d", pjob
->sysjob
);
120 return print_run_command(snum
,
121 lp_lppausecommand(snum
), NULL
,
126 /****************************************************************************
128 ****************************************************************************/
129 static int generic_job_resume(int snum
, struct printjob
*pjob
)
133 /* need to pause the spooled entry */
134 slprintf(jobstr
, sizeof(jobstr
)-1, "%d", pjob
->sysjob
);
135 return print_run_command(snum
,
136 lp_lpresumecommand(snum
), NULL
,
141 /****************************************************************************
142 Submit a file for printing - called from print_job_end()
143 ****************************************************************************/
145 static int generic_job_submit(int snum
, struct printjob
*pjob
)
148 pstring current_directory
;
149 pstring print_directory
;
152 fstring job_page_count
, job_size
;
154 /* we print from the directory path to give the best chance of
155 parsing the lpq output */
156 wd
= sys_getwd(current_directory
);
160 pstrcpy(print_directory
, pjob
->filename
);
161 p
= strrchr(print_directory
,'/');
166 if (chdir(print_directory
) != 0)
169 pstrcpy(jobname
, pjob
->jobname
);
170 pstring_sub(jobname
, "'", "_");
171 slprintf(job_page_count
, sizeof(job_page_count
)-1, "%d", pjob
->page_count
);
172 slprintf(job_size
, sizeof(job_size
)-1, "%d", pjob
->size
);
174 /* send it to the system spooler */
175 ret
= print_run_command(snum
,
176 lp_printcommand(snum
), NULL
,
181 "%c", job_page_count
,
190 /****************************************************************************
191 get the current list of queued jobs
192 ****************************************************************************/
193 static int generic_queue_get(int snum
, print_queue_struct
**q
, print_status_struct
*status
)
197 int numlines
, i
, qcount
;
198 print_queue_struct
*queue
= NULL
;
199 fstring printer_name
;
201 /* Convert printer name (i.e. share name) to unix-codepage */
202 fstrcpy(printer_name
, lp_servicename(snum
));
203 dos_to_unix(printer_name
);
205 print_run_command(snum
, lp_lpqcommand(snum
), &fd
, NULL
);
208 DEBUG(5,("generic_queue_get: Can't read print queue status for printer %s\n",
214 qlines
= fd_lines_load(fd
, &numlines
, True
);
217 /* turn the lpq output into a series of job structures */
219 ZERO_STRUCTP(status
);
221 queue
= (print_queue_struct
*)malloc(sizeof(print_queue_struct
)*(numlines
+1));
224 for (i
=0; i
<numlines
; i
++) {
226 if (parse_lpq_entry(snum
,qlines
[i
],
227 &queue
[qcount
],status
,qcount
==0)) {
232 file_lines_free(qlines
);
238 /****************************************************************************
240 ****************************************************************************/
241 static int generic_queue_pause(int snum
)
243 return print_run_command(snum
, lp_queuepausecommand(snum
), NULL
, NULL
);
246 /****************************************************************************
248 ****************************************************************************/
249 static int generic_queue_resume(int snum
)
251 return print_run_command(snum
, lp_queueresumecommand(snum
), NULL
, NULL
);