Changeset 58898d1d in mainline for uspace/lib/c/generic/io/io.c
- Timestamp:
- 2017-03-24T20:31:54Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8e9b2534
- Parents:
- c9e3692
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/io/io.c
rc9e3692 r58898d1d 41 41 #include <stdbool.h> 42 42 #include <malloc.h> 43 #include <sys/stat.h> 43 44 #include <async.h> 44 45 #include <io/kio.h> … … 56 57 static FILE stdin_null = { 57 58 .fd = -1, 59 .pos = 0, 58 60 .error = true, 59 61 .eof = true, … … 70 72 static FILE stdout_kio = { 71 73 .fd = -1, 74 .pos = 0, 72 75 .error = false, 73 76 .eof = false, … … 84 87 static FILE stderr_kio = { 85 88 .fd = -1, 89 .pos = 0, 86 90 .error = false, 87 91 .eof = false, … … 288 292 } 289 293 294 stream->pos = 0; 290 295 stream->error = false; 291 296 stream->eof = false; … … 311 316 312 317 stream->fd = fd; 318 stream->pos = 0; 313 319 stream->error = false; 314 320 stream->eof = false; … … 396 402 static size_t _fread(void *buf, size_t size, size_t nmemb, FILE *stream) 397 403 { 398 size_t left, done;399 400 404 if (size == 0 || nmemb == 0) 401 405 return 0; 402 406 403 left = size * nmemb; 404 done = 0; 405 406 while ((left > 0) && (!stream->error) && (!stream->eof)) { 407 ssize_t rd = read(stream->fd, buf + done, left); 408 409 if (rd < 0) { 410 /* errno was set by read() */ 411 stream->error = true; 412 } else if (rd == 0) { 413 stream->eof = true; 414 } else { 415 left -= rd; 416 done += rd; 417 } 418 } 419 420 return (done / size); 407 ssize_t rd = read(stream->fd, &stream->pos, buf, size * nmemb); 408 if (rd < 0) { 409 /* errno was set by read() */ 410 stream->error = true; 411 rd = 0; 412 } else if (rd == 0) { 413 stream->eof = true; 414 } 415 416 return (rd / size); 421 417 } 422 418 … … 433 429 static size_t _fwrite(const void *buf, size_t size, size_t nmemb, FILE *stream) 434 430 { 435 size_t left;436 size_t done;437 int rc;438 439 431 if (size == 0 || nmemb == 0) 440 432 return 0; 441 433 442 left = size * nmemb; 443 done = 0; 444 445 while ((left > 0) && (!stream->error)) { 446 ssize_t wr; 447 size_t uwr; 448 449 if (stream->kio) { 450 uwr = 0; 451 rc = kio_write(buf + done, left, &uwr); 452 if (rc != EOK) 453 errno = rc; 434 ssize_t wr; 435 if (stream->kio) { 436 size_t nwritten; 437 wr = kio_write(buf, size * nmemb, &nwritten); 438 if (wr != EOK) { 439 stream->error = true; 440 wr = 0; 454 441 } else { 455 wr = write(stream->fd, buf + done, left); 456 if (wr >= 0) { 457 uwr = (size_t)wr; 458 rc = EOK; 459 } else { 460 /* errno was set by write */ 461 uwr = 0; 462 rc = errno; 463 } 464 } 465 466 if (rc != EOK) { 467 /* errno was set above */ 442 wr = nwritten; 443 } 444 } else { 445 wr = write(stream->fd, &stream->pos, buf, size * nmemb); 446 if (wr < 0) { 447 /* errno was set by write() */ 468 448 stream->error = true; 469 } else { 470 left -= uwr; 471 done += uwr; 472 } 473 } 474 475 if (done > 0) 449 wr = 0; 450 } 451 } 452 453 if (wr > 0) 476 454 stream->need_sync = true; 477 455 478 return ( done/ size);456 return (wr / size); 479 457 } 480 458 … … 489 467 stream->buf_head = stream->buf_tail = stream->buf; 490 468 491 rc = read(stream->fd, stream->buf, stream->buf_size);469 rc = read(stream->fd, &stream->pos, stream->buf, stream->buf_size); 492 470 if (rc < 0) { 493 471 /* errno was set by read() */ … … 516 494 517 495 /* If buffer has prefetched read data, we need to seek back. */ 518 if (bytes_used > 0 && stream->buf_state == _bs_read) { 519 off64_t rc; 520 rc = lseek(stream->fd, - (ssize_t) bytes_used, SEEK_CUR); 521 if (rc == (off64_t)-1) { 522 /* errno was set by lseek */ 523 stream->error = 1; 524 return; 525 } 526 } 496 if (bytes_used > 0 && stream->buf_state == _bs_read) 497 stream->pos -= bytes_used; 527 498 528 499 /* If buffer has unwritten data, we need to write them out. */ … … 796 767 int fseek(FILE *stream, off64_t offset, int whence) 797 768 { 798 off64_t rc;799 800 769 if (stream->error) 801 return EOF;770 return -1; 802 771 803 772 _fflushbuf(stream); 804 773 if (stream->error) { 805 774 /* errno was set by _fflushbuf() */ 806 return EOF;775 return -1; 807 776 } 808 777 809 778 stream->ungetc_chars = 0; 810 779 811 rc = lseek(stream->fd, offset, whence); 812 if (rc == (off64_t) (-1)) { 813 /* errno has been set by lseek() */ 814 return EOF; 780 struct stat st; 781 switch (whence) { 782 case SEEK_SET: 783 stream->pos = offset; 784 break; 785 case SEEK_CUR: 786 stream->pos += offset; 787 break; 788 case SEEK_END: 789 if (fstat(stream->fd, &st) != EOK) { 790 /* errno was set by fstat() */ 791 stream->error = true; 792 return -1; 793 } 794 stream->pos = st.size + offset; 795 break; 815 796 } 816 797 … … 821 802 off64_t ftell(FILE *stream) 822 803 { 823 off64_t pos;824 825 804 if (stream->error) 826 805 return EOF; … … 832 811 } 833 812 834 pos = lseek(stream->fd, 0, SEEK_CUR); 835 if (pos == (off64_t) -1) { 836 /* errno was set by lseek */ 837 return (off64_t) -1; 838 } 839 840 return pos - stream->ungetc_chars; 813 return stream->pos - stream->ungetc_chars; 841 814 } 842 815
Note:
See TracChangeset
for help on using the changeset viewer.