connecttcp.c revision 1.1 1 1.1 christos /* $NetBSD: connecttcp.c,v 1.1 2012/03/23 21:20:08 christos Exp $ */
2 1.1 christos
3 1.1 christos /*
4 1.1 christos * Copyright (C) 2009 by Darren Reed.
5 1.1 christos *
6 1.1 christos * See the IPFILTER.LICENCE file for details on licencing.
7 1.1 christos *
8 1.1 christos * Id: connecttcp.c,v 1.3.2.1 2012/01/26 05:44:26 darren_r Exp
9 1.1 christos */
10 1.1 christos
11 1.1 christos #include "ipf.h"
12 1.1 christos #include <ctype.h>
13 1.1 christos
14 1.1 christos /*
15 1.1 christos * Format expected is one addres per line, at the start of each line.
16 1.1 christos */
17 1.1 christos int
18 1.1 christos connecttcp(char *server, int port)
19 1.1 christos {
20 1.1 christos struct sockaddr_in sin;
21 1.1 christos struct hostent *host;
22 1.1 christos int fd;
23 1.1 christos
24 1.1 christos memset(&sin, 0, sizeof(sin));
25 1.1 christos sin.sin_family = AF_INET;
26 1.1 christos sin.sin_port = htons(port & 65535);
27 1.1 christos
28 1.1 christos if (ISDIGIT(*server)) {
29 1.1 christos if (inet_aton(server, &sin.sin_addr) == -1) {
30 1.1 christos return -1;
31 1.1 christos }
32 1.1 christos } else {
33 1.1 christos host = gethostbyname(server);
34 1.1 christos if (host == NULL)
35 1.1 christos return -1;
36 1.1 christos memcpy(&sin.sin_addr, host->h_addr_list[0],
37 1.1 christos sizeof(sin.sin_addr));
38 1.1 christos }
39 1.1 christos
40 1.1 christos fd = socket(AF_INET, SOCK_STREAM, 0);
41 1.1 christos if (fd == -1)
42 1.1 christos return -1;
43 1.1 christos
44 1.1 christos if (connect(fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
45 1.1 christos close(fd);
46 1.1 christos return -1;
47 1.1 christos }
48 1.1 christos
49 1.1 christos return fd;
50 1.1 christos }
51