2 Unix SMB/CIFS implementation.
4 srvsvc pipe ntvfs helper functions
6 Copyright (C) Stefan (metze) Metzmacher 2006
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "ntvfs/ntvfs.h"
23 #include "rpc_server/dcerpc_server.h"
24 #include "param/param.h"
25 #include "rpc_server/srvsvc/proto.h"
27 struct srvsvc_ntvfs_ctx
{
28 struct ntvfs_context
*ntvfs
;
31 static int srvsvc_ntvfs_ctx_destructor(struct srvsvc_ntvfs_ctx
*c
)
33 ntvfs_disconnect(c
->ntvfs
);
37 NTSTATUS
srvsvc_create_ntvfs_context(struct dcesrv_call_state
*dce_call
,
40 struct ntvfs_context
**_ntvfs
)
42 struct auth_session_info
*session_info
=
43 dcesrv_call_session_info(dce_call
);
44 struct imessaging_context
*imsg_ctx
=
45 dcesrv_imessaging_context(dce_call
->conn
);
46 struct server_id server_id
= dcesrv_server_id(dce_call
->conn
);
48 struct srvsvc_ntvfs_ctx
*c
;
49 struct ntvfs_request
*ntvfs_req
;
51 struct share_context
*sctx
;
52 struct share_config
*scfg
;
55 const struct tsocket_address
*local_address
;
56 const struct tsocket_address
*remote_address
;
58 status
= share_get_context(mem_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
59 if (!NT_STATUS_IS_OK(status
)) {
63 status
= share_get_config(mem_ctx
, sctx
, share
, &scfg
);
64 if (!NT_STATUS_IS_OK(status
)) {
65 DEBUG(0,("srvsvc_create_ntvfs_context: couldn't find service %s\n", share
));
69 #if 0 /* TODO: fix access checking */
70 if (!socket_check_access(dce_call
->connection
->socket
,
72 share_string_list_option(scfg
, SHARE_HOSTS_ALLOW
),
73 share_string_list_option(scfg
, SHARE_HOSTS_DENY
))) {
74 return NT_STATUS_ACCESS_DENIED
;
78 /* work out what sort of connection this is */
79 sharetype
= share_string_option(mem_ctx
, scfg
, SHARE_TYPE
, SHARE_TYPE_DEFAULT
);
80 if (sharetype
&& strcmp(sharetype
, "IPC") == 0) {
82 } else if (sharetype
&& strcmp(sharetype
, "PRINTER")) {
88 TALLOC_FREE(sharetype
);
90 c
= talloc(mem_ctx
, struct srvsvc_ntvfs_ctx
);
91 NT_STATUS_HAVE_NO_MEMORY(c
);
93 /* init ntvfs function pointers */
94 status
= ntvfs_init_connection(c
, scfg
, type
,
96 0,/* ntvfs_client_caps */
99 dce_call
->conn
->dce_ctx
->lp_ctx
,
102 if (!NT_STATUS_IS_OK(status
)) {
103 DEBUG(0, ("srvsvc_create_ntvfs_context: ntvfs_init_connection failed for service %s\n",
107 talloc_set_destructor(c
, srvsvc_ntvfs_ctx_destructor
);
110 * NOTE: we only set the addr callbacks as we're not interested in oplocks or in getting file handles
112 local_address
= dcesrv_connection_get_local_address(dce_call
->conn
);
113 remote_address
= dcesrv_connection_get_remote_address(dce_call
->conn
);
114 status
= ntvfs_set_addresses(c
->ntvfs
, local_address
, remote_address
);
115 if (!NT_STATUS_IS_OK(status
)) {
116 DEBUG(0,("srvsvc_create_ntvfs_context: NTVFS failed to set the addr callbacks!\n"));
120 ntvfs_req
= ntvfs_request_create(c
->ntvfs
, mem_ctx
,
122 0, /* TODO: fill in PID */
125 NT_STATUS_HAVE_NO_MEMORY(ntvfs_req
);
127 /* Invoke NTVFS connection hook */
128 tcon
.tcon
.level
= RAW_TCON_TCON
;
129 ZERO_STRUCT(tcon
.tcon
.in
);
130 tcon
.tcon
.in
.service
= scfg
->name
;
131 status
= ntvfs_connect(ntvfs_req
, &tcon
);
132 if (!NT_STATUS_IS_OK(status
)) {
133 DEBUG(0,("srvsvc_create_ntvfs_context: NTVFS ntvfs_connect() failed!\n"));