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 "librpc/gen_ndr/ndr_srvsvc.h"
25 #include "rpc_server/common/common.h"
26 #include "rpc_server/srvsvc/proto.h"
27 #include "lib/socket/socket.h"
28 #include "param/param.h"
30 struct socket_address
*srvsvc_get_my_addr(void *p
, TALLOC_CTX
*mem_ctx
)
32 struct dcesrv_connection
*conn
= talloc_get_type(p
, struct dcesrv_connection
);
33 return dcesrv_connection_get_my_addr(conn
, mem_ctx
);
36 struct socket_address
*srvsvc_get_peer_addr(void *p
, TALLOC_CTX
*mem_ctx
)
38 struct dcesrv_connection
*conn
= talloc_get_type(p
, struct dcesrv_connection
);
39 return dcesrv_connection_get_peer_addr(conn
, mem_ctx
);
42 struct srvsvc_ntvfs_ctx
{
43 struct ntvfs_context
*ntvfs
;
46 static int srvsvc_ntvfs_ctx_destructor(struct srvsvc_ntvfs_ctx
*c
)
48 ntvfs_disconnect(c
->ntvfs
);
52 NTSTATUS
srvsvc_create_ntvfs_context(struct dcesrv_call_state
*dce_call
,
55 struct ntvfs_context
**_ntvfs
)
58 struct srvsvc_ntvfs_ctx
*c
;
59 struct ntvfs_request
*ntvfs_req
;
61 struct share_context
*sctx
;
62 struct share_config
*scfg
;
63 const char *sharetype
;
65 status
= share_get_context_by_name(mem_ctx
, lp_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
66 if (!NT_STATUS_IS_OK(status
)) {
70 status
= share_get_config(mem_ctx
, sctx
, share
, &scfg
);
71 if (!NT_STATUS_IS_OK(status
)) {
72 DEBUG(0,("srvsvc_create_ntvfs_context: couldn't find service %s\n", share
));
76 #if 0 /* TODO: fix access cecking */
77 if (!socket_check_access(dce_call
->connection
->socket
,
79 share_string_list_option(scfg
, SHARE_HOSTS_ALLOW
),
80 share_string_list_option(scfg
, SHARE_HOSTS_DENY
))) {
81 return NT_STATUS_ACCESS_DENIED
;
85 /* work out what sort of connection this is */
86 sharetype
= share_string_option(scfg
, SHARE_TYPE
, SHARE_TYPE_DEFAULT
);
87 if (sharetype
&& strcmp(sharetype
, "IPC") == 0) {
89 } else if (sharetype
&& strcmp(sharetype
, "PRINTER")) {
95 c
= talloc(mem_ctx
, struct srvsvc_ntvfs_ctx
);
96 NT_STATUS_HAVE_NO_MEMORY(c
);
98 /* init ntvfs function pointers */
99 status
= ntvfs_init_connection(c
, scfg
, type
,
101 0,/* ntvfs_client_caps */
103 dce_call
->conn
->msg_ctx
,
104 dce_call
->conn
->dce_ctx
->lp_ctx
,
105 dce_call
->conn
->server_id
,
107 if (!NT_STATUS_IS_OK(status
)) {
108 DEBUG(0, ("srvsvc_create_ntvfs_context: ntvfs_init_connection failed for service %s\n",
112 talloc_set_destructor(c
, srvsvc_ntvfs_ctx_destructor
);
115 * NOTE: we only set the addr callbacks as we're not interesseted in oplocks or in getting file handles
117 status
= ntvfs_set_addr_callbacks(c
->ntvfs
, srvsvc_get_my_addr
, srvsvc_get_peer_addr
, dce_call
->conn
);
118 if (!NT_STATUS_IS_OK(status
)) {
119 DEBUG(0,("srvsvc_create_ntvfs_context: NTVFS failed to set the addr callbacks!\n"));
123 ntvfs_req
= ntvfs_request_create(c
->ntvfs
, mem_ctx
,
124 dce_call
->conn
->auth_state
.session_info
,
125 0, /* TODO: fill in PID */
128 NT_STATUS_HAVE_NO_MEMORY(ntvfs_req
);
130 /* Invoke NTVFS connection hook */
131 /* FIXME: Here is the right parameter missing!
132 * status = ntvfs_connect(ntvfs_req, <TODO>); */
133 status
= NT_STATUS_UNSUCCESSFUL
; /* return this for now */
134 if (!NT_STATUS_IS_OK(status
)) {
135 DEBUG(0,("srvsvc_create_ntvfs_context: NTVFS ntvfs_connect() failed!\n"));