Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/ip_carp.c
Show First 20 Lines • Show All 1,702 Lines • ▼ Show 20 Lines | |||||
int | int | ||||
carp_ioctl(struct ifreq *ifr, u_long cmd, struct thread *td) | carp_ioctl(struct ifreq *ifr, u_long cmd, struct thread *td) | ||||
{ | { | ||||
struct carpreq carpr; | struct carpreq carpr; | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
struct carp_softc *sc = NULL; | struct carp_softc *sc = NULL; | ||||
int error = 0, locked = 0; | int error = 0, locked = 0; | ||||
if ((error = copyin(ifr->ifr_data, &carpr, sizeof carpr))) | if ((error = copyin(ifr_data_get_ptr(ifr), &carpr, sizeof carpr))) | ||||
return (error); | return (error); | ||||
ifp = ifunit_ref(ifr->ifr_name); | ifp = ifunit_ref(ifr->ifr_name); | ||||
if (ifp == NULL) | if (ifp == NULL) | ||||
return (ENXIO); | return (ENXIO); | ||||
switch (ifp->if_type) { | switch (ifp->if_type) { | ||||
case IFT_ETHER: | case IFT_ETHER: | ||||
▲ Show 20 Lines • Show All 99 Lines • ▼ Show 20 Lines | if (carpr.carpr_vhid != 0) { | ||||
IFNET_FOREACH_CARP(ifp, sc) | IFNET_FOREACH_CARP(ifp, sc) | ||||
if (sc->sc_vhid == carpr.carpr_vhid) | if (sc->sc_vhid == carpr.carpr_vhid) | ||||
break; | break; | ||||
if (sc == NULL) { | if (sc == NULL) { | ||||
error = ENOENT; | error = ENOENT; | ||||
break; | break; | ||||
} | } | ||||
carp_carprcp(&carpr, sc, priveleged); | carp_carprcp(&carpr, sc, priveleged); | ||||
error = copyout(&carpr, ifr->ifr_data, sizeof(carpr)); | error = copyout(&carpr, ifr_data_get_ptr(ifr), | ||||
sizeof(carpr)); | |||||
} else { | } else { | ||||
int i, count; | int i, count; | ||||
count = 0; | count = 0; | ||||
IFNET_FOREACH_CARP(ifp, sc) | IFNET_FOREACH_CARP(ifp, sc) | ||||
count++; | count++; | ||||
if (count > carpr.carpr_count) { | if (count > carpr.carpr_count) { | ||||
CIF_UNLOCK(ifp->if_carp); | CIF_UNLOCK(ifp->if_carp); | ||||
error = EMSGSIZE; | error = EMSGSIZE; | ||||
break; | break; | ||||
} | } | ||||
i = 0; | i = 0; | ||||
IFNET_FOREACH_CARP(ifp, sc) { | IFNET_FOREACH_CARP(ifp, sc) { | ||||
carp_carprcp(&carpr, sc, priveleged); | carp_carprcp(&carpr, sc, priveleged); | ||||
carpr.carpr_count = count; | carpr.carpr_count = count; | ||||
error = copyout(&carpr, ifr->ifr_data + | error = copyout(&carpr, | ||||
(caddr_t)ifr_data_get_ptr(ifr) + | |||||
(i * sizeof(carpr)), sizeof(carpr)); | (i * sizeof(carpr)), sizeof(carpr)); | ||||
if (error) { | if (error) { | ||||
CIF_UNLOCK(ifp->if_carp); | CIF_UNLOCK(ifp->if_carp); | ||||
break; | break; | ||||
} | } | ||||
i++; | i++; | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 396 Lines • Show Last 20 Lines |