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