+static nfs_export *lookup_export(char *dom, char *path, struct hostent *he)
+{
+ nfs_export *exp;
+ nfs_export *found = NULL;
+ int found_type = 0;
+ int i;
+
+ found = lookup_export(dom, path, he);
+ /* now find flags for this export point in this domain */
+ for (i=0 ; i < MCL_MAXTYPES; i++) {
+ for (exp = exportlist[i].p_head; exp; exp = exp->m_next) {
+ if (!use_ipaddr && !client_member(dom, exp->m_client->m_hostname))
+ continue;
+ if (exp->m_export.e_flags & NFSEXP_CROSSMOUNT) {
+ /* if path is a mountpoint below e_path, then OK */
+ int l = strlen(exp->m_export.e_path);
+ if (strcmp(path, exp->m_export.e_path) == 0 ||
+ (strncmp(path, exp->m_export.e_path, l) == 0 &&
+ path[l] == '/' &&
+ is_mountpoint(path)))
+ /* ok */;
+ else
+ continue;
+ } else if (strcmp(path, exp->m_export.e_path) != 0)
+ continue;
+ if (use_ipaddr) {
+ if (!client_check(exp->m_client, he))
+ continue;
+ }
+ if (!found) {
+ found = exp;
+ found_type = i;
+ continue;
+ }
+ /* If one is a CROSSMOUNT, then prefer the longest path */
+ if (((found->m_export.e_flags & NFSEXP_CROSSMOUNT) ||
+ (exp->m_export.e_flags & NFSEXP_CROSSMOUNT)) &&
+ strlen(found->m_export.e_path) !=
+ strlen(exp->m_export.e_path)) {
+
+ if (strlen(exp->m_export.e_path) >
+ strlen(found->m_export.e_path)) {
+ found = exp;
+ found_type = i;
+ }
+ continue;
+
+ } else if (found_type == i && found->m_warned == 0) {
+ xlog(L_WARNING, "%s exported to both %s and %s, "
+ "arbitrarily choosing options from first",
+ path, found->m_client->m_hostname, exp->m_client->m_hostname,
+ dom);
+ found->m_warned = 1;
+ }
+ }
+ }
+ return found;
+}
+