added qse_ubi_t
separated task functions from httpd.c to httpd_task.c
This commit is contained in:
parent
618f8bcf1f
commit
b08ebd719c
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.c 470 2011-05-21 16:20:01Z hyunghwan.chung $
|
* $Id: awk.c 510 2011-07-20 16:17:16Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -248,7 +248,7 @@ static qse_htb_walk_t print_awk_value (
|
|||||||
dprint (QSE_T("%.*s = %.*s\n"),
|
dprint (QSE_T("%.*s = %.*s\n"),
|
||||||
(int)QSE_HTB_KLEN(pair), QSE_HTB_KPTR(pair),
|
(int)QSE_HTB_KLEN(pair), QSE_HTB_KPTR(pair),
|
||||||
(int)len, str);
|
(int)len, str);
|
||||||
qse_awk_free (qse_awk_rtx_getawk(rtx), str);
|
qse_awk_freemem (qse_awk_rtx_getawk(rtx), str);
|
||||||
}
|
}
|
||||||
|
|
||||||
return QSE_HTB_WALK_FORWARD;
|
return QSE_HTB_WALK_FORWARD;
|
||||||
@ -318,7 +318,7 @@ static void dprint_return (qse_awk_rtx_t* rtx, qse_awk_val_t* ret)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
dprint (QSE_T("[RETURN] - [%.*s]\n"), (int)len, str);
|
dprint (QSE_T("[RETURN] - [%.*s]\n"), (int)len, str);
|
||||||
qse_awk_free (qse_awk_rtx_getawk(rtx), str);
|
qse_awk_freemem (qse_awk_rtx_getawk(rtx), str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
qse/configure
vendored
2
qse/configure
vendored
@ -15300,7 +15300,7 @@ fi
|
|||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
for ac_header in time.h sys/time.h utime.h sys/resource.h sys/syscall.h
|
for ac_header in time.h sys/time.h utime.h sys/resource.h sys/syscall.h sys/sendfile.h
|
||||||
do :
|
do :
|
||||||
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
|
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
|
||||||
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
|
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
|
||||||
|
@ -79,7 +79,7 @@ AC_SUBST(LIBM, $LIBM)
|
|||||||
dnl check header files.
|
dnl check header files.
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
AC_CHECK_HEADERS([stddef.h wchar.h wctype.h errno.h signal.h])
|
AC_CHECK_HEADERS([stddef.h wchar.h wctype.h errno.h signal.h])
|
||||||
AC_CHECK_HEADERS([time.h sys/time.h utime.h sys/resource.h sys/syscall.h])
|
AC_CHECK_HEADERS([time.h sys/time.h utime.h sys/resource.h sys/syscall.h sys/sendfile.h])
|
||||||
AC_CHECK_HEADERS([execinfo.h])
|
AC_CHECK_HEADERS([execinfo.h])
|
||||||
|
|
||||||
dnl check data types
|
dnl check data types
|
||||||
|
@ -81,7 +81,7 @@ Under the wide character mode:
|
|||||||
- #QSE_CHAR_IS_WCHAR is defined.
|
- #QSE_CHAR_IS_WCHAR is defined.
|
||||||
- #qse_char_t maps to #qse_wchar_t.
|
- #qse_char_t maps to #qse_wchar_t.
|
||||||
|
|
||||||
#qse_mchar_t maps @b char and #qse_wchar_t maps to @b wchar_t or equivalent.
|
#qse_mchar_t maps to @b char and #qse_wchar_t maps to @b wchar_t or equivalent.
|
||||||
|
|
||||||
@section library_modules LIBRARY MODULES
|
@section library_modules LIBRARY MODULES
|
||||||
@b QSE contains a set of APIs. Each set is organized into a library module
|
@b QSE contains a set of APIs. Each set is organized into a library module
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.h 485 2011-05-29 15:15:52Z hyunghwan.chung $
|
* $Id: awk.h 510 2011-07-20 16:17:16Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -1442,28 +1442,28 @@ int qse_awk_parse (
|
|||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_awk_alloc() function allocates dynamic memory.
|
* The qse_awk_allocmem() function allocates dynamic memory.
|
||||||
* @return a pointer to a memory block on success, #QSE_NULL on failure
|
* @return a pointer to a memory block on success, #QSE_NULL on failure
|
||||||
*/
|
*/
|
||||||
void* qse_awk_alloc (
|
void* qse_awk_allocmem (
|
||||||
qse_awk_t* awk, /**< awk */
|
qse_awk_t* awk, /**< awk */
|
||||||
qse_size_t size /**< size of memory to allocate in bytes */
|
qse_size_t size /**< size of memory to allocate in bytes */
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_awk_realloc() function resizes a dynamic memory block.
|
* The qse_awk_reallocmem() function resizes a dynamic memory block.
|
||||||
* @return a pointer to a memory block on success, #QSE_NULL on failure
|
* @return a pointer to a memory block on success, #QSE_NULL on failure
|
||||||
*/
|
*/
|
||||||
void* qse_awk_realloc (
|
void* qse_awk_reallocmem (
|
||||||
qse_awk_t* awk, /**< awk */
|
qse_awk_t* awk, /**< awk */
|
||||||
void* ptr, /**< memory block */
|
void* ptr, /**< memory block */
|
||||||
qse_size_t size /**< new block size in bytes */
|
qse_size_t size /**< new block size in bytes */
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_awk_free() function frees dynamic memory allocated.
|
* The qse_awk_freemem() function frees dynamic memory allocated.
|
||||||
*/
|
*/
|
||||||
void qse_awk_free (
|
void qse_awk_freemem (
|
||||||
qse_awk_t* awk, /**< awk */
|
qse_awk_t* awk, /**< awk */
|
||||||
void* ptr /**< memory block to free */
|
void* ptr /**< memory block to free */
|
||||||
);
|
);
|
||||||
@ -2237,32 +2237,32 @@ int qse_awk_rtx_strtonum (
|
|||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_awk_rtx_alloc() function allocats a memory block of @a size bytes
|
* The qse_awk_rtx_allocmem() function allocats a memory block of @a size bytes
|
||||||
* using the memory manager associated with a runtime context @a rtx.
|
* using the memory manager associated with a runtime context @a rtx.
|
||||||
* @return the pointer to a memory block on success, #QSE_NULL on failure.
|
* @return the pointer to a memory block on success, #QSE_NULL on failure.
|
||||||
*/
|
*/
|
||||||
void* qse_awk_rtx_alloc (
|
void* qse_awk_rtx_allocmem (
|
||||||
qse_awk_rtx_t* rtx, /**< runtime context */
|
qse_awk_rtx_t* rtx, /**< runtime context */
|
||||||
qse_size_t size /**< block size in bytes */
|
qse_size_t size /**< block size in bytes */
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_awk_rtx_realloc() function resizes a memory block pointed to
|
* The qse_awk_rtx_reallocmem() function resizes a memory block pointed to
|
||||||
* by @a ptr to @a size bytes using the memory manager associated with
|
* by @a ptr to @a size bytes using the memory manager associated with
|
||||||
* a runtime context @a rtx.
|
* a runtime context @a rtx.
|
||||||
* @return the pointer to a memory block on success, #QSE_NULL on failure.
|
* @return the pointer to a memory block on success, #QSE_NULL on failure.
|
||||||
*/
|
*/
|
||||||
void* qse_awk_rtx_realloc (
|
void* qse_awk_rtx_reallocmem (
|
||||||
qse_awk_rtx_t* rtx, /**< runtime context */
|
qse_awk_rtx_t* rtx, /**< runtime context */
|
||||||
void* ptr, /**< memory block */
|
void* ptr, /**< memory block */
|
||||||
qse_size_t size /**< block size in bytes */
|
qse_size_t size /**< block size in bytes */
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_awk_rtx_free() function frees a memory block pointed to by @a ptr
|
* The qse_awk_rtx_freemem() function frees a memory block pointed to by @a ptr
|
||||||
* using the memory manager of a runtime ocntext @a rtx.
|
* using the memory manager of a runtime ocntext @a rtx.
|
||||||
*/
|
*/
|
||||||
void qse_awk_rtx_free (
|
void qse_awk_rtx_freemem (
|
||||||
qse_awk_rtx_t* rtx, /**< runtime context */
|
qse_awk_rtx_t* rtx, /**< runtime context */
|
||||||
void* ptr /**< memory block pointer */
|
void* ptr /**< memory block pointer */
|
||||||
);
|
);
|
||||||
|
@ -104,7 +104,15 @@ struct qse_xma_t
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef int (*qse_xma_dumper_t) (void* target, const qse_char_t* fmt,...);
|
/**
|
||||||
|
* The qse_xma_dumper_t type defines a printf-like output function
|
||||||
|
* for qse_xma_dump().
|
||||||
|
*/
|
||||||
|
typedef int (*qse_xma_dumper_t) (
|
||||||
|
void* ctx,
|
||||||
|
const qse_char_t* fmt,
|
||||||
|
...
|
||||||
|
);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -187,13 +195,13 @@ void qse_xma_free (
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_xma_dump() function dumps the contents of the memory zone
|
* The qse_xma_dump() function dumps the contents of the memory zone
|
||||||
* with the output function @a printf provided. The debug build shows
|
* with the output function @a dumper provided. The debug build shows
|
||||||
* more statistical counters.
|
* more statistical counters.
|
||||||
*/
|
*/
|
||||||
void qse_xma_dump (
|
void qse_xma_dump (
|
||||||
qse_xma_t* xma, /**< memory allocator */
|
qse_xma_t* xma, /**< memory allocator */
|
||||||
qse_xma_dumper_t dumper, /**< output function */
|
qse_xma_dumper_t dumper, /**< output function */
|
||||||
void* target /**< first parameter to output function */
|
void* ctx /**< first parameter to output function */
|
||||||
);
|
);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -144,6 +144,9 @@
|
|||||||
/* Define to 1 if you have the <sys/resource.h> header file. */
|
/* Define to 1 if you have the <sys/resource.h> header file. */
|
||||||
#undef HAVE_SYS_RESOURCE_H
|
#undef HAVE_SYS_RESOURCE_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/sendfile.h> header file. */
|
||||||
|
#undef HAVE_SYS_SENDFILE_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||||
#undef HAVE_SYS_STAT_H
|
#undef HAVE_SYS_STAT_H
|
||||||
|
|
||||||
|
@ -128,11 +128,35 @@ int qse_httpd_entasksendfmt (
|
|||||||
...
|
...
|
||||||
);
|
);
|
||||||
|
|
||||||
|
int qse_httpd_entasksendfile (
|
||||||
|
qse_httpd_t* httpd,
|
||||||
|
qse_httpd_client_t* client,
|
||||||
|
int fd,
|
||||||
|
qse_foff_t offset,
|
||||||
|
qse_foff_t size
|
||||||
|
);
|
||||||
|
|
||||||
int qse_httpd_entaskdisconnect (
|
int qse_httpd_entaskdisconnect (
|
||||||
qse_httpd_t* httpd,
|
qse_httpd_t* httpd,
|
||||||
qse_httpd_client_t* client
|
qse_httpd_client_t* client
|
||||||
);
|
);
|
||||||
|
|
||||||
|
void* qse_httpd_allocmem (
|
||||||
|
qse_httpd_t* httpd,
|
||||||
|
qse_size_t size
|
||||||
|
);
|
||||||
|
|
||||||
|
void* qse_httpd_reallocmem (
|
||||||
|
qse_httpd_t* httpd,
|
||||||
|
void* ptr,
|
||||||
|
qse_size_t size
|
||||||
|
);
|
||||||
|
|
||||||
|
void qse_httpd_freemem (
|
||||||
|
qse_httpd_t* httpd,
|
||||||
|
void* ptr
|
||||||
|
);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: types.h 504 2011-07-11 16:31:33Z hyunghwan.chung $
|
* $Id: types.h 510 2011-07-20 16:17:16Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -336,7 +336,6 @@ typedef qse_int_t qse_intptr_t;
|
|||||||
typedef double qse_real_t;
|
typedef double qse_real_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_mchar_t type defines a multi-byte character type.
|
* The qse_mchar_t type defines a multi-byte character type.
|
||||||
*/
|
*/
|
||||||
@ -575,4 +574,66 @@ typedef struct qse_mmgr_t qse_mmgr_t;
|
|||||||
# error Unsupported platform
|
# error Unsupported platform
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* The qse_ubi_t type defines a union type that includes most of built-in
|
||||||
|
* data types and numeric types defined in the library. */
|
||||||
|
union qse_ubi_t
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
unsigned char uc;
|
||||||
|
short s;
|
||||||
|
unsigned short us;
|
||||||
|
int i;
|
||||||
|
unsigned int ui;
|
||||||
|
long l;
|
||||||
|
unsigned long ul;
|
||||||
|
#if defined(QSE_SIZEOF_LONG_LONG) && (QSE_SIZEOF_LONG_LONG > 0)
|
||||||
|
long long ll;
|
||||||
|
unsigned long long ull;
|
||||||
|
#endif
|
||||||
|
float f;
|
||||||
|
double d;
|
||||||
|
#if defined(QSE_SIZEOF_LONG_DOUBLE) && (QSE_SIZEOF_LONG_DOUBLE > 0)
|
||||||
|
long double ld;
|
||||||
|
#endif
|
||||||
|
void* ptr;
|
||||||
|
|
||||||
|
qse_byte_t byte;
|
||||||
|
qse_int_t sint;
|
||||||
|
qse_uint_t uint;
|
||||||
|
qse_long_t slong;
|
||||||
|
qse_ulong_t ulong;
|
||||||
|
qse_size_t size;
|
||||||
|
qse_ssize_t ssize;
|
||||||
|
qse_word_t word;
|
||||||
|
qse_intptr_t intptr;
|
||||||
|
qse_uintptr_t uintptr;
|
||||||
|
qse_real_t real;
|
||||||
|
|
||||||
|
qse_char_t cha;
|
||||||
|
qse_mchar_t mchar;
|
||||||
|
qse_wchar_t wchar;
|
||||||
|
qse_cint_t cint;
|
||||||
|
qse_mcint_t mcint;
|
||||||
|
qse_wcint_t wcint;
|
||||||
|
|
||||||
|
qse_int8_t int8;
|
||||||
|
qse_uint8_t uint8;
|
||||||
|
qse_int16_t int16;
|
||||||
|
qse_uint16_t uint16;
|
||||||
|
qse_int32_t int32;
|
||||||
|
qse_uint32_t uint32;
|
||||||
|
#if defined(QSE_HAVE_INT64_T)
|
||||||
|
qse_int64_t int64;
|
||||||
|
qse_uint64_t uint64;
|
||||||
|
#endif
|
||||||
|
#if defined(QSE_HAVE_INT128_T)
|
||||||
|
qse_int128_t int128;
|
||||||
|
qse_uint128_t uint128;
|
||||||
|
#endif
|
||||||
|
qse_foff_t foff;
|
||||||
|
};
|
||||||
|
typedef union qse_ubi_t qse_ubi_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: Awk.cpp 480 2011-05-25 14:00:19Z hyunghwan.chung $
|
* $Id: Awk.cpp 510 2011-07-20 16:17:16Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -139,7 +139,7 @@ Awk::Console::~Console ()
|
|||||||
{
|
{
|
||||||
if (filename != QSE_NULL)
|
if (filename != QSE_NULL)
|
||||||
{
|
{
|
||||||
qse_awk_free ((awk_t*)this, filename);
|
qse_awk_freemem ((awk_t*)this, filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,7 +230,7 @@ Awk::Value::IntIndex::IntIndex (long_t x)
|
|||||||
|
|
||||||
void* Awk::Value::operator new (size_t n, Run* run) throw ()
|
void* Awk::Value::operator new (size_t n, Run* run) throw ()
|
||||||
{
|
{
|
||||||
void* ptr = qse_awk_rtx_alloc (run->rtx, QSE_SIZEOF(run) + n);
|
void* ptr = qse_awk_rtx_allocmem (run->rtx, QSE_SIZEOF(run) + n);
|
||||||
if (ptr == QSE_NULL) return QSE_NULL;
|
if (ptr == QSE_NULL) return QSE_NULL;
|
||||||
|
|
||||||
*(Run**)ptr = run;
|
*(Run**)ptr = run;
|
||||||
@ -239,7 +239,7 @@ void* Awk::Value::operator new (size_t n, Run* run) throw ()
|
|||||||
|
|
||||||
void* Awk::Value::operator new[] (size_t n, Run* run) throw ()
|
void* Awk::Value::operator new[] (size_t n, Run* run) throw ()
|
||||||
{
|
{
|
||||||
void* ptr = qse_awk_rtx_alloc (run->rtx, QSE_SIZEOF(run) + n);
|
void* ptr = qse_awk_rtx_allocmem (run->rtx, QSE_SIZEOF(run) + n);
|
||||||
if (ptr == QSE_NULL) return QSE_NULL;
|
if (ptr == QSE_NULL) return QSE_NULL;
|
||||||
|
|
||||||
*(Run**)ptr = run;
|
*(Run**)ptr = run;
|
||||||
@ -249,25 +249,25 @@ void* Awk::Value::operator new[] (size_t n, Run* run) throw ()
|
|||||||
#if !defined(__BORLANDC__)
|
#if !defined(__BORLANDC__)
|
||||||
void Awk::Value::operator delete (void* ptr, Run* run)
|
void Awk::Value::operator delete (void* ptr, Run* run)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_free (run->rtx, (char*)ptr-QSE_SIZEOF(run));
|
qse_awk_rtx_freemem (run->rtx, (char*)ptr-QSE_SIZEOF(run));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Awk::Value::operator delete[] (void* ptr, Run* run)
|
void Awk::Value::operator delete[] (void* ptr, Run* run)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_free (run->rtx, (char*)ptr-QSE_SIZEOF(run));
|
qse_awk_rtx_freemem (run->rtx, (char*)ptr-QSE_SIZEOF(run));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void Awk::Value::operator delete (void* ptr)
|
void Awk::Value::operator delete (void* ptr)
|
||||||
{
|
{
|
||||||
void* p = (char*)ptr-QSE_SIZEOF(Run*);
|
void* p = (char*)ptr-QSE_SIZEOF(Run*);
|
||||||
qse_awk_rtx_free ((*(Run**)p)->rtx, p);
|
qse_awk_rtx_freemem ((*(Run**)p)->rtx, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Awk::Value::operator delete[] (void* ptr)
|
void Awk::Value::operator delete[] (void* ptr)
|
||||||
{
|
{
|
||||||
void* p = (char*)ptr-QSE_SIZEOF(Run*);
|
void* p = (char*)ptr-QSE_SIZEOF(Run*);
|
||||||
qse_awk_rtx_free ((*(Run**)p)->rtx, p);
|
qse_awk_rtx_freemem ((*(Run**)p)->rtx, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
Awk::Value::Value (): run (QSE_NULL), val (qse_awk_val_nil)
|
Awk::Value::Value (): run (QSE_NULL), val (qse_awk_val_nil)
|
||||||
@ -303,7 +303,7 @@ Awk::Value::~Value ()
|
|||||||
{
|
{
|
||||||
qse_awk_rtx_refdownval (run->rtx, val);
|
qse_awk_rtx_refdownval (run->rtx, val);
|
||||||
if (cached.str.ptr != QSE_NULL)
|
if (cached.str.ptr != QSE_NULL)
|
||||||
qse_awk_rtx_free (run->rtx, cached.str.ptr);
|
qse_awk_rtx_freemem (run->rtx, cached.str.ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -316,7 +316,7 @@ Awk::Value& Awk::Value::operator= (const Value& v)
|
|||||||
qse_awk_rtx_refdownval (run->rtx, val);
|
qse_awk_rtx_refdownval (run->rtx, val);
|
||||||
if (cached.str.ptr != QSE_NULL)
|
if (cached.str.ptr != QSE_NULL)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_free (run->rtx, cached.str.ptr);
|
qse_awk_rtx_freemem (run->rtx, cached.str.ptr);
|
||||||
cached.str.ptr = QSE_NULL;
|
cached.str.ptr = QSE_NULL;
|
||||||
cached.str.len = 0;
|
cached.str.len = 0;
|
||||||
}
|
}
|
||||||
@ -339,7 +339,7 @@ void Awk::Value::clear ()
|
|||||||
|
|
||||||
if (cached.str.ptr != QSE_NULL)
|
if (cached.str.ptr != QSE_NULL)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_free (run->rtx, cached.str.ptr);
|
qse_awk_rtx_freemem (run->rtx, cached.str.ptr);
|
||||||
cached.str.ptr = QSE_NULL;
|
cached.str.ptr = QSE_NULL;
|
||||||
cached.str.len = 0;
|
cached.str.len = 0;
|
||||||
}
|
}
|
||||||
@ -485,7 +485,7 @@ int Awk::Value::setVal (Run* r, val_t* v)
|
|||||||
qse_awk_rtx_refdownval (this->run->rtx, val);
|
qse_awk_rtx_refdownval (this->run->rtx, val);
|
||||||
if (cached.str.ptr != QSE_NULL)
|
if (cached.str.ptr != QSE_NULL)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_free (this->run->rtx, cached.str.ptr);
|
qse_awk_rtx_freemem (this->run->rtx, cached.str.ptr);
|
||||||
cached.str.ptr = QSE_NULL;
|
cached.str.ptr = QSE_NULL;
|
||||||
cached.str.len = 0;
|
cached.str.len = 0;
|
||||||
}
|
}
|
||||||
@ -1062,7 +1062,7 @@ static void free_function_map_value (
|
|||||||
Awk::htb_t* map, void* dptr, Awk::size_t dlen)
|
Awk::htb_t* map, void* dptr, Awk::size_t dlen)
|
||||||
{
|
{
|
||||||
Awk* awk = *(Awk**) QSE_XTN (map);
|
Awk* awk = *(Awk**) QSE_XTN (map);
|
||||||
qse_awk_free ((Awk::awk_t*)*awk, dptr);
|
qse_awk_freemem ((Awk::awk_t*)*awk, dptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Awk::open ()
|
int Awk::open ()
|
||||||
@ -1214,7 +1214,7 @@ int Awk::call (
|
|||||||
if (nargs <= QSE_COUNTOF(buf)) ptr = buf;
|
if (nargs <= QSE_COUNTOF(buf)) ptr = buf;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ptr = (val_t**) qse_awk_alloc (
|
ptr = (val_t**) qse_awk_allocmem (
|
||||||
awk, QSE_SIZEOF(val_t*) * nargs);
|
awk, QSE_SIZEOF(val_t*) * nargs);
|
||||||
if (ptr == QSE_NULL)
|
if (ptr == QSE_NULL)
|
||||||
{
|
{
|
||||||
@ -1229,7 +1229,7 @@ int Awk::call (
|
|||||||
|
|
||||||
val_t* rv = qse_awk_rtx_call (runctx.rtx, name, ptr, nargs);
|
val_t* rv = qse_awk_rtx_call (runctx.rtx, name, ptr, nargs);
|
||||||
|
|
||||||
if (ptr != QSE_NULL && ptr != buf) qse_awk_free (awk, ptr);
|
if (ptr != QSE_NULL && ptr != buf) qse_awk_freemem (awk, ptr);
|
||||||
|
|
||||||
if (rv == QSE_NULL)
|
if (rv == QSE_NULL)
|
||||||
{
|
{
|
||||||
@ -1409,7 +1409,7 @@ int Awk::xstrs_t::add (awk_t* awk, const char_t* arg, size_t len)
|
|||||||
size_t capa = this->capa;
|
size_t capa = this->capa;
|
||||||
|
|
||||||
capa += 64;
|
capa += 64;
|
||||||
ptr = (qse_xstr_t*) qse_awk_realloc (
|
ptr = (qse_xstr_t*) qse_awk_reallocmem (
|
||||||
awk, this->ptr, QSE_SIZEOF(qse_xstr_t)*(capa+1));
|
awk, this->ptr, QSE_SIZEOF(qse_xstr_t)*(capa+1));
|
||||||
if (ptr == QSE_NULL) return -1;
|
if (ptr == QSE_NULL) return -1;
|
||||||
|
|
||||||
@ -1433,9 +1433,9 @@ void Awk::xstrs_t::clear (awk_t* awk)
|
|||||||
if (this->ptr != QSE_NULL)
|
if (this->ptr != QSE_NULL)
|
||||||
{
|
{
|
||||||
while (this->len > 0)
|
while (this->len > 0)
|
||||||
qse_awk_free (awk, this->ptr[--this->len].ptr);
|
qse_awk_freemem (awk, this->ptr[--this->len].ptr);
|
||||||
|
|
||||||
qse_awk_free (awk, this->ptr);
|
qse_awk_freemem (awk, this->ptr);
|
||||||
this->ptr = QSE_NULL;
|
this->ptr = QSE_NULL;
|
||||||
this->capa = 0;
|
this->capa = 0;
|
||||||
}
|
}
|
||||||
@ -1517,7 +1517,7 @@ int Awk::addFunction (
|
|||||||
QSE_ASSERT (awk != QSE_NULL);
|
QSE_ASSERT (awk != QSE_NULL);
|
||||||
|
|
||||||
FunctionHandler* tmp = (FunctionHandler*)
|
FunctionHandler* tmp = (FunctionHandler*)
|
||||||
qse_awk_alloc (awk, QSE_SIZEOF(handler));
|
qse_awk_allocmem (awk, QSE_SIZEOF(handler));
|
||||||
if (tmp == QSE_NULL)
|
if (tmp == QSE_NULL)
|
||||||
{
|
{
|
||||||
setError (QSE_AWK_ENOMEM);
|
setError (QSE_AWK_ENOMEM);
|
||||||
@ -1540,7 +1540,7 @@ int Awk::addFunction (
|
|||||||
functionHandler);
|
functionHandler);
|
||||||
if (p == QSE_NULL)
|
if (p == QSE_NULL)
|
||||||
{
|
{
|
||||||
qse_awk_free (awk, tmp);
|
qse_awk_freemem (awk, tmp);
|
||||||
retrieveError ();
|
retrieveError ();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1550,7 +1550,7 @@ int Awk::addFunction (
|
|||||||
if (pair == QSE_NULL)
|
if (pair == QSE_NULL)
|
||||||
{
|
{
|
||||||
qse_awk_delfnc (awk, name, nameLen);
|
qse_awk_delfnc (awk, name, nameLen);
|
||||||
qse_awk_free (awk, tmp);
|
qse_awk_freemem (awk, tmp);
|
||||||
|
|
||||||
setError (QSE_AWK_ENOMEM);
|
setError (QSE_AWK_ENOMEM);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: StdAwk.cpp 480 2011-05-25 14:00:19Z hyunghwan.chung $
|
* $Id: StdAwk.cpp 510 2011-07-20 16:17:16Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -114,7 +114,7 @@ int StdAwk::system (Run& run, Value& ret, const Value* args, size_t nargs,
|
|||||||
#elif defined(QSE_CHAR_IS_MCHAR)
|
#elif defined(QSE_CHAR_IS_MCHAR)
|
||||||
return ret.setInt ((long_t)::system(ptr));
|
return ret.setInt ((long_t)::system(ptr));
|
||||||
#else
|
#else
|
||||||
char* mbs = (char*) qse_awk_alloc ((awk_t*)(Awk*)run, l*5+1);
|
char* mbs = (char*) qse_awk_allocmem ((awk_t*)(Awk*)run, l*5+1);
|
||||||
if (mbs == QSE_NULL) return -1;
|
if (mbs == QSE_NULL) return -1;
|
||||||
|
|
||||||
/* at this point, the string is guaranteed to be
|
/* at this point, the string is guaranteed to be
|
||||||
@ -126,14 +126,14 @@ int StdAwk::system (Run& run, Value& ret, const Value* args, size_t nargs,
|
|||||||
{
|
{
|
||||||
/* not the entire string is converted.
|
/* not the entire string is converted.
|
||||||
* mbs is not null-terminated properly. */
|
* mbs is not null-terminated properly. */
|
||||||
qse_awk_free ((awk_t*)(Awk*)run, mbs);
|
qse_awk_freemem ((awk_t*)(Awk*)run, mbs);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
mbs[mbl] = '\0';
|
mbs[mbl] = '\0';
|
||||||
int n = ret.setInt ((long_t)::system(mbs));
|
int n = ret.setInt ((long_t)::system(mbs));
|
||||||
|
|
||||||
qse_awk_free ((awk_t*)(Awk*)run, mbs);
|
qse_awk_freemem ((awk_t*)(Awk*)run, mbs);
|
||||||
return n;
|
return n;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -381,7 +381,7 @@ int StdAwk::open_console_in (Console& io)
|
|||||||
if (out.u.cpldup.len == 0)
|
if (out.u.cpldup.len == 0)
|
||||||
{
|
{
|
||||||
/* the name is empty */
|
/* the name is empty */
|
||||||
qse_awk_rtx_free (rtx, out.u.cpldup.ptr);
|
qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr);
|
||||||
runarg_index++;
|
runarg_index++;
|
||||||
goto nextfile;
|
goto nextfile;
|
||||||
}
|
}
|
||||||
@ -393,7 +393,7 @@ int StdAwk::open_console_in (Console& io)
|
|||||||
arg.ptr = out.u.cpldup.ptr;
|
arg.ptr = out.u.cpldup.ptr;
|
||||||
arg.len = qse_strlen (arg.ptr);
|
arg.len = qse_strlen (arg.ptr);
|
||||||
((Run*)io)->setError (QSE_AWK_EIONMNL, &arg);
|
((Run*)io)->setError (QSE_AWK_EIONMNL, &arg);
|
||||||
qse_awk_rtx_free (rtx, out.u.cpldup.ptr);
|
qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -414,7 +414,7 @@ int StdAwk::open_console_in (Console& io)
|
|||||||
arg.ptr = file;
|
arg.ptr = file;
|
||||||
arg.len = qse_strlen (arg.ptr);
|
arg.len = qse_strlen (arg.ptr);
|
||||||
((Run*)io)->setError (QSE_AWK_EOPEN, &arg);
|
((Run*)io)->setError (QSE_AWK_EOPEN, &arg);
|
||||||
qse_awk_rtx_free (rtx, out.u.cpldup.ptr);
|
qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -423,11 +423,11 @@ int StdAwk::open_console_in (Console& io)
|
|||||||
rtx, file, qse_strlen(file)) == -1)
|
rtx, file, qse_strlen(file)) == -1)
|
||||||
{
|
{
|
||||||
if (sio != qse_sio_in) qse_sio_close (sio);
|
if (sio != qse_sio_in) qse_sio_close (sio);
|
||||||
qse_awk_rtx_free (rtx, out.u.cpldup.ptr);
|
qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_awk_rtx_free (rtx, out.u.cpldup.ptr);
|
qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr);
|
||||||
io.setHandle (sio);
|
io.setHandle (sio);
|
||||||
|
|
||||||
/* increment the counter of files successfully opened */
|
/* increment the counter of files successfully opened */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: misc.c 462 2011-05-18 14:36:40Z hyunghwan.chung $
|
* $Id: misc.c 510 2011-07-20 16:17:16Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -20,29 +20,37 @@
|
|||||||
|
|
||||||
#include "awk.h"
|
#include "awk.h"
|
||||||
|
|
||||||
void* qse_awk_alloc (qse_awk_t* awk, qse_size_t size)
|
void* qse_awk_allocmem (qse_awk_t* awk, qse_size_t size)
|
||||||
{
|
{
|
||||||
return QSE_AWK_ALLOC (awk, size);
|
void* ptr = QSE_AWK_ALLOC (awk, size);
|
||||||
|
if (ptr == QSE_NULL) qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
||||||
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* qse_awk_realloc (qse_awk_t* awk, void* ptr, qse_size_t size)
|
void* qse_awk_reallocmem (qse_awk_t* awk, void* ptr, qse_size_t size)
|
||||||
{
|
{
|
||||||
return QSE_AWK_REALLOC (awk, ptr, size);
|
void* nptr = QSE_AWK_REALLOC (awk, ptr, size);
|
||||||
|
if (nptr == QSE_NULL) qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
||||||
|
return nptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void qse_awk_free (qse_awk_t* awk, void* ptr)
|
void qse_awk_freemem (qse_awk_t* awk, void* ptr)
|
||||||
{
|
{
|
||||||
QSE_AWK_FREE (awk, ptr);
|
QSE_AWK_FREE (awk, ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_char_t* qse_awk_strdup (qse_awk_t* awk, const qse_char_t* s)
|
qse_char_t* qse_awk_strdup (qse_awk_t* awk, const qse_char_t* s)
|
||||||
{
|
{
|
||||||
return QSE_AWK_STRDUP (awk, s);
|
qse_char_t* ptr = QSE_AWK_STRDUP (awk, s);
|
||||||
|
if (ptr == QSE_NULL) qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
||||||
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_char_t* qse_awk_strxdup (qse_awk_t* awk, const qse_char_t* s, qse_size_t l)
|
qse_char_t* qse_awk_strxdup (qse_awk_t* awk, const qse_char_t* s, qse_size_t l)
|
||||||
{
|
{
|
||||||
return QSE_AWK_STRXDUP (awk, s, l);
|
qse_char_t* ptr = QSE_AWK_STRXDUP (awk, s, l);
|
||||||
|
if (ptr == QSE_NULL) qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
||||||
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_long_t qse_awk_strxtolong (
|
qse_long_t qse_awk_strxtolong (
|
||||||
@ -1085,18 +1093,18 @@ int qse_awk_matchrex (
|
|||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* qse_awk_rtx_alloc (qse_awk_rtx_t* rtx, qse_size_t size)
|
void* qse_awk_rtx_allocmem (qse_awk_rtx_t* rtx, qse_size_t size)
|
||||||
{
|
{
|
||||||
return qse_awk_alloc (rtx->awk, size);
|
return qse_awk_allocmem (rtx->awk, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* qse_awk_rtx_realloc (qse_awk_rtx_t* rtx, void* ptr, qse_size_t size)
|
void* qse_awk_rtx_reallocmem (qse_awk_rtx_t* rtx, void* ptr, qse_size_t size)
|
||||||
{
|
{
|
||||||
return qse_awk_realloc (rtx->awk, ptr, size);
|
return qse_awk_reallocmem (rtx->awk, ptr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qse_awk_rtx_free (qse_awk_rtx_t* rtx, void* ptr)
|
void qse_awk_rtx_freemem (qse_awk_rtx_t* rtx, void* ptr)
|
||||||
{
|
{
|
||||||
qse_awk_free (rtx->awk, ptr);
|
qse_awk_freemem (rtx->awk, ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: std.c 481 2011-05-25 14:42:26Z hyunghwan.chung $
|
* $Id: std.c 510 2011-07-20 16:17:16Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -1013,7 +1013,7 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod)
|
|||||||
if (out.u.cpldup.len == 0)
|
if (out.u.cpldup.len == 0)
|
||||||
{
|
{
|
||||||
/* the name is empty */
|
/* the name is empty */
|
||||||
qse_awk_rtx_free (rtx, out.u.cpldup.ptr);
|
qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr);
|
||||||
rxtn->c.in.index++;
|
rxtn->c.in.index++;
|
||||||
goto nextfile;
|
goto nextfile;
|
||||||
}
|
}
|
||||||
@ -1031,7 +1031,7 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod)
|
|||||||
qse_awk_rtx_seterrnum (
|
qse_awk_rtx_seterrnum (
|
||||||
rtx, QSE_AWK_EIONMNL, &errarg);
|
rtx, QSE_AWK_EIONMNL, &errarg);
|
||||||
|
|
||||||
qse_awk_rtx_free (rtx, out.u.cpldup.ptr);
|
qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1056,7 +1056,7 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod)
|
|||||||
qse_awk_rtx_seterrnum (
|
qse_awk_rtx_seterrnum (
|
||||||
rtx, QSE_AWK_EOPEN, &errarg);
|
rtx, QSE_AWK_EOPEN, &errarg);
|
||||||
|
|
||||||
qse_awk_rtx_free (rtx, out.u.cpldup.ptr);
|
qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1065,11 +1065,11 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod)
|
|||||||
rtx, file, qse_strlen(file)) <= -1)
|
rtx, file, qse_strlen(file)) <= -1)
|
||||||
{
|
{
|
||||||
if (sio != qse_sio_in) qse_sio_close (sio);
|
if (sio != qse_sio_in) qse_sio_close (sio);
|
||||||
qse_awk_rtx_free (rtx, out.u.cpldup.ptr);
|
qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_awk_rtx_free (rtx, out.u.cpldup.ptr);
|
qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr);
|
||||||
riod->handle = sio;
|
riod->handle = sio;
|
||||||
|
|
||||||
/* increment the counter of files successfully opened */
|
/* increment the counter of files successfully opened */
|
||||||
@ -1465,7 +1465,7 @@ static int fnc_system (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
|||||||
char* mbs;
|
char* mbs;
|
||||||
qse_size_t mbl;
|
qse_size_t mbl;
|
||||||
|
|
||||||
mbs = (char*) qse_awk_alloc (run->awk, len*5+1);
|
mbs = (char*) qse_awk_allocmem (run->awk, len*5+1);
|
||||||
if (mbs == QSE_NULL)
|
if (mbs == QSE_NULL)
|
||||||
{
|
{
|
||||||
n = -1;
|
n = -1;
|
||||||
@ -1489,7 +1489,7 @@ static int fnc_system (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
|||||||
n = system (mbs);
|
n = system (mbs);
|
||||||
|
|
||||||
skip_system_mbs:
|
skip_system_mbs:
|
||||||
qse_awk_free (run->awk, mbs);
|
qse_awk_freemem (run->awk, mbs);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -704,7 +704,7 @@ void qse_xma_free (qse_xma_t* xma, void* b)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void qse_xma_dump (qse_xma_t* xma, qse_xma_dumper_t dumper, void* target)
|
void qse_xma_dump (qse_xma_t* xma, qse_xma_dumper_t dumper, void* ctx)
|
||||||
{
|
{
|
||||||
qse_xma_blk_t* tmp;
|
qse_xma_blk_t* tmp;
|
||||||
qse_ulong_t fsum, asum;
|
qse_ulong_t fsum, asum;
|
||||||
@ -712,31 +712,31 @@ void qse_xma_dump (qse_xma_t* xma, qse_xma_dumper_t dumper, void* target)
|
|||||||
qse_ulong_t isum;
|
qse_ulong_t isum;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
dumper (target, QSE_T("<XMA DUMP>\n"));
|
dumper (ctx, QSE_T("<XMA DUMP>\n"));
|
||||||
|
|
||||||
#ifdef QSE_XMA_ENABLE_STAT
|
#ifdef QSE_XMA_ENABLE_STAT
|
||||||
dumper (target, QSE_T("== statistics ==\n"));
|
dumper (ctx, QSE_T("== statistics ==\n"));
|
||||||
#if QSE_SIZEOF_LONG >= QSE_SIZEOF_LONG_LONG
|
#if QSE_SIZEOF_LONG >= QSE_SIZEOF_LONG_LONG
|
||||||
dumper (target, QSE_T("total = %lu\n"), (unsigned long)xma->stat.total);
|
dumper (ctx, QSE_T("total = %lu\n"), (unsigned long)xma->stat.total);
|
||||||
dumper (target, QSE_T("alloc = %lu\n"), (unsigned long)xma->stat.alloc);
|
dumper (ctx, QSE_T("alloc = %lu\n"), (unsigned long)xma->stat.alloc);
|
||||||
dumper (target, QSE_T("avail = %lu\n"), (unsigned long)xma->stat.avail);
|
dumper (ctx, QSE_T("avail = %lu\n"), (unsigned long)xma->stat.avail);
|
||||||
#else
|
#else
|
||||||
dumper (target, QSE_T("total = %llu\n"), (unsigned long long)xma->stat.total);
|
dumper (ctx, QSE_T("total = %llu\n"), (unsigned long long)xma->stat.total);
|
||||||
dumper (target, QSE_T("alloc = %llu\n"), (unsigned long long)xma->stat.alloc);
|
dumper (ctx, QSE_T("alloc = %llu\n"), (unsigned long long)xma->stat.alloc);
|
||||||
dumper (target, QSE_T("avail = %llu\n"), (unsigned long long)xma->stat.avail);
|
dumper (ctx, QSE_T("avail = %llu\n"), (unsigned long long)xma->stat.avail);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
dumper (target, QSE_T("== blocks ==\n"));
|
dumper (ctx, QSE_T("== blocks ==\n"));
|
||||||
dumper (target, QSE_T(" size avail address\n"));
|
dumper (ctx, QSE_T(" size avail address\n"));
|
||||||
for (tmp = xma->head, fsum = 0, asum = 0; tmp; tmp = tmp->b.next)
|
for (tmp = xma->head, fsum = 0, asum = 0; tmp; tmp = tmp->b.next)
|
||||||
{
|
{
|
||||||
#if QSE_SIZEOF_LONG >= QSE_SIZEOF_LONG_LONG
|
#if QSE_SIZEOF_LONG >= QSE_SIZEOF_LONG_LONG
|
||||||
dumper (target, QSE_T(" %-18lu %-5d %p\n"),
|
dumper (ctx, QSE_T(" %-18lu %-5d %p\n"),
|
||||||
(unsigned long)tmp->size, tmp->avail, tmp
|
(unsigned long)tmp->size, tmp->avail, tmp
|
||||||
);
|
);
|
||||||
#else
|
#else
|
||||||
dumper (target, QSE_T(" %-18llu %-5d %p\n"),
|
dumper (ctx, QSE_T(" %-18llu %-5d %p\n"),
|
||||||
(unsigned long long)tmp->size, tmp->avail, tmp
|
(unsigned long long)tmp->size, tmp->avail, tmp
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
@ -748,22 +748,22 @@ void qse_xma_dump (qse_xma_t* xma, qse_xma_dumper_t dumper, void* target)
|
|||||||
isum = (xma->stat.nfree + xma->stat.nused) * HDRSIZE;
|
isum = (xma->stat.nfree + xma->stat.nused) * HDRSIZE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
dumper (target, QSE_T("---------------------------------------\n"));
|
dumper (ctx, QSE_T("---------------------------------------\n"));
|
||||||
#if QSE_SIZEOF_LONG >= QSE_SIZEOF_LONG_LONG
|
#if QSE_SIZEOF_LONG >= QSE_SIZEOF_LONG_LONG
|
||||||
dumper (target, QSE_T("Allocated blocks: %18lu bytes\n"), (unsigned long)asum);
|
dumper (ctx, QSE_T("Allocated blocks: %18lu bytes\n"), (unsigned long)asum);
|
||||||
dumper (target, QSE_T("Available blocks: %18lu bytes\n"), (unsigned long)fsum);
|
dumper (ctx, QSE_T("Available blocks: %18lu bytes\n"), (unsigned long)fsum);
|
||||||
#else
|
#else
|
||||||
dumper (target, QSE_T("Allocated blocks: %18llu bytes\n"), (unsigned long long)asum);
|
dumper (ctx, QSE_T("Allocated blocks: %18llu bytes\n"), (unsigned long long)asum);
|
||||||
dumper (target, QSE_T("Available blocks: %18llu bytes\n"), (unsigned long long)fsum);
|
dumper (ctx, QSE_T("Available blocks: %18llu bytes\n"), (unsigned long long)fsum);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef QSE_XMA_ENABLE_STAT
|
#ifdef QSE_XMA_ENABLE_STAT
|
||||||
#if QSE_SIZEOF_LONG >= QSE_SIZEOF_LONG_LONG
|
#if QSE_SIZEOF_LONG >= QSE_SIZEOF_LONG_LONG
|
||||||
dumper (target, QSE_T("Internal use : %18lu bytes\n"), (unsigned long)isum);
|
dumper (ctx, QSE_T("Internal use : %18lu bytes\n"), (unsigned long)isum);
|
||||||
dumper (target, QSE_T("Total : %18lu bytes\n"), (unsigned long)(asum + fsum + isum));
|
dumper (ctx, QSE_T("Total : %18lu bytes\n"), (unsigned long)(asum + fsum + isum));
|
||||||
#else
|
#else
|
||||||
dumper (target, QSE_T("Internal use : %18llu bytes\n"), (unsigned long long)isum);
|
dumper (ctx, QSE_T("Internal use : %18llu bytes\n"), (unsigned long long)isum);
|
||||||
dumper (target, QSE_T("Total : %18llu bytes\n"), (unsigned long long)(asum + fsum + isum));
|
dumper (ctx, QSE_T("Total : %18llu bytes\n"), (unsigned long long)(asum + fsum + isum));
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -10,7 +10,8 @@ libqsenet_la_SOURCES = \
|
|||||||
http.c \
|
http.c \
|
||||||
htre.c \
|
htre.c \
|
||||||
htrd.c \
|
htrd.c \
|
||||||
httpd.c
|
httpd.c \
|
||||||
|
httpd_task.c
|
||||||
|
|
||||||
libqsenet_la_LDFLAGS = -version-info 1:0:0 -no-undefined -L../cmn -L$(libdir)
|
libqsenet_la_LDFLAGS = -version-info 1:0:0 -no-undefined -L../cmn -L$(libdir)
|
||||||
libqsenet_la_LIBADD = -lqsecmn
|
libqsenet_la_LIBADD = -lqsecmn
|
||||||
|
@ -71,7 +71,8 @@ am__base_list = \
|
|||||||
am__installdirs = "$(DESTDIR)$(libdir)"
|
am__installdirs = "$(DESTDIR)$(libdir)"
|
||||||
LTLIBRARIES = $(lib_LTLIBRARIES)
|
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||||
libqsenet_la_DEPENDENCIES =
|
libqsenet_la_DEPENDENCIES =
|
||||||
am_libqsenet_la_OBJECTS = http.lo htre.lo htrd.lo httpd.lo
|
am_libqsenet_la_OBJECTS = http.lo htre.lo htrd.lo httpd.lo \
|
||||||
|
httpd_task.lo
|
||||||
libqsenet_la_OBJECTS = $(am_libqsenet_la_OBJECTS)
|
libqsenet_la_OBJECTS = $(am_libqsenet_la_OBJECTS)
|
||||||
libqsenet_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
|
libqsenet_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||||
@ -242,7 +243,8 @@ libqsenet_la_SOURCES = \
|
|||||||
http.c \
|
http.c \
|
||||||
htre.c \
|
htre.c \
|
||||||
htrd.c \
|
htrd.c \
|
||||||
httpd.c
|
httpd.c \
|
||||||
|
httpd_task.c
|
||||||
|
|
||||||
libqsenet_la_LDFLAGS = -version-info 1:0:0 -no-undefined -L../cmn -L$(libdir)
|
libqsenet_la_LDFLAGS = -version-info 1:0:0 -no-undefined -L../cmn -L$(libdir)
|
||||||
libqsenet_la_LIBADD = -lqsecmn
|
libqsenet_la_LIBADD = -lqsecmn
|
||||||
@ -324,6 +326,7 @@ distclean-compile:
|
|||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/htre.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/htre.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpd.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpd.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpd_task.Plo@am__quote@
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||||
|
@ -21,11 +21,28 @@
|
|||||||
#include "httpd.h"
|
#include "httpd.h"
|
||||||
#include "../cmn/mem.h"
|
#include "../cmn/mem.h"
|
||||||
#include <qse/cmn/chr.h>
|
#include <qse/cmn/chr.h>
|
||||||
|
#include <qse/cmn/str.h>
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
#include <openssl.h>
|
#include <openssl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <qse/cmn/stdio.h>
|
||||||
|
|
||||||
|
typedef struct htrd_xtn_t htrd_xtn_t;
|
||||||
|
|
||||||
|
struct htrd_xtn_t
|
||||||
|
{
|
||||||
|
qse_size_t client_index;
|
||||||
|
qse_httpd_t* httpd;
|
||||||
|
};
|
||||||
|
|
||||||
QSE_IMPLEMENT_COMMON_FUNCTIONS (httpd)
|
QSE_IMPLEMENT_COMMON_FUNCTIONS (httpd)
|
||||||
|
|
||||||
#define DEFAULT_PORT 80
|
#define DEFAULT_PORT 80
|
||||||
@ -114,46 +131,25 @@ void qse_httpd_setcbs (qse_httpd_t* httpd, qse_httpd_cbs_t* cbs)
|
|||||||
httpd->cbs = cbs;
|
httpd->cbs = cbs;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QSE_INLINE void* httpd_alloc (qse_httpd_t* httpd, qse_size_t n)
|
QSE_INLINE void* qse_httpd_allocmem (qse_httpd_t* httpd, qse_size_t size)
|
||||||
{
|
{
|
||||||
void* ptr = QSE_MMGR_ALLOC (httpd->mmgr, n);
|
void* ptr = QSE_MMGR_ALLOC (httpd->mmgr, size);
|
||||||
if (ptr == QSE_NULL) httpd->errnum = QSE_HTTPD_ENOMEM;
|
if (ptr == QSE_NULL) httpd->errnum = QSE_HTTPD_ENOMEM;
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void httpd_free (qse_httpd_t* httpd, void* ptr)
|
QSE_INLINE void* qse_httpd_reallocmem (qse_httpd_t* httpd, void* ptr, qse_size_t size)
|
||||||
|
{
|
||||||
|
void* nptr = QSE_MMGR_REALLOC (httpd->mmgr, ptr, size);
|
||||||
|
if (nptr == QSE_NULL) httpd->errnum = QSE_HTTPD_ENOMEM;
|
||||||
|
return nptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSE_INLINE void qse_httpd_freemem (qse_httpd_t* httpd, void* ptr)
|
||||||
{
|
{
|
||||||
QSE_MMGR_FREE (httpd->mmgr, ptr);
|
QSE_MMGR_FREE (httpd->mmgr, ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <qse/cmn/mem.h>
|
|
||||||
#include <qse/cmn/str.h>
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <qse/cmn/stdio.h>
|
|
||||||
|
|
||||||
#define MAX_SENDFILE_SIZE 4096
|
|
||||||
//#define MAX_SENDFILE_SIZE 64
|
|
||||||
|
|
||||||
typedef struct htrd_xtn_t htrd_xtn_t;
|
|
||||||
|
|
||||||
struct htrd_xtn_t
|
|
||||||
{
|
|
||||||
qse_size_t client_index;
|
|
||||||
qse_httpd_t* httpd;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int enqueue_task_unlocked (
|
static int enqueue_task_unlocked (
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client,
|
qse_httpd_t* httpd, qse_httpd_client_t* client,
|
||||||
const qse_httpd_task_t* task, qse_size_t xtnsize)
|
const qse_httpd_task_t* task, qse_size_t xtnsize)
|
||||||
@ -167,12 +163,8 @@ static int enqueue_task_unlocked (
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
node = QSE_MMGR_ALLOC (httpd->mmgr, QSE_SIZEOF(*node) + xtnsize);
|
node = qse_httpd_allocmem (httpd, QSE_SIZEOF(*node) + xtnsize);
|
||||||
if (node == QSE_NULL)
|
if (node == QSE_NULL) return -1;
|
||||||
{
|
|
||||||
httpd->errnum = QSE_HTTPD_ENOMEM;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
node->task = *task;
|
node->task = *task;
|
||||||
|
|
||||||
@ -183,7 +175,7 @@ static int enqueue_task_unlocked (
|
|||||||
{
|
{
|
||||||
if (httpd->errnum == QSE_HTTPD_ENOERR)
|
if (httpd->errnum == QSE_HTTPD_ENOERR)
|
||||||
httpd->errnum = QSE_HTTPD_ETASK;
|
httpd->errnum = QSE_HTTPD_ETASK;
|
||||||
QSE_MMGR_FREE (httpd->mmgr, node);
|
qse_httpd_freemem (httpd, node);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -237,7 +229,7 @@ static int dequeue_task_unlocked (
|
|||||||
client->task.queue.count--;
|
client->task.queue.count--;
|
||||||
|
|
||||||
if (node->task.fini) node->task.fini (httpd, client, &node->task);
|
if (node->task.fini) node->task.fini (httpd, client, &node->task);
|
||||||
QSE_MMGR_FREE (httpd->mmgr, node);
|
qse_httpd_freemem (httpd, node);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -633,7 +625,7 @@ static void fini_client_array (qse_httpd_t* httpd)
|
|||||||
for (fd = 0; fd < array->capa; fd++)
|
for (fd = 0; fd < array->capa; fd++)
|
||||||
delete_from_client_array (httpd, fd);
|
delete_from_client_array (httpd, fd);
|
||||||
|
|
||||||
free (array->data);
|
qse_httpd_freemem (httpd, array->data);
|
||||||
array->capa = 0;
|
array->capa = 0;
|
||||||
array->size = 0;
|
array->size = 0;
|
||||||
array->data = QSE_NULL;
|
array->data = QSE_NULL;
|
||||||
@ -651,7 +643,7 @@ static qse_httpd_client_t* insert_into_client_array (qse_httpd_t* httpd, int fd,
|
|||||||
qse_httpd_client_t* tmp;
|
qse_httpd_client_t* tmp;
|
||||||
qse_size_t capa = ((fd + ALIGN) / ALIGN) * ALIGN;
|
qse_size_t capa = ((fd + ALIGN) / ALIGN) * ALIGN;
|
||||||
|
|
||||||
tmp = realloc (array->data, capa * QSE_SIZEOF(*tmp));
|
tmp = qse_httpd_reallocmem (httpd, array->data, capa * QSE_SIZEOF(*tmp));
|
||||||
if (tmp == QSE_NULL) return QSE_NULL;
|
if (tmp == QSE_NULL) return QSE_NULL;
|
||||||
|
|
||||||
QSE_MEMSET (&tmp[array->capa], 0,
|
QSE_MEMSET (&tmp[array->capa], 0,
|
||||||
@ -1012,9 +1004,9 @@ oops:
|
|||||||
|
|
||||||
static void free_listener (qse_httpd_t* httpd, listener_t* l)
|
static void free_listener (qse_httpd_t* httpd, listener_t* l)
|
||||||
{
|
{
|
||||||
if (l->host) QSE_MMGR_FREE (httpd->mmgr, l->host);
|
if (l->host) qse_httpd_freemem (httpd, l->host);
|
||||||
if (l->handle >= 0) close (l->handle);
|
if (l->handle >= 0) close (l->handle);
|
||||||
QSE_MMGR_FREE (httpd->mmgr, l);
|
qse_httpd_freemem (httpd, l);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_listener_list (qse_httpd_t* httpd, listener_t* l)
|
static void free_listener_list (qse_httpd_t* httpd, listener_t* l)
|
||||||
@ -1042,7 +1034,7 @@ static listener_t* parse_listener_string (
|
|||||||
/* skip spaces */
|
/* skip spaces */
|
||||||
while (QSE_ISSPACE(*p)) p++;
|
while (QSE_ISSPACE(*p)) p++;
|
||||||
|
|
||||||
ltmp = httpd_alloc (httpd, QSE_SIZEOF(*ltmp));
|
ltmp = qse_httpd_allocmem (httpd, QSE_SIZEOF(*ltmp));
|
||||||
if (ltmp == QSE_NULL) goto oops; /* alloc set error number. so goto oops */
|
if (ltmp == QSE_NULL) goto oops; /* alloc set error number. so goto oops */
|
||||||
|
|
||||||
QSE_MEMSET (ltmp, 0, QSE_SIZEOF(*ltmp));
|
QSE_MEMSET (ltmp, 0, QSE_SIZEOF(*ltmp));
|
||||||
@ -1112,7 +1104,7 @@ static listener_t* parse_listener_string (
|
|||||||
|
|
||||||
x = inet_pton (ltmp->family, host, <mp->addr);
|
x = inet_pton (ltmp->family, host, <mp->addr);
|
||||||
#ifdef QSE_CHAR_IS_WCHAR
|
#ifdef QSE_CHAR_IS_WCHAR
|
||||||
httpd_free (httpd, host);
|
qse_httpd_freemem (httpd, host);
|
||||||
#endif
|
#endif
|
||||||
if (x != 1)
|
if (x != 1)
|
||||||
{
|
{
|
||||||
@ -1249,246 +1241,3 @@ int qse_httpd_entask (
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
typedef struct task_sendtext_t task_sendtext_t;
|
|
||||||
struct task_sendtext_t
|
|
||||||
{
|
|
||||||
const qse_mchar_t* ptr;
|
|
||||||
qse_size_t left;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int httpd_init_sendtext (
|
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
|
||||||
{
|
|
||||||
task_sendtext_t* xtn = qse_httpd_gettaskxtn (httpd, task);
|
|
||||||
|
|
||||||
QSE_MEMCPY (xtn, task->ctx, QSE_SIZEOF(*xtn));
|
|
||||||
QSE_MEMCPY (xtn + 1, xtn->ptr, xtn->left);
|
|
||||||
xtn->ptr = (qse_mchar_t*)(xtn + 1);
|
|
||||||
|
|
||||||
task->ctx = xtn;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int httpd_main_sendtext (
|
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
|
||||||
{
|
|
||||||
ssize_t n;
|
|
||||||
size_t count;
|
|
||||||
task_sendtext_t* ctx = (task_sendtext_t*)task->ctx;
|
|
||||||
|
|
||||||
count = MAX_SENDFILE_SIZE;
|
|
||||||
if (count >= ctx->left) count = ctx->left;
|
|
||||||
|
|
||||||
n = send (
|
|
||||||
client->fd,
|
|
||||||
ctx->ptr,
|
|
||||||
count,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
|
|
||||||
if (n <= -1) return -1;
|
|
||||||
|
|
||||||
ctx->left -= n;
|
|
||||||
if (ctx->left <= 0) return 0;
|
|
||||||
|
|
||||||
ctx->ptr += n;
|
|
||||||
return 1; /* more work to do */
|
|
||||||
}
|
|
||||||
|
|
||||||
int qse_httpd_entasksendtext (
|
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, const qse_mchar_t* text)
|
|
||||||
{
|
|
||||||
qse_httpd_task_t task;
|
|
||||||
task_sendtext_t data;
|
|
||||||
|
|
||||||
QSE_MEMSET (&data, 0, QSE_SIZEOF(data));
|
|
||||||
data.ptr = text;
|
|
||||||
data.left = qse_mbslen(text);
|
|
||||||
|
|
||||||
QSE_MEMSET (&task, 0, QSE_SIZEOF(task));
|
|
||||||
task.init = httpd_init_sendtext;
|
|
||||||
task.main = httpd_main_sendtext;
|
|
||||||
task.ctx = &data;
|
|
||||||
|
|
||||||
return qse_httpd_entask (
|
|
||||||
httpd, client, &task, QSE_SIZEOF(data) + data.left);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* TODO: send wide character string when QSE_CHAR_IS_WCHAR */
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
typedef struct task_sendfmt_t task_sendfmt_t;
|
|
||||||
struct task_sendfmt_t
|
|
||||||
{
|
|
||||||
qse_mchar_t* org;
|
|
||||||
const qse_mchar_t* ptr;
|
|
||||||
qse_size_t left;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int httpd_init_sendfmt (
|
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
|
||||||
{
|
|
||||||
task_sendfmt_t* xtn = qse_httpd_gettaskxtn (httpd, task);
|
|
||||||
|
|
||||||
QSE_MEMCPY (xtn, task->ctx, QSE_SIZEOF(*xtn));
|
|
||||||
task->ctx = xtn;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void httpd_fini_sendfmt (
|
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
|
||||||
{
|
|
||||||
task_sendfmt_t* ctx = (task_sendfmt_t*)task->ctx;
|
|
||||||
httpd_free (httpd, ctx->org);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int httpd_main_sendfmt (
|
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
|
||||||
{
|
|
||||||
ssize_t n;
|
|
||||||
size_t count;
|
|
||||||
task_sendfmt_t* ctx = (task_sendfmt_t*)task->ctx;
|
|
||||||
|
|
||||||
count = MAX_SENDFILE_SIZE;
|
|
||||||
if (count >= ctx->left) count = ctx->left;
|
|
||||||
|
|
||||||
n = send (
|
|
||||||
client->fd,
|
|
||||||
ctx->ptr,
|
|
||||||
count,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
|
|
||||||
if (n <= -1) return -1;
|
|
||||||
|
|
||||||
ctx->left -= n;
|
|
||||||
if (ctx->left <= 0) return 0;
|
|
||||||
|
|
||||||
ctx->ptr += n;
|
|
||||||
return 1; /* more work to do */
|
|
||||||
}
|
|
||||||
|
|
||||||
int qse_httpd_entasksendfmt (
|
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, const qse_mchar_t* fmt, ...)
|
|
||||||
{
|
|
||||||
qse_httpd_task_t task;
|
|
||||||
task_sendfmt_t data;
|
|
||||||
|
|
||||||
va_list ap;
|
|
||||||
qse_mchar_t n[2];
|
|
||||||
qse_mchar_t* buf;
|
|
||||||
int bytes_req, l;
|
|
||||||
|
|
||||||
va_start (ap, fmt);
|
|
||||||
#if defined(_WIN32) && defined(_MSC_VER)
|
|
||||||
bytes_req = _vsnprintf (n, 1, fmt, ap);
|
|
||||||
#else
|
|
||||||
bytes_req = vsnprintf (n, 1, fmt, ap);
|
|
||||||
#endif
|
|
||||||
va_end (ap);
|
|
||||||
|
|
||||||
if (bytes_req == -1)
|
|
||||||
{
|
|
||||||
qse_size_t capa = 256;
|
|
||||||
|
|
||||||
buf = (qse_mchar_t*) httpd_alloc (httpd, (capa + 1) * QSE_SIZEOF(*buf));
|
|
||||||
if (buf == QSE_NULL) return -1;
|
|
||||||
|
|
||||||
/* an old vsnprintf behaves differently from C99 standard.
|
|
||||||
* thus, it returns -1 when it can't write all the input given. */
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
va_start (ap, fmt);
|
|
||||||
#if defined(_WIN32) && defined(_MSC_VER)
|
|
||||||
l = _vsnprintf (buf, capa + 1, fmt, ap);
|
|
||||||
#else
|
|
||||||
l = vsnprintf (buf, capa + 1, fmt, ap);
|
|
||||||
#endif
|
|
||||||
va_end (ap);
|
|
||||||
|
|
||||||
if (l == -1)
|
|
||||||
{
|
|
||||||
httpd_free (httpd, buf);
|
|
||||||
|
|
||||||
capa = capa * 2;
|
|
||||||
buf = (qse_mchar_t*) httpd_alloc (httpd, (capa + 1) * QSE_SIZEOF(*buf));
|
|
||||||
if (buf == QSE_NULL) return -1;
|
|
||||||
}
|
|
||||||
else break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* vsnprintf returns the number of characters that would
|
|
||||||
* have been written not including the terminating '\0'
|
|
||||||
* if the _data buffer were large enough */
|
|
||||||
buf = (qse_mchar_t*) httpd_alloc (httpd, (bytes_req + 1) * QSE_SIZEOF(*buf));
|
|
||||||
if (buf == QSE_NULL) return -1;
|
|
||||||
|
|
||||||
va_start (ap, fmt);
|
|
||||||
#if defined(_WIN32) && defined(_MSC_VER)
|
|
||||||
l = _vsnprintf (buf, bytes_req + 1, fmt, ap);
|
|
||||||
#else
|
|
||||||
l = vsnprintf (buf, bytes_req + 1, fmt, ap);
|
|
||||||
#endif
|
|
||||||
va_end (ap);
|
|
||||||
|
|
||||||
if (l != bytes_req)
|
|
||||||
{
|
|
||||||
/* something got wrong ... */
|
|
||||||
httpd_free (httpd, buf);
|
|
||||||
|
|
||||||
httpd->errnum = QSE_HTTPD_EINTERN;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QSE_MEMSET (&data, 0, QSE_SIZEOF(data));
|
|
||||||
data.org = buf;
|
|
||||||
data.ptr = buf;
|
|
||||||
data.left = l;
|
|
||||||
|
|
||||||
QSE_MEMSET (&task, 0, QSE_SIZEOF(task));
|
|
||||||
task.init = httpd_init_sendfmt;
|
|
||||||
task.fini = httpd_fini_sendfmt;
|
|
||||||
task.main = httpd_main_sendfmt;
|
|
||||||
task.ctx = &data;
|
|
||||||
|
|
||||||
return qse_httpd_entask (
|
|
||||||
httpd, client, &task, QSE_SIZEOF(data));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO: send wide character string when QSE_CHAR_IS_WCHAR */
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
int qse_httpd_entasksendfile (
|
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, int fd)
|
|
||||||
{
|
|
||||||
/* TODO: */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
static int task_main_disconnect (
|
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
|
||||||
{
|
|
||||||
shutdown (client->fd, SHUT_RDWR);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qse_httpd_entaskdisconnect (qse_httpd_t* httpd, qse_httpd_client_t* client)
|
|
||||||
{
|
|
||||||
qse_httpd_task_t task;
|
|
||||||
|
|
||||||
QSE_MEMSET (&task, 0, QSE_SIZEOF(task));
|
|
||||||
task.main = task_main_disconnect;
|
|
||||||
|
|
||||||
return qse_httpd_entask (httpd, client, &task, 0);
|
|
||||||
}
|
|
||||||
|
379
qse/lib/net/httpd_task.c
Normal file
379
qse/lib/net/httpd_task.c
Normal file
@ -0,0 +1,379 @@
|
|||||||
|
#include "httpd.h"
|
||||||
|
#include "../cmn/mem.h"
|
||||||
|
#include <qse/cmn/str.h>
|
||||||
|
#include <qse/cmn/pio.h>
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_SENDFILE_H
|
||||||
|
#include <sys/sendfile.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define MAX_SENDFILE_SIZE 4096
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static int task_main_disconnect (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
||||||
|
{
|
||||||
|
shutdown (client->fd, SHUT_RDWR);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int qse_httpd_entaskdisconnect (qse_httpd_t* httpd, qse_httpd_client_t* client)
|
||||||
|
{
|
||||||
|
qse_httpd_task_t task;
|
||||||
|
|
||||||
|
QSE_MEMSET (&task, 0, QSE_SIZEOF(task));
|
||||||
|
task.main = task_main_disconnect;
|
||||||
|
|
||||||
|
return qse_httpd_entask (httpd, client, &task, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
typedef struct task_sendtext_t task_sendtext_t;
|
||||||
|
struct task_sendtext_t
|
||||||
|
{
|
||||||
|
const qse_mchar_t* ptr;
|
||||||
|
qse_size_t left;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int httpd_init_sendtext (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
||||||
|
{
|
||||||
|
task_sendtext_t* xtn = qse_httpd_gettaskxtn (httpd, task);
|
||||||
|
|
||||||
|
QSE_MEMCPY (xtn, task->ctx, QSE_SIZEOF(*xtn));
|
||||||
|
QSE_MEMCPY (xtn + 1, xtn->ptr, xtn->left);
|
||||||
|
xtn->ptr = (qse_mchar_t*)(xtn + 1);
|
||||||
|
|
||||||
|
task->ctx = xtn;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int httpd_main_sendtext (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
||||||
|
{
|
||||||
|
ssize_t n;
|
||||||
|
size_t count;
|
||||||
|
task_sendtext_t* ctx = (task_sendtext_t*)task->ctx;
|
||||||
|
|
||||||
|
count = MAX_SENDFILE_SIZE;
|
||||||
|
if (count >= ctx->left) count = ctx->left;
|
||||||
|
|
||||||
|
n = send (
|
||||||
|
client->fd,
|
||||||
|
ctx->ptr,
|
||||||
|
count,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
if (n <= -1) return -1;
|
||||||
|
|
||||||
|
ctx->left -= n;
|
||||||
|
if (ctx->left <= 0) return 0;
|
||||||
|
|
||||||
|
ctx->ptr += n;
|
||||||
|
return 1; /* more work to do */
|
||||||
|
}
|
||||||
|
|
||||||
|
int qse_httpd_entasksendtext (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client, const qse_mchar_t* text)
|
||||||
|
{
|
||||||
|
qse_httpd_task_t task;
|
||||||
|
task_sendtext_t data;
|
||||||
|
|
||||||
|
QSE_MEMSET (&data, 0, QSE_SIZEOF(data));
|
||||||
|
data.ptr = text;
|
||||||
|
data.left = qse_mbslen(text);
|
||||||
|
|
||||||
|
QSE_MEMSET (&task, 0, QSE_SIZEOF(task));
|
||||||
|
task.init = httpd_init_sendtext;
|
||||||
|
task.main = httpd_main_sendtext;
|
||||||
|
task.ctx = &data;
|
||||||
|
|
||||||
|
return qse_httpd_entask (
|
||||||
|
httpd, client, &task, QSE_SIZEOF(data) + data.left);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* TODO: send wide character string when QSE_CHAR_IS_WCHAR */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
typedef struct task_sendfmt_t task_sendfmt_t;
|
||||||
|
struct task_sendfmt_t
|
||||||
|
{
|
||||||
|
qse_mchar_t* org;
|
||||||
|
const qse_mchar_t* ptr;
|
||||||
|
qse_size_t left;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int httpd_init_sendfmt (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
||||||
|
{
|
||||||
|
task_sendfmt_t* xtn = qse_httpd_gettaskxtn (httpd, task);
|
||||||
|
|
||||||
|
QSE_MEMCPY (xtn, task->ctx, QSE_SIZEOF(*xtn));
|
||||||
|
task->ctx = xtn;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void httpd_fini_sendfmt (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
||||||
|
{
|
||||||
|
task_sendfmt_t* ctx = (task_sendfmt_t*)task->ctx;
|
||||||
|
qse_httpd_freemem (httpd, ctx->org);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int httpd_main_sendfmt (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
||||||
|
{
|
||||||
|
ssize_t n;
|
||||||
|
size_t count;
|
||||||
|
task_sendfmt_t* ctx = (task_sendfmt_t*)task->ctx;
|
||||||
|
|
||||||
|
count = MAX_SENDFILE_SIZE;
|
||||||
|
if (count >= ctx->left) count = ctx->left;
|
||||||
|
|
||||||
|
n = send (
|
||||||
|
client->fd,
|
||||||
|
ctx->ptr,
|
||||||
|
count,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
if (n <= -1) return -1;
|
||||||
|
|
||||||
|
ctx->left -= n;
|
||||||
|
if (ctx->left <= 0) return 0;
|
||||||
|
|
||||||
|
ctx->ptr += n;
|
||||||
|
return 1; /* more work to do */
|
||||||
|
}
|
||||||
|
|
||||||
|
int qse_httpd_entasksendfmt (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client, const qse_mchar_t* fmt, ...)
|
||||||
|
{
|
||||||
|
qse_httpd_task_t task;
|
||||||
|
task_sendfmt_t data;
|
||||||
|
|
||||||
|
va_list ap;
|
||||||
|
qse_mchar_t n[2];
|
||||||
|
qse_mchar_t* buf;
|
||||||
|
int bytes_req, l;
|
||||||
|
|
||||||
|
va_start (ap, fmt);
|
||||||
|
#if defined(_WIN32) && defined(_MSC_VER)
|
||||||
|
bytes_req = _vsnprintf (n, 1, fmt, ap);
|
||||||
|
#else
|
||||||
|
bytes_req = vsnprintf (n, 1, fmt, ap);
|
||||||
|
#endif
|
||||||
|
va_end (ap);
|
||||||
|
|
||||||
|
if (bytes_req == -1)
|
||||||
|
{
|
||||||
|
qse_size_t capa = 256;
|
||||||
|
|
||||||
|
buf = (qse_mchar_t*) qse_httpd_allocmem (httpd, (capa + 1) * QSE_SIZEOF(*buf));
|
||||||
|
if (buf == QSE_NULL) return -1;
|
||||||
|
|
||||||
|
/* an old vsnprintf behaves differently from C99 standard.
|
||||||
|
* thus, it returns -1 when it can't write all the input given. */
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
va_start (ap, fmt);
|
||||||
|
#if defined(_WIN32) && defined(_MSC_VER)
|
||||||
|
l = _vsnprintf (buf, capa + 1, fmt, ap);
|
||||||
|
#else
|
||||||
|
l = vsnprintf (buf, capa + 1, fmt, ap);
|
||||||
|
#endif
|
||||||
|
va_end (ap);
|
||||||
|
|
||||||
|
if (l == -1)
|
||||||
|
{
|
||||||
|
qse_httpd_freemem (httpd, buf);
|
||||||
|
|
||||||
|
capa = capa * 2;
|
||||||
|
buf = (qse_mchar_t*) qse_httpd_allocmem (httpd, (capa + 1) * QSE_SIZEOF(*buf));
|
||||||
|
if (buf == QSE_NULL) return -1;
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* vsnprintf returns the number of characters that would
|
||||||
|
* have been written not including the terminating '\0'
|
||||||
|
* if the _data buffer were large enough */
|
||||||
|
buf = (qse_mchar_t*) qse_httpd_allocmem (httpd, (bytes_req + 1) * QSE_SIZEOF(*buf));
|
||||||
|
if (buf == QSE_NULL) return -1;
|
||||||
|
|
||||||
|
va_start (ap, fmt);
|
||||||
|
#if defined(_WIN32) && defined(_MSC_VER)
|
||||||
|
l = _vsnprintf (buf, bytes_req + 1, fmt, ap);
|
||||||
|
#else
|
||||||
|
l = vsnprintf (buf, bytes_req + 1, fmt, ap);
|
||||||
|
#endif
|
||||||
|
va_end (ap);
|
||||||
|
|
||||||
|
if (l != bytes_req)
|
||||||
|
{
|
||||||
|
/* something got wrong ... */
|
||||||
|
qse_httpd_freemem (httpd, buf);
|
||||||
|
|
||||||
|
httpd->errnum = QSE_HTTPD_EINTERN;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QSE_MEMSET (&data, 0, QSE_SIZEOF(data));
|
||||||
|
data.org = buf;
|
||||||
|
data.ptr = buf;
|
||||||
|
data.left = l;
|
||||||
|
|
||||||
|
QSE_MEMSET (&task, 0, QSE_SIZEOF(task));
|
||||||
|
task.init = httpd_init_sendfmt;
|
||||||
|
task.fini = httpd_fini_sendfmt;
|
||||||
|
task.main = httpd_main_sendfmt;
|
||||||
|
task.ctx = &data;
|
||||||
|
|
||||||
|
return qse_httpd_entask (
|
||||||
|
httpd, client, &task, QSE_SIZEOF(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: send wide character string when QSE_CHAR_IS_WCHAR */
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
typedef struct httpd_task_sendfile_t httpd_task_sendfile_t;
|
||||||
|
struct httpd_task_sendfile_t
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
qse_foff_t left;
|
||||||
|
qse_foff_t offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int httpd_init_sendfile (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
||||||
|
{
|
||||||
|
httpd_task_sendfile_t* xtn = qse_httpd_gettaskxtn (httpd, task);
|
||||||
|
QSE_MEMCPY (xtn, task->ctx, QSE_SIZEOF(*xtn));
|
||||||
|
task->ctx = xtn;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void httpd_fini_sendfile (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
||||||
|
{
|
||||||
|
httpd_task_sendfile_t* ctx = (httpd_task_sendfile_t*)task->ctx;
|
||||||
|
close (ctx->fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int httpd_main_sendfile (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
||||||
|
{
|
||||||
|
ssize_t n;
|
||||||
|
size_t count;
|
||||||
|
httpd_task_sendfile_t* ctx = (httpd_task_sendfile_t*)task->ctx;
|
||||||
|
|
||||||
|
count = MAX_SENDFILE_SIZE;
|
||||||
|
if (count >= ctx->left) count = ctx->left;
|
||||||
|
|
||||||
|
n = sendfile (
|
||||||
|
client->fd,
|
||||||
|
ctx->fd,
|
||||||
|
&ctx->offset,
|
||||||
|
count
|
||||||
|
);
|
||||||
|
|
||||||
|
if (n <= -1) return -1;
|
||||||
|
|
||||||
|
ctx->left -= n;
|
||||||
|
if (ctx->left <= 0) return 0;
|
||||||
|
|
||||||
|
return 1; /* more work to do */
|
||||||
|
}
|
||||||
|
|
||||||
|
int qse_httpd_entasksendfile (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client,
|
||||||
|
int fd, qse_foff_t offset, qse_foff_t size)
|
||||||
|
{
|
||||||
|
qse_httpd_task_t task;
|
||||||
|
httpd_task_sendfile_t data;
|
||||||
|
|
||||||
|
QSE_MEMSET (&data, 0, QSE_SIZEOF(data));
|
||||||
|
data.fd = fd;
|
||||||
|
data.offset = offset;
|
||||||
|
data.left = size;
|
||||||
|
|
||||||
|
QSE_MEMSET (&task, 0, QSE_SIZEOF(task));
|
||||||
|
task.init = httpd_init_sendfile;
|
||||||
|
task.main = httpd_main_sendfile;
|
||||||
|
task.fini = httpd_fini_sendfile;
|
||||||
|
task.ctx = &data;
|
||||||
|
|
||||||
|
return qse_httpd_entask (httpd, client, &task, QSE_SIZEOF(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
typedef struct httpd_task_cgi_t httpd_task_cgi_t;
|
||||||
|
struct httpd_task_cgi_t
|
||||||
|
{
|
||||||
|
qse_pio_t* pio;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int httpd_init_cgi (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
||||||
|
{
|
||||||
|
httpd_task_cgi_t* xtn = qse_httpd_gettaskxtn (httpd, task);
|
||||||
|
|
||||||
|
QSE_MEMSET (xtn, 0, QSE_SIZEOF(*xtn));
|
||||||
|
xtn->pio = qse_pio_open (httpd->mmgr, task->ctx);
|
||||||
|
if (xtn->pio == QSE_NULL)
|
||||||
|
{
|
||||||
|
httpd->errnum = QSE_HTTPD_ECGI;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
task->ctx = xtn;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void httpd_fini_cgi (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
||||||
|
{
|
||||||
|
httpd_task_cgi_t* xtn = task->ctx;
|
||||||
|
qse_pio_close (xtn->pio);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void httpd_main_cgi (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
||||||
|
{
|
||||||
|
/* TODO */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int qse_httpd_entaskcgi (
|
||||||
|
qse_httpd_t* httpd, qse_httpd_client_t* client, const qse_char_t* path)
|
||||||
|
{
|
||||||
|
qse_httpd_task_t task;
|
||||||
|
httpd_task_cgi_t data;
|
||||||
|
|
||||||
|
QSE_MEMSET (&task, 0, QSE_SIZEOF(task));
|
||||||
|
task.init = httpd_init_cgi;
|
||||||
|
task.main = httpd_main_cgi;
|
||||||
|
task.fini = httpd_fini_cgi;
|
||||||
|
task.ctx = path;
|
||||||
|
|
||||||
|
return qse_httpd_entask (httpd, client, &task, QSE_SIZEOF(data));
|
||||||
|
}
|
||||||
|
#endif
|
@ -17,82 +17,6 @@ struct httpd_xtn_t
|
|||||||
const qse_httpd_cbs_t* orgcbs;
|
const qse_httpd_cbs_t* orgcbs;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct httpd_task_sendfile_t httpd_task_sendfile_t;
|
|
||||||
struct httpd_task_sendfile_t
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
qse_foff_t left;
|
|
||||||
qse_foff_t offset;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct httpd_task_sendtext_t httpd_task_sendtext_t;
|
|
||||||
struct httpd_task_sendtext_t
|
|
||||||
{
|
|
||||||
const qse_mchar_t* ptr;
|
|
||||||
qse_size_t left;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int httpd_init_sendfile (
|
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
|
||||||
{
|
|
||||||
httpd_task_sendfile_t* xtn = qse_httpd_gettaskxtn (httpd, task);
|
|
||||||
memcpy (xtn, task->ctx, QSE_SIZEOF(*xtn));
|
|
||||||
task->ctx = xtn;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void httpd_fini_sendfile (
|
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
|
||||||
{
|
|
||||||
httpd_task_sendfile_t* ctx = (httpd_task_sendfile_t*)task->ctx;
|
|
||||||
close (ctx->fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int httpd_main_sendfile (
|
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
|
||||||
{
|
|
||||||
ssize_t n;
|
|
||||||
size_t count;
|
|
||||||
httpd_task_sendfile_t* ctx = (httpd_task_sendfile_t*)task->ctx;
|
|
||||||
|
|
||||||
count = MAX_SENDFILE_SIZE;
|
|
||||||
if (count >= ctx->left) count = ctx->left;
|
|
||||||
|
|
||||||
n = sendfile (
|
|
||||||
/* TODO: client->fd, */ *(int*)client,
|
|
||||||
ctx->fd,
|
|
||||||
&ctx->offset,
|
|
||||||
count
|
|
||||||
);
|
|
||||||
|
|
||||||
if (n <= -1) return -1;
|
|
||||||
|
|
||||||
ctx->left -= n;
|
|
||||||
if (ctx->left <= 0) return 0;
|
|
||||||
|
|
||||||
return 1; /* more work to do */
|
|
||||||
}
|
|
||||||
|
|
||||||
static int entask_sendfile (
|
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, int fd, qse_foff_t size)
|
|
||||||
{
|
|
||||||
qse_httpd_task_t task;
|
|
||||||
httpd_task_sendfile_t data;
|
|
||||||
|
|
||||||
memset (&data, 0, QSE_SIZEOF(data));
|
|
||||||
data.fd = fd;
|
|
||||||
data.left = size;
|
|
||||||
|
|
||||||
memset (&task, 0, QSE_SIZEOF(task));
|
|
||||||
task.init = httpd_init_sendfile;
|
|
||||||
task.main = httpd_main_sendfile;
|
|
||||||
task.fini = httpd_fini_sendfile;
|
|
||||||
task.ctx = &data;
|
|
||||||
|
|
||||||
return qse_httpd_entask (httpd, client, &task, QSE_SIZEOF(data));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static qse_htb_walk_t walk (qse_htb_t* htb, qse_htb_pair_t* pair, void* ctx)
|
static qse_htb_walk_t walk (qse_htb_t* htb, qse_htb_pair_t* pair, void* ctx)
|
||||||
{
|
{
|
||||||
qse_printf (QSE_T("HEADER OK %d[%S] %d[%S]\n"), (int)QSE_HTB_KLEN(pair), QSE_HTB_KPTR(pair), (int)QSE_HTB_VLEN(pair), QSE_HTB_VPTR(pair));
|
qse_printf (QSE_T("HEADER OK %d[%S] %d[%S]\n"), (int)QSE_HTB_KLEN(pair), QSE_HTB_KPTR(pair), (int)QSE_HTB_VLEN(pair), QSE_HTB_VPTR(pair));
|
||||||
@ -177,7 +101,7 @@ snprintf (text, sizeof(text),
|
|||||||
);
|
);
|
||||||
if (n <= -1) return -1;
|
if (n <= -1) return -1;
|
||||||
|
|
||||||
if (entask_sendfile (httpd, client, fd, st.st_size) <= -1) return -1;
|
if (qse_httpd_entasksendfile (httpd, client, fd, 0, st.st_size) <= -1) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user