⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 io.c

📁 sock protocol ,it is useful!
💻 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: io.c,v 1.39 1999/09/02 10:41:37 michaels Exp $";/* this file defines the functions. */#undef select#undef closessize_treadn(d, buf, nbytes)	int d;	void *buf;	size_t nbytes;{	ssize_t p;	size_t left = nbytes;	do {		if ((p = read(d, &((char *)buf)[nbytes - left], left)) == -1) {#if SOCKS_SERVER			if (errno == EINTR)				continue;#endif			break;		}		else if (p == 0)			break;		left -= p;	} while (left > 0);	if (left == nbytes)		return p;	/* nothing read. */	return nbytes - left;}ssize_twriten(d, buf, nbytes)	int d;	const void *buf;	size_t nbytes;{	ssize_t p;	size_t left = nbytes;	do {		if ((p = write(d, &((const char *)buf)[nbytes - left], left)) == -1) {#if SOCKS_SERVER			if (errno == EINTR)				continue;#endif			break;		}		left -= p;	} while (left > 0);	if (left == nbytes)		return p;	/* nothing written. */	return nbytes - left;}ssize_trecvmsgn(s, msg, flags, len)	int s;	struct msghdr *msg;	int flags;	size_t len;{	size_t left = len;	ssize_t p;	while ((p = recvmsg(s, msg, flags)) == -1 && errno == EINTR)#if SOCKS_SERVER		;#else		return -1;#endif#if HAVE_SOLARIS_BUGS	if (p == -1 && (errno == EMFILE || errno == ENFILE)) {		/*		 * Even if solaris (2.5.1) fails on recvmsg() it may still have		 * gotten a descriptor or more as ancillary data which it neglects		 * to get rid of, so we have to check for it ourselves and close it,		 * else it just gets lost in the void.		 */		int i, leaked;		caddr_t mem;		mem = msg->msg_accrights;		for (i = 0; i * sizeof(leaked) < msg->msg_accrightslen; ++i) {			memcpy(&leaked, mem, sizeof(leaked));			mem += sizeof(leaked);			close(leaked);		}	}#endif /* HAVE_SOLARIS_BUGS */	if (p <= 0)		return p;	left -= p;	if (left > 0) {		size_t i, count, done;		/*		 * Can't call recvmsg() again since we could be getting ancillary data,		 * read the elements one by one.		 */		SASSERTX(p >= 0);		done = p;		i = count = p = 0;		while (i < msg->msg_iovlen && left > 0) {			const struct iovec *io = &msg->msg_iov[i];			count += io->iov_len;			if (count > done) {				if ((p = readn(s, &((char *)(io->iov_base))[io->iov_len -				(count - done)], count - done)) != ((ssize_t)(count - done)))					break;				left -= p;				done += p;			}			++i;		}	}	if (left == len)		return p; /* nothing read. */	return len - left;}intclosen(d)	int d;{	int rc;	while ((rc = close(d)) == -1 && errno == EINTR)		;#if DIAGNOSTIC	SASSERT(rc == 0 || d >= 0);#endif	return rc;}intselectn(nfds, readfds, writefds, exceptfds, timeout)	int nfds;	fd_set *readfds;	fd_set *writefds;	fd_set *exceptfds;	struct timeval *timeout;{	/* const */ fd_set rset = readfds	== NULL ? rset : *readfds;	/* const */ fd_set wset = writefds	== NULL ? wset : *writefds;	/* const */ fd_set eset = exceptfds	== NULL ? eset : *exceptfds;	/* const */ struct timeval tout = timeout == NULL ? tout : *timeout;	int rc;	while ((rc = select(nfds, readfds, writefds, exceptfds, timeout)) == -1	&& errno == EINTR) {		if (readfds != NULL)			*readfds = rset;		if (writefds != NULL)			*writefds = wset;		if (exceptfds != NULL)			*exceptfds = eset;		if (timeout != NULL)			*timeout = tout;	}	return rc;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -