summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bio/bss_file.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/bio/bss_file.c')
-rw-r--r--src/lib/libcrypto/bio/bss_file.c91
1 files changed, 35 insertions, 56 deletions
diff --git a/src/lib/libcrypto/bio/bss_file.c b/src/lib/libcrypto/bio/bss_file.c
index 1484cf849e..8b3ff278d9 100644
--- a/src/lib/libcrypto/bio/bss_file.c
+++ b/src/lib/libcrypto/bio/bss_file.c
@@ -68,29 +68,18 @@
68#include <stdio.h> 68#include <stdio.h>
69#include <errno.h> 69#include <errno.h>
70#include "cryptlib.h" 70#include "cryptlib.h"
71#include "bio.h" 71#include <openssl/bio.h>
72#include "err.h" 72#include <openssl/err.h>
73 73
74#if !defined(NO_STDIO) 74#if !defined(OPENSSL_NO_STDIO)
75 75
76#ifndef NOPROTO 76static int MS_CALLBACK file_write(BIO *h, const char *buf, int num);
77static int MS_CALLBACK file_write(BIO *h,char *buf,int num); 77static int MS_CALLBACK file_read(BIO *h, char *buf, int size);
78static int MS_CALLBACK file_read(BIO *h,char *buf,int size); 78static int MS_CALLBACK file_puts(BIO *h, const char *str);
79static int MS_CALLBACK file_puts(BIO *h,char *str); 79static int MS_CALLBACK file_gets(BIO *h, char *str, int size);
80static int MS_CALLBACK file_gets(BIO *h,char *str,int size); 80static long MS_CALLBACK file_ctrl(BIO *h, int cmd, long arg1, void *arg2);
81static long MS_CALLBACK file_ctrl(BIO *h,int cmd,long arg1,char *arg2);
82static int MS_CALLBACK file_new(BIO *h); 81static int MS_CALLBACK file_new(BIO *h);
83static int MS_CALLBACK file_free(BIO *data); 82static int MS_CALLBACK file_free(BIO *data);
84#else
85static int MS_CALLBACK file_write();
86static int MS_CALLBACK file_read();
87static int MS_CALLBACK file_puts();
88static int MS_CALLBACK file_gets();
89static long MS_CALLBACK file_ctrl();
90static int MS_CALLBACK file_new();
91static int MS_CALLBACK file_free();
92#endif
93
94static BIO_METHOD methods_filep= 83static BIO_METHOD methods_filep=
95 { 84 {
96 BIO_TYPE_FILE, 85 BIO_TYPE_FILE,
@@ -102,11 +91,10 @@ static BIO_METHOD methods_filep=
102 file_ctrl, 91 file_ctrl,
103 file_new, 92 file_new,
104 file_free, 93 file_free,
94 NULL,
105 }; 95 };
106 96
107BIO *BIO_new_file(filename,mode) 97BIO *BIO_new_file(const char *filename, const char *mode)
108char *filename;
109char *mode;
110 { 98 {
111 BIO *ret; 99 BIO *ret;
112 FILE *file; 100 FILE *file;
@@ -115,7 +103,10 @@ char *mode;
115 { 103 {
116 SYSerr(SYS_F_FOPEN,get_last_sys_error()); 104 SYSerr(SYS_F_FOPEN,get_last_sys_error());
117 ERR_add_error_data(5,"fopen('",filename,"','",mode,"')"); 105 ERR_add_error_data(5,"fopen('",filename,"','",mode,"')");
118 BIOerr(BIO_F_BIO_NEW_FILE,ERR_R_SYS_LIB); 106 if (errno == ENOENT)
107 BIOerr(BIO_F_BIO_NEW_FILE,BIO_R_NO_SUCH_FILE);
108 else
109 BIOerr(BIO_F_BIO_NEW_FILE,ERR_R_SYS_LIB);
119 return(NULL); 110 return(NULL);
120 } 111 }
121 if ((ret=BIO_new(BIO_s_file_internal())) == NULL) 112 if ((ret=BIO_new(BIO_s_file_internal())) == NULL)
@@ -125,9 +116,7 @@ char *mode;
125 return(ret); 116 return(ret);
126 } 117 }
127 118
128BIO *BIO_new_fp(stream,close_flag) 119BIO *BIO_new_fp(FILE *stream, int close_flag)
129FILE *stream;
130int close_flag;
131 { 120 {
132 BIO *ret; 121 BIO *ret;
133 122
@@ -138,13 +127,12 @@ int close_flag;
138 return(ret); 127 return(ret);
139 } 128 }
140 129
141BIO_METHOD *BIO_s_file() 130BIO_METHOD *BIO_s_file(void)
142 { 131 {
143 return(&methods_filep); 132 return(&methods_filep);
144 } 133 }
145 134
146static int MS_CALLBACK file_new(bi) 135static int MS_CALLBACK file_new(BIO *bi)
147BIO *bi;
148 { 136 {
149 bi->init=0; 137 bi->init=0;
150 bi->num=0; 138 bi->num=0;
@@ -152,8 +140,7 @@ BIO *bi;
152 return(1); 140 return(1);
153 } 141 }
154 142
155static int MS_CALLBACK file_free(a) 143static int MS_CALLBACK file_free(BIO *a)
156BIO *a;
157 { 144 {
158 if (a == NULL) return(0); 145 if (a == NULL) return(0);
159 if (a->shutdown) 146 if (a->shutdown)
@@ -168,10 +155,7 @@ BIO *a;
168 return(1); 155 return(1);
169 } 156 }
170 157
171static int MS_CALLBACK file_read(b,out,outl) 158static int MS_CALLBACK file_read(BIO *b, char *out, int outl)
172BIO *b;
173char *out;
174int outl;
175 { 159 {
176 int ret=0; 160 int ret=0;
177 161
@@ -182,10 +166,7 @@ int outl;
182 return(ret); 166 return(ret);
183 } 167 }
184 168
185static int MS_CALLBACK file_write(b,in,inl) 169static int MS_CALLBACK file_write(BIO *b, const char *in, int inl)
186BIO *b;
187char *in;
188int inl;
189 { 170 {
190 int ret=0; 171 int ret=0;
191 172
@@ -194,18 +175,14 @@ int inl;
194 if (fwrite(in,(int)inl,1,(FILE *)b->ptr)) 175 if (fwrite(in,(int)inl,1,(FILE *)b->ptr))
195 ret=inl; 176 ret=inl;
196 /* ret=fwrite(in,1,(int)inl,(FILE *)b->ptr); */ 177 /* ret=fwrite(in,1,(int)inl,(FILE *)b->ptr); */
197 /* acording to Tim Hudson <tjh@cryptsoft.com>, the commented 178 /* according to Tim Hudson <tjh@cryptsoft.com>, the commented
198 * out version above can cause 'inl' write calls under 179 * out version above can cause 'inl' write calls under
199 * some stupid stdio implementations (VMS) */ 180 * some stupid stdio implementations (VMS) */
200 } 181 }
201 return(ret); 182 return(ret);
202 } 183 }
203 184
204static long MS_CALLBACK file_ctrl(b,cmd,num,ptr) 185static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr)
205BIO *b;
206int cmd;
207long num;
208char *ptr;
209 { 186 {
210 long ret=1; 187 long ret=1;
211 FILE *fp=(FILE *)b->ptr; 188 FILE *fp=(FILE *)b->ptr;
@@ -214,26 +191,33 @@ char *ptr;
214 191
215 switch (cmd) 192 switch (cmd)
216 { 193 {
194 case BIO_C_FILE_SEEK:
217 case BIO_CTRL_RESET: 195 case BIO_CTRL_RESET:
218 ret=(long)fseek(fp,num,0); 196 ret=(long)fseek(fp,num,0);
219 break; 197 break;
220 case BIO_CTRL_EOF: 198 case BIO_CTRL_EOF:
221 ret=(long)feof(fp); 199 ret=(long)feof(fp);
222 break; 200 break;
201 case BIO_C_FILE_TELL:
223 case BIO_CTRL_INFO: 202 case BIO_CTRL_INFO:
224 ret=ftell(fp); 203 ret=ftell(fp);
225 break; 204 break;
226 case BIO_C_SET_FILE_PTR: 205 case BIO_C_SET_FILE_PTR:
227 file_free(b); 206 file_free(b);
228 b->shutdown=(int)num; 207 b->shutdown=(int)num&BIO_CLOSE;
229 b->ptr=(char *)ptr; 208 b->ptr=(char *)ptr;
230 b->init=1; 209 b->init=1;
231#if defined(MSDOS) || defined(WINDOWS) 210#if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS)
232 /* Set correct text/binary mode */ 211 /* Set correct text/binary mode */
233 if (num & BIO_FP_TEXT) 212 if (num & BIO_FP_TEXT)
234 _setmode(fileno((FILE *)ptr),_O_TEXT); 213 _setmode(fileno((FILE *)ptr),_O_TEXT);
235 else 214 else
236 _setmode(fileno((FILE *)ptr),_O_BINARY); 215 _setmode(fileno((FILE *)ptr),_O_BINARY);
216#elif defined(OPENSSL_SYS_OS2)
217 if (num & BIO_FP_TEXT)
218 setmode(fileno((FILE *)ptr), O_TEXT);
219 else
220 setmode(fileno((FILE *)ptr), O_BINARY);
237#endif 221#endif
238 break; 222 break;
239 case BIO_C_SET_FILENAME: 223 case BIO_C_SET_FILENAME:
@@ -257,7 +241,7 @@ char *ptr;
257 ret=0; 241 ret=0;
258 break; 242 break;
259 } 243 }
260#if defined(MSDOS) || defined(WINDOWS) 244#if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS)
261 if (!(num & BIO_FP_TEXT)) 245 if (!(num & BIO_FP_TEXT))
262 strcat(p,"b"); 246 strcat(p,"b");
263 else 247 else
@@ -307,10 +291,7 @@ char *ptr;
307 return(ret); 291 return(ret);
308 } 292 }
309 293
310static int MS_CALLBACK file_gets(bp,buf,size) 294static int MS_CALLBACK file_gets(BIO *bp, char *buf, int size)
311BIO *bp;
312char *buf;
313int size;
314 { 295 {
315 int ret=0; 296 int ret=0;
316 297
@@ -321,9 +302,7 @@ int size;
321 return(ret); 302 return(ret);
322 } 303 }
323 304
324static int MS_CALLBACK file_puts(bp,str) 305static int MS_CALLBACK file_puts(BIO *bp, const char *str)
325BIO *bp;
326char *str;
327 { 306 {
328 int n,ret; 307 int n,ret;
329 308
@@ -332,7 +311,7 @@ char *str;
332 return(ret); 311 return(ret);
333 } 312 }
334 313
335#endif /* NO_STDIO */ 314#endif /* OPENSSL_NO_STDIO */
336 315
337#endif /* HEADER_BSS_FILE_C */ 316#endif /* HEADER_BSS_FILE_C */
338 317