return flags and generation number in stat structure
[unix-history] / usr / src / sys / kern / uipc_domain.c
index ea0694c..460a901 100644 (file)
@@ -1,11 +1,29 @@
-/*     uipc_domain.c   5.8     83/02/10        */
+/*
+ * Copyright (c) 1982, 1986 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ *     @(#)uipc_domain.c       7.4 (Berkeley) %G%
+ */
 
 
-#include "../h/param.h"
-#include "../h/socket.h"
-#include "../h/protosw.h"
-#include "../h/domain.h"
-#include "../h/time.h"
-#include "../h/kernel.h"
+#include "param.h"
+#include "socket.h"
+#include "protosw.h"
+#include "domain.h"
+#include "mbuf.h"
+#include "time.h"
+#include "kernel.h"
 
 #define        ADDDOMAIN(x)    { \
        extern struct domain x/**/domain; \
 
 #define        ADDDOMAIN(x)    { \
        extern struct domain x/**/domain; \
@@ -20,11 +38,15 @@ domaininit()
 
 #ifndef lint
        ADDDOMAIN(unix);
 
 #ifndef lint
        ADDDOMAIN(unix);
+       ADDDOMAIN(route);
 #ifdef INET
        ADDDOMAIN(inet);
 #endif
 #ifdef INET
        ADDDOMAIN(inet);
 #endif
-#ifdef PUP
-       ADDDOMAIN(pup);
+#ifdef NS
+       ADDDOMAIN(ns);
+#endif
+#ifdef ISO
+       ADDDOMAIN(iso);
 #endif
 #include "imp.h"
 #if NIMP > 0
 #endif
 #include "imp.h"
 #if NIMP > 0
@@ -32,10 +54,18 @@ domaininit()
 #endif
 #endif
 
 #endif
 #endif
 
-       for (dp = domains; dp; dp = dp->dom_next)
+       for (dp = domains; dp; dp = dp->dom_next) {
+               if (dp->dom_init)
+                       (*dp->dom_init)();
                for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
                        if (pr->pr_init)
                                (*pr->pr_init)();
                for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
                        if (pr->pr_init)
                                (*pr->pr_init)();
+       }
+
+if (max_linkhdr < 16)          /* XXX */
+max_linkhdr = 16;
+       max_hdr = max_linkhdr + max_protohdr;
+       max_datalen = MHLEN - max_hdr;
        pffasttimo();
        pfslowtimo();
 }
        pffasttimo();
        pfslowtimo();
 }
@@ -53,17 +83,18 @@ pffindtype(family, type)
        return (0);
 found:
        for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
        return (0);
 found:
        for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
-               if (pr->pr_type == type)
+               if (pr->pr_type && pr->pr_type == type)
                        return (pr);
        return (0);
 }
 
 struct protosw *
                        return (pr);
        return (0);
 }
 
 struct protosw *
-pffindproto(family, protocol)
-       int family, protocol;
+pffindproto(family, protocol, type)
+       int family, protocol, type;
 {
        register struct domain *dp;
        register struct protosw *pr;
 {
        register struct domain *dp;
        register struct protosw *pr;
+       struct protosw *maybe = 0;
 
        if (family == 0)
                return (0);
 
        if (family == 0)
                return (0);
@@ -72,15 +103,20 @@ pffindproto(family, protocol)
                        goto found;
        return (0);
 found:
                        goto found;
        return (0);
 found:
-       for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
-               if (pr->pr_protocol == protocol)
+       for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
+               if ((pr->pr_protocol == protocol) && (pr->pr_type == type))
                        return (pr);
                        return (pr);
-       return (0);
+
+               if (type == SOCK_RAW && pr->pr_type == SOCK_RAW &&
+                   pr->pr_protocol == 0 && maybe == (struct protosw *)0)
+                       maybe = pr;
+       }
+       return (maybe);
 }
 
 }
 
-pfctlinput(cmd, arg)
+pfctlinput(cmd, sa)
        int cmd;
        int cmd;
-       caddr_t arg;
+       struct sockaddr *sa;
 {
        register struct domain *dp;
        register struct protosw *pr;
 {
        register struct domain *dp;
        register struct protosw *pr;
@@ -88,7 +124,7 @@ pfctlinput(cmd, arg)
        for (dp = domains; dp; dp = dp->dom_next)
                for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
                        if (pr->pr_ctlinput)
        for (dp = domains; dp; dp = dp->dom_next)
                for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
                        if (pr->pr_ctlinput)
-                               (*pr->pr_ctlinput)(cmd, arg);
+                               (*pr->pr_ctlinput)(cmd, sa);
 }
 
 pfslowtimo()
 }
 
 pfslowtimo()