connecttcp.c revision 256281
118334Speter/*
218334Speter * Copyright (C) 2012 by Darren Reed.
390075Sobrien *
4169689Skan * See the IPFILTER.LICENCE file for details on licencing.
550397Sobrien *
618334Speter * $Id: connecttcp.c,v 1.3.2.2 2012/07/22 08:04:24 darren_r Exp $
790075Sobrien */
818334Speter
990075Sobrien#include "ipf.h"
1090075Sobrien#include <ctype.h>
1190075Sobrien
1290075Sobrien/*
1318334Speter * Format expected is one addres per line, at the start of each line.
1490075Sobrien */
1590075Sobrienint
1690075Sobrienconnecttcp(char *server, int port)
1790075Sobrien{
1890075Sobrien	struct sockaddr_in sin;
1990075Sobrien	struct hostent *host;
2090075Sobrien	int fd;
2190075Sobrien
2218334Speter	memset(&sin, 0, sizeof(sin));
2390075Sobrien	sin.sin_family = AF_INET;
2490075Sobrien	sin.sin_port = htons(port & 65535);
2590075Sobrien
2690075Sobrien	if (ISDIGIT(*server)) {
2790075Sobrien		if (inet_aton(server, &sin.sin_addr) == -1) {
2818334Speter			return -1;
2990075Sobrien		}
30169689Skan	} else {
31169689Skan		host = gethostbyname(server);
3218334Speter		if (host == NULL)
3390075Sobrien			return -1;
3418334Speter		memcpy(&sin.sin_addr, host->h_addr_list[0],
3518334Speter		       sizeof(sin.sin_addr));
3618334Speter	}
3718334Speter
3818334Speter	fd = socket(AF_INET, SOCK_STREAM, 0);
3918334Speter	if (fd == -1)
4018334Speter		return -1;
4118334Speter
4218334Speter	if (connect(fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
4318334Speter		close(fd);
4418334Speter		return -1;
4518334Speter	}
4618334Speter
4718334Speter	return fd;
4818334Speter}
4918334Speter