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,
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
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,
lp_printername(snum) );
/* END_ADMIN_LOG */
- return False;
+ return WERR_ACCESS_DENIED;
}
/*
* 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
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;
}
/****************************************************************************
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) {
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,
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;
}
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;