crossroads

Git mirror of https://crossroads.e-tunity.com/
git clone git://git.finwo.net/app/crossroads
Log | Files | Refs

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 }