only delete space used by inode, on inode deletion; required
[unix-history] / usr / src / sys / netns / ns.c
index 87b0a8a..f8350eb 100644 (file)
@@ -4,16 +4,16 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)ns.c        7.7 (Berkeley) %G%
+ *     @(#)ns.c        7.11 (Berkeley) %G%
  */
 
 #include "param.h"
 #include "mbuf.h"
 #include "ioctl.h"
 #include "protosw.h"
  */
 
 #include "param.h"
 #include "mbuf.h"
 #include "ioctl.h"
 #include "protosw.h"
+#include "errno.h"
 #include "socket.h"
 #include "socketvar.h"
 #include "socket.h"
 #include "socketvar.h"
-#include "user.h"
 
 
 #include "../net/if.h"
 
 
 #include "../net/if.h"
@@ -44,7 +44,6 @@ ns_control(so, cmd, data, ifp)
        register struct ns_ifaddr *ia;
        struct ifaddr *ifa;
        struct ns_ifaddr *oia;
        register struct ns_ifaddr *ia;
        struct ifaddr *ifa;
        struct ns_ifaddr *oia;
-       struct mbuf *m;
        int error, dstIsNew, hostIsNew;
 
        /*
        int error, dstIsNew, hostIsNew;
 
        /*
@@ -82,8 +81,8 @@ ns_control(so, cmd, data, ifp)
                return (0);
        }
 
                return (0);
        }
 
-       if (error = suser(u.u_cred, &u.u_acflag))
-               return (error);
+       if ((so->so_state & SS_PRIV) == 0)
+               return (EPERM);
 
        switch (cmd) {
        case SIOCAIFADDR:
 
        switch (cmd) {
        case SIOCAIFADDR:
@@ -102,16 +101,18 @@ ns_control(so, cmd, data, ifp)
        case SIOCSIFADDR:
        case SIOCSIFDSTADDR:
                if (ia == (struct ns_ifaddr *)0) {
        case SIOCSIFADDR:
        case SIOCSIFDSTADDR:
                if (ia == (struct ns_ifaddr *)0) {
-                       m = m_getclr(M_WAIT, MT_IFADDR);
-                       if (m == (struct mbuf *)NULL)
+                       oia = (struct ns_ifaddr *)
+                               malloc(sizeof *ia, M_IFADDR, M_WAITOK);
+                       if (oia == (struct ns_ifaddr *)NULL)
                                return (ENOBUFS);
                                return (ENOBUFS);
+                       bzero((caddr_t)oia, sizeof(*oia));
                        if (ia = ns_ifaddr) {
                                for ( ; ia->ia_next; ia = ia->ia_next)
                                        ;
                        if (ia = ns_ifaddr) {
                                for ( ; ia->ia_next; ia = ia->ia_next)
                                        ;
-                               ia->ia_next = mtod(m, struct ns_ifaddr *);
+                               ia->ia_next = oia;
                        } else
                        } else
-                               ns_ifaddr = mtod(m, struct ns_ifaddr *);
-                       ia = mtod(m, struct ns_ifaddr *);
+                               ns_ifaddr = oia;
+                       ia = oia;
                        if (ifa = ifp->if_addrlist) {
                                for ( ; ifa->ifa_next; ifa = ifa->ifa_next)
                                        ;
                        if (ifa = ifp->if_addrlist) {
                                for ( ; ifa->ifa_next; ifa = ifa->ifa_next)
                                        ;
@@ -182,7 +183,7 @@ ns_control(so, cmd, data, ifp)
                        else
                                printf("Didn't unlink nsifadr from list\n");
                }
                        else
                                printf("Didn't unlink nsifadr from list\n");
                }
-               (void) m_free(dtom(oia));
+               IFAFREE((&oia->ia_ifa));
                if (0 == --ns_interfaces) {
                        /*
                         * We reset to virginity and start all over again
                if (0 == --ns_interfaces) {
                        /*
                         * We reset to virginity and start all over again
@@ -292,6 +293,7 @@ ns_ifinit(ifp, ia, sns, scrub)
                splx(s);
                return (EINVAL);
        }
                splx(s);
                return (EINVAL);
        }
+       ia->ia_ifa.ifa_metric = ifp->if_metric;
        /*
         * Add route for the network.
         */
        /*
         * Add route for the network.
         */