]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3-spoolss: use pidl for _spoolss_GetPrintProcessorDirectory.
authorGünther Deschner <gd@samba.org>
Thu, 19 Feb 2009 09:42:49 +0000 (10:42 +0100)
committerGünther Deschner <gd@samba.org>
Thu, 19 Feb 2009 18:21:57 +0000 (19:21 +0100)
Guenther.

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

index 80db935967dc32763b28bc0761f6eef60169c6a4..7af45128cad0fa6b1377b54e62cffb451cc99932 100644 (file)
@@ -6245,7 +6245,6 @@ WERROR _spoolss_enumprintmonitors(pipes_struct *p, SPOOL_Q_ENUMPRINTMONITORS *q_
 WERROR _spoolss_getjob( pipes_struct *p, SPOOL_Q_GETJOB *q_u, SPOOL_R_GETJOB *r_u);
 WERROR _spoolss_enumprinterkey(pipes_struct *p, SPOOL_Q_ENUMPRINTERKEY *q_u, SPOOL_R_ENUMPRINTERKEY *r_u);
 WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_u, SPOOL_R_ENUMPRINTERDATAEX *r_u);
-WERROR _spoolss_getprintprocessordirectory(pipes_struct *p, SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, SPOOL_R_GETPRINTPROCESSORDIRECTORY *r_u);
 
 /* The following definitions come from rpc_server/srv_srvsvc_nt.c  */
 
index 4074f8601b8b67f46e09b804ca036c5d3cc0d77a..639dbde5c42b11dde47d0c509f70c93303901365 100644 (file)
@@ -865,27 +865,7 @@ static bool api_spoolss_enumprinterdataex(pipes_struct *p)
 
 static bool api_spoolss_getprintprocessordirectory(pipes_struct *p)
 {
-       SPOOL_Q_GETPRINTPROCESSORDIRECTORY q_u;
-       SPOOL_R_GETPRINTPROCESSORDIRECTORY r_u;
-       prs_struct *data = &p->in_data.data;
-       prs_struct *rdata = &p->out_data.rdata;
-       
-       ZERO_STRUCT(q_u);
-       ZERO_STRUCT(r_u);
-       
-       if(!spoolss_io_q_getprintprocessordirectory("", &q_u, data, 0)) {
-               DEBUG(0,("spoolss_io_q_getprintprocessordirectory: unable to unmarshall SPOOL_Q_GETPRINTPROCESSORDIRECTORY.\n"));
-               return False;
-       }
-       
-       r_u.status = _spoolss_getprintprocessordirectory(p, &q_u, &r_u);
-                               
-       if(!spoolss_io_r_getprintprocessordirectory("", &r_u, rdata, 0)) {
-               DEBUG(0,("spoolss_io_r_getprintprocessordirectory: unable to marshall SPOOL_R_GETPRINTPROCESSORDIRECTORY.\n"));
-               return False;
-       }
-       
-       return True;
+       return proxy_spoolss_call(p, NDR_SPOOLSS_GETPRINTPROCESSORDIRECTORY);
 }
 
 /****************************************************************************
index 171953b6ab4092e37595769cffd820eea7a909f6..9d7e4d2b1473311e3aef16959ae068c8e50a47af 100644 (file)
@@ -9730,84 +9730,79 @@ done:
 /****************************************************************************
 ****************************************************************************/
 
-static void fill_printprocessordirectory_1(PRINTPROCESSOR_DIRECTORY_1 *info, const char *name)
+static WERROR getprintprocessordirectory_level_1(TALLOC_CTX *mem_ctx,
+                                                const char *servername,
+                                                const char *environment,
+                                                struct spoolss_PrintProcessorDirectoryInfo1 *info1,
+                                                uint32_t offered,
+                                                uint32_t *needed)
 {
-       init_unistr(&info->name, name);
-}
-
-static WERROR getprintprocessordirectory_level_1(UNISTR2 *name,
-                                                UNISTR2 *environment,
-                                                RPC_BUFFER *buffer,
-                                                uint32 offered,
-                                                uint32 *needed)
-{
-       char *long_archi = NULL;
-       PRINTPROCESSOR_DIRECTORY_1 *info=NULL;
-       WERROR result = WERR_OK;
-       TALLOC_CTX *ctx = talloc_tos();
+       const char *long_archi = SPOOLSS_ARCHITECTURE_NT_X86;
+       const char *short_archi;
 
-       long_archi = unistr2_to_ascii_talloc(ctx, environment);
-       if (!long_archi) {
-               return WERR_NOMEM;
+       if (environment) {
+               long_archi = environment;
        }
 
-       if (!get_short_archi(long_archi))
+       short_archi = get_short_archi(long_archi);
+       if (!short_archi) {
                return WERR_INVALID_ENVIRONMENT;
+       }
 
-       if((info=SMB_MALLOC_P(PRINTPROCESSOR_DIRECTORY_1)) == NULL)
-               return WERR_NOMEM;
+       /* I think this should look like this - gd
+       info1->directory_name = talloc_asprintf(mem_ctx,
+               "C:\\WINNT\\System32\\spool\\PRTPROCS\\%s", short_archi);
+       */
+       info1->directory_name = talloc_strdup(mem_ctx,
+               "C:\\WINNT\\System32\\spool\\PRTPROCS\\W32X86");
 
-       fill_printprocessordirectory_1(info, "C:\\WINNT\\System32\\spool\\PRTPROCS\\W32X86");
+       if (!info1->directory_name) {
+               return WERR_NOMEM;
+       }
 
-       *needed += spoolss_size_printprocessordirectory_info_1(info);
+       *needed += ndr_size_spoolss_PrintProcessorDirectoryInfo1(info1, NULL, 0);
 
        if (*needed > offered) {
-               result = WERR_INSUFFICIENT_BUFFER;
-               goto out;
-       }
-
-       if (!rpcbuf_alloc_size(buffer, *needed)) {
-               result = WERR_INSUFFICIENT_BUFFER;
-               goto out;
+               return WERR_INSUFFICIENT_BUFFER;
        }
 
-       smb_io_printprocessordirectory_1("", buffer, info, 0);
-
-out:
-       SAFE_FREE(info);
-
-       return result;
+       return WERR_OK;
 }
 
-WERROR _spoolss_getprintprocessordirectory(pipes_struct *p, SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, SPOOL_R_GETPRINTPROCESSORDIRECTORY *r_u)
+/****************************************************************
+ _spoolss_GetPrintProcessorDirectory
+****************************************************************/
+
+WERROR _spoolss_GetPrintProcessorDirectory(pipes_struct *p,
+                                          struct spoolss_GetPrintProcessorDirectory *r)
 {
-       uint32 level = q_u->level;
-       RPC_BUFFER *buffer = NULL;
-       uint32 offered = q_u->offered;
-       uint32 *needed = &r_u->needed;
        WERROR result;
 
        /* that's an [in out] buffer */
 
-       if (!q_u->buffer && (offered!=0)) {
+       if (!r->in.buffer && (r->in.offered != 0)) {
                return WERR_INVALID_PARAM;
        }
 
-       if (offered > MAX_RPC_DATA_SIZE) {
+       if (r->in.offered > MAX_RPC_DATA_SIZE) {
                return WERR_INVALID_PARAM;
        }
 
-       rpcbuf_move(q_u->buffer, &r_u->buffer);
-       buffer = r_u->buffer;
+       DEBUG(5,("_spoolss_GetPrintProcessorDirectory\n"));
 
-       DEBUG(5,("_spoolss_getprintprocessordirectory\n"));
-
-       *needed=0;
+       *r->out.needed = 0;
 
-       switch(level) {
+       switch (r->in.level) {
        case 1:
-               result = getprintprocessordirectory_level_1
-                 (&q_u->name, &q_u->environment, buffer, offered, needed);
+               result = getprintprocessordirectory_level_1(p->mem_ctx,
+                                                           r->in.server,
+                                                           r->in.environment,
+                                                           &r->out.info->info1,
+                                                           r->in.offered,
+                                                           r->out.needed);
+               if (W_ERROR_EQUAL(result, WERR_INSUFFICIENT_BUFFER)) {
+                       TALLOC_FREE(r->out.info);
+               }
                break;
        default:
                result = WERR_UNKNOWN_LEVEL;
@@ -10245,17 +10240,6 @@ WERROR _spoolss_EnumPrintProcessors(pipes_struct *p,
        return WERR_NOT_SUPPORTED;
 }
 
-/****************************************************************
- _spoolss_GetPrintProcessorDirectory
-****************************************************************/
-
-WERROR _spoolss_GetPrintProcessorDirectory(pipes_struct *p,
-                                          struct spoolss_GetPrintProcessorDirectory *r)
-{
-       p->rng_fault_state = true;
-       return WERR_NOT_SUPPORTED;
-}
-
 /****************************************************************
  _spoolss_ReadPrinter
 ****************************************************************/