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
)
43 struct srvsvc_ntvfs_ctx
*c
;
44 struct ntvfs_request
*ntvfs_req
;
46 struct share_context
*sctx
;
47 struct share_config
*scfg
;
48 const char *sharetype
;
50 const struct tsocket_address
*local_address
;
51 const struct tsocket_address
*remote_address
;
53 status
= share_get_context_by_name(mem_ctx
, lpcfg_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
54 if (!NT_STATUS_IS_OK(status
)) {
58 status
= share_get_config(mem_ctx
, sctx
, share
, &scfg
);
59 if (!NT_STATUS_IS_OK(status
)) {
60 DEBUG(0,("srvsvc_create_ntvfs_context: couldn't find service %s\n", share
));
64 #if 0 /* TODO: fix access cecking */
65 if (!socket_check_access(dce_call
->connection
->socket
,
67 share_string_list_option(scfg
, SHARE_HOSTS_ALLOW
),
68 share_string_list_option(scfg
, SHARE_HOSTS_DENY
))) {
69 return NT_STATUS_ACCESS_DENIED
;
73 /* work out what sort of connection this is */
74 sharetype
= share_string_option(scfg
, SHARE_TYPE
, SHARE_TYPE_DEFAULT
);
75 if (sharetype
&& strcmp(sharetype
, "IPC") == 0) {
77 } else if (sharetype
&& strcmp(sharetype
, "PRINTER")) {
83 c
= talloc(mem_ctx
, struct srvsvc_ntvfs_ctx
);
84 NT_STATUS_HAVE_NO_MEMORY(c
);
86 /* init ntvfs function pointers */
87 status
= ntvfs_init_connection(c
, scfg
, type
,
89 0,/* ntvfs_client_caps */
91 dce_call
->conn
->msg_ctx
,
92 dce_call
->conn
->dce_ctx
->lp_ctx
,
93 dce_call
->conn
->server_id
,
95 if (!NT_STATUS_IS_OK(status
)) {
96 DEBUG(0, ("srvsvc_create_ntvfs_context: ntvfs_init_connection failed for service %s\n",
100 talloc_set_destructor(c
, srvsvc_ntvfs_ctx_destructor
);
103 * NOTE: we only set the addr callbacks as we're not interesseted in oplocks or in getting file handles
105 local_address
= dcesrv_connection_get_local_address(dce_call
->conn
);
106 remote_address
= dcesrv_connection_get_remote_address(dce_call
->conn
);
107 status
= ntvfs_set_addresses(c
->ntvfs
, local_address
, remote_address
);
108 if (!NT_STATUS_IS_OK(status
)) {
109 DEBUG(0,("srvsvc_create_ntvfs_context: NTVFS failed to set the addr callbacks!\n"));
113 ntvfs_req
= ntvfs_request_create(c
->ntvfs
, mem_ctx
,
114 dce_call
->conn
->auth_state
.session_info
,
115 0, /* TODO: fill in PID */
118 NT_STATUS_HAVE_NO_MEMORY(ntvfs_req
);
120 /* Invoke NTVFS connection hook */
121 tcon
.tcon
.level
= RAW_TCON_TCON
;
122 ZERO_STRUCT(tcon
.tcon
.in
);
123 tcon
.tcon
.in
.service
= scfg
->name
;
124 status
= ntvfs_connect(ntvfs_req
, &tcon
);
125 if (!NT_STATUS_IS_OK(status
)) {
126 DEBUG(0,("srvsvc_create_ntvfs_context: NTVFS ntvfs_connect() failed!\n"));