⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 err.c

📁 err加解密算法程序包
💻 C
📖 第 1 页 / 共 2 页
字号:
 * that occurs in ERR_str_reasons, or bogus reason strings * will be returned for SYSerr(), which always gets an errno * value and never one of those 'standard' reason codes. */static void build_SYS_str_reasons()	{	/* OPENSSL_malloc cannot be used here, use static storage instead */	static char strerror_tab[NUM_SYS_STR_REASONS][LEN_SYS_STR_REASON];	int i;	static int init = 1;	if (!init) return;	CRYPTO_w_lock(CRYPTO_LOCK_ERR);	for (i = 1; i <= NUM_SYS_STR_REASONS; i++)		{		ERR_STRING_DATA *str = &SYS_str_reasons[i - 1];		str->error = (unsigned long)i;		if (str->string == NULL)			{			char (*dest)[LEN_SYS_STR_REASON] = &(strerror_tab[i - 1]);			char *src = strerror(i);			if (src != NULL)				{				strncpy(*dest, src, sizeof *dest);				(*dest)[sizeof *dest - 1] = '\0';				str->string = *dest;				}			}		if (str->string == NULL)			str->string = "unknown";		}	/* Now we still have SYS_str_reasons[NUM_SYS_STR_REASONS] = {0, NULL},	 * as required by ERR_load_strings. */	init = 0;		CRYPTO_w_unlock(CRYPTO_LOCK_ERR);	}#endif#define err_clear_data(p,i) \	if (((p)->err_data[i] != NULL) && \		(p)->err_data_flags[i] & ERR_TXT_MALLOCED) \		{  \		OPENSSL_free((p)->err_data[i]); \		(p)->err_data[i]=NULL; \		} \	(p)->err_data_flags[i]=0;static void ERR_STATE_free(ERR_STATE *s)	{	int i;	if (s == NULL)	    return;	for (i=0; i<ERR_NUM_ERRORS; i++)		{		err_clear_data(s,i);		}	OPENSSL_free(s);	}void ERR_load_ERR_strings(void)	{	err_fns_check();#ifndef OPENSSL_NO_ERR	err_load_strings(0,ERR_str_libraries);	err_load_strings(0,ERR_str_reasons);	err_load_strings(ERR_LIB_SYS,ERR_str_functs);	build_SYS_str_reasons();	err_load_strings(ERR_LIB_SYS,SYS_str_reasons);#endif	}static void err_load_strings(int lib, ERR_STRING_DATA *str)	{	while (str->error)		{		str->error|=ERR_PACK(lib,0,0);		ERRFN(err_set_item)(str);		str++;		}	}void ERR_load_strings(int lib, ERR_STRING_DATA *str)	{	ERR_load_ERR_strings();	err_load_strings(lib, str);	}void ERR_unload_strings(int lib, ERR_STRING_DATA *str)	{	while (str->error)		{		str->error|=ERR_PACK(lib,0,0);		ERRFN(err_del_item)(str);		str++;		}	}void ERR_free_strings(void)	{	err_fns_check();	ERRFN(err_del)();	}/********************************************************/void ERR_put_error(int lib, int func, int reason, const char *file,	     int line)	{	ERR_STATE *es;#ifdef _OSD_POSIX	/* In the BS2000-OSD POSIX subsystem, the compiler generates	 * path names in the form "*POSIX(/etc/passwd)".	 * This dirty hack strips them to something sensible.	 * @@@ We shouldn't modify a const string, though.	 */	if (strncmp(file,"*POSIX(", sizeof("*POSIX(")-1) == 0) {		char *end;		/* Skip the "*POSIX(" prefix */		file += sizeof("*POSIX(")-1;		end = &file[strlen(file)-1];		if (*end == ')')			*end = '\0';		/* Optional: use the basename of the path only. */		if ((end = strrchr(file, '/')) != NULL)			file = &end[1];	}#endif	es=ERR_get_state();	es->top=(es->top+1)%ERR_NUM_ERRORS;	if (es->top == es->bottom)		es->bottom=(es->bottom+1)%ERR_NUM_ERRORS;	es->err_buffer[es->top]=ERR_PACK(lib,func,reason);	es->err_file[es->top]=file;	es->err_line[es->top]=line;	err_clear_data(es,es->top);	}void ERR_clear_error(void)	{	int i;	ERR_STATE *es;	es=ERR_get_state();	for (i=0; i<ERR_NUM_ERRORS; i++)		{		es->err_buffer[i]=0;		err_clear_data(es,i);		es->err_file[i]=NULL;		es->err_line[i]= -1;		}	es->top=es->bottom=0;	}unsigned long ERR_get_error(void)	{ return(get_error_values(1,0,NULL,NULL,NULL,NULL)); }unsigned long ERR_get_error_line(const char **file,	     int *line)	{ return(get_error_values(1,0,file,line,NULL,NULL)); }unsigned long ERR_get_error_line_data(const char **file, int *line,	     const char **data, int *flags)	{ return(get_error_values(1,0,file,line,data,flags)); }unsigned long ERR_peek_error(void)	{ return(get_error_values(0,0,NULL,NULL,NULL,NULL)); }unsigned long ERR_peek_error_line(const char **file, int *line)	{ return(get_error_values(0,0,file,line,NULL,NULL)); }unsigned long ERR_peek_error_line_data(const char **file, int *line,	     const char **data, int *flags)	{ return(get_error_values(0,0,file,line,data,flags)); }unsigned long ERR_peek_last_error(void)	{ return(get_error_values(0,1,NULL,NULL,NULL,NULL)); }unsigned long ERR_peek_last_error_line(const char **file, int *line)	{ return(get_error_values(0,1,file,line,NULL,NULL)); }unsigned long ERR_peek_last_error_line_data(const char **file, int *line,	     const char **data, int *flags)	{ return(get_error_values(0,1,file,line,data,flags)); }static unsigned long get_error_values(int inc, int top, const char **file, int *line,	     const char **data, int *flags)	{		int i=0;	ERR_STATE *es;	unsigned long ret;	es=ERR_get_state();	if (inc && top)		{		if (file) *file = "";		if (line) *line = 0;		if (data) *data = "";		if (flags) *flags = 0;					return ERR_R_INTERNAL_ERROR;		}	if (es->bottom == es->top) return 0;	if (top)		i=es->top;			 /* last error */	else		i=(es->bottom+1)%ERR_NUM_ERRORS; /* first error */	ret=es->err_buffer[i];	if (inc)		{		es->bottom=i;		es->err_buffer[i]=0;		}	if ((file != NULL) && (line != NULL))		{		if (es->err_file[i] == NULL)			{			*file="NA";			if (line != NULL) *line=0;			}		else			{			*file=es->err_file[i];			if (line != NULL) *line=es->err_line[i];			}		}	if (data == NULL)		{		if (inc)			{			err_clear_data(es, i);			}		}	else		{		if (es->err_data[i] == NULL)			{			*data="";			if (flags != NULL) *flags=0;			}		else			{			*data=es->err_data[i];			if (flags != NULL) *flags=es->err_data_flags[i];			}		}	return ret;	}void ERR_error_string_n(unsigned long e, char *buf, size_t len)	{	char lsbuf[64], fsbuf[64], rsbuf[64];	const char *ls,*fs,*rs;	unsigned long l,f,r;	l=ERR_GET_LIB(e);	f=ERR_GET_FUNC(e);	r=ERR_GET_REASON(e);	ls=ERR_lib_error_string(e);	fs=ERR_func_error_string(e);	rs=ERR_reason_error_string(e);	if (ls == NULL) 		BIO_snprintf(lsbuf, sizeof(lsbuf), "lib(%lu)", l);	if (fs == NULL)		BIO_snprintf(fsbuf, sizeof(fsbuf), "func(%lu)", f);	if (rs == NULL)		BIO_snprintf(rsbuf, sizeof(rsbuf), "reason(%lu)", r);	BIO_snprintf(buf, len,"error:%08lX:%s:%s:%s", e, ls?ls:lsbuf, 		fs?fs:fsbuf, rs?rs:rsbuf);	if (strlen(buf) == len-1)		{		/* output may be truncated; make sure we always have 5 		 * colon-separated fields, i.e. 4 colons ... */#define NUM_COLONS 4		if (len > NUM_COLONS) /* ... if possible */			{			int i;			char *s = buf;						for (i = 0; i < NUM_COLONS; i++)				{				char *colon = strchr(s, ':');				if (colon == NULL || colon > &buf[len-1] - NUM_COLONS + i)					{					/* set colon no. i at last possible position					 * (buf[len-1] is the terminating 0)*/					colon = &buf[len-1] - NUM_COLONS + i;					*colon = ':';					}				s = colon + 1;				}			}		}	}/* BAD for multi-threading: uses a local buffer if ret == NULL *//* ERR_error_string_n should be used instead for ret != NULL * as ERR_error_string cannot know how large the buffer is */char *ERR_error_string(unsigned long e, char *ret)	{	static char buf[256];	if (ret == NULL) ret=buf;	ERR_error_string_n(e, ret, 256);	return ret;	}LHASH *ERR_get_string_table(void)	{	err_fns_check();	return ERRFN(err_get)(0);	}LHASH *ERR_get_err_state_table(void)	{	err_fns_check();	return ERRFN(thread_get)(0);	}void ERR_release_err_state_table(LHASH **hash)	{	err_fns_check();	ERRFN(thread_release)(hash);	}const char *ERR_lib_error_string(unsigned long e)	{	ERR_STRING_DATA d,*p;	unsigned long l;	err_fns_check();	l=ERR_GET_LIB(e);	d.error=ERR_PACK(l,0,0);	p=ERRFN(err_get_item)(&d);	return((p == NULL)?NULL:p->string);	}const char *ERR_func_error_string(unsigned long e)	{	ERR_STRING_DATA d,*p;	unsigned long l,f;	err_fns_check();	l=ERR_GET_LIB(e);	f=ERR_GET_FUNC(e);	d.error=ERR_PACK(l,f,0);	p=ERRFN(err_get_item)(&d);	return((p == NULL)?NULL:p->string);	}const char *ERR_reason_error_string(unsigned long e)	{	ERR_STRING_DATA d,*p=NULL;	unsigned long l,r;	err_fns_check();	l=ERR_GET_LIB(e);	r=ERR_GET_REASON(e);	d.error=ERR_PACK(l,0,r);	p=ERRFN(err_get_item)(&d);	if (!p)		{		d.error=ERR_PACK(0,0,r);		p=ERRFN(err_get_item)(&d);		}	return((p == NULL)?NULL:p->string);	}/* static unsigned long err_hash(ERR_STRING_DATA *a) */static unsigned long err_hash(const void *a_void)	{	unsigned long ret,l;	l=((ERR_STRING_DATA *)a_void)->error;	ret=l^ERR_GET_LIB(l)^ERR_GET_FUNC(l);	return(ret^ret%19*13);	}/* static int err_cmp(ERR_STRING_DATA *a, ERR_STRING_DATA *b) */static int err_cmp(const void *a_void, const void *b_void)	{	return((int)(((ERR_STRING_DATA *)a_void)->error -			((ERR_STRING_DATA *)b_void)->error));	}/* static unsigned long pid_hash(ERR_STATE *a) */static unsigned long pid_hash(const void *a_void)	{	return(((ERR_STATE *)a_void)->pid*13);	}/* static int pid_cmp(ERR_STATE *a, ERR_STATE *b) */static int pid_cmp(const void *a_void, const void *b_void)	{	return((int)((long)((ERR_STATE *)a_void)->pid -			(long)((ERR_STATE *)b_void)->pid));	}void ERR_remove_state(unsigned long pid)	{	ERR_STATE tmp;	err_fns_check();	if (pid == 0)		pid=(unsigned long)CRYPTO_thread_id();	tmp.pid=pid;	/* thread_del_item automatically destroys the LHASH if the number of	 * items reaches zero. */	ERRFN(thread_del_item)(&tmp);	}ERR_STATE *ERR_get_state(void)	{	static ERR_STATE fallback;	ERR_STATE *ret,tmp,*tmpp=NULL;	int i;	unsigned long pid;	err_fns_check();	pid=(unsigned long)CRYPTO_thread_id();	tmp.pid=pid;	ret=ERRFN(thread_get_item)(&tmp);	/* ret == the error state, if NULL, make a new one */	if (ret == NULL)		{		ret=(ERR_STATE *)OPENSSL_malloc(sizeof(ERR_STATE));		if (ret == NULL) return(&fallback);		ret->pid=pid;		ret->top=0;		ret->bottom=0;		for (i=0; i<ERR_NUM_ERRORS; i++)			{			ret->err_data[i]=NULL;			ret->err_data_flags[i]=0;			}		tmpp = ERRFN(thread_set_item)(ret);		/* To check if insertion failed, do a get. */		if (ERRFN(thread_get_item)(ret) != ret)			{			ERR_STATE_free(ret); /* could not insert it */			return(&fallback);			}		/* If a race occured in this function and we came second, tmpp		 * is the first one that we just replaced. */		if (tmpp)			ERR_STATE_free(tmpp);		}	return ret;	}int ERR_get_next_error_library(void)	{	err_fns_check();	return ERRFN(get_next_lib)();	}void ERR_set_error_data(char *data, int flags)	{	ERR_STATE *es;	int i;	es=ERR_get_state();	i=es->top;	if (i == 0)		i=ERR_NUM_ERRORS-1;	err_clear_data(es,i);	es->err_data[i]=data;	es->err_data_flags[i]=flags;	}void ERR_add_error_data(int num, ...)	{	va_list args;	int i,n,s;	char *str,*p,*a;	s=80;	str=OPENSSL_malloc(s+1);	if (str == NULL) return;	str[0]='\0';	va_start(args, num);	n=0;	for (i=0; i<num; i++)		{		a=va_arg(args, char*);		/* ignore NULLs, thanks to Bob Beck <beck@obtuse.com> */		if (a != NULL)			{			n+=strlen(a);			if (n > s)				{				s=n+20;				p=OPENSSL_realloc(str,s+1);				if (p == NULL)					{					OPENSSL_free(str);					goto err;					}				else					str=p;				}			BUF_strlcat(str,a,s+1);			}		}	ERR_set_error_data(str,ERR_TXT_MALLOCED|ERR_TXT_STRING);err:	va_end(args);	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -