s3:libsmb: use cli_state_{g,s}et_uid instead of smb1.uid directly
[Samba/gebeck_regimport.git] / source3 / libsmb / clitrans.c
bloba3ac816e8a72702832d099cf46ce7f30d9759795
1 /*
2 Unix SMB/CIFS implementation.
3 client transaction calls
4 Copyright (C) Andrew Tridgell 1994-1998
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include "includes.h"
21 #include "libsmb/libsmb.h"
22 #include "../lib/util/tevent_ntstatus.h"
23 #include "async_smb.h"
24 #include "../libcli/smb/smbXcli_base.h"
26 struct cli_trans_state {
27 struct cli_state *cli;
28 struct tevent_req *req;
29 struct cli_trans_state **ptr;
32 static int cli_trans_state_destructor(struct cli_trans_state *state)
34 talloc_set_destructor(state->ptr, NULL);
35 talloc_free(state->ptr);
36 return 0;
39 static int cli_trans_state_ptr_destructor(struct cli_trans_state **ptr)
41 struct cli_trans_state *state = *ptr;
42 void *parent = talloc_parent(state);
44 talloc_set_destructor(state, NULL);
46 talloc_reparent(state, parent, state->req);
47 talloc_free(state);
48 return 0;
51 struct tevent_req *cli_trans_send(
52 TALLOC_CTX *mem_ctx, struct tevent_context *ev,
53 struct cli_state *cli, uint8_t cmd,
54 const char *pipe_name, uint16_t fid, uint16_t function, int flags,
55 uint16_t *setup, uint8_t num_setup, uint8_t max_setup,
56 uint8_t *param, uint32_t num_param, uint32_t max_param,
57 uint8_t *data, uint32_t num_data, uint32_t max_data)
59 struct cli_trans_state *state;
60 uint8_t additional_flags = 0;
61 uint8_t clear_flags = 0;
62 uint16_t additional_flags2 = 0;
63 uint16_t clear_flags2 = 0;
64 uint16_t uid = 0;
66 state = talloc_zero(mem_ctx, struct cli_trans_state);
67 if (state == NULL) {
68 return NULL;
70 state->cli = cli;
71 state->ptr = talloc(state, struct cli_trans_state *);
72 if (state->ptr == NULL) {
73 talloc_free(state);
74 return NULL;
76 *state->ptr = state;
77 if (cli->case_sensitive) {
78 clear_flags |= FLAG_CASELESS_PATHNAMES;
79 } else {
80 /* Default setting, case insensitive. */
81 additional_flags |= FLAG_CASELESS_PATHNAMES;
84 if ((smb1cli_conn_capabilities(cli->conn) & CAP_DFS) && cli->dfsroot) {
85 additional_flags2 |= FLAGS2_DFS_PATHNAMES;
88 uid = cli_state_get_uid(cli);
89 state->req = smb1cli_trans_send(state, ev,
90 cli->conn, cmd,
91 additional_flags, clear_flags,
92 additional_flags2, clear_flags2,
93 cli->timeout,
94 cli->smb1.pid, cli->smb1.tid, uid,
95 pipe_name, fid, function, flags,
96 setup, num_setup, max_setup,
97 param, num_param, max_param,
98 data, num_data, max_data);
99 if (state->req == NULL) {
100 talloc_free(state);
101 return NULL;
104 talloc_reparent(state, state->req, state->ptr);
105 talloc_set_destructor(state, cli_trans_state_destructor);
106 talloc_set_destructor(state->ptr, cli_trans_state_ptr_destructor);
108 return state->req;
111 NTSTATUS cli_trans_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
112 uint16_t *recv_flags2,
113 uint16_t **setup, uint8_t min_setup,
114 uint8_t *num_setup,
115 uint8_t **param, uint32_t min_param,
116 uint32_t *num_param,
117 uint8_t **data, uint32_t min_data,
118 uint32_t *num_data)
120 NTSTATUS status;
121 void *parent = talloc_parent(req);
122 struct cli_trans_state *state =
123 talloc_get_type(parent,
124 struct cli_trans_state);
125 bool map_dos_errors = true;
127 status = smb1cli_trans_recv(req, mem_ctx, recv_flags2,
128 setup, min_setup, num_setup,
129 param, min_param, num_param,
130 data, min_data, num_data);
132 if (state) {
133 map_dos_errors = state->cli->map_dos_errors;
134 state->cli->raw_status = status;
135 talloc_free(state->ptr);
136 state = NULL;
139 if (NT_STATUS_IS_DOS(status) && map_dos_errors) {
140 uint8_t eclass = NT_STATUS_DOS_CLASS(status);
141 uint16_t ecode = NT_STATUS_DOS_CODE(status);
143 * TODO: is it really a good idea to do a mapping here?
145 * The old cli_pull_error() also does it, so I do not change
146 * the behavior yet.
148 status = dos_to_ntstatus(eclass, ecode);
151 return status;
154 NTSTATUS cli_trans(TALLOC_CTX *mem_ctx, struct cli_state *cli,
155 uint8_t trans_cmd,
156 const char *pipe_name, uint16_t fid, uint16_t function,
157 int flags,
158 uint16_t *setup, uint8_t num_setup, uint8_t max_setup,
159 uint8_t *param, uint32_t num_param, uint32_t max_param,
160 uint8_t *data, uint32_t num_data, uint32_t max_data,
161 uint16_t *recv_flags2,
162 uint16_t **rsetup, uint8_t min_rsetup, uint8_t *num_rsetup,
163 uint8_t **rparam, uint32_t min_rparam, uint32_t *num_rparam,
164 uint8_t **rdata, uint32_t min_rdata, uint32_t *num_rdata)
166 NTSTATUS status;
167 uint8_t additional_flags = 0;
168 uint8_t clear_flags = 0;
169 uint16_t additional_flags2 = 0;
170 uint16_t clear_flags2 = 0;
171 uint16_t uid = 0;
173 if (cli->case_sensitive) {
174 clear_flags |= FLAG_CASELESS_PATHNAMES;
175 } else {
176 /* Default setting, case insensitive. */
177 additional_flags |= FLAG_CASELESS_PATHNAMES;
180 if ((smb1cli_conn_capabilities(cli->conn) & CAP_DFS) && cli->dfsroot) {
181 additional_flags2 |= FLAGS2_DFS_PATHNAMES;
184 uid = cli_state_get_uid(cli);
185 status = smb1cli_trans(mem_ctx,
186 cli->conn, trans_cmd,
187 additional_flags, clear_flags,
188 additional_flags2, clear_flags2,
189 cli->timeout,
190 cli->smb1.pid, cli->smb1.tid, uid,
191 pipe_name, fid, function, flags,
192 setup, num_setup, max_setup,
193 param, num_param, max_param,
194 data, num_data, max_data,
195 recv_flags2,
196 rsetup, min_rsetup, num_rsetup,
197 rparam, min_rparam, num_rparam,
198 rdata, min_rdata, num_rdata);
200 cli->raw_status = status;
202 if (NT_STATUS_IS_DOS(status) && cli->map_dos_errors) {
203 uint8_t eclass = NT_STATUS_DOS_CLASS(status);
204 uint16_t ecode = NT_STATUS_DOS_CODE(status);
206 * TODO: is it really a good idea to do a mapping here?
208 * The old cli_pull_error() also does it, so I do not change
209 * the behavior yet.
211 status = dos_to_ntstatus(eclass, ecode);
214 return status;