s3: Lift the server_messaging_context from print_queue_update_internal
[amitay/samba.git] / source3 / printing / printing.c
index ec9274cb350d95b338f9b473ca6cf4d01f326ad6..ac2e9a2826772629aaf242283ca85e1888f8529b 100644 (file)
@@ -557,7 +557,10 @@ static uint32 map_to_spoolss_status(uint32 lpq_status)
        return 0;
 }
 
-static void pjob_store_notify(const char* sharename, uint32 jobid, struct printjob *old_data,
+static void pjob_store_notify(struct tevent_context *ev,
+                             struct messaging_context *msg_ctx,
+                             const char* sharename, uint32 jobid,
+                             struct printjob *old_data,
                              struct printjob *new_data)
 {
        bool new_job = False;
@@ -576,34 +579,45 @@ static void pjob_store_notify(const char* sharename, uint32 jobid, struct printj
           --jerry (i'll feel dirty for this) */
 
        if (new_job) {
-               notify_job_submitted(sharename, jobid, new_data->starttime);
-               notify_job_username(sharename, jobid, new_data->user);
+               notify_job_submitted(ev, msg_ctx,
+                                    sharename, jobid, new_data->starttime);
+               notify_job_username(ev, msg_ctx,
+                                   sharename, jobid, new_data->user);
        }
 
        if (new_job || !strequal(old_data->jobname, new_data->jobname))
-               notify_job_name(sharename, jobid, new_data->jobname);
+               notify_job_name(ev, msg_ctx,
+                               sharename, jobid, new_data->jobname);
 
        /* Job attributes of a new job or attributes that can be
           modified. */
 
        if (new_job || !strequal(old_data->jobname, new_data->jobname))
-               notify_job_name(sharename, jobid, new_data->jobname);
+               notify_job_name(ev, msg_ctx,
+                               sharename, jobid, new_data->jobname);
 
        if (new_job || old_data->status != new_data->status)
-               notify_job_status(sharename, jobid, map_to_spoolss_status(new_data->status));
+               notify_job_status(ev, msg_ctx,
+                                 sharename, jobid,
+                                 map_to_spoolss_status(new_data->status));
 
        if (new_job || old_data->size != new_data->size)
-               notify_job_total_bytes(sharename, jobid, new_data->size);
+               notify_job_total_bytes(ev, msg_ctx,
+                                      sharename, jobid, new_data->size);
 
        if (new_job || old_data->page_count != new_data->page_count)
-               notify_job_total_pages(sharename, jobid, new_data->page_count);
+               notify_job_total_pages(ev, msg_ctx,
+                                      sharename, jobid, new_data->page_count);
 }
 
 /****************************************************************************
  Store a job structure back to the database.
 ****************************************************************************/
 
-static bool pjob_store(const char* sharename, uint32 jobid, struct printjob *pjob)
+static bool pjob_store(struct tevent_context *ev,
+                      struct messaging_context *msg_ctx,
+                      const char* sharename, uint32 jobid,
+                      struct printjob *pjob)
 {
        uint32_t tmp;
        TDB_DATA                old_data, new_data;
@@ -673,13 +687,17 @@ static bool pjob_store(const char* sharename, uint32 jobid, struct printjob *pjo
                {
                        if ( unpack_pjob( old_data.dptr, old_data.dsize, &old_pjob ) != -1 )
                        {
-                               pjob_store_notify( sharename, jobid, &old_pjob , pjob );
+                               pjob_store_notify(server_event_context(),
+                                                 msg_ctx,
+                                                 sharename, jobid, &old_pjob,
+                                                 pjob);
                                talloc_free(old_pjob.devmode);
                        }
                }
                else {
                        /* new job */
-                       pjob_store_notify( sharename, jobid, NULL, pjob );
+                       pjob_store_notify(server_event_context(), msg_ctx,
+                                         sharename, jobid, NULL, pjob);
                }
        }
 
@@ -694,7 +712,9 @@ done:
  Remove a job structure from the database.
 ****************************************************************************/
 
-void pjob_delete(const char* sharename, uint32 jobid)
+static void pjob_delete(struct tevent_context *ev,
+                       struct messaging_context *msg_ctx,
+                       const char* sharename, uint32 jobid)
 {
        uint32_t tmp;
        struct printjob *pjob;
@@ -720,7 +740,7 @@ void pjob_delete(const char* sharename, uint32 jobid)
            properly. */
 
        job_status = JOB_STATUS_DELETING|JOB_STATUS_DELETED;
-       notify_job_status(sharename, jobid, job_status);
+       notify_job_status(ev, msg_ctx, sharename, jobid, job_status);
 
        /* Remove from printing.tdb */
 
@@ -734,7 +754,10 @@ void pjob_delete(const char* sharename, uint32 jobid)
  List a unix job in the print database.
 ****************************************************************************/
 
-static void print_unix_job(const char *sharename, print_queue_struct *q, uint32 jobid)
+static void print_unix_job(struct tevent_context *ev,
+                          struct messaging_context *msg_ctx,
+                          const char *sharename, print_queue_struct *q,
+                          uint32 jobid)
 {
        struct printjob pj, *old_pj;
 
@@ -765,7 +788,7 @@ static void print_unix_job(const char *sharename, print_queue_struct *q, uint32
        fstrcpy(pj.user, old_pj ? old_pj->user : q->fs_user);
        fstrcpy(pj.queuename, old_pj ? old_pj->queuename : sharename );
 
-       pjob_store(sharename, jobid, &pj);
+       pjob_store(ev, msg_ctx, sharename, jobid, &pj);
 }
 
 
@@ -776,6 +799,8 @@ struct traverse_struct {
        time_t lpq_time;
        const char *lprm_command;
        struct printif *print_if;
+       struct tevent_context *ev;
+       struct messaging_context *msg_ctx;
 };
 
 /****************************************************************************
@@ -809,7 +834,8 @@ static int traverse_fn_delete(TDB_CONTEXT *t, TDB_DATA key, TDB_DATA data, void
                if (i == ts->qcount) {
                        DEBUG(10,("traverse_fn_delete: pjob %u deleted due to !smbjob\n",
                                                (unsigned int)jobid ));
-                       pjob_delete(ts->sharename, jobid);
+                       pjob_delete(ts->ev, ts->msg_ctx,
+                                   ts->sharename, jobid);
                        return 0;
                }
 
@@ -825,7 +851,8 @@ static int traverse_fn_delete(TDB_CONTEXT *t, TDB_DATA key, TDB_DATA data, void
                if (!process_exists_by_pid(pjob.pid)) {
                        DEBUG(10,("traverse_fn_delete: pjob %u deleted due to !process_exists (%u)\n",
                                                (unsigned int)jobid, (unsigned int)pjob.pid ));
-                       pjob_delete(ts->sharename, jobid);
+                       pjob_delete(ts->ev, ts->msg_ctx,
+                                   ts->sharename, jobid);
                } else
                        ts->total_jobs++;
                return 0;
@@ -855,11 +882,14 @@ static int traverse_fn_delete(TDB_CONTEXT *t, TDB_DATA key, TDB_DATA data, void
                                        if ( result != 0 ) {
                                                /* if we can't delete, then reset the job status */
                                                pjob.status = LPQ_QUEUED;
-                                               pjob_store(ts->sharename, jobid, &pjob);
+                                               pjob_store(ts->ev, ts->msg_ctx,
+                                                          ts->sharename, jobid, &pjob);
                                        }
                                        else {
                                                /* if we deleted the job, the remove the tdb record */
-                                               pjob_delete(ts->sharename, jobid);
+                                               pjob_delete(ts->ev,
+                                                           ts->msg_ctx,
+                                                           ts->sharename, jobid);
                                                pjob.status = LPQ_DELETED;
                                        }
 
@@ -887,7 +917,8 @@ static int traverse_fn_delete(TDB_CONTEXT *t, TDB_DATA key, TDB_DATA data, void
                                                (unsigned int)jobid,
                                                (unsigned int)pjob.starttime,
                                                (unsigned int)ts->lpq_time ));
-                       pjob_delete(ts->sharename, jobid);
+                       pjob_delete(ts->ev, ts->msg_ctx,
+                                   ts->sharename, jobid);
                } else
                        ts->total_jobs++;
                return 0;
@@ -1182,7 +1213,9 @@ done:
  main work for updating the lpq cahe for a printer queue
 ****************************************************************************/
 
-static void print_queue_update_internal( const char *sharename,
+static void print_queue_update_internal( struct tevent_context *ev,
+                                        struct messaging_context *msg_ctx,
+                                        const char *sharename,
                                          struct printif *current_printif,
                                          char *lpq_command, char *lprm_command )
 {
@@ -1246,7 +1279,8 @@ static void print_queue_update_internal( const char *sharename,
 
                if (jobid == (uint32)-1) {
                        /* assume its a unix print job */
-                       print_unix_job(sharename, &queue[i], jobid);
+                       print_unix_job(ev, msg_ctx,
+                                      sharename, &queue[i], jobid);
                        continue;
                }
 
@@ -1256,7 +1290,8 @@ static void print_queue_update_internal( const char *sharename,
                        /* err, somethings wrong. Probably smbd was restarted
                           with jobs in the queue. All we can do is treat them
                           like unix jobs. Pity. */
-                       print_unix_job(sharename, &queue[i], jobid);
+                       print_unix_job(ev, msg_ctx,
+                                      sharename, &queue[i], jobid);
                        continue;
                }
 
@@ -1267,7 +1302,7 @@ static void print_queue_update_internal( const char *sharename,
                if ( pjob->status != LPQ_DELETING )
                        pjob->status = queue[i].status;
 
-               pjob_store(sharename, jobid, pjob);
+               pjob_store(ev, msg_ctx, sharename, jobid, pjob);
 
                check_job_changed(sharename, jcdata, jobid);
        }
@@ -1284,6 +1319,8 @@ static void print_queue_update_internal( const char *sharename,
        tstruct.sharename = sharename;
        tstruct.lprm_command = lprm_command;
        tstruct.print_if = current_printif;
+       tstruct.ev = ev;
+       tstruct.msg_ctx = msg_ctx;
 
        tdb_traverse(pdb->tdb, traverse_fn_delete, (void *)&tstruct);
 
@@ -1410,8 +1447,10 @@ static void print_queue_update_with_lock( const char *sharename,
 
        /* do the main work now */
 
-       print_queue_update_internal( sharename, current_printif,
-               lpq_command, lprm_command );
+       print_queue_update_internal(server_event_context(),
+                                   server_messaging_context(),
+                                   sharename, current_printif,
+                                   lpq_command, lprm_command);
 
        /* Delete our pid from the db. */
        set_updating_pid(sharename, False);
@@ -1488,7 +1527,8 @@ static pid_t background_lpq_updater_pid = -1;
 /****************************************************************************
 main thread of the background lpq updater
 ****************************************************************************/
-void start_background_queue(void)
+void start_background_queue(struct tevent_context *ev,
+                           struct messaging_context *msg_ctx)
 {
        /* Use local variables for this as we don't
         * need to save the parent side of this, just
@@ -1524,9 +1564,7 @@ void start_background_queue(void)
                close(pause_pipe[0]);
                pause_pipe[0] = -1;
 
-               status = reinit_after_fork(server_messaging_context(),
-                                          server_event_context(),
-                                          procid_self(), true);
+               status = reinit_after_fork(msg_ctx, ev, procid_self(), true);
 
                if (!NT_STATUS_IS_OK(status)) {
                        DEBUG(0,("reinit_after_fork() failed\n"));
@@ -1534,7 +1572,7 @@ void start_background_queue(void)
                }
 
                smbd_setup_sig_term_handler();
-               smbd_setup_sig_hup_handler();
+               smbd_setup_sig_hup_handler(ev, msg_ctx);
 
                if (!serverid_register(procid_self(),
                                       FLAG_MSG_GENERAL|FLAG_MSG_SMBD
@@ -1546,12 +1584,10 @@ void start_background_queue(void)
                        exit(1);
                }
 
-               messaging_register(server_messaging_context(), NULL,
-                                  MSG_PRINTER_UPDATE, print_queue_receive);
+               messaging_register(msg_ctx, NULL, MSG_PRINTER_UPDATE,
+                                  print_queue_receive);
 
-               fde = tevent_add_fd(server_event_context(),
-                                   server_event_context(),
-                                   pause_pipe[1], TEVENT_FD_READ,
+               fde = tevent_add_fd(ev, ev, pause_pipe[1], TEVENT_FD_READ,
                                    printing_pause_fd_handler,
                                    NULL);
                if (!fde) {
@@ -1560,7 +1596,7 @@ void start_background_queue(void)
                }
 
                DEBUG(5,("start_background_queue: background LPQ thread waiting for messages\n"));
-               ret = tevent_loop_wait(server_event_context());
+               ret = tevent_loop_wait(ev);
                /* should not be reached */
                DEBUG(0,("background_queue: tevent_loop_wait() exited with %d - %s\n",
                         ret, (ret == 0) ? "out of events" : strerror(errno)));
@@ -1574,7 +1610,8 @@ void start_background_queue(void)
 update the internal database from the system print queue for a queue
 ****************************************************************************/
 
-static void print_queue_update(int snum, bool force)
+static void print_queue_update(struct messaging_context *msg_ctx,
+                              int snum, bool force)
 {
        fstring key;
        fstring sharename;
@@ -1693,8 +1730,7 @@ static void print_queue_update(int snum, bool force)
 
        /* finally send the message */
 
-       messaging_send_buf(server_messaging_context(),
-                          pid_to_procid(background_lpq_updater_pid),
+       messaging_send_buf(msg_ctx, pid_to_procid(background_lpq_updater_pid),
                           MSG_PRINTER_UPDATE, (uint8 *)buffer, len);
 
        SAFE_FREE( buffer );
@@ -1944,7 +1980,8 @@ bool print_job_set_name(const char *sharename, uint32 jobid, const char *name)
                return False;
 
        fstrcpy(pjob->jobname, name);
-       return pjob_store(sharename, jobid, pjob);
+       return pjob_store(server_event_context(), server_messaging_context(),
+                         sharename, jobid, pjob);
 }
 
 /****************************************************************************
@@ -2061,7 +2098,8 @@ static bool print_job_delete1(int snum, uint32 jobid)
        /* Set the tdb entry to be deleting. */
 
        pjob->status = LPQ_DELETING;
-       pjob_store(sharename, jobid, pjob);
+       pjob_store(server_event_context(), server_messaging_context(),
+                  sharename, jobid, pjob);
 
        if (pjob->spooled && pjob->sysjob != -1)
        {
@@ -2079,7 +2117,9 @@ static bool print_job_delete1(int snum, uint32 jobid)
 
                        if (!pdb)
                                return False;
-                       pjob_delete(sharename, jobid);
+                       pjob_delete(server_event_context(),
+                                   server_messaging_context(),
+                                   sharename, jobid);
                        /* Ensure we keep a rough count of the number of total jobs... */
                        tdb_change_int32_atomic(pdb->tdb, "INFO/total_jobs", &njobs, -1);
                        release_print_db(pdb);
@@ -2112,6 +2152,7 @@ static bool is_owner(struct auth_serversupplied_info *server_info,
 ****************************************************************************/
 
 WERROR print_job_delete(struct auth_serversupplied_info *server_info,
+                       struct messaging_context *msg_ctx,
                        int snum, uint32_t jobid)
 {
        const char* sharename = lp_const_servicename(snum);
@@ -2125,7 +2166,7 @@ WERROR print_job_delete(struct auth_serversupplied_info *server_info,
           owns their job. */
 
        if (!owner &&
-           !print_access_check(server_info, smbd_messaging_context(), snum,
+           !print_access_check(server_info, msg_ctx, snum,
                                JOB_ACCESS_ADMINISTER)) {
                DEBUG(3, ("delete denied by security descriptor\n"));
 
@@ -2164,7 +2205,7 @@ pause, or resume print job. User name: %s. Printer name: %s.",
        /* force update the database and say the delete failed if the
            job still exists */
 
-       print_queue_update(snum, True);
+       print_queue_update(msg_ctx, snum, True);
 
        pjob = print_job_find(sharename, jobid);
        if (pjob && (pjob->status != LPQ_DELETING)) {
@@ -2178,8 +2219,9 @@ pause, or resume print job. User name: %s. Printer name: %s.",
  Pause a job.
 ****************************************************************************/
 
-bool print_job_pause(struct auth_serversupplied_info *server_info, int snum,
-                    uint32 jobid, WERROR *errcode)
+bool print_job_pause(struct auth_serversupplied_info *server_info,
+                    struct messaging_context *msg_ctx,
+                    int snum, uint32 jobid, WERROR *errcode)
 {
        const char* sharename = lp_const_servicename(snum);
        struct printjob *pjob;
@@ -2201,7 +2243,7 @@ bool print_job_pause(struct auth_serversupplied_info *server_info, int snum,
        }
 
        if (!is_owner(server_info, lp_const_servicename(snum), jobid) &&
-           !print_access_check(server_info, smbd_messaging_context(), snum,
+           !print_access_check(server_info, msg_ctx, snum,
                                JOB_ACCESS_ADMINISTER)) {
                DEBUG(3, ("pause denied by security descriptor\n"));
 
@@ -2230,7 +2272,8 @@ pause, or resume print job. User name: %s. Printer name: %s.",
 
        /* Send a printer notify message */
 
-       notify_job_status(sharename, jobid, JOB_STATUS_PAUSED);
+       notify_job_status(server_event_context(), msg_ctx, sharename, jobid,
+                         JOB_STATUS_PAUSED);
 
        /* how do we tell if this succeeded? */
 
@@ -2241,8 +2284,9 @@ pause, or resume print job. User name: %s. Printer name: %s.",
  Resume a job.
 ****************************************************************************/
 
-bool print_job_resume(struct auth_serversupplied_info *server_info, int snum,
-                     uint32 jobid, WERROR *errcode)
+bool print_job_resume(struct auth_serversupplied_info *server_info,
+                     struct messaging_context *msg_ctx,
+                     int snum, uint32 jobid, WERROR *errcode)
 {
        const char *sharename = lp_const_servicename(snum);
        struct printjob *pjob;
@@ -2264,7 +2308,7 @@ bool print_job_resume(struct auth_serversupplied_info *server_info, int snum,
        }
 
        if (!is_owner(server_info, lp_const_servicename(snum), jobid) &&
-           !print_access_check(server_info, smbd_messaging_context(), snum,
+           !print_access_check(server_info, msg_ctx, snum,
                                JOB_ACCESS_ADMINISTER)) {
                DEBUG(3, ("resume denied by security descriptor\n"));
                *errcode = WERR_ACCESS_DENIED;
@@ -2291,7 +2335,8 @@ pause, or resume print job. User name: %s. Printer name: %s.",
 
        /* Send a printer notify message */
 
-       notify_job_status(sharename, jobid, JOB_STATUS_QUEUED);
+       notify_job_status(server_event_context(), msg_ctx, sharename, jobid,
+                         JOB_STATUS_QUEUED);
 
        return True;
 }
@@ -2323,7 +2368,8 @@ ssize_t print_job_write(int snum, uint32 jobid, const char *buf, SMB_OFF_T pos,
 
        if (return_code>0) {
                pjob->size += size;
-               pjob_store(sharename, jobid, pjob);
+               pjob_store(server_event_context(), server_messaging_context(),
+                          sharename, jobid, pjob);
        }
        return return_code;
 }
@@ -2366,7 +2412,8 @@ static int get_queue_status(const char* sharename, print_status_struct *status)
  Determine the number of jobs in a queue.
 ****************************************************************************/
 
-int print_queue_length(int snum, print_status_struct *pstatus)
+int print_queue_length(struct messaging_context *msg_ctx, int snum,
+                      print_status_struct *pstatus)
 {
        const char* sharename = lp_const_servicename( snum );
        print_status_struct status;
@@ -2376,7 +2423,7 @@ int print_queue_length(int snum, print_status_struct *pstatus)
 
        /* make sure the database is up to date */
        if (print_cache_expired(lp_const_servicename(snum), True))
-               print_queue_update(snum, False);
+               print_queue_update(msg_ctx, snum, False);
 
        /* also fetch the queue status */
        memset(&status, 0, sizeof(status));
@@ -2505,6 +2552,7 @@ static bool add_to_jobs_changed(struct tdb_print_db *pdb, uint32 jobid)
 ***************************************************************************/
 
 static WERROR print_job_checks(struct auth_serversupplied_info *server_info,
+                              struct messaging_context *msg_ctx,
                               int snum, int *njobs)
 {
        const char *sharename = lp_const_servicename(snum);
@@ -2512,15 +2560,14 @@ static WERROR print_job_checks(struct auth_serversupplied_info *server_info,
        uint64_t minspace;
        int ret;
 
-       if (!print_access_check(server_info, smbd_messaging_context(), snum,
+       if (!print_access_check(server_info, msg_ctx, snum,
                                PRINTER_ACCESS_USE)) {
                DEBUG(3, ("print_job_checks: "
                          "job start denied by security descriptor\n"));
                return WERR_ACCESS_DENIED;
        }
 
-       if (!print_time_access_check(server_info, smbd_messaging_context(),
-                                    sharename)) {
+       if (!print_time_access_check(server_info, msg_ctx, sharename)) {
                DEBUG(3, ("print_job_checks: "
                          "job start denied by time check\n"));
                return WERR_ACCESS_DENIED;
@@ -2545,7 +2592,7 @@ static WERROR print_job_checks(struct auth_serversupplied_info *server_info,
        }
 
        /* Insure the maximum queue size is not violated */
-       *njobs = print_queue_length(snum, NULL);
+       *njobs = print_queue_length(msg_ctx, snum, NULL);
        if (*njobs > lp_maxprintjobs(snum)) {
                DEBUG(3, ("print_job_checks: Queue %s number of jobs (%d) "
                          "larger than max printjobs per queue (%d).\n",
@@ -2631,6 +2678,7 @@ static WERROR print_job_spool_file(int snum, uint32_t jobid,
 ***************************************************************************/
 
 WERROR print_job_start(struct auth_serversupplied_info *server_info,
+                      struct messaging_context *msg_ctx,
                       int snum, const char *docname, const char *filename,
                       struct spoolss_DeviceMode *devmode, uint32_t *_jobid)
 {
@@ -2648,7 +2696,7 @@ WERROR print_job_start(struct auth_serversupplied_info *server_info,
 
        path = lp_pathname(snum);
 
-       werr = print_job_checks(server_info, snum, &njobs);
+       werr = print_job_checks(server_info, msg_ctx, snum, &njobs);
        if (!W_ERROR_IS_OK(werr)) {
                release_print_db(pdb);
                return werr;
@@ -2696,7 +2744,7 @@ WERROR print_job_start(struct auth_serversupplied_info *server_info,
                goto fail;
        }
 
-       pjob_store(sharename, jobid, &pjob);
+       pjob_store(server_event_context(), msg_ctx, sharename, jobid, &pjob);
 
        /* Update the 'jobs changed' entry used by print_queue_status. */
        add_to_jobs_changed(pdb, jobid);
@@ -2711,7 +2759,7 @@ WERROR print_job_start(struct auth_serversupplied_info *server_info,
 
 fail:
        if (jobid != -1) {
-               pjob_delete(sharename, jobid);
+               pjob_delete(server_event_context(), msg_ctx, sharename, jobid);
        }
 
        release_print_db(pdb);
@@ -2738,7 +2786,8 @@ void print_job_endpage(int snum, uint32 jobid)
                return;
 
        pjob->page_count++;
-       pjob_store(sharename, jobid, pjob);
+       pjob_store(server_event_context(), server_messaging_context(),
+                  sharename, jobid, pjob);
 }
 
 /****************************************************************************
@@ -2747,7 +2796,8 @@ void print_job_endpage(int snum, uint32 jobid)
  error.
 ****************************************************************************/
 
-NTSTATUS print_job_end(int snum, uint32 jobid, enum file_close_type close_type)
+NTSTATUS print_job_end(struct messaging_context *msg_ctx, int snum,
+                      uint32 jobid, enum file_close_type close_type)
 {
        const char* sharename = lp_const_servicename(snum);
        struct printjob *pjob;
@@ -2813,7 +2863,7 @@ NTSTATUS print_job_end(int snum, uint32 jobid, enum file_close_type close_type)
                DEBUG(5,("print_job_end: canceling spool of %s (%s)\n",
                        pjob->filename, pjob->size ? "deleted" : "zero length" ));
                unlink(pjob->filename);
-               pjob_delete(sharename, jobid);
+               pjob_delete(server_event_context(), msg_ctx, sharename, jobid);
                return NT_STATUS_OK;
        }
 
@@ -2828,11 +2878,11 @@ NTSTATUS print_job_end(int snum, uint32 jobid, enum file_close_type close_type)
 
        pjob->spooled = True;
        pjob->status = LPQ_QUEUED;
-       pjob_store(sharename, jobid, pjob);
+       pjob_store(server_event_context(), msg_ctx, sharename, jobid, pjob);
 
        /* make sure the database is up to date */
        if (print_cache_expired(lp_const_servicename(snum), True))
-               print_queue_update(snum, False);
+               print_queue_update(msg_ctx, snum, False);
 
        return NT_STATUS_OK;
 
@@ -2842,7 +2892,7 @@ fail:
        /* Still need to add proper error return propagation! 010122:JRR */
        pjob->fd = -1;
        unlink(pjob->filename);
-       pjob_delete(sharename, jobid);
+       pjob_delete(server_event_context(), msg_ctx, sharename, jobid);
        return status;
 }
 
@@ -2850,7 +2900,9 @@ fail:
  Get a snapshot of jobs in the system without traversing.
 ****************************************************************************/
 
-static bool get_stored_queue_info(struct tdb_print_db *pdb, int snum, int *pcount, print_queue_struct **ppqueue)
+static bool get_stored_queue_info(struct messaging_context *msg_ctx,
+                                 struct tdb_print_db *pdb, int snum,
+                                 int *pcount, print_queue_struct **ppqueue)
 {
        TDB_DATA data, cgdata;
        print_queue_struct *queue = NULL;
@@ -2865,7 +2917,7 @@ static bool get_stored_queue_info(struct tdb_print_db *pdb, int snum, int *pcoun
 
        /* make sure the database is up to date */
        if (print_cache_expired(lp_const_servicename(snum), True))
-               print_queue_update(snum, False);
+               print_queue_update(msg_ctx, snum, False);
 
        *pcount = 0;
        *ppqueue = NULL;
@@ -2968,7 +3020,7 @@ static bool get_stored_queue_info(struct tdb_print_db *pdb, int snum, int *pcoun
  set queue = NULL and status = NULL if you just want to update the cache
 ****************************************************************************/
 
-int print_queue_status(int snum,
+int print_queue_status(struct messaging_context *msg_ctx, int snum,
                       print_queue_struct **ppqueue,
                       print_status_struct *status)
 {
@@ -2981,7 +3033,7 @@ int print_queue_status(int snum,
        /* make sure the database is up to date */
 
        if (print_cache_expired(lp_const_servicename(snum), True))
-               print_queue_update(snum, False);
+               print_queue_update(msg_ctx, snum, False);
 
        /* return if we are done */
        if ( !ppqueue || !status )
@@ -3018,7 +3070,7 @@ int print_queue_status(int snum,
         * of entries, and then only retrieve the queue if necessary.
         */
 
-       if (!get_stored_queue_info(pdb, snum, &count, ppqueue)) {
+       if (!get_stored_queue_info(msg_ctx, pdb, snum, &count, ppqueue)) {
                release_print_db(pdb);
                return 0;
        }
@@ -3031,12 +3083,13 @@ int print_queue_status(int snum,
  Pause a queue.
 ****************************************************************************/
 
-WERROR print_queue_pause(struct auth_serversupplied_info *server_info, int snum)
+WERROR print_queue_pause(struct auth_serversupplied_info *server_info,
+                        struct messaging_context *msg_ctx, int snum)
 {
        int ret;
        struct printif *current_printif = get_printer_fns( snum );
 
-       if (!print_access_check(server_info, smbd_messaging_context(), snum,
+       if (!print_access_check(server_info, msg_ctx, snum,
                                PRINTER_ACCESS_ADMINISTER)) {
                return WERR_ACCESS_DENIED;
        }
@@ -3057,7 +3110,8 @@ WERROR print_queue_pause(struct auth_serversupplied_info *server_info, int snum)
 
        /* Send a printer notify message */
 
-       notify_printer_status(snum, PRINTER_STATUS_PAUSED);
+       notify_printer_status(server_event_context(), msg_ctx, snum,
+                             PRINTER_STATUS_PAUSED);
 
        return WERR_OK;
 }
@@ -3066,12 +3120,13 @@ WERROR print_queue_pause(struct auth_serversupplied_info *server_info, int snum)
  Resume a queue.
 ****************************************************************************/
 
-WERROR print_queue_resume(struct auth_serversupplied_info *server_info, int snum)
+WERROR print_queue_resume(struct auth_serversupplied_info *server_info,
+                         struct messaging_context *msg_ctx, int snum)
 {
        int ret;
        struct printif *current_printif = get_printer_fns( snum );
 
-       if (!print_access_check(server_info, smbd_messaging_context(), snum,
+       if (!print_access_check(server_info, msg_ctx, snum,
                                PRINTER_ACCESS_ADMINISTER)) {
                return WERR_ACCESS_DENIED;
        }
@@ -3088,11 +3143,12 @@ WERROR print_queue_resume(struct auth_serversupplied_info *server_info, int snum
 
        /* make sure the database is up to date */
        if (print_cache_expired(lp_const_servicename(snum), True))
-               print_queue_update(snum, True);
+               print_queue_update(msg_ctx, snum, True);
 
        /* Send a printer notify message */
 
-       notify_printer_status(snum, PRINTER_STATUS_OK);
+       notify_printer_status(server_event_context(), msg_ctx, snum,
+                             PRINTER_STATUS_OK);
 
        return WERR_OK;
 }
@@ -3101,7 +3157,8 @@ WERROR print_queue_resume(struct auth_serversupplied_info *server_info, int snum
  Purge a queue - implemented by deleting all jobs that we can delete.
 ****************************************************************************/
 
-WERROR print_queue_purge(struct auth_serversupplied_info *server_info, int snum)
+WERROR print_queue_purge(struct auth_serversupplied_info *server_info,
+                        struct messaging_context *msg_ctx, int snum)
 {
        print_queue_struct *queue;
        print_status_struct status;
@@ -3109,13 +3166,13 @@ WERROR print_queue_purge(struct auth_serversupplied_info *server_info, int snum)
        bool can_job_admin;
 
        /* Force and update so the count is accurate (i.e. not a cached count) */
-       print_queue_update(snum, True);
+       print_queue_update(msg_ctx, snum, True);
 
        can_job_admin = print_access_check(server_info,
-                                          smbd_messaging_context(),
+                                          msg_ctx,
                                           snum,
                                           JOB_ACCESS_ADMINISTER);
-       njobs = print_queue_status(snum, &queue, &status);
+       njobs = print_queue_status(msg_ctx, snum, &queue, &status);
 
        if ( can_job_admin )
                become_root();
@@ -3133,7 +3190,7 @@ WERROR print_queue_purge(struct auth_serversupplied_info *server_info, int snum)
                unbecome_root();
 
        /* update the cache */
-       print_queue_update( snum, True );
+       print_queue_update(msg_ctx, snum, True);
 
        SAFE_FREE(queue);