mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-03-03 15:38:22 +00:00
Add half close flag to netcat example
This commit is contained in:
parent
e4ef38403b
commit
1f87640d17
1 changed files with 30 additions and 4 deletions
|
@ -23,6 +23,7 @@
|
||||||
#include "libc/sysv/consts/so.h"
|
#include "libc/sysv/consts/so.h"
|
||||||
#include "libc/sysv/consts/sock.h"
|
#include "libc/sysv/consts/sock.h"
|
||||||
#include "libc/sysv/consts/sol.h"
|
#include "libc/sysv/consts/sol.h"
|
||||||
|
#include "third_party/getopt/getopt.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @fileoverview netcat clone
|
* @fileoverview netcat clone
|
||||||
|
@ -42,14 +43,37 @@ int main(int argc, char *argv[]) {
|
||||||
ssize_t rc;
|
ssize_t rc;
|
||||||
size_t i, got;
|
size_t i, got;
|
||||||
char buf[1500];
|
char buf[1500];
|
||||||
int err, toto, sock;
|
bool halfclose = true;
|
||||||
|
const char *host, *port;
|
||||||
|
int opt, err, toto, sock;
|
||||||
struct addrinfo *ai = NULL;
|
struct addrinfo *ai = NULL;
|
||||||
struct linger linger = {true, 1};
|
struct linger linger = {true, 1};
|
||||||
struct pollfd fds[2] = {{-1, POLLIN}, {-1, POLLIN}};
|
struct pollfd fds[2] = {{-1, POLLIN}, {-1, POLLIN}};
|
||||||
struct addrinfo hint = {AI_NUMERICSERV, AF_INET, SOCK_STREAM, IPPROTO_TCP};
|
struct addrinfo hint = {AI_NUMERICSERV, AF_INET, SOCK_STREAM, IPPROTO_TCP};
|
||||||
|
|
||||||
if (argc != 3) exit(1);
|
while ((opt = getopt(argc, argv, "hH")) != -1) {
|
||||||
switch ((rc = getaddrinfo(argv[1], argv[2], &hint, &ai))) {
|
switch (opt) {
|
||||||
|
case 'H':
|
||||||
|
halfclose = false;
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
fputs("Usage: ", stdout);
|
||||||
|
fputs(argv[0], stdout);
|
||||||
|
fputs(" [-hH] IP PORT\n", stdout);
|
||||||
|
exit(0);
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "bad option %d\n", opt);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (argc - optind != 2) {
|
||||||
|
fputs("missing args\n", stderr);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
host = argv[optind + 0];
|
||||||
|
port = argv[optind + 1];
|
||||||
|
|
||||||
|
switch ((rc = getaddrinfo(host, port, &hint, &ai))) {
|
||||||
case EAI_SUCCESS:
|
case EAI_SUCCESS:
|
||||||
break;
|
break;
|
||||||
case EAI_SYSTEM:
|
case EAI_SYSTEM:
|
||||||
|
@ -93,7 +117,9 @@ int main(int argc, char *argv[]) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (!(got = rc)) {
|
if (!(got = rc)) {
|
||||||
|
if (halfclose) {
|
||||||
shutdown(sock, SHUT_WR);
|
shutdown(sock, SHUT_WR);
|
||||||
|
}
|
||||||
fds[0].fd = -1;
|
fds[0].fd = -1;
|
||||||
}
|
}
|
||||||
for (i = 0; i < got; i += rc) {
|
for (i = 0; i < got; i += rc) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue