Replace cli_rpc_pipe_close by a talloc destructor on rpc_pipe_struct
[samba.git] / source / client / client.c
index 67060cb574f0f28ce1b82b42601fc0d9249baa6c..b4e1985a837b3a14eb1fed04106ff8469c4102d0 100644 (file)
@@ -981,7 +981,7 @@ static int do_get(const char *rname, const char *lname_in, bool reget)
        uint16 attr;
        SMB_OFF_T size;
        off_t start = 0;
-       ssize_t nread = 0;
+       SMB_OFF_T nread = 0;
        int rc = 0;
        struct cli_state *targetcli = NULL;
        char *targetname = NULL;
@@ -3627,13 +3627,13 @@ static bool browse_host_rpc(bool sort)
        NTSTATUS status;
        struct rpc_pipe_client *pipe_hnd;
        TALLOC_CTX *frame = talloc_stackframe();
-       ENUM_HND enum_hnd;
        WERROR werr;
-       SRV_SHARE_INFO_CTR ctr;
+       struct srvsvc_NetShareInfoCtr info_ctr;
+       struct srvsvc_NetShareCtr1 ctr1;
+       uint32_t resume_handle = 0;
+       uint32_t total_entries = 0;
        int i;
 
-       init_enum_hnd(&enum_hnd, 0);
-
        pipe_hnd = cli_rpc_pipe_open_noauth(cli, PI_SRVSVC, &status);
 
        if (pipe_hnd == NULL) {
@@ -3643,26 +3643,32 @@ static bool browse_host_rpc(bool sort)
                return false;
        }
 
-       werr = rpccli_srvsvc_net_share_enum(pipe_hnd, frame, 1, &ctr,
-                                           0xffffffff, &enum_hnd);
+       ZERO_STRUCT(info_ctr);
+       ZERO_STRUCT(ctr1);
+
+       info_ctr.level = 1;
+       info_ctr.ctr.ctr1 = &ctr1;
+
+       status = rpccli_srvsvc_NetShareEnumAll(pipe_hnd, frame,
+                                             pipe_hnd->desthost,
+                                             &info_ctr,
+                                             0xffffffff,
+                                             &total_entries,
+                                             &resume_handle,
+                                             &werr);
 
-       if (!W_ERROR_IS_OK(werr)) {
-               cli_rpc_pipe_close(pipe_hnd);
+       if (!NT_STATUS_IS_OK(status) || !W_ERROR_IS_OK(werr)) {
+               TALLOC_FREE(pipe_hnd);
                TALLOC_FREE(frame);
                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(
-                       frame, &info->info_1_str.uni_netname);
-               comment = rpcstr_pull_unistr2_talloc(
-                       frame, &info->info_1_str.uni_remark);
-               browse_fn(name, info->info_1.type, comment, NULL);
+       for (i=0; i < info_ctr.ctr.ctr1->count; i++) {
+               struct srvsvc_NetShareInfo1 info = info_ctr.ctr.ctr1->array[i];
+               browse_fn(info.name, info.type, info.comment, NULL);
        }
 
-       cli_rpc_pipe_close(pipe_hnd);
+       TALLOC_FREE(pipe_hnd);
        TALLOC_FREE(frame);
        return true;
 }
@@ -4096,11 +4102,7 @@ static void completion_remote_filter(const char *mnt,
                        TALLOC_CTX *ctx = talloc_stackframe();
                        char *tmp;
 
-                       if (info->dirmask && info->dirmask[0] != 0) {
-                               tmp = talloc_strdup(ctx,info->dirmask);
-                       } else {
-                               tmp = talloc_strdup(ctx,"");
-                       }
+                       tmp = talloc_strdup(ctx,info->dirmask);
                        if (!tmp) {
                                TALLOC_FREE(ctx);
                                return;
@@ -4512,6 +4514,8 @@ static int process(const char *base_directory)
 
 static int do_host_query(const char *query_host)
 {
+       struct sockaddr_storage ss;
+
        cli = cli_cm_open(talloc_tos(), NULL,
                        query_host, "IPC$", true, smb_encrypt);
        if (!cli)
@@ -4519,6 +4523,12 @@ static int do_host_query(const char *query_host)
 
        browse_host(true);
 
+       if (interpret_string_addr(&ss, query_host, 0) && (ss.ss_family != AF_INET)) {
+               d_printf("%s is an IPv6 address -- no workgroup available\n",
+                       query_host);
+               return 1;
+       }
+
        if (port != 139) {
 
                /* Workgroups simply don't make sense over anything
@@ -4897,7 +4907,10 @@ static int do_message_op(void)
        }
 
        smb_encrypt = get_cmdline_auth_info_smb_encrypt();
-       init_names();
+       if (!init_names()) {
+               fprintf(stderr, "init_names() failed\n");
+               exit(1);
+       }
 
        if(new_name_resolve_order)
                lp_set_name_resolve_order(new_name_resolve_order);