touched up unix socket handling in urs
This commit is contained in:
		| @ -53,7 +53,7 @@ struct urs_ctx_t | |||||||
|  |  | ||||||
| 	qse_skad_t skad; | 	qse_skad_t skad; | ||||||
| 	int skadlen; | 	int skadlen; | ||||||
| 	int urs_socket; | 	int urs_socket; /* default urs socket to use */ | ||||||
|  |  | ||||||
| 	qse_uint16_t seq; /* TODO: change to uint32_t??? */ | 	qse_uint16_t seq; /* TODO: change to uint32_t??? */ | ||||||
| 	urs_req_t* reqs[1024]; /* TOOD: choose the right size */ | 	urs_req_t* reqs[1024]; /* TOOD: choose the right size */ | ||||||
| @ -61,6 +61,10 @@ struct urs_ctx_t | |||||||
|  |  | ||||||
| 	qse_uint8_t rcvbuf[QSE_SIZEOF(urs_hdr_t) + URS_MAX_URL_LEN + 1]; | 	qse_uint8_t rcvbuf[QSE_SIZEOF(urs_hdr_t) + URS_MAX_URL_LEN + 1]; | ||||||
| 	qse_uint8_t fmtbuf[QSE_SIZEOF(urs_hdr_t) + URS_MAX_URL_LEN + 1]; | 	qse_uint8_t fmtbuf[QSE_SIZEOF(urs_hdr_t) + URS_MAX_URL_LEN + 1]; | ||||||
|  |  | ||||||
|  | #if defined(AF_UNIX) | ||||||
|  | 	struct sockaddr_un unix_bind_addr; | ||||||
|  | #endif | ||||||
| }; | }; | ||||||
|  |  | ||||||
| struct urs_req_t | struct urs_req_t | ||||||
| @ -133,7 +137,34 @@ static int urs_open (qse_httpd_t* httpd, qse_httpd_urs_t* urs) | |||||||
| #if defined(AF_INET6) | #if defined(AF_INET6) | ||||||
| 	urs->handle[1] = open_udp_socket (httpd, AF_INET6, type, proto); | 	urs->handle[1] = open_udp_socket (httpd, AF_INET6, type, proto); | ||||||
| #endif | #endif | ||||||
|  | #if defined(AF_UNIX) | ||||||
| 	urs->handle[2] = open_udp_socket (httpd, AF_UNIX, type, 0); | 	urs->handle[2] = open_udp_socket (httpd, AF_UNIX, type, 0); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | 	if (qse_isvalidsckhnd(urs->handle[2])) | ||||||
|  | 	{ | ||||||
|  | 	#if defined(AF_UNIX) | ||||||
|  | 		qse_ntime_t now; | ||||||
|  |  | ||||||
|  | 		qse_gettime (&now); | ||||||
|  |  | ||||||
|  | 		QSE_MEMSET (&dc->unix_bind_addr, 0, QSE_SIZEOF(dc->unix_bind_addr)); | ||||||
|  | 		dc->unix_bind_addr.sun_family = AF_UNIX; | ||||||
|  | 	/* TODO: safer way to bind. what if the file name collides? */ | ||||||
|  | 		qse_mbsxfmt ( | ||||||
|  | 			dc->unix_bind_addr.sun_path,  | ||||||
|  | 			QSE_COUNTOF(dc->unix_bind_addr.sun_path), | ||||||
|  | 			QSE_MT("/tmp/.urs-%d-%ld-%ld"),  | ||||||
|  | 			(int)QSE_GETPID(), (long int)now.sec, (long int)now.nsec  | ||||||
|  | 		); | ||||||
|  | 		QSE_UNLINK (dc->unix_bind_addr.sun_path); | ||||||
|  | 		if (bind (urs->handle[2], (struct sockaddr*)&dc->unix_bind_addr, QSE_SIZEOF(dc->unix_bind_addr)) <= -1) | ||||||
|  | 		{ | ||||||
|  | 			qse_closesckhnd (urs->handle[2]); | ||||||
|  | 			urs->handle[2] = QSE_INVALID_SCKHND; | ||||||
|  | 		} | ||||||
|  | 	#endif | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if (!qse_isvalidsckhnd(urs->handle[0]) &&  | 	if (!qse_isvalidsckhnd(urs->handle[0]) &&  | ||||||
| 	    !qse_isvalidsckhnd(urs->handle[1]) && | 	    !qse_isvalidsckhnd(urs->handle[1]) && | ||||||
| @ -142,21 +173,10 @@ static int urs_open (qse_httpd_t* httpd, qse_httpd_urs_t* urs) | |||||||
| 		goto oops; | 		goto oops; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (qse_isvalidsckhnd(urs->handle[2])) |  | ||||||
| 	{ |  | ||||||
| 		struct sockaddr_un addr; |  | ||||||
| 		QSE_MEMSET (&addr, 0, QSE_SIZEOF(addr)); |  | ||||||
| 		addr.sun_family = AF_UNIX; |  | ||||||
| 		qse_mbsxfmt (addr.sun_path, QSE_COUNTOF(addr.sun_path), QSE_MT("/tmp/qsehttpd-%d.urs.sock"), (int)QSE_GETPID()); |  | ||||||
| 		QSE_UNLINK (addr.sun_path); |  | ||||||
| 		bind (urs->handle[2], (struct sockaddr*)&addr, QSE_SIZEOF(addr)); |  | ||||||
| /* TOOD: unlink this socket in urs_close() also... */ |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* carry on regardless of success or failure */ | 	/* carry on regardless of success or failure */ | ||||||
| 	dc->skadlen = qse_nwadtoskad (&nwad, &dc->skad); | 	dc->skadlen = qse_nwadtoskad (&nwad, &dc->skad); | ||||||
|  |  | ||||||
| 	/* determine which socket to use when sending a request to the server */ | 	/* determine which socket to use when sending a request to the default server */ | ||||||
| 	if (dc->skadlen >= 0) | 	if (dc->skadlen >= 0) | ||||||
| 	{ | 	{ | ||||||
| 		switch (nwad.type) | 		switch (nwad.type) | ||||||
| @ -183,7 +203,7 @@ static int urs_open (qse_httpd_t* httpd, qse_httpd_urs_t* urs) | |||||||
| #if 0 | #if 0 | ||||||
| 	if (proto == IPPROTO_SCTP) | 	if (proto == IPPROTO_SCTP) | ||||||
| 	{ | 	{ | ||||||
| /* TODO: error ahndleing */ | /* TODO: error handling */ | ||||||
| 		if (qse_isvalidsckhnd(urs->handle[0])) listen (urs->handle[0], 99); | 		if (qse_isvalidsckhnd(urs->handle[0])) listen (urs->handle[0], 99); | ||||||
| 		if (qse_isvalidsckhnd(urs->handle[1])) listen (urs->handle[1], 99); | 		if (qse_isvalidsckhnd(urs->handle[1])) listen (urs->handle[1], 99); | ||||||
| 		/* handle[2] is a unix socket. no special handling for SCTP */ | 		/* handle[2] is a unix socket. no special handling for SCTP */ | ||||||
| @ -201,7 +221,13 @@ static int urs_open (qse_httpd_t* httpd, qse_httpd_urs_t* urs) | |||||||
| oops: | oops: | ||||||
| 	if (qse_isvalidsckhnd(urs->handle[0])) qse_closesckhnd (urs->handle[0]); | 	if (qse_isvalidsckhnd(urs->handle[0])) qse_closesckhnd (urs->handle[0]); | ||||||
| 	if (qse_isvalidsckhnd(urs->handle[1])) qse_closesckhnd (urs->handle[1]); | 	if (qse_isvalidsckhnd(urs->handle[1])) qse_closesckhnd (urs->handle[1]); | ||||||
| 	if (qse_isvalidsckhnd(urs->handle[2])) qse_closesckhnd (urs->handle[2]); | 	if (qse_isvalidsckhnd(urs->handle[2]))  | ||||||
|  | 	{ | ||||||
|  | 		qse_closesckhnd (urs->handle[2]); | ||||||
|  | 	#if defined(AF_UNIX) | ||||||
|  | 		QSE_UNLINK (dc->unix_bind_addr.sun_path); | ||||||
|  | 	#endif | ||||||
|  | 	} | ||||||
| 	if (dc) qse_httpd_freemem (httpd, dc); | 	if (dc) qse_httpd_freemem (httpd, dc); | ||||||
| 	return -1; | 	return -1; | ||||||
|  |  | ||||||
| @ -239,7 +265,13 @@ static void urs_close (qse_httpd_t* httpd, qse_httpd_urs_t* urs) | |||||||
|  |  | ||||||
| 	if (qse_isvalidsckhnd(urs->handle[0])) qse_closesckhnd (urs->handle[0]); | 	if (qse_isvalidsckhnd(urs->handle[0])) qse_closesckhnd (urs->handle[0]); | ||||||
| 	if (qse_isvalidsckhnd(urs->handle[1])) qse_closesckhnd (urs->handle[1]); | 	if (qse_isvalidsckhnd(urs->handle[1])) qse_closesckhnd (urs->handle[1]); | ||||||
| 	if (qse_isvalidsckhnd(urs->handle[2])) qse_closesckhnd (urs->handle[2]); | 	if (qse_isvalidsckhnd(urs->handle[2]))  | ||||||
|  | 	{ | ||||||
|  | 		qse_closesckhnd (urs->handle[2]); | ||||||
|  | 	#if defined(AF_UNIX) | ||||||
|  | 		QSE_UNLINK (dc->unix_bind_addr.sun_path); | ||||||
|  | 	#endif | ||||||
|  | 	} | ||||||
| 	qse_httpd_freemem (httpd, urs->ctx); | 	qse_httpd_freemem (httpd, urs->ctx); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -75,6 +75,12 @@ | |||||||
| #	include <sys/socket.h> | #	include <sys/socket.h> | ||||||
| #	include <netinet/in.h> | #	include <netinet/in.h> | ||||||
| #	include <sys/un.h> | #	include <sys/un.h> | ||||||
|  | #	if defined(QSE_SIZEOF_STRUCT_SOCKADDR_IN6) && (QSE_SIZEOF_STRUCT_SOCKADDR_IN6 <= 0) | ||||||
|  | #		undef AF_INET6 | ||||||
|  | #	endif | ||||||
|  | #	if defined(QSE_SIZEOF_STRUCT_SOCKADDR_UN) && (QSE_SIZEOF_STRUCT_SOCKADDR_UN <= 0) | ||||||
|  | #		undef AF_UNIX | ||||||
|  | #	endif | ||||||
| #	if defined(HAVE_SYS_SENDFILE_H) | #	if defined(HAVE_SYS_SENDFILE_H) | ||||||
| #		include <sys/sendfile.h> | #		include <sys/sendfile.h> | ||||||
| #	endif | #	endif | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user