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.
26 /* Current printer interface */
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 rap_jobid = SVAL(data.dptr, 0);
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 rap_jobid = SVAL(data.dptr, 0);
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 /* do NT print initialization... */
209 return nt_printing_init();
212 /****************************************************************************
213 Shut down printing backend. Called once at shutdown to close the tdb.
214 ****************************************************************************/
216 void printing_end(void)
218 close_all_print_db(); /* Don't leave any open. */
221 /****************************************************************************
222 Retrieve the set of printing functions for a given service. This allows
223 us to set the printer function table based on the value of the 'printing'
226 Use the generic interface as the default and only use cups interface only
227 when asked for (and only when supported)
228 ****************************************************************************/
230 static struct printif *get_printer_fns( int snum )
232 struct printif *printer_fns = &generic_printif;
235 if ( lp_printing(snum) == PRINT_CUPS ) {
236 printer_fns = &cups_printif;
238 #endif /* HAVE_CUPS */
243 /****************************************************************************
244 Useful function to generate a tdb key.
245 ****************************************************************************/
247 static TDB_DATA print_key(uint32 jobid)
253 ret.dptr = (void *)&j;
254 ret.dsize = sizeof(j);
258 /***********************************************************************
259 unpack a pjob from a tdb buffer
260 ***********************************************************************/
262 int unpack_pjob( char* buf, int buflen, struct printjob *pjob )
266 uint32 pjpid, pjsysjob, pjfd, pjstarttime, pjstatus;
267 uint32 pjsize, pjpage_count, pjspooled, pjsmbjob;
272 len += tdb_unpack(buf+len, buflen-len, "dddddddddffff",
290 if ( (used = unpack_devicemode(&pjob->nt_devmode, buf+len, buflen-len)) == -1 )
296 pjob->sysjob = pjsysjob;
298 pjob->starttime = pjstarttime;
299 pjob->status = pjstatus;
301 pjob->page_count = pjpage_count;
302 pjob->spooled = pjspooled;
303 pjob->smbjob = pjsmbjob;
309 /****************************************************************************
310 Useful function to find a print job in the database.
311 ****************************************************************************/
313 static struct printjob *print_job_find(int snum, uint32 jobid)
315 static struct printjob pjob;
317 struct tdb_print_db *pdb = get_print_db_byname(lp_const_servicename(snum));
323 ret = tdb_fetch(pdb->tdb, print_key(jobid));
324 release_print_db(pdb);
329 if ( pjob.nt_devmode )
330 free_nt_devicemode( &pjob.nt_devmode );
334 if ( unpack_pjob( ret.dptr, ret.dsize, &pjob ) == -1 ) {
343 /* Convert a unix jobid to a smb jobid */
345 static uint32 sysjob_to_jobid_value;
347 static int unixjob_traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA key,
348 TDB_DATA data, void *state)
350 struct printjob *pjob;
351 int *sysjob = (int *)state;
353 if (!data.dptr || data.dsize == 0)
356 pjob = (struct printjob *)data.dptr;
357 if (key.dsize != sizeof(uint32))
360 if (*sysjob == pjob->sysjob) {
361 uint32 *jobid = (uint32 *)key.dptr;
363 sysjob_to_jobid_value = *jobid;
370 /****************************************************************************
371 This is a *horribly expensive call as we have to iterate through all the
372 current printer tdb's. Don't do this often ! JRA.
373 ****************************************************************************/
375 uint32 sysjob_to_jobid(int unix_jobid)
377 int services = lp_numservices();
380 sysjob_to_jobid_value = (uint32)-1;
382 for (snum = 0; snum < services; snum++) {
383 struct tdb_print_db *pdb;
384 if (!lp_print_ok(snum))
386 pdb = get_print_db_byname(lp_const_servicename(snum));
388 tdb_traverse(pdb->tdb, unixjob_traverse_fn, &unix_jobid);
389 release_print_db(pdb);
390 if (sysjob_to_jobid_value != (uint32)-1)
391 return sysjob_to_jobid_value;
396 /****************************************************************************
397 Send notifications based on what has changed after a pjob_store.
398 ****************************************************************************/
402 uint32 spoolss_status;
403 } lpq_to_spoolss_status_map[] = {
404 { LPQ_QUEUED, JOB_STATUS_QUEUED },
405 { LPQ_PAUSED, JOB_STATUS_PAUSED },
406 { LPQ_SPOOLING, JOB_STATUS_SPOOLING },
407 { LPQ_PRINTING, JOB_STATUS_PRINTING },
408 { LPQ_DELETING, JOB_STATUS_DELETING },
409 { LPQ_OFFLINE, JOB_STATUS_OFFLINE },
410 { LPQ_PAPEROUT, JOB_STATUS_PAPEROUT },
411 { LPQ_PRINTED, JOB_STATUS_PRINTED },
412 { LPQ_DELETED, JOB_STATUS_DELETED },
413 { LPQ_BLOCKED, JOB_STATUS_BLOCKED },
414 { LPQ_USER_INTERVENTION, JOB_STATUS_USER_INTERVENTION },
418 /* Convert a lpq status value stored in printing.tdb into the
419 appropriate win32 API constant. */
421 static uint32 map_to_spoolss_status(uint32 lpq_status)
425 while (lpq_to_spoolss_status_map[i].lpq_status != -1) {
426 if (lpq_to_spoolss_status_map[i].lpq_status == lpq_status)
427 return lpq_to_spoolss_status_map[i].spoolss_status;
434 static void pjob_store_notify(int snum, uint32 jobid, struct printjob *old_data,
435 struct printjob *new_data)
437 BOOL new_job = False;
442 /* Notify the job name first */
444 if (new_job || !strequal(old_data->jobname, new_data->jobname))
445 notify_job_name(snum, jobid, new_data->jobname);
447 /* Job attributes that can't be changed. We only send
448 notification for these on a new job. */
451 notify_job_submitted(snum, jobid, new_data->starttime);
452 notify_job_username(snum, jobid, new_data->user);
455 /* Job attributes of a new job or attributes that can be
458 if (new_job || old_data->status != new_data->status)
459 notify_job_status(snum, jobid, map_to_spoolss_status(new_data->status));
461 if (new_job || old_data->size != new_data->size)
462 notify_job_total_bytes(snum, jobid, new_data->size);
464 if (new_job || old_data->page_count != new_data->page_count)
465 notify_job_total_pages(snum, jobid, new_data->page_count);
468 /****************************************************************************
469 Store a job structure back to the database.
470 ****************************************************************************/
472 static BOOL pjob_store(int snum, uint32 jobid, struct printjob *pjob)
474 TDB_DATA old_data, new_data;
476 struct tdb_print_db *pdb = get_print_db_byname(lp_const_servicename(snum));
478 int len, newlen, buflen;
486 old_data = tdb_fetch(pdb->tdb, print_key(jobid));
488 /* Doh! Now we have to pack/unpack data since the NT_DEVICEMODE was added */
495 len += tdb_pack(buf+len, buflen-len, "dddddddddffff",
497 (uint32)pjob->sysjob,
499 (uint32)pjob->starttime,
500 (uint32)pjob->status,
502 (uint32)pjob->page_count,
503 (uint32)pjob->spooled,
504 (uint32)pjob->smbjob,
510 len += pack_devicemode(pjob->nt_devmode, buf+len, buflen-len);
515 tb = (char *)Realloc(buf, len);
517 DEBUG(0,("pjob_store: failed to enlarge buffer!\n"));
524 } while ( buflen != len );
530 new_data.dsize = len;
531 ret = (tdb_store(pdb->tdb, print_key(jobid), new_data, TDB_REPLACE) == 0);
533 release_print_db(pdb);
535 /* Send notify updates for what has changed */
537 if ( ret && (old_data.dsize == 0 || old_data.dsize == sizeof(*pjob)) )
538 pjob_store_notify( snum, jobid, (struct printjob *)old_data.dptr, pjob );
541 SAFE_FREE( old_data.dptr );
547 /****************************************************************************
548 Remove a job structure from the database.
549 ****************************************************************************/
551 void pjob_delete(int snum, uint32 jobid)
553 struct printjob *pjob = print_job_find(snum, jobid);
554 uint32 job_status = 0;
555 struct tdb_print_db *pdb = get_print_db_byname(lp_const_servicename(snum));
561 DEBUG(5, ("pjob_delete(): we were asked to delete nonexistent job %u\n",
562 (unsigned int)jobid));
563 release_print_db(pdb);
567 /* Send a notification that a job has been deleted */
569 job_status = map_to_spoolss_status(pjob->status);
571 /* We must cycle through JOB_STATUS_DELETING and
572 JOB_STATUS_DELETED for the port monitor to delete the job
575 job_status |= JOB_STATUS_DELETING;
576 notify_job_status(snum, jobid, job_status);
578 job_status |= JOB_STATUS_DELETED;
579 notify_job_status(snum, jobid, job_status);
581 /* Remove from printing.tdb */
583 tdb_delete(pdb->tdb, print_key(jobid));
584 release_print_db(pdb);
585 rap_jobid_delete(snum, jobid);
588 /****************************************************************************
589 Parse a file name from the system spooler to generate a jobid.
590 ****************************************************************************/
592 static uint32 print_parse_jobid(char *fname)
596 if (strncmp(fname,PRINT_SPOOL_PREFIX,strlen(PRINT_SPOOL_PREFIX)) != 0)
598 fname += strlen(PRINT_SPOOL_PREFIX);
604 return (uint32)jobid;
607 /****************************************************************************
608 List a unix job in the print database.
609 ****************************************************************************/
611 static void print_unix_job(int snum, print_queue_struct *q, uint32 jobid)
613 struct printjob pj, *old_pj;
615 if (jobid == (uint32)-1)
616 jobid = q->job + UNIX_JOB_START;
618 /* Preserve the timestamp on an existing unix print job */
620 old_pj = print_job_find(snum, jobid);
627 pj.starttime = old_pj ? old_pj->starttime : q->time;
628 pj.status = q->status;
631 fstrcpy(pj.filename, old_pj ? old_pj->filename : "");
632 if (jobid < UNIX_JOB_START) {
634 fstrcpy(pj.jobname, old_pj ? old_pj->jobname : "Remote Downlevel Document");
637 fstrcpy(pj.jobname, old_pj ? old_pj->jobname : q->fs_file);
639 fstrcpy(pj.user, old_pj ? old_pj->user : q->fs_user);
640 fstrcpy(pj.queuename, old_pj ? old_pj->queuename : lp_const_servicename(snum));
642 pjob_store(snum, jobid, &pj);
646 struct traverse_struct {
647 print_queue_struct *queue;
648 int qcount, snum, maxcount, total_jobs;
652 /****************************************************************************
653 Utility fn to delete any jobs that are no longer active.
654 ****************************************************************************/
656 static int traverse_fn_delete(TDB_CONTEXT *t, TDB_DATA key, TDB_DATA data, void *state)
658 struct traverse_struct *ts = (struct traverse_struct *)state;
659 struct printjob pjob;
663 if ( key.dsize != sizeof(jobid) )
666 jobid = IVAL(key.dptr, 0);
667 if ( unpack_pjob( data.dptr, data.dsize, &pjob ) == -1 )
669 free_nt_devicemode( &pjob.nt_devmode );
672 if (ts->snum != lp_servicenumber(pjob.queuename)) {
673 /* this isn't for the queue we are looking at - this cannot happen with the split tdb's. JRA */
678 /* remove a unix job if it isn't in the system queue any more */
680 for (i=0;i<ts->qcount;i++) {
681 uint32 u_jobid = (ts->queue[i].job + UNIX_JOB_START);
682 if (jobid == u_jobid)
685 if (i == ts->qcount) {
686 DEBUG(10,("traverse_fn_delete: pjob %u deleted due to !smbjob\n",
687 (unsigned int)jobid ));
688 pjob_delete(ts->snum, jobid);
692 /* need to continue the the bottom of the function to
693 save the correct attributes */
696 /* maybe it hasn't been spooled yet */
698 /* if a job is not spooled and the process doesn't
699 exist then kill it. This cleans up after smbd
701 if (!process_exists(pjob.pid)) {
702 DEBUG(10,("traverse_fn_delete: pjob %u deleted due to !process_exists (%u)\n",
703 (unsigned int)jobid, (unsigned int)pjob.pid ));
704 pjob_delete(ts->snum, jobid);
710 /* this check only makes sense for jobs submitted from Windows clients */
713 for (i=0;i<ts->qcount;i++) {
714 uint32 curr_jobid = print_parse_jobid(ts->queue[i].fs_file);
715 if (jobid == curr_jobid)
720 /* The job isn't in the system queue - we have to assume it has
721 completed, so delete the database entry. */
723 if (i == ts->qcount) {
725 /* A race can occur between the time a job is spooled and
726 when it appears in the lpq output. This happens when
727 the job is added to printing.tdb when another smbd
728 running print_queue_update() has completed a lpq and
729 is currently traversing the printing tdb and deleting jobs.
730 Don't delete the job if it was submitted after the lpq_time. */
732 if (pjob.starttime < ts->lpq_time) {
733 DEBUG(10,("traverse_fn_delete: pjob %u deleted due to pjob.starttime (%u) < ts->lpq_time (%u)\n",
735 (unsigned int)pjob.starttime,
736 (unsigned int)ts->lpq_time ));
737 pjob_delete(ts->snum, jobid);
743 /* Save the pjob attributes we will store. */
744 /* FIXME!!! This is the only place where queue->job
745 represents the SMB jobid --jerry */
746 ts->queue[i].job = jobid;
747 ts->queue[i].size = pjob.size;
748 ts->queue[i].page_count = pjob.page_count;
749 ts->queue[i].status = pjob.status;
750 ts->queue[i].priority = 1;
751 ts->queue[i].time = pjob.starttime;
752 fstrcpy(ts->queue[i].fs_user, pjob.user);
753 fstrcpy(ts->queue[i].fs_file, pjob.jobname);
760 /****************************************************************************
761 Check if the print queue has been updated recently enough.
762 ****************************************************************************/
764 static void print_cache_flush(int snum)
767 const char *printername = lp_const_servicename(snum);
768 struct tdb_print_db *pdb = get_print_db_byname(printername);
772 slprintf(key, sizeof(key)-1, "CACHE/%s", printername);
773 tdb_store_int32(pdb->tdb, key, -1);
774 release_print_db(pdb);
777 /****************************************************************************
778 Check if someone already thinks they are doing the update.
779 ****************************************************************************/
781 static pid_t get_updating_pid(fstring printer_name)
786 struct tdb_print_db *pdb = get_print_db_byname(printer_name);
790 slprintf(keystr, sizeof(keystr)-1, "UPDATING/%s", printer_name);
792 key.dsize = strlen(keystr);
794 data = tdb_fetch(pdb->tdb, key);
795 release_print_db(pdb);
796 if (!data.dptr || data.dsize != sizeof(pid_t)) {
797 SAFE_FREE(data.dptr);
801 updating_pid = IVAL(data.dptr, 0);
802 SAFE_FREE(data.dptr);
804 if (process_exists(updating_pid))
810 /****************************************************************************
811 Set the fact that we're doing the update, or have finished doing the update
813 ****************************************************************************/
815 static void set_updating_pid(const fstring printer_name, BOOL delete)
820 pid_t updating_pid = sys_getpid();
821 struct tdb_print_db *pdb = get_print_db_byname(printer_name);
826 slprintf(keystr, sizeof(keystr)-1, "UPDATING/%s", printer_name);
828 key.dsize = strlen(keystr);
831 tdb_delete(pdb->tdb, key);
832 release_print_db(pdb);
836 data.dptr = (void *)&updating_pid;
837 data.dsize = sizeof(pid_t);
839 tdb_store(pdb->tdb, key, data, TDB_REPLACE);
840 release_print_db(pdb);
843 /****************************************************************************
844 Sort print jobs by submittal time.
845 ****************************************************************************/
847 static int printjob_comp(print_queue_struct *j1, print_queue_struct *j2)
858 /* Sort on job start time */
860 if (j1->time == j2->time)
862 return (j1->time > j2->time) ? 1 : -1;
865 /****************************************************************************
866 Store the sorted queue representation for later portmon retrieval.
867 ****************************************************************************/
869 static void store_queue_struct(struct tdb_print_db *pdb, struct traverse_struct *pts)
872 int max_reported_jobs = lp_max_reported_jobs(pts->snum);
873 print_queue_struct *queue = pts->queue;
878 if (max_reported_jobs && (max_reported_jobs < pts->qcount))
879 pts->qcount = max_reported_jobs;
880 qcount = pts->qcount;
882 /* Work out the size. */
884 data.dsize += tdb_pack(NULL, 0, "d", qcount);
886 for (i = 0; i < pts->qcount; i++) {
887 data.dsize += tdb_pack(NULL, 0, "ddddddff",
888 (uint32)queue[i].job,
889 (uint32)queue[i].size,
890 (uint32)queue[i].page_count,
891 (uint32)queue[i].status,
892 (uint32)queue[i].priority,
893 (uint32)queue[i].time,
898 if ((data.dptr = malloc(data.dsize)) == NULL)
902 len += tdb_pack(data.dptr + len, data.dsize - len, "d", qcount);
903 for (i = 0; i < pts->qcount; i++) {
904 len += tdb_pack(data.dptr + len, data.dsize - len, "ddddddff",
905 (uint32)queue[i].job,
906 (uint32)queue[i].size,
907 (uint32)queue[i].page_count,
908 (uint32)queue[i].status,
909 (uint32)queue[i].priority,
910 (uint32)queue[i].time,
915 key.dptr = "INFO/linear_queue_array";
916 key.dsize = strlen(key.dptr);
917 tdb_store(pdb->tdb, key, data, TDB_REPLACE);
918 SAFE_FREE(data.dptr);
922 static TDB_DATA get_jobs_changed_data(struct tdb_print_db *pdb)
926 key.dptr = "INFO/jobs_changed";
927 key.dsize = strlen(key.dptr);
930 data = tdb_fetch(pdb->tdb, key);
931 if (data.dptr == NULL || data.dsize == 0 || (data.dsize % 4 != 0)) {
932 SAFE_FREE(data.dptr);
939 static void check_job_changed(int snum, TDB_DATA data, uint32 jobid)
942 unsigned int job_count = data.dsize / 4;
944 for (i = 0; i < job_count; i++) {
947 ch_jobid = IVAL(data.dptr, i*4);
948 if (ch_jobid == jobid)
949 remove_from_jobs_changed(snum, jobid);
953 /****************************************************************************
954 Update the internal database from the system print queue for a queue.
955 ****************************************************************************/
957 static void print_queue_update(int snum)
960 print_queue_struct *queue = NULL;
961 print_status_struct status;
962 print_status_struct old_status;
963 struct printjob *pjob;
964 struct traverse_struct tstruct;
965 fstring keystr, printer_name, cachestr;
968 struct tdb_print_db *pdb;
969 struct printif *current_printif = get_printer_fns( snum );
971 fstrcpy(printer_name, lp_const_servicename(snum));
972 pdb = get_print_db_byname(printer_name);
977 * Check to see if someone else is doing this update.
978 * This is essentially a mutex on the update.
981 if (get_updating_pid(printer_name) != -1) {
982 release_print_db(pdb);
986 /* Lock the queue for the database update */
988 slprintf(keystr, sizeof(keystr) - 1, "LOCK/%s", printer_name);
989 /* Only wait 10 seconds for this. */
990 if (tdb_lock_bystring(pdb->tdb, keystr, 10) == -1) {
991 DEBUG(0,("print_queue_update: Failed to lock printer %s database\n", printer_name));
992 release_print_db(pdb);
997 * Ensure that no one else got in here.
998 * If the updating pid is still -1 then we are
1002 if (get_updating_pid(printer_name) != -1) {
1004 * Someone else is doing the update, exit.
1006 tdb_unlock_bystring(pdb->tdb, keystr);
1007 release_print_db(pdb);
1012 * We're going to do the update ourselves.
1015 /* Tell others we're doing the update. */
1016 set_updating_pid(printer_name, False);
1019 * Allow others to enter and notice we're doing
1023 tdb_unlock_bystring(pdb->tdb, keystr);
1026 * Update the cache time FIRST ! Stops others even
1027 * attempting to get the lock and doing this
1028 * if the lpq takes a long time.
1031 slprintf(cachestr, sizeof(cachestr)-1, "CACHE/%s", printer_name);
1032 tdb_store_int32(pdb->tdb, cachestr, (int)time(NULL));
1034 /* get the current queue using the appropriate interface */
1035 ZERO_STRUCT(status);
1037 qcount = (*(current_printif->queue_get))(snum, &queue, &status);
1039 DEBUG(3, ("%d job%s in queue for %s\n", qcount, (qcount != 1) ?
1040 "s" : "", printer_name));
1042 /* Sort the queue by submission time otherwise they are displayed
1045 qsort(queue, qcount, sizeof(print_queue_struct),
1046 QSORT_CAST(printjob_comp));
1049 any job in the internal database that is marked as spooled
1050 and doesn't exist in the system queue is considered finished
1051 and removed from the database
1053 any job in the system database but not in the internal database
1054 is added as a unix job
1056 fill in any system job numbers as we go
1059 jcdata = get_jobs_changed_data(pdb);
1061 for (i=0; i<qcount; i++) {
1062 uint32 jobid = print_parse_jobid(queue[i].fs_file);
1064 if (jobid == (uint32)-1) {
1065 /* assume its a unix print job */
1066 print_unix_job(snum, &queue[i], jobid);
1070 /* we have an active SMB print job - update its status */
1071 pjob = print_job_find(snum, jobid);
1073 /* err, somethings wrong. Probably smbd was restarted
1074 with jobs in the queue. All we can do is treat them
1075 like unix jobs. Pity. */
1076 print_unix_job(snum, &queue[i], jobid);
1080 pjob->sysjob = queue[i].job;
1081 pjob->status = queue[i].status;
1082 pjob_store(snum, jobid, pjob);
1083 check_job_changed(snum, jcdata, jobid);
1086 SAFE_FREE(jcdata.dptr);
1088 /* now delete any queued entries that don't appear in the
1090 tstruct.queue = queue;
1091 tstruct.qcount = qcount;
1092 tstruct.snum = snum;
1093 tstruct.total_jobs = 0;
1094 tstruct.lpq_time = time(NULL);
1096 tdb_traverse(pdb->tdb, traverse_fn_delete, (void *)&tstruct);
1098 /* Store the linearised queue, max jobs only. */
1099 store_queue_struct(pdb, &tstruct);
1101 SAFE_FREE(tstruct.queue);
1103 DEBUG(10,("print_queue_update: printer %s INFO/total_jobs = %d\n",
1104 printer_name, tstruct.total_jobs ));
1106 tdb_store_int32(pdb->tdb, "INFO/total_jobs", tstruct.total_jobs);
1108 get_queue_status(snum, &old_status);
1109 if (old_status.qcount != qcount)
1110 DEBUG(10,("print_queue_update: queue status change %d jobs -> %d jobs for printer %s\n",
1111 old_status.qcount, qcount, printer_name ));
1113 /* store the new queue status structure */
1114 slprintf(keystr, sizeof(keystr)-1, "STATUS/%s", printer_name);
1116 key.dsize = strlen(keystr);
1118 status.qcount = qcount;
1119 data.dptr = (void *)&status;
1120 data.dsize = sizeof(status);
1121 tdb_store(pdb->tdb, key, data, TDB_REPLACE);
1124 * Update the cache time again. We want to do this call
1125 * as little as possible...
1128 slprintf(keystr, sizeof(keystr)-1, "CACHE/%s", printer_name);
1129 tdb_store_int32(pdb->tdb, keystr, (int32)time(NULL));
1131 /* Delete our pid from the db. */
1132 set_updating_pid(printer_name, True);
1133 release_print_db(pdb);
1136 /****************************************************************************
1137 Create/Update an entry in the print tdb that will allow us to send notify
1138 updates only to interested smbd's.
1139 ****************************************************************************/
1141 BOOL print_notify_register_pid(int snum)
1144 struct tdb_print_db *pdb = NULL;
1145 TDB_CONTEXT *tdb = NULL;
1146 const char *printername;
1147 uint32 mypid = (uint32)sys_getpid();
1151 /* if (snum == -1), then the change notify request was
1152 on a print server handle and we need to register on
1157 int num_services = lp_numservices();
1160 for ( idx=0; idx<num_services; idx++ ) {
1161 if (lp_snum_ok(idx) && lp_print_ok(idx) )
1162 print_notify_register_pid(idx);
1167 else /* register for a specific printer */
1169 printername = lp_const_servicename(snum);
1170 pdb = get_print_db_byname(printername);
1176 if (tdb_lock_bystring(tdb, NOTIFY_PID_LIST_KEY, 10) == -1) {
1177 DEBUG(0,("print_notify_register_pid: Failed to lock printer %s\n",
1180 release_print_db(pdb);
1184 data = get_printer_notify_pid_list( tdb, printername, True );
1186 /* Add ourselves and increase the refcount. */
1188 for (i = 0; i < data.dsize; i += 8) {
1189 if (IVAL(data.dptr,i) == mypid) {
1190 uint32 new_refcount = IVAL(data.dptr, i+4) + 1;
1191 SIVAL(data.dptr, i+4, new_refcount);
1196 if (i == data.dsize) {
1197 /* We weren't in the list. Realloc. */
1198 data.dptr = Realloc(data.dptr, data.dsize + 8);
1200 DEBUG(0,("print_notify_register_pid: Relloc fail for printer %s\n",
1205 SIVAL(data.dptr,data.dsize - 8,mypid);
1206 SIVAL(data.dptr,data.dsize - 4,1); /* Refcount. */
1209 /* Store back the record. */
1210 if (tdb_store_bystring(tdb, NOTIFY_PID_LIST_KEY, data, TDB_REPLACE) == -1) {
1211 DEBUG(0,("print_notify_register_pid: Failed to update pid \
1212 list for printer %s\n", printername));
1220 tdb_unlock_bystring(tdb, NOTIFY_PID_LIST_KEY);
1222 release_print_db(pdb);
1223 SAFE_FREE(data.dptr);
1227 /****************************************************************************
1228 Update an entry in the print tdb that will allow us to send notify
1229 updates only to interested smbd's.
1230 ****************************************************************************/
1232 BOOL print_notify_deregister_pid(int snum)
1235 struct tdb_print_db *pdb = NULL;
1236 TDB_CONTEXT *tdb = NULL;
1237 const char *printername;
1238 uint32 mypid = (uint32)sys_getpid();
1242 /* if ( snum == -1 ), we are deregister a print server handle
1243 which means to deregister on all print queues */
1247 int num_services = lp_numservices();
1250 for ( idx=0; idx<num_services; idx++ ) {
1251 if ( lp_snum_ok(idx) && lp_print_ok(idx) )
1252 print_notify_deregister_pid(idx);
1257 else /* deregister a specific printer */
1259 printername = lp_const_servicename(snum);
1260 pdb = get_print_db_byname(printername);
1266 if (tdb_lock_bystring(tdb, NOTIFY_PID_LIST_KEY, 10) == -1) {
1267 DEBUG(0,("print_notify_register_pid: Failed to lock \
1268 printer %s database\n", printername));
1270 release_print_db(pdb);
1274 data = get_printer_notify_pid_list( tdb, printername, True );
1276 /* Reduce refcount. Remove ourselves if zero. */
1278 for (i = 0; i < data.dsize; ) {
1279 if (IVAL(data.dptr,i) == mypid) {
1280 uint32 refcount = IVAL(data.dptr, i+4);
1284 if (refcount == 0) {
1285 if (data.dsize - i > 8)
1286 memmove( &data.dptr[i], &data.dptr[i+8], data.dsize - i - 8);
1290 SIVAL(data.dptr, i+4, refcount);
1296 if (data.dsize == 0)
1297 SAFE_FREE(data.dptr);
1299 /* Store back the record. */
1300 if (tdb_store_bystring(tdb, NOTIFY_PID_LIST_KEY, data, TDB_REPLACE) == -1) {
1301 DEBUG(0,("print_notify_register_pid: Failed to update pid \
1302 list for printer %s\n", printername));
1310 tdb_unlock_bystring(tdb, NOTIFY_PID_LIST_KEY);
1312 release_print_db(pdb);
1313 SAFE_FREE(data.dptr);
1317 /****************************************************************************
1318 Check if a jobid is valid. It is valid if it exists in the database.
1319 ****************************************************************************/
1321 BOOL print_job_exists(int snum, uint32 jobid)
1323 struct tdb_print_db *pdb = get_print_db_byname(lp_const_servicename(snum));
1328 ret = tdb_exists(pdb->tdb, print_key(jobid));
1329 release_print_db(pdb);
1333 /****************************************************************************
1334 Give the fd used for a jobid.
1335 ****************************************************************************/
1337 int print_job_fd(int snum, uint32 jobid)
1339 struct printjob *pjob = print_job_find(snum, jobid);
1342 /* don't allow another process to get this info - it is meaningless */
1343 if (pjob->pid != local_pid)
1348 /****************************************************************************
1349 Give the filename used for a jobid.
1350 Only valid for the process doing the spooling and when the job
1351 has not been spooled.
1352 ****************************************************************************/
1354 char *print_job_fname(int snum, uint32 jobid)
1356 struct printjob *pjob = print_job_find(snum, jobid);
1357 if (!pjob || pjob->spooled || pjob->pid != local_pid)
1359 return pjob->filename;
1363 /****************************************************************************
1364 Give the filename used for a jobid.
1365 Only valid for the process doing the spooling and when the job
1366 has not been spooled.
1367 ****************************************************************************/
1369 NT_DEVICEMODE *print_job_devmode(int snum, uint32 jobid)
1371 struct printjob *pjob = print_job_find(snum, jobid);
1376 return pjob->nt_devmode;
1379 /****************************************************************************
1380 Set the place in the queue for a job.
1381 ****************************************************************************/
1383 BOOL print_job_set_place(int snum, uint32 jobid, int place)
1385 DEBUG(2,("print_job_set_place not implemented yet\n"));
1389 /****************************************************************************
1390 Set the name of a job. Only possible for owner.
1391 ****************************************************************************/
1393 BOOL print_job_set_name(int snum, uint32 jobid, char *name)
1395 struct printjob *pjob = print_job_find(snum, jobid);
1396 if (!pjob || pjob->pid != local_pid)
1399 fstrcpy(pjob->jobname, name);
1400 return pjob_store(snum, jobid, pjob);
1403 /***************************************************************************
1404 Remove a jobid from the 'jobs changed' list.
1405 ***************************************************************************/
1407 static BOOL remove_from_jobs_changed(int snum, uint32 jobid)
1409 const char *printername = lp_const_servicename(snum);
1410 struct tdb_print_db *pdb = get_print_db_byname(printername);
1412 size_t job_count, i;
1414 BOOL gotlock = False;
1416 key.dptr = "INFO/jobs_changed";
1417 key.dsize = strlen(key.dptr);
1420 if (tdb_chainlock_with_timeout(pdb->tdb, key, 5) == -1)
1425 data = tdb_fetch(pdb->tdb, key);
1427 if (data.dptr == NULL || data.dsize == 0 || (data.dsize % 4 != 0))
1430 job_count = data.dsize / 4;
1431 for (i = 0; i < job_count; i++) {
1434 ch_jobid = IVAL(data.dptr, i*4);
1435 if (ch_jobid == jobid) {
1436 if (i < job_count -1 )
1437 memmove(data.dptr + (i*4), data.dptr + (i*4) + 4, (job_count - i - 1)*4 );
1439 if (tdb_store(pdb->tdb, key, data, TDB_REPLACE) == -1)
1449 tdb_chainunlock(pdb->tdb, key);
1450 SAFE_FREE(data.dptr);
1451 release_print_db(pdb);
1453 DEBUG(10,("remove_from_jobs_changed: removed jobid %u\n", (unsigned int)jobid ));
1455 DEBUG(10,("remove_from_jobs_changed: Failed to remove jobid %u\n", (unsigned int)jobid ));
1459 /****************************************************************************
1460 Delete a print job - don't update queue.
1461 ****************************************************************************/
1463 static BOOL print_job_delete1(int snum, uint32 jobid)
1465 struct printjob *pjob = print_job_find(snum, jobid);
1467 struct printif *current_printif = get_printer_fns( snum );
1473 * If already deleting just return.
1476 if (pjob->status == LPQ_DELETING)
1479 /* Hrm - we need to be able to cope with deleting a job before it
1480 has reached the spooler. */
1482 if (pjob->sysjob == -1) {
1483 DEBUG(5, ("attempt to delete job %u not seen by lpr\n", (unsigned int)jobid));
1486 /* Set the tdb entry to be deleting. */
1488 pjob->status = LPQ_DELETING;
1489 pjob_store(snum, jobid, pjob);
1491 if (pjob->spooled && pjob->sysjob != -1)
1492 result = (*(current_printif->job_delete))(snum, pjob);
1494 remove_from_jobs_changed(snum, jobid);
1496 /* Delete the tdb entry if the delete succeeded or the job hasn't
1500 const char *printername = lp_const_servicename(snum);
1501 struct tdb_print_db *pdb = get_print_db_byname(printername);
1506 pjob_delete(snum, jobid);
1507 /* Ensure we keep a rough count of the number of total jobs... */
1508 tdb_change_int32_atomic(pdb->tdb, "INFO/total_jobs", &njobs, -1);
1509 release_print_db(pdb);
1512 return (result == 0);
1515 /****************************************************************************
1516 Return true if the current user owns the print job.
1517 ****************************************************************************/
1519 static BOOL is_owner(struct current_user *user, int snum, uint32 jobid)
1521 struct printjob *pjob = print_job_find(snum, jobid);
1527 if ((vuser = get_valid_user_struct(user->vuid)) != NULL) {
1528 return strequal(pjob->user, vuser->user.smb_name);
1530 return strequal(pjob->user, uidtoname(user->uid));
1534 /****************************************************************************
1536 ****************************************************************************/
1538 BOOL print_job_delete(struct current_user *user, int snum, uint32 jobid, WERROR *errcode)
1540 BOOL owner, deleted;
1545 owner = is_owner(user, snum, jobid);
1547 /* Check access against security descriptor or whether the user
1551 !print_access_check(user, snum, JOB_ACCESS_ADMINISTER)) {
1552 DEBUG(3, ("delete denied by security descriptor\n"));
1553 *errcode = WERR_ACCESS_DENIED;
1555 /* BEGIN_ADMIN_LOG */
1556 sys_adminlog( LOG_ERR,
1557 "Permission denied-- user not allowed to delete, \
1558 pause, or resume print job. User name: %s. Printer name: %s.",
1559 uidtoname(user->uid), PRINTERNAME(snum) );
1566 * get the spooled filename of the print job
1567 * if this works, then the file has not been spooled
1568 * to the underlying print system. Just delete the
1569 * spool file & return.
1572 if ( (fname = print_job_fname( snum, jobid )) != NULL )
1574 /* remove the spool file */
1575 DEBUG(10,("print_job_delete: Removing spool file [%s]\n", fname ));
1576 if ( unlink( fname ) == -1 ) {
1577 *errcode = map_werror_from_unix(errno);
1584 if (!print_job_delete1(snum, jobid)) {
1585 *errcode = WERR_ACCESS_DENIED;
1589 /* force update the database and say the delete failed if the
1592 print_queue_update(snum);
1594 deleted = !print_job_exists(snum, jobid);
1596 *errcode = WERR_ACCESS_DENIED;
1601 /****************************************************************************
1603 ****************************************************************************/
1605 BOOL print_job_pause(struct current_user *user, int snum, uint32 jobid, WERROR *errcode)
1607 struct printjob *pjob = print_job_find(snum, jobid);
1609 struct printif *current_printif = get_printer_fns( snum );
1614 if (!pjob->spooled || pjob->sysjob == -1)
1617 if (!is_owner(user, snum, jobid) &&
1618 !print_access_check(user, snum, JOB_ACCESS_ADMINISTER)) {
1619 DEBUG(3, ("pause denied by security descriptor\n"));
1621 /* BEGIN_ADMIN_LOG */
1622 sys_adminlog( LOG_ERR,
1623 "Permission denied-- user not allowed to delete, \
1624 pause, or resume print job. User name: %s. Printer name: %s.",
1625 uidtoname(user->uid), PRINTERNAME(snum) );
1628 *errcode = WERR_ACCESS_DENIED;
1632 /* need to pause the spooled entry */
1633 ret = (*(current_printif->job_pause))(snum, pjob);
1636 *errcode = WERR_INVALID_PARAM;
1640 /* force update the database */
1641 print_cache_flush(snum);
1643 /* Send a printer notify message */
1645 notify_job_status(snum, jobid, JOB_STATUS_PAUSED);
1647 /* how do we tell if this succeeded? */
1652 /****************************************************************************
1654 ****************************************************************************/
1656 BOOL print_job_resume(struct current_user *user, int snum, uint32 jobid, WERROR *errcode)
1658 struct printjob *pjob = print_job_find(snum, jobid);
1660 struct printif *current_printif = get_printer_fns( snum );
1665 if (!pjob->spooled || pjob->sysjob == -1)
1668 if (!is_owner(user, snum, jobid) &&
1669 !print_access_check(user, snum, JOB_ACCESS_ADMINISTER)) {
1670 DEBUG(3, ("resume denied by security descriptor\n"));
1671 *errcode = WERR_ACCESS_DENIED;
1673 /* BEGIN_ADMIN_LOG */
1674 sys_adminlog( LOG_ERR,
1675 "Permission denied-- user not allowed to delete, \
1676 pause, or resume print job. User name: %s. Printer name: %s.",
1677 uidtoname(user->uid), PRINTERNAME(snum) );
1682 ret = (*(current_printif->job_resume))(snum, pjob);
1685 *errcode = WERR_INVALID_PARAM;
1689 /* force update the database */
1690 print_cache_flush(snum);
1692 /* Send a printer notify message */
1694 notify_job_status(snum, jobid, JOB_STATUS_QUEUED);
1699 /****************************************************************************
1700 Write to a print file.
1701 ****************************************************************************/
1703 int print_job_write(int snum, uint32 jobid, const char *buf, int size)
1706 struct printjob *pjob = print_job_find(snum, jobid);
1710 /* don't allow another process to get this info - it is meaningless */
1711 if (pjob->pid != local_pid)
1714 return_code = write(pjob->fd, buf, size);
1715 if (return_code>0) {
1717 pjob_store(snum, jobid, pjob);
1722 /****************************************************************************
1723 Check if the print queue has been updated recently enough.
1724 ****************************************************************************/
1726 static BOOL print_cache_expired(int snum)
1729 time_t last_qscan_time, time_now = time(NULL);
1730 const char *printername = lp_const_servicename(snum);
1731 struct tdb_print_db *pdb = get_print_db_byname(printername);
1736 slprintf(key, sizeof(key), "CACHE/%s", printername);
1737 last_qscan_time = (time_t)tdb_fetch_int32(pdb->tdb, key);
1740 * Invalidate the queue for 3 reasons.
1741 * (1). last queue scan time == -1.
1742 * (2). Current time - last queue scan time > allowed cache time.
1743 * (3). last queue scan time > current time + MAX_CACHE_VALID_TIME (1 hour by default).
1744 * This last test picks up machines for which the clock has been moved
1745 * forward, an lpq scan done and then the clock moved back. Otherwise
1746 * that last lpq scan would stay around for a loooong loooong time... :-). JRA.
1749 if (last_qscan_time == ((time_t)-1) || (time_now - last_qscan_time) >= lp_lpqcachetime() ||
1750 last_qscan_time > (time_now + MAX_CACHE_VALID_TIME)) {
1751 DEBUG(3, ("print cache expired for queue %s \
1752 (last_qscan_time = %d, time now = %d, qcachetime = %d)\n", printername,
1753 (int)last_qscan_time, (int)time_now, (int)lp_lpqcachetime() ));
1754 release_print_db(pdb);
1757 release_print_db(pdb);
1761 /****************************************************************************
1762 Get the queue status - do not update if db is out of date.
1763 ****************************************************************************/
1765 static int get_queue_status(int snum, print_status_struct *status)
1769 const char *printername = lp_const_servicename(snum);
1770 struct tdb_print_db *pdb = get_print_db_byname(printername);
1777 ZERO_STRUCTP(status);
1778 slprintf(keystr, sizeof(keystr)-1, "STATUS/%s", printername);
1780 key.dsize = strlen(keystr);
1781 data = tdb_fetch(pdb->tdb, key);
1783 if (data.dsize == sizeof(print_status_struct))
1784 /* this memcpy is ok since the status struct was
1785 not packed before storing it in the tdb */
1786 memcpy(status, data.dptr, sizeof(print_status_struct));
1787 SAFE_FREE(data.dptr);
1790 len = tdb_fetch_int32(pdb->tdb, "INFO/total_jobs");
1791 release_print_db(pdb);
1792 return (len == -1 ? 0 : len);
1795 /****************************************************************************
1796 Determine the number of jobs in a queue.
1797 ****************************************************************************/
1799 int print_queue_length(int snum, print_status_struct *pstatus)
1801 print_status_struct status;
1804 /* make sure the database is up to date */
1805 if (print_cache_expired(snum))
1806 print_queue_update(snum);
1808 /* also fetch the queue status */
1809 memset(&status, 0, sizeof(status));
1810 len = get_queue_status(snum, &status);
1818 /***************************************************************************
1819 Allocate a jobid. Hold the lock for as short a time as possible.
1820 ***************************************************************************/
1822 static BOOL allocate_print_jobid(struct tdb_print_db *pdb, int snum, const char *printername, uint32 *pjobid)
1827 *pjobid = (uint32)-1;
1829 for (i = 0; i < 3; i++) {
1830 /* Lock the database - only wait 20 seconds. */
1831 if (tdb_lock_bystring(pdb->tdb, "INFO/nextjob", 20) == -1) {
1832 DEBUG(0,("allocate_print_jobid: failed to lock printing database %s\n", printername ));
1836 if (!tdb_fetch_uint32(pdb->tdb, "INFO/nextjob", &jobid)) {
1837 if (tdb_error(pdb->tdb) != TDB_ERR_NOEXIST) {
1838 DEBUG(0, ("allocate_print_jobid: failed to fetch INFO/nextjob for print queue %s\n",
1845 jobid = NEXT_JOBID(jobid);
1847 if (tdb_store_int32(pdb->tdb, "INFO/nextjob", jobid)==-1) {
1848 DEBUG(3, ("allocate_print_jobid: failed to store INFO/nextjob.\n"));
1849 tdb_unlock_bystring(pdb->tdb, "INFO/nextjob");
1853 /* We've finished with the INFO/nextjob lock. */
1854 tdb_unlock_bystring(pdb->tdb, "INFO/nextjob");
1856 if (!print_job_exists(snum, jobid))
1861 DEBUG(0, ("allocate_print_jobid: failed to allocate a print job for queue %s\n",
1863 /* Probably full... */
1868 /* Store a dummy placeholder. */
1873 if (tdb_store(pdb->tdb, print_key(jobid), dum, TDB_INSERT) == -1) {
1874 DEBUG(3, ("allocate_print_jobid: jobid (%d) failed to store placeholder.\n",
1884 /***************************************************************************
1885 Append a jobid to the 'jobs changed' list.
1886 ***************************************************************************/
1888 static BOOL add_to_jobs_changed(struct tdb_print_db *pdb, uint32 jobid)
1892 key.dptr = "INFO/jobs_changed";
1893 key.dsize = strlen(key.dptr);
1894 data.dptr = (char *)&jobid;
1897 DEBUG(10,("add_to_jobs_changed: Added jobid %u\n", (unsigned int)jobid ));
1899 return (tdb_append(pdb->tdb, key, data) == 0);
1902 /***************************************************************************
1903 Start spooling a job - return the jobid.
1904 ***************************************************************************/
1906 uint32 print_job_start(struct current_user *user, int snum, char *jobname, NT_DEVICEMODE *nt_devmode )
1910 struct printjob pjob;
1912 const char *printername = lp_const_servicename(snum);
1913 struct tdb_print_db *pdb = get_print_db_byname(printername);
1921 if (!print_access_check(user, snum, PRINTER_ACCESS_USE)) {
1922 DEBUG(3, ("print_job_start: job start denied by security descriptor\n"));
1923 release_print_db(pdb);
1927 if (!print_time_access_check(snum)) {
1928 DEBUG(3, ("print_job_start: job start denied by time check\n"));
1929 release_print_db(pdb);
1933 path = lp_pathname(snum);
1935 /* see if we have sufficient disk space */
1936 if (lp_minprintspace(snum)) {
1937 SMB_BIG_UINT dspace, dsize;
1938 if (sys_fsusage(path, &dspace, &dsize) == 0 &&
1939 dspace < 2*(SMB_BIG_UINT)lp_minprintspace(snum)) {
1940 DEBUG(3, ("print_job_start: disk space check failed.\n"));
1941 release_print_db(pdb);
1947 /* for autoloaded printers, check that the printcap entry still exists */
1948 if (lp_autoloaded(snum) && !pcap_printername_ok(lp_const_servicename(snum), NULL)) {
1949 DEBUG(3, ("print_job_start: printer name %s check failed.\n", lp_const_servicename(snum) ));
1950 release_print_db(pdb);
1955 /* Insure the maximum queue size is not violated */
1956 if ((njobs = print_queue_length(snum,NULL)) > lp_maxprintjobs(snum)) {
1957 DEBUG(3, ("print_job_start: Queue %s number of jobs (%d) larger than max printjobs per queue (%d).\n",
1958 printername, njobs, lp_maxprintjobs(snum) ));
1959 release_print_db(pdb);
1964 DEBUG(10,("print_job_start: Queue %s number of jobs (%d), max printjobs = %d\n",
1965 printername, njobs, lp_maxprintjobs(snum) ));
1967 if (!allocate_print_jobid(pdb, snum, printername, &jobid))
1970 /* create the database entry */
1974 pjob.pid = local_pid;
1977 pjob.starttime = time(NULL);
1978 pjob.status = LPQ_SPOOLING;
1980 pjob.spooled = False;
1982 pjob.nt_devmode = nt_devmode;
1984 fstrcpy(pjob.jobname, jobname);
1986 if ((vuser = get_valid_user_struct(user->vuid)) != NULL) {
1987 fstrcpy(pjob.user, vuser->user.smb_name);
1989 fstrcpy(pjob.user, uidtoname(user->uid));
1992 fstrcpy(pjob.queuename, lp_const_servicename(snum));
1994 /* we have a job entry - now create the spool file */
1995 slprintf(pjob.filename, sizeof(pjob.filename)-1, "%s/%s%.8u.XXXXXX",
1996 path, PRINT_SPOOL_PREFIX, (unsigned int)jobid);
1997 pjob.fd = smb_mkstemp(pjob.filename);
1999 if (pjob.fd == -1) {
2000 if (errno == EACCES) {
2001 /* Common setup error, force a report. */
2002 DEBUG(0, ("print_job_start: insufficient permissions \
2003 to open spool file %s.\n", pjob.filename));
2005 /* Normal case, report at level 3 and above. */
2006 DEBUG(3, ("print_job_start: can't open spool file %s,\n", pjob.filename));
2007 DEBUGADD(3, ("errno = %d (%s).\n", errno, strerror(errno)));
2012 pjob_store(snum, jobid, &pjob);
2014 /* Update the 'jobs changed' entry used by print_queue_status. */
2015 add_to_jobs_changed(pdb, jobid);
2017 /* Ensure we keep a rough count of the number of total jobs... */
2018 tdb_change_int32_atomic(pdb->tdb, "INFO/total_jobs", &njobs, 1);
2020 release_print_db(pdb);
2026 pjob_delete(snum, jobid);
2028 release_print_db(pdb);
2030 DEBUG(3, ("print_job_start: returning fail. Error = %s\n", strerror(errno) ));
2034 /****************************************************************************
2035 Update the number of pages spooled to jobid
2036 ****************************************************************************/
2038 void print_job_endpage(int snum, uint32 jobid)
2040 struct printjob *pjob = print_job_find(snum, jobid);
2043 /* don't allow another process to get this info - it is meaningless */
2044 if (pjob->pid != local_pid)
2048 pjob_store(snum, jobid, pjob);
2051 /****************************************************************************
2052 Print a file - called on closing the file. This spools the job.
2053 If normal close is false then we're tearing down the jobs - treat as an
2055 ****************************************************************************/
2057 BOOL print_job_end(int snum, uint32 jobid, BOOL normal_close)
2059 struct printjob *pjob = print_job_find(snum, jobid);
2061 SMB_STRUCT_STAT sbuf;
2062 struct printif *current_printif = get_printer_fns( snum );
2067 if (pjob->spooled || pjob->pid != local_pid)
2070 if (normal_close && (sys_fstat(pjob->fd, &sbuf) == 0)) {
2071 pjob->size = sbuf.st_size;
2077 * Not a normal close or we couldn't stat the job file,
2078 * so something has gone wrong. Cleanup.
2082 DEBUG(3,("print_job_end: failed to stat file for jobid %d\n", jobid ));
2086 /* Technically, this is not quite right. If the printer has a separator
2087 * page turned on, the NT spooler prints the separator page even if the
2088 * print job is 0 bytes. 010215 JRR */
2089 if (pjob->size == 0 || pjob->status == LPQ_DELETING) {
2090 /* don't bother spooling empty files or something being deleted. */
2091 DEBUG(5,("print_job_end: canceling spool of %s (%s)\n",
2092 pjob->filename, pjob->size ? "deleted" : "zero length" ));
2093 unlink(pjob->filename);
2094 pjob_delete(snum, jobid);
2098 pjob->smbjob = jobid;
2100 ret = (*(current_printif->job_submit))(snum, pjob);
2105 /* The print job has been sucessfully handed over to the back-end */
2107 pjob->spooled = True;
2108 pjob->status = LPQ_QUEUED;
2109 pjob_store(snum, jobid, pjob);
2111 /* make sure the database is up to date */
2112 if (print_cache_expired(snum))
2113 print_queue_update(snum);
2119 /* The print job was not succesfully started. Cleanup */
2120 /* Still need to add proper error return propagation! 010122:JRR */
2121 unlink(pjob->filename);
2122 pjob_delete(snum, jobid);
2123 remove_from_jobs_changed(snum, jobid);
2127 /****************************************************************************
2128 Get a snapshot of jobs in the system without traversing.
2129 ****************************************************************************/
2131 static BOOL get_stored_queue_info(struct tdb_print_db *pdb, int snum, int *pcount, print_queue_struct **ppqueue)
2133 TDB_DATA data, key, cgdata;
2134 print_queue_struct *queue = NULL;
2136 uint32 extra_count = 0;
2137 int total_count = 0;
2140 int max_reported_jobs = lp_max_reported_jobs(snum);
2143 /* make sure the database is up to date */
2144 if (print_cache_expired(snum))
2145 print_queue_update(snum);
2151 ZERO_STRUCT(cgdata);
2152 key.dptr = "INFO/linear_queue_array";
2153 key.dsize = strlen(key.dptr);
2155 /* Get the stored queue data. */
2156 data = tdb_fetch(pdb->tdb, key);
2158 if (data.dptr && data.dsize >= sizeof(qcount))
2159 len += tdb_unpack(data.dptr + len, data.dsize - len, "d", &qcount);
2161 /* Get the changed jobs list. */
2162 key.dptr = "INFO/jobs_changed";
2163 key.dsize = strlen(key.dptr);
2165 cgdata = tdb_fetch(pdb->tdb, key);
2166 if (cgdata.dptr != NULL && (cgdata.dsize % 4 == 0))
2167 extra_count = cgdata.dsize/4;
2169 DEBUG(5,("get_stored_queue_info: qcount = %u, extra_count = %u\n", (unsigned int)qcount, (unsigned int)extra_count));
2171 /* Allocate the queue size. */
2172 if (qcount == 0 && extra_count == 0)
2175 if ((queue = (print_queue_struct *)malloc(sizeof(print_queue_struct)*(qcount + extra_count))) == NULL)
2178 /* Retrieve the linearised queue data. */
2180 for( i = 0; i < qcount; i++) {
2181 uint32 qjob, qsize, qpage_count, qstatus, qpriority, qtime;
2182 len += tdb_unpack(data.dptr + len, data.dsize - len, "ddddddff",
2191 queue[i].job = qjob;
2192 queue[i].size = qsize;
2193 queue[i].page_count = qpage_count;
2194 queue[i].status = qstatus;
2195 queue[i].priority = qpriority;
2196 queue[i].time = qtime;
2199 total_count = qcount;
2201 /* Add in the changed jobids. */
2202 for( i = 0; i < extra_count; i++) {
2204 struct printjob *pjob;
2206 jobid = IVAL(cgdata.dptr, i*4);
2207 DEBUG(5,("get_stored_queue_info: changed job = %u\n", (unsigned int)jobid));
2208 pjob = print_job_find(snum, jobid);
2210 DEBUG(5,("get_stored_queue_info: failed to find changed job = %u\n", (unsigned int)jobid));
2211 remove_from_jobs_changed(snum, jobid);
2215 queue[total_count].job = jobid;
2216 queue[total_count].size = pjob->size;
2217 queue[total_count].page_count = pjob->page_count;
2218 queue[total_count].status = pjob->status;
2219 queue[total_count].priority = 1;
2220 queue[total_count].time = pjob->starttime;
2221 fstrcpy(queue[total_count].fs_user, pjob->user);
2222 fstrcpy(queue[total_count].fs_file, pjob->jobname);
2226 /* Sort the queue by submission time otherwise they are displayed
2229 qsort(queue, total_count, sizeof(print_queue_struct), QSORT_CAST(printjob_comp));
2231 DEBUG(5,("get_stored_queue_info: total_count = %u\n", (unsigned int)total_count));
2233 if (max_reported_jobs && total_count > max_reported_jobs)
2234 total_count = max_reported_jobs;
2237 *pcount = total_count;
2243 SAFE_FREE(data.dptr);
2244 SAFE_FREE(cgdata.dptr);
2248 /****************************************************************************
2249 Get a printer queue listing.
2250 set queue = NULL and status = NULL if you just want to update the cache
2251 ****************************************************************************/
2253 int print_queue_status(int snum,
2254 print_queue_struct **ppqueue,
2255 print_status_struct *status)
2259 const char *printername;
2260 struct tdb_print_db *pdb;
2263 /* make sure the database is up to date */
2265 if (print_cache_expired(snum))
2266 print_queue_update(snum);
2268 /* return if we are done */
2269 if ( !ppqueue || !status )
2273 printername = lp_const_servicename(snum);
2274 pdb = get_print_db_byname(printername);
2280 * Fetch the queue status. We must do this first, as there may
2281 * be no jobs in the queue.
2284 ZERO_STRUCTP(status);
2285 slprintf(keystr, sizeof(keystr)-1, "STATUS/%s", printername);
2287 key.dsize = strlen(keystr);
2288 data = tdb_fetch(pdb->tdb, key);
2290 if (data.dsize == sizeof(*status)) {
2291 /* this memcpy is ok since the status struct was
2292 not packed before storing it in the tdb */
2293 memcpy(status, data.dptr, sizeof(*status));
2295 SAFE_FREE(data.dptr);
2299 * Now, fetch the print queue information. We first count the number
2300 * of entries, and then only retrieve the queue if necessary.
2303 if (!get_stored_queue_info(pdb, snum, &count, ppqueue)) {
2304 release_print_db(pdb);
2308 release_print_db(pdb);
2312 /****************************************************************************
2314 ****************************************************************************/
2316 BOOL print_queue_pause(struct current_user *user, int snum, WERROR *errcode)
2319 struct printif *current_printif = get_printer_fns( snum );
2321 if (!print_access_check(user, snum, PRINTER_ACCESS_ADMINISTER)) {
2322 *errcode = WERR_ACCESS_DENIED;
2326 ret = (*(current_printif->queue_pause))(snum);
2329 *errcode = WERR_INVALID_PARAM;
2333 /* force update the database */
2334 print_cache_flush(snum);
2336 /* Send a printer notify message */
2338 notify_printer_status(snum, PRINTER_STATUS_PAUSED);
2343 /****************************************************************************
2345 ****************************************************************************/
2347 BOOL print_queue_resume(struct current_user *user, int snum, WERROR *errcode)
2350 struct printif *current_printif = get_printer_fns( snum );
2352 if (!print_access_check(user, snum, PRINTER_ACCESS_ADMINISTER)) {
2353 *errcode = WERR_ACCESS_DENIED;
2357 ret = (*(current_printif->queue_resume))(snum);
2360 *errcode = WERR_INVALID_PARAM;
2364 /* make sure the database is up to date */
2365 if (print_cache_expired(snum))
2366 print_queue_update(snum);
2368 /* Send a printer notify message */
2370 notify_printer_status(snum, PRINTER_STATUS_OK);
2375 /****************************************************************************
2376 Purge a queue - implemented by deleting all jobs that we can delete.
2377 ****************************************************************************/
2379 BOOL print_queue_purge(struct current_user *user, int snum, WERROR *errcode)
2381 print_queue_struct *queue;
2382 print_status_struct status;
2386 /* Force and update so the count is accurate (i.e. not a cached count) */
2387 print_queue_update(snum);
2389 can_job_admin = print_access_check(user, snum, JOB_ACCESS_ADMINISTER);
2390 njobs = print_queue_status(snum, &queue, &status);
2392 for (i=0;i<njobs;i++) {
2393 BOOL owner = is_owner(user, snum, queue[i].job);
2395 if (owner || can_job_admin) {
2396 print_job_delete1(snum, queue[i].job);