Move the registration of callback functions to special functions
designed for that. This removes the potential error to mix data and function pointers. Please note that I'm a little unsure how incorrect calls to the old ctrl functions should be handled, in som cases. I currently return 0 and that's it, but it may be more correct to generate a genuine error in those cases.
This commit is contained in:
parent
dab6f09573
commit
d3442bc780
@ -69,6 +69,7 @@ static int buffer_gets(BIO *h,char *str,int size);
|
|||||||
static long buffer_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
static long buffer_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
||||||
static int buffer_new(BIO *h);
|
static int buffer_new(BIO *h);
|
||||||
static int buffer_free(BIO *data);
|
static int buffer_free(BIO *data);
|
||||||
|
static long buffer_callback_ctrl(BIO *h,int cmd, void (*fp)());
|
||||||
#define DEFAULT_BUFFER_SIZE 1024
|
#define DEFAULT_BUFFER_SIZE 1024
|
||||||
|
|
||||||
static BIO_METHOD methods_buffer=
|
static BIO_METHOD methods_buffer=
|
||||||
@ -82,6 +83,7 @@ static BIO_METHOD methods_buffer=
|
|||||||
buffer_ctrl,
|
buffer_ctrl,
|
||||||
buffer_new,
|
buffer_new,
|
||||||
buffer_free,
|
buffer_free,
|
||||||
|
buffer_callback_ctrl,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_f_buffer(void)
|
BIO_METHOD *BIO_f_buffer(void)
|
||||||
@ -284,6 +286,7 @@ static long buffer_ctrl(BIO *b, int cmd, long num, char *ptr)
|
|||||||
ctx->ibuf_len=0;
|
ctx->ibuf_len=0;
|
||||||
ctx->obuf_off=0;
|
ctx->obuf_off=0;
|
||||||
ctx->obuf_len=0;
|
ctx->obuf_len=0;
|
||||||
|
if (b->next_bio == NULL) return(0);
|
||||||
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
|
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
|
||||||
break;
|
break;
|
||||||
case BIO_CTRL_INFO:
|
case BIO_CTRL_INFO:
|
||||||
@ -300,12 +303,18 @@ static long buffer_ctrl(BIO *b, int cmd, long num, char *ptr)
|
|||||||
case BIO_CTRL_WPENDING:
|
case BIO_CTRL_WPENDING:
|
||||||
ret=(long)ctx->obuf_len;
|
ret=(long)ctx->obuf_len;
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
if (b->next_bio == NULL) return(0);
|
||||||
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
|
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case BIO_CTRL_PENDING:
|
case BIO_CTRL_PENDING:
|
||||||
ret=(long)ctx->ibuf_len;
|
ret=(long)ctx->ibuf_len;
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
if (b->next_bio == NULL) return(0);
|
||||||
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
|
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case BIO_C_SET_BUFF_READ_DATA:
|
case BIO_C_SET_BUFF_READ_DATA:
|
||||||
if (num > ctx->ibuf_size)
|
if (num > ctx->ibuf_size)
|
||||||
@ -374,12 +383,14 @@ static long buffer_ctrl(BIO *b, int cmd, long num, char *ptr)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BIO_C_DO_STATE_MACHINE:
|
case BIO_C_DO_STATE_MACHINE:
|
||||||
|
if (b->next_bio == NULL) return(0);
|
||||||
BIO_clear_retry_flags(b);
|
BIO_clear_retry_flags(b);
|
||||||
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
|
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
|
||||||
BIO_copy_next_retry(b);
|
BIO_copy_next_retry(b);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BIO_CTRL_FLUSH:
|
case BIO_CTRL_FLUSH:
|
||||||
|
if (b->next_bio == NULL) return(0);
|
||||||
if (ctx->obuf_len <= 0)
|
if (ctx->obuf_len <= 0)
|
||||||
{
|
{
|
||||||
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
|
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
|
||||||
@ -418,6 +429,7 @@ fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len-ctx->obuf_
|
|||||||
ret=0;
|
ret=0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (b->next_bio == NULL) return(0);
|
||||||
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
|
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -427,6 +439,20 @@ malloc_error:
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static long buffer_callback_ctrl(BIO *b, int cmd, void (*fp)())
|
||||||
|
{
|
||||||
|
long ret=1;
|
||||||
|
|
||||||
|
if (b->next_bio == NULL) return(0);
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
static int buffer_gets(BIO *b, char *buf, int size)
|
static int buffer_gets(BIO *b, char *buf, int size)
|
||||||
{
|
{
|
||||||
BIO_F_BUFFER_CTX *ctx;
|
BIO_F_BUFFER_CTX *ctx;
|
||||||
|
@ -73,6 +73,7 @@ static int nbiof_gets(BIO *h,char *str,int size);
|
|||||||
static long nbiof_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
static long nbiof_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
||||||
static int nbiof_new(BIO *h);
|
static int nbiof_new(BIO *h);
|
||||||
static int nbiof_free(BIO *data);
|
static int nbiof_free(BIO *data);
|
||||||
|
static long nbiof_callback_ctrl(BIO *h,int cmd,void (*fp)());
|
||||||
typedef struct nbio_test_st
|
typedef struct nbio_test_st
|
||||||
{
|
{
|
||||||
/* only set if we sent a 'should retry' error */
|
/* only set if we sent a 'should retry' error */
|
||||||
@ -91,6 +92,7 @@ static BIO_METHOD methods_nbiof=
|
|||||||
nbiof_ctrl,
|
nbiof_ctrl,
|
||||||
nbiof_new,
|
nbiof_new,
|
||||||
nbiof_free,
|
nbiof_free,
|
||||||
|
nbiof_callback_ctrl,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_f_nbio_test(void)
|
BIO_METHOD *BIO_f_nbio_test(void)
|
||||||
@ -224,6 +226,20 @@ static long nbiof_ctrl(BIO *b, int cmd, long num, char *ptr)
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static long nbiof_callback_ctrl(BIO *b, int cmd, void (*fp)())
|
||||||
|
{
|
||||||
|
long ret=1;
|
||||||
|
|
||||||
|
if (b->next_bio == NULL) return(0);
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
static int nbiof_gets(BIO *bp, char *buf, int size)
|
static int nbiof_gets(BIO *bp, char *buf, int size)
|
||||||
{
|
{
|
||||||
if (bp->next_bio == NULL) return(0);
|
if (bp->next_bio == NULL) return(0);
|
||||||
|
@ -72,6 +72,7 @@ static int nullf_gets(BIO *h,char *str,int size);
|
|||||||
static long nullf_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
static long nullf_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
||||||
static int nullf_new(BIO *h);
|
static int nullf_new(BIO *h);
|
||||||
static int nullf_free(BIO *data);
|
static int nullf_free(BIO *data);
|
||||||
|
static long nullf_callback_ctrl(BIO *h,int cmd,void (*fp)());
|
||||||
static BIO_METHOD methods_nullf=
|
static BIO_METHOD methods_nullf=
|
||||||
{
|
{
|
||||||
BIO_TYPE_NULL_FILTER,
|
BIO_TYPE_NULL_FILTER,
|
||||||
@ -83,6 +84,7 @@ static BIO_METHOD methods_nullf=
|
|||||||
nullf_ctrl,
|
nullf_ctrl,
|
||||||
nullf_new,
|
nullf_new,
|
||||||
nullf_free,
|
nullf_free,
|
||||||
|
nullf_callback_ctrl,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_f_null(void)
|
BIO_METHOD *BIO_f_null(void)
|
||||||
@ -152,6 +154,20 @@ static long nullf_ctrl(BIO *b, int cmd, long num, char *ptr)
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static long nullf_callback_ctrl(BIO *b, int cmd, void (*fp)())
|
||||||
|
{
|
||||||
|
long ret=1;
|
||||||
|
|
||||||
|
if (b->next_bio == NULL) return(0);
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
static int nullf_gets(BIO *bp, char *buf, int size)
|
static int nullf_gets(BIO *bp, char *buf, int size)
|
||||||
{
|
{
|
||||||
if (bp->next_bio == NULL) return(0);
|
if (bp->next_bio == NULL) return(0);
|
||||||
|
@ -219,6 +219,7 @@ typedef struct bio_method_st
|
|||||||
long (*ctrl)();
|
long (*ctrl)();
|
||||||
int (*create)();
|
int (*create)();
|
||||||
int (*destroy)();
|
int (*destroy)();
|
||||||
|
long (*callback_ctrl)();
|
||||||
} BIO_METHOD;
|
} BIO_METHOD;
|
||||||
#else
|
#else
|
||||||
typedef struct bio_method_st
|
typedef struct bio_method_st
|
||||||
@ -232,6 +233,7 @@ typedef struct bio_method_st
|
|||||||
long (_far *ctrl)();
|
long (_far *ctrl)();
|
||||||
int (_far *create)();
|
int (_far *create)();
|
||||||
int (_far *destroy)();
|
int (_far *destroy)();
|
||||||
|
long (_fat *callback_ctrl)();
|
||||||
} BIO_METHOD;
|
} BIO_METHOD;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -373,7 +375,7 @@ typedef struct bio_f_buffer_ctx_struct
|
|||||||
/* BIO_set_nbio(b,n) */
|
/* BIO_set_nbio(b,n) */
|
||||||
#define BIO_set_filter_bio(b,s) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,2,(char *)(s))
|
#define BIO_set_filter_bio(b,s) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,2,(char *)(s))
|
||||||
/* BIO *BIO_get_filter_bio(BIO *bio); */
|
/* BIO *BIO_get_filter_bio(BIO *bio); */
|
||||||
#define BIO_set_proxy_cb(b,cb) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(char *)(cb))
|
#define BIO_set_proxy_cb(b,cb) BIO_callback_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(void *(*cb)()))
|
||||||
#define BIO_set_proxy_header(b,sk) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,(char *)sk)
|
#define BIO_set_proxy_header(b,sk) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,(char *)sk)
|
||||||
#define BIO_set_no_connect_return(b,bool) BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,bool)
|
#define BIO_set_no_connect_return(b,bool) BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,bool)
|
||||||
|
|
||||||
@ -452,8 +454,8 @@ int BIO_read_filename(BIO *b,const char *name);
|
|||||||
size_t BIO_ctrl_pending(BIO *b);
|
size_t BIO_ctrl_pending(BIO *b);
|
||||||
size_t BIO_ctrl_wpending(BIO *b);
|
size_t BIO_ctrl_wpending(BIO *b);
|
||||||
#define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL)
|
#define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL)
|
||||||
#define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0,(char *)cbp)
|
#define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0,(void (**)())(cbp))
|
||||||
#define BIO_set_info_callback(b,cb) (int)BIO_ctrl(b,BIO_CTRL_SET_CALLBACK,0,(char *)cb)
|
#define BIO_set_info_callback(b,cb) (int)BIO_callback_ctrl(b,BIO_CTRL_SET_CALLBACK,(void (*)())(cb))
|
||||||
|
|
||||||
/* For the BIO_f_buffer() type */
|
/* For the BIO_f_buffer() type */
|
||||||
#define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL)
|
#define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL)
|
||||||
@ -508,6 +510,7 @@ int BIO_gets(BIO *bp,char *buf, int size);
|
|||||||
int BIO_write(BIO *b, const char *data, int len);
|
int BIO_write(BIO *b, const char *data, int len);
|
||||||
int BIO_puts(BIO *bp,const char *buf);
|
int BIO_puts(BIO *bp,const char *buf);
|
||||||
long BIO_ctrl(BIO *bp,int cmd,long larg,void *parg);
|
long BIO_ctrl(BIO *bp,int cmd,long larg,void *parg);
|
||||||
|
long BIO_callback_ctrl(BIO *bp,int cmd,void (*fp)());
|
||||||
char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg);
|
char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg);
|
||||||
long BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg);
|
long BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg);
|
||||||
BIO * BIO_push(BIO *b,BIO *append);
|
BIO * BIO_push(BIO *b,BIO *append);
|
||||||
|
@ -317,6 +317,33 @@ long BIO_ctrl(BIO *b, int cmd, long larg, void *parg)
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)())
|
||||||
|
{
|
||||||
|
long ret;
|
||||||
|
long (*cb)();
|
||||||
|
|
||||||
|
if (b == NULL) return(0);
|
||||||
|
|
||||||
|
if ((b->method == NULL) || (b->method->callback_ctrl == NULL))
|
||||||
|
{
|
||||||
|
BIOerr(BIO_F_BIO_CTRL,BIO_R_UNSUPPORTED_METHOD);
|
||||||
|
return(-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
cb=b->callback;
|
||||||
|
|
||||||
|
if ((cb != NULL) &&
|
||||||
|
((ret=cb(b,BIO_CB_CTRL,(void *)&fp,cmd,0,1L)) <= 0))
|
||||||
|
return(ret);
|
||||||
|
|
||||||
|
ret=b->method->callback_ctrl(b,cmd,fp);
|
||||||
|
|
||||||
|
if (cb != NULL)
|
||||||
|
ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,(void *)&fp,cmd,
|
||||||
|
0,ret);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
/* It is unfortunate to duplicate in functions what the BIO_(w)pending macros
|
/* It is unfortunate to duplicate in functions what the BIO_(w)pending macros
|
||||||
* do; but those macros have inappropriate return type, and for interfacing
|
* do; but those macros have inappropriate return type, and for interfacing
|
||||||
* from other programming languages, C macros aren't much of a help anyway. */
|
* from other programming languages, C macros aren't much of a help anyway. */
|
||||||
|
@ -118,6 +118,7 @@ static BIO_METHOD methods_acceptp=
|
|||||||
acpt_ctrl,
|
acpt_ctrl,
|
||||||
acpt_new,
|
acpt_new,
|
||||||
acpt_free,
|
acpt_free,
|
||||||
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_s_accept(void)
|
BIO_METHOD *BIO_s_accept(void)
|
||||||
|
@ -41,7 +41,8 @@ static BIO_METHOD methods_biop =
|
|||||||
NULL /* no bio_gets */,
|
NULL /* no bio_gets */,
|
||||||
bio_ctrl,
|
bio_ctrl,
|
||||||
bio_new,
|
bio_new,
|
||||||
bio_free
|
bio_free,
|
||||||
|
NULL /* no bio_callback_ctrl */
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_s_bio(void)
|
BIO_METHOD *BIO_s_bio(void)
|
||||||
|
@ -98,18 +98,13 @@ typedef struct bio_connect_st
|
|||||||
int (*info_callback)();
|
int (*info_callback)();
|
||||||
} BIO_CONNECT;
|
} BIO_CONNECT;
|
||||||
|
|
||||||
union int_fn_to_char_u
|
|
||||||
{
|
|
||||||
char *char_p;
|
|
||||||
int (*fn_p)();
|
|
||||||
};
|
|
||||||
|
|
||||||
static int conn_write(BIO *h,char *buf,int num);
|
static int conn_write(BIO *h,char *buf,int num);
|
||||||
static int conn_read(BIO *h,char *buf,int size);
|
static int conn_read(BIO *h,char *buf,int size);
|
||||||
static int conn_puts(BIO *h,char *str);
|
static int conn_puts(BIO *h,char *str);
|
||||||
static long conn_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
static long conn_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
||||||
static int conn_new(BIO *h);
|
static int conn_new(BIO *h);
|
||||||
static int conn_free(BIO *data);
|
static int conn_free(BIO *data);
|
||||||
|
static long conn_callback_ctrl(BIO *h,int cmd,void *(*fp)());
|
||||||
|
|
||||||
static int conn_state(BIO *b, BIO_CONNECT *c);
|
static int conn_state(BIO *b, BIO_CONNECT *c);
|
||||||
static void conn_close_socket(BIO *data);
|
static void conn_close_socket(BIO *data);
|
||||||
@ -127,6 +122,7 @@ static BIO_METHOD methods_connectp=
|
|||||||
conn_ctrl,
|
conn_ctrl,
|
||||||
conn_new,
|
conn_new,
|
||||||
conn_free,
|
conn_free,
|
||||||
|
conn_callback_ctrl,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int conn_state(BIO *b, BIO_CONNECT *c)
|
static int conn_state(BIO *b, BIO_CONNECT *c)
|
||||||
@ -571,24 +567,23 @@ static long conn_ctrl(BIO *b, int cmd, long num, char *ptr)
|
|||||||
break;
|
break;
|
||||||
case BIO_CTRL_DUP:
|
case BIO_CTRL_DUP:
|
||||||
{
|
{
|
||||||
union int_fn_to_char_u tmp_cb;
|
|
||||||
|
|
||||||
dbio=(BIO *)ptr;
|
dbio=(BIO *)ptr;
|
||||||
if (data->param_port)
|
if (data->param_port)
|
||||||
BIO_set_conn_port(dbio,data->param_port);
|
BIO_set_conn_port(dbio,data->param_port);
|
||||||
if (data->param_hostname)
|
if (data->param_hostname)
|
||||||
BIO_set_conn_hostname(dbio,data->param_hostname);
|
BIO_set_conn_hostname(dbio,data->param_hostname);
|
||||||
BIO_set_nbio(dbio,data->nbio);
|
BIO_set_nbio(dbio,data->nbio);
|
||||||
tmp_cb.fn_p=data->info_callback;
|
(void)BIO_set_info_callback(dbio,(void *(*)())(data->info_callback));
|
||||||
(void)BIO_set_info_callback(dbio,tmp_cb.char_p);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BIO_CTRL_SET_CALLBACK:
|
case BIO_CTRL_SET_CALLBACK:
|
||||||
{
|
{
|
||||||
union int_fn_to_char_u tmp_cb;
|
#if 0 /* FIXME: Should this be used? -- Richard Levitte */
|
||||||
|
BIOerr(BIO_F_CONN_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||||
tmp_cb.char_p=ptr;
|
ret = -1;
|
||||||
data->info_callback=tmp_cb.fn_p;
|
#else
|
||||||
|
ret=0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BIO_CTRL_GET_CALLBACK:
|
case BIO_CTRL_GET_CALLBACK:
|
||||||
@ -606,6 +601,27 @@ static long conn_ctrl(BIO *b, int cmd, long num, char *ptr)
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static long conn_callback_ctrl(BIO *b, int cmd, void *(*fp)())
|
||||||
|
{
|
||||||
|
long ret=1;
|
||||||
|
BIO_CONNECT *data;
|
||||||
|
|
||||||
|
data=(BIO_CONNECT *)b->ptr;
|
||||||
|
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
case BIO_CTRL_SET_CALLBACK:
|
||||||
|
{
|
||||||
|
data->info_callback=(int (*)())fp;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ret=0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
static int conn_puts(BIO *bp, char *str)
|
static int conn_puts(BIO *bp, char *str)
|
||||||
{
|
{
|
||||||
int n,ret;
|
int n,ret;
|
||||||
|
@ -91,6 +91,7 @@ static BIO_METHOD methods_filep=
|
|||||||
file_ctrl,
|
file_ctrl,
|
||||||
file_new,
|
file_new,
|
||||||
file_free,
|
file_free,
|
||||||
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO *BIO_new_file(const char *filename, const char *mode)
|
BIO *BIO_new_file(const char *filename, const char *mode)
|
||||||
|
@ -100,6 +100,7 @@ static BIO_METHOD methods_slg=
|
|||||||
slg_ctrl,
|
slg_ctrl,
|
||||||
slg_new,
|
slg_new,
|
||||||
slg_free,
|
slg_free,
|
||||||
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_s_log(void)
|
BIO_METHOD *BIO_s_log(void)
|
||||||
|
@ -79,6 +79,7 @@ static BIO_METHOD mem_method=
|
|||||||
mem_ctrl,
|
mem_ctrl,
|
||||||
mem_new,
|
mem_new,
|
||||||
mem_free,
|
mem_free,
|
||||||
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* bio->num is used to hold the value to return on 'empty', if it is
|
/* bio->num is used to hold the value to return on 'empty', if it is
|
||||||
|
@ -79,6 +79,7 @@ static BIO_METHOD null_method=
|
|||||||
null_ctrl,
|
null_ctrl,
|
||||||
null_new,
|
null_new,
|
||||||
null_free,
|
null_free,
|
||||||
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_s_null(void)
|
BIO_METHOD *BIO_s_null(void)
|
||||||
|
@ -107,6 +107,7 @@ static BIO_METHOD rtcp_method=
|
|||||||
rtcp_ctrl,
|
rtcp_ctrl,
|
||||||
rtcp_new,
|
rtcp_new,
|
||||||
rtcp_free,
|
rtcp_free,
|
||||||
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_s_rtcp(void)
|
BIO_METHOD *BIO_s_rtcp(void)
|
||||||
|
@ -95,6 +95,7 @@ static BIO_METHOD methods_sockp=
|
|||||||
sock_ctrl,
|
sock_ctrl,
|
||||||
sock_new,
|
sock_new,
|
||||||
sock_free,
|
sock_free,
|
||||||
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_s_socket(void)
|
BIO_METHOD *BIO_s_socket(void)
|
||||||
@ -112,6 +113,7 @@ static BIO_METHOD methods_fdp=
|
|||||||
fd_ctrl,
|
fd_ctrl,
|
||||||
fd_new,
|
fd_new,
|
||||||
fd_free,
|
fd_free,
|
||||||
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_s_fd(void)
|
BIO_METHOD *BIO_s_fd(void)
|
||||||
|
@ -17,6 +17,7 @@ typedef struct comp_method_st
|
|||||||
int (*compress)();
|
int (*compress)();
|
||||||
int (*expand)();
|
int (*expand)();
|
||||||
long (*ctrl)();
|
long (*ctrl)();
|
||||||
|
long (*callback_ctrl)();
|
||||||
} COMP_METHOD;
|
} COMP_METHOD;
|
||||||
|
|
||||||
typedef struct comp_ctx_st
|
typedef struct comp_ctx_st
|
||||||
|
@ -69,6 +69,7 @@ static int b64_read(BIO *h,char *buf,int size);
|
|||||||
static long b64_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
static long b64_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
||||||
static int b64_new(BIO *h);
|
static int b64_new(BIO *h);
|
||||||
static int b64_free(BIO *data);
|
static int b64_free(BIO *data);
|
||||||
|
static long b64_callback_ctrl(BIO *h,int cmd,void (*fp)());
|
||||||
#define B64_BLOCK_SIZE 1024
|
#define B64_BLOCK_SIZE 1024
|
||||||
#define B64_BLOCK_SIZE2 768
|
#define B64_BLOCK_SIZE2 768
|
||||||
#define B64_NONE 0
|
#define B64_NONE 0
|
||||||
@ -100,6 +101,7 @@ static BIO_METHOD methods_b64=
|
|||||||
b64_ctrl,
|
b64_ctrl,
|
||||||
b64_new,
|
b64_new,
|
||||||
b64_free,
|
b64_free,
|
||||||
|
b64_callback_ctrl,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_f_base64(void)
|
BIO_METHOD *BIO_f_base64(void)
|
||||||
@ -522,3 +524,17 @@ again:
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static long b64_callback_ctrl(BIO *b, int cmd, void (*fp)())
|
||||||
|
{
|
||||||
|
long ret=1;
|
||||||
|
|
||||||
|
if (b->next_bio == NULL) return(0);
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -69,6 +69,7 @@ static int enc_read(BIO *h,char *buf,int size);
|
|||||||
static long enc_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
static long enc_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
||||||
static int enc_new(BIO *h);
|
static int enc_new(BIO *h);
|
||||||
static int enc_free(BIO *data);
|
static int enc_free(BIO *data);
|
||||||
|
static long enc_callback_ctrl(BIO *h,int cmd,void (*fp)());
|
||||||
#define ENC_BLOCK_SIZE (1024*4)
|
#define ENC_BLOCK_SIZE (1024*4)
|
||||||
|
|
||||||
typedef struct enc_struct
|
typedef struct enc_struct
|
||||||
@ -92,6 +93,7 @@ static BIO_METHOD methods_enc=
|
|||||||
enc_ctrl,
|
enc_ctrl,
|
||||||
enc_new,
|
enc_new,
|
||||||
enc_free,
|
enc_free,
|
||||||
|
enc_callback_ctrl,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_f_cipher(void)
|
BIO_METHOD *BIO_f_cipher(void)
|
||||||
@ -368,6 +370,20 @@ again:
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static long enc_callback_ctrl(BIO *b, int cmd, void (*fp)())
|
||||||
|
{
|
||||||
|
long ret=1;
|
||||||
|
|
||||||
|
if (b->next_bio == NULL) return(0);
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
void BIO_set_cipher_ctx(b,c)
|
void BIO_set_cipher_ctx(b,c)
|
||||||
BIO *b;
|
BIO *b;
|
||||||
|
@ -72,6 +72,8 @@ static int md_gets(BIO *h,char *str,int size);
|
|||||||
static long md_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
static long md_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
||||||
static int md_new(BIO *h);
|
static int md_new(BIO *h);
|
||||||
static int md_free(BIO *data);
|
static int md_free(BIO *data);
|
||||||
|
static long md_callback_ctrl(BIO *h,int cmd,void (*fp)());
|
||||||
|
|
||||||
static BIO_METHOD methods_md=
|
static BIO_METHOD methods_md=
|
||||||
{
|
{
|
||||||
BIO_TYPE_MD,"message digest",
|
BIO_TYPE_MD,"message digest",
|
||||||
@ -82,6 +84,7 @@ static BIO_METHOD methods_md=
|
|||||||
md_ctrl,
|
md_ctrl,
|
||||||
md_new,
|
md_new,
|
||||||
md_free,
|
md_free,
|
||||||
|
md_callback_ctrl,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_f_md(void)
|
BIO_METHOD *BIO_f_md(void)
|
||||||
@ -220,6 +223,20 @@ static long md_ctrl(BIO *b, int cmd, long num, char *ptr)
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static long md_callback_ctrl(BIO *b, int cmd, void (*fp)())
|
||||||
|
{
|
||||||
|
long ret=1;
|
||||||
|
|
||||||
|
if (b->next_bio == NULL) return(0);
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
static int md_gets(BIO *bp, char *buf, int size)
|
static int md_gets(BIO *bp, char *buf, int size)
|
||||||
{
|
{
|
||||||
EVP_MD_CTX *ctx;
|
EVP_MD_CTX *ctx;
|
||||||
|
@ -130,6 +130,8 @@ static int ok_read(BIO *h,char *buf,int size);
|
|||||||
static long ok_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
static long ok_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
||||||
static int ok_new(BIO *h);
|
static int ok_new(BIO *h);
|
||||||
static int ok_free(BIO *data);
|
static int ok_free(BIO *data);
|
||||||
|
static long ok_callback_ctrl(BIO *h,int cmd,void (*fp)());
|
||||||
|
|
||||||
static void sig_out(BIO* b);
|
static void sig_out(BIO* b);
|
||||||
static void sig_in(BIO* b);
|
static void sig_in(BIO* b);
|
||||||
static void block_out(BIO* b);
|
static void block_out(BIO* b);
|
||||||
@ -173,6 +175,7 @@ static BIO_METHOD methods_ok=
|
|||||||
ok_ctrl,
|
ok_ctrl,
|
||||||
ok_new,
|
ok_new,
|
||||||
ok_free,
|
ok_free,
|
||||||
|
ok_callback_ctrl,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_f_reliable(void)
|
BIO_METHOD *BIO_f_reliable(void)
|
||||||
@ -428,6 +431,20 @@ static long ok_ctrl(BIO *b, int cmd, long num, char *ptr)
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static long ok_callback_ctrl(BIO *b, int cmd, void (*fp)())
|
||||||
|
{
|
||||||
|
long ret=1;
|
||||||
|
|
||||||
|
if (b->next_bio == NULL) return(0);
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
static void longswap(void *_ptr, int len)
|
static void longswap(void *_ptr, int len)
|
||||||
{
|
{
|
||||||
#ifndef L_ENDIAN
|
#ifndef L_ENDIAN
|
||||||
|
@ -69,6 +69,7 @@ static int ber_read(BIO *h,char *buf,int size);
|
|||||||
static long ber_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
static long ber_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
||||||
static int ber_new(BIO *h);
|
static int ber_new(BIO *h);
|
||||||
static int ber_free(BIO *data);
|
static int ber_free(BIO *data);
|
||||||
|
static long ber_callback_ctrl(BIO *h,int cmd,void *(*fp)());
|
||||||
#define BER_BUF_SIZE (32)
|
#define BER_BUF_SIZE (32)
|
||||||
|
|
||||||
/* This is used to hold the state of the BER objects being read. */
|
/* This is used to hold the state of the BER objects being read. */
|
||||||
@ -115,6 +116,7 @@ static BIO_METHOD methods_ber=
|
|||||||
ber_ctrl,
|
ber_ctrl,
|
||||||
ber_new,
|
ber_new,
|
||||||
ber_free,
|
ber_free,
|
||||||
|
ber_callback_ctrl,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_f_ber(void)
|
BIO_METHOD *BIO_f_ber(void)
|
||||||
@ -409,6 +411,20 @@ again:
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static long ber_callback_ctrl(BIO *b, int cmd, void *(*fp)())
|
||||||
|
{
|
||||||
|
long ret=1;
|
||||||
|
|
||||||
|
if (b->next_bio == NULL) return(0);
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
void BIO_set_cipher_ctx(b,c)
|
void BIO_set_cipher_ctx(b,c)
|
||||||
BIO *b;
|
BIO *b;
|
||||||
|
@ -71,6 +71,7 @@ static int ssl_puts(BIO *h,char *str);
|
|||||||
static long ssl_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
static long ssl_ctrl(BIO *h,int cmd,long arg1,char *arg2);
|
||||||
static int ssl_new(BIO *h);
|
static int ssl_new(BIO *h);
|
||||||
static int ssl_free(BIO *data);
|
static int ssl_free(BIO *data);
|
||||||
|
static long ssl_callback_ctrl(BIO *h,int cmd,void (*fp)());
|
||||||
typedef struct bio_ssl_st
|
typedef struct bio_ssl_st
|
||||||
{
|
{
|
||||||
SSL *ssl; /* The ssl handle :-) */
|
SSL *ssl; /* The ssl handle :-) */
|
||||||
@ -92,12 +93,7 @@ static BIO_METHOD methods_sslp=
|
|||||||
ssl_ctrl,
|
ssl_ctrl,
|
||||||
ssl_new,
|
ssl_new,
|
||||||
ssl_free,
|
ssl_free,
|
||||||
};
|
ssl_callback_ctrl,
|
||||||
|
|
||||||
union void_fn_to_char_u
|
|
||||||
{
|
|
||||||
char *char_p;
|
|
||||||
void (*fn_p)();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO_METHOD *BIO_f_ssl(void)
|
BIO_METHOD *BIO_f_ssl(void)
|
||||||
@ -451,10 +447,12 @@ static long ssl_ctrl(BIO *b, int cmd, long num, char *ptr)
|
|||||||
break;
|
break;
|
||||||
case BIO_CTRL_SET_CALLBACK:
|
case BIO_CTRL_SET_CALLBACK:
|
||||||
{
|
{
|
||||||
union void_fn_to_char_u tmp_cb;
|
#if 0 /* FIXME: Should this be used? -- Richard Levitte */
|
||||||
|
BIOerr(SSL_F_SSL_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||||
tmp_cb.char_p = ptr;
|
ret = -1;
|
||||||
SSL_set_info_callback(ssl,tmp_cb.fn_p);
|
#else
|
||||||
|
ret=0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BIO_CTRL_GET_CALLBACK:
|
case BIO_CTRL_GET_CALLBACK:
|
||||||
@ -472,6 +470,28 @@ static long ssl_ctrl(BIO *b, int cmd, long num, char *ptr)
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static long ssl_callback_ctrl(BIO *b, int cmd, void (*fp)())
|
||||||
|
{
|
||||||
|
SSL *ssl;
|
||||||
|
BIO_SSL *bs;
|
||||||
|
long ret=1;
|
||||||
|
|
||||||
|
bs=(BIO_SSL *)b->ptr;
|
||||||
|
ssl=bs->ssl;
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
case BIO_CTRL_SET_CALLBACK:
|
||||||
|
{
|
||||||
|
SSL_set_info_callback(ssl,fp);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ret=BIO_callback_ctrl(ssl->rbio,cmd,fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
static int ssl_puts(BIO *bp, char *str)
|
static int ssl_puts(BIO *bp, char *str)
|
||||||
{
|
{
|
||||||
int n,ret;
|
int n,ret;
|
||||||
|
@ -92,6 +92,9 @@ static SSL_METHOD SSLv23_data= {
|
|||||||
ssl_bad_method,
|
ssl_bad_method,
|
||||||
ssl23_default_timeout,
|
ssl23_default_timeout,
|
||||||
&ssl3_undef_enc_method,
|
&ssl3_undef_enc_method,
|
||||||
|
ssl_undefined_function,
|
||||||
|
ssl3_callback_ctrl,
|
||||||
|
ssl3_ctx_callback_ctrl,
|
||||||
};
|
};
|
||||||
|
|
||||||
static long ssl23_default_timeout(void)
|
static long ssl23_default_timeout(void)
|
||||||
|
13
ssl/s2_lib.c
13
ssl/s2_lib.c
@ -230,6 +230,9 @@ static SSL_METHOD SSLv2_data= {
|
|||||||
ssl_bad_method,
|
ssl_bad_method,
|
||||||
ssl2_default_timeout,
|
ssl2_default_timeout,
|
||||||
&ssl3_undef_enc_method,
|
&ssl3_undef_enc_method,
|
||||||
|
ssl_undefined_function,
|
||||||
|
ssl2_callback_ctrl, /* local */
|
||||||
|
ssl2_ctx_callback_ctrl, /* local */
|
||||||
};
|
};
|
||||||
|
|
||||||
static long ssl2_default_timeout(void)
|
static long ssl2_default_timeout(void)
|
||||||
@ -335,11 +338,21 @@ long ssl2_ctrl(SSL *s, int cmd, long larg, char *parg)
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long ssl2_callback_ctrl(SSL *s, int cmd, void (*fp)())
|
||||||
|
{
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
long ssl2_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, char *parg)
|
long ssl2_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, char *parg)
|
||||||
{
|
{
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long ssl2_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)())
|
||||||
|
{
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
/* This function needs to check if the ciphers required are actually
|
/* This function needs to check if the ciphers required are actually
|
||||||
* available */
|
* available */
|
||||||
SSL_CIPHER *ssl2_get_cipher_by_char(const unsigned char *p)
|
SSL_CIPHER *ssl2_get_cipher_by_char(const unsigned char *p)
|
||||||
|
109
ssl/s3_lib.c
109
ssl/s3_lib.c
@ -608,18 +608,9 @@ static SSL_METHOD SSLv3_data= {
|
|||||||
ssl_bad_method,
|
ssl_bad_method,
|
||||||
ssl3_default_timeout,
|
ssl3_default_timeout,
|
||||||
&SSLv3_enc_data,
|
&SSLv3_enc_data,
|
||||||
};
|
ssl_undefined_function,
|
||||||
|
ssl3_callback_ctrl,
|
||||||
union rsa_fn_to_char_u
|
ssl3_ctx_callback_ctrl,
|
||||||
{
|
|
||||||
char *char_p;
|
|
||||||
RSA *(*fn_p)(SSL *, int, int);
|
|
||||||
};
|
|
||||||
|
|
||||||
union dh_fn_to_char_u
|
|
||||||
{
|
|
||||||
char *char_p;
|
|
||||||
DH *(*fn_p)(SSL *, int, int);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static long ssl3_default_timeout(void)
|
static long ssl3_default_timeout(void)
|
||||||
@ -792,10 +783,8 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, char *parg)
|
|||||||
break;
|
break;
|
||||||
case SSL_CTRL_SET_TMP_RSA_CB:
|
case SSL_CTRL_SET_TMP_RSA_CB:
|
||||||
{
|
{
|
||||||
union rsa_fn_to_char_u rsa_tmp_cb;
|
SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||||
|
return(ret);
|
||||||
rsa_tmp_cb.char_p = parg;
|
|
||||||
s->cert->rsa_tmp_cb = rsa_tmp_cb.fn_p;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
@ -824,10 +813,52 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, char *parg)
|
|||||||
break;
|
break;
|
||||||
case SSL_CTRL_SET_TMP_DH_CB:
|
case SSL_CTRL_SET_TMP_DH_CB:
|
||||||
{
|
{
|
||||||
union dh_fn_to_char_u dh_tmp_cb;
|
SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
dh_tmp_cb.char_p = parg;
|
long ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)())
|
||||||
s->cert->dh_tmp_cb = dh_tmp_cb.fn_p;
|
{
|
||||||
|
int ret=0;
|
||||||
|
|
||||||
|
#if !defined(NO_DSA) || !defined(NO_RSA)
|
||||||
|
if (
|
||||||
|
#ifndef NO_RSA
|
||||||
|
cmd == SSL_CTRL_SET_TMP_RSA_CB ||
|
||||||
|
#endif
|
||||||
|
#ifndef NO_DSA
|
||||||
|
cmd == SSL_CTRL_SET_TMP_DH_CB ||
|
||||||
|
#endif
|
||||||
|
0)
|
||||||
|
{
|
||||||
|
if (!ssl_cert_inst(&s->cert))
|
||||||
|
{
|
||||||
|
SSLerr(SSL_F_SSL3_CTRL, ERR_R_MALLOC_FAILURE);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
#ifndef NO_RSA
|
||||||
|
case SSL_CTRL_SET_TMP_RSA_CB:
|
||||||
|
{
|
||||||
|
s->cert->rsa_tmp_cb = (RSA *(*)(SSL *, int, int))fp;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifndef NO_DH
|
||||||
|
case SSL_CTRL_SET_TMP_DH_CB:
|
||||||
|
{
|
||||||
|
s->cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
@ -885,10 +916,8 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, char *parg)
|
|||||||
/* break; */
|
/* break; */
|
||||||
case SSL_CTRL_SET_TMP_RSA_CB:
|
case SSL_CTRL_SET_TMP_RSA_CB:
|
||||||
{
|
{
|
||||||
union rsa_fn_to_char_u rsa_tmp_cb;
|
SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||||
|
return(0);
|
||||||
rsa_tmp_cb.char_p = parg;
|
|
||||||
cert->rsa_tmp_cb = rsa_tmp_cb.fn_p;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
@ -917,10 +946,8 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, char *parg)
|
|||||||
/*break; */
|
/*break; */
|
||||||
case SSL_CTRL_SET_TMP_DH_CB:
|
case SSL_CTRL_SET_TMP_DH_CB:
|
||||||
{
|
{
|
||||||
union dh_fn_to_char_u dh_tmp_cb;
|
SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
|
||||||
|
return(0);
|
||||||
dh_tmp_cb.char_p = parg;
|
|
||||||
cert->dh_tmp_cb = dh_tmp_cb.fn_p;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
@ -940,6 +967,34 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, char *parg)
|
|||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)())
|
||||||
|
{
|
||||||
|
CERT *cert;
|
||||||
|
|
||||||
|
cert=ctx->cert;
|
||||||
|
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
#ifndef NO_RSA
|
||||||
|
case SSL_CTRL_SET_TMP_RSA_CB:
|
||||||
|
{
|
||||||
|
cert->rsa_tmp_cb = (RSA *(*)(SSL *, int, int))fp;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifndef NO_DH
|
||||||
|
case SSL_CTRL_SET_TMP_DH_CB:
|
||||||
|
{
|
||||||
|
cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
/* This function needs to check if the ciphers required are actually
|
/* This function needs to check if the ciphers required are actually
|
||||||
* available */
|
* available */
|
||||||
SSL_CIPHER *ssl3_get_cipher_by_char(const unsigned char *p)
|
SSL_CIPHER *ssl3_get_cipher_by_char(const unsigned char *p)
|
||||||
|
@ -210,6 +210,8 @@ typedef struct ssl_method_st
|
|||||||
long (*get_timeout)(void);
|
long (*get_timeout)(void);
|
||||||
struct ssl3_enc_method *ssl3_enc; /* Extra SSLv3/TLS stuff */
|
struct ssl3_enc_method *ssl3_enc; /* Extra SSLv3/TLS stuff */
|
||||||
int (*ssl_version)();
|
int (*ssl_version)();
|
||||||
|
long (*ssl_callback_ctrl)(SSL *s, int cb_id, void (*fp)());
|
||||||
|
long (*ssl_ctx_callback_ctrl)(SSL_CTX *s, int cb_id, void (*fp)());
|
||||||
} SSL_METHOD;
|
} SSL_METHOD;
|
||||||
|
|
||||||
/* Lets make this into an ASN.1 type structure as follows
|
/* Lets make this into an ASN.1 type structure as follows
|
||||||
|
@ -794,6 +794,15 @@ long SSL_ctrl(SSL *s,int cmd,long larg,char *parg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long SSL_callback_ctrl(SSL *s, int cmd, void (*fp)())
|
||||||
|
{
|
||||||
|
switch(cmd)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
return(s->method->ssl_callback_ctrl(s,cmd,fp));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,char *parg)
|
long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,char *parg)
|
||||||
{
|
{
|
||||||
long l;
|
long l;
|
||||||
@ -853,6 +862,15 @@ long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,char *parg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long SSL_CTX_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)())
|
||||||
|
{
|
||||||
|
switch(cmd)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
return(ctx->method->ssl_ctx_callback_ctrl(ctx,cmd,fp));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int ssl_cipher_id_cmp(SSL_CIPHER *a,SSL_CIPHER *b)
|
int ssl_cipher_id_cmp(SSL_CIPHER *a,SSL_CIPHER *b)
|
||||||
{
|
{
|
||||||
long l;
|
long l;
|
||||||
@ -1988,21 +2006,14 @@ void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,RSA *(*cb)(SSL *ssl,
|
|||||||
int is_export,
|
int is_export,
|
||||||
int keylength))
|
int keylength))
|
||||||
{
|
{
|
||||||
union rsa_fn_to_char_u rsa_tmp_cb;
|
SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,(void (*)())cb);
|
||||||
|
|
||||||
rsa_tmp_cb.fn_p = cb;
|
|
||||||
SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,0,rsa_tmp_cb.char_p);
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef NO_RSA
|
void SSL_set_tmp_rsa_callback(SSL *ssl,RSA *(*cb)(SSL *ssl,
|
||||||
void SSL_set_tmp_rsa_callback(SSL *ssl,RSA *(*cb)(SSL *ssl,int is_export,
|
int is_export,
|
||||||
int keylength))
|
int keylength))
|
||||||
{
|
{
|
||||||
union rsa_fn_to_char_u rsa_tmp_cb;
|
SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_RSA_CB,(void (*)())cb);
|
||||||
|
|
||||||
rsa_tmp_cb.fn_p = cb;
|
|
||||||
SSL_ctrl(ssl,SSL_CTRL_SET_TMP_RSA_CB,0,rsa_tmp_cb.char_p);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -2031,19 +2042,13 @@ RSA *cb(SSL *ssl,int is_export,int keylength)
|
|||||||
void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,DH *(*dh)(SSL *ssl,int is_export,
|
void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,DH *(*dh)(SSL *ssl,int is_export,
|
||||||
int keylength))
|
int keylength))
|
||||||
{
|
{
|
||||||
union dh_fn_to_char_u dh_tmp_cb;
|
SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,(void (*)())dh);
|
||||||
|
|
||||||
dh_tmp_cb.fn_p = dh;
|
|
||||||
SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,0,dh_tmp_cb.char_p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSL_set_tmp_dh_callback(SSL *ssl,DH *(*dh)(SSL *ssl,int is_export,
|
void SSL_set_tmp_dh_callback(SSL *ssl,DH *(*dh)(SSL *ssl,int is_export,
|
||||||
int keylength))
|
int keylength))
|
||||||
{
|
{
|
||||||
union dh_fn_to_char_u dh_tmp_cb;
|
SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_DH_CB,(void (*)())dh);
|
||||||
|
|
||||||
dh_tmp_cb.fn_p = dh;
|
|
||||||
SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH_CB,0,dh_tmp_cb.char_p);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -468,6 +468,8 @@ int ssl2_shutdown(SSL *s);
|
|||||||
void ssl2_clear(SSL *s);
|
void ssl2_clear(SSL *s);
|
||||||
long ssl2_ctrl(SSL *s,int cmd, long larg, char *parg);
|
long ssl2_ctrl(SSL *s,int cmd, long larg, char *parg);
|
||||||
long ssl2_ctx_ctrl(SSL_CTX *s,int cmd, long larg, char *parg);
|
long ssl2_ctx_ctrl(SSL_CTX *s,int cmd, long larg, char *parg);
|
||||||
|
long ssl2_callback_ctrl(SSL *s,int cmd, void (*fp)());
|
||||||
|
long ssl2_ctx_callback_ctrl(SSL_CTX *s,int cmd, void (*fp)());
|
||||||
int ssl2_pending(SSL *s);
|
int ssl2_pending(SSL *s);
|
||||||
|
|
||||||
SSL_CIPHER *ssl3_get_cipher_by_char(const unsigned char *p);
|
SSL_CIPHER *ssl3_get_cipher_by_char(const unsigned char *p);
|
||||||
@ -514,6 +516,8 @@ int ssl3_shutdown(SSL *s);
|
|||||||
void ssl3_clear(SSL *s);
|
void ssl3_clear(SSL *s);
|
||||||
long ssl3_ctrl(SSL *s,int cmd, long larg, char *parg);
|
long ssl3_ctrl(SSL *s,int cmd, long larg, char *parg);
|
||||||
long ssl3_ctx_ctrl(SSL_CTX *s,int cmd, long larg, char *parg);
|
long ssl3_ctx_ctrl(SSL_CTX *s,int cmd, long larg, char *parg);
|
||||||
|
long ssl3_callback_ctrl(SSL *s,int cmd, void (*fp)());
|
||||||
|
long ssl3_ctx_callback_ctrl(SSL_CTX *s,int cmd, void (*fp)());
|
||||||
int ssl3_pending(SSL *s);
|
int ssl3_pending(SSL *s);
|
||||||
|
|
||||||
int ssl23_accept(SSL *s);
|
int ssl23_accept(SSL *s);
|
||||||
@ -525,6 +529,7 @@ int tls1_new(SSL *s);
|
|||||||
void tls1_free(SSL *s);
|
void tls1_free(SSL *s);
|
||||||
void tls1_clear(SSL *s);
|
void tls1_clear(SSL *s);
|
||||||
long tls1_ctrl(SSL *s,int cmd, long larg, char *parg);
|
long tls1_ctrl(SSL *s,int cmd, long larg, char *parg);
|
||||||
|
long tls1_callback_ctrl(SSL *s,int cmd, void (*fp)());
|
||||||
SSL_METHOD *tlsv1_base_method(void );
|
SSL_METHOD *tlsv1_base_method(void );
|
||||||
|
|
||||||
int ssl_init_wbio_buffer(SSL *s, int push);
|
int ssl_init_wbio_buffer(SSL *s, int push);
|
||||||
|
@ -101,6 +101,9 @@ static SSL_METHOD TLSv1_data= {
|
|||||||
ssl_bad_method,
|
ssl_bad_method,
|
||||||
tls1_default_timeout,
|
tls1_default_timeout,
|
||||||
&TLSv1_enc_data,
|
&TLSv1_enc_data,
|
||||||
|
ssl_undefined_function,
|
||||||
|
ssl3_callback_ctrl,
|
||||||
|
ssl3_ctx_callback_ctrl,
|
||||||
};
|
};
|
||||||
|
|
||||||
static long tls1_default_timeout(void)
|
static long tls1_default_timeout(void)
|
||||||
@ -138,4 +141,9 @@ long tls1_ctrl(SSL *s, int cmd, long larg, char *parg)
|
|||||||
{
|
{
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long tls1_callback_ctrl(SSL *s, int cmd, void *(*fp)())
|
||||||
|
{
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user