File:  [ELWIX - Embedded LightWeight unIX -] / mqtt / src / utils.c
Revision 1.2.2.1: download - view: text, annotated - select for diffs - revision graph
Wed Apr 11 15:08:27 2012 UTC (12 years, 2 months ago) by misho
Branches: mqtt1_1
migrate to new libaitcfg

    1: #include "global.h"
    2: 
    3: 
    4: int
    5: srv_Socket(cfg_root_t * __restrict cfg)
    6: {
    7: 	int s = -1, n = 1;
    8: 	struct hostent *host;
    9: 	ait_val_t v;
   10: 	u_short port;
   11: 	struct sockaddr_storage ss;
   12: 	struct sockaddr_in *sin = (struct sockaddr_in*) &ss;
   13: 	struct sockaddr_in6 *sin6 = (struct sockaddr_in6*) &ss;
   14: 
   15: 	ioTRACE(2);
   16: 
   17: 	cfg_loadAttribute(cfg, "mqttd", "port", &v, MQTT_PORT);
   18: 	port = strtol(AIT_GET_STR(&v), NULL, 0);
   19: 	AIT_FREE_VAL(&v);
   20: 	cfg_loadAttribute(cfg, "mqttd", "listen", &v, MQTT_HOST);
   21: 
   22: 	host = gethostbyname(AIT_GET_STR(&v));
   23: 	AIT_FREE_VAL(&v);
   24: 	if (!host) {
   25: 		printf("Error:: resolver #%d - %s\n", h_errno, hstrerror(h_errno));
   26: 		return -1;
   27: 	}
   28: 	switch (host->h_addrtype) {
   29: 		case AF_INET:
   30: 			sin->sin_len = sizeof(struct sockaddr_in);
   31: 			sin->sin_family = AF_INET;
   32: 			sin->sin_port = htons(port);
   33: 			memcpy(&sin->sin_addr, host->h_addr, sizeof sin->sin_addr);
   34: 			break;
   35: 		case AF_INET6:
   36: 			sin6->sin6_len = sizeof(struct sockaddr_in6);
   37: 			sin6->sin6_family = AF_INET6;
   38: 			sin6->sin6_port = htons(port);
   39: 			memcpy(&sin6->sin6_addr, host->h_addr, sizeof sin6->sin6_addr);
   40: 			break;
   41: 		default:
   42: 			printf("Error:: unsupported socket type %d\n", host->h_addrtype);
   43: 			return -1;
   44: 	}
   45: 
   46: 	s = socket(ss.ss_family, SOCK_STREAM, 0);
   47: 	if (s == -1) {
   48: 		printf("Error:: socket() #%d - %s\n", errno, strerror(errno));
   49: 		return -1;
   50: 	}
   51: 	if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &n, sizeof n) == -1) {
   52: 		printf("Error:: setsockopt(SO_REUSEADDR) #%d - %s\n", errno, strerror(errno));
   53: 		close(s);
   54: 		return -1;
   55: 	}
   56: 	if (bind(s, (struct sockaddr*) &ss, ss.ss_len) == -1) {
   57: 		printf("Error:: bind() #%d - %s\n", errno, strerror(errno));
   58: 		close(s);
   59: 		return -1;
   60: 	}
   61: 
   62: 	return s;
   63: }
   64: 
   65: int
   66: srv_Close(int s)
   67: {
   68: 	ioTRACE(2);
   69: 
   70: 	if (s > STDERR_FILENO)
   71: 		shutdown(s, SHUT_RDWR);
   72: 
   73: 	return close(s);
   74: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>