changed awk to carry on even if lt_dlinit() fails
This commit is contained in:
		| @ -140,7 +140,7 @@ int qse_awk_init (qse_awk_t* awk, qse_mmgr_t* mmgr, const qse_awk_prm_t* prm) | |||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	/* zero out the object */ | 	/* zero out the object */ | ||||||
| 	QSE_MEMSET (awk, 0, QSE_SIZEOF(qse_awk_t)); | 	QSE_MEMSET (awk, 0, QSE_SIZEOF(*awk)); | ||||||
|  |  | ||||||
| 	/* remember the memory manager */ | 	/* remember the memory manager */ | ||||||
| 	awk->mmgr = mmgr; | 	awk->mmgr = mmgr; | ||||||
|  | |||||||
| @ -114,6 +114,9 @@ typedef struct xtn_t | |||||||
| 	int gbl_environ; | 	int gbl_environ; | ||||||
|  |  | ||||||
| 	qse_awk_ecb_t ecb; | 	qse_awk_ecb_t ecb; | ||||||
|  | #if defined(USE_LTDL) | ||||||
|  | 	int ltdl_fail; | ||||||
|  | #endif | ||||||
| } xtn_t; | } xtn_t; | ||||||
|  |  | ||||||
| typedef struct rxtn_t | typedef struct rxtn_t | ||||||
| @ -184,11 +187,19 @@ qse_awk_flt_t qse_awk_stdmathmod (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t | |||||||
| int qse_awk_stdmodstartup (qse_awk_t* awk) | int qse_awk_stdmodstartup (qse_awk_t* awk) | ||||||
| { | { | ||||||
| #if defined(USE_LTDL) | #if defined(USE_LTDL) | ||||||
|  |  | ||||||
| 	/* lt_dlinit() can be called more than once and  | 	/* lt_dlinit() can be called more than once and  | ||||||
| 	 * lt_dlexit() shuts down libltdl if it's called as many times as | 	 * lt_dlexit() shuts down libltdl if it's called as many times as | ||||||
| 	 * corresponding lt_dlinit(). so it's safe to call lt_dlinit() | 	 * corresponding lt_dlinit(). so it's safe to call lt_dlinit() | ||||||
| 	 * and lt_dlexit() at the library level. */ | 	 * and lt_dlexit() at the library level. */ | ||||||
| 	return (lt_dlinit () != 0)? -1: 0; | 	if (lt_dlinit() != 0) | ||||||
|  | 	{ | ||||||
|  | 		xtn_t* xtn = QSE_XTN(awk); | ||||||
|  | 		xtn->ltdl_fail = 1;  | ||||||
|  | 		/* carry on even if ltdl initialize failed */ | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  |  | ||||||
| #else | #else | ||||||
| 	return 0; | 	return 0; | ||||||
| @ -199,8 +210,8 @@ int qse_awk_stdmodstartup (qse_awk_t* awk) | |||||||
| void qse_awk_stdmodshutdown (qse_awk_t* awk) | void qse_awk_stdmodshutdown (qse_awk_t* awk) | ||||||
| { | { | ||||||
| #if defined(USE_LTDL) | #if defined(USE_LTDL) | ||||||
|  | 	xtn_t* xtn = QSE_XTN(awk); | ||||||
| 	lt_dlexit (); | 	if (!xtn->ltdl_fail) lt_dlexit (); | ||||||
|  |  | ||||||
| #else | #else | ||||||
| 	/* do nothing */ | 	/* do nothing */ | ||||||
| @ -214,6 +225,15 @@ void* qse_awk_stdmodopen (qse_awk_t* awk, const qse_awk_mod_spec_t* spec) | |||||||
| 	qse_mchar_t* modpath; | 	qse_mchar_t* modpath; | ||||||
| 	const qse_char_t* tmp[4]; | 	const qse_char_t* tmp[4]; | ||||||
| 	int count; | 	int count; | ||||||
|  | 	xtn_t* xtn = QSE_XTN(awk); | ||||||
|  |  | ||||||
|  | 	if (xtn->ltdl_fail) | ||||||
|  | 	{ | ||||||
|  | 		/* ltdl_init() failed during initialization. | ||||||
|  | 		 * return failure immediately */ | ||||||
|  | 		qse_awk_seterrnum (awk, QSE_AWK_ENOIMPL, QSE_NULL); | ||||||
|  | 		return QSE_NULL; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	count = 0; | 	count = 0; | ||||||
| 	if (spec->prefix) tmp[count++] = spec->prefix; | 	if (spec->prefix) tmp[count++] = spec->prefix; | ||||||
| @ -364,7 +384,7 @@ void* qse_awk_stdmodsym (qse_awk_t* awk, void* handle, const qse_char_t* name) | |||||||
| #if defined(QSE_CHAR_IS_MCHAR) | #if defined(QSE_CHAR_IS_MCHAR) | ||||||
| 	mname = name; | 	mname = name; | ||||||
| #else | #else | ||||||
| 	mname = qse_wcstombsdup (name, QSE_NULL, awk->mmgr);	 | 	mname = qse_wcstombsdup (name, QSE_NULL, awk->mmgr); | ||||||
| 	if (!mname) | 	if (!mname) | ||||||
| 	{ | 	{ | ||||||
| 		qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL); | 		qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL); | ||||||
| @ -434,6 +454,7 @@ qse_awk_t* qse_awk_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_aw | |||||||
|  |  | ||||||
| 	/* initialize extension */ | 	/* initialize extension */ | ||||||
| 	xtn = (xtn_t*) QSE_XTN (awk); | 	xtn = (xtn_t*) QSE_XTN (awk); | ||||||
|  | 	QSE_MEMSET (xtn, 0, QSE_SIZEOF(*xtn)); | ||||||
|  |  | ||||||
| 	/* add intrinsic global variables and functions */ | 	/* add intrinsic global variables and functions */ | ||||||
| 	if (add_globals(awk) <= -1 || | 	if (add_globals(awk) <= -1 || | ||||||
|  | |||||||
| @ -756,7 +756,7 @@ qse_httpd_t* qse_httpd_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize) | |||||||
| 	if (httpd == QSE_NULL) goto oops; | 	if (httpd == QSE_NULL) goto oops; | ||||||
|  |  | ||||||
| 	xtn = (httpd_xtn_t*)qse_httpd_getxtn (httpd); | 	xtn = (httpd_xtn_t*)qse_httpd_getxtn (httpd); | ||||||
| 	QSE_MEMSET (xtn, 0, QSE_SIZEOF(httpd_xtn_t*)); | 	QSE_MEMSET (xtn, 0, QSE_SIZEOF(*xtn)); | ||||||
|  |  | ||||||
| #if defined(USE_LTDL) | #if defined(USE_LTDL) | ||||||
| 	/* lt_dlinit() can be called more than once and  | 	/* lt_dlinit() can be called more than once and  | ||||||
|  | |||||||
| @ -107,7 +107,17 @@ qse_sed_t* qse_sed_openstd (qse_size_t xtnsize) | |||||||
|  |  | ||||||
| qse_sed_t* qse_sed_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize) | qse_sed_t* qse_sed_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize) | ||||||
| { | { | ||||||
| 	return qse_sed_open (mmgr, QSE_SIZEOF(xtn_t) + xtnsize); | 	qse_sed_t* sed; | ||||||
|  | 	xtn_t* xtn; | ||||||
|  |  | ||||||
|  | 	sed = qse_sed_open (mmgr, QSE_SIZEOF(xtn_t) + xtnsize); | ||||||
|  | 	if (!sed) return QSE_NULL; | ||||||
|  |  | ||||||
|  | 	/* initialize the my own extension area excluding xtnsize */ | ||||||
|  | 	xtn = (xtn_t*) QSE_XTN(sed); | ||||||
|  | 	QSE_MEMSET (xtn, 0, QSE_SIZEOF(*xtn)); | ||||||
|  |  | ||||||
|  | 	return sed; | ||||||
| } | } | ||||||
|  |  | ||||||
| void* qse_sed_getxtnstd (qse_sed_t* sed) | void* qse_sed_getxtnstd (qse_sed_t* sed) | ||||||
|  | |||||||
| @ -97,6 +97,7 @@ qse_xli_t* qse_xli_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_si | |||||||
|  |  | ||||||
| 	/* initialize extension */ | 	/* initialize extension */ | ||||||
| 	xtn = (xtn_t*) QSE_XTN (xli); | 	xtn = (xtn_t*) QSE_XTN (xli); | ||||||
|  | 	QSE_MEMSET (xtn, 0, QSE_SIZEOF(*xtn)); | ||||||
|  |  | ||||||
| 	xtn->ecb.close = fini_xtn; | 	xtn->ecb.close = fini_xtn; | ||||||
| 	xtn->ecb.clear = clear_xtn; | 	xtn->ecb.clear = clear_xtn; | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user