git: 550e01c55247 - main - snp(4): implement detach

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Sun, 25 Sep 2022 20:36:35 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=550e01c552474babae468011191ecc5130cc153e

commit 550e01c552474babae468011191ecc5130cc153e
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2022-09-25 11:34:17 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2022-09-25 20:36:16 +0000

    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
---
 share/man/man4/snp.4 |  6 ------
 sys/dev/snp/snp.c    | 15 +++++++++++++--
 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.