summaryrefslogtreecommitdiffstats
path: root/support/include/junction.h
blob: 7257d80b8d585df26df1269eaabc8fa04ef79845 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*
 * @file support/include/junction.h
 * @brief Declarations for libjunction.a
 */

/*
 * Copyright 2010, 2018 Oracle.  All rights reserved.
 *
 * This file is part of nfs-utils.
 *
 * nfs-utils is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2.0 as
 * published by the Free Software Foundation.
 *
 * nfs-utils 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 General Public License version 2.0 for more details.
 *
 * You should have received a copy of the GNU General Public License
 * version 2.0 along with nfs-utils.  If not, see:
 *
 *	http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
 */

#ifndef _NFS_JUNCTION_H_
#define _NFS_JUNCTION_H_

#include <stdint.h>

/*
 * The libjunction APIs use the status codes from the FedFS ADMIN
 * protocol, which includes non-errno codes like FEDFS_ERR_NOTJUNCT.
 */
enum FedFsStatus {
	FEDFS_OK = 0,
	FEDFS_ERR_ACCESS = 1,
	FEDFS_ERR_BADCHAR = 2,
	FEDFS_ERR_BADNAME = 3,
	FEDFS_ERR_NAMETOOLONG = 4,
	FEDFS_ERR_LOOP = 5,
	FEDFS_ERR_BADXDR = 6,
	FEDFS_ERR_EXIST = 7,
	FEDFS_ERR_INVAL = 8,
	FEDFS_ERR_IO = 9,
	FEDFS_ERR_NOSPC = 10,
	FEDFS_ERR_NOTJUNCT = 11,
	FEDFS_ERR_NOTLOCAL = 12,
	FEDFS_ERR_PERM = 13,
	FEDFS_ERR_ROFS = 14,
	FEDFS_ERR_SVRFAULT = 15,
	FEDFS_ERR_NOTSUPP = 16,
	FEDFS_ERR_NSDB_ROUTE = 17,
	FEDFS_ERR_NSDB_DOWN = 18,
	FEDFS_ERR_NSDB_CONN = 19,
	FEDFS_ERR_NSDB_AUTH = 20,
	FEDFS_ERR_NSDB_LDAP = 21,
	FEDFS_ERR_NSDB_LDAP_VAL = 22,
	FEDFS_ERR_NSDB_NONCE = 23,
	FEDFS_ERR_NSDB_NOFSN = 24,
	FEDFS_ERR_NSDB_NOFSL = 25,
	FEDFS_ERR_NSDB_RESPONSE = 26,
	FEDFS_ERR_NSDB_FAULT = 27,
	FEDFS_ERR_NSDB_PARAMS = 28,
	FEDFS_ERR_NSDB_LDAP_REFERRAL = 29,
	FEDFS_ERR_NSDB_LDAP_REFERRAL_VAL = 30,
	FEDFS_ERR_NSDB_LDAP_REFERRAL_NOTFOLLOWED = 31,
	FEDFS_ERR_NSDB_PARAMS_LDAP_REFERRAL = 32,
	FEDFS_ERR_PATH_TYPE_UNSUPP = 33,
	FEDFS_ERR_DELAY = 34,
	FEDFS_ERR_NO_CACHE = 35,
	FEDFS_ERR_UNKNOWN_CACHE = 36,
	FEDFS_ERR_NO_CACHE_UPDATE = 37,
};
typedef enum FedFsStatus FedFsStatus;

/**
 * Contains NFS fileset location information
 *
 * Each of these represents one server:/rootpath pair.  The NFS
 * implementation can coalesce multiple pairs into a single
 * fs_location4 result if jfl_rootpath is the same across
 * multiple servers.
 *
 * The nfl_server field can contain either one presentation format
 * IP address or one DNS hostname.
 *
 * See Section 11.9 and 11.10 of RFC 5661 or section 4.2.2.3 and
 * 4.2.2.4 of the NSDB protocol draft for details.
 */

struct nfs_fsloc {
	struct nfs_fsloc	 *nfl_next;

	char			 *nfl_hostname;
	uint16_t		  nfl_hostport;
	char			**nfl_rootpath;

	struct {
		_Bool		  nfl_varsub;
	} nfl_flags;
	int32_t			  nfl_currency;
	int32_t			  nfl_validfor;

	struct {
		_Bool		  nfl_writable, nfl_going, nfl_split;
	} nfl_genflags;
	struct {
		_Bool		  nfl_rdma;
	} nfl_transflags;
	struct {
		uint8_t		  nfl_simul, nfl_handle, nfl_fileid;
		uint8_t		  nfl_writever, nfl_change, nfl_readdir;
		uint8_t		  nfl_readrank, nfl_writerank;
		uint8_t		  nfl_readorder, nfl_writeorder;
	} nfl_info;
};


/**
 ** NFS location data management functions
 **/

void		  nfs_free_location(struct nfs_fsloc *location);
void		  nfs_free_locations(struct nfs_fsloc *locations);
struct nfs_fsloc *nfs_new_location(void);

__attribute_malloc__
char		**nfs_dup_string_array(char **array);
void		  nfs_free_string_array(char **array);


/**
 ** NFS junction management functions
 **/

FedFsStatus	 nfs_delete_junction(const char *pathname);
FedFsStatus	 nfs_add_junction(const char *pathname,
				struct nfs_fsloc *locations);
FedFsStatus	 nfs_get_locations(const char *pathname,
				struct nfs_fsloc **locations);
FedFsStatus	 nfs_is_prejunction(const char *pathname);
FedFsStatus	 nfs_is_junction(const char *pathname);


/**
 ** Flush kernel NFS server's export cache
 **/
FedFsStatus	 junction_flush_exports_cache(void);

/**
 ** Pathname conversion helpers
 **/
void		 nsdb_free_string_array(char **strings);
FedFsStatus	 nsdb_path_array_to_posix(char * const *path_array,
				char **pathname);
FedFsStatus	 nsdb_posix_to_path_array(const char *pathname,
				char ***path_array);

/**
 ** Readability helpers
 **/

const char      *nsdb_display_fedfsstatus(const FedFsStatus status);
void             nsdb_print_fedfsstatus(const FedFsStatus status);

#endif	/* !_NFS_JUNCTION_H_ */