+ktrgenio(vp, fd, rw, iov, len)
+ struct vnode *vp;
+ enum uio_rw rw;
+ register struct iovec *iov;
+{
+ struct ktr_header *kth = ktrgetheader(KTR_GENIO);
+ register struct ktr_genio *ktp;
+ register caddr_t cp;
+ register int resid = len, cnt;
+
+ if (kth == NULL || u.u_error)
+ return;
+ MALLOC(ktp, struct ktr_genio *, sizeof(struct ktr_genio) + len,
+ M_TEMP, M_WAITOK);
+ ktp->ktr_fd = fd;
+ ktp->ktr_rw = rw;
+ cp = (caddr_t)((char *)ktp + sizeof (struct ktr_genio));
+ while (resid > 0) {
+ if ((cnt = iov->iov_len) > resid)
+ cnt = resid;
+ if (copyin(iov->iov_base, cp, (unsigned)cnt))
+ goto done;
+ cp += cnt;
+ resid -= cnt;
+ iov++;
+ }
+ kth->ktr_buf = (caddr_t)ktp;
+ kth->ktr_len = sizeof (struct ktr_genio) + len;
+
+ ktrwrite(vp, kth);
+done:
+ FREE(kth, M_TEMP);
+ FREE(ktp, M_TEMP);
+}
+
+ktrpsig(vp, sig, action, mask, code)
+ struct vnode *vp;
+ sig_t action;
+{
+ struct ktr_header *kth = ktrgetheader(KTR_PSIG);
+ struct ktr_psig kp;
+
+ if (kth == NULL)
+ return;
+ kp.signo = (char)sig;
+ kp.action = action;
+ kp.mask = mask;
+ kp.code = code;
+ kth->ktr_buf = (caddr_t)&kp;
+ kth->ktr_len = sizeof (struct ktr_psig);
+
+ ktrwrite(vp, kth);
+ FREE(kth, M_TEMP);
+}
+
+/* Interface and common routines */
+