new copyright notice
[unix-history] / usr / src / sys / netinet / in.c
index 648a9d9..2fa1b8a 100644 (file)
@@ -2,19 +2,9 @@
  * Copyright (c) 1982, 1986 Regents of the University of California.
  * All rights reserved.
  *
  * 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.
+ * %sccs.include.redist.c%
  *
  *
- *     @(#)in.c        7.11 (Berkeley) %G%
+ *     @(#)in.c        7.15 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -23,8 +13,6 @@
 #include "protosw.h"
 #include "socket.h"
 #include "socketvar.h"
 #include "protosw.h"
 #include "socket.h"
 #include "socketvar.h"
-#include "uio.h"
-#include "dir.h"
 #include "user.h"
 #include "in_systm.h"
 #include "../net/if.h"
 #include "user.h"
 #include "in_systm.h"
 #include "../net/if.h"
@@ -124,8 +112,8 @@ in_sockmaskof(in, sockmask)
                        mask =  ia->ia_subnetmask;
     }
     {
                        mask =  ia->ia_subnetmask;
     }
     {
-       register char *cp = (char *)&(sockmask->sin_port);
        register char *cpbase = (char *)&(sockmask->sin_addr);
        register char *cpbase = (char *)&(sockmask->sin_addr);
+       register char *cp = (char *)(1 + &(sockmask->sin_addr));
 
        sockmask->sin_addr.s_addr = htonl(mask);
        sockmask->sin_len = 0;
 
        sockmask->sin_addr.s_addr = htonl(mask);
        sockmask->sin_len = 0;
@@ -311,10 +299,17 @@ in_control(so, cmd, data, ifp)
                        return (error);
                /* FALLTHROUGH */
 
                        return (error);
                /* FALLTHROUGH */
 
-       default:
+       case SIOCGIFADDR:
+       case SIOCGIFNETMASK:
+       case SIOCGIFDSTADDR:
+       case SIOCGIFBRDADDR:
                if (ia == (struct in_ifaddr *)0)
                        return (EADDRNOTAVAIL);
                break;
                if (ia == (struct in_ifaddr *)0)
                        return (EADDRNOTAVAIL);
                break;
+
+       default:
+               return (EOPNOTSUPP);
+               break;
        }
        switch (cmd) {
 
        }
        switch (cmd) {
 
@@ -372,7 +367,9 @@ in_control(so, cmd, data, ifp)
                break;
 
        case SIOCAIFADDR:
                break;
 
        case SIOCAIFADDR:
-               maskIsNew = 0; hostIsNew = 1; error = u.u_error;
+               maskIsNew = 0;
+               hostIsNew = 1;
+               error = 0;
                if (ia->ia_addr.sin_family == AF_INET) {
                        if (ifra->ifra_addr.sin_len == 0) {
                                ifra->ifra_addr = ia->ia_addr;
                if (ia->ia_addr.sin_family == AF_INET) {
                        if (ifra->ifra_addr.sin_len == 0) {
                                ifra->ifra_addr = ia->ia_addr;
@@ -385,7 +382,7 @@ in_control(so, cmd, data, ifp)
                        in_ifscrub(ifp, ia);
                        ia->ia_sockmask = ifra->ifra_mask;
                        ia->ia_subnetmask =
                        in_ifscrub(ifp, ia);
                        ia->ia_sockmask = ifra->ifra_mask;
                        ia->ia_subnetmask =
-                                       ntohl(ia->ia_sockmask.sin_addr.s_addr);
+                            ntohl(ia->ia_sockmask.sin_addr.s_addr);
                        maskIsNew = 1;
                }
                if ((ifp->if_flags & IFF_POINTOPOINT) &&
                        maskIsNew = 1;
                }
                if ((ifp->if_flags & IFF_POINTOPOINT) &&
@@ -395,7 +392,7 @@ in_control(so, cmd, data, ifp)
                        maskIsNew  = 1; /* We lie; but the effect's the same */
                }
                if (ifra->ifra_addr.sin_family == AF_INET &&
                        maskIsNew  = 1; /* We lie; but the effect's the same */
                }
                if (ifra->ifra_addr.sin_family == AF_INET &&
-                                           (hostIsNew || maskIsNew))
+                   (hostIsNew || maskIsNew))
                        error = in_ifinit(ifp, ia, &ifra->ifra_addr, 0);
                if ((ifp->if_flags & IFF_BROADCAST) &&
                    (ifra->ifra_broadaddr.sin_family == AF_INET))
                        error = in_ifinit(ifp, ia, &ifra->ifra_addr, 0);
                if ((ifp->if_flags & IFF_BROADCAST) &&
                    (ifra->ifra_broadaddr.sin_family == AF_INET))
@@ -411,19 +408,18 @@ in_control(so, cmd, data, ifp)
                               (ifa->ifa_next != (struct ifaddr *)ia))
                                    ifa = ifa->ifa_next;
                        if (ifa->ifa_next)
                               (ifa->ifa_next != (struct ifaddr *)ia))
                                    ifa = ifa->ifa_next;
                        if (ifa->ifa_next)
-                           ifa->ifa_next = ((struct ifaddr *)ia)->ifa_next;
+                               ifa->ifa_next = ((struct ifaddr *)ia)->ifa_next;
                        else
                                printf("Couldn't unlink inifaddr from ifp\n");
                }
                oia = ia;
                        else
                                printf("Couldn't unlink inifaddr from ifp\n");
                }
                oia = ia;
-               if (oia == (ia = in_ifaddr)) {
+               if (oia == (ia = in_ifaddr))
                        in_ifaddr = ia->ia_next;
                        in_ifaddr = ia->ia_next;
-               else {
-                       while (ia->ia_next && (ia->ia_next != oia)) {
+               else {
+                       while (ia->ia_next && (ia->ia_next != oia))
                                ia = ia->ia_next;
                                ia = ia->ia_next;
-                       }
                        if (ia->ia_next)
                        if (ia->ia_next)
-                           ia->ia_next = oia->ia_next;
+                               ia->ia_next = oia->ia_next;
                        else
                                printf("Didn't unlink inifadr from list\n");
                }
                        else
                                printf("Didn't unlink inifadr from list\n");
                }
@@ -499,6 +495,16 @@ in_ifinit(ifp, ia, sin, scrub)
        ia->ia_subnetmask |= ia->ia_netmask;
        ia->ia_subnet = i & ia->ia_subnetmask;
        ia->ia_sockmask.sin_addr.s_addr = htonl(ia->ia_subnetmask);
        ia->ia_subnetmask |= ia->ia_netmask;
        ia->ia_subnet = i & ia->ia_subnetmask;
        ia->ia_sockmask.sin_addr.s_addr = htonl(ia->ia_subnetmask);
+       {
+               register char *cp = (char *) (1 + &(ia->ia_sockmask.sin_addr));
+               register char *cpbase = (char *) &(ia->ia_sockmask.sin_addr);
+               while (--cp >= cpbase)
+                       if (*cp) {
+                               ia->ia_sockmask.sin_len =
+                                       1 + cp - (char *) &(ia->ia_sockmask);
+                               break;
+                       }
+       }
        if (ifp->if_flags & IFF_BROADCAST) {
                ia->ia_broadaddr.sin_addr = 
                        in_makeaddr(ia->ia_subnet, INADDR_BROADCAST);
        if (ifp->if_flags & IFF_BROADCAST) {
                ia->ia_broadaddr.sin_addr = 
                        in_makeaddr(ia->ia_subnet, INADDR_BROADCAST);