diff options
Diffstat (limited to 'src/lib/libcrypto/bio/bss_fd.c')
-rw-r--r-- | src/lib/libcrypto/bio/bss_fd.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/src/lib/libcrypto/bio/bss_fd.c b/src/lib/libcrypto/bio/bss_fd.c index 5e3e187de6..4c229bf641 100644 --- a/src/lib/libcrypto/bio/bss_fd.c +++ b/src/lib/libcrypto/bio/bss_fd.c | |||
@@ -60,7 +60,19 @@ | |||
60 | #include <errno.h> | 60 | #include <errno.h> |
61 | #define USE_SOCKETS | 61 | #define USE_SOCKETS |
62 | #include "cryptlib.h" | 62 | #include "cryptlib.h" |
63 | #include <openssl/bio.h> | 63 | /* |
64 | * As for unconditional usage of "UPLINK" interface in this module. | ||
65 | * Trouble is that unlike Unix file descriptors [which are indexes | ||
66 | * in kernel-side per-process table], corresponding descriptors on | ||
67 | * platforms which require "UPLINK" interface seem to be indexes | ||
68 | * in a user-land, non-global table. Well, in fact they are indexes | ||
69 | * in stdio _iob[], and recall that _iob[] was the very reason why | ||
70 | * "UPLINK" interface was introduced in first place. But one way on | ||
71 | * another. Neither libcrypto or libssl use this BIO meaning that | ||
72 | * file descriptors can only be provided by application. Therefore | ||
73 | * "UPLINK" calls are due... | ||
74 | */ | ||
75 | #include "bio_lcl.h" | ||
64 | 76 | ||
65 | static int fd_write(BIO *h, const char *buf, int num); | 77 | static int fd_write(BIO *h, const char *buf, int num); |
66 | static int fd_read(BIO *h, char *buf, int size); | 78 | static int fd_read(BIO *h, char *buf, int size); |
@@ -100,9 +112,9 @@ BIO *BIO_new_fd(int fd,int close_flag) | |||
100 | static int fd_new(BIO *bi) | 112 | static int fd_new(BIO *bi) |
101 | { | 113 | { |
102 | bi->init=0; | 114 | bi->init=0; |
103 | bi->num=0; | 115 | bi->num=-1; |
104 | bi->ptr=NULL; | 116 | bi->ptr=NULL; |
105 | bi->flags=0; | 117 | bi->flags=BIO_FLAGS_UPLINK; /* essentially redundant */ |
106 | return(1); | 118 | return(1); |
107 | } | 119 | } |
108 | 120 | ||
@@ -113,10 +125,10 @@ static int fd_free(BIO *a) | |||
113 | { | 125 | { |
114 | if (a->init) | 126 | if (a->init) |
115 | { | 127 | { |
116 | close(a->num); | 128 | UP_close(a->num); |
117 | } | 129 | } |
118 | a->init=0; | 130 | a->init=0; |
119 | a->flags=0; | 131 | a->flags=BIO_FLAGS_UPLINK; |
120 | } | 132 | } |
121 | return(1); | 133 | return(1); |
122 | } | 134 | } |
@@ -128,7 +140,7 @@ static int fd_read(BIO *b, char *out,int outl) | |||
128 | if (out != NULL) | 140 | if (out != NULL) |
129 | { | 141 | { |
130 | clear_sys_error(); | 142 | clear_sys_error(); |
131 | ret=read(b->num,out,outl); | 143 | ret=UP_read(b->num,out,outl); |
132 | BIO_clear_retry_flags(b); | 144 | BIO_clear_retry_flags(b); |
133 | if (ret <= 0) | 145 | if (ret <= 0) |
134 | { | 146 | { |
@@ -143,7 +155,7 @@ static int fd_write(BIO *b, const char *in, int inl) | |||
143 | { | 155 | { |
144 | int ret; | 156 | int ret; |
145 | clear_sys_error(); | 157 | clear_sys_error(); |
146 | ret=write(b->num,in,inl); | 158 | ret=UP_write(b->num,in,inl); |
147 | BIO_clear_retry_flags(b); | 159 | BIO_clear_retry_flags(b); |
148 | if (ret <= 0) | 160 | if (ret <= 0) |
149 | { | 161 | { |
@@ -163,11 +175,11 @@ static long fd_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
163 | case BIO_CTRL_RESET: | 175 | case BIO_CTRL_RESET: |
164 | num=0; | 176 | num=0; |
165 | case BIO_C_FILE_SEEK: | 177 | case BIO_C_FILE_SEEK: |
166 | ret=(long)lseek(b->num,num,0); | 178 | ret=(long)UP_lseek(b->num,num,0); |
167 | break; | 179 | break; |
168 | case BIO_C_FILE_TELL: | 180 | case BIO_C_FILE_TELL: |
169 | case BIO_CTRL_INFO: | 181 | case BIO_CTRL_INFO: |
170 | ret=(long)lseek(b->num,0,1); | 182 | ret=(long)UP_lseek(b->num,0,1); |
171 | break; | 183 | break; |
172 | case BIO_C_SET_FD: | 184 | case BIO_C_SET_FD: |
173 | fd_free(b); | 185 | fd_free(b); |