ReactOS 0.4.15-dev-7958-gcd0bb1a
mount.c
Go to the documentation of this file.
1/* NFSv4.1 client for Windows
2 * Copyright © 2012 The Regents of the University of Michigan
3 *
4 * Olga Kornievskaia <aglo@umich.edu>
5 * Casey Bodley <cbodley@umich.edu>
6 *
7 * This library is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU Lesser General Public License as published by
9 * the Free Software Foundation; either version 2.1 of the License, or (at
10 * your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful, but
13 * without any warranty; without even the implied warranty of merchantability
14 * or fitness for a particular purpose. See the GNU Lesser General Public
15 * License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 */
21
22#include <windows.h>
23#include <strsafe.h>
24#include <stdio.h>
25
26#include "daemon_debug.h"
27#include "nfs41_ops.h"
28#include "upcall.h"
29#include "util.h"
30
31
32/* NFS41_MOUNT */
33static int parse_mount(unsigned char *buffer, uint32_t length, nfs41_upcall *upcall)
34{
35 int status;
36 mount_upcall_args *args = &upcall->args.mount;
37
38 status = get_name(&buffer, &length, &args->hostname);
39 if(status) goto out;
40 status = get_name(&buffer, &length, &args->path);
41 if(status) goto out;
42 status = safe_read(&buffer, &length, &args->sec_flavor, sizeof(DWORD));
43 if (status) goto out;
44 status = safe_read(&buffer, &length, &args->rsize, sizeof(DWORD));
45 if (status) goto out;
46 status = safe_read(&buffer, &length, &args->wsize, sizeof(DWORD));
47 if (status) goto out;
48
49 dprintf(1, "parsing NFS14_MOUNT: srv_name=%s root=%s sec_flavor=%s "
50 "rsize=%d wsize=%d\n", args->hostname, args->path,
51 secflavorop2name(args->sec_flavor), args->rsize, args->wsize);
52out:
53 return status;
54}
55
57{
58 int status;
59 mount_upcall_args *args = &upcall->args.mount;
61 multi_addr4 addrs;
65
66 // resolve hostname,port
67 status = nfs41_server_resolve(args->hostname, 2049, &addrs);
68 if (status) {
69 eprintf("nfs41_server_resolve() failed with %d\n", status);
70 goto out;
71 }
72
73 if (upcall->root_ref != INVALID_HANDLE_VALUE) {
74 /* use an existing root from a previous mount, but don't take an
75 * extra reference; we'll only get one UNMOUNT upcall for each root */
76 root = upcall->root_ref;
77 } else {
78 // create root
79 status = nfs41_root_create(args->hostname, args->sec_flavor,
80 args->wsize + WRITE_OVERHEAD, args->rsize + READ_OVERHEAD, &root);
81 if (status) {
82 eprintf("nfs41_root_create() failed %d\n", status);
83 goto out;
84 }
85 root->uid = upcall->uid;
86 root->gid = upcall->gid;
87 }
88
89 // find or create the client/session
90 status = nfs41_root_mount_addrs(root, &addrs, 0, 0, &client);
91 if (status) {
92 eprintf("nfs41_root_mount_addrs() failed with %d\n", status);
93 goto out_err;
94 }
95
96 // make a copy of the path for nfs41_lookup()
100 goto out_err;
101 }
102 path.len = (unsigned short)strlen(path.path);
103
104 // look up the mount path, and fail if it doesn't exist
105 status = nfs41_lookup(root, client->session,
106 &path, NULL, &file, NULL, NULL);
107 if (status) {
108 eprintf("nfs41_lookup('%s') failed with %d\n", path.path, status);
110 goto out_err;
111 }
112
113 nfs41_superblock_fs_attributes(file.fh.superblock, &args->FsAttrs);
114
115 if (upcall->root_ref == INVALID_HANDLE_VALUE)
117 upcall->root_ref = root;
118 args->lease_time = client->session->lease_time;
119out:
120 return status;
121
122out_err:
123 if (upcall->root_ref == INVALID_HANDLE_VALUE)
125 goto out;
126}
127
129{
130 mount_upcall_args *args = &upcall->args.mount;
131 int status;
132 dprintf(2, "NFS41_MOUNT: writing pointer to nfs41_root %p, version %d, "
133 "lease_time %d\n", upcall->root_ref, NFS41D_VERSION, args->lease_time);
134 status = safe_write(&buffer, length, &upcall->root_ref, sizeof(HANDLE));
135 if (status) goto out;
137 if (status) goto out;
138 status = safe_write(&buffer, length, &args->lease_time, sizeof(DWORD));
139 if (status) goto out;
140 status = safe_write(&buffer, length, &args->FsAttrs, sizeof(args->FsAttrs));
141out:
142 return status;
143}
144
146{
147 if (upcall->root_ref != INVALID_HANDLE_VALUE)
148 nfs41_root_deref(upcall->root_ref);
149}
150
156};
157
158
159/* NFS41_UNMOUNT */
161{
162 dprintf(1, "parsing NFS41_UNMOUNT: root=%p\n", upcall->root_ref);
163 return ERROR_SUCCESS;
164}
165
167{
168 /* release the original reference from nfs41_root_create() */
169 nfs41_root_deref(upcall->root_ref);
170 return ERROR_SUCCESS;
171}
172
176};
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
int nfs41_lookup(IN nfs41_root *root, IN nfs41_session *session, IN OUT nfs41_abs_path *path_inout, OUT OPTIONAL nfs41_path_fh *parent_out, OUT OPTIONAL nfs41_path_fh *target_out, OUT OPTIONAL nfs41_file_info *info_out, OUT nfs41_session **session_out)
Definition: lookup.c:424
int safe_write(unsigned char **pos, uint32_t *remaining, void *src, uint32_t src_len)
Definition: util.c:44
int safe_read(unsigned char **pos, uint32_t *remaining, void *dest, uint32_t dest_len)
Definition: util.c:33
int get_name(unsigned char **pos, uint32_t *remaining, const char **out_name)
Definition: util.c:55
struct _root root
const char * secflavorop2name(DWORD sec_flavor)
Definition: daemon_debug.c:558
void eprintf(LPCSTR format,...)
Definition: daemon_debug.c:86
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
UINT32 uint32_t
Definition: types.h:75
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
VOID WINAPI InitializeSRWLock(PSRWLOCK Lock)
Definition: sync.c:75
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint buffer
Definition: glext.h:5915
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
#define FAILED(hr)
Definition: intsafe.h:51
static void cancel_mount(IN nfs41_upcall *upcall)
Definition: mount.c:145
static int handle_mount(nfs41_upcall *upcall)
Definition: mount.c:56
const nfs41_upcall_op nfs41_op_mount
Definition: mount.c:151
static int parse_unmount(unsigned char *buffer, uint32_t length, nfs41_upcall *upcall)
Definition: mount.c:160
static int handle_unmount(nfs41_upcall *upcall)
Definition: mount.c:166
static int marshall_mount(unsigned char *buffer, uint32_t *length, nfs41_upcall *upcall)
Definition: mount.c:128
static int parse_mount(unsigned char *buffer, uint32_t length, nfs41_upcall *upcall)
Definition: mount.c:33
const nfs41_upcall_op nfs41_op_unmount
Definition: mount.c:173
void nfs41_root_ref(IN nfs41_root *root)
Definition: namespace.c:92
int nfs41_root_create(IN const char *name, IN uint32_t sec_flavor, IN uint32_t wsize, IN uint32_t rsize, OUT nfs41_root **root_out)
Definition: namespace.c:37
void nfs41_root_deref(IN nfs41_root *root)
Definition: namespace.c:100
int nfs41_root_mount_addrs(IN nfs41_root *root, IN const multi_addr4 *addrs, IN bool_t is_data, IN OPTIONAL uint32_t lease_time, OUT nfs41_client **client_out)
Definition: namespace.c:335
void nfs41_superblock_fs_attributes(IN const nfs41_superblock *superblock, OUT struct _FILE_FS_ATTRIBUTE_INFORMATION *FsAttrs)
int nfs41_server_resolve(IN const char *hostname, IN unsigned short port, OUT multi_addr4 *addrs)
Definition: nfs41_server.c:275
#define NFS41_MAX_PATH_LEN
Definition: nfs41_const.h:46
#define READ_OVERHEAD
Definition: nfs41_const.h:68
#define WRITE_OVERHEAD
Definition: nfs41_const.h:75
DWORD NFS41D_VERSION
Definition: nfs41_daemon.c:42
nfs41_updowncall_list upcall
Definition: nfs41_driver.c:273
#define dprintf
Definition: regdump.c:33
static FILE * out
Definition: regtests2xml.c:44
static FILE * client
Definition: client.c:41
STRSAFEAPI StringCchCopyA(STRSAFE_LPSTR pszDest, size_t cchDest, STRSAFE_LPCSTR pszSrc)
Definition: strsafe.h:145
Definition: match.c:390
Definition: fci.c:127
Definition: ps.c:97
#define IN
Definition: typedefs.h:39
#define ERROR_BAD_NETPATH
Definition: winerror.h:145
#define ERROR_FILENAME_EXCED_RANGE
Definition: winerror.h:263