+pk_ctloutput (cmd, so, level, optname, mp)
+struct socket *so;
+struct mbuf **mp;
+int cmd, level, optname;
+{
+ register struct mbuf *m = *mp;
+ register struct pklcd *lcp = (struct pklcd *) so -> so_pcb;
+ int error = EOPNOTSUPP;
+
+ if (m == 0)
+ return (EINVAL);
+ if (cmd == PRCO_SETOPT) switch (optname) {
+ case PK_FACILITIES:
+ if (m == 0)
+ return (EINVAL);
+ lcp -> lcd_facilities = m;
+ *mp = 0;
+ return (0);
+
+ case PK_ACCTFILE:
+ if ((so->so_state & SS_PRIV) == 0)
+ error = EPERM;
+ else if (m -> m_len)
+ error = pk_accton (mtod (m, char *));
+ else
+ error = pk_accton ((char *)0);
+ break;
+
+ case PK_RTATTACH:
+ error = pk_rtattach (so, m);
+ break;
+
+ case PK_PRLISTEN:
+ error = pk_user_protolisten (mtod (m, u_char *));
+ }
+ if (*mp) {
+ (void) m_freem (*mp);
+ *mp = 0;
+ }
+ return (error);
+
+}
+
+