diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2006-09-21 23:57:32 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:00:59 -0500 |
commit | 7ba2554d88a187ca1f4f40014363fdf9de2223a0 (patch) | |
tree | b2c64360d1f0dcd5ba593b666b89bd44d8581b86 /source3/utils | |
parent | 8ffe6c8a8d0c3315393506feabbbba5d503666e8 (diff) | |
download | samba-7ba2554d88a187ca1f4f40014363fdf9de2223a0.tar.gz samba-7ba2554d88a187ca1f4f40014363fdf9de2223a0.tar.bz2 samba-7ba2554d88a187ca1f4f40014363fdf9de2223a0.zip |
r18802: Use the pidl-generated code for the srvsvc interface, both client and server code.
This has had some basic testing. I'll do more during the next couple of days and hopefully also
make RPC-SRVSVC from Samba4 pass against it.
(This used to be commit ef10672399c4b82700dc431b4d93431ffdd42d98)
Diffstat (limited to 'source3/utils')
-rw-r--r-- | source3/utils/net_rpc.c | 380 | ||||
-rw-r--r-- | source3/utils/smbtree.c | 24 |
2 files changed, 132 insertions, 272 deletions
diff --git a/source3/utils/net_rpc.c b/source3/utils/net_rpc.c index 766dd43faa..e6ba152ec9 100644 --- a/source3/utils/net_rpc.c +++ b/source3/utils/net_rpc.c @@ -5,6 +5,7 @@ Copyright (C) 2002 Jim McDonough (jmcd@us.ibm.com) Copyright (C) 2004 Guenther Deschner (gd@samba.org) Copyright (C) 2005 Jeremy Allison (jra@samba.org) + Copyright (C) 2006 Jelmer Vernooij (jelmer@samba.org) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -3019,7 +3020,10 @@ static NTSTATUS rpc_share_add_internals(const DOM_SID *domain_sid, uint32 type = STYPE_DISKTREE; /* only allow disk shares to be added */ uint32 num_users=0, perms=0; char *password=NULL; /* don't allow a share password */ - uint32 level = 2; + uint32 level = 2; + uint32 parm_error; + union srvsvc_NetShareInfo info; + struct srvsvc_NetShareInfo2 info2; if ((sharename = talloc_strdup(mem_ctx, argv[0])) == NULL) { return NT_STATUS_NO_MEMORY; @@ -3030,10 +3034,19 @@ static NTSTATUS rpc_share_add_internals(const DOM_SID *domain_sid, return NT_STATUS_UNSUCCESSFUL; *path++ = '\0'; - result = rpccli_srvsvc_net_share_add(pipe_hnd, mem_ctx, sharename, type, - opt_comment, perms, opt_maxusers, - num_users, path, password, - level, NULL); + info.info2 = &info2; + + info2.type = type; + info2.comment = opt_comment; + info2.permissions = perms; + info2.max_users = opt_maxusers; + info2.current_users = num_users; + info2.path = path; + info2.password = password; + info2.name = sharename; + + result = rpccli_srvsvc_NetShareAdd(pipe_hnd, mem_ctx, NULL, level, + info, &parm_error); return werror_to_ntstatus(result); } @@ -3073,7 +3086,7 @@ static NTSTATUS rpc_share_del_internals(const DOM_SID *domain_sid, { WERROR result; - result = rpccli_srvsvc_net_share_del(pipe_hnd, mem_ctx, argv[0]); + result = rpccli_srvsvc_NetShareDel(pipe_hnd, mem_ctx, NULL, argv[0], 0); return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; } @@ -3101,21 +3114,16 @@ static int rpc_share_delete(int argc, const char **argv) /** * Formatted print of share info * - * @param info1 pointer to SRV_SHARE_INFO_1 to format + * @param info1 pointer to struct srvsvc_NetShareInfo1 to format **/ -static void display_share_info_1(SRV_SHARE_INFO_1 *info1) +static void display_share_info_1(struct srvsvc_NetShareInfo1 *info1) { - fstring netname = "", remark = ""; - - rpcstr_pull_unistr2_fstring(netname, &info1->info_1_str.uni_netname); - rpcstr_pull_unistr2_fstring(remark, &info1->info_1_str.uni_remark); - if (opt_long_list_entries) { d_printf("%-12s %-8.8s %-50s\n", - netname, share_type[info1->info_1.type], remark); + info1->name, share_type[info1->type], info1->comment); } else { - d_printf("%s\n", netname); + d_printf("%s\n", info1->name); } } @@ -3125,145 +3133,21 @@ static WERROR get_share_info(struct rpc_pipe_client *pipe_hnd, uint32 level, int argc, const char **argv, - SRV_SHARE_INFO_CTR *ctr) + union srvsvc_NetShareCtr *ctr, + uint32 *numentries) { - WERROR result; - SRV_SHARE_INFO info; + union srvsvc_NetShareInfo info; /* no specific share requested, enumerate all */ if (argc == 0) { + uint32 hnd = 0; - ENUM_HND hnd; - uint32 preferred_len = 0xffffffff; - - init_enum_hnd(&hnd, 0); - - return rpccli_srvsvc_net_share_enum(pipe_hnd, mem_ctx, level, ctr, - preferred_len, &hnd); + return rpccli_srvsvc_NetShareEnum(pipe_hnd, mem_ctx, NULL, &level, ctr, + 0xffffffff, numentries, &hnd); } /* request just one share */ - result = rpccli_srvsvc_net_share_get_info(pipe_hnd, mem_ctx, argv[0], level, &info); - - if (!W_ERROR_IS_OK(result)) - goto done; - - /* construct ctr */ - ZERO_STRUCTP(ctr); - - ctr->info_level = ctr->switch_value = level; - ctr->ptr_share_info = ctr->ptr_entries = 1; - ctr->num_entries = ctr->num_entries2 = 1; - - switch (level) { - case 1: - { - char *s; - SRV_SHARE_INFO_1 *info1; - - ctr->share.info1 = TALLOC_ARRAY(mem_ctx, SRV_SHARE_INFO_1, 1); - if (ctr->share.info1 == NULL) { - result = WERR_NOMEM; - goto done; - } - info1 = ctr->share.info1; - - memset(ctr->share.info1, 0, sizeof(SRV_SHARE_INFO_1)); - - /* Copy pointer crap */ - - memcpy(&info1->info_1, &info.share.info1.info_1, sizeof(SH_INFO_1)); - - /* Duplicate strings */ - - s = unistr2_tdup(mem_ctx, &info.share.info1.info_1_str.uni_netname); - if (s) - init_unistr2(&info1->info_1_str.uni_netname, s, UNI_STR_TERMINATE); - - s = unistr2_tdup(mem_ctx, &info.share.info1.info_1_str.uni_remark); - if (s) - init_unistr2(&info1->info_1_str.uni_remark, s, UNI_STR_TERMINATE); - } - case 2: - { - char *s; - SRV_SHARE_INFO_2 *info2; - - ctr->share.info2 = TALLOC_ARRAY(mem_ctx, SRV_SHARE_INFO_2, 1); - if (ctr->share.info2 == NULL) { - result = WERR_NOMEM; - goto done; - } - info2 = ctr->share.info2; - - memset(ctr->share.info2, 0, sizeof(SRV_SHARE_INFO_2)); - - /* Copy pointer crap */ - - memcpy(&info2->info_2, &info.share.info2.info_2, sizeof(SH_INFO_2)); - - /* Duplicate strings */ - - s = unistr2_tdup(mem_ctx, &info.share.info2.info_2_str.uni_netname); - if (s) - init_unistr2(&info2->info_2_str.uni_netname, s, UNI_STR_TERMINATE); - - s = unistr2_tdup(mem_ctx, &info.share.info2.info_2_str.uni_remark); - if (s) - init_unistr2(&info2->info_2_str.uni_remark, s, UNI_STR_TERMINATE); - - s = unistr2_tdup(mem_ctx, &info.share.info2.info_2_str.uni_path); - if (s) - init_unistr2(&info2->info_2_str.uni_path, s, UNI_STR_TERMINATE); - - s = unistr2_tdup(mem_ctx, &info.share.info2.info_2_str.uni_passwd); - if (s) - init_unistr2(&info2->info_2_str.uni_passwd, s, UNI_STR_TERMINATE); - } - case 502: - { - char *s; - SRV_SHARE_INFO_502 *info502; - - ctr->share.info502 = TALLOC_ARRAY(mem_ctx, SRV_SHARE_INFO_502, 1); - if (ctr->share.info502 == NULL) { - result = WERR_NOMEM; - goto done; - } - info502 = ctr->share.info502; - - memset(ctr->share.info502, 0, sizeof(SRV_SHARE_INFO_502)); - - /* Copy pointer crap */ - - memcpy(&info502->info_502, &info.share.info502.info_502, sizeof(SH_INFO_502)); - - /* Duplicate strings */ - - s = unistr2_tdup(mem_ctx, &info.share.info502.info_502_str.uni_netname); - if (s) - init_unistr2(&info502->info_502_str.uni_netname, s, UNI_STR_TERMINATE); - - s = unistr2_tdup(mem_ctx, &info.share.info502.info_502_str.uni_remark); - if (s) - init_unistr2(&info502->info_502_str.uni_remark, s, UNI_STR_TERMINATE); - - s = unistr2_tdup(mem_ctx, &info.share.info502.info_502_str.uni_path); - if (s) - init_unistr2(&info502->info_502_str.uni_path, s, UNI_STR_TERMINATE); - - s = unistr2_tdup(mem_ctx, &info.share.info502.info_502_str.uni_passwd); - if (s) - init_unistr2(&info502->info_502_str.uni_passwd, s, UNI_STR_TERMINATE); - - info502->info_502_str.sd = dup_sec_desc(mem_ctx, info.share.info502.info_502_str.sd); - - } - - } /* switch */ - -done: - return result; + return rpccli_srvsvc_NetShareGetInfo(pipe_hnd, mem_ctx, NULL, argv[0], level, &info); } /** @@ -3290,11 +3174,13 @@ static NTSTATUS rpc_share_list_internals(const DOM_SID *domain_sid, int argc, const char **argv) { - SRV_SHARE_INFO_CTR ctr; + union srvsvc_NetShareCtr ctr; WERROR result; uint32 i, level = 1; + uint32 numentries; - result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr); + result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr, + &numentries); if (!W_ERROR_IS_OK(result)) goto done; @@ -3306,8 +3192,8 @@ static NTSTATUS rpc_share_list_internals(const DOM_SID *domain_sid, "\nShare name Type Description\n"\ "---------- ---- -----------\n"); } - for (i = 0; i < ctr.num_entries; i++) - display_share_info_1(&ctr.share.info1[i]); + for (i = 0; i < numentries; i++) + display_share_info_1(&ctr.ctr1->array[i]); done: return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; } @@ -3336,7 +3222,7 @@ static BOOL check_share_availability(struct cli_state *cli, const char *netname) return True; } -static BOOL check_share_sanity(struct cli_state *cli, fstring netname, uint32 type) +static BOOL check_share_sanity(struct cli_state *cli, const char *netname, uint32 type) { /* only support disk shares */ if (! ( type == STYPE_DISKTREE || type == (STYPE_DISKTREE | STYPE_HIDDEN)) ) { @@ -3384,15 +3270,15 @@ static NTSTATUS rpc_share_migrate_shares_internals(const DOM_SID *domain_sid, { WERROR result; NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL; - SRV_SHARE_INFO_CTR ctr_src; - uint32 type = STYPE_DISKTREE; /* only allow disk shares to be added */ - char *password = NULL; /* don't allow a share password */ + union srvsvc_NetShareCtr ctr_src; uint32 i; struct rpc_pipe_client *srvsvc_pipe = NULL; struct cli_state *cli_dst = NULL; uint32 level = 502; /* includes secdesc */ + uint32 numentries; - result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr_src); + result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr_src, + &numentries); if (!W_ERROR_IS_OK(result)) goto done; @@ -3402,36 +3288,32 @@ static NTSTATUS rpc_share_migrate_shares_internals(const DOM_SID *domain_sid, return nt_status; - for (i = 0; i < ctr_src.num_entries; i++) { + for (i = 0; i < numentries; i++) { + uint32 parm_error; + union srvsvc_NetShareInfo info; - fstring netname = "", remark = "", path = ""; /* reset error-code */ nt_status = NT_STATUS_UNSUCCESSFUL; - rpcstr_pull_unistr2_fstring( - netname, &ctr_src.share.info502[i].info_502_str.uni_netname); - rpcstr_pull_unistr2_fstring( - remark, &ctr_src.share.info502[i].info_502_str.uni_remark); - rpcstr_pull_unistr2_fstring( - path, &ctr_src.share.info502[i].info_502_str.uni_path); - - if (!check_share_sanity(cli, netname, ctr_src.share.info502[i].info_502.type)) + if (!check_share_sanity(cli, ctr_src.ctr502->array[i].name, + ctr_src.ctr502->array[i].type)) + continue; /* finally add the share on the dst server */ printf("migrating: [%s], path: %s, comment: %s, without share-ACLs\n", - netname, path, remark); - - result = rpccli_srvsvc_net_share_add(srvsvc_pipe, mem_ctx, netname, type, remark, - ctr_src.share.info502[i].info_502.perms, - ctr_src.share.info502[i].info_502.max_uses, - ctr_src.share.info502[i].info_502.num_uses, - path, password, level, - NULL); + ctr_src.ctr502->array[i].name, + ctr_src.ctr502->array[i].path, + ctr_src.ctr502->array[i].comment); + + info.info502 = &ctr_src.ctr502->array[i]; + + result = rpccli_srvsvc_NetShareAdd(srvsvc_pipe, mem_ctx, NULL, + 502, info, &parm_error); if (W_ERROR_V(result) == W_ERROR_V(WERR_ALREADY_EXISTS)) { - printf(" [%s] does already exist\n", netname); + printf(" [%s] does already exist\n", ctr_src.ctr502->array[i].name); continue; } @@ -3660,7 +3542,7 @@ static NTSTATUS rpc_share_migrate_files_internals(const DOM_SID *domain_sid, { WERROR result; NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL; - SRV_SHARE_INFO_CTR ctr_src; + union srvsvc_NetShareCtr ctr_src; uint32 i; uint32 level = 502; struct copy_clistate cp_clistate; @@ -3668,27 +3550,24 @@ static NTSTATUS rpc_share_migrate_files_internals(const DOM_SID *domain_sid, BOOL got_dst_share = False; pstring mask = "\\*"; char *dst = NULL; + uint32 numentries; dst = SMB_STRDUP(opt_destination?opt_destination:"127.0.0.1"); - result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr_src); + result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr_src, + &numentries); if (!W_ERROR_IS_OK(result)) goto done; - for (i = 0; i < ctr_src.num_entries; i++) { - - fstring netname = ""; - - rpcstr_pull_unistr2_fstring( - netname, &ctr_src.share.info502[i].info_502_str.uni_netname); - - if (!check_share_sanity(cli, netname, ctr_src.share.info502[i].info_502.type)) + for (i = 0; i < numentries; i++) { + if (!check_share_sanity(cli, ctr_src.ctr502->array[i].name, + ctr_src.ctr502->array[i].type)) continue; /* one might not want to mirror whole discs :) */ - if (strequal(netname, "print$") || netname[1] == '$') { - d_printf("skipping [%s]: builtin/hidden share\n", netname); + if (strequal(ctr_src.ctr502->array[i].name, "print$") || ctr_src.ctr502->array[i].name[1] == '$') { + d_printf("skipping [%s]: builtin/hidden share\n", ctr_src.ctr502->array[i].name); continue; } @@ -3702,7 +3581,7 @@ static NTSTATUS rpc_share_migrate_files_internals(const DOM_SID *domain_sid, break; } printf(" [%s] files and directories %s ACLs, %s DOS Attributes %s\n", - netname, + ctr_src.ctr502->array[i].name, opt_acls ? "including" : "without", opt_attrs ? "including" : "without", opt_timestamps ? "(preserving timestamps)" : ""); @@ -3716,7 +3595,7 @@ static NTSTATUS rpc_share_migrate_files_internals(const DOM_SID *domain_sid, /* open share source */ nt_status = connect_to_service(&cp_clistate.cli_share_src, &cli->dest_ip, cli->desthost, - netname, "A:"); + ctr_src.ctr502->array[i].name, "A:"); if (!NT_STATUS_IS_OK(nt_status)) goto done; @@ -3725,21 +3604,22 @@ static NTSTATUS rpc_share_migrate_files_internals(const DOM_SID *domain_sid, if (net_mode_share == NET_MODE_SHARE_MIGRATE) { /* open share destination */ nt_status = connect_to_service(&cp_clistate.cli_share_dst, - NULL, dst, netname, "A:"); + NULL, dst, ctr_src.ctr502->array[i].name, "A:"); if (!NT_STATUS_IS_OK(nt_status)) goto done; got_dst_share = True; } - if (!copy_top_level_perms(&cp_clistate, netname)) { - d_fprintf(stderr, "Could not handle the top level directory permissions for the share: %s\n", netname); + if (!copy_top_level_perms(&cp_clistate, ctr_src.ctr502->array[i].name)) { + d_fprintf(stderr, "Could not handle the top level directory permissions for the share: %s\n", ctr_src.ctr502->array[i].name); nt_status = NT_STATUS_UNSUCCESSFUL; goto done; } if (!sync_files(&cp_clistate, mask)) { - d_fprintf(stderr, "could not handle files for share: %s\n", netname); + d_fprintf(stderr, "could not handle files for share: %s\n", + ctr_src.ctr502->array[i].name); nt_status = NT_STATUS_UNSUCCESSFUL; goto done; } @@ -3798,14 +3678,17 @@ static NTSTATUS rpc_share_migrate_security_internals(const DOM_SID *domain_sid, { WERROR result; NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL; - SRV_SHARE_INFO_CTR ctr_src; - SRV_SHARE_INFO info; + union srvsvc_NetShareCtr ctr_src; + union srvsvc_NetShareInfo info; uint32 i; struct rpc_pipe_client *srvsvc_pipe = NULL; struct cli_state *cli_dst = NULL; uint32 level = 502; /* includes secdesc */ + uint32 numentries; + uint32 parm_error; - result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr_src); + result = get_share_info(pipe_hnd, mem_ctx, level, argc, argv, &ctr_src, + &numentries); if (!W_ERROR_IS_OK(result)) goto done; @@ -3816,39 +3699,28 @@ static NTSTATUS rpc_share_migrate_security_internals(const DOM_SID *domain_sid, return nt_status; - for (i = 0; i < ctr_src.num_entries; i++) { - - fstring netname = "", remark = "", path = ""; + for (i = 0; i < numentries; i++) { /* reset error-code */ nt_status = NT_STATUS_UNSUCCESSFUL; - rpcstr_pull_unistr2_fstring( - netname, &ctr_src.share.info502[i].info_502_str.uni_netname); - rpcstr_pull_unistr2_fstring( - remark, &ctr_src.share.info502[i].info_502_str.uni_remark); - rpcstr_pull_unistr2_fstring( - path, &ctr_src.share.info502[i].info_502_str.uni_path); - - if (!check_share_sanity(cli, netname, ctr_src.share.info502[i].info_502.type)) + if (!check_share_sanity(cli, ctr_src.ctr502->array[i].name, ctr_src.ctr502->array[i].type)) continue; printf("migrating: [%s], path: %s, comment: %s, including share-ACLs\n", - netname, path, remark); + ctr_src.ctr502->array[i].name, + ctr_src.ctr502->array[i].path, + ctr_src.ctr502->array[i].comment); if (opt_verbose) - display_sec_desc(ctr_src.share.info502[i].info_502_str.sd); + display_sec_desc(ctr_src.ctr502->array[i].sd); /* init info */ ZERO_STRUCT(info); - info.switch_value = level; - info.ptr_share_ctr = 1; - - /* FIXME: shouldn't we be able to just set the security descriptor ? */ - info.share.info502 = ctr_src.share.info502[i]; - /* finally modify the share on the dst server */ - result = rpccli_srvsvc_net_share_set_info(srvsvc_pipe, mem_ctx, netname, level, &info); + result = rpccli_srvsvc_NetShareSetInfo(srvsvc_pipe, mem_ctx, NULL, + argv[0], level, info, + &parm_error); if (!W_ERROR_IS_OK(result)) { printf("cannot set share-acl: %s\n", dos_errstr(result)); @@ -4481,11 +4353,11 @@ static void show_userlist(struct rpc_pipe_client *pipe_hnd, SEC_DESC *root_sd = NULL; struct cli_state *cli = pipe_hnd->cli; int i; - SRV_SHARE_INFO info; + union srvsvc_NetShareInfo info; WERROR result; uint16 cnum; - result = rpccli_srvsvc_net_share_get_info(pipe_hnd, mem_ctx, netname, + result = rpccli_srvsvc_NetShareGetInfo(pipe_hnd, mem_ctx, NULL, netname, 502, &info); if (!W_ERROR_IS_OK(result)) { @@ -4494,7 +4366,7 @@ static void show_userlist(struct rpc_pipe_client *pipe_hnd, return; } - share_sd = info.share.info502.info_502_str.sd; + share_sd = info.info502->sd; if (share_sd == NULL) { DEBUG(1, ("Got no secdesc for share %s\n", netname)); @@ -4608,7 +4480,7 @@ static NTSTATUS rpc_share_allowedusers_internals(const DOM_SID *domain_sid, { int ret; BOOL r; - ENUM_HND hnd; + uint32 hnd; uint32 i; FILE *f; @@ -4646,8 +4518,7 @@ static NTSTATUS rpc_share_allowedusers_internals(const DOM_SID *domain_sid, for (i=0; i<num_tokens; i++) collect_alias_memberships(&tokens[i].token); - init_enum_hnd(&hnd, 0); - + hnd = 0; share_list.num_shares = 0; share_list.shares = NULL; @@ -4778,7 +4649,10 @@ static NTSTATUS rpc_sh_share_add(TALLOC_CTX *mem_ctx, struct rpc_pipe_client *pipe_hnd, int argc, const char **argv) { + union srvsvc_NetShareInfo info; + struct srvsvc_NetShareInfo2 info2; WERROR result; + uint32 parm_error; if ((argc < 2) || (argc > 3)) { d_fprintf(stderr, "usage: %s <share> <path> [comment]\n", @@ -4786,10 +4660,13 @@ static NTSTATUS rpc_sh_share_add(TALLOC_CTX *mem_ctx, return NT_STATUS_INVALID_PARAMETER; } - result = rpccli_srvsvc_net_share_add( - pipe_hnd, mem_ctx, argv[0], STYPE_DISKTREE, - (argc == 3) ? argv[2] : "", - 0, 0, 0, argv[1], NULL, 2, NULL); + info.info2 = &info2; + info2.name = argv[0]; + info2.type = STYPE_DISKTREE; + info2.comment = (argc == 3) ? argv[2] : ""; + + result = rpccli_srvsvc_NetShareAdd( + pipe_hnd, mem_ctx, NULL, 2, info, &parm_error); return werror_to_ntstatus(result); } @@ -4806,7 +4683,7 @@ static NTSTATUS rpc_sh_share_delete(TALLOC_CTX *mem_ctx, return NT_STATUS_INVALID_PARAMETER; } - result = rpccli_srvsvc_net_share_del(pipe_hnd, mem_ctx, argv[0]); + result = rpccli_srvsvc_NetShareDel(pipe_hnd, mem_ctx, NULL, argv[0], 0); return werror_to_ntstatus(result); } @@ -4815,8 +4692,7 @@ static NTSTATUS rpc_sh_share_info(TALLOC_CTX *mem_ctx, struct rpc_pipe_client *pipe_hnd, int argc, const char **argv) { - SRV_SHARE_INFO info; - SRV_SHARE_INFO_2 *info2 = &info.share.info2; + union srvsvc_NetShareInfo info; WERROR result; if (argc != 1) { @@ -4824,25 +4700,16 @@ static NTSTATUS rpc_sh_share_info(TALLOC_CTX *mem_ctx, return NT_STATUS_INVALID_PARAMETER; } - result = rpccli_srvsvc_net_share_get_info( - pipe_hnd, mem_ctx, argv[0], 2, &info); + result = rpccli_srvsvc_NetShareGetInfo( + pipe_hnd, mem_ctx, NULL, argv[0], 2, &info); if (!W_ERROR_IS_OK(result)) { goto done; } - d_printf("Name: %s\n", - rpcstr_pull_unistr2_talloc(mem_ctx, - &info2->info_2_str.uni_netname)); - d_printf("Comment: %s\n", - rpcstr_pull_unistr2_talloc(mem_ctx, - &info2->info_2_str.uni_remark)); - - d_printf("Path: %s\n", - rpcstr_pull_unistr2_talloc(mem_ctx, - &info2->info_2_str.uni_path)); - d_printf("Password: %s\n", - rpcstr_pull_unistr2_talloc(mem_ctx, - &info2->info_2_str.uni_passwd)); + d_printf("Name: %s\n", info.info2->name); + d_printf("Comment: %s\n", info.info2->comment); + d_printf("Path: %s\n", info.info2->path); + d_printf("Password: %s\n", info.info2->password); done: return werror_to_ntstatus(result); @@ -4902,7 +4769,7 @@ static NTSTATUS rpc_file_close_internals(const DOM_SID *domain_sid, const char **argv) { WERROR result; - result = rpccli_srvsvc_net_file_close(pipe_hnd, mem_ctx, atoi(argv[0])); + result = rpccli_srvsvc_NetFileClose(pipe_hnd, mem_ctx, NULL, atoi(argv[0])); return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; } @@ -4934,15 +4801,10 @@ static int rpc_file_close(int argc, const char **argv) * @param str3 strings for FILE_INFO_3 **/ -static void display_file_info_3( FILE_INFO_3 *info3 ) +static void display_file_info_3( struct srvsvc_NetFileInfo3 *info3 ) { - fstring user = "", path = ""; - - rpcstr_pull_unistr2_fstring(user, info3->user); - rpcstr_pull_unistr2_fstring(path, info3->path); - d_printf("%-7.1d %-20.20s 0x%-4.2x %-6.1d %s\n", - info3->id, user, info3->perms, info3->num_locks, path); + info3->fid, info3->user, info3->permissions, info3->num_locks, info3->path); } /** @@ -4969,20 +4831,22 @@ static NTSTATUS rpc_file_list_internals(const DOM_SID *domain_sid, int argc, const char **argv) { - SRV_FILE_INFO_CTR ctr; + union srvsvc_NetFileCtr ctr; WERROR result; - ENUM_HND hnd; + uint32 hnd; uint32 preferred_len = 0xffffffff, i; const char *username=NULL; + uint32 level = 3; + uint32 numentries; - init_enum_hnd(&hnd, 0); + hnd = 0; /* if argc > 0, must be user command */ if (argc > 0) username = smb_xstrdup(argv[0]); - result = rpccli_srvsvc_net_file_enum(pipe_hnd, - mem_ctx, 3, username, &ctr, preferred_len, &hnd); + result = rpccli_srvsvc_NetFileEnum(pipe_hnd, + mem_ctx, NULL, NULL, username, &level, &ctr, preferred_len, &numentries, &hnd); if (!W_ERROR_IS_OK(result)) goto done; @@ -4993,8 +4857,8 @@ static NTSTATUS rpc_file_list_internals(const DOM_SID *domain_sid, "\nEnumerating open files on remote server:\n\n"\ "\nFileId Opened by Perms Locks Path"\ "\n------ --------- ----- ----- ---- \n"); - for (i = 0; i < ctr.num_entries; i++) - display_file_info_3(&ctr.file.info3[i]); + for (i = 0; i < numentries; i++) + display_file_info_3(&ctr.ctr3->array[i]); done: return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; } diff --git a/source3/utils/smbtree.c b/source3/utils/smbtree.c index d9cd446f6c..1feb5b7e1d 100644 --- a/source3/utils/smbtree.c +++ b/source3/utils/smbtree.c @@ -134,10 +134,12 @@ static BOOL get_rpc_shares(struct cli_state *cli, NTSTATUS status; struct rpc_pipe_client *pipe_hnd; TALLOC_CTX *mem_ctx; - ENUM_HND enum_hnd; + uint32 enum_hnd; WERROR werr; - SRV_SHARE_INFO_CTR ctr; + union srvsvc_NetShareCtr ctr; + uint32 numentries; int i; + uint32 info_level = 1; mem_ctx = talloc_new(NULL); if (mem_ctx == NULL) { @@ -145,8 +147,7 @@ static BOOL get_rpc_shares(struct cli_state *cli, return False; } - init_enum_hnd(&enum_hnd, 0); - + enum_hnd = 0; pipe_hnd = cli_rpc_pipe_open_noauth(cli, PI_SRVSVC, &status); if (pipe_hnd == NULL) { @@ -156,8 +157,8 @@ static BOOL get_rpc_shares(struct cli_state *cli, return False; } - werr = rpccli_srvsvc_net_share_enum(pipe_hnd, mem_ctx, 1, &ctr, - 0xffffffff, &enum_hnd); + werr = rpccli_srvsvc_NetShareEnum(pipe_hnd, mem_ctx, NULL, &info_level, &ctr, + 0xffffffff, &numentries, &enum_hnd); if (!W_ERROR_IS_OK(werr)) { TALLOC_FREE(mem_ctx); @@ -165,14 +166,9 @@ static BOOL get_rpc_shares(struct cli_state *cli, return False; } - for (i=0; i<ctr.num_entries; i++) { - SRV_SHARE_INFO_1 *info = &ctr.share.info1[i]; - char *name, *comment; - name = rpcstr_pull_unistr2_talloc( - mem_ctx, &info->info_1_str.uni_netname); - comment = rpcstr_pull_unistr2_talloc( - mem_ctx, &info->info_1_str.uni_remark); - fn(name, info->info_1.type, comment, state); + for (i=0; i<numentries; i++) { + fn(ctr.ctr1->array[i].name, ctr.ctr1->array[i].type, + ctr.ctr1->array[i].comment, state); } TALLOC_FREE(mem_ctx); |