xref: /original-bsd/usr.bin/uucp/libacu/bsdtcp.c (revision 5d8c4082)
1461ee7cfSbostic /*-
2*5d8c4082Sbostic  * Copyright (c) 1985, 1993
3*5d8c4082Sbostic  *	The Regents of the University of California.  All rights reserved.
4461ee7cfSbostic  *
5461ee7cfSbostic  * %sccs.include.proprietary.c%
6461ee7cfSbostic  */
7461ee7cfSbostic 
84fa9eb8bSralph #ifndef lint
9*5d8c4082Sbostic static char sccsid[] = "@(#)bsdtcp.c	8.1 (Berkeley) 06/06/93";
10461ee7cfSbostic #endif /* not lint */
114fa9eb8bSralph 
12d3f4d2b1Sbostic #include "condevs.h"
13690bd95dSbloom #include <netdb.h>
144fa9eb8bSralph #include <sys/socket.h>
154fa9eb8bSralph #include <netinet/in.h>
164fa9eb8bSralph 
174fa9eb8bSralph /*
184fa9eb8bSralph  *	bsdtcpopn -- make a tcp connection
194fa9eb8bSralph  *
204fa9eb8bSralph  *	return codes:
214fa9eb8bSralph  *		>0 - file number - ok
224fa9eb8bSralph  *		FAIL - failed
234fa9eb8bSralph  */
244fa9eb8bSralph 
bsdtcpopn(flds)254fa9eb8bSralph bsdtcpopn(flds)
264fa9eb8bSralph register char *flds[];
274fa9eb8bSralph {
284fa9eb8bSralph 	struct servent *sp;
294fa9eb8bSralph 	struct hostent *hp;
304fa9eb8bSralph 	struct	sockaddr_in hisctladdr;
31aff20eddSbloom 	int s = -1, port;
324fa9eb8bSralph 	extern int errno;
334f93a936Storek 	extern const char *const sys_errlist[];
344fa9eb8bSralph 
354fa9eb8bSralph 	sp = getservbyname(flds[F_CLASS], "tcp");
364fa9eb8bSralph 	if (sp == NULL) {
374fa9eb8bSralph 		port = htons(atoi(flds[F_CLASS]));
384fa9eb8bSralph 		if (port == 0) {
394fa9eb8bSralph 			logent(_FAILED, "UNKNOWN PORT NUMBER");
404fa9eb8bSralph 			return CF_SYSTEM;
414fa9eb8bSralph 		}
424fa9eb8bSralph 	} else
434fa9eb8bSralph 		port = sp->s_port;
444fa9eb8bSralph 	DEBUG(4, "bsdtcpopn host %s, ", flds[F_PHONE]);
454fa9eb8bSralph 	DEBUG(4, "port %d\n", ntohs(port));
464fa9eb8bSralph 	if (setjmp(Sjbuf)) {
47aff20eddSbloom 		bsdtcpcls(s);
484fa9eb8bSralph 		logent("tcpopen", "TIMEOUT");
494fa9eb8bSralph 		return CF_DIAL;
504fa9eb8bSralph 	}
514fa9eb8bSralph 
524fa9eb8bSralph 	bzero((char *)&hisctladdr, sizeof (hisctladdr));
534fa9eb8bSralph 	hp = gethostbyname(flds[F_PHONE]);
544fa9eb8bSralph 	if (hp == NULL) {
554fa9eb8bSralph 		logent("tcpopen","UNKNOWN HOST");
564fa9eb8bSralph 		return CF_DIAL;
574fa9eb8bSralph 	}
584fa9eb8bSralph 	signal(SIGALRM, alarmtr);
59933a8bf8Srick 	alarm(MAXMSGTIME*2);
604fa9eb8bSralph 	hisctladdr.sin_family = hp->h_addrtype;
61690bd95dSbloom #ifdef BSD2_9
62690bd95dSbloom 	s = socket(SOCK_STREAM, 0, &hisctladdr, 0);
63690bd95dSbloom #else BSD4_2
64690bd95dSbloom 	s = socket(hp->h_addrtype, SOCK_STREAM, 0);
65690bd95dSbloom #endif BSD4_2
664fa9eb8bSralph 	if (s < 0)
674fa9eb8bSralph 		goto bad;
68690bd95dSbloom #ifndef BSD2_9
69d3f4d2b1Sbostic 	if (bind(s, (struct sockaddr *)&hisctladdr, sizeof (hisctladdr)) < 0)
704fa9eb8bSralph 		goto bad;
71690bd95dSbloom #endif BSD2_9
724fa9eb8bSralph 	bcopy(hp->h_addr, (char *)&hisctladdr.sin_addr, hp->h_length);
734fa9eb8bSralph 	hisctladdr.sin_port = port;
74690bd95dSbloom #ifdef BSD2_9
75690bd95dSbloom 	if (connect(s, (char *)&hisctladdr) < 0)
76690bd95dSbloom #else BSD4_2
77d3f4d2b1Sbostic 	if (connect(s, (struct sockaddr *)&hisctladdr, sizeof (hisctladdr)) < 0)
78690bd95dSbloom #endif BSD4_2
794fa9eb8bSralph 		goto bad;
804fa9eb8bSralph 	alarm(0);
814fa9eb8bSralph 	CU_end = bsdtcpcls;
824fa9eb8bSralph 	return s;
834fa9eb8bSralph bad:
844fa9eb8bSralph 	alarm(0);
85aff20eddSbloom 	bsdtcpcls(s);
864fa9eb8bSralph 	DEBUG(5, "tcpopen failed: errno %d\n", errno);
874fa9eb8bSralph 	logent(sys_errlist[errno], _FAILED);
884fa9eb8bSralph 	return CF_DIAL;
894fa9eb8bSralph }
904fa9eb8bSralph 
914fa9eb8bSralph /*
924fa9eb8bSralph  * bsdtcpcls -- close tcp connection
934fa9eb8bSralph  */
bsdtcpcls(fd)944fa9eb8bSralph bsdtcpcls(fd)
954fa9eb8bSralph register int fd;
964fa9eb8bSralph {
974fa9eb8bSralph 	DEBUG(4, "TCP CLOSE called\n", 0);
984fa9eb8bSralph 	if (fd > 0) {
994fa9eb8bSralph 		close(fd);
1004fa9eb8bSralph 		DEBUG(4, "closed fd %d\n", fd);
1014fa9eb8bSralph 	}
1024fa9eb8bSralph }
103