]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/export/client.c
Imported Debian patch 1.0.8-6
[nfs-utils.git] / support / export / client.c
index 3db21ae2840419bdfc50bdaa816db55cd4615adc..c09e7620eacb12e782f3e635cb09baa8e48b6c68 100644 (file)
@@ -6,7 +6,9 @@
  * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
  */
 
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
 
 #include <sys/types.h>
 #include <netinet/in.h>
@@ -138,7 +140,9 @@ client_init(nfs_client *clp, const char *hname, struct hostent *hp)
 
        if (clp->m_type == MCL_SUBNETWORK) {
                char    *cp = strchr(clp->m_hostname, '/');
+               static char slash32[] = "/32";
 
+               if(!cp) cp = slash32;
                *cp = '\0';
                clp->m_addrlist[0].s_addr = inet_addr(clp->m_hostname);
                if (strchr(cp + 1, '.')) {
@@ -260,11 +264,11 @@ client_compose(struct in_addr addr)
        return name;
 }
 
-int 
+int
 client_member(char *client, char *name)
 {
        /* check if "client" (a ',' separated list of names)
-        * contains 'name' as a member 
+        * contains 'name' as a member
         */
        int l = strlen(name);
        while (*client) {
@@ -280,7 +284,7 @@ client_member(char *client, char *name)
 }
 
 
-int 
+int
 name_cmp(char *a, char *b)
 {
        /* compare strings a and b, but only upto ',' in a */
@@ -392,6 +396,8 @@ client_check(nfs_client *clp, struct hostent *hp)
 #endif
        case MCL_ANONYMOUS:
                return 1;
+       case MCL_GSS:
+               return 0;
        default:
                xlog(L_FATAL, "internal: bad client type %d", clp->m_type);
        }
@@ -425,6 +431,8 @@ client_gettype(char *ident)
 
        if (ident[0] == '\0' || strcmp(ident, "*")==0)
                return MCL_ANONYMOUS;
+       if (strncmp(ident, "gss/", 4) == 0)
+               return MCL_GSS;
        if (ident[0] == '@') {
 #ifndef HAVE_INNETGR
                xlog(L_WARNING, "netgroup support not compiled in");
@@ -439,5 +447,12 @@ client_gettype(char *ident)
                if (*sp == '\\' && sp[1])
                        sp++;
        }
-       return MCL_FQDN;
+       /* check for N.N.N.N */
+       sp = ident;
+       if(!isdigit(*sp) || strtoul(sp, &sp, 10) > 255 || *sp != '.') return MCL_FQDN;
+       sp++; if(!isdigit(*sp) || strtoul(sp, &sp, 10) > 255 || *sp != '.') return MCL_FQDN;
+       sp++; if(!isdigit(*sp) || strtoul(sp, &sp, 10) > 255 || *sp != '.') return MCL_FQDN;
+       sp++; if(!isdigit(*sp) || strtoul(sp, &sp, 10) > 255 || *sp != '\0') return MCL_FQDN;
+       /* we lie here a bit. but technically N.N.N.N == N.N.N.N/32 :) */
+       return MCL_SUBNETWORK;
 }