2 Unix SMB/CIFS implementation.
3 client connect/disconnect routines
4 Copyright (C) Andrew Tridgell 2003
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 2 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, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 wrapper around cli_sock_connect()
26 BOOL
cli_socket_connect(struct cli_state
*cli
, const char *server
, struct in_addr
*ip
)
28 struct cli_socket
*sock
;
30 sock
= cli_sock_init();
31 if (!sock
) return False
;
33 if (!cli_sock_connect_byname(sock
, server
, 0)) {
38 cli
->transport
= cli_transport_init(sock
);
39 if (!cli
->transport
) {
47 /* wrapper around cli_transport_connect() */
48 BOOL
cli_transport_establish(struct cli_state
*cli
,
49 struct nmb_name
*calling
,
50 struct nmb_name
*called
)
52 return cli_transport_connect(cli
->transport
, calling
, called
);
55 /* wrapper around smb_raw_negotiate() */
56 BOOL
cli_negprot(struct cli_state
*cli
)
59 status
= smb_raw_negotiate(cli
->transport
);
60 return NT_STATUS_IS_OK(status
);
63 /* wrapper around smb_raw_session_setup() */
64 BOOL
cli_session_setup(struct cli_state
*cli
,
69 union smb_sesssetup setup
;
73 cli
->session
= cli_session_init(cli
->transport
);
74 if (!cli
->session
) return False
;
76 mem_ctx
= talloc_init("cli_session_setup");
77 if (!mem_ctx
) return False
;
79 setup
.generic
.level
= RAW_SESSSETUP_GENERIC
;
80 setup
.generic
.in
.sesskey
= cli
->transport
->negotiate
.sesskey
;
81 setup
.generic
.in
.capabilities
= CAP_UNICODE
| CAP_STATUS32
|
82 CAP_LARGE_FILES
| CAP_NT_SMBS
| CAP_LEVEL_II_OPLOCKS
|
83 CAP_W2K_SMBS
| CAP_LARGE_READX
| CAP_LARGE_WRITEX
;
84 setup
.generic
.in
.password
= password
;
85 setup
.generic
.in
.user
= user
;
86 setup
.generic
.in
.domain
= domain
;
88 status
= smb_raw_session_setup(cli
->session
, mem_ctx
, &setup
);
90 cli
->session
->vuid
= setup
.generic
.out
.vuid
;
92 talloc_destroy(mem_ctx
);
94 return NT_STATUS_IS_OK(status
);
97 /* wrapper around smb_tree_connect() */
98 BOOL
cli_send_tconX(struct cli_state
*cli
, const char *sharename
, const char *devtype
,
105 cli
->tree
= cli_tree_init(cli
->session
);
106 if (!cli
->tree
) return False
;
108 cli
->tree
->reference_count
++;
110 /* setup a tree connect */
111 tcon
.generic
.level
= RAW_TCON_TCONX
;
112 tcon
.tconx
.in
.flags
= 0;
113 tcon
.tconx
.in
.password
= data_blob(password
, strlen(password
)+1);
114 tcon
.tconx
.in
.path
= sharename
;
115 tcon
.tconx
.in
.device
= devtype
;
117 mem_ctx
= talloc_init("tcon");
122 status
= smb_tree_connect(cli
->tree
, mem_ctx
, &tcon
);
124 cli
->tree
->tid
= tcon
.tconx
.out
.cnum
;
126 talloc_destroy(mem_ctx
);
128 return NT_STATUS_IS_OK(status
);
133 easy way to get to a fully connected cli_state in one call
135 NTSTATUS
cli_full_connection(struct cli_state
**ret_cli
,
139 const char *sharename
,
141 const char *username
,
143 const char *password
,
147 struct cli_tree
*tree
;
152 mem_ctx
= talloc_init("cli_full_connection");
156 /* if the username is of the form DOMAIN\username then split out the domain */
157 p
= strpbrk(username
, "\\/");
159 domain
= talloc_strndup(mem_ctx
, username
, PTR_DIFF(p
, username
));
160 username
= talloc_strdup(mem_ctx
, p
+1);
163 status
= cli_tree_full_connection(&tree
, myname
, host
, 0, sharename
, devtype
,
164 username
, domain
, password
);
165 if (!NT_STATUS_IS_OK(status
)) {
169 (*ret_cli
) = cli_state_init();
171 (*ret_cli
)->tree
= tree
;
172 (*ret_cli
)->session
= tree
->session
;
173 (*ret_cli
)->transport
= tree
->session
->transport
;
174 tree
->reference_count
++;
177 talloc_destroy(mem_ctx
);
185 BOOL
cli_tdis(struct cli_state
*cli
)
188 status
= smb_tree_disconnect(cli
->tree
);
189 return NT_STATUS_IS_OK(status
);
192 /****************************************************************************
193 Initialise a client state structure.
194 ****************************************************************************/
195 struct cli_state
*cli_state_init(void)
197 struct cli_state
*cli
;
200 mem_ctx
= talloc_init("cli_state");
201 if (!mem_ctx
) return NULL
;
203 cli
= talloc_zero(mem_ctx
, sizeof(*cli
));
204 cli
->mem_ctx
= mem_ctx
;
209 /****************************************************************************
210 Shutdown a client structure.
211 ****************************************************************************/
212 void cli_shutdown(struct cli_state
*cli
)
214 if (!cli
|| !cli
->tree
) return;
215 cli
->tree
->reference_count
++;
216 cli_tree_close(cli
->tree
);
218 talloc_destroy(cli
->mem_ctx
);