From 635b8070b665473bf067ed71f7240b9707d3ca95 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 11 Mar 2009 02:16:29 +0100 Subject: s3-spoolss: use macros for _spoolss_EnumForms and split out level 1 enum. Guenther --- source3/rpc_server/srv_spoolss_nt.c | 152 +++++++++++++++++++++--------------- 1 file changed, 91 insertions(+), 61 deletions(-) (limited to 'source3/rpc_server/srv_spoolss_nt.c') diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index c4355b6f58..40e3fd06cb 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -7256,7 +7256,7 @@ WERROR _spoolss_enumprinterdrivers( pipes_struct *p, SPOOL_Q_ENUMPRINTERDRIVERS static WERROR fill_form_info_1(TALLOC_CTX *mem_ctx, struct spoolss_FormInfo1 *form, - nt_forms_struct *list) + const nt_forms_struct *list) { form->form_name = talloc_strdup(mem_ctx, list->name); W_ERROR_HAVE_NO_MEMORY(form->form_name); @@ -7272,6 +7272,58 @@ static WERROR fill_form_info_1(TALLOC_CTX *mem_ctx, return WERR_OK; } +/**************************************************************** + spoolss_enumforms_level1 +****************************************************************/ + +static WERROR spoolss_enumforms_level1(TALLOC_CTX *mem_ctx, + const nt_forms_struct *builtin_forms, + uint32_t num_builtin_forms, + const nt_forms_struct *user_forms, + uint32_t num_user_forms, + union spoolss_FormInfo **info_p, + uint32_t *count) +{ + union spoolss_FormInfo *info; + WERROR result = WERR_OK; + int i; + + *count = num_builtin_forms + num_user_forms; + + info = TALLOC_ARRAY(mem_ctx, union spoolss_FormInfo, *count); + W_ERROR_HAVE_NO_MEMORY(info); + + /* construct the list of form structures */ + for (i=0; iout.count = 0; + *r->out.needed = 0; + *r->out.info = NULL; /* that's an [in out] buffer */ @@ -7299,69 +7351,47 @@ WERROR _spoolss_EnumForms(pipes_struct *p, DEBUGADD(5,("Offered buffer size [%d]\n", r->in.offered)); DEBUGADD(5,("Info level [%d]\n", r->in.level)); - numbuiltinforms = get_builtin_ntforms(&builtinlist); - DEBUGADD(5,("Number of builtin forms [%d]\n", numbuiltinforms)); - count = get_ntforms(&list); - DEBUGADD(5,("Number of user forms [%d]\n", count)); - count += numbuiltinforms; + num_builtin_forms = get_builtin_ntforms(&builtin_forms); + DEBUGADD(5,("Number of builtin forms [%d]\n", num_builtin_forms)); + num_user_forms = get_ntforms(&user_forms); + DEBUGADD(5,("Number of user forms [%d]\n", num_user_forms)); - if (count == 0) { - SAFE_FREE(builtinlist); - SAFE_FREE(list); + if (num_user_forms + num_builtin_forms == 0) { + SAFE_FREE(builtin_forms); + SAFE_FREE(user_forms); return WERR_NO_MORE_ITEMS; } - info = TALLOC_ARRAY(p->mem_ctx, union spoolss_FormInfo, count); - if (!info) { - SAFE_FREE(builtinlist); - SAFE_FREE(list); - return WERR_NOMEM; - } - switch (r->in.level) { case 1: - /* construct the list of form structures */ - for (i=0; iout.needed = buffer_size; + result = spoolss_enumforms_level1(p->mem_ctx, + builtin_forms, + num_builtin_forms, + user_forms, + num_user_forms, + r->out.info, + r->out.count); + break; + default: + result = WERR_UNKNOWN_LEVEL; + break; + } - if (*r->out.needed > r->in.offered) { - TALLOC_FREE(info); - return WERR_INSUFFICIENT_BUFFER; - } + SAFE_FREE(user_forms); + SAFE_FREE(builtin_forms); - *r->out.count = count; - *r->out.info = info; + if (!W_ERROR_IS_OK(result)) { + return result; + } - return WERR_OK; + *r->out.needed = SPOOLSS_BUFFER_UNION_ARRAY(p->mem_ctx, + spoolss_EnumForms, NULL, + *r->out.info, r->in.level, + *r->out.count); + *r->out.info = SPOOLSS_BUFFER_OK(*r->out.info, NULL); + *r->out.count = SPOOLSS_BUFFER_OK(*r->out.count, 0); - default: - SAFE_FREE(list); - SAFE_FREE(builtinlist); - return WERR_UNKNOWN_LEVEL; - } + return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER); } /**************************************************************** -- cgit