work around a bug in BN_div_recp or BN_reciprocal
[oweals/openssl.git] / crypto / bio / bss_conn.c
index 6deee1a35fd8fe29e050b45fd197b3420d6d718f..22d00b369ecbc2ec0923b0d1212507e950948e6f 100644 (file)
@@ -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;