]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/include/exportfs.h
mountd: Replace "struct hostent" with "struct addrinfo"
[nfs-utils.git] / support / include / exportfs.h
index deb837c87c5b4bf9c7b7d23c5f7f6417c22bb4b7..0da85666c6dab49cb09ca442575db5b87c447f33 100644 (file)
@@ -10,6 +10,8 @@
 #define EXPORTFS_H
 
 #include <netdb.h>
+
+#include "sockaddr.h"
 #include "nfslib.h"
 
 enum {
@@ -19,19 +21,72 @@ enum {
        MCL_WILDCARD,
        MCL_NETGROUP,
        MCL_ANONYMOUS,
+       MCL_GSS,
        MCL_MAXTYPES
 };
 
+enum {
+       FSLOC_NONE = 0,
+       FSLOC_REFER,
+       FSLOC_REPLICA,
+       FSLOC_STUB
+};
+
 typedef struct mclient {
        struct mclient *        m_next;
-       char                    m_hostname[NFSCLNT_IDMAX+1];
+       char *                  m_hostname;
        int                     m_type;
        int                     m_naddr;
-       struct in_addr          m_addrlist[NFSCLNT_ADDRMAX];
+       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;
@@ -39,30 +94,49 @@ typedef struct mexport {
        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_changed  : 1, /* options (may) have changed */
+                               m_warned   : 1; /* warned about multiple exports
+                                                * matching one client */
 } nfs_export;
 
+#define HASH_TABLE_SIZE 1021
+
+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];
-extern nfs_export *            exportlist[MCL_MAXTYPES];
 
 nfs_client *                   client_lookup(char *hname, int canonical);
-nfs_client *                   client_find(struct hostent *);
-void                           client_add(nfs_client *);
-nfs_client *                   client_dup(nfs_client *, struct hostent *);
+nfs_client *                   client_dup(const nfs_client *clp,
+                                               const struct addrinfo *ai);
 int                            client_gettype(char *hname);
-int                            client_check(nfs_client *, struct hostent *);
-int                            client_match(nfs_client *, 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);
 
 int                            export_read(char *fname);
-void                           export_add(nfs_export *);
+void                   export_add(nfs_export *);
 void                           export_reset(nfs_export *);
 nfs_export *                   export_lookup(char *hname, char *path, int caconical);
-nfs_export *                   export_find(struct hostent *, char *path);
-struct exportent *             export_allowed(struct hostent *, char *path);
+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);
-nfs_export *                   export_dup(nfs_export *, struct hostent *);
 void                           export_freeall(void);
 int                            export_export(nfs_export *);
 int                            export_unexport(nfs_export *);
@@ -73,8 +147,33 @@ 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);
+
+/* Record export error.  */
+extern int export_errno;
+
 #endif /* EXPORTFS_H */