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