The branch, v3-devel has been updated via b7a2f27c1cae9abed2f821177fca425012222632 (commit) via 43aad72457f77ac209494cfca46048e0c4bfa6c7 (commit) via b2d0df46038a88fa3f2ff82e155805c771916a42 (commit) via cff66738936f9f5cc4d2cd284cde2e1ac2972d33 (commit) via 2bb5bb9b964932f0be8eccf5739da5692a591245 (commit) via 7a46743909bfbfccf522eecf2ba117d5651439ef (commit) from 14c2688f2d37105ad129d26d13930177fe5c585f (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-devel - Log ----------------------------------------------------------------- commit b7a2f27c1cae9abed2f821177fca425012222632 Author: Günther Deschner <[EMAIL PROTECTED]> Date: Mon Sep 1 18:54:53 2008 +0200 netapi: add support for local query of level 101 in NetServerGetInfo. Guenther commit 43aad72457f77ac209494cfca46048e0c4bfa6c7 Author: Günther Deschner <[EMAIL PROTECTED]> Date: Mon Sep 1 18:37:54 2008 +0200 netapi: add support for more infolevels in NetServerGetInfo_r. Guenther commit b2d0df46038a88fa3f2ff82e155805c771916a42 Author: Günther Deschner <[EMAIL PROTECTED]> Date: Mon Sep 1 17:45:42 2008 +0200 netapi: add NetServerGetInfo example code. Guenther commit cff66738936f9f5cc4d2cd284cde2e1ac2972d33 Author: Günther Deschner <[EMAIL PROTECTED]> Date: Mon Sep 1 18:36:50 2008 +0200 netapi: add new SERVER_INFO structures to public header. Guenther commit 2bb5bb9b964932f0be8eccf5739da5692a591245 Author: Günther Deschner <[EMAIL PROTECTED]> Date: Mon Sep 1 17:44:01 2008 +0200 re-run make idl. Guenther commit 7a46743909bfbfccf522eecf2ba117d5651439ef Author: Günther Deschner <[EMAIL PROTECTED]> Date: Mon Sep 1 17:43:49 2008 +0200 netapi: add SERVER_INFO_100-102 to IDL. Guenther ----------------------------------------------------------------------- Summary of changes: source/lib/netapi/examples/Makefile.in | 6 + .../user_modalsget.c => server/server_getinfo.c} | 83 ++++++------ source/lib/netapi/netapi.h | 31 ++++ source/lib/netapi/serverinfo.c | 118 ++++++++++++++++- source/librpc/gen_ndr/libnetapi.h | 30 ++++ source/librpc/gen_ndr/ndr_libnetapi.c | 144 ++++++++++++++++++++ source/librpc/gen_ndr/ndr_libnetapi.h | 9 ++ source/librpc/idl/libnetapi.idl | 30 ++++ 8 files changed, 405 insertions(+), 46 deletions(-) copy source/lib/netapi/examples/{user/user_modalsget.c => server/server_getinfo.c} (51%) Changeset truncated at 500 lines: diff --git a/source/lib/netapi/examples/Makefile.in b/source/lib/netapi/examples/Makefile.in index f4ac8af..169736c 100644 --- a/source/lib/netapi/examples/Makefile.in +++ b/source/lib/netapi/examples/Makefile.in @@ -50,6 +50,7 @@ PROGS = bin/[EMAIL PROTECTED]@ \ bin/[EMAIL PROTECTED]@ \ bin/[EMAIL PROTECTED]@ \ bin/[EMAIL PROTECTED]@ \ + bin/[EMAIL PROTECTED]@ \ bin/[EMAIL PROTECTED]@ \ bin/[EMAIL PROTECTED]@ \ bin/[EMAIL PROTECTED]@ @@ -114,6 +115,7 @@ LOCALGROUPDELMEMBERS_OBJ = localgroup/localgroup_delmembers.o $(CMDLINE_OBJ) LOCALGROUPSETMEMBERS_OBJ = localgroup/localgroup_setmembers.o $(CMDLINE_OBJ) LOCALGROUPGETMEMBERS_OBJ = localgroup/localgroup_getmembers.o $(CMDLINE_OBJ) REMOTETOD_OBJ = server/remote_tod.o $(CMDLINE_OBJ) +SERVERGETINFO_OBJ = server/server_getinfo.o $(CMDLINE_OBJ) SHAREADD_OBJ = share/share_add.o $(CMDLINE_OBJ) SHAREDEL_OBJ = share/share_del.o $(CMDLINE_OBJ) SHAREENUM_OBJ = share/share_enum.o $(CMDLINE_OBJ) @@ -250,6 +252,10 @@ bin/[EMAIL PROTECTED]@: $(BINARY_PREREQS) $(REMOTETOD_OBJ) @echo Linking $@ @$(CC) $(FLAGS) -o $@ $(REMOTETOD_OBJ) $(LDFLAGS) $(DYNEXP) $(CMDLINE_LIBS) +bin/[EMAIL PROTECTED]@: $(BINARY_PREREQS) $(SERVERGETINFO_OBJ) + @echo Linking $@ + @$(CC) $(FLAGS) -o $@ $(SERVERGETINFO_OBJ) $(LDFLAGS) $(DYNEXP) $(CMDLINE_LIBS) + bin/[EMAIL PROTECTED]@: $(BINARY_PREREQS) $(SHAREADD_OBJ) @echo Linking $@ @$(CC) $(FLAGS) -o $@ $(SHAREADD_OBJ) $(LDFLAGS) $(DYNEXP) $(CMDLINE_LIBS) diff --git a/source/lib/netapi/examples/user/user_modalsget.c b/source/lib/netapi/examples/server/server_getinfo.c similarity index 51% copy from source/lib/netapi/examples/user/user_modalsget.c copy to source/lib/netapi/examples/server/server_getinfo.c index 4dcb41b..afd2edd 100644 --- a/source/lib/netapi/examples/user/user_modalsget.c +++ b/source/lib/netapi/examples/server/server_getinfo.c @@ -1,6 +1,6 @@ /* * Unix SMB/CIFS implementation. - * NetUserModalsGet query + * NetServerGetInfo query * Copyright (C) Guenther Deschner 2008 * * This program is free software; you can redistribute it and/or modify @@ -33,13 +33,12 @@ int main(int argc, const char **argv) struct libnetapi_ctx *ctx = NULL; const char *hostname = NULL; uint8_t *buffer = NULL; - uint32_t level = 0; - char *sid_str = NULL; + uint32_t level = 100; - struct USER_MODALS_INFO_0 *u0; - struct USER_MODALS_INFO_1 *u1; - struct USER_MODALS_INFO_2 *u2; - struct USER_MODALS_INFO_3 *u3; + struct SERVER_INFO_100 *i100; + struct SERVER_INFO_101 *i101; + struct SERVER_INFO_102 *i102; + struct SERVER_INFO_1005 *i1005; poptContext pc; int opt; @@ -55,7 +54,7 @@ int main(int argc, const char **argv) return status; } - pc = poptGetContext("user_modalsget", argc, argv, long_options, 0); + pc = poptGetContext("server_getinfo", argc, argv, long_options, 0); poptSetOtherOptionHelp(pc, "hostname level"); while((opt = poptGetNextOpt(pc)) != -1) { @@ -71,53 +70,51 @@ int main(int argc, const char **argv) level = atoi(poptGetArg(pc)); } - /* NetUserModalsGet */ + /* NetServerGetInfo */ - status = NetUserModalsGet(hostname, + status = NetServerGetInfo(hostname, level, &buffer); if (status != 0) { - printf("NetUserModalsGet failed with: %s\n", + printf("NetServerGetInfo failed with: %s\n", libnetapi_get_error_string(ctx, status)); goto out; } switch (level) { - case 0: - u0 = (struct USER_MODALS_INFO_0 *)buffer; - printf("min passwd len: %d character\n", - u0->usrmod0_min_passwd_len); - printf("max passwd age: %d (days)\n", - u0->usrmod0_max_passwd_age/86400); - printf("min passwd age: %d (days)\n", - u0->usrmod0_min_passwd_age/86400); - printf("force logoff: %d (seconds)\n", - u0->usrmod0_force_logoff); - printf("password history length: %d entries\n", - u0->usrmod0_password_hist_len); + case 100: + i100 = (struct SERVER_INFO_100 *)buffer; + printf("platform id: %d\n", i100->sv100_platform_id); + printf("name: %s\n", i100->sv100_name); break; - case 1: - u1 = (struct USER_MODALS_INFO_1 *)buffer; - printf("role: %d\n", u1->usrmod1_role); - printf("primary: %s\n", u1->usrmod1_primary); + case 101: + i101 = (struct SERVER_INFO_101 *)buffer; + printf("platform id: %d\n", i101->sv101_platform_id); + printf("name: %s\n", i101->sv101_name); + printf("version major: %d\n", i101->sv101_version_major); + printf("version minor: %d\n", i101->sv101_version_minor); + printf("type: 0x%08x\n", i101->sv101_type); + printf("comment: %s\n", i101->sv101_comment); break; - case 2: - u2 = (struct USER_MODALS_INFO_2 *)buffer; - printf("domain name: %s\n", u2->usrmod2_domain_name); - if (ConvertSidToStringSid(u2->usrmod2_domain_id, - &sid_str)) { - printf("domain sid: %s\n", sid_str); - free(sid_str); - } + case 102: + i102 = (struct SERVER_INFO_102 *)buffer; + printf("platform id: %d\n", i102->sv102_platform_id); + printf("name: %s\n", i102->sv102_name); + printf("version major: %d\n", i102->sv102_version_major); + printf("version minor: %d\n", i102->sv102_version_minor); + printf("type: 0x%08x\n", i102->sv102_type); + printf("comment: %s\n", i102->sv102_comment); + printf("users: %d\n", i102->sv102_users); + printf("disc: %d\n", i102->sv102_disc); + printf("hidden: %d\n", i102->sv102_hidden); + printf("announce: %d\n", i102->sv102_announce); + printf("anndelta: %d\n", i102->sv102_anndelta); + printf("licenses: %d\n", i102->sv102_licenses); + printf("userpath: %s\n", i102->sv102_userpath); break; - case 3: - u3 = (struct USER_MODALS_INFO_3 *)buffer; - printf("lockout duration: %d (seconds)\n", - u3->usrmod3_lockout_duration); - printf("lockout observation window: %d (seconds)\n", - u3->usrmod3_lockout_observation_window); - printf("lockout threshold: %d entries\n", - u3->usrmod3_lockout_threshold); + case 1005: + i1005 = (struct SERVER_INFO_1005 *)buffer; + printf("comment: %s\n", i1005->sv1005_comment); break; default: break; diff --git a/source/lib/netapi/netapi.h b/source/lib/netapi/netapi.h index 817d402..80c44f0 100644 --- a/source/lib/netapi/netapi.h +++ b/source/lib/netapi/netapi.h @@ -97,6 +97,37 @@ struct DOMAIN_CONTROLLER_INFO { #define TIMEQ_FOREVER ( (uint32_t)-1L ) +struct SERVER_INFO_100 { + uint32_t sv100_platform_id; + const char * sv100_name; +}; + +struct SERVER_INFO_101 { + uint32_t sv101_platform_id; + const char * sv101_name; + uint32_t sv101_version_major; + uint32_t sv101_version_minor; + uint32_t sv101_type; + const char * sv101_comment; +}; + +struct SERVER_INFO_102 { + uint32_t sv102_platform_id; + const char * sv102_name; + uint32_t sv102_version_major; + uint32_t sv102_version_minor; + uint32_t sv102_type; + const char * sv102_comment; + uint32_t sv102_users; + uint32_t sv102_disc; + uint8_t sv102_hidden; + uint32_t sv102_announce; + uint32_t sv102_anndelta; + uint32_t sv102_licenses; + const char * sv102_userpath; +}; + + struct SERVER_INFO_1005 { const char * sv1005_comment; }; diff --git a/source/lib/netapi/serverinfo.c b/source/lib/netapi/serverinfo.c index 5f744be..b2a134b 100644 --- a/source/lib/netapi/serverinfo.c +++ b/source/lib/netapi/serverinfo.c @@ -28,6 +28,29 @@ /**************************************************************** ****************************************************************/ +static WERROR NetServerGetInfo_l_101(struct libnetapi_ctx *ctx, + uint8_t **buffer) +{ + struct SERVER_INFO_101 i; + + i.sv101_platform_id = PLATFORM_ID_NT; + i.sv101_name = global_myname(); + i.sv101_version_major = lp_major_announce_version(); + i.sv101_version_minor = lp_minor_announce_version(); + i.sv101_type = lp_default_server_announce(); + i.sv101_comment = lp_serverstring(); + + *buffer = (uint8_t *)talloc_memdup(ctx, &i, sizeof(i)); + if (!*buffer) { + return WERR_NOMEM; + } + + return WERR_OK; +} + +/**************************************************************** +****************************************************************/ + static WERROR NetServerGetInfo_l_1005(struct libnetapi_ctx *ctx, uint8_t **buffer) { @@ -49,6 +72,8 @@ WERROR NetServerGetInfo_l(struct libnetapi_ctx *ctx, struct NetServerGetInfo *r) { switch (r->in.level) { + case 101: + return NetServerGetInfo_l_101(ctx, r->out.buffer); case 1005: return NetServerGetInfo_l_1005(ctx, r->out.buffer); default: @@ -61,6 +86,78 @@ WERROR NetServerGetInfo_l(struct libnetapi_ctx *ctx, /**************************************************************** ****************************************************************/ +static NTSTATUS map_server_info_to_SERVER_INFO_buffer(TALLOC_CTX *mem_ctx, + uint32_t level, + union srvsvc_NetSrvInfo *i, + uint8_t **buffer) +{ + struct SERVER_INFO_100 i100; + struct SERVER_INFO_101 i101; + struct SERVER_INFO_102 i102; + struct SERVER_INFO_1005 i1005; + + uint32_t num_info = 0; + + switch (level) { + case 100: + i100.sv100_platform_id = i->info100->platform_id; + i100.sv100_name = talloc_strdup(mem_ctx, i->info100->server_name); + + ADD_TO_ARRAY(mem_ctx, struct SERVER_INFO_100, i100, + (struct SERVER_INFO_100 **)buffer, + &num_info); + break; + + case 101: + i101.sv101_platform_id = i->info101->platform_id; + i101.sv101_name = talloc_strdup(mem_ctx, i->info101->server_name); + i101.sv101_version_major = i->info101->version_major; + i101.sv101_version_minor = i->info101->version_minor; + i101.sv101_type = i->info101->server_type; + i101.sv101_comment = talloc_strdup(mem_ctx, i->info101->comment); + + ADD_TO_ARRAY(mem_ctx, struct SERVER_INFO_101, i101, + (struct SERVER_INFO_101 **)buffer, + &num_info); + break; + + case 102: + i102.sv102_platform_id = i->info102->platform_id; + i102.sv102_name = talloc_strdup(mem_ctx, i->info102->server_name); + i102.sv102_version_major = i->info102->version_major; + i102.sv102_version_minor = i->info102->version_minor; + i102.sv102_type = i->info102->server_type; + i102.sv102_comment = talloc_strdup(mem_ctx, i->info102->comment); + i102.sv102_users = i->info102->users; + i102.sv102_disc = i->info102->disc; + i102.sv102_hidden = i->info102->hidden; + i102.sv102_announce = i->info102->announce; + i102.sv102_anndelta = i->info102->anndelta; + i102.sv102_licenses = i->info102->licenses; + i102.sv102_userpath = talloc_strdup(mem_ctx, i->info102->userpath); + + ADD_TO_ARRAY(mem_ctx, struct SERVER_INFO_102, i102, + (struct SERVER_INFO_102 **)buffer, + &num_info); + break; + + case 1005: + i1005.sv1005_comment = talloc_strdup(mem_ctx, i->info1005->comment); + + ADD_TO_ARRAY(mem_ctx, struct SERVER_INFO_1005, i1005, + (struct SERVER_INFO_1005 **)buffer, + &num_info); + break; + default: + return NT_STATUS_NOT_SUPPORTED; + } + + return NT_STATUS_OK; +} + +/**************************************************************** +****************************************************************/ + WERROR NetServerGetInfo_r(struct libnetapi_ctx *ctx, struct NetServerGetInfo *r) { @@ -70,6 +167,20 @@ WERROR NetServerGetInfo_r(struct libnetapi_ctx *ctx, WERROR werr; union srvsvc_NetSrvInfo info; + if (!r->out.buffer) { + return WERR_INVALID_PARAM; + } + + switch (r->in.level) { + case 100: + case 101: + case 102: + case 1005: + break; + default: + return WERR_UNKNOWN_LEVEL; + } + werr = libnetapi_open_pipe(ctx, r->in.server_name, &ndr_table_srvsvc.syntax_id, &cli, @@ -88,9 +199,10 @@ WERROR NetServerGetInfo_r(struct libnetapi_ctx *ctx, goto done; } - *r->out.buffer = (uint8_t *)talloc_memdup(ctx, &info, sizeof(info)); - if (!*r->out.buffer) { - werr = WERR_NOMEM; + status = map_server_info_to_SERVER_INFO_buffer(ctx, r->in.level, &info, + r->out.buffer); + if (!NT_STATUS_IS_OK(status)) { + werr = ntstatus_to_werror(status); goto done; } diff --git a/source/librpc/gen_ndr/libnetapi.h b/source/librpc/gen_ndr/libnetapi.h index 7a5f286..f11c837 100644 --- a/source/librpc/gen_ndr/libnetapi.h +++ b/source/librpc/gen_ndr/libnetapi.h @@ -58,6 +58,36 @@ struct domsid { #define NETSETUP_INSTALL_INVOCATION ( 0x00040000 ) #define NETSETUP_IGNORE_UNSUPPORTED_FLAGS ( 0x10000000 ) +struct SERVER_INFO_100 { + uint32_t sv100_platform_id; + const char * sv100_name; +}; + +struct SERVER_INFO_101 { + uint32_t sv101_platform_id; + const char * sv101_name; + uint32_t sv101_version_major; + uint32_t sv101_version_minor; + uint32_t sv101_type; + const char * sv101_comment; +}; + +struct SERVER_INFO_102 { + uint32_t sv102_platform_id; + const char * sv102_name; + uint32_t sv102_version_major; + uint32_t sv102_version_minor; + uint32_t sv102_type; + const char * sv102_comment; + uint32_t sv102_users; + uint32_t sv102_disc; + uint8_t sv102_hidden; + uint32_t sv102_announce; + uint32_t sv102_anndelta; + uint32_t sv102_licenses; + const char * sv102_userpath; +}; + struct SERVER_INFO_1005 { const char * sv1005_comment; }; diff --git a/source/librpc/gen_ndr/ndr_libnetapi.c b/source/librpc/gen_ndr/ndr_libnetapi.c index 106b9a4..90b5f9f 100644 --- a/source/librpc/gen_ndr/ndr_libnetapi.c +++ b/source/librpc/gen_ndr/ndr_libnetapi.c @@ -120,6 +120,150 @@ _PUBLIC_ void ndr_print_NetJoinFlags(struct ndr_print *ndr, const char *name, ui ndr->depth--; } +_PUBLIC_ enum ndr_err_code ndr_push_SERVER_INFO_100(struct ndr_push *ndr, int ndr_flags, const struct SERVER_INFO_100 *r) +{ + if (ndr_flags & NDR_SCALARS) { + NDR_CHECK(ndr_push_align(ndr, 4)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sv100_platform_id)); + NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->sv100_name)); + } + if (ndr_flags & NDR_BUFFERS) { + } + return NDR_ERR_SUCCESS; +} + +_PUBLIC_ enum ndr_err_code ndr_pull_SERVER_INFO_100(struct ndr_pull *ndr, int ndr_flags, struct SERVER_INFO_100 *r) +{ + if (ndr_flags & NDR_SCALARS) { + NDR_CHECK(ndr_pull_align(ndr, 4)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->sv100_platform_id)); + NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->sv100_name)); + } + if (ndr_flags & NDR_BUFFERS) { + } + return NDR_ERR_SUCCESS; +} + +_PUBLIC_ void ndr_print_SERVER_INFO_100(struct ndr_print *ndr, const char *name, const struct SERVER_INFO_100 *r) +{ + ndr_print_struct(ndr, name, "SERVER_INFO_100"); + ndr->depth++; + ndr_print_uint32(ndr, "sv100_platform_id", r->sv100_platform_id); + ndr_print_string(ndr, "sv100_name", r->sv100_name); + ndr->depth--; +} + +_PUBLIC_ enum ndr_err_code ndr_push_SERVER_INFO_101(struct ndr_push *ndr, int ndr_flags, const struct SERVER_INFO_101 *r) +{ + if (ndr_flags & NDR_SCALARS) { + NDR_CHECK(ndr_push_align(ndr, 4)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sv101_platform_id)); + NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->sv101_name)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sv101_version_major)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sv101_version_minor)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sv101_type)); + NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->sv101_comment)); + } + if (ndr_flags & NDR_BUFFERS) { + } + return NDR_ERR_SUCCESS; +} + +_PUBLIC_ enum ndr_err_code ndr_pull_SERVER_INFO_101(struct ndr_pull *ndr, int ndr_flags, struct SERVER_INFO_101 *r) +{ + if (ndr_flags & NDR_SCALARS) { + NDR_CHECK(ndr_pull_align(ndr, 4)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->sv101_platform_id)); + NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->sv101_name)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->sv101_version_major)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->sv101_version_minor)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->sv101_type)); + NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->sv101_comment)); + } + if (ndr_flags & NDR_BUFFERS) { + } + return NDR_ERR_SUCCESS; +} + +_PUBLIC_ void ndr_print_SERVER_INFO_101(struct ndr_print *ndr, const char *name, const struct SERVER_INFO_101 *r) +{ + ndr_print_struct(ndr, name, "SERVER_INFO_101"); + ndr->depth++; + ndr_print_uint32(ndr, "sv101_platform_id", r->sv101_platform_id); + ndr_print_string(ndr, "sv101_name", r->sv101_name); + ndr_print_uint32(ndr, "sv101_version_major", r->sv101_version_major); + ndr_print_uint32(ndr, "sv101_version_minor", r->sv101_version_minor); + ndr_print_uint32(ndr, "sv101_type", r->sv101_type); + ndr_print_string(ndr, "sv101_comment", r->sv101_comment); + ndr->depth--; +} + +_PUBLIC_ enum ndr_err_code ndr_push_SERVER_INFO_102(struct ndr_push *ndr, int ndr_flags, const struct SERVER_INFO_102 *r) +{ + if (ndr_flags & NDR_SCALARS) { + NDR_CHECK(ndr_push_align(ndr, 4)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sv102_platform_id)); + NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->sv102_name)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sv102_version_major)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sv102_version_minor)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sv102_type)); + NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->sv102_comment)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sv102_users)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sv102_disc)); + NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, r->sv102_hidden)); -- Samba Shared Repository