Remove unused variable
[openssl.git] / crypto / err / err.c
index f38d1a61da65434c079db21f2d5d590f1e139107..9b9bec6850868c67e16d9382b5b9555390d36495 100644 (file)
@@ -166,6 +166,7 @@ static ERR_STRING_DATA ERR_str_functs[]=
        {ERR_PACK(0,SYS_F_WSASTARTUP,0),        "WSAstartup"},
 #endif
        {ERR_PACK(0,SYS_F_OPENDIR,0),           "opendir"},
+       {ERR_PACK(0,SYS_F_FREAD,0),             "fread"},
        {0,NULL},
        };
 
@@ -207,9 +208,11 @@ static ERR_STRING_DATA ERR_str_reasons[]=
 {ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED     ,"called a function you should not call"},
 {ERR_R_PASSED_NULL_PARAMETER           ,"passed a null parameter"},
 {ERR_R_INTERNAL_ERROR                  ,"internal error"},
+{ERR_R_DISABLED                                ,"called a function that was disabled at compile-time"},
 
 {0,NULL},
        };
+#endif
 
 
 /* Define the predeclared (but externally opaque) "ERR_FNS" type */
@@ -318,7 +321,7 @@ static int err_cmp(const void *a_void, const void *b_void);
 static unsigned long pid_hash(const void *pid_void);
 /* static int pid_cmp(ERR_STATE *a,ERR_STATE *pid); */
 static int pid_cmp(const void *a_void,const void *pid_void);
-static unsigned long get_error_values(int inc,const char **file,int *line,
+static unsigned long get_error_values(int inc,int top,const char **file,int *line,
                                      const char **data,int *flags);
 
 /* The internal functions used in the "err_defaults" implementation */
@@ -490,6 +493,7 @@ static int int_err_get_next_lib(void)
        }
 
 
+#ifndef OPENSSL_NO_ERR
 #define NUM_SYS_STR_REASONS 127
 #define LEN_SYS_STR_REASON 32
 
@@ -544,13 +548,24 @@ static void build_SYS_str_reasons()
 #endif
 
 #define err_clear_data(p,i) \
+       do { \
        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;
+       (p)->err_data_flags[i]=0; \
+       } while(0)
+
+#define err_clear(p,i) \
+       do { \
+       es->err_flags[i]=0; \
+       es->err_buffer[i]=0; \
+       err_clear_data(p,i); \
+       es->err_file[i]=NULL; \
+       es->err_line[i]= -1; \
+       } while(0)
 
 static void ERR_STATE_free(ERR_STATE *s)
        {
@@ -641,6 +656,7 @@ void ERR_put_error(int lib, int func, int reason, const char *file,
        es->top=(es->top+1)%ERR_NUM_ERRORS;
        if (es->top == es->bottom)
                es->bottom=(es->bottom+1)%ERR_NUM_ERRORS;
+       es->err_flags[es->top]=0;
        es->err_buffer[es->top]=ERR_PACK(lib,func,reason);
        es->err_file[es->top]=file;
        es->err_line[es->top]=line;
@@ -656,38 +672,47 @@ void ERR_clear_error(void)
 
        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;
+               err_clear(es,i);
                }
        es->top=es->bottom=0;
        }
 
 
 unsigned long ERR_get_error(void)
-       { return(get_error_values(1,NULL,NULL,NULL,NULL)); }
+       { 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,file,line,NULL,NULL)); }
+       { 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,file,line,data,flags)); }
+       { return(get_error_values(1,0,file,line,data,flags)); }
+
 
 unsigned long ERR_peek_error(void)
-       { return(get_error_values(0,NULL,NULL,NULL,NULL)); }
+       { 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,file,line,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,file,line,data,flags)); }
+       { return(get_error_values(0,0,file,line,data,flags)); }
 
-static unsigned long get_error_values(int inc, const char **file, int *line,
+
+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;
@@ -696,8 +721,21 @@ static unsigned long get_error_values(int inc, const char **file, int *line,
 
        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;
-       i=(es->bottom+1)%ERR_NUM_ERRORS;
+       if (top)
+               i=es->top;                       /* last error */
+       else
+               i=(es->bottom+1)%ERR_NUM_ERRORS; /* first error */
 
        ret=es->err_buffer[i];
        if (inc)
@@ -1005,3 +1043,33 @@ void ERR_add_error_data(int num, ...)
 err:
        va_end(args);
        }
+
+int ERR_set_mark(void)
+       {
+       ERR_STATE *es;
+
+       es=ERR_get_state();
+
+       if (es->bottom == es->top) return 0;
+       es->err_flags[es->top]|=ERR_FLAG_MARK;
+       return 1;
+       }
+
+int ERR_pop_to_mark(void)
+       {
+       ERR_STATE *es;
+
+       es=ERR_get_state();
+
+       while(es->bottom != es->top
+               && (es->err_flags[es->top] & ERR_FLAG_MARK) == 0)
+               {
+               err_clear(es,es->top);
+               es->top-=1;
+               if (es->top == -1) es->top=ERR_NUM_ERRORS;
+               }
+               
+       if (es->bottom == es->top) return 0;
+       es->err_flags[es->top]&=~ERR_FLAG_MARK;
+       return 1;
+       }