2 Unix SMB/CIFS implementation.
3 printing command routines
4 Copyright (C) Andrew Tridgell 1992-2000
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 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 pstring_sub(syscmd
, "%p", PRINTERNAME(snum
));
80 standard_sub_snum(snum
,syscmd
,sizeof(syscmd
));
82 ret
= smbrun(syscmd
,outfd
);
84 DEBUG(3,("Running the command `%s' gave %d\n",syscmd
,ret
));
90 /****************************************************************************
92 ****************************************************************************/
93 static int generic_job_delete(int snum
, struct printjob
*pjob
)
97 /* need to delete the spooled entry */
98 slprintf(jobstr
, sizeof(jobstr
)-1, "%d", pjob
->sysjob
);
99 return print_run_command(
101 lp_lprmcommand(snum
), NULL
,
103 "%T", http_timestring(pjob
->starttime
),
107 /****************************************************************************
109 ****************************************************************************/
110 static int generic_job_pause(int snum
, struct printjob
*pjob
)
114 /* need to pause the spooled entry */
115 slprintf(jobstr
, sizeof(jobstr
)-1, "%d", pjob
->sysjob
);
116 return print_run_command(snum
,
117 lp_lppausecommand(snum
), NULL
,
122 /****************************************************************************
124 ****************************************************************************/
125 static int generic_job_resume(int snum
, struct printjob
*pjob
)
129 /* need to pause the spooled entry */
130 slprintf(jobstr
, sizeof(jobstr
)-1, "%d", pjob
->sysjob
);
131 return print_run_command(snum
,
132 lp_lpresumecommand(snum
), NULL
,
137 /****************************************************************************
138 Submit a file for printing - called from print_job_end()
139 ****************************************************************************/
141 static int generic_job_submit(int snum
, struct printjob
*pjob
)
144 pstring current_directory
;
145 pstring print_directory
;
148 fstring job_page_count
, job_size
;
150 /* we print from the directory path to give the best chance of
151 parsing the lpq output */
152 wd
= sys_getwd(current_directory
);
156 pstrcpy(print_directory
, pjob
->filename
);
157 p
= strrchr_m(print_directory
,'/');
162 if (chdir(print_directory
) != 0)
165 pstrcpy(jobname
, pjob
->jobname
);
166 pstring_sub(jobname
, "'", "_");
167 slprintf(job_page_count
, sizeof(job_page_count
)-1, "%d", pjob
->page_count
);
168 slprintf(job_size
, sizeof(job_size
)-1, "%lu", (unsigned long)pjob
->size
);
170 /* send it to the system spooler */
171 ret
= print_run_command(snum
,
172 lp_printcommand(snum
), NULL
,
177 "%c", job_page_count
,
186 /****************************************************************************
187 get the current list of queued jobs
188 ****************************************************************************/
189 static int generic_queue_get(int snum
, print_queue_struct
**q
, print_status_struct
*status
)
193 int numlines
, i
, qcount
;
194 print_queue_struct
*queue
= NULL
;
195 fstring printer_name
;
197 fstrcpy(printer_name
, lp_servicename(snum
));
199 print_run_command(snum
, lp_lpqcommand(snum
), &fd
, NULL
);
202 DEBUG(5,("generic_queue_get: Can't read print queue status for printer %s\n",
208 qlines
= fd_lines_load(fd
, &numlines
);
211 /* turn the lpq output into a series of job structures */
213 ZERO_STRUCTP(status
);
215 queue
= (print_queue_struct
*)malloc(sizeof(print_queue_struct
)*(numlines
+1));
218 memset(queue
, '\0', sizeof(print_queue_struct
)*(numlines
+1));
219 for (i
=0; i
<numlines
; i
++) {
221 if (parse_lpq_entry(snum
,qlines
[i
],
222 &queue
[qcount
],status
,qcount
==0)) {
227 file_lines_free(qlines
);
233 /****************************************************************************
235 ****************************************************************************/
236 static int generic_queue_pause(int snum
)
238 return print_run_command(snum
, lp_queuepausecommand(snum
), NULL
, NULL
);
241 /****************************************************************************
243 ****************************************************************************/
244 static int generic_queue_resume(int snum
)
246 return print_run_command(snum
, lp_queueresumecommand(snum
), NULL
, NULL
);