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.
25 /****************************************************************************
26 run a given print command
27 a null terminated list of value/substitute pairs is provided
28 for local substitution strings
29 ****************************************************************************/
30 static int print_run_command(int snum
, const char* printername
, BOOL do_sub
,
31 const char *command
, int *outfd
, ...)
40 /* check for a valid system printername and valid command to run */
42 if ( !printername
|| !*printername
)
45 if (!command
|| !*command
)
48 pstrcpy(syscmd
, command
);
50 while ((arg
= va_arg(ap
, char *))) {
51 char *value
= va_arg(ap
,char *);
52 pstring_sub(syscmd
, arg
, value
);
56 pstring_sub( syscmd
, "%p", printername
);
58 if ( do_sub
&& snum
!= -1 )
59 standard_sub_snum(snum
,syscmd
,sizeof(syscmd
));
61 ret
= smbrun(syscmd
,outfd
);
63 DEBUG(3,("Running the command `%s' gave %d\n",syscmd
,ret
));
69 /****************************************************************************
71 ****************************************************************************/
72 static int generic_job_delete( const char *sharename
, const char *lprm_command
, struct printjob
*pjob
)
76 /* need to delete the spooled entry */
77 slprintf(jobstr
, sizeof(jobstr
)-1, "%d", pjob
->sysjob
);
78 return print_run_command( -1, sharename
, False
, lprm_command
, NULL
,
80 "%T", http_timestring(pjob
->starttime
),
84 /****************************************************************************
86 ****************************************************************************/
87 static int generic_job_pause(int snum
, struct printjob
*pjob
)
91 /* need to pause the spooled entry */
92 slprintf(jobstr
, sizeof(jobstr
)-1, "%d", pjob
->sysjob
);
93 return print_run_command(snum
, PRINTERNAME(snum
), True
,
94 lp_lppausecommand(snum
), NULL
,
99 /****************************************************************************
101 ****************************************************************************/
102 static int generic_job_resume(int snum
, struct printjob
*pjob
)
106 /* need to pause the spooled entry */
107 slprintf(jobstr
, sizeof(jobstr
)-1, "%d", pjob
->sysjob
);
108 return print_run_command(snum
, PRINTERNAME(snum
), True
,
109 lp_lpresumecommand(snum
), NULL
,
114 /****************************************************************************
115 Submit a file for printing - called from print_job_end()
116 ****************************************************************************/
118 static int generic_job_submit(int snum
, struct printjob
*pjob
)
121 pstring current_directory
;
122 pstring print_directory
;
125 fstring job_page_count
, job_size
;
127 /* we print from the directory path to give the best chance of
128 parsing the lpq output */
129 wd
= sys_getwd(current_directory
);
133 pstrcpy(print_directory
, pjob
->filename
);
134 p
= strrchr_m(print_directory
,'/');
139 if (chdir(print_directory
) != 0)
142 pstrcpy(jobname
, pjob
->jobname
);
143 pstring_sub(jobname
, "'", "_");
144 slprintf(job_page_count
, sizeof(job_page_count
)-1, "%d", pjob
->page_count
);
145 slprintf(job_size
, sizeof(job_size
)-1, "%lu", (unsigned long)pjob
->size
);
147 /* send it to the system spooler */
148 ret
= print_run_command(snum
, PRINTERNAME(snum
), True
,
149 lp_printcommand(snum
), NULL
,
154 "%c", job_page_count
,
163 /****************************************************************************
164 get the current list of queued jobs
165 ****************************************************************************/
166 static int generic_queue_get(const char *printer_name
,
167 enum printing_types printing_type
,
169 print_queue_struct
**q
,
170 print_status_struct
*status
)
174 int numlines
, i
, qcount
;
175 print_queue_struct
*queue
= NULL
;
177 /* never do substitution when running the 'lpq command' since we can't
178 get it rigt when using the background update daemon. Make the caller
179 do it before passing off the command string to us here. */
181 print_run_command(-1, printer_name
, False
, lpq_command
, &fd
, NULL
);
184 DEBUG(5,("generic_queue_get: Can't read print queue status for printer %s\n",
190 qlines
= fd_lines_load(fd
, &numlines
,0);
193 /* turn the lpq output into a series of job structures */
195 ZERO_STRUCTP(status
);
197 queue
= SMB_MALLOC_ARRAY(print_queue_struct
, numlines
+1);
199 file_lines_free(qlines
);
203 memset(queue
, '\0', sizeof(print_queue_struct
)*(numlines
+1));
205 for (i
=0; i
<numlines
; i
++) {
207 if (parse_lpq_entry(printing_type
,qlines
[i
],
208 &queue
[qcount
],status
,qcount
==0)) {
214 file_lines_free(qlines
);
219 /****************************************************************************
221 ****************************************************************************/
222 static int generic_queue_pause(int snum
)
224 return print_run_command(snum
, PRINTERNAME(snum
), True
, lp_queuepausecommand(snum
), NULL
, NULL
);
227 /****************************************************************************
229 ****************************************************************************/
230 static int generic_queue_resume(int snum
)
232 return print_run_command(snum
, PRINTERNAME(snum
), True
, lp_queueresumecommand(snum
), NULL
, NULL
);
235 /****************************************************************************
236 * Generic printing interface definitions...
237 ***************************************************************************/
239 struct printif generic_printif
=
244 generic_queue_resume
,