File:  [ELWIX - Embedded LightWeight unIX -] / mqtt / src / utils.c
Revision 1.2.2.2: download - view: text, annotated - select for diffs - revision graph
Sun Apr 15 21:44:33 2012 UTC (12 years, 2 months ago) by misho
Branches: mqtt1_1
moved error printfs to ioERRxxx
change system sockaddr* to io_sockaddr_t

    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: 	io_sockaddr_t sa;
   12: 
   13: 	ioTRACE(2);
   14: 
   15: 	cfg_loadAttribute(cfg, "mqttd", "port", &v, MQTT_PORT);
   16: 	port = strtol(AIT_GET_STR(&v), NULL, 0);
   17: 	AIT_FREE_VAL(&v);
   18: 	cfg_loadAttribute(cfg, "mqttd", "listen", &v, MQTT_HOST);
   19: 
   20: 	host = gethostbyname(AIT_GET_STR(&v));
   21: 	AIT_FREE_VAL(&v);
   22: 	if (!host) {
   23: 		ioERROR(h_errno, "%s", hstrerror(h_errno));
   24: 		return -1;
   25: 	}
   26: 	switch (host->h_addrtype) {
   27: 		case AF_INET:
   28: 			sa.sin.sin_len = sizeof(struct sockaddr_in);
   29: 			sa.sin.sin_family = AF_INET;
   30: 			sa.sin.sin_port = htons(port);
   31: 			memcpy(&sa.sin.sin_addr, host->h_addr, sizeof sa.sin.sin_addr);
   32: 			break;
   33: 		case AF_INET6:
   34: 			sa.sin6.sin6_len = sizeof(struct sockaddr_in6);
   35: 			sa.sin6.sin6_family = AF_INET6;
   36: 			sa.sin6.sin6_port = htons(port);
   37: 			memcpy(&sa.sin6.sin6_addr, host->h_addr, sizeof sa.sin6.sin6_addr);
   38: 			break;
   39: 		default:
   40: 			ioERROR(host->h_addrtype, "unsupported socket type");
   41: 			return -1;
   42: 	}
   43: 
   44: 	s = socket(sa.ss.ss_family, SOCK_STREAM, 0);
   45: 	if (s == -1) {
   46: 		ioSYSERR(0);
   47: 		return -1;
   48: 	}
   49: 	if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &n, sizeof n) == -1) {
   50: 		ioSYSERR(0);
   51: 		close(s);
   52: 		return -1;
   53: 	}
   54: 	if (bind(s, (struct sockaddr*) &sa.ss, sa.ss.ss_len) == -1) {
   55: 		ioSYSERR(0);
   56: 		close(s);
   57: 		return -1;
   58: 	}
   59: 
   60: 	return s;
   61: }
   62: 
   63: int
   64: srv_Close(int s)
   65: {
   66: 	ioTRACE(2);
   67: 
   68: 	if (s > STDERR_FILENO)
   69: 		shutdown(s, SHUT_RDWR);
   70: 
   71: 	return close(s);
   72: }

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