]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/export/export.c
mountd: Replace "struct hostent" with "struct addrinfo"
[nfs-utils.git] / support / export / export.c
index 3e4da699091110645362457b3d2f3e264949233e..919a2442a32f498d6437b435a4e72999d238edb5 100644 (file)
@@ -24,9 +24,11 @@ static int export_hash(char *);
 
 static void    export_init(nfs_export *exp, nfs_client *clp,
                                        struct exportent *nep);
-static int     export_check(nfs_export *, struct hostent *, char *);
+static int     export_check(const nfs_export *exp, const struct addrinfo *ai,
+                               const char *path);
 static nfs_export *
-               export_allowed_internal(struct hostent *hp, char *path);
+               export_allowed_internal(const struct addrinfo *ai,
+                               const char *path);
 
 static void
 export_free(nfs_export *exp)
@@ -117,8 +119,8 @@ export_init(nfs_export *exp, nfs_client *clp, struct exportent *nep)
  * original hostname from /etc/exports, while the in-core client struct
  * gets the newly found FQDN.
  */
-nfs_export *
-export_dup(nfs_export *exp, struct hostent *hp)
+static nfs_export *
+export_dup(nfs_export *exp, const struct addrinfo *ai)
 {
        nfs_export              *new;
        nfs_client              *clp;
@@ -128,7 +130,7 @@ export_dup(nfs_export *exp, struct hostent *hp)
        dupexportent(&new->m_export, &exp->m_export);
        if (exp->m_export.e_hostname)
                new->m_export.e_hostname = xstrdup(exp->m_export.e_hostname);
-       clp = client_dup(exp->m_client, hp);
+       clp = client_dup(exp->m_client, ai);
        if (clp == NULL) {
                export_free(new);
                return NULL;
@@ -176,19 +178,27 @@ export_add(nfs_export *exp)
        }
 }
 
+/**
+ * export_find - find or create a suitable nfs_export for @ai and @path
+ * @ai: pointer to addrinfo for client
+ * @path: '\0'-terminated ASCII string containing export path
+ *
+ * Returns a pointer to nfs_export data matching @ai and @path,
+ * or NULL if an error occurs.
+ */
 nfs_export *
-export_find(struct hostent *hp, char *path)
+export_find(const struct addrinfo *ai, const char *path)
 {
        nfs_export      *exp;
        int             i;
 
        for (i = 0; i < MCL_MAXTYPES; i++) {
                for (exp = exportlist[i].p_head; exp; exp = exp->m_next) {
-                       if (!export_check(exp, hp, path))
+                       if (!export_check(exp, ai, path))
                                continue;
                        if (exp->m_client->m_type == MCL_FQDN)
                                return exp;
-                       return export_dup(exp, hp);
+                       return export_dup(exp, ai);
                }
        }
 
@@ -196,7 +206,7 @@ export_find(struct hostent *hp, char *path)
 }
 
 static nfs_export *
-export_allowed_internal (struct hostent *hp, char *path)
+export_allowed_internal(const struct addrinfo *ai, const char *path)
 {
        nfs_export      *exp;
        int             i;
@@ -204,7 +214,7 @@ export_allowed_internal (struct hostent *hp, char *path)
        for (i = 0; i < MCL_MAXTYPES; i++) {
                for (exp = exportlist[i].p_head; exp; exp = exp->m_next) {
                        if (!exp->m_mayexport ||
-                           !export_check(exp, hp, path))
+                           !export_check(exp, ai, path))
                                continue;
                        return exp;
                }
@@ -213,8 +223,16 @@ export_allowed_internal (struct hostent *hp, char *path)
        return NULL;
 }
 
+/**
+ * export_allowed - determine if this export is allowed
+ * @ai: pointer to addrinfo for client
+ * @path: '\0'-terminated ASCII string containing export path
+ *
+ * Returns a pointer to nfs_export data matching @ai and @path,
+ * or NULL if the export is not allowed.
+ */
 nfs_export *
-export_allowed(struct hostent *hp, char *path)
+export_allowed(const struct addrinfo *ai, const char *path)
 {
        nfs_export              *exp;
        char                    epath[MAXPATHLEN+1];
@@ -227,7 +245,7 @@ export_allowed(struct hostent *hp, char *path)
 
        /* Try the longest matching exported pathname. */
        while (1) {
-               exp = export_allowed_internal (hp, epath);
+               exp = export_allowed_internal(ai, epath);
                if (exp)
                        return exp;
                /* We have to treat the root, "/", specially. */
@@ -268,12 +286,12 @@ export_lookup(char *hname, char *path, int canonical)
 }
 
 static int
-export_check(nfs_export *exp, struct hostent *hp, char *path)
+export_check(const nfs_export *exp, const struct addrinfo *ai, const char *path)
 {
        if (strcmp(path, exp->m_export.e_path))
                return 0;
 
-       return client_check(exp->m_client, hp);
+       return client_check(exp->m_client, ai);
 }
 
 /**