/* NFSv4.1 client for Windows * Copyright © 2012 The Regents of the University of Michigan * * Olga Kornievskaia * Casey Bodley * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * This library is distributed in the hope that it will be useful, but * without any warranty; without even the implied warranty of merchantability * or fitness for a particular purpose. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA */ #ifndef __NFS41_DAEMON_TYPES_H__ #define __NFS41_DAEMON_TYPES_H__ #include "wintirpc.h" #include "rpc/xdr.h" #include "nfs41_const.h" typedef char* caddr_t; static const int64_t NFS4_INT64_MAX = 0x7fffffffffffffff; static const uint64_t NFS4_UINT64_MAX = 0xffffffffffffffff; static const int32_t NFS4_INT32_MAX = 0x7fffffff; static const uint32_t NFS4_UINT32_MAX = 0xffffffff; static const uint64_t NFS4_MAXFILELEN = 0xffffffffffffffff; static const uint64_t NFS4_MAXFILEOFF = 0xfffffffffffffffe; /* common nfs types */ typedef struct __nfs41_abs_path { char path[NFS41_MAX_PATH_LEN]; unsigned short len; SRWLOCK lock; } nfs41_abs_path; typedef struct __nfs41_component { const char *name; unsigned short len; } nfs41_component; typedef struct __nfs41_fh { unsigned char fh[NFS4_FHSIZE]; uint32_t len; uint64_t fileid; struct __nfs41_superblock *superblock; } nfs41_fh; typedef struct __nfs41_path_fh { nfs41_abs_path *path; nfs41_component name; nfs41_fh fh; } nfs41_path_fh; typedef struct __nfs41_fsid { uint64_t major; uint64_t minor; } nfs41_fsid; typedef struct __nfs41_readdir_cookie { uint64_t cookie; unsigned char verf[NFS4_VERIFIER_SIZE]; } nfs41_readdir_cookie; typedef struct __nfs41_write_verf { unsigned char verf[NFS4_VERIFIER_SIZE]; unsigned char expected[NFS4_VERIFIER_SIZE]; #ifdef __REACTOS__ uint32_t committed; #else enum stable_how4 committed; #endif } nfs41_write_verf; typedef struct __netaddr4 { char netid[NFS41_NETWORK_ID_LEN+1]; char uaddr[NFS41_UNIVERSAL_ADDR_LEN+1]; } netaddr4; typedef struct __multi_addr4 { netaddr4 arr[NFS41_ADDRS_PER_SERVER]; uint32_t count; } multi_addr4; typedef struct __bitmap4 { uint32_t count; uint32_t arr[3]; } bitmap4; typedef struct __nfstime4 { int64_t seconds; uint32_t nseconds; } nfstime4; typedef struct __client_owner4 { unsigned char co_verifier[NFS4_VERIFIER_SIZE]; uint32_t co_ownerid_len; unsigned char co_ownerid[NFS4_OPAQUE_LIMIT]; } client_owner4; typedef struct __server_owner4 { uint64_t so_minor_id; uint32_t so_major_id_len; char so_major_id[NFS4_OPAQUE_LIMIT]; } server_owner4; typedef struct __state_owner4 { uint32_t owner_len; unsigned char owner[NFS4_OPAQUE_LIMIT]; } state_owner4; typedef struct __nfs_impl_id4 { uint32_t nii_domain_len; unsigned char *nii_domain; uint32_t nii_name_len; unsigned char *nii_name; nfstime4 nii_date; } nfs_impl_id4; typedef struct __nfsace4 { uint32_t acetype; uint32_t aceflag; uint32_t acemask; char who[NFS4_OPAQUE_LIMIT]; } nfsace4; typedef struct __nfsacl41 { uint32_t flag; nfsace4 *aces; uint32_t count; } nfsacl41; typedef struct __stateid4 { uint32_t seqid; unsigned char other[NFS4_STATEID_OTHER]; } stateid4; typedef struct __open_delegation4 { stateid4 stateid; nfsace4 permissions; #ifdef __REACTOS__ uint32_t type; #else enum open_delegation_type4 type; #endif bool_t recalled; } open_delegation4; typedef struct __fattr4 { bitmap4 attrmask; uint32_t attr_vals_len; unsigned char attr_vals[NFS4_OPAQUE_LIMIT]; } fattr4; typedef struct __change_info4 { bool_t atomic; uint64_t before; uint64_t after; } change_info4; typedef struct __fs_location_server { /* 'address' represents one of a traditional DNS host name, * IPv4 address, IPv6 address, or a zero-length string */ char address[NFS41_HOSTNAME_LEN+1]; } fs_location_server; typedef struct __fs_location4 { nfs41_abs_path path; /* path to fs from referred server's root */ fs_location_server *servers; uint32_t server_count; } fs_location4; typedef struct __fs_locations4 { nfs41_abs_path path; /* path to fs from referring server's root */ fs_location4 *locations; uint32_t location_count; } fs_locations4; enum { MDSTHRESH_READ = 0, MDSTHRESH_WRITE, MDSTHRESH_READ_IO, MDSTHRESH_WRITE_IO, MAX_MDSTHRESH_HINTS }; typedef struct __threshold_item4 { uint32_t type; uint64_t hints[MAX_MDSTHRESH_HINTS]; } threshold_item4; #define MAX_MDSTHRESHOLD_ITEMS 1 typedef struct __mdsthreshold4 { uint32_t count; threshold_item4 items[MAX_MDSTHRESHOLD_ITEMS]; } mdsthreshold4; typedef struct __nfs41_file_info { nfs41_fsid fsid; mdsthreshold4 mdsthreshold; nfstime4 time_access; nfstime4 time_create; nfstime4 time_modify; nfsacl41 *acl; nfstime4 *time_delta; /* XXX: per-fs */ bitmap4 attrmask; bitmap4 *supported_attrs; /* XXX: per-fs */ bitmap4 *suppattr_exclcreat; /* XXX: per-fs */ uint64_t maxread; /* XXX: per-fs */ uint64_t maxwrite; /* XXX: per-fs */ uint64_t change; uint64_t size; uint64_t fileid; uint64_t space_avail; /* XXX: per-fs */ uint64_t space_free; /* XXX: per-fs */ uint64_t space_total; /* XXX: per-fs */ uint32_t type; uint32_t numlinks; uint32_t rdattr_error; uint32_t mode; uint32_t mode_mask; fs_locations4 *fs_locations; /* XXX: per-fs */ uint32_t lease_time; /* XXX: per-server */ uint32_t fs_layout_types; /* pnfs, XXX: per-fs */ bool_t hidden; bool_t system; bool_t archive; bool_t cansettime; /* XXX: per-fs */ bool_t case_insensitive; bool_t case_preserving; bool_t symlink_dir; bool_t symlink_support; bool_t link_support; char *owner; char *owner_group; uint32_t aclsupport; } nfs41_file_info; #endif /* !__NFS41_DAEMON_TYPES_H__ */