Репозитории ALT
S: | 4.0.20100725-alt3 |
5.1: | 4.0.20061122-alt2 |
4.1: | 4.0.20061122-alt1 |
4.0: | 4.0.20061122-alt1 |
3.0: | 3.6-alt2 |
Группа :: Сети/Прочее
Пакет: netcat
Главная Изменения Спек Патчи Sources Загрузить Gear Bugs and FR Repocop
Патч: netcat-4.0.20061122-owl-alt-fixes.patch
Скачать
Скачать
--- netcat-4.0.20061122/usr.bin/nc/netcat.c
+++ netcat-4.0.20061122/usr.bin/nc/netcat.c
@@ -323,6 +323,8 @@ main(int argc, char *argv[])
len = sizeof(cliaddr);
connfd = accept(s, (struct sockaddr *)&cliaddr,
&len);
+ if (connfd < 0)
+ err(1, "accept");
}
readwrite(connfd);
@@ -355,6 +357,15 @@ main(int argc, char *argv[])
if (s)
close(s);
+ /* Don't lookup port if -n */
+ if (nflag)
+ sv = NULL;
+ else {
+ sv = getservbyport(
+ ntohs(atoi(portlist[i])),
+ uflag ? "udp" : "tcp");
+ }
+
if (xflag)
s = socks_connect(host, portlist[i], hints,
proxyhost, proxyport, proxyhints, socksv,
@@ -362,33 +373,32 @@ main(int argc, char *argv[])
else
s = remote_connect(host, portlist[i], hints);
- if (s < 0)
- continue;
-
ret = 0;
- if (vflag || zflag) {
- /* For UDP, make sure we are connected. */
- if (uflag) {
- if (udptest(s) == -1) {
- ret = 1;
- continue;
- }
- }
- /* Don't look up port if -n. */
- if (nflag)
- sv = NULL;
- else {
- sv = getservbyport(
- ntohs(atoi(portlist[i])),
- uflag ? "udp" : "tcp");
+ if (s >= 0) {
+ if (uflag && zflag)
+ ret = (udptest(s) == -1) ? 1 : 0;
+ } else
+ ret = 1;
+
+ if (vflag) {
+ if (ret) {
+ printf("Connection to %s %s port "
+ "[%s/%s] failed : %s\n",
+ host, portlist[i],
+ uflag ? "udp" : "tcp",
+ sv ? sv->s_name : "*",
+ strerror(errno));
+ } else {
+ printf("Connection to %s %s port "
+ "[%s/%s] succeeded!\n",
+ host, portlist[i],
+ uflag ? "udp" : "tcp",
+ sv ? sv->s_name : "*");
}
-
- printf("Connection to %s %s port [%s/%s] succeeded!\n",
- host, portlist[i], uflag ? "udp" : "tcp",
- sv ? sv->s_name : "*");
}
- if (!zflag)
+
+ if (!zflag && !ret)
readwrite(s);
}
}
@@ -410,7 +420,7 @@ unix_connect(char *path)
int s;
if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
- return (-1);
+ err(1, "socket");
(void)fcntl(s, F_SETFD, 1);
memset(&sun, 0, sizeof(struct sockaddr_un));
@@ -421,8 +431,7 @@ unix_connect(char *path)
strcpy(sun.sun_path, path);
if (connect(s, (struct sockaddr *)&sun, SUN_LEN(&sun)) < 0) {
- close(s);
- return (-1);
+ err(1, "connect");
}
return (s);
@@ -440,7 +449,7 @@ unix_listen(char *path)
/* Create unix domain socket. */
if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
- return (-1);
+ err(1, "socket");
memset(&sun, 0, sizeof(struct sockaddr_un));
sun.sun_family = AF_UNIX;
@@ -450,13 +459,11 @@ unix_listen(char *path)
strcpy(sun.sun_path, path);
if (bind(s, (struct sockaddr *)&sun, SUN_LEN(&sun)) < 0) {
- close(s);
- return (-1);
+ err(1, "bind");
}
if (listen(s, 5) < 0) {
- close(s);
- return (-1);
+ err(1, "listen");
}
return (s);
}
@@ -471,6 +478,7 @@ remote_connect(const char *host, const char *port, struct addrinfo hints)
{
struct addrinfo *res, *res0;
int s, error;
+ int saved_errno = 0;
if ((error = getaddrinfo(host, port, &hints, &res)))
errx(1, "getaddrinfo: %s", gai_strerror(error));
@@ -494,8 +502,13 @@ remote_connect(const char *host, const char *port, struct addrinfo hints)
errx(1, "getaddrinfo: %s", gai_strerror(error));
if (bind(s, (struct sockaddr *)ares->ai_addr,
- ares->ai_addrlen) < 0)
- errx(1, "bind failed: %s", strerror(errno));
+ ares->ai_addrlen) < 0) {
+ warn("bind");
+ freeaddrinfo(ares);
+ close(s);
+ s = -1;
+ continue;
+ }
freeaddrinfo(ares);
}
@@ -503,7 +516,11 @@ remote_connect(const char *host, const char *port, struct addrinfo hints)
if (connect(s, res0->ai_addr, res0->ai_addrlen) == 0)
break;
- else if (vflag)
+
+ if (!saved_errno)
+ saved_errno = errno;
+
+ if (vflag)
warn("connect to %s port %s (%s) failed", host, port,
uflag ? "udp" : "tcp");
@@ -513,6 +530,9 @@ remote_connect(const char *host, const char *port, struct addrinfo hints)
freeaddrinfo(res);
+ if (!errno && saved_errno)
+ errno = saved_errno;
+
return (s);
}
@@ -549,25 +569,26 @@ local_listen(char *host, char *port, struct addrinfo hints)
ret = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &x, sizeof(x));
if (ret == -1)
- err(1, NULL);
+ err(1, "setsockopt");
set_common_sockopts(s);
if (bind(s, (struct sockaddr *)res0->ai_addr,
res0->ai_addrlen) == 0)
break;
+ warn("bind");
close(s);
s = -1;
} while ((res0 = res0->ai_next) != NULL);
+ freeaddrinfo(res);
+
if (!uflag && s != -1) {
if (listen(s, 1) < 0)
err(1, "listen");
}
- freeaddrinfo(res);
-
return (s);
}
@@ -606,7 +627,7 @@ readwrite(int nfd)
if (n == 0)
return;
- if (pfd[0].revents & POLLIN) {
+ if (pfd[0].revents & (POLLIN | POLLERR)) {
if ((n = read(nfd, buf, plen)) < 0)
return;
else if (n == 0) {
@@ -733,24 +754,14 @@ build_ports(char *p)
}
}
-/*
- * udptest()
- * Do a few writes to see if the UDP port is there.
- * XXX - Better way of doing this? Doesn't work for IPv6.
- * Also fails after around 100 ports checked.
- */
int
udptest(int s)
{
- int i, ret;
+ write(s, "X", 1);
- for (i = 0; i <= 3; i++) {
- if (write(s, "X", 1) == 1)
- ret = 1;
- else
- ret = -1;
- }
- return (ret);
+ sleep(3);
+
+ return (write(s, "X", 1) == 1) ? 1 : -1;
}
void