/*
 * support/include/exportfs.h
 *
 * Declarations for exportfs and mountd
 *
 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
 */

#ifndef EXPORTFS_H
#define EXPORTFS_H

#include <netdb.h>

#include "sockaddr.h"
#include "nfslib.h"

enum {
	MCL_FQDN = 0,
	MCL_SUBNETWORK,
	MCL_IPADDR = MCL_SUBNETWORK,
	MCL_WILDCARD,
	MCL_NETGROUP,
	MCL_ANONYMOUS,
	MCL_GSS,
	MCL_MAXTYPES
};

enum {
	FSLOC_NONE = 0,
	FSLOC_REFER,
	FSLOC_REPLICA,
	FSLOC_STUB
};

#ifndef EXP_LOCKFILE
#define EXP_LOCKFILE "/var/lib/nfs/export-lock"
#endif

typedef struct mclient {
	struct mclient *	m_next;
	char *			m_hostname;
	int			m_type;
	int			m_naddr;
	union nfs_sockaddr	m_addrlist[NFSCLNT_ADDRMAX];
	int			m_exported;	/* exported to nfsd */
	int			m_count;
} nfs_client;

static inline const struct sockaddr *
get_addrlist(const nfs_client *clp, const int i)
{
	return &clp->m_addrlist[i].sa;
}

static inline const struct sockaddr_in *
get_addrlist_in(const nfs_client *clp, const int i)
{
	return &clp->m_addrlist[i].s4;
}

static inline const struct sockaddr_in6 *
get_addrlist_in6(const nfs_client *clp, const int i)
{
	return &clp->m_addrlist[i].s6;
}

static inline void
set_addrlist_in(nfs_client *clp, const int i, const struct sockaddr_in *sin)
{
	memcpy(&clp->m_addrlist[i].s4, sin, sizeof(*sin));
}

static inline void
set_addrlist_in6(nfs_client *clp, const int i, const struct sockaddr_in6 *sin6)
{
	memcpy(&clp->m_addrlist[i].s6, sin6, sizeof(*sin6));
}

static inline void
set_addrlist(nfs_client *clp, const int i, const struct sockaddr *sap)
{
	switch (sap->sa_family) {
	case AF_INET:
		memcpy(&clp->m_addrlist[i].s4, sap, sizeof(struct sockaddr_in));
		break;
#ifdef IPV6_SUPPORTED
	case AF_INET6:
		memcpy(&clp->m_addrlist[i].s6, sap, sizeof(struct sockaddr_in6));
		break;
#endif
	}
}

typedef struct mexport {
	struct mexport *	m_next;
	struct mclient *	m_client;
	struct exportent	m_export;
	int			m_exported;	/* known to knfsd. -1 means not sure */
	int			m_xtabent  : 1,	/* xtab entry exists */
				m_mayexport: 1,	/* derived from xtabbed */
				m_changed  : 1, /* options (may) have changed */
				m_warned   : 1; /* warned about multiple exports
						 * matching one client */
} nfs_export;

#define HASH_TABLE_SIZE 1021
#define DEFAULT_TTL	(30 * 60)

typedef struct _exp_hash_entry {
	nfs_export * p_first;
  	nfs_export * p_last;
} exp_hash_entry;

typedef struct _exp_hash_table {
	nfs_export * p_head;
	exp_hash_entry entries[HASH_TABLE_SIZE];
} exp_hash_table;

extern exp_hash_table exportlist[MCL_MAXTYPES];

extern nfs_client *		clientlist[MCL_MAXTYPES];

nfs_client *			client_lookup(char *hname, int canonical);
nfs_client *			client_dup(const nfs_client *clp,
						const struct addrinfo *ai);
int				client_gettype(char *hname);
int				client_check(const nfs_client *clp,
						const struct addrinfo *ai);
void				client_release(nfs_client *);
void				client_freeall(void);
char *				client_compose(const struct addrinfo *ai);
struct addrinfo *		client_resolve(const struct sockaddr *sap);
int 				client_member(const char *client,
						const char *name);

void				export_read(char *fname);
void				export_reset(nfs_export *);
nfs_export *			export_lookup(char *hname, char *path, int caconical);
nfs_export *			export_find(const struct addrinfo *ai,
						const char *path);
nfs_export *			export_allowed(const struct addrinfo *ai,
						const char *path);
nfs_export *			export_create(struct exportent *, int canonical);
void				exportent_release(struct exportent *);
void				export_freeall(void);
int				export_export(nfs_export *);
int				export_unexport(nfs_export *);

int				xtab_mount_read(void);
int				xtab_export_read(void);
int				xtab_mount_write(void);
int				xtab_export_write(void);
void				xtab_append(nfs_export *);

int				secinfo_addflavor(struct flav_info *, struct exportent *);

char *				host_ntop(const struct sockaddr *sap,
						char *buf, const size_t buflen);
__attribute_malloc__
struct addrinfo *		host_pton(const char *paddr);
__attribute_malloc__
struct addrinfo *		host_addrinfo(const char *hostname);
__attribute_malloc__
char *				host_canonname(const struct sockaddr *sap);
__attribute_malloc__
struct addrinfo *		host_reliable_addrinfo(const struct sockaddr *sap);
__attribute_malloc__
struct addrinfo *		host_numeric_addrinfo(const struct sockaddr *sap);

int				rmtab_read(void);

struct nfskey *			key_lookup(char *hname);

struct export_features {
	unsigned int flags;
	unsigned int secinfo_flags;
};

struct export_features *get_export_features(void);
void fix_pseudoflavor_flags(struct exportent *ep);

#endif /* EXPORTFS_H */
