Safe stack reorganisation in terms of function casts.
[openssl.git] / crypto / bio / bio.h
index dd3cc3f470182e224e53e931f4691f11c49b8e04..68107d97989f8b6bf5b0e1d5d57da5d9a3935477 100644 (file)
 #ifndef HEADER_BIO_H
 #define HEADER_BIO_H
 
-#ifdef  __cplusplus
-extern "C" {
+#ifndef NO_FP_API
+# include <stdio.h>
 #endif
 
-#include <stdio.h>
-#include <stdlib.h>
 #include <openssl/crypto.h>
 
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
 /* These are the 'types' of BIOs */
 #define BIO_TYPE_NONE          0
 #define BIO_TYPE_MEM           (1|0x0400)
@@ -207,19 +209,21 @@ extern "C" {
 #define BIO_method_name(b)             ((b)->method->name)
 #define BIO_method_type(b)             ((b)->method->type)
 
+typedef struct bio_st BIO;
+
 #ifndef WIN16
 typedef struct bio_method_st
        {
        int type;
        const char *name;
-       int (*bwrite)();
-       int (*bread)();
-       int (*bputs)();
-       int (*bgets)();
-       long (*ctrl)();
-       int (*create)();
-       int (*destroy)();
-       long (*callback_ctrl)();
+       int (*bwrite)(BIO *, const char *, int);
+       int (*bread)(BIO *, char *, int);
+       int (*bputs)(BIO *, const char *);
+       int (*bgets)(BIO *, char *, int);
+       long (*ctrl)(BIO *, int, long, void *);
+       int (*create)(BIO *);
+       int (*destroy)(BIO *);
+       long (*callback_ctrl)(BIO *, int, void (*)(struct bio_st *, int, const char *, int, long, long));
        } BIO_METHOD;
 #else
 typedef struct bio_method_st
@@ -237,7 +241,7 @@ typedef struct bio_method_st
        } BIO_METHOD;
 #endif
 
-typedef struct bio_st
+struct bio_st
        {
        BIO_METHOD *method;
        /* bio, mode, argp, argi, argl, ret */
@@ -257,7 +261,9 @@ typedef struct bio_st
        unsigned long num_write;
 
        CRYPTO_EX_DATA ex_data;
-       } BIO;
+       };
+
+DECLARE_STACK_OF(BIO)
 
 typedef struct bio_f_buffer_ctx_struct
        {
@@ -472,11 +478,6 @@ size_t BIO_ctrl_get_write_guarantee(BIO *b);
 size_t BIO_ctrl_get_read_request(BIO *b);
 int BIO_ctrl_reset_read_request(BIO *b);
 
-#ifdef NO_STDIO
-#define NO_FP_API
-#endif
-
-
 /* These two aren't currently implemented */
 /* int BIO_get_ex_num(BIO *bio); */
 /* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */
@@ -487,6 +488,7 @@ int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
 unsigned long BIO_number_read(BIO *bio);
 unsigned long BIO_number_written(BIO *bio);
 
+# ifndef NO_FP_API
 #  if defined(WIN16) && defined(_WINDLL)
 BIO_METHOD *BIO_s_file_internal(void);
 BIO *BIO_new_file_internal(char *filename, char *mode);
@@ -502,15 +504,17 @@ BIO *BIO_new_fp(FILE *stream, int close_flag);
 #    define BIO_new_file_internal      BIO_new_file
 #    define BIO_new_fp_internal                BIO_s_file
 #  endif /* FP_API */
+# endif
 BIO *  BIO_new(BIO_METHOD *type);
 int    BIO_set(BIO *a,BIO_METHOD *type);
 int    BIO_free(BIO *a);
+void   BIO_vfree(BIO *a);
 int    BIO_read(BIO *b, void *data, int len);
 int    BIO_gets(BIO *bp,char *buf, int size);
 int    BIO_write(BIO *b, const void *data, int len);
 int    BIO_puts(BIO *bp,const char *buf);
 long   BIO_ctrl(BIO *bp,int cmd,long larg,void *parg);
-long   BIO_callback_ctrl(BIO *bp,int cmd,void (*fp)());
+long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)(struct bio_st *, int, const char *, int, long, long));
 char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg);
 long   BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg);
 BIO *  BIO_push(BIO *b,BIO *append);