r8054: add OSVersion, OSVersionEx, DNSMachineName PrintServerData
authorStefan Metzmacher <metze@samba.org>
Fri, 1 Jul 2005 12:19:24 +0000 (12:19 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:19:03 +0000 (13:19 -0500)
metze
(This used to be commit 47781fccbc9a4fc3867e4c3959a17765c7e4dc71)

source4/librpc/idl/spoolss.idl
source4/ntptr/simple_ldb/ntptr_simple_ldb.c
source4/torture/rpc/spoolss.c

index 0dec162763dbfe39a98d68591a8f1d6a8b17f13f..f0f18088c67ec52bcdb49274ef7bdf85191bafe2 100644 (file)
        /* Function: 0x1a */
        const string SPOOLSS_ARCHITECTURE_NT_X86                = "Windows NT x86";
 
+       typedef [public,gensize] struct {
+               [value(ndr_size_spoolss_OSVersion(r,ndr->flags))] uint32 _ndr_size;
+               uint32 major;
+               uint32 minor;
+               uint32 build;
+               [value(2)] uint32 unknown;
+               [subcontext(0),subcontext_size(256)] nstring extra_string;
+       } spoolss_OSVersion;
+
+       typedef [public,gensize] struct {
+               [value(ndr_size_spoolss_OSVersionEx(r,ndr->flags))] uint32 _ndr_size;
+               uint32 major;
+               uint32 minor;
+               uint32 build;
+               [value(2)] uint32 unknown1;
+               [subcontext(0),subcontext_size(256)] nstring extra_string;
+               uint32 unknown2;/* service pack number? I saw 0 from w2k3 and 1 from winxp sp1*/
+               uint32 unknown3;/* hmm? w2k3: 131346(0x20112) winxp sp1: 503382272 0x1E010100 */
+       } spoolss_OSVersionEx;
+
        typedef [v1_enum] enum {
                SPOOLSS_PRINTER_DATA_TYPE_NULL = 0,
                SPOOLSS_PRINTER_DATA_TYPE_STRING = 1,
+               SPOOLSS_PRINTER_DATA_TYPE_BINARY = 3,
                SPOOLSS_PRINTER_DATA_TYPE_UINT32 = 4
        } spoolss_PrinterDataType;
 
        typedef [nodiscriminant,gensize] union {
                [case(SPOOLSS_PRINTER_DATA_TYPE_NULL)];
                [case(SPOOLSS_PRINTER_DATA_TYPE_STRING)] nstring string;
+               [case(SPOOLSS_PRINTER_DATA_TYPE_BINARY),flag(NDR_REMAINING)] DATA_BLOB binary;
                [case(SPOOLSS_PRINTER_DATA_TYPE_UINT32)] uint32 value;
                [default,flag(NDR_REMAINING)] DATA_BLOB data;
        } spoolss_PrinterData;
index c83cac4440244f3919ff932ed8bedd7624c2e97c..27c13346b032d9c4acbf5fd2e650596456409d90 100644 (file)
@@ -160,6 +160,53 @@ static WERROR sptr_GetPrintServerData(struct ntptr_GenericHandle *server, TALLOC
                r->out.type             = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
                r->out.data.value       = 1;
                return WERR_OK;
+       } else if (strcmp("OSVersion", r->in.value_name) == 0) {
+               DATA_BLOB blob;
+               NTSTATUS status;
+               struct spoolss_OSVersion os;
+
+               os.major                = dcesrv_common_get_version_major(mem_ctx, NULL);
+               os.minor                = dcesrv_common_get_version_minor(mem_ctx, NULL);
+               os.build                = dcesrv_common_get_version_build(mem_ctx, NULL);
+               os.extra_string         = "";
+
+               status = ndr_push_struct_blob(&blob, mem_ctx, &os, (ndr_push_flags_fn_t)ndr_push_spoolss_OSVersion);
+               if (!NT_STATUS_IS_OK(status)) {
+                       return WERR_GENERAL_FAILURE;
+               }
+
+               r->out.type             = SPOOLSS_PRINTER_DATA_TYPE_BINARY;
+               r->out.data.binary      = blob;
+               return WERR_OK;
+       } else if (strcmp("OSVersionEx", r->in.value_name) == 0) {
+               DATA_BLOB blob;
+               NTSTATUS status;
+               struct spoolss_OSVersionEx os_ex;
+
+               os_ex.major             = dcesrv_common_get_version_major(mem_ctx, NULL);
+               os_ex.minor             = dcesrv_common_get_version_minor(mem_ctx, NULL);
+               os_ex.build             = dcesrv_common_get_version_build(mem_ctx, NULL);
+               os_ex.extra_string              = "";
+               os_ex.unknown2          = 0;
+               os_ex.unknown3          = 0;
+
+               status = ndr_push_struct_blob(&blob, mem_ctx, &os_ex, (ndr_push_flags_fn_t)ndr_push_spoolss_OSVersionEx);
+               if (!NT_STATUS_IS_OK(status)) {
+                       return WERR_GENERAL_FAILURE;
+               }
+
+               r->out.type             = SPOOLSS_PRINTER_DATA_TYPE_BINARY;
+               r->out.data.binary      = blob;
+               return WERR_OK;
+       } else if (strcmp("DNSMachineName", r->in.value_name) == 0) {
+               if (!lp_realm()) return WERR_INVALID_PARAM;
+
+               r->out.type             = SPOOLSS_PRINTER_DATA_TYPE_STRING;
+               r->out.data.string      = talloc_asprintf(mem_ctx, "%s.%s",
+                                                                  lp_netbios_name(),
+                                                                  lp_realm());
+               W_ERROR_HAVE_NO_MEMORY(r->out.data.string);
+               return WERR_OK;
        }
 
        return WERR_INVALID_PARAM;
index 07a8addada52f0bfbaee6d33e53d9b71fd0559d8..33e84a52763593b31a7d789ae9c8d3f65ca9dfec 100644 (file)
@@ -2085,6 +2085,9 @@ BOOL torture_rpc_spoolss(void)
        ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DefaultSpoolDirectory");
        ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "Architecture");
        ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DsPresent");
+       ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "OSVersion");
+       ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "OSVersionEx");
+       ret &= test_GetPrinterData(ctx->p, ctx, &ctx->server_handle, "DNSMachineName");
 
        ret &= test_EnumForms(ctx->p, ctx, &ctx->server_handle, True);