📄 socket.c
字号:
/* * Copyright (c) 1997, 1998, 1999 * Inferno Nettverk A/S, Norway. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. The above copyright notice, this list of conditions and the following * disclaimer must appear in all copies of the software, derivative works * or modified versions, and any portions thereof, aswell as in all * supporting documentation. * 2. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by * Inferno Nettverk A/S, Norway. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Inferno Nettverk A/S requests users of this software to return to * * Software Distribution Coordinator or sdc@inet.no * Inferno Nettverk A/S * Oslo Research Park * Gaustadal閑n 21 * N-0349 Oslo * Norway * * any improvements or extensions that they make and grant Inferno Nettverk A/S * the rights to redistribute these changes. * */#include "common.h"static const char rcsid[] ="$Id: socket.c,v 1.25 1999/12/20 13:07:41 karls Exp $";intsocks_connect(s, host) int s; const struct sockshost_t *host;{ const char *function = "socks_connect()"; int new_s; struct hostent *hostent; struct sockaddr_in address; char **ip; bzero(&address, sizeof(address)); address.sin_family = AF_INET; address.sin_port = host->port; switch (host->atype) { case SOCKS_ADDR_IPV4: address.sin_addr = host->addr.ipv4; /* LINTED pointer casts may be troublesome */ return connect(s, (struct sockaddr *)&address, sizeof(address)); case SOCKS_ADDR_DOMAIN: if ((hostent = gethostbyname(host->addr.domain)) == NULL) slog(LOG_DEBUG, "%s: gethostbyname(%s): %s", function, host->addr.domain, hstrerror(h_errno)); break; default: SERRX(host->atype); } if (hostent == NULL) return -1; new_s = -1; ip = hostent->h_addr_list; do { if (new_s == -1) new_s = s; /* try to use given descriptor before creating our own. */ else if ((new_s = socketoptdup(s)) == -1) return -1; /* LINTED pointer casts may be troublesome */ address.sin_addr = *((struct in_addr *)*ip); /* LINTED pointer casts may be troublesome */ if (connect(new_s, (struct sockaddr *)&address, sizeof(address)) == 0) break; if (new_s != s) close(new_s); /* * Only try next address if errno indicates server/network error. */ switch (errno) { case ETIMEDOUT: case EINVAL: case ECONNREFUSED: case ENETUNREACH: break; default: return -1; } } while (ip != NULL && *++ip != NULL); if (ip == NULL || *ip == NULL) return -1; /* list exhausted, no successful connect. */ if (new_s != s) { /* had to create a new socket of our own. */ if (dup2(new_s, s) == -1) { close(new_s); return -1; } close(new_s);#if SOCKS_SERVER && HAVE_LIBWRAP if ((new_s = fcntl(s, F_GETFD, 0)) == -1 || fcntl(s, F_SETFD, new_s | FD_CLOEXEC) == -1) swarn("%s: fcntl(F_GETFD/F_SETFD)", function);#endif } return 0;}intacceptn(s, addr, addrlen) int s; struct sockaddr *addr; socklen_t *addrlen;{ int rc; while ((rc = accept(s, addr, addrlen)) == -1 && errno == EINTR) ; return rc;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -