X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=crypto%2Fbio%2Fbss_conn.c;h=22d00b369ecbc2ec0923b0d1212507e950948e6f;hb=c04949e97877c7e9e362ab3022b2e7d4988b3e37;hp=6deee1a35fd8fe29e050b45fd197b3420d6d718f;hpb=657e60fa00ddde3618600d6306be913214d30457;p=oweals%2Fopenssl.git diff --git a/crypto/bio/bss_conn.c b/crypto/bio/bss_conn.c index 6deee1a35f..22d00b369e 100644 --- a/crypto/bio/bss_conn.c +++ b/crypto/bio/bss_conn.c @@ -98,18 +98,13 @@ typedef struct bio_connect_st int (*info_callback)(); } 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_read(BIO *h,char *buf,int size); static int conn_puts(BIO *h,char *str); static long conn_ctrl(BIO *h,int cmd,long arg1,char *arg2); static int conn_new(BIO *h); 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 void conn_close_socket(BIO *data); @@ -127,6 +122,7 @@ static BIO_METHOD methods_connectp= conn_ctrl, conn_new, conn_free, + conn_callback_ctrl, }; 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; case BIO_CTRL_DUP: { - union int_fn_to_char_u tmp_cb; - dbio=(BIO *)ptr; if (data->param_port) BIO_set_conn_port(dbio,data->param_port); if (data->param_hostname) BIO_set_conn_hostname(dbio,data->param_hostname); BIO_set_nbio(dbio,data->nbio); - tmp_cb.fn_p=data->info_callback; - (void)BIO_set_info_callback(dbio,tmp_cb.char_p); + (void)BIO_set_info_callback(dbio,(void *(*)())(data->info_callback)); } break; case BIO_CTRL_SET_CALLBACK: { - union int_fn_to_char_u tmp_cb; - - tmp_cb.char_p=ptr; - data->info_callback=tmp_cb.fn_p; +#if 0 /* FIXME: Should this be used? -- Richard Levitte */ + BIOerr(BIO_F_CONN_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + ret = -1; +#else + ret=0; +#endif } break; case BIO_CTRL_GET_CALLBACK: @@ -606,6 +601,27 @@ static long conn_ctrl(BIO *b, int cmd, long num, char *ptr) 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) { int n,ret;