+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 + (X25GBITS(a -> addrlens, called_addrlen) / 2);
+ count = X25GBITS(a -> addrlens, calling_addrlen);
+ pk_simple_bsd (cp, buf, X25GBITS(a -> addrlens, called_addrlen), count);
+ } else {
+ count = X25GBITS(a -> addrlens, 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 ((char *) dnicname, "%d", xcp -> xc_addr.x25_net);
+ prune_dnic ((char *) 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_copy (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);
+ }
+}