s3-spoolss: add support for SetJobInfo level 1 (for jobfile rename).
authorGünther Deschner <gd@samba.org>
Tue, 27 Apr 2010 17:57:47 +0000 (19:57 +0200)
committerGünther Deschner <gd@samba.org>
Tue, 27 Apr 2010 22:10:40 +0000 (00:10 +0200)
Guenther

source3/include/proto.h
source3/printing/printing.c
source3/rpc_server/srv_spoolss_nt.c

index 1f35808d92983e1c49c8f95642d0e40c35f12967..f5e9ec4e063856b3ef9c6daa2e50bc2b8fdabea3 100644 (file)
@@ -4976,7 +4976,8 @@ bool print_job_exists(const char* sharename, uint32 jobid);
 int print_job_fd(const char* sharename, uint32 jobid);
 char *print_job_fname(const char* sharename, uint32 jobid);
 NT_DEVICEMODE *print_job_devmode(const char* sharename, uint32 jobid);
-bool print_job_set_name(const char *sharename, uint32 jobid, char *name);
+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);
 bool print_job_pause(struct auth_serversupplied_info *server_info, int snum,
index a6b1ad3484f95a558f878d60bf5fbfa895c3a41a..e67c5d41a35de0b5e3f574a34bbc6fb73ab727de 100644 (file)
@@ -1857,7 +1857,7 @@ NT_DEVICEMODE *print_job_devmode(const char* sharename, uint32 jobid)
  Set the name of a job. Only possible for owner.
 ****************************************************************************/
 
-bool print_job_set_name(const char *sharename, uint32 jobid, char *name)
+bool print_job_set_name(const char *sharename, uint32 jobid, const char *name)
 {
        struct printjob *pjob;
 
@@ -1869,6 +1869,28 @@ bool print_job_set_name(const char *sharename, uint32 jobid, char *name)
        return pjob_store(sharename, jobid, pjob);
 }
 
+/****************************************************************************
+ Get the name of a job. Only possible for owner.
+****************************************************************************/
+
+bool print_job_get_name(TALLOC_CTX *mem_ctx, const char *sharename, uint32_t jobid, char **name)
+{
+       struct printjob *pjob;
+
+       pjob = print_job_find(sharename, jobid);
+       if (!pjob || pjob->pid != sys_getpid()) {
+               return false;
+       }
+
+       *name = talloc_strdup(mem_ctx, pjob->jobname);
+       if (!*name) {
+               return false;
+       }
+
+       return true;
+}
+
+
 /***************************************************************************
  Remove a jobid from the 'jobs changed' list.
 ***************************************************************************/
index 28e8a7d5e74109f17d9e80e9d4aaedd2e3bc76de..db6a6d784ad6a43b1264d95069abf3cd520d7258 100644 (file)
@@ -6426,6 +6426,31 @@ WERROR _spoolss_ScheduleJob(pipes_struct *p,
        return WERR_OK;
 }
 
+/****************************************************************
+****************************************************************/
+
+static WERROR spoolss_setjob_1(TALLOC_CTX *mem_ctx,
+                              const char *printer_name,
+                              uint32_t job_id,
+                              struct spoolss_SetJobInfo1 *r)
+{
+       char *old_doc_name;
+
+       if (!print_job_get_name(mem_ctx, printer_name, job_id, &old_doc_name)) {
+               return WERR_BADFID;
+       }
+
+       if (strequal(old_doc_name, r->document_name)) {
+               return WERR_OK;
+       }
+
+       if (!print_job_set_name(printer_name, job_id, r->document_name)) {
+               return WERR_BADFID;
+       }
+
+       return WERR_OK;
+}
+
 /****************************************************************
  _spoolss_SetJob
 ****************************************************************/
@@ -6462,6 +6487,30 @@ WERROR _spoolss_SetJob(pipes_struct *p,
                        errcode = WERR_OK;
                }
                break;
+       case 0:
+               errcode = WERR_OK;
+               break;
+       default:
+               return WERR_UNKNOWN_LEVEL;
+       }
+
+       if (!W_ERROR_IS_OK(errcode)) {
+               return errcode;
+       }
+
+       if (r->in.ctr == NULL) {
+               return errcode;
+       }
+
+       switch (r->in.ctr->level) {
+       case 1:
+               errcode = spoolss_setjob_1(p->mem_ctx, lp_const_servicename(snum),
+                                          r->in.job_id,
+                                          r->in.ctr->info.info1);
+               break;
+       case 2:
+       case 3:
+       case 4:
        default:
                return WERR_UNKNOWN_LEVEL;
        }