s3-spoolss: Use WERROR for print_job_delete.
authorSimo Sorce <ssorce@redhat.com>
Wed, 5 May 2010 12:56:46 +0000 (08:56 -0400)
committerSimo Sorce <idra@samba.org>
Tue, 27 Jul 2010 14:27:13 +0000 (10:27 -0400)
And also check for PJOB_SMBD_SPOOLING in print_job_write.

Signed-off-by: Jim McDonough <jmcd@samba.org>
source3/include/proto.h
source3/printing/printing.c
source3/rpc_server/srv_spoolss_nt.c

index a98274bcadcb4712de0909c1de0a3880450eed4c..6420b1547466cf8a1dee72ebab3a39301b1ae5a8 100644 (file)
@@ -4743,8 +4743,8 @@ char *print_job_fname(const char* sharename, uint32 jobid);
 struct spoolss_DeviceMode *print_job_devmode(const char* sharename, uint32 jobid);
 bool print_job_set_name(const char *sharename, uint32 jobid, const char *name);
 bool print_job_get_name(TALLOC_CTX *mem_ctx, const char *sharename, uint32_t jobid, char **name);
-bool print_job_delete(struct auth_serversupplied_info *server_info, int snum,
-                     uint32 jobid, WERROR *errcode);
+WERROR print_job_delete(struct auth_serversupplied_info *server_info,
+                       int snum, uint32 jobid);
 bool print_job_pause(struct auth_serversupplied_info *server_info, int snum,
                     uint32 jobid, WERROR *errcode);
 bool print_job_resume(struct auth_serversupplied_info *server_info, int snum,
index 5f537c5d03b7a2d7556ab61071fd2e00214cb9b9..3525f8dc3aad674d607c285a90dc472925c08144 100644 (file)
@@ -2040,16 +2040,14 @@ static bool is_owner(struct auth_serversupplied_info *server_info,
  Delete a print job.
 ****************************************************************************/
 
-bool print_job_delete(struct auth_serversupplied_info *server_info, int snum,
-                     uint32 jobid, WERROR *errcode)
+WERROR print_job_delete(struct auth_serversupplied_info *server_info,
+                       int snum, uint32_t jobid)
 {
-       const char* sharename = lp_const_servicename( snum );
+       const char* sharename = lp_const_servicename(snum);
        struct printjob *pjob;
        bool    owner;
        char    *fname;
 
-       *errcode = WERR_OK;
-
        owner = is_owner(server_info, lp_const_servicename(snum), jobid);
 
        /* Check access against security descriptor or whether the user
@@ -2058,7 +2056,6 @@ bool print_job_delete(struct auth_serversupplied_info *server_info, int snum,
        if (!owner &&
            !print_access_check(server_info, snum, JOB_ACCESS_ADMINISTER)) {
                DEBUG(3, ("delete denied by security descriptor\n"));
-               *errcode = WERR_ACCESS_DENIED;
 
                /* BEGIN_ADMIN_LOG */
                sys_adminlog( LOG_ERR,
@@ -2068,7 +2065,7 @@ pause, or resume print job. User name: %s. Printer name: %s.",
                              lp_printername(snum) );
                /* END_ADMIN_LOG */
 
-               return False;
+               return WERR_ACCESS_DENIED;
        }
 
        /*
@@ -2078,19 +2075,18 @@ pause, or resume print job. User name: %s. Printer name: %s.",
         * spool file & return.
         */
 
-       if ( (fname = print_job_fname( sharename, jobid )) != NULL )
-       {
+       fname = print_job_fname(sharename, jobid);
+       if (fname != NULL) {
                /* remove the spool file */
-               DEBUG(10,("print_job_delete: Removing spool file [%s]\n", fname ));
-               if ( unlink( fname ) == -1 ) {
-                       *errcode = map_werror_from_unix(errno);
-                       return False;
+               DEBUG(10, ("print_job_delete: "
+                          "Removing spool file [%s]\n", fname));
+               if (unlink(fname) == -1) {
+                       return map_werror_from_unix(errno);
                }
        }
 
        if (!print_job_delete1(snum, jobid)) {
-               *errcode = WERR_ACCESS_DENIED;
-               return False;
+               return WERR_ACCESS_DENIED;
        }
 
        /* force update the database and say the delete failed if the
@@ -2099,10 +2095,11 @@ pause, or resume print job. User name: %s. Printer name: %s.",
        print_queue_update(snum, True);
 
        pjob = print_job_find(sharename, jobid);
-       if ( pjob && (pjob->status != LPQ_DELETING) )
-               *errcode = WERR_ACCESS_DENIED;
+       if (pjob && (pjob->status != LPQ_DELETING)) {
+               return WERR_ACCESS_DENIED;
+       }
 
-       return (pjob == NULL );
+       return WERR_PRINTER_HAS_JOBS_QUEUED;
 }
 
 /****************************************************************************
@@ -2243,6 +2240,11 @@ ssize_t print_job_write(int snum, uint32 jobid, const char *buf, SMB_OFF_T pos,
        if (pjob->pid != sys_getpid())
                return -1;
 
+       /* if SMBD is spooling this can't be allowed */
+       if (pjob->status == PJOB_SMBD_SPOOLING) {
+               return -1;
+       }
+
        return_code = write_data_at_offset(pjob->fd, buf, size, pos);
 
        if (return_code>0) {
index 1f0b36450f91707aaf568afa4a6325c621f43270..5a33a34ca5a0e7d3a02ae557020880d7fca2d51f 100644 (file)
@@ -5234,6 +5234,7 @@ WERROR _spoolss_WritePrinter(pipes_struct *p,
        if (!get_printer_snum(p, r->in.handle, &snum, NULL))
                return WERR_BADFID;
 
+       /* print_job_write takes care of checking for PJOB_SMBD_SPOOLING */
        buffer_written = print_job_write(snum, Printer->jobid,
                                                   (const char *)r->in.data.data,
                                                   (SMB_OFF_T)-1,
@@ -5314,7 +5315,11 @@ WERROR _spoolss_AbortPrinter(pipes_struct *p,
        if (!get_printer_snum(p, r->in.handle, &snum, NULL))
                return WERR_BADFID;
 
-       print_job_delete(p->server_info, snum, Printer->jobid, &errcode );
+       if (!Printer->document_started) {
+               return WERR_SPL_NO_STARTDOC;
+       }
+
+       errcode = print_job_delete(p->server_info, snum, Printer->jobid);
 
        return errcode;
 }
@@ -6573,7 +6578,9 @@ WERROR _spoolss_SetJob(pipes_struct *p,
        switch (r->in.command) {
        case SPOOLSS_JOB_CONTROL_CANCEL:
        case SPOOLSS_JOB_CONTROL_DELETE:
-               if (print_job_delete(p->server_info, snum, r->in.job_id, &errcode)) {
+               errcode = print_job_delete(p->server_info,
+                                          snum, r->in.job_id);
+               if (W_ERROR_EQUAL(errcode, WERR_PRINTER_HAS_JOBS_QUEUED)) {
                        errcode = WERR_OK;
                }
                break;