+ /* assume user leaves space for checksum */
+ if ((len & 1) || len < MINPUPSIZ || len > MAXPUPSIZ) {
+ error = EMSGSIZE;
+ goto bad;
+ }
+ pup->pup_length = htons((u_short)len);
+ dst = (struct sockaddr_pup *)&rp->rcb_faddr;
+ bcopy((caddr_t)&dst->spup_net, (caddr_t)&pup->pup_dnet,
+ sizeof (struct pupport));
+ if (rp->rcb_route.ro_rt == 0)
+ ifp = if_ifonnetof(dst->spup_net);
+ else {
+ rp->rcb_route.ro_rt->rt_use++;
+ ifp = rp->rcb_route.ro_rt->rt_ifp;
+ }
+ if (ifp == 0) {
+ error = ENETUNREACH;
+ goto bad;
+ }
+ if (rp->rcb_flags & RAW_LADDR) {
+ register struct sockaddr_pup *src;
+
+ src = (struct sockaddr_pup *)&rp->rcb_laddr;
+ bcopy((caddr_t)&src->spup_net, (caddr_t)&pup->pup_snet,
+ sizeof (struct pupport));
+ } else {
+ pup->pup_snet = ifp->if_net;
+ pup->pup_shost = ifp->if_host[0];
+ /* socket is specified by user */
+ }