aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2022-09-25 11:34:17 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2022-09-25 20:36:16 +0000
commit550e01c552474babae468011191ecc5130cc153e (patch)
tree74767bd5992bd61f86cc4c54a5ef340406b540e1
parentbb4be76cf358246ef04ea8a67f38ff2a25b6c580 (diff)
downloadsrc-550e01c552474babae468011191ecc5130cc153e.tar.gz
src-550e01c552474babae468011191ecc5130cc153e.zip
snp(4): implement detach
PR: 257964 Reported by: Bertrand Petit <bsdpr@phoe.frmug.org> Reviewed by: imp, markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D36690
-rw-r--r--share/man/man4/snp.46
-rw-r--r--sys/dev/snp/snp.c15
2 files changed, 13 insertions, 8 deletions
diff --git a/share/man/man4/snp.4 b/share/man/man4/snp.4
index 524e779ce081..3422b9ca5d6f 100644
--- a/share/man/man4/snp.4
+++ b/share/man/man4/snp.4
@@ -87,9 +87,3 @@ Previous versions of
.Nm
were based on code written by
.An Ugen J.S. Antsilevich Aq Mt ugen@NetVision.net.il .
-.Sh BUGS
-This version of
-.Nm
-does not allow
-.Dv SNPSTTY
-to detach itself from the TTY.
diff --git a/sys/dev/snp/snp.c b/sys/dev/snp/snp.c
index 3bcd2263809b..37c1c075a76e 100644
--- a/sys/dev/snp/snp.c
+++ b/sys/dev/snp/snp.c
@@ -125,6 +125,7 @@ snp_dtor(void *data)
tty_lock(tp);
ttyoutq_free(&ss->snp_outq);
ttyhook_unregister(tp);
+ ss->snp_tty = NULL;
}
cv_destroy(&ss->snp_outwait);
@@ -252,9 +253,19 @@ snp_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags,
case SNPSTTY:
/* Bind TTY to snoop instance. */
SNP_LOCK();
- if (ss->snp_tty != NULL) {
+ tp = ss->snp_tty;
+ if (tp != NULL) {
+ if (*(int *)data == -1) {
+ tty_lock(tp);
+ ss->snp_tty = NULL;
+ ttyoutq_free(&ss->snp_outq);
+ ttyhook_unregister(tp);
+ error = 0;
+ } else {
+ error = EBUSY;
+ }
SNP_UNLOCK();
- return (EBUSY);
+ return (error);
}
/*
* XXXRW / XXXJA: no capability check here.