AbortPrinter() fix merged from APP_HEAD.
authorGerald Carter <jerry@samba.org>
Tue, 10 Sep 2002 21:37:53 +0000 (21:37 +0000)
committerGerald Carter <jerry@samba.org>
Tue, 10 Sep 2002 21:37:53 +0000 (21:37 +0000)
(This used to be commit 97ede49e1271fa00c6ffdf9e6e3c2330ea935461)

source3/printing/printing.c
source3/rpc_server/srv_spoolss_nt.c

index df971a78c5a461263bdb956761e1679b2b1550bc..035d4d383afca476c69c93e6769513b33787c19a 100644 (file)
@@ -1048,8 +1048,11 @@ static BOOL is_owner(struct current_user *user, int snum, uint32 jobid)
 
 BOOL print_job_delete(struct current_user *user, int snum, uint32 jobid, WERROR *errcode)
 {
-       BOOL owner;
+       BOOL    owner, deleted;
+       char    *fname;
 
+       *errcode = WERR_OK;
+               
        owner = is_owner(user, snum, jobid);
        
        /* Check access against security descriptor or whether the user
@@ -1062,15 +1065,40 @@ BOOL print_job_delete(struct current_user *user, int snum, uint32 jobid, WERROR
                return False;
        }
 
-       if (!print_job_delete1(snum, jobid)) 
+       /* 
+        * get the spooled filename of the print job
+        * if this works, then the file has not been spooled
+        * to the underlying print system.  Just delete the 
+        * spool file & return.
+        */
+        
+       if ( (fname = print_job_fname( snum, jobid )) != 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;
+               }
+               
+               return True;
+       }
+       
+       if (!print_job_delete1(snum, jobid)) {
+               *errcode = WERR_ACCESS_DENIED;
                return False;
+       }
 
        /* force update the database and say the delete failed if the
            job still exists */
 
        print_queue_update(snum);
+       
+       deleted = !print_job_exists(snum, jobid);
+       if ( !deleted )
+               *errcode = WERR_ACCESS_DENIED;
 
-       return !print_job_exists(snum, jobid);
+       return deleted;
 }
 
 /****************************************************************************
index ff9ac2ce506a3f3d7b7e0df5dfc9269c33214f1d..07c22b063a9fd9e230deda8a33c79ec5db5db6f1 100644 (file)
@@ -5417,13 +5417,31 @@ static WERROR control_printer(POLICY_HND *handle, uint32 command,
 
 /********************************************************************
  * api_spoolss_abortprinter
+ * From MSDN: "Deletes printer's spool file if printer is configured
+ * for spooling"
  ********************************************************************/
 
 WERROR _spoolss_abortprinter(pipes_struct *p, SPOOL_Q_ABORTPRINTER *q_u, SPOOL_R_ABORTPRINTER *r_u)
 {
-       POLICY_HND *handle = &q_u->handle;
-
-       return control_printer(handle, PRINTER_CONTROL_PURGE, p);
+       POLICY_HND      *handle = &q_u->handle;
+       Printer_entry   *Printer = find_printer_index_by_hnd(p, handle);
+       int             snum;
+       struct          current_user user;
+       WERROR          errcode = WERR_OK;
+       
+       if (!Printer) {
+               DEBUG(2,("_spoolss_abortprinter: Invalid handle (%s:%u:%u)\n",OUR_HANDLE(handle)));
+               return WERR_BADFID;
+       }
+       
+       if (!get_printer_snum(p, handle, &snum))
+               return WERR_BADFID;
+       
+       get_current_user( &user, p );   
+       
+       print_job_delete( &user, snum, Printer->jobid, &errcode );      
+       
+       return errcode;
 }
 
 /********************************************************************