blob: 97b2327b7081c8ecb7cf9c29e59c44f99a7d512f [file] [log] [blame]
/*
* 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 */