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 3 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.
24 extern struct current_user current_user;
25 extern userdom_struct current_user_info;
27 /****************************************************************************
28 run a given print command
29 a null terminated list of value/substitute pairs is provided
30 for local substitution strings
31 ****************************************************************************/
32 static int print_run_command(int snum, const char* printername, BOOL do_sub,
33 const char *command, int *outfd, ...)
41 /* check for a valid system printername and valid command to run */
43 if ( !printername || !*printername )
46 if (!command || !*command)
49 pstrcpy(syscmd, command);
51 while ((arg = va_arg(ap, char *))) {
52 char *value = va_arg(ap,char *);
53 pstring_sub(syscmd, arg, value);
57 pstring_sub( syscmd, "%p", printername );
59 if ( do_sub && snum != -1 )
60 standard_sub_advanced(lp_servicename(snum),
61 current_user_info.unix_name, "",
63 get_current_username(),
64 current_user_info.domain,
65 syscmd, sizeof(syscmd));
67 ret = smbrun_no_sanitize(syscmd,outfd);
69 DEBUG(3,("Running the command `%s' gave %d\n",syscmd,ret));
75 /****************************************************************************
77 ****************************************************************************/
78 static int generic_job_delete( const char *sharename, const char *lprm_command, struct printjob *pjob)
82 /* need to delete the spooled entry */
83 slprintf(jobstr, sizeof(jobstr)-1, "%d", pjob->sysjob);
84 return print_run_command( -1, sharename, False, lprm_command, NULL,
86 "%T", http_timestring(pjob->starttime),
90 /****************************************************************************
92 ****************************************************************************/
93 static int generic_job_pause(int snum, struct printjob *pjob)
97 /* need to pause the spooled entry */
98 slprintf(jobstr, sizeof(jobstr)-1, "%d", pjob->sysjob);
99 return print_run_command(snum, PRINTERNAME(snum), True,
100 lp_lppausecommand(snum), NULL,
105 /****************************************************************************
107 ****************************************************************************/
108 static int generic_job_resume(int snum, struct printjob *pjob)
112 /* need to pause the spooled entry */
113 slprintf(jobstr, sizeof(jobstr)-1, "%d", pjob->sysjob);
114 return print_run_command(snum, PRINTERNAME(snum), True,
115 lp_lpresumecommand(snum), NULL,
120 /****************************************************************************
121 Submit a file for printing - called from print_job_end()
122 ****************************************************************************/
124 static int generic_job_submit(int snum, struct printjob *pjob)
127 pstring current_directory;
128 pstring print_directory;
131 fstring job_page_count, job_size;
133 /* we print from the directory path to give the best chance of
134 parsing the lpq output */
135 wd = sys_getwd(current_directory);
139 pstrcpy(print_directory, pjob->filename);
140 p = strrchr_m(print_directory,'/');
145 if (chdir(print_directory) != 0)
148 pstrcpy(jobname, pjob->jobname);
149 pstring_sub(jobname, "'", "_");
150 slprintf(job_page_count, sizeof(job_page_count)-1, "%d", pjob->page_count);
151 slprintf(job_size, sizeof(job_size)-1, "%lu", (unsigned long)pjob->size);
153 /* send it to the system spooler */
154 ret = print_run_command(snum, PRINTERNAME(snum), True,
155 lp_printcommand(snum), NULL,
160 "%c", job_page_count,
169 /****************************************************************************
170 get the current list of queued jobs
171 ****************************************************************************/
172 static int generic_queue_get(const char *printer_name,
173 enum printing_types printing_type,
175 print_queue_struct **q,
176 print_status_struct *status)
180 int numlines, i, qcount;
181 print_queue_struct *queue = NULL;
183 /* never do substitution when running the 'lpq command' since we can't
184 get it rigt when using the background update daemon. Make the caller
185 do it before passing off the command string to us here. */
187 print_run_command(-1, printer_name, False, lpq_command, &fd, NULL);
190 DEBUG(5,("generic_queue_get: Can't read print queue status for printer %s\n",
196 qlines = fd_lines_load(fd, &numlines,0);
199 /* turn the lpq output into a series of job structures */
201 ZERO_STRUCTP(status);
202 if (numlines && qlines) {
203 queue = SMB_MALLOC_ARRAY(print_queue_struct, numlines+1);
205 file_lines_free(qlines);
209 memset(queue, '\0', sizeof(print_queue_struct)*(numlines+1));
211 for (i=0; i<numlines; i++) {
213 if (parse_lpq_entry(printing_type,qlines[i],
214 &queue[qcount],status,qcount==0)) {
220 file_lines_free(qlines);
225 /****************************************************************************
227 ****************************************************************************/
228 static int generic_queue_pause(int snum)
230 return print_run_command(snum, PRINTERNAME(snum), True, lp_queuepausecommand(snum), NULL, NULL);
233 /****************************************************************************
235 ****************************************************************************/
236 static int generic_queue_resume(int snum)
238 return print_run_command(snum, PRINTERNAME(snum), True, lp_queueresumecommand(snum), NULL, NULL);
241 /****************************************************************************
242 * Generic printing interface definitions...
243 ***************************************************************************/
245 struct printif generic_printif =
250 generic_queue_resume,