218 |
nbytes = 0; |
nbytes = 0; |
219 |
else |
else |
220 |
{ |
{ |
221 |
status = _file_read (stream, optr, osize, fs_offset, &nbytes); |
status = _file_read (stream, optr, osize, fs_offset, &nbytes); |
222 |
if (status == 0 && nbytes) |
if (status == 0 && nbytes) |
223 |
{ |
{ |
224 |
size_t k; |
size_t k; |
225 |
|
|
226 |
status = stream_write (fs->cache, optr, nbytes, fs_offset, &k); |
status = stream_write (fs->cache, optr, nbytes, fs_offset, &k); |
227 |
if (status) |
if (status) |
228 |
return status; |
return status; |
229 |
if (k != nbytes) |
if (k != nbytes) |
230 |
return EIO; |
return EIO; |
231 |
} |
} |
232 |
} |
} |
233 |
if (pnbytes) |
if (pnbytes) |
234 |
*pnbytes = nbytes; |
*pnbytes = nbytes; |
464 |
} |
} |
465 |
|
|
466 |
int |
int |
467 |
|
_file_strerror (stream_t unused, const char **pstr) |
468 |
|
{ |
469 |
|
*pstr = strerror (errno); |
470 |
|
return 0; |
471 |
|
} |
472 |
|
|
473 |
|
int |
474 |
file_stream_create (stream_t *stream, const char* filename, int flags) |
file_stream_create (stream_t *stream, const char* filename, int flags) |
475 |
{ |
{ |
476 |
struct _file_stream *fs; |
struct _file_stream *fs; |
507 |
stream_set_size (*stream, _file_size, fs); |
stream_set_size (*stream, _file_size, fs); |
508 |
stream_set_flush (*stream, _file_flush, fs); |
stream_set_flush (*stream, _file_flush, fs); |
509 |
stream_set_destroy (*stream, _file_destroy, fs); |
stream_set_destroy (*stream, _file_destroy, fs); |
510 |
|
stream_set_strerror (*stream, _file_strerror, fs); |
511 |
|
|
512 |
return 0; |
return 0; |
513 |
} |
} |
514 |
|
|
515 |
int |
int |
516 |
stdio_stream_create (stream_t *stream, FILE* file, int flags) |
stdio_stream_create (stream_t *stream, FILE *file, int flags) |
517 |
{ |
{ |
518 |
struct _file_stream *fs; |
struct _file_stream *fs; |
519 |
int ret; |
int ret; |
537 |
return ret; |
return ret; |
538 |
} |
} |
539 |
|
|
540 |
if ((ret = memory_stream_create (&fs->cache, 0, MU_STREAM_RDWR)) |
/* Check if we need to enable caching */ |
541 |
|| (ret = stream_open (fs->cache))) |
|
542 |
|
if ((flags & MU_STREAM_SEEKABLE) && lseek (fileno (file), 0, 0)) |
543 |
{ |
{ |
544 |
stream_destroy (stream, fs); |
if ((ret = memory_stream_create (&fs->cache, 0, MU_STREAM_RDWR)) |
545 |
free (fs); |
|| (ret = stream_open (fs->cache))) |
546 |
return ret; |
{ |
547 |
|
stream_destroy (stream, fs); |
548 |
|
free (fs); |
549 |
|
return ret; |
550 |
|
} |
551 |
|
stream_set_read (*stream, _stdin_file_read, fs); |
552 |
|
stream_set_readline (*stream, _stdin_file_readline, fs); |
553 |
|
stream_set_write (*stream, _stdout_file_write, fs); |
554 |
} |
} |
555 |
|
else |
556 |
|
{ |
557 |
|
stream_set_read (*stream, _file_read, fs); |
558 |
|
stream_set_readline (*stream, _file_readline, fs); |
559 |
|
stream_set_write (*stream, _file_write, fs); |
560 |
|
} |
561 |
|
|
562 |
/* We don't need to open the FILE, just return success. */ |
/* We don't need to open the FILE, just return success. */ |
563 |
|
|
564 |
stream_set_open (*stream, NULL, fs); |
stream_set_open (*stream, NULL, fs); |
565 |
stream_set_close (*stream, _file_close, fs); |
stream_set_close (*stream, _file_close, fs); |
566 |
stream_set_fd (*stream, _file_get_fd, fs); |
stream_set_fd (*stream, _file_get_fd, fs); |
|
stream_set_read (*stream, _stdin_file_read, fs); |
|
|
stream_set_readline (*stream, _stdin_file_readline, fs); |
|
|
stream_set_write (*stream, _stdout_file_write, fs); |
|
567 |
stream_set_flush (*stream, _file_flush, fs); |
stream_set_flush (*stream, _file_flush, fs); |
568 |
stream_set_destroy (*stream, _file_destroy, fs); |
stream_set_destroy (*stream, _file_destroy, fs); |
569 |
|
|