2 Unix SMB/Netbios implementation.
4 printing backend routines
5 Copyright (C) Andrew Tridgell 1992-2000
6 Copyright (C) Jeremy Allison 2002
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 /* Current printer interface */
26 static struct printif *current_printif = &generic_printif;
27 static BOOL remove_from_jobs_changed(int snum, uint32 jobid);
30 the printing backend revolves around a tdb database that stores the
31 SMB view of the print queue
33 The key for this database is a jobid - a internally generated number that
34 uniquely identifies a print job
36 reading the print queue involves two steps:
37 - possibly running lpq and updating the internal database from that
38 - reading entries from the database
40 jobids are assigned when a job starts spooling.
43 /***************************************************************************
44 Nightmare. LANMAN jobid's are 16 bit numbers..... We must map them to 32
45 bit RPC jobids.... JRA.
46 ***************************************************************************/
48 static TDB_CONTEXT *rap_tdb;
49 static uint16 next_rap_jobid;
51 uint16 pjobid_to_rap(int snum, uint32 jobid)
57 DEBUG(10,("pjobid_to_rap: called.\n"));
60 /* Create the in-memory tdb. */
61 rap_tdb = tdb_open_log(NULL, 0, TDB_INTERNAL, (O_RDWR|O_CREAT), 0644);
66 SIVAL(&jinfo,0,(int32)snum);
67 SIVAL(&jinfo,4,jobid);
69 key.dptr = (char *)&jinfo;
70 key.dsize = sizeof(jinfo);
71 data = tdb_fetch(rap_tdb, key);
72 if (data.dptr && data.dsize == sizeof(uint16)) {
73 memcpy(&rap_jobid, data.dptr, sizeof(uint16));
75 DEBUG(10,("pjobid_to_rap: jobid %u maps to RAP jobid %u\n",
77 (unsigned int)rap_jobid));
81 /* Not found - create and store mapping. */
82 rap_jobid = ++next_rap_jobid;
84 rap_jobid = ++next_rap_jobid;
85 data.dptr = (char *)&rap_jobid;
86 data.dsize = sizeof(rap_jobid);
87 tdb_store(rap_tdb, key, data, TDB_REPLACE);
88 tdb_store(rap_tdb, data, key, TDB_REPLACE);
90 DEBUG(10,("pjobid_to_rap: created jobid %u maps to RAP jobid %u\n",
92 (unsigned int)rap_jobid));
96 BOOL rap_to_pjobid(uint16 rap_jobid, int *psnum, uint32 *pjobid)
100 DEBUG(10,("rap_to_pjobid called.\n"));
105 key.dptr = (char *)&rap_jobid;
106 key.dsize = sizeof(rap_jobid);
107 data = tdb_fetch(rap_tdb, key);
108 if (data.dptr && data.dsize == 8) {
109 *psnum = IVAL(data.dptr,0);
110 *pjobid = IVAL(data.dptr,4);
111 DEBUG(10,("rap_to_pjobid: jobid %u maps to RAP jobid %u\n",
112 (unsigned int)*pjobid,
113 (unsigned int)rap_jobid));
114 SAFE_FREE(data.dptr);
118 DEBUG(10,("rap_to_pjobid: Failed to lookup RAP jobid %u\n",
119 (unsigned int)rap_jobid));
120 SAFE_FREE(data.dptr);
124 static void rap_jobid_delete(int snum, uint32 jobid)
130 DEBUG(10,("rap_jobid_delete: called.\n"));
135 SIVAL(&jinfo,0,(int32)snum);
136 SIVAL(&jinfo,4,jobid);
138 key.dptr = (char *)&jinfo;
139 key.dsize = sizeof(jinfo);
140 data = tdb_fetch(rap_tdb, key);
141 if (!data.dptr || (data.dsize != sizeof(uint16))) {
142 DEBUG(10,("rap_jobid_delete: cannot find jobid %u\n",
143 (unsigned int)jobid ));
144 SAFE_FREE(data.dptr);
148 DEBUG(10,("rap_jobid_delete: deleting jobid %u\n",
149 (unsigned int)jobid ));
151 memcpy(&rap_jobid, data.dptr, sizeof(uint16));
152 SAFE_FREE(data.dptr);
153 data.dptr = (char *)&rap_jobid;
154 data.dsize = sizeof(rap_jobid);
155 tdb_delete(rap_tdb, key);
156 tdb_delete(rap_tdb, data);
159 static pid_t local_pid;
161 static int get_queue_status(int, print_status_struct *);
163 /****************************************************************************
164 Initialise the printing backend. Called once at startup before the fork().
165 ****************************************************************************/
167 BOOL print_backend_init(void)
169 const char *sversion = "INFO/version";
170 pstring printing_path;
171 int services = lp_numservices();
174 if (local_pid == sys_getpid())
177 unlink(lock_path("printing.tdb"));
178 pstrcpy(printing_path,lock_path("printing"));
179 mkdir(printing_path,0755);
181 local_pid = sys_getpid();
183 /* handle a Samba upgrade */
185 for (snum = 0; snum < services; snum++) {
186 struct tdb_print_db *pdb;
187 if (!lp_print_ok(snum))
190 pdb = get_print_db_byname(lp_const_servicename(snum));
193 if (tdb_lock_bystring(pdb->tdb, sversion, 0) == -1) {
194 DEBUG(0,("print_backend_init: Failed to open printer %s database\n", lp_const_servicename(snum) ));
195 release_print_db(pdb);
198 if (tdb_fetch_int32(pdb->tdb, sversion) != PRINT_DATABASE_VERSION) {
199 tdb_traverse(pdb->tdb, tdb_traverse_delete_fn, NULL);
200 tdb_store_int32(pdb->tdb, sversion, PRINT_DATABASE_VERSION);
202 tdb_unlock_bystring(pdb->tdb, sversion);
203 release_print_db(pdb);
206 close_all_print_db(); /* Don't leave any open. */
208 /* select the appropriate printing interface... */
210 if (strcmp(lp_printcapname(), "cups") == 0)
211 current_printif = &cups_printif;
212 #endif /* HAVE_CUPS */
214 /* do NT print initialization... */
215 return nt_printing_init();
218 /****************************************************************************
219 Shut down printing backend. Called once at shutdown to close the tdb.
220 ****************************************************************************/
222 void printing_end(void)
224 close_all_print_db(); /* Don't leave any open. */
227 /****************************************************************************
228 Useful function to generate a tdb key.
229 ****************************************************************************/
231 static TDB_DATA print_key(uint32 jobid)
237 ret.dptr = (void *)&j;
238 ret.dsize = sizeof(j);
242 /***********************************************************************
243 unpack a pjob from a tdb buffer
244 ***********************************************************************/
246 int unpack_pjob( char* buf, int buflen, struct printjob *pjob )
250 uint32 pjpid, pjsysjob, pjfd, pjstarttime, pjstatus;
251 uint32 pjsize, pjpage_count, pjspooled, pjsmbjob;
256 len += tdb_unpack(buf+len, buflen-len, "dddddddddffff",
274 if ( (used = unpack_devicemode(&pjob->nt_devmode, buf+len, buflen-len)) == -1 )
280 pjob->sysjob = pjsysjob;
282 pjob->starttime = pjstarttime;
283 pjob->status = pjstatus;
285 pjob->page_count = pjpage_count;
286 pjob->spooled = pjspooled;
287 pjob->smbjob = pjsmbjob;
293 /****************************************************************************
294 Useful function to find a print job in the database.
295 ****************************************************************************/
297 static struct printjob *print_job_find(int snum, uint32 jobid)
299 static struct printjob pjob;
301 struct tdb_print_db *pdb = get_print_db_byname(lp_const_servicename(snum));
307 ret = tdb_fetch(pdb->tdb, print_key(jobid));
308 release_print_db(pdb);
313 if ( pjob.nt_devmode )
314 free_nt_devicemode( &pjob.nt_devmode );
318 if ( unpack_pjob( ret.dptr, ret.dsize, &pjob ) == -1 ) {
327 /* Convert a unix jobid to a smb jobid */
329 static uint32 sysjob_to_jobid_value;
331 static int unixjob_traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA key,
332 TDB_DATA data, void *state)
334 struct printjob *pjob;
335 int *sysjob = (int *)state;
337 if (!data.dptr || data.dsize == 0)
340 pjob = (struct printjob *)data.dptr;
341 if (key.dsize != sizeof(uint32))
344 if (*sysjob == pjob->sysjob) {
345 uint32 *jobid = (uint32 *)key.dptr;
347 sysjob_to_jobid_value = *jobid;
354 /****************************************************************************
355 This is a *horribly expensive call as we have to iterate through all the
356 current printer tdb's. Don't do this often ! JRA.
357 ****************************************************************************/
359 uint32 sysjob_to_jobid(int unix_jobid)
361 int services = lp_numservices();
364 sysjob_to_jobid_value = (uint32)-1;
366 for (snum = 0; snum < services; snum++) {
367 struct tdb_print_db *pdb;
368 if (!lp_print_ok(snum))
370 pdb = get_print_db_byname(lp_const_servicename(snum));
372 tdb_traverse(pdb->tdb, unixjob_traverse_fn, &unix_jobid);
373 release_print_db(pdb);
374 if (sysjob_to_jobid_value != (uint32)-1)
375 return sysjob_to_jobid_value;
380 /****************************************************************************
381 Send notifications based on what has changed after a pjob_store.
382 ****************************************************************************/
386 uint32 spoolss_status;
387 } lpq_to_spoolss_status_map[] = {
388 { LPQ_QUEUED, JOB_STATUS_QUEUED },
389 { LPQ_PAUSED, JOB_STATUS_PAUSED },
390 { LPQ_SPOOLING, JOB_STATUS_SPOOLING },
391 { LPQ_PRINTING, JOB_STATUS_PRINTING },
392 { LPQ_DELETING, JOB_STATUS_DELETING },
393 { LPQ_OFFLINE, JOB_STATUS_OFFLINE },
394 { LPQ_PAPEROUT, JOB_STATUS_PAPEROUT },
395 { LPQ_PRINTED, JOB_STATUS_PRINTED },
396 { LPQ_DELETED, JOB_STATUS_DELETED },
397 { LPQ_BLOCKED, JOB_STATUS_BLOCKED },
398 { LPQ_USER_INTERVENTION, JOB_STATUS_USER_INTERVENTION },
402 /* Convert a lpq status value stored in printing.tdb into the
403 appropriate win32 API constant. */
405 static uint32 map_to_spoolss_status(uint32 lpq_status)
409 while (lpq_to_spoolss_status_map[i].lpq_status != -1) {
410 if (lpq_to_spoolss_status_map[i].lpq_status == lpq_status)
411 return lpq_to_spoolss_status_map[i].spoolss_status;
418 static void pjob_store_notify(int snum, uint32 jobid, struct printjob *old_data,
419 struct printjob *new_data)
421 BOOL new_job = False;
426 /* Notify the job name first */
428 if (new_job || !strequal(old_data->jobname, new_data->jobname))
429 notify_job_name(snum, jobid, new_data->jobname);
431 /* Job attributes that can't be changed. We only send
432 notification for these on a new job. */
435 notify_job_submitted(snum, jobid, new_data->starttime);
436 notify_job_username(snum, jobid, new_data->user);
439 /* Job attributes of a new job or attributes that can be
442 if (new_job || old_data->status != new_data->status)
443 notify_job_status(snum, jobid, map_to_spoolss_status(new_data->status));
445 if (new_job || old_data->size != new_data->size)
446 notify_job_total_bytes(snum, jobid, new_data->size);
448 if (new_job || old_data->page_count != new_data->page_count)
449 notify_job_total_pages(snum, jobid, new_data->page_count);
452 /****************************************************************************
453 Store a job structure back to the database.
454 ****************************************************************************/
456 static BOOL pjob_store(int snum, uint32 jobid, struct printjob *pjob)
458 TDB_DATA old_data, new_data;
460 struct tdb_print_db *pdb = get_print_db_byname(lp_const_servicename(snum));
462 int len, newlen, buflen;
470 old_data = tdb_fetch(pdb->tdb, print_key(jobid));
472 /* Doh! Now we have to pack/unpack data since the NT_DEVICEMODE was added */
479 len += tdb_pack(buf+len, buflen-len, "dddddddddffff",
481 (uint32)pjob->sysjob,
483 (uint32)pjob->starttime,
484 (uint32)pjob->status,
486 (uint32)pjob->page_count,
487 (uint32)pjob->spooled,
488 (uint32)pjob->smbjob,
494 len += pack_devicemode(pjob->nt_devmode, buf+len, buflen-len);
499 tb = (char *)Realloc(buf, len);
501 DEBUG(0,("pjob_store: failed to enlarge buffer!\n"));
508 } while ( buflen != len );
514 new_data.dsize = len;
515 ret = (tdb_store(pdb->tdb, print_key(jobid), new_data, TDB_REPLACE) == 0);
517 release_print_db(pdb);
519 /* Send notify updates for what has changed */
521 if ( ret && (old_data.dsize == 0 || old_data.dsize == sizeof(*pjob)) )
522 pjob_store_notify( snum, jobid, (struct printjob *)old_data.dptr, pjob );
525 SAFE_FREE( old_data.dptr );
531 /****************************************************************************
532 Remove a job structure from the database.
533 ****************************************************************************/
535 void pjob_delete(int snum, uint32 jobid)
537 struct printjob *pjob = print_job_find(snum, jobid);
538 uint32 job_status = 0;
539 struct tdb_print_db *pdb = get_print_db_byname(lp_const_servicename(snum));
545 DEBUG(5, ("pjob_delete(): we were asked to delete nonexistent job %u\n",
546 (unsigned int)jobid));
547 release_print_db(pdb);
551 /* Send a notification that a job has been deleted */
553 job_status = map_to_spoolss_status(pjob->status);
555 /* We must cycle through JOB_STATUS_DELETING and
556 JOB_STATUS_DELETED for the port monitor to delete the job
559 job_status |= JOB_STATUS_DELETING;
560 notify_job_status(snum, jobid, job_status);
562 job_status |= JOB_STATUS_DELETED;
563 notify_job_status(snum, jobid, job_status);
565 /* Remove from printing.tdb */
567 tdb_delete(pdb->tdb, print_key(jobid));
568 release_print_db(pdb);
569 rap_jobid_delete(snum, jobid);
572 /****************************************************************************
573 Parse a file name from the system spooler to generate a jobid.
574 ****************************************************************************/
576 static uint32 print_parse_jobid(char *fname)
580 if (strncmp(fname,PRINT_SPOOL_PREFIX,strlen(PRINT_SPOOL_PREFIX)) != 0)
582 fname += strlen(PRINT_SPOOL_PREFIX);
588 return (uint32)jobid;
591 /****************************************************************************
592 List a unix job in the print database.
593 ****************************************************************************/
595 static void print_unix_job(int snum, print_queue_struct *q, uint32 jobid)
597 struct printjob pj, *old_pj;
599 if (jobid == (uint32)-1)
600 jobid = q->job + UNIX_JOB_START;
602 /* Preserve the timestamp on an existing unix print job */
604 old_pj = print_job_find(snum, jobid);
611 pj.starttime = old_pj ? old_pj->starttime : q->time;
612 pj.status = q->status;
615 pj.smbjob = (old_pj != NULL ? True : False);
616 fstrcpy(pj.filename, old_pj ? old_pj->filename : "");
617 if (jobid < UNIX_JOB_START)
618 fstrcpy(pj.jobname, old_pj ? old_pj->jobname : "Remote Downlevel Document");
620 fstrcpy(pj.jobname, old_pj ? old_pj->jobname : q->fs_file);
621 fstrcpy(pj.user, old_pj ? old_pj->user : q->fs_user);
622 fstrcpy(pj.queuename, old_pj ? old_pj->queuename : lp_const_servicename(snum));
624 pjob_store(snum, jobid, &pj);
628 struct traverse_struct {
629 print_queue_struct *queue;
630 int qcount, snum, maxcount, total_jobs;
634 /****************************************************************************
635 Utility fn to delete any jobs that are no longer active.
636 ****************************************************************************/
638 static int traverse_fn_delete(TDB_CONTEXT *t, TDB_DATA key, TDB_DATA data, void *state)
640 struct traverse_struct *ts = (struct traverse_struct *)state;
641 struct printjob pjob;
645 if ( key.dsize != sizeof(jobid) )
648 memcpy(&jobid, key.dptr, sizeof(jobid));
649 if ( unpack_pjob( data.dptr, data.dsize, &pjob ) == -1 )
651 free_nt_devicemode( &pjob.nt_devmode );
654 if (ts->snum != lp_servicenumber(pjob.queuename)) {
655 /* this isn't for the queue we are looking at - this cannot happen with the split tdb's. JRA */
660 /* remove a unix job if it isn't in the system queue any more */
662 for (i=0;i<ts->qcount;i++) {
663 uint32 u_jobid = (ts->queue[i].job + UNIX_JOB_START);
664 if (jobid == u_jobid)
667 if (i == ts->qcount) {
668 DEBUG(10,("traverse_fn_delete: pjob %u deleted due to !smbjob\n",
669 (unsigned int)jobid ));
670 pjob_delete(ts->snum, jobid);
676 /* maybe it hasn't been spooled yet */
678 /* if a job is not spooled and the process doesn't
679 exist then kill it. This cleans up after smbd
681 if (!process_exists(pjob.pid)) {
682 DEBUG(10,("traverse_fn_delete: pjob %u deleted due to !process_exists (%u)\n",
683 (unsigned int)jobid, (unsigned int)pjob.pid ));
684 pjob_delete(ts->snum, jobid);
690 for (i=0;i<ts->qcount;i++) {
691 uint32 curr_jobid = print_parse_jobid(ts->queue[i].fs_file);
692 if (jobid == curr_jobid)
696 /* The job isn't in the system queue - we have to assume it has
697 completed, so delete the database entry. */
699 if (i == ts->qcount) {
701 /* A race can occur between the time a job is spooled and
702 when it appears in the lpq output. This happens when
703 the job is added to printing.tdb when another smbd
704 running print_queue_update() has completed a lpq and
705 is currently traversing the printing tdb and deleting jobs.
706 Don't delete the job if it was submitted after the lpq_time. */
708 if (pjob.starttime < ts->lpq_time) {
709 DEBUG(10,("traverse_fn_delete: pjob %u deleted due to pjob.starttime (%u) < ts->lpq_time (%u)\n",
711 (unsigned int)pjob.starttime,
712 (unsigned int)ts->lpq_time ));
713 pjob_delete(ts->snum, jobid);
723 /****************************************************************************
724 Check if the print queue has been updated recently enough.
725 ****************************************************************************/
727 static void print_cache_flush(int snum)
730 const char *printername = lp_const_servicename(snum);
731 struct tdb_print_db *pdb = get_print_db_byname(printername);
735 slprintf(key, sizeof(key)-1, "CACHE/%s", printername);
736 tdb_store_int32(pdb->tdb, key, -1);
737 release_print_db(pdb);
740 /****************************************************************************
741 Check if someone already thinks they are doing the update.
742 ****************************************************************************/
744 static pid_t get_updating_pid(fstring printer_name)
749 struct tdb_print_db *pdb = get_print_db_byname(printer_name);
753 slprintf(keystr, sizeof(keystr)-1, "UPDATING/%s", printer_name);
755 key.dsize = strlen(keystr);
757 data = tdb_fetch(pdb->tdb, key);
758 release_print_db(pdb);
759 if (!data.dptr || data.dsize != sizeof(pid_t)) {
760 SAFE_FREE(data.dptr);
764 memcpy(&updating_pid, data.dptr, sizeof(pid_t));
765 SAFE_FREE(data.dptr);
767 if (process_exists(updating_pid))
773 /****************************************************************************
774 Set the fact that we're doing the update, or have finished doing the update
776 ****************************************************************************/
778 static void set_updating_pid(const fstring printer_name, BOOL delete)
783 pid_t updating_pid = sys_getpid();
784 struct tdb_print_db *pdb = get_print_db_byname(printer_name);
789 slprintf(keystr, sizeof(keystr)-1, "UPDATING/%s", printer_name);
791 key.dsize = strlen(keystr);
794 tdb_delete(pdb->tdb, key);
795 release_print_db(pdb);
799 data.dptr = (void *)&updating_pid;
800 data.dsize = sizeof(pid_t);
802 tdb_store(pdb->tdb, key, data, TDB_REPLACE);
803 release_print_db(pdb);
806 /****************************************************************************
807 Sort print jobs by submittal time.
808 ****************************************************************************/
810 static int printjob_comp(print_queue_struct *j1, print_queue_struct *j2)
821 /* Sort on job start time */
823 if (j1->time == j2->time)
825 return (j1->time > j2->time) ? 1 : -1;
828 /****************************************************************************
829 Store the sorted queue representation for later portmon retrieval.
830 ****************************************************************************/
832 static void store_queue_struct(struct tdb_print_db *pdb, struct traverse_struct *pts)
835 int max_reported_jobs = lp_max_reported_jobs(pts->snum);
836 print_queue_struct *queue = pts->queue;
841 if (max_reported_jobs < pts->qcount)
842 pts->qcount = max_reported_jobs;
843 qcount = pts->qcount;
845 /* Work out the size. */
847 data.dsize += tdb_pack(NULL, 0, NULL, "d", qcount);
849 for (i = 0; i < pts->qcount; i++) {
850 data.dsize += tdb_pack(NULL, 0, "ddddddff",
851 (uint32)queue[i].job,
852 (uint32)queue[i].size,
853 (uint32)queue[i].page_count,
854 (uint32)queue[i].status,
855 (uint32)queue[i].priority,
856 (uint32)queue[i].time,
861 if ((data.dptr = malloc(data.dsize)) == NULL)
865 len += tdb_pack(data.dptr + len, data.dsize - len, "d", qcount);
866 for (i = 0; i < pts->qcount; i++) {
867 len += tdb_pack(data.dptr + len, data.dsize - len, "ddddddff",
868 (uint32)queue[i].job,
869 (uint32)queue[i].size,
870 (uint32)queue[i].page_count,
871 (uint32)queue[i].status,
872 (uint32)queue[i].priority,
873 (uint32)queue[i].time,
878 key.dptr = "INFO/linear_queue_array";
879 key.dsize = strlen(key.dptr);
880 tdb_store(pdb->tdb, key, data, TDB_REPLACE);
884 static TDB_DATA get_jobs_changed_data(struct tdb_print_db *pdb)
888 key.dptr = "INFO/jobs_changed";
889 key.dsize = strlen(key.dptr);
892 data = tdb_fetch(pdb->tdb, key);
893 if (data.dptr == NULL || data.dsize == 0 || (data.dsize % 4 != 0)) {
894 SAFE_FREE(data.dptr);
901 static void check_job_changed(int snum, TDB_DATA data, uint32 jobid)
904 unsigned int job_count = data.dsize / 4;
906 for (i = 0; i < job_count; i++) {
909 memcpy(&ch_jobid, data.dptr + (i*4), 4);
910 if (ch_jobid == jobid)
911 remove_from_jobs_changed(snum, jobid);
915 /****************************************************************************
916 Update the internal database from the system print queue for a queue.
917 ****************************************************************************/
919 static void print_queue_update(int snum)
922 print_queue_struct *queue = NULL;
923 print_status_struct status;
924 print_status_struct old_status;
925 struct printjob *pjob;
926 struct traverse_struct tstruct;
927 fstring keystr, printer_name, cachestr;
930 struct tdb_print_db *pdb;
932 fstrcpy(printer_name, lp_const_servicename(snum));
933 pdb = get_print_db_byname(printer_name);
938 * Check to see if someone else is doing this update.
939 * This is essentially a mutex on the update.
942 if (get_updating_pid(printer_name) != -1) {
943 release_print_db(pdb);
947 /* Lock the queue for the database update */
949 slprintf(keystr, sizeof(keystr) - 1, "LOCK/%s", printer_name);
950 /* Only wait 10 seconds for this. */
951 if (tdb_lock_bystring(pdb->tdb, keystr, 10) == -1) {
952 DEBUG(0,("print_queue_update: Failed to lock printer %s database\n", printer_name));
953 release_print_db(pdb);
958 * Ensure that no one else got in here.
959 * If the updating pid is still -1 then we are
963 if (get_updating_pid(printer_name) != -1) {
965 * Someone else is doing the update, exit.
967 tdb_unlock_bystring(pdb->tdb, keystr);
968 release_print_db(pdb);
973 * We're going to do the update ourselves.
976 /* Tell others we're doing the update. */
977 set_updating_pid(printer_name, False);
980 * Allow others to enter and notice we're doing
984 tdb_unlock_bystring(pdb->tdb, keystr);
987 * Update the cache time FIRST ! Stops others even
988 * attempting to get the lock and doing this
989 * if the lpq takes a long time.
992 slprintf(cachestr, sizeof(cachestr)-1, "CACHE/%s", printer_name);
993 tdb_store_int32(pdb->tdb, cachestr, (int)time(NULL));
995 /* get the current queue using the appropriate interface */
998 qcount = (*(current_printif->queue_get))(snum, &queue, &status);
1000 DEBUG(3, ("%d job%s in queue for %s\n", qcount, (qcount != 1) ?
1001 "s" : "", printer_name));
1003 /* Sort the queue by submission time otherwise they are displayed
1006 qsort(queue, qcount, sizeof(print_queue_struct),
1007 QSORT_CAST(printjob_comp));
1010 any job in the internal database that is marked as spooled
1011 and doesn't exist in the system queue is considered finished
1012 and removed from the database
1014 any job in the system database but not in the internal database
1015 is added as a unix job
1017 fill in any system job numbers as we go
1020 jcdata = get_jobs_changed_data(pdb);
1022 for (i=0; i<qcount; i++) {
1023 uint32 jobid = print_parse_jobid(queue[i].fs_file);
1025 if (jobid == (uint32)-1) {
1026 /* assume its a unix print job */
1027 print_unix_job(snum, &queue[i], jobid);
1031 /* we have an active SMB print job - update its status */
1032 pjob = print_job_find(snum, jobid);
1034 /* err, somethings wrong. Probably smbd was restarted
1035 with jobs in the queue. All we can do is treat them
1036 like unix jobs. Pity. */
1037 print_unix_job(snum, &queue[i], jobid);
1041 pjob->sysjob = queue[i].job;
1042 pjob->status = queue[i].status;
1043 pjob_store(snum, jobid, pjob);
1044 check_job_changed(snum, jcdata, jobid);
1047 SAFE_FREE(jcdata.dptr);
1049 /* now delete any queued entries that don't appear in the
1051 tstruct.queue = queue;
1052 tstruct.qcount = qcount;
1053 tstruct.snum = snum;
1054 tstruct.total_jobs = 0;
1055 tstruct.lpq_time = time(NULL);
1057 tdb_traverse(pdb->tdb, traverse_fn_delete, (void *)&tstruct);
1059 /* Store the linearised queue, max jobs only. */
1060 store_queue_struct(pdb, &tstruct);
1062 SAFE_FREE(tstruct.queue);
1064 DEBUG(10,("print_queue_update: printer %s INFO/total_jobs = %d\n",
1065 printer_name, tstruct.total_jobs ));
1067 tdb_store_int32(pdb->tdb, "INFO/total_jobs", tstruct.total_jobs);
1069 get_queue_status(snum, &old_status);
1070 if (old_status.qcount != qcount)
1071 DEBUG(10,("print_queue_update: queue status change %d jobs -> %d jobs for printer %s\n",
1072 old_status.qcount, qcount, printer_name ));
1074 /* store the new queue status structure */
1075 slprintf(keystr, sizeof(keystr)-1, "STATUS/%s", printer_name);
1077 key.dsize = strlen(keystr);
1079 status.qcount = qcount;
1080 data.dptr = (void *)&status;
1081 data.dsize = sizeof(status);
1082 tdb_store(pdb->tdb, key, data, TDB_REPLACE);
1085 * Update the cache time again. We want to do this call
1086 * as little as possible...
1089 slprintf(keystr, sizeof(keystr)-1, "CACHE/%s", printer_name);
1090 tdb_store_int32(pdb->tdb, keystr, (int32)time(NULL));
1092 /* Delete our pid from the db. */
1093 set_updating_pid(printer_name, True);
1094 release_print_db(pdb);
1097 /****************************************************************************
1098 Create/Update an entry in the print tdb that will allow us to send notify
1099 updates only to interested smbd's.
1100 ****************************************************************************/
1102 BOOL print_notify_register_pid(int snum)
1105 struct tdb_print_db *pdb = NULL;
1106 TDB_CONTEXT *tdb = NULL;
1107 const char *printername;
1108 uint32 mypid = (uint32)sys_getpid();
1112 /* if (snum == -1), then the change notify request was
1113 on a print server handle and we need to register on
1118 int num_services = lp_numservices();
1121 for ( idx=0; idx<num_services; idx++ ) {
1122 if (lp_snum_ok(idx) && lp_print_ok(idx) )
1123 print_notify_register_pid(idx);
1128 else /* register for a specific printer */
1130 printername = lp_const_servicename(snum);
1131 pdb = get_print_db_byname(printername);
1137 if (tdb_lock_bystring(tdb, NOTIFY_PID_LIST_KEY, 10) == -1) {
1138 DEBUG(0,("print_notify_register_pid: Failed to lock printer %s\n",
1141 release_print_db(pdb);
1145 data = get_printer_notify_pid_list( tdb, printername, True );
1147 /* Add ourselves and increase the refcount. */
1149 for (i = 0; i < data.dsize; i += 8) {
1150 if (IVAL(data.dptr,i) == mypid) {
1151 uint32 new_refcount = IVAL(data.dptr, i+4) + 1;
1152 SIVAL(data.dptr, i+4, new_refcount);
1157 if (i == data.dsize) {
1158 /* We weren't in the list. Realloc. */
1159 data.dptr = Realloc(data.dptr, data.dsize + 8);
1161 DEBUG(0,("print_notify_register_pid: Relloc fail for printer %s\n",
1166 SIVAL(data.dptr,data.dsize - 8,mypid);
1167 SIVAL(data.dptr,data.dsize - 4,1); /* Refcount. */
1170 /* Store back the record. */
1171 if (tdb_store_by_string(tdb, NOTIFY_PID_LIST_KEY, data, TDB_REPLACE) == -1) {
1172 DEBUG(0,("print_notify_register_pid: Failed to update pid \
1173 list for printer %s\n", printername));
1181 tdb_unlock_bystring(tdb, NOTIFY_PID_LIST_KEY);
1183 release_print_db(pdb);
1184 SAFE_FREE(data.dptr);
1188 /****************************************************************************
1189 Update an entry in the print tdb that will allow us to send notify
1190 updates only to interested smbd's.
1191 ****************************************************************************/
1193 BOOL print_notify_deregister_pid(int snum)
1196 struct tdb_print_db *pdb = NULL;
1197 TDB_CONTEXT *tdb = NULL;
1198 const char *printername;
1199 uint32 mypid = (uint32)sys_getpid();
1203 /* if ( snum == -1 ), we are deregister a print server handle
1204 which means to deregister on all print queues */
1208 int num_services = lp_numservices();
1211 for ( idx=0; idx<num_services; idx++ ) {
1212 if ( lp_snum_ok(idx) && lp_print_ok(idx) )
1213 print_notify_deregister_pid(idx);
1218 else /* deregister a specific printer */
1220 printername = lp_const_servicename(snum);
1221 pdb = get_print_db_byname(printername);
1227 if (tdb_lock_bystring(tdb, NOTIFY_PID_LIST_KEY, 10) == -1) {
1228 DEBUG(0,("print_notify_register_pid: Failed to lock \
1229 printer %s database\n", printername));
1231 release_print_db(pdb);
1235 data = get_printer_notify_pid_list( tdb, printername, True );
1237 /* Reduce refcount. Remove ourselves if zero. */
1239 for (i = 0; i < data.dsize; ) {
1240 if (IVAL(data.dptr,i) == mypid) {
1241 uint32 refcount = IVAL(data.dptr, i+4);
1245 if (refcount == 0) {
1246 if (data.dsize - i > 8)
1247 memmove( &data.dptr[i], &data.dptr[i+8], data.dsize - i - 8);
1251 SIVAL(data.dptr, i+4, refcount);
1257 if (data.dsize == 0)
1258 SAFE_FREE(data.dptr);
1260 /* Store back the record. */
1261 if (tdb_store_by_string(tdb, NOTIFY_PID_LIST_KEY, data, TDB_REPLACE) == -1) {
1262 DEBUG(0,("print_notify_register_pid: Failed to update pid \
1263 list for printer %s\n", printername));
1271 tdb_unlock_bystring(tdb, NOTIFY_PID_LIST_KEY);
1273 release_print_db(pdb);
1274 SAFE_FREE(data.dptr);
1278 /****************************************************************************
1279 Check if a jobid is valid. It is valid if it exists in the database.
1280 ****************************************************************************/
1282 BOOL print_job_exists(int snum, uint32 jobid)
1284 struct tdb_print_db *pdb = get_print_db_byname(lp_const_servicename(snum));
1289 ret = tdb_exists(pdb->tdb, print_key(jobid));
1290 release_print_db(pdb);
1294 /****************************************************************************
1295 Give the fd used for a jobid.
1296 ****************************************************************************/
1298 int print_job_fd(int snum, uint32 jobid)
1300 struct printjob *pjob = print_job_find(snum, jobid);
1303 /* don't allow another process to get this info - it is meaningless */
1304 if (pjob->pid != local_pid)
1309 /****************************************************************************
1310 Give the filename used for a jobid.
1311 Only valid for the process doing the spooling and when the job
1312 has not been spooled.
1313 ****************************************************************************/
1315 char *print_job_fname(int snum, uint32 jobid)
1317 struct printjob *pjob = print_job_find(snum, jobid);
1318 if (!pjob || pjob->spooled || pjob->pid != local_pid)
1320 return pjob->filename;
1324 /****************************************************************************
1325 Give the filename used for a jobid.
1326 Only valid for the process doing the spooling and when the job
1327 has not been spooled.
1328 ****************************************************************************/
1330 NT_DEVICEMODE *print_job_devmode(int snum, uint32 jobid)
1332 struct printjob *pjob = print_job_find(snum, jobid);
1337 return pjob->nt_devmode;
1340 /****************************************************************************
1341 Set the place in the queue for a job.
1342 ****************************************************************************/
1344 BOOL print_job_set_place(int snum, uint32 jobid, int place)
1346 DEBUG(2,("print_job_set_place not implemented yet\n"));
1350 /****************************************************************************
1351 Set the name of a job. Only possible for owner.
1352 ****************************************************************************/
1354 BOOL print_job_set_name(int snum, uint32 jobid, char *name)
1356 struct printjob *pjob = print_job_find(snum, jobid);
1357 if (!pjob || pjob->pid != local_pid)
1360 fstrcpy(pjob->jobname, name);
1361 return pjob_store(snum, jobid, pjob);
1364 /***************************************************************************
1365 Remove a jobid from the 'jobs changed' list.
1366 ***************************************************************************/
1368 static BOOL remove_from_jobs_changed(int snum, uint32 jobid)
1370 const char *printername = lp_const_servicename(snum);
1371 struct tdb_print_db *pdb = get_print_db_byname(printername);
1373 size_t job_count, i;
1375 BOOL gotlock = False;
1377 key.dptr = "INFO/jobs_changed";
1378 key.dsize = strlen(key.dptr);
1381 if (tdb_chainlock_with_timeout(pdb->tdb, key, 5) == -1)
1386 data = tdb_fetch(pdb->tdb, key);
1388 if (data.dptr == NULL || data.dsize == 0 || (data.dsize % 4 != 0))
1391 job_count = data.dsize / 4;
1392 for (i = 0; i < job_count; i++) {
1395 memcpy(&ch_jobid, data.dptr + (i*4), 4);
1396 if (ch_jobid == jobid) {
1397 if (i < job_count -1 )
1398 memmove(data.dptr + (i*4), data.dptr + (i*4) + 4, (job_count - i - 1)*4 );
1400 if (tdb_store(pdb->tdb, key, data, TDB_REPLACE) == -1)
1410 tdb_chainunlock(pdb->tdb, key);
1411 SAFE_FREE(data.dptr);
1412 release_print_db(pdb);
1414 DEBUG(10,("remove_from_jobs_changed: removed jobid %u\n", (unsigned int)jobid ));
1416 DEBUG(10,("remove_from_jobs_changed: Failed to remove jobid %u\n", (unsigned int)jobid ));
1420 /****************************************************************************
1421 Delete a print job - don't update queue.
1422 ****************************************************************************/
1424 static BOOL print_job_delete1(int snum, uint32 jobid)
1426 struct printjob *pjob = print_job_find(snum, jobid);
1433 * If already deleting just return.
1436 if (pjob->status == LPQ_DELETING)
1439 /* Hrm - we need to be able to cope with deleting a job before it
1440 has reached the spooler. */
1442 if (pjob->sysjob == -1) {
1443 DEBUG(5, ("attempt to delete job %u not seen by lpr\n", (unsigned int)jobid));
1446 /* Set the tdb entry to be deleting. */
1448 pjob->status = LPQ_DELETING;
1449 pjob_store(snum, jobid, pjob);
1451 if (pjob->spooled && pjob->sysjob != -1)
1452 result = (*(current_printif->job_delete))(snum, pjob);
1454 remove_from_jobs_changed(snum, jobid);
1456 /* Delete the tdb entry if the delete suceeded or the job hasn't
1460 const char *printername = lp_const_servicename(snum);
1461 struct tdb_print_db *pdb = get_print_db_byname(printername);
1466 pjob_delete(snum, jobid);
1467 /* Ensure we keep a rough count of the number of total jobs... */
1468 tdb_change_int32_atomic(pdb->tdb, "INFO/total_jobs", &njobs, -1);
1469 release_print_db(pdb);
1472 return (result == 0);
1475 /****************************************************************************
1476 Return true if the current user owns the print job.
1477 ****************************************************************************/
1479 static BOOL is_owner(struct current_user *user, int snum, uint32 jobid)
1481 struct printjob *pjob = print_job_find(snum, jobid);
1487 if ((vuser = get_valid_user_struct(user->vuid)) != NULL) {
1488 return strequal(pjob->user, vuser->user.smb_name);
1490 return strequal(pjob->user, uidtoname(user->uid));
1494 /****************************************************************************
1496 ****************************************************************************/
1498 BOOL print_job_delete(struct current_user *user, int snum, uint32 jobid, WERROR *errcode)
1500 BOOL owner, deleted;
1505 owner = is_owner(user, snum, jobid);
1507 /* Check access against security descriptor or whether the user
1511 !print_access_check(user, snum, JOB_ACCESS_ADMINISTER)) {
1512 DEBUG(3, ("delete denied by security descriptor\n"));
1513 *errcode = WERR_ACCESS_DENIED;
1515 /* BEGIN_ADMIN_LOG */
1516 sys_adminlog( LOG_ERR,
1517 "Permission denied-- user not allowed to delete, \
1518 pause, or resume print job. User name: %s. Printer name: %s.",
1519 uidtoname(user->uid), PRINTERNAME(snum) );
1526 * get the spooled filename of the print job
1527 * if this works, then the file has not been spooled
1528 * to the underlying print system. Just delete the
1529 * spool file & return.
1532 if ( (fname = print_job_fname( snum, jobid )) != NULL )
1534 /* remove the spool file */
1535 DEBUG(10,("print_job_delete: Removing spool file [%s]\n", fname ));
1536 if ( unlink( fname ) == -1 ) {
1537 *errcode = map_werror_from_unix(errno);
1544 if (!print_job_delete1(snum, jobid)) {
1545 *errcode = WERR_ACCESS_DENIED;
1549 /* force update the database and say the delete failed if the
1552 print_queue_update(snum);
1554 deleted = !print_job_exists(snum, jobid);
1556 *errcode = WERR_ACCESS_DENIED;
1561 /****************************************************************************
1563 ****************************************************************************/
1565 BOOL print_job_pause(struct current_user *user, int snum, uint32 jobid, WERROR *errcode)
1567 struct printjob *pjob = print_job_find(snum, jobid);
1573 if (!pjob->spooled || pjob->sysjob == -1)
1576 if (!is_owner(user, snum, jobid) &&
1577 !print_access_check(user, snum, JOB_ACCESS_ADMINISTER)) {
1578 DEBUG(3, ("pause denied by security descriptor\n"));
1580 /* BEGIN_ADMIN_LOG */
1581 sys_adminlog( LOG_ERR,
1582 "Permission denied-- user not allowed to delete, \
1583 pause, or resume print job. User name: %s. Printer name: %s.",
1584 uidtoname(user->uid), PRINTERNAME(snum) );
1587 *errcode = WERR_ACCESS_DENIED;
1591 /* need to pause the spooled entry */
1592 ret = (*(current_printif->job_pause))(snum, pjob);
1595 *errcode = WERR_INVALID_PARAM;
1599 /* force update the database */
1600 print_cache_flush(snum);
1602 /* Send a printer notify message */
1604 notify_job_status(snum, jobid, JOB_STATUS_PAUSED);
1606 /* how do we tell if this succeeded? */
1611 /****************************************************************************
1613 ****************************************************************************/
1615 BOOL print_job_resume(struct current_user *user, int snum, uint32 jobid, WERROR *errcode)
1617 struct printjob *pjob = print_job_find(snum, jobid);
1623 if (!pjob->spooled || pjob->sysjob == -1)
1626 if (!is_owner(user, snum, jobid) &&
1627 !print_access_check(user, snum, JOB_ACCESS_ADMINISTER)) {
1628 DEBUG(3, ("resume denied by security descriptor\n"));
1629 *errcode = WERR_ACCESS_DENIED;
1631 /* BEGIN_ADMIN_LOG */
1632 sys_adminlog( LOG_ERR,
1633 "Permission denied-- user not allowed to delete, \
1634 pause, or resume print job. User name: %s. Printer name: %s.",
1635 uidtoname(user->uid), PRINTERNAME(snum) );
1640 ret = (*(current_printif->job_resume))(snum, pjob);
1643 *errcode = WERR_INVALID_PARAM;
1647 /* force update the database */
1648 print_cache_flush(snum);
1650 /* Send a printer notify message */
1652 notify_job_status(snum, jobid, JOB_STATUS_QUEUED);
1657 /****************************************************************************
1658 Write to a print file.
1659 ****************************************************************************/
1661 int print_job_write(int snum, uint32 jobid, const char *buf, int size)
1664 struct printjob *pjob = print_job_find(snum, jobid);
1668 /* don't allow another process to get this info - it is meaningless */
1669 if (pjob->pid != local_pid)
1672 return_code = write(pjob->fd, buf, size);
1673 if (return_code>0) {
1675 pjob_store(snum, jobid, pjob);
1680 /****************************************************************************
1681 Check if the print queue has been updated recently enough.
1682 ****************************************************************************/
1684 static BOOL print_cache_expired(int snum)
1687 time_t last_qscan_time, time_now = time(NULL);
1688 const char *printername = lp_const_servicename(snum);
1689 struct tdb_print_db *pdb = get_print_db_byname(printername);
1694 slprintf(key, sizeof(key), "CACHE/%s", printername);
1695 last_qscan_time = (time_t)tdb_fetch_int32(pdb->tdb, key);
1698 * Invalidate the queue for 3 reasons.
1699 * (1). last queue scan time == -1.
1700 * (2). Current time - last queue scan time > allowed cache time.
1701 * (3). last queue scan time > current time + MAX_CACHE_VALID_TIME (1 hour by default).
1702 * This last test picks up machines for which the clock has been moved
1703 * forward, an lpq scan done and then the clock moved back. Otherwise
1704 * that last lpq scan would stay around for a loooong loooong time... :-). JRA.
1707 if (last_qscan_time == ((time_t)-1) || (time_now - last_qscan_time) >= lp_lpqcachetime() ||
1708 last_qscan_time > (time_now + MAX_CACHE_VALID_TIME)) {
1709 DEBUG(3, ("print cache expired for queue %s \
1710 (last_qscan_time = %d, time now = %d, qcachetime = %d)\n", printername,
1711 (int)last_qscan_time, (int)time_now, (int)lp_lpqcachetime() ));
1712 release_print_db(pdb);
1715 release_print_db(pdb);
1719 /****************************************************************************
1720 Get the queue status - do not update if db is out of date.
1721 ****************************************************************************/
1723 static int get_queue_status(int snum, print_status_struct *status)
1727 const char *printername = lp_const_servicename(snum);
1728 struct tdb_print_db *pdb = get_print_db_byname(printername);
1735 ZERO_STRUCTP(status);
1736 slprintf(keystr, sizeof(keystr)-1, "STATUS/%s", printername);
1738 key.dsize = strlen(keystr);
1739 data = tdb_fetch(pdb->tdb, key);
1741 if (data.dsize == sizeof(print_status_struct))
1742 memcpy(status, data.dptr, sizeof(print_status_struct));
1743 SAFE_FREE(data.dptr);
1746 len = tdb_fetch_int32(pdb->tdb, "INFO/total_jobs");
1747 release_print_db(pdb);
1748 return (len == -1 ? 0 : len);
1751 /****************************************************************************
1752 Determine the number of jobs in a queue.
1753 ****************************************************************************/
1755 int print_queue_length(int snum, print_status_struct *pstatus)
1757 print_status_struct status;
1760 /* make sure the database is up to date */
1761 if (print_cache_expired(snum))
1762 print_queue_update(snum);
1764 /* also fetch the queue status */
1765 memset(&status, 0, sizeof(status));
1766 len = get_queue_status(snum, &status);
1774 /***************************************************************************
1775 Allocate a jobid. Hold the lock for as short a time as possible.
1776 ***************************************************************************/
1778 static BOOL allocate_print_jobid(struct tdb_print_db *pdb, int snum, const char *printername, uint32 *pjobid)
1783 *pjobid = (uint32)-1;
1785 for (i = 0; i < 3; i++) {
1786 /* Lock the database - only wait 20 seconds. */
1787 if (tdb_lock_bystring(pdb->tdb, "INFO/nextjob", 20) == -1) {
1788 DEBUG(0,("allocate_print_jobid: failed to lock printing database %s\n", printername ));
1792 if (!tdb_fetch_uint32(pdb->tdb, "INFO/nextjob", &jobid)) {
1793 if (tdb_error(pdb->tdb) != TDB_ERR_NOEXIST) {
1794 DEBUG(0, ("allocate_print_jobid: failed to fetch INFO/nextjob for print queue %s\n",
1801 jobid = NEXT_JOBID(jobid);
1803 if (tdb_store_int32(pdb->tdb, "INFO/nextjob", jobid)==-1) {
1804 DEBUG(3, ("allocate_print_jobid: failed to store INFO/nextjob.\n"));
1805 tdb_unlock_bystring(pdb->tdb, "INFO/nextjob");
1809 /* We've finished with the INFO/nextjob lock. */
1810 tdb_unlock_bystring(pdb->tdb, "INFO/nextjob");
1812 if (!print_job_exists(snum, jobid))
1817 DEBUG(0, ("allocate_print_jobid: failed to allocate a print job for queue %s\n",
1819 /* Probably full... */
1824 /* Store a dummy placeholder. */
1829 if (tdb_store(pdb->tdb, print_key(jobid), dum, TDB_INSERT) == -1) {
1830 DEBUG(3, ("allocate_print_jobid: jobid (%d) failed to store placeholder.\n",
1840 /***************************************************************************
1841 Append a jobid to the 'jobs changed' list.
1842 ***************************************************************************/
1844 static BOOL add_to_jobs_changed(struct tdb_print_db *pdb, uint32 jobid)
1848 key.dptr = "INFO/jobs_changed";
1849 key.dsize = strlen(key.dptr);
1850 data.dptr = (char *)&jobid;
1853 DEBUG(10,("add_to_jobs_changed: Added jobid %u\n", (unsigned int)jobid ));
1855 return (tdb_append(pdb->tdb, key, data) == 0);
1858 /***************************************************************************
1859 Start spooling a job - return the jobid.
1860 ***************************************************************************/
1862 uint32 print_job_start(struct current_user *user, int snum, char *jobname, NT_DEVICEMODE *nt_devmode )
1866 struct printjob pjob;
1868 const char *printername = lp_const_servicename(snum);
1869 struct tdb_print_db *pdb = get_print_db_byname(printername);
1877 if (!print_access_check(user, snum, PRINTER_ACCESS_USE)) {
1878 DEBUG(3, ("print_job_start: job start denied by security descriptor\n"));
1879 release_print_db(pdb);
1883 if (!print_time_access_check(snum)) {
1884 DEBUG(3, ("print_job_start: job start denied by time check\n"));
1885 release_print_db(pdb);
1889 path = lp_pathname(snum);
1891 /* see if we have sufficient disk space */
1892 if (lp_minprintspace(snum)) {
1893 SMB_BIG_UINT dspace, dsize;
1894 if (sys_fsusage(path, &dspace, &dsize) == 0 &&
1895 dspace < 2*(SMB_BIG_UINT)lp_minprintspace(snum)) {
1896 DEBUG(3, ("print_job_start: disk space check failed.\n"));
1897 release_print_db(pdb);
1903 /* for autoloaded printers, check that the printcap entry still exists */
1904 if (lp_autoloaded(snum) && !pcap_printername_ok(lp_const_servicename(snum), NULL)) {
1905 DEBUG(3, ("print_job_start: printer name %s check failed.\n", lp_const_servicename(snum) ));
1906 release_print_db(pdb);
1911 /* Insure the maximum queue size is not violated */
1912 if ((njobs = print_queue_length(snum,NULL)) > lp_maxprintjobs(snum)) {
1913 DEBUG(3, ("print_job_start: Queue %s number of jobs (%d) larger than max printjobs per queue (%d).\n",
1914 printername, njobs, lp_maxprintjobs(snum) ));
1915 release_print_db(pdb);
1920 DEBUG(10,("print_job_start: Queue %s number of jobs (%d), max printjobs = %d\n",
1921 printername, njobs, lp_maxprintjobs(snum) ));
1923 if (!allocate_print_jobid(pdb, snum, printername, &jobid))
1926 /* create the database entry */
1930 pjob.pid = local_pid;
1933 pjob.starttime = time(NULL);
1934 pjob.status = LPQ_SPOOLING;
1936 pjob.spooled = False;
1938 pjob.nt_devmode = nt_devmode;
1940 fstrcpy(pjob.jobname, jobname);
1942 if ((vuser = get_valid_user_struct(user->vuid)) != NULL) {
1943 fstrcpy(pjob.user, vuser->user.smb_name);
1945 fstrcpy(pjob.user, uidtoname(user->uid));
1948 fstrcpy(pjob.queuename, lp_const_servicename(snum));
1950 /* we have a job entry - now create the spool file */
1951 slprintf(pjob.filename, sizeof(pjob.filename)-1, "%s/%s%.8u.XXXXXX",
1952 path, PRINT_SPOOL_PREFIX, (unsigned int)jobid);
1953 pjob.fd = smb_mkstemp(pjob.filename);
1955 if (pjob.fd == -1) {
1956 if (errno == EACCES) {
1957 /* Common setup error, force a report. */
1958 DEBUG(0, ("print_job_start: insufficient permissions \
1959 to open spool file %s.\n", pjob.filename));
1961 /* Normal case, report at level 3 and above. */
1962 DEBUG(3, ("print_job_start: can't open spool file %s,\n", pjob.filename));
1963 DEBUGADD(3, ("errno = %d (%s).\n", errno, strerror(errno)));
1968 pjob_store(snum, jobid, &pjob);
1970 /* Update the 'jobs changed' entry used by print_queue_status. */
1971 add_to_jobs_changed(pdb, jobid);
1973 /* Ensure we keep a rough count of the number of total jobs... */
1974 tdb_change_int32_atomic(pdb->tdb, "INFO/total_jobs", &njobs, 1);
1976 release_print_db(pdb);
1982 pjob_delete(snum, jobid);
1984 release_print_db(pdb);
1986 DEBUG(3, ("print_job_start: returning fail. Error = %s\n", strerror(errno) ));
1990 /****************************************************************************
1991 Update the number of pages spooled to jobid
1992 ****************************************************************************/
1994 void print_job_endpage(int snum, uint32 jobid)
1996 struct printjob *pjob = print_job_find(snum, jobid);
1999 /* don't allow another process to get this info - it is meaningless */
2000 if (pjob->pid != local_pid)
2004 pjob_store(snum, jobid, pjob);
2007 /****************************************************************************
2008 Print a file - called on closing the file. This spools the job.
2009 If normal close is false then we're tearing down the jobs - treat as an
2011 ****************************************************************************/
2013 BOOL print_job_end(int snum, uint32 jobid, BOOL normal_close)
2015 struct printjob *pjob = print_job_find(snum, jobid);
2017 SMB_STRUCT_STAT sbuf;
2022 if (pjob->spooled || pjob->pid != local_pid)
2025 if (normal_close && (sys_fstat(pjob->fd, &sbuf) == 0)) {
2026 pjob->size = sbuf.st_size;
2032 * Not a normal close or we couldn't stat the job file,
2033 * so something has gone wrong. Cleanup.
2037 DEBUG(3,("print_job_end: failed to stat file for jobid %d\n", jobid ));
2041 /* Technically, this is not quite right. If the printer has a separator
2042 * page turned on, the NT spooler prints the separator page even if the
2043 * print job is 0 bytes. 010215 JRR */
2044 if (pjob->size == 0 || pjob->status == LPQ_DELETING) {
2045 /* don't bother spooling empty files or something being deleted. */
2046 DEBUG(5,("print_job_end: canceling spool of %s (%s)\n",
2047 pjob->filename, pjob->size ? "deleted" : "zero length" ));
2048 unlink(pjob->filename);
2049 pjob_delete(snum, jobid);
2053 ret = (*(current_printif->job_submit))(snum, pjob);
2058 /* The print job has been sucessfully handed over to the back-end */
2060 pjob->spooled = True;
2061 pjob->status = LPQ_QUEUED;
2062 pjob_store(snum, jobid, pjob);
2064 /* make sure the database is up to date */
2065 if (print_cache_expired(snum))
2066 print_queue_update(snum);
2072 /* The print job was not succesfully started. Cleanup */
2073 /* Still need to add proper error return propagation! 010122:JRR */
2074 unlink(pjob->filename);
2075 pjob_delete(snum, jobid);
2076 remove_from_jobs_changed(snum, jobid);
2080 /****************************************************************************
2081 Get a snapshot of jobs in the system without traversing.
2082 ****************************************************************************/
2084 static BOOL get_stored_queue_info(struct tdb_print_db *pdb, int snum, int *pcount, print_queue_struct **ppqueue)
2086 TDB_DATA data, key, cgdata;
2087 print_queue_struct *queue = NULL;
2089 uint32 extra_count = 0;
2090 int total_count = 0;
2092 int max_reported_jobs = lp_max_reported_jobs(snum);
2095 /* make sure the database is up to date */
2096 if (print_cache_expired(snum))
2097 print_queue_update(snum);
2103 ZERO_STRUCT(cgdata);
2104 key.dptr = "INFO/linear_queue_array";
2105 key.dsize = strlen(key.dptr);
2107 /* Get the stored queue data. */
2108 data = tdb_fetch(pdb->tdb, key);
2110 if (data.dptr == NULL || data.dsize < 4)
2113 memcpy(&qcount, data.dptr, 4);
2115 /* Get the changed jobs list. */
2116 key.dptr = "INFO/jobs_changed";
2117 key.dsize = strlen(key.dptr);
2119 cgdata = tdb_fetch(pdb->tdb, key);
2120 if (cgdata.dptr != NULL && (cgdata.dsize % 4 == 0))
2121 extra_count = cgdata.dsize/4;
2123 DEBUG(5,("get_stored_queue_info: qcount = %u, extra_count = %u\n", (unsigned int)qcount, (unsigned int)extra_count));
2125 /* Allocate the queue size. */
2126 if (qcount == 0 && extra_count == 0)
2129 if ((queue = (print_queue_struct *)malloc(sizeof(print_queue_struct)*(qcount + extra_count))) == NULL)
2132 /* Retrieve the linearised queue data. */
2133 for( i = 0; i < qcount; i++) {
2135 uint32 qjob, qsize, qpage_count, qstatus, qpriority, qtime;
2136 len += tdb_unpack(data.dptr + 4 + len, data.dsize - len, NULL, "ddddddff",
2145 queue[i].job = qjob;
2146 queue[i].size = qsize;
2147 queue[i].page_count = qpage_count;
2148 queue[i].status = qstatus;
2149 queue[i].priority = qpriority;
2150 queue[i].time = qtime;
2153 total_count = qcount;
2155 /* Add in the changed jobids. */
2156 for( i = 0; i < extra_count; i++) {
2158 struct printjob *pjob;
2160 memcpy(&jobid, &cgdata.dptr[i*4], 4);
2161 DEBUG(5,("get_stored_queue_info: changed job = %u\n", (unsigned int)jobid));
2162 pjob = print_job_find(snum, jobid);
2164 DEBUG(5,("get_stored_queue_info: failed to find changed job = %u\n", (unsigned int)jobid));
2165 remove_from_jobs_changed(snum, jobid);
2169 queue[total_count].job = jobid;
2170 queue[total_count].size = pjob->size;
2171 queue[total_count].page_count = pjob->page_count;
2172 queue[total_count].status = pjob->status;
2173 queue[total_count].priority = 1;
2174 fstrcpy(queue[total_count].fs_user, pjob->user);
2175 fstrcpy(queue[total_count].fs_file, pjob->jobname);
2179 /* Sort the queue by submission time otherwise they are displayed
2182 qsort(queue, total_count, sizeof(print_queue_struct), QSORT_CAST(printjob_comp));
2184 DEBUG(5,("get_stored_queue_info: total_count = %u\n", (unsigned int)total_count));
2186 if (max_reported_jobs && total_count > max_reported_jobs)
2187 total_count = max_reported_jobs;
2190 *pcount = total_count;
2196 SAFE_FREE(data.dptr);
2197 SAFE_FREE(cgdata.dptr);
2201 /****************************************************************************
2202 Get a printer queue listing.
2203 set queue = NULL and status = NULL if you just want to update the cache
2204 ****************************************************************************/
2206 int print_queue_status(int snum,
2207 print_queue_struct **ppqueue,
2208 print_status_struct *status)
2212 const char *printername;
2213 struct tdb_print_db *pdb;
2216 /* make sure the database is up to date */
2218 if (print_cache_expired(snum))
2219 print_queue_update(snum);
2221 /* return if we are done */
2222 if ( !ppqueue || !status )
2226 printername = lp_const_servicename(snum);
2227 pdb = get_print_db_byname(printername);
2233 * Fetch the queue status. We must do this first, as there may
2234 * be no jobs in the queue.
2237 ZERO_STRUCTP(status);
2238 slprintf(keystr, sizeof(keystr)-1, "STATUS/%s", printername);
2240 key.dsize = strlen(keystr);
2241 data = tdb_fetch(pdb->tdb, key);
2243 if (data.dsize == sizeof(*status)) {
2244 memcpy(status, data.dptr, sizeof(*status));
2246 SAFE_FREE(data.dptr);
2250 * Now, fetch the print queue information. We first count the number
2251 * of entries, and then only retrieve the queue if necessary.
2254 if (!get_stored_queue_info(pdb, snum, &count, ppqueue)) {
2255 release_print_db(pdb);
2259 release_print_db(pdb);
2263 /****************************************************************************
2265 ****************************************************************************/
2267 BOOL print_queue_pause(struct current_user *user, int snum, WERROR *errcode)
2271 if (!print_access_check(user, snum, PRINTER_ACCESS_ADMINISTER)) {
2272 *errcode = WERR_ACCESS_DENIED;
2276 ret = (*(current_printif->queue_pause))(snum);
2279 *errcode = WERR_INVALID_PARAM;
2283 /* force update the database */
2284 print_cache_flush(snum);
2286 /* Send a printer notify message */
2288 notify_printer_status(snum, PRINTER_STATUS_PAUSED);
2293 /****************************************************************************
2295 ****************************************************************************/
2297 BOOL print_queue_resume(struct current_user *user, int snum, WERROR *errcode)
2301 if (!print_access_check(user, snum, PRINTER_ACCESS_ADMINISTER)) {
2302 *errcode = WERR_ACCESS_DENIED;
2306 ret = (*(current_printif->queue_resume))(snum);
2309 *errcode = WERR_INVALID_PARAM;
2313 /* make sure the database is up to date */
2314 if (print_cache_expired(snum))
2315 print_queue_update(snum);
2317 /* Send a printer notify message */
2319 notify_printer_status(snum, PRINTER_STATUS_OK);
2324 /****************************************************************************
2325 Purge a queue - implemented by deleting all jobs that we can delete.
2326 ****************************************************************************/
2328 BOOL print_queue_purge(struct current_user *user, int snum, WERROR *errcode)
2330 print_queue_struct *queue;
2331 print_status_struct status;
2335 /* Force and update so the count is accurate (i.e. not a cached count) */
2336 print_queue_update(snum);
2338 can_job_admin = print_access_check(user, snum, JOB_ACCESS_ADMINISTER);
2339 njobs = print_queue_status(snum, &queue, &status);
2341 for (i=0;i<njobs;i++) {
2342 BOOL owner = is_owner(user, snum, queue[i].job);
2344 if (owner || can_job_admin) {
2345 print_job_delete1(snum, queue[i].job);