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

📄 remopen.c

📁 早期freebsd实现
💻 C
字号:
/*  $Revision: 1.14 $***/#include <stdio.h>#include <errno.h>#include <sys/types.h>#include <sys/socket.h>#if	defined(DO_HAVE_UNIX_DOMAIN)#include <sys/un.h>#endif	/* defined(DO_HAVE_UNIX_DOMAIN) */#include <netinet/in.h>#include <netdb.h>#include "configdata.h"#include "nntp.h"#include "paths.h"#include "libinn.h"#include "clibrary.h"#if	!defined(ntohs) && !defined(NETSWAP)extern unsigned short	ntohs();#endif	/* !defined(ntohs) && !defined(NETSWAP) *//***  Open a connection to an NNTP server and create stdio FILE's for talking**  to it.  Return -1 on error.*/intNNTPconnect(p, FromServerp, ToServerp, errbuff)    register char	*p;    FILE		**FromServerp;    FILE		**ToServerp;    char		*errbuff;{    char		**ap;    char		*fakelist[2];    register char	*dest;    char		mybuff[NNTP_STRLEN + 2];    char		*buff;    register int	i;    register int	j;    int			oerrno;    FILE		*F;    struct hostent	*hp;    struct hostent	fakehp;    struct in_addr	quadaddr;    struct sockaddr_in	server;    buff = errbuff ? errbuff : mybuff;    *buff = '\0';    quadaddr.s_addr = inet_addr(p);    if (quadaddr.s_addr != (unsigned long)-1) {	/* Host was specified as a dotted-quad internet address.  Fill in	 * the parts of the hostent struct that we need. */	fakehp.h_length = sizeof quadaddr;	fakehp.h_addrtype = AF_INET;	hp = &fakehp;	fakelist[0] = (char *)&quadaddr;	fakelist[1] = NULL;	ap = fakelist;    }    else if ((hp = gethostbyname(p)) != NULL) {	/* Symbolic host name. */#if	defined(h_addr)	ap = hp->h_addr_list;#else	/* Fake up an address list for old systems. */	fakelist[0] = (char *)hp->h_addr;	fakelist[1] = NULL;	ap = fakelist;#endif	/* defined(h_addr) */    }    else	/* Not a host name. */	return -1;    /* Set up the socket address. */    (void)memset((POINTER)&server, 0, sizeof server);    server.sin_family = hp->h_addrtype;    server.sin_port = ntohs(NNTP_PORT);    /* Loop through the address list, trying to connect. */    for (; ap && *ap; ap++) {	/* Make a socket and try to connect. */	if ((i = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0)	    break;	/* Copy the address via inline memcpy:	 *	(void)memcpy((POINTER)&server.sin_addr, (POINTER)*ap,			(int)hp->h_length); */	p = (char *)*ap;	for (dest = (char *)&server.sin_addr, j = hp->h_length; --j >= 0; )	    *dest++ = *p++;	if (connect(i, (struct sockaddr *)&server, sizeof server) < 0) {	    oerrno = errno;	    (void)close(i);	    errno = oerrno;	    continue;	}	/* Connected -- now make sure we can post. */	if ((F = fdopen(i, "r")) == NULL) {	    oerrno = errno;	    (void)close(i);	    errno = oerrno;	    continue;	}	if (fgets(buff, sizeof mybuff, F) == NULL) {	    oerrno = errno;	    (void)fclose(F);	    errno = oerrno;	    continue;	}	j = atoi(buff);	if (j != NNTP_POSTOK_VAL && j != NNTP_NOPOSTOK_VAL) {	    (void)fclose(F);	    /* This seems like a reasonable error code to use... */	    errno = EPERM;	    break;	}	*FromServerp = F;	if ((*ToServerp = fdopen(dup(i), "w")) == NULL) {	    oerrno = errno;	    (void)fclose(F);	    errno = oerrno;	    continue;	}	return 0;    }    return -1;}#if	defined(REM_INND)intNNTPremoteopen(FromServerp, ToServerp, errbuff)    FILE		**FromServerp;    FILE		**ToServerp;    char		*errbuff;{    char		*p;    if ((p = GetConfigValue(_CONF_SERVER)) == NULL) {	if (errbuff)	    (void)strcpy(errbuff, "What server?");	return -1;    }    return NNTPconnect(p, FromServerp, ToServerp, errbuff);}#endif	/* defined(REM_INND) */#if	defined(REM_NNTP)/***  Open a connection to an NNTP server using the "clientlib" routines in**  the NNTP distribution.  We also create stdio FILE's for talking over**  the connection (which is easy since clientlib has them as globals.)**  Return -1 on error.*/intNNTPremoteopen(FromServerp, ToServerp, buff)    FILE		**FromServerp;    FILE		**ToServerp;    char		*buff;{    extern FILE		*ser_rd_fp;    extern FILE		*ser_wr_fp;    extern char		*getserverbyfile();    char		*p;    int			i;    if (buff)	(void)strcpy(buff, "Text unavailable");    if ((p = getserverbyfile(_PATH_SERVER)) == NULL)	return -1;    if ((i = server_init(p)) < 0)	return -1;    if (i != NNTP_POSTOK_VAL && i != NNTP_NOPOSTOK_VAL) {	errno = EPERM;	return -1;    }    if (ser_rd_fp == NULL || ser_wr_fp == NULL)	return -1;    *FromServerp = ser_rd_fp;    *ToServerp = ser_wr_fp;    return 0;}#endif	/* defined(REM_NNTP) */

⌨️ 快捷键说明

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