diff --git a/share/man/man4/snp.4 b/share/man/man4/snp.4 --- a/share/man/man4/snp.4 +++ b/share/man/man4/snp.4 @@ -1,7 +1,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 5, 2008 +.Dd September 24, 2022 .Dt SNP 4 .Os .Sh NAME @@ -58,8 +58,6 @@ in a read buffer. Special values defined are: .Bl -tag -width ".Dv SNP_TTYCLOSE" -.It Dv SNP_OFLOW -device overflow occurred, device detached. .It Dv SNP_TTYCLOSE tty not attached. .It Dv SNP_DETACH @@ -89,11 +87,3 @@ .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 return proper error codes when calling -.Dv FIONREAD . -It also 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 --- a/sys/dev/snp/snp.c +++ b/sys/dev/snp/snp.c @@ -125,6 +125,7 @@ tty_lock(tp); ttyoutq_free(&ss->snp_outq); ttyhook_unregister(tp); + ss->snp_tty = NULL; } cv_destroy(&ss->snp_outwait); @@ -252,9 +253,19 @@ 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. @@ -289,10 +300,13 @@ tp = ss->snp_tty; if (tp != NULL) { tty_lock(tp); - *(int *)data = ttyoutq_bytesused(&ss->snp_outq); + if (tty_gone(tp)) + *(int *)data = SNP_TTYCLOSE; + else + *(int *)data = ttyoutq_bytesused(&ss->snp_outq); tty_unlock(tp); } else { - *(int *)data = 0; + *(int *)data = SNP_DETACH; } return (0); default: