X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=support%2Fexport%2Fclient.c;h=419a4a7d930f6999e8a0f26dc397fce2b3d5f899;hp=5e937b0adac158b6e781182b409882d141526b7b;hb=3455138100064d0213b124c72453accde2276be5;hpb=5f722d8855ebcb2d041e182c8c69c8cbee4bf408 diff --git a/support/export/client.c b/support/export/client.c index 5e937b0..419a4a7 100644 --- a/support/export/client.c +++ b/support/export/client.c @@ -32,7 +32,6 @@ extern int innetgr(char *netgr, char *host, char *, char *); static char *add_name(char *old, const char *add); static void client_init(nfs_client *clp, const char *hname, struct hostent *hp); -static int client_checkaddr(nfs_client *clp, struct in_addr addr); nfs_client *clientlist[MCL_MAXTYPES] = { NULL, }; @@ -328,6 +327,49 @@ add_name(char *old, const char *add) return new; } +/* + * Check each address listed in @hp against each address + * stored in @clp. Return 1 if a match is found, otherwise + * zero. + */ +static int +check_fqdn(const nfs_client *clp, const struct hostent *hp) +{ + struct in_addr addr; + char **ap; + int i; + + for (ap = hp->h_addr_list; *ap; ap++) { + addr = *(struct in_addr *)*ap; + + for (i = 0; i < clp->m_naddr; i++) + if (clp->m_addrlist[i].s_addr == addr.s_addr) + return 1; + } + return 0; +} + +/* + * Check each address listed in @hp against the subnetwork or + * host address stored in @clp. Return 1 if an address in @hp + * matches the host address stored in @clp, otherwise zero. + */ +static int +check_subnetwork(const nfs_client *clp, const struct hostent *hp) +{ + struct in_addr addr; + char **ap; + + for (ap = hp->h_addr_list; *ap; ap++) { + addr = *(struct in_addr *)*ap; + + if (!((clp->m_addrlist[0].s_addr ^ addr.s_addr) & + clp->m_addrlist[1].s_addr)) + return 1; + } + return 0; +} + /* * Match a host (given its hostent record) to a client record. This * is usually called from mountd. @@ -341,12 +383,9 @@ client_check(nfs_client *clp, struct hostent *hp) switch (clp->m_type) { case MCL_FQDN: + return check_fqdn(clp, hp); case MCL_SUBNETWORK: - for (ap = hp->h_addr_list; *ap; ap++) { - if (client_checkaddr(clp, *(struct in_addr *) *ap)) - return 1; - } - return 0; + return check_subnetwork(clp, hp); case MCL_WILDCARD: if (wildmat(hname, cname)) return 1; @@ -408,25 +447,6 @@ client_check(nfs_client *clp, struct hostent *hp) return 0; } -static int -client_checkaddr(nfs_client *clp, struct in_addr addr) -{ - int i; - - switch (clp->m_type) { - case MCL_FQDN: - for (i = 0; i < clp->m_naddr; i++) { - if (clp->m_addrlist[i].s_addr == addr.s_addr) - return 1; - } - return 0; - case MCL_SUBNETWORK: - return !((clp->m_addrlist[0].s_addr ^ addr.s_addr) - & clp->m_addrlist[1].s_addr); - } - return 0; -} - int client_gettype(char *ident) {