+static
+prune_dnic(from, to, dnicname, xcp)
+char *from, *to, *dnicname;
+register struct x25config *xcp;
+{
+ register char *cp1 = from, *cp2 = from;
+ if (xcp->xc_prepnd0 && *cp1 == '0') {
+ from = ++cp1;
+ goto copyrest;
+ }
+ if (xcp->xc_nodnic) {
+ for (cp1 = dnicname; *cp2 = *cp1++;)
+ cp2++;
+ cp1 = from;
+ }
+copyrest:
+ for (cp1 = dnicname; *cp2 = *cp1++;)
+ cp2++;
+}
+/* static */
+pk_simple_bsd (from, to, lower, len)
+register octet *from, *to;
+register len, lower;
+{
+ register int c;
+ while (--len >= 0) {
+ c = *from;
+ if (lower & 0x01)
+ *from++;
+ else
+ c >>= 4;
+ c &= 0x0f; c |= 0x30; *to++ = c; lower++;
+ }
+ *to = 0;
+}
+
+/*static octet * */
+pk_from_bcd (a, iscalling, sa, xcp)
+register struct x25_calladdr *a;
+register struct sockaddr_x25 *sa;
+register struct x25config *xcp;
+{
+ octet buf[MAXADDRLN+1];
+ octet *cp;
+ unsigned count;
+
+ bzero ((caddr_t)sa, sizeof (*sa));
+ sa -> x25_len = sizeof (*sa);
+ sa -> x25_family = AF_CCITT;
+ if (iscalling) {
+ cp = a -> address_field + (a -> called_addrlen / 2);
+ count = a -> calling_addrlen;
+ pk_simple_bsd (cp, buf, a -> called_addrlen, count);
+ } else {
+ count = a -> called_addrlen;
+ pk_simple_bsd (a -> address_field, buf, 0, count);
+ }
+ if (xcp -> xc_addr.x25_net && (xcp -> xc_nodnic || xcp ->xc_prepnd0)) {
+ octet dnicname[sizeof(long) * NBBY/3 + 2];
+
+ sprintf (dnicname, "%d", xcp -> xc_addr.x25_net);
+ prune_dnic (buf, sa -> x25_addr, dnicname, xcp);
+ } else
+ bcopy ((caddr_t)buf, (caddr_t)sa -> x25_addr, count + 1);
+}
+
+static
+save_extra(m0, fp, so)
+struct mbuf *m0;
+octet *fp;
+struct socket *so;
+{
+ register struct mbuf *m;
+ struct cmsghdr cmsghdr;
+ if (m = m_copym (m, 0, (int)M_COPYALL)) {
+ int off = fp - mtod (m0, octet *);
+ int len = m->m_pkthdr.len - off + sizeof (cmsghdr);
+ cmsghdr.cmsg_len = len;
+ cmsghdr.cmsg_level = AF_CCITT;
+ cmsghdr.cmsg_type = PK_FACILITIES;
+ m_adj (m, off);
+ M_PREPEND (m, sizeof(cmsghdr), M_DONTWAIT);
+ if (m == 0)
+ return;
+ bcopy ((caddr_t)&cmsghdr, mtod (m, caddr_t), sizeof (cmsghdr));
+ MCHTYPE(m, MT_CONTROL);
+ sbappendrecord(&so -> so_rcv, m);
+ }
+}