err.c

来自「openssl是ssl的开源项目」· C语言 代码 · 共 656 行 · 第 1/2 页

C
656
字号
	es=ERR_get_state();	if (es->bottom == es->top) return(0);	i=(es->bottom+1)%ERR_NUM_ERRORS;	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 (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);	}/* BAD for multi-threaded, uses a local buffer if ret == NULL */char *ERR_error_string(e,ret)unsigned long e;char *ret;	{	static char buf[256];	char *ls,*fs,*rs;	unsigned long l,f,r;	int i;	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 (ret == NULL) ret=buf;	sprintf(&(ret[0]),"error:%08lX:",e);	i=strlen(ret);	if (ls == NULL)		sprintf(&(ret[i]),":lib(%lu) ",l);	else	sprintf(&(ret[i]),"%s",ls);	i=strlen(ret);	if (fs == NULL)		sprintf(&(ret[i]),":func(%lu) ",f);	else	sprintf(&(ret[i]),":%s",fs);	i=strlen(ret);	if (rs == NULL)		sprintf(&(ret[i]),":reason(%lu)",r);	else	sprintf(&(ret[i]),":%s",rs);	return(ret);	}LHASH *ERR_get_string_table()	{	return(error_hash);	}LHASH *ERR_get_err_state_table()	{	return(thread_hash);	}char *ERR_lib_error_string(e)unsigned long e;	{	ERR_STRING_DATA d,*p=NULL;	unsigned long l;	l=ERR_GET_LIB(e);	CRYPTO_r_lock(CRYPTO_LOCK_ERR_HASH);	if (error_hash != NULL)		{		d.error=ERR_PACK(l,0,0);		p=(ERR_STRING_DATA *)lh_retrieve(error_hash,(char *)&d);		}	CRYPTO_r_unlock(CRYPTO_LOCK_ERR_HASH);	return((p == NULL)?NULL:p->string);	}char *ERR_func_error_string(e)unsigned long e;	{	ERR_STRING_DATA d,*p=NULL;	unsigned long l,f;	l=ERR_GET_LIB(e);	f=ERR_GET_FUNC(e);	CRYPTO_r_lock(CRYPTO_LOCK_ERR_HASH);	if (error_hash != NULL)		{		d.error=ERR_PACK(l,f,0);		p=(ERR_STRING_DATA *)lh_retrieve(error_hash,(char *)&d);		}	CRYPTO_r_unlock(CRYPTO_LOCK_ERR_HASH);	return((p == NULL)?NULL:p->string);	}char *ERR_reason_error_string(e)unsigned long e;	{	ERR_STRING_DATA d,*p=NULL;	unsigned long l,r;	l=ERR_GET_LIB(e);	r=ERR_GET_REASON(e);	CRYPTO_r_lock(CRYPTO_LOCK_ERR_HASH);	if (error_hash != NULL)		{		d.error=ERR_PACK(l,0,r);		p=(ERR_STRING_DATA *)lh_retrieve(error_hash,(char *)&d);		if (p == NULL)			{			d.error=ERR_PACK(0,0,r);			p=(ERR_STRING_DATA *)lh_retrieve(error_hash,				(char *)&d);			}		}	CRYPTO_r_unlock(CRYPTO_LOCK_ERR_HASH);	return((p == NULL)?NULL:p->string);	}static unsigned long err_hash(a)ERR_STRING_DATA *a;	{	unsigned long ret,l;	l=a->error;	ret=l^ERR_GET_LIB(l)^ERR_GET_FUNC(l);	return(ret^ret%19*13);	}static int err_cmp(a,b)ERR_STRING_DATA *a,*b;	{	return((int)(a->error-b->error));	}static unsigned long pid_hash(a)ERR_STATE *a;	{	return(a->pid*13);	}static int pid_cmp(a,b)ERR_STATE *a,*b;	{	return((int)((long)a->pid - (long)b->pid));	}void ERR_remove_state(pid)unsigned long pid;	{	ERR_STATE *p,tmp;	if (thread_hash == NULL)		return;	if (pid == 0)		pid=(unsigned long)CRYPTO_thread_id();	tmp.pid=pid;	CRYPTO_w_lock(CRYPTO_LOCK_ERR);	p=(ERR_STATE *)lh_delete(thread_hash,(char *)&tmp);	CRYPTO_w_unlock(CRYPTO_LOCK_ERR);	if (p != NULL) ERR_STATE_free(p);	}ERR_STATE *ERR_get_state()	{	static ERR_STATE fallback;	ERR_STATE *ret=NULL,tmp,*tmpp;	int i;	unsigned long pid;	pid=(unsigned long)CRYPTO_thread_id();	CRYPTO_r_lock(CRYPTO_LOCK_ERR);	if (thread_hash == NULL)		{		CRYPTO_r_unlock(CRYPTO_LOCK_ERR);		CRYPTO_w_lock(CRYPTO_LOCK_ERR);		if (thread_hash == NULL)			{			MemCheck_off();			thread_hash=lh_new(pid_hash,pid_cmp);			MemCheck_on();			CRYPTO_w_unlock(CRYPTO_LOCK_ERR);			if (thread_hash == NULL) return(&fallback);			}		else			CRYPTO_w_unlock(CRYPTO_LOCK_ERR);		}	else		{		tmp.pid=pid;		ret=(ERR_STATE *)lh_retrieve(thread_hash,(char *)&tmp);		CRYPTO_r_unlock(CRYPTO_LOCK_ERR);		}	/* ret == the error state, if NULL, make a new one */	if (ret == NULL)		{		ret=(ERR_STATE *)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;			}		CRYPTO_w_lock(CRYPTO_LOCK_ERR);		tmpp=(ERR_STATE *)lh_insert(thread_hash,(char *)ret);		CRYPTO_w_unlock(CRYPTO_LOCK_ERR);		if (tmpp != NULL) /* old entry - should not happen */			{			ERR_STATE_free(tmpp);			}		}	return(ret);	}int ERR_get_next_error_library()	{	static int value=ERR_LIB_USER;	return(value++);	}void ERR_set_error_data(data,flags)char *data;int flags;	{	ERR_STATE *es;	int i;	es=ERR_get_state();	i=es->top;	if (i == 0)		i=ERR_NUM_ERRORS-1;	es->err_data[i]=data;	es->err_data_flags[es->top]=flags;	}void ERR_add_error_data( VAR_PLIST(int , num))VAR_ALIST        {        VAR_BDEFN(args, int, num);	int i,n,s;	char *str,*p,*a;	s=64;	str=Malloc(s+1);	if (str == NULL) return;	str[0]='\0';	VAR_INIT(args,int,num);	n=0;	for (i=0; i<num; i++)		{		VAR_ARG(args,char *,a);		/* ignore NULLs, thanks to Bob Beck <beck@obtuse.com> */		if (a != NULL)			{			n+=strlen(a);			if (n > s)				{				s=n+20;				p=Realloc(str,s+1);				if (p == NULL)					{					Free(str);					return;					}				else					str=p;				}			strcat(str,a);			}		}	ERR_set_error_data(str,ERR_TXT_MALLOCED|ERR_TXT_STRING);	VAR_END( args );	}

⌨️ 快捷键说明

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