5 # define IP_LISTENER_BACKLOG 511/* So if it gets masked by 256 or some other
6 * such value it'll still be respectable */
8 /* Any IP-related initialisations. For now, this means blocking SIGPIPE */
9 int ip_initialise(void)
13 sa.sa_handler = SIG_IGN;
15 sigemptyset(&sa.sa_mask);
16 if (sigaction(SIGPIPE, &sa, NULL) != 0)
21 int ip_create_listener_split(const char *ip, unsigned short port)
23 struct sockaddr_in in_addr;
27 /* Create the socket */
28 if ((fd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
30 /* Set the SO_REUSEADDR flag - servers act weird without it */
31 if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)(&reuseVal),
32 sizeof(reuseVal)) != 0)
34 /* Prepare the listen address stuff */
35 in_addr.sin_family = AF_INET;
36 memcpy(&in_addr.sin_addr.s_addr, ip, 4);
37 in_addr.sin_port = htons(port);
38 /* Bind to the required port/address/interface */
39 if (bind(fd, (struct sockaddr *)&in_addr, sizeof(struct sockaddr_in)) !=
42 /* Start "listening" */
43 if (listen(fd, IP_LISTENER_BACKLOG) != 0)
52 int ip_create_connection_split(const char *ip, unsigned short port)
54 struct sockaddr_in in_addr;
57 /* Create the socket */
58 if ((fd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
60 /* Make it non-blocking */
61 if (((flags = fcntl(fd, F_GETFL, 0)) < 0) ||
62 (fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0))
64 /* Prepare the connection address stuff */
65 in_addr.sin_family = AF_INET;
66 memcpy(&in_addr.sin_addr.s_addr, ip, 4);
67 in_addr.sin_port = htons(port);
68 /* Start a connect (non-blocking, in all likelihood) */
69 if ((connect(fd, (struct sockaddr *)&in_addr,
70 sizeof(struct sockaddr_in)) != 0) && (errno != EINPROGRESS))
79 static char all_local_ip[] = { 0x00, 0x00, 0x00, 0x00 };
81 int ip_parse_address(const char *address, const char **parsed_ip,
82 unsigned short *parsed_port, int accept_all_ip)
85 struct hostent *lookup;
87 const char *ptr = strstr(address, ":");
88 const char *ip = all_local_ip;
92 * We assume we're listening on all local interfaces and have only
100 if ((ptr - address) > 255)
103 memcpy(buf, address, ptr - address);
105 if ((lookup = gethostbyname(buf)) == NULL) {
107 * Spit a message to differentiate between lookup failures and bad
110 fprintf(stderr, "hostname lookup for '%s' failed\n", buf);
113 ip = lookup->h_addr_list[0];
117 if (!int_strtoul(ptr, &port) || (port > 65535))
120 *parsed_port = (unsigned short)port;
124 int ip_create_listener(const char *address)
129 if (!ip_parse_address(address, &ip, &port, 1))
131 return ip_create_listener_split(ip, port);
134 int ip_create_connection(const char *address)
139 if (!ip_parse_address(address, &ip, &port, 0))
141 return ip_create_connection_split(ip, port);
144 int ip_accept_connection(int listen_fd)
146 return accept(listen_fd, NULL, NULL);
149 #endif /* !defined(NO_IP) */