fixed sendfile() for freebsd
This commit is contained in:
		| @ -29,30 +29,10 @@ | ||||
| #include "awk.h" | ||||
| #include "std.h" | ||||
|  | ||||
| #if defined(_WIN32) | ||||
| #	include <windows.h> | ||||
| #	include <tchar.h> | ||||
| #	if defined(QSE_HAVE_CONFIG_H) | ||||
| #		include <ltdl.h> | ||||
| #		define USE_LTDL | ||||
| #	endif | ||||
| #elif defined(__OS2__) | ||||
| #	define INCL_DOSMODULEMGR | ||||
| #	define INCL_DOSPROCESS | ||||
| #	define INCL_DOSERRORS | ||||
| #	include <os2.h> | ||||
| #elif defined(__DOS__) | ||||
| #	if !defined(QSE_ENABLE_STATIC_MODULE) | ||||
| #		include <cwdllfnc.h> | ||||
| #	endif | ||||
| #else | ||||
| #    include <unistd.h> | ||||
| #    include <ltdl.h> | ||||
| #	define USE_LTDL | ||||
| #endif | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #ifndef QSE_HAVE_CONFIG_H | ||||
| #    if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) | ||||
| #if !defined(QSE_HAVE_CONFIG_H) | ||||
| #	if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) | ||||
| #		define HAVE_POW | ||||
| #		define HAVE_FMOD | ||||
| #	endif | ||||
| @ -128,13 +108,7 @@ int StdAwk::open () | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| #if defined(USE_LTDL) | ||||
| 	/* lt_dlinit() can be called more than once and  | ||||
| 	 * lt_dlexit() shuts down libltdl if it's called as many times as | ||||
| 	 * corresponding lt_dlinit(). so it's safe to call lt_dlinit() | ||||
| 	 * and lt_dlexit() at the library level. */ | ||||
| 	if (lt_dlinit() != 0) goto oops; | ||||
| #endif | ||||
| 	if (qse_awk_stdmodstartup (this->awk) <= -1) goto oops; | ||||
|  | ||||
| 	this->cmgrtab_inited = false; | ||||
| 	return 0; | ||||
| @ -153,11 +127,8 @@ void StdAwk::close () | ||||
| 	} | ||||
|  | ||||
| 	clearConsoleOutputs (); | ||||
| 	qse_awk_stdmodshutdown (this->awk); | ||||
| 	Awk::close (); | ||||
|  | ||||
| #if defined(USE_LTDL) | ||||
| 	lt_dlexit (); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| StdAwk::Run* StdAwk::parse (Source& in, Source& out) | ||||
|  | ||||
| @ -175,6 +175,38 @@ qse_awk_flt_t qse_awk_stdmathmod (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t | ||||
| #endif | ||||
| } | ||||
|  | ||||
| int qse_awk_stdmodstartup (qse_awk_t* awk) | ||||
| { | ||||
| #if defined(QSE_ENABLE_STATIC_MODULE) | ||||
| 	return 0; | ||||
|  | ||||
| #elif defined(USE_LTDL) | ||||
| 	/* lt_dlinit() can be called more than once and  | ||||
| 	 * lt_dlexit() shuts down libltdl if it's called as many times as | ||||
| 	 * corresponding lt_dlinit(). so it's safe to call lt_dlinit() | ||||
| 	 * and lt_dlexit() at the library level. */ | ||||
| 	return (lt_dlinit () != 0)? -1: 0; | ||||
|  | ||||
| #else | ||||
| 	return 0; | ||||
| #endif | ||||
|  | ||||
| } | ||||
|  | ||||
| void qse_awk_stdmodshutdown (qse_awk_t* awk) | ||||
| { | ||||
| #if defined(QSE_ENABLE_STATIC_MODULE) | ||||
| 	/* do nothign */ | ||||
|  | ||||
| #elif defined(USE_LTDL) | ||||
|  | ||||
| 	lt_dlexit (); | ||||
|  | ||||
| #else | ||||
| 	/* do nothing */ | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void* qse_awk_stdmodopen (qse_awk_t* awk, const qse_awk_mod_spec_t* spec) | ||||
| { | ||||
| #if defined(QSE_ENABLE_STATIC_MODULE) | ||||
| @ -389,10 +421,7 @@ qse_awk_t* qse_awk_openstd (qse_size_t xtnsize, qse_awk_errnum_t* errnum) | ||||
|  | ||||
| static void fini_xtn (qse_awk_t* awk) | ||||
| { | ||||
| 	/* nothing to do */ | ||||
| #if defined(USE_LTDL) | ||||
| 	lt_dlexit (); | ||||
| #endif | ||||
| 	qse_awk_stdmodshutdown (awk); | ||||
| } | ||||
|  | ||||
| static void clear_xtn (qse_awk_t* awk) | ||||
| @ -424,13 +453,7 @@ qse_awk_t* qse_awk_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_aw | ||||
| 	if (add_globals(awk) <= -1 || | ||||
| 	    add_functions (awk) <= -1) goto oops; | ||||
|  | ||||
| #if defined(USE_LTDL) | ||||
| 	/* lt_dlinit() can be called more than once and  | ||||
| 	 * lt_dlexit() shuts down libltdl if it's called as many times as | ||||
| 	 * corresponding lt_dlinit(). so it's safe to call lt_dlinit() | ||||
| 	 * and lt_dlexit() at the library level. */ | ||||
| 	if (lt_dlinit () != 0) goto oops; | ||||
| #endif | ||||
| 	if (qse_awk_stdmodstartup (awk) <= -1) goto oops; | ||||
|  | ||||
| 	xtn->ecb.close = fini_xtn; | ||||
| 	xtn->ecb.clear = clear_xtn; | ||||
|  | ||||
| @ -27,12 +27,15 @@ | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| qse_awk_flt_t qse_awk_stdmathpow (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t y); | ||||
| qse_awk_flt_t qse_awk_stdmathmod (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t y); | ||||
| QSE_EXPORT qse_awk_flt_t qse_awk_stdmathpow (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t y); | ||||
| QSE_EXPORT qse_awk_flt_t qse_awk_stdmathmod (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t y); | ||||
|  | ||||
| void* qse_awk_stdmodopen (qse_awk_t* awk, const qse_awk_mod_spec_t* spec); | ||||
| void qse_awk_stdmodclose (qse_awk_t* awk, void* handle); | ||||
| void* qse_awk_stdmodsym (qse_awk_t* awk, void* handle, const qse_char_t* name); | ||||
| QSE_EXPORT int qse_awk_stdmodstartup (qse_awk_t* awk); | ||||
| QSE_EXPORT void qse_awk_stdmodshutdown (qse_awk_t* awk); | ||||
|  | ||||
| QSE_EXPORT void* qse_awk_stdmodopen (qse_awk_t* awk, const qse_awk_mod_spec_t* spec); | ||||
| QSE_EXPORT void qse_awk_stdmodclose (qse_awk_t* awk, void* handle); | ||||
| QSE_EXPORT void* qse_awk_stdmodsym (qse_awk_t* awk, void* handle, const qse_char_t* name); | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  | ||||
| @ -441,8 +441,21 @@ static QSE_INLINE qse_ssize_t __send_file ( | ||||
| 	qse_fio_hnd_t fh; | ||||
|  | ||||
| 	fh = qse_fio_gethandle (HANDLE_TO_FIO(in_fd)); | ||||
| 	#if defined(__FreeBSD__) | ||||
| 	{ | ||||
| 		off_t nsent; | ||||
| 		ret = sendfile (fh, out_fd, *offset, count, QSE_NULL, &nsent, 0); | ||||
| 		if (ret == 0)  | ||||
| 		{ | ||||
| 			*offset += nsent; | ||||
| 			ret = nsent;	 | ||||
| 		} | ||||
| 		else qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | ||||
| 	} | ||||
| 	#else | ||||
| 	ret = sendfile (out_fd, fh, offset, count); | ||||
| 	if (ret <= -1) qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); | ||||
| 	#endif | ||||
| 	return ret; | ||||
|  | ||||
| #elif defined(HAVE_SENDFILE64) | ||||
|  | ||||
		Reference in New Issue
	
	Block a user