1/*
2 * include/linux/nfsd/syscall.h
3 *
4 * This file holds all declarations for the knfsd syscall interface.
5 *
6 * Copyright (C) 1995-1997 Olaf Kirch <okir@monad.swb.de>
7 */
8
9#ifndef NFSD_SYSCALL_H
10#define NFSD_SYSCALL_H
11
12#include <asm/types.h>
13#ifdef __KERNEL__
14# include <linux/config.h>
15# include <linux/types.h>
16# include <linux/in.h>
17#endif
18#include <linux/posix_types.h>
19#include <linux/nfsd/const.h>
20#include <linux/nfsd/export.h>
21#include <linux/nfsd/nfsfh.h>
22#include <linux/nfsd/auth.h>
23
24/*
25 * Version of the syscall interface
26 */
27#define NFSCTL_VERSION		0x0201
28
29/*
30 * These are the commands understood by nfsctl().
31 */
32#define NFSCTL_SVC		0	/* This is a server process. */
33#define NFSCTL_ADDCLIENT	1	/* Add an NFS client. */
34#define NFSCTL_DELCLIENT	2	/* Remove an NFS client. */
35#define NFSCTL_EXPORT		3	/* export a file system. */
36#define NFSCTL_UNEXPORT		4	/* unexport a file system. */
37#define NFSCTL_UGIDUPDATE	5	/* update a client's uid/gid map. */
38#define NFSCTL_GETFH		6	/* get an fh by ino (used by mountd) */
39#define NFSCTL_GETFD		7	/* get an fh by path (used by mountd) */
40#define	NFSCTL_GETFS		8	/* get an fh by path with max FH len */
41
42/* SVC */
43struct nfsctl_svc {
44	unsigned short		svc_port;
45	int			svc_nthreads;
46};
47
48/* ADDCLIENT/DELCLIENT */
49struct nfsctl_client {
50	char			cl_ident[NFSCLNT_IDMAX+1];
51	int			cl_naddr;
52	struct in_addr		cl_addrlist[NFSCLNT_ADDRMAX];
53	int			cl_fhkeytype;
54	int			cl_fhkeylen;
55	unsigned char		cl_fhkey[NFSCLNT_KEYMAX];
56};
57
58/* EXPORT/UNEXPORT */
59struct nfsctl_export {
60	char			ex_client[NFSCLNT_IDMAX+1];
61	char			ex_path[NFS_MAXPATHLEN+1];
62	__kernel_dev_t		ex_dev;
63	__kernel_ino_t		ex_ino;
64	int			ex_flags;
65	__kernel_uid_t		ex_anon_uid;
66	__kernel_gid_t		ex_anon_gid;
67};
68
69/* UGIDUPDATE */
70struct nfsctl_uidmap {
71	char *			ug_ident;
72	__kernel_uid_t		ug_uidbase;
73	int			ug_uidlen;
74	__kernel_uid_t *	ug_udimap;
75	__kernel_gid_t		ug_gidbase;
76	int			ug_gidlen;
77	__kernel_gid_t *	ug_gdimap;
78};
79
80/* GETFH */
81struct nfsctl_fhparm {
82	struct sockaddr		gf_addr;
83	__kernel_dev_t		gf_dev;
84	__kernel_ino_t		gf_ino;
85	int			gf_version;
86};
87
88/* GETFD */
89struct nfsctl_fdparm {
90	struct sockaddr		gd_addr;
91	char			gd_path[NFS_MAXPATHLEN+1];
92	int			gd_version;
93};
94
95/* GETFS - GET Filehandle with Size */
96struct nfsctl_fsparm {
97	struct sockaddr		gd_addr;
98	char			gd_path[NFS_MAXPATHLEN+1];
99	int			gd_maxlen;
100};
101
102/*
103 * This is the argument union.
104 */
105struct nfsctl_arg {
106	int			ca_version;	/* safeguard */
107	union {
108		struct nfsctl_svc	u_svc;
109		struct nfsctl_client	u_client;
110		struct nfsctl_export	u_export;
111		struct nfsctl_uidmap	u_umap;
112		struct nfsctl_fhparm	u_getfh;
113		struct nfsctl_fdparm	u_getfd;
114		struct nfsctl_fsparm	u_getfs;
115	} u;
116#define ca_svc		u.u_svc
117#define ca_client	u.u_client
118#define ca_export	u.u_export
119#define ca_umap		u.u_umap
120#define ca_getfh	u.u_getfh
121#define ca_getfd	u.u_getfd
122#define	ca_getfs	u.u_getfs
123#define ca_authd	u.u_authd
124};
125
126union nfsctl_res {
127	__u8			cr_getfh[NFS_FHSIZE];
128	struct knfsd_fh		cr_getfs;
129};
130
131#ifdef __KERNEL__
132/*
133 * Kernel syscall implementation.
134 */
135#if defined(CONFIG_NFSD) || defined(CONFIG_NFSD_MODULE)
136extern asmlinkage long	sys_nfsservctl(int, void *, void *);
137#else
138#define sys_nfsservctl		sys_ni_syscall
139#endif
140extern int		exp_addclient(struct nfsctl_client *ncp);
141extern int		exp_delclient(struct nfsctl_client *ncp);
142extern int		exp_export(struct nfsctl_export *nxp);
143extern int		exp_unexport(struct nfsctl_export *nxp);
144
145#endif /* __KERNEL__ */
146
147#endif /* NFSD_SYSCALL_H */
148