makesocket.c (1754B)
1 /************************************************************************* 2 * This file is part of Crosroads 1.23, a load balancer and fail over 3 * utility for TCP. Copyright (c) Karel Kubat, distributed under GPL. 4 * Visit http://crossroads.e-tunity.com for information. 5 *************************************************************************/ 6 7 #include "crossroads.h" 8 9 int make_socket (int port, char const *ipaddr) { 10 int sock, val = 1; 11 struct sockaddr_in name; 12 13 /* Create the socket. */ 14 if ( (sock = socket (PF_INET, SOCK_STREAM, 0)) < 0) { 15 warning ("Service %s: cannot create network socket: %s", 16 activeservice->name, strerror(errno)); 17 return (-1); 18 } 19 if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val))) { 20 warning ("Service %s: cannot set socket options: %s", 21 activeservice->name, strerror(errno)); 22 close (sock); 23 return (-2); 24 } 25 26 /* Give the socket a name. */ 27 name.sin_family = AF_INET; 28 name.sin_port = htons (port); 29 30 /* Propagate 'bindto' if given. */ 31 if (strcasecmp (ipaddr, "any")) { 32 msg ("Service %s: creating socket for IP address '%s'", 33 activeservice->name, ipaddr); 34 if ( (name.sin_addr.s_addr = inet_addr (ipaddr)) == INADDR_NONE ) { 35 close (sock); 36 error ("Service %s: cannot convert address '%s' to network bytes", 37 activeservice->name, ipaddr); 38 } 39 } else { 40 msg ("Service %s: creating socket for all interfaces", 41 activeservice->name); 42 name.sin_addr.s_addr = htonl (INADDR_ANY); 43 } 44 45 /* Finallly, bind the socket. */ 46 if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0) { 47 warning ("Cannot bind socket to port %d: %s", 48 port, strerror(errno)); 49 close (sock); 50 return (-3); 51 } 52 53 return (sock); 54 }