diff options
author | maxim <maxim@FreeBSD.org> | 2005-02-06 10:47:12 +0000 |
---|---|---|
committer | maxim <maxim@FreeBSD.org> | 2005-02-06 10:47:12 +0000 |
commit | c183200317c0c27caa6b904e4f129d69c101c487 (patch) | |
tree | 81a82bbce807e9b9f91a45a84bac02a9d5a74e61 /usr.sbin/tcpdrop/tcpdrop.c | |
parent | 98ffca48ea5dc716f1f9420ed241eef776bd605a (diff) | |
download | FreeBSD-src-c183200317c0c27caa6b904e4f129d69c101c487.zip FreeBSD-src-c183200317c0c27caa6b904e4f129d69c101c487.tar.gz |
o Implement net.inet.tcp.drop sysctl and userland part, tcpdrop(8)
utility:
The tcpdrop command drops the TCP connection specified by the
local address laddr, port lport and the foreign address faddr,
port fport.
Obtained from: OpenBSD
Reviewed by: rwatson (locking), ru (man page), -current
MFC after: 1 month
Diffstat (limited to 'usr.sbin/tcpdrop/tcpdrop.c')
-rw-r--r-- | usr.sbin/tcpdrop/tcpdrop.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/usr.sbin/tcpdrop/tcpdrop.c b/usr.sbin/tcpdrop/tcpdrop.c new file mode 100644 index 0000000..cfa8c2a --- /dev/null +++ b/usr.sbin/tcpdrop/tcpdrop.c @@ -0,0 +1,88 @@ +/* $OpenBSD: tcpdrop.c,v 1.4 2004/05/22 23:55:22 deraadt Exp $ */ + +/*- + * Copyright (c) 2004 Markus Friedl <markus@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/sysctl.h> +#include <netinet/in.h> +#include <netinet/tcp_var.h> + +#include <err.h> +#include <netdb.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/* + * Drop a tcp connection. + */ +int +main(int argc, char *argv[]) +{ + struct addrinfo hints, *ail, *aif, *laddr, *faddr; + struct tcp_ident_mapping tir; + int mib[] = { CTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_DROP }; + int gaierr, rval = 0; + char fhbuf[NI_MAXHOST], fsbuf[NI_MAXSERV], lhbuf[NI_MAXHOST], + lsbuf[NI_MAXSERV]; + + if (argc != 5) + errx(1, "usage: tcpdrop laddr lport faddr fport\n"); + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + if ((gaierr = getaddrinfo(argv[1], argv[2], &hints, &laddr)) != 0) + errx(1, "%s port %s: %s", argv[1], argv[2], + gai_strerror(gaierr)); + if ((gaierr = getaddrinfo(argv[3], argv[4], &hints, &faddr)) != 0) { + freeaddrinfo(laddr); + errx(1, "%s port %s: %s", argv[3], argv[4], + gai_strerror(gaierr)); + } + for (ail = laddr; ail; ail = ail->ai_next) { + for (aif = faddr; aif; aif = aif->ai_next) { + if (ail->ai_family != aif->ai_family) + continue; + memcpy(&tir.faddr, aif->ai_addr, aif->ai_addrlen); + memcpy(&tir.laddr, ail->ai_addr, ail->ai_addrlen); + if (getnameinfo(aif->ai_addr, aif->ai_addrlen, + fhbuf, sizeof(fhbuf), + fsbuf, sizeof(fsbuf), + NI_NUMERICHOST | NI_NUMERICSERV) == -1) + err(1, "getnameinfo"); + if (getnameinfo(ail->ai_addr, ail->ai_addrlen, + lhbuf, sizeof(lhbuf), + lsbuf, sizeof(lsbuf), + NI_NUMERICHOST | NI_NUMERICSERV) == -1) + err(1, "getnameinfo"); + if (sysctl(mib, sizeof (mib) / sizeof (int), NULL, + NULL, &tir, sizeof(tir)) == -1) { + rval = 1; + warn("%s %s %s %s", lhbuf, lsbuf, fhbuf, fsbuf); + } else + printf("%s %s %s %s: dropped\n", + lhbuf, lsbuf, fhbuf, fsbuf); + } + } + freeaddrinfo(laddr); + freeaddrinfo(faddr); + exit(rval); +} |