Changeset 58898d1d in mainline for uspace/lib/c/generic
- 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
- Location:
- uspace/lib/c/generic
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/elf/elf_mod.c
rc9e3692 r58898d1d 135 135 elf_header_t header_buf; 136 136 elf_header_t *header = &header_buf; 137 aoff64_t pos = 0; 137 138 int i, rc; 138 139 139 rc = read(elf->fd, header, sizeof(elf_header_t));140 rc = read(elf->fd, &pos, header, sizeof(elf_header_t)); 140 141 if (rc != sizeof(elf_header_t)) { 141 142 DPRINTF("Read error.\n"); … … 195 196 elf_segment_header_t segment_hdr; 196 197 197 /* Seek to start of segment header */ 198 lseek(elf->fd, header->e_phoff 199 + i * sizeof(elf_segment_header_t), SEEK_SET); 200 201 rc = read(elf->fd, &segment_hdr, 198 pos = header->e_phoff + i * sizeof(elf_segment_header_t); 199 rc = read(elf->fd, &pos, &segment_hdr, 202 200 sizeof(elf_segment_header_t)); 203 201 if (rc != sizeof(elf_segment_header_t)) { … … 217 215 elf_section_header_t section_hdr; 218 216 219 /* Seek to start of section header */ 220 lseek(elf->fd, header->e_shoff 221 + i * sizeof(elf_section_header_t), SEEK_SET); 222 223 rc = read(elf->fd, §ion_hdr, 217 pos = header->e_shoff + i * sizeof(elf_section_header_t); 218 rc = read(elf->fd, &pos, §ion_hdr, 224 219 sizeof(elf_section_header_t)); 225 220 if (rc != sizeof(elf_section_header_t)) { … … 333 328 uintptr_t seg_addr; 334 329 size_t mem_sz; 330 aoff64_t pos; 335 331 ssize_t rc; 336 332 … … 390 386 * Load segment data 391 387 */ 392 rc = lseek(elf->fd, entry->p_offset, SEEK_SET); 393 if (rc < 0) { 394 printf("seek error\n"); 395 return EE_INVALID; 396 } 397 398 rc = read(elf->fd, seg_ptr, entry->p_filesz); 388 pos = entry->p_offset; 389 rc = read(elf->fd, &pos, seg_ptr, entry->p_filesz); 399 390 if (rc < 0) { 400 391 DPRINTF("read error\n"); -
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 -
uspace/lib/c/generic/private/stdio.h
rc9e3692 r58898d1d 49 49 /** Underlying file descriptor. */ 50 50 int fd; 51 52 /** File position. */ 53 aoff64_t pos; 51 54 52 55 /** Error indicator. */ -
uspace/lib/c/generic/vfs/vfs.c
rc9e3692 r58898d1d 444 444 * 445 445 * @param fildes File descriptor 446 * @param pos Position to read from 446 447 * @param buf Buffer 447 448 * @param nbyte Maximum number of bytes to read … … 450 451 * @return EOK on success, non-zero error code on error. 451 452 */ 452 static int _read_short(int fildes, void *buf, size_t nbyte, ssize_t *nread) 453 static int _read_short(int fildes, aoff64_t pos, void *buf, size_t nbyte, 454 ssize_t *nread) 453 455 { 454 456 sysarg_t rc; … … 461 463 async_exch_t *exch = vfs_exchange_begin(); 462 464 463 req = async_send_1(exch, VFS_IN_READ, fildes, &answer); 465 req = async_send_3(exch, VFS_IN_READ, fildes, LOWER32(pos), 466 UPPER32(pos), &answer); 464 467 rc = async_data_read_start(exch, (void *) buf, nbyte); 465 468 … … 484 487 * 485 488 * @param fildes File descriptor 489 * @param pos Position to write to 486 490 * @param buf Buffer 487 491 * @param nbyte Maximum number of bytes to write … … 490 494 * @return EOK on success, non-zero error code on error. 491 495 */ 492 static int _write_short(int fildes, const void *buf, size_t nbyte,496 static int _write_short(int fildes, aoff64_t pos, const void *buf, size_t nbyte, 493 497 ssize_t *nwritten) 494 498 { … … 502 506 async_exch_t *exch = vfs_exchange_begin(); 503 507 504 req = async_send_1(exch, VFS_IN_WRITE, fildes, &answer); 508 req = async_send_3(exch, VFS_IN_WRITE, fildes, LOWER32(pos), 509 UPPER32(pos), &answer); 505 510 rc = async_data_write_start(exch, (void *) buf, nbyte); 506 511 … … 525 530 * 526 531 * @param fildes File descriptor 532 * @param pos Pointer to position to read from 527 533 * @param buf Buffer, @a nbytes bytes long 528 534 * @param nbytes Number of bytes to read … … 531 537 * On failure, -1 and sets errno. 532 538 */ 533 ssize_t read(int fildes, void *buf, size_t nbyte)539 ssize_t read(int fildes, aoff64_t *pos, void *buf, size_t nbyte) 534 540 { 535 541 ssize_t cnt = 0; … … 541 547 bp += cnt; 542 548 nread += cnt; 543 rc = _read_short(fildes, bp, nbyte - nread, &cnt); 549 *pos += cnt; 550 rc = _read_short(fildes, *pos, bp, nbyte - nread, &cnt); 544 551 } while (rc == EOK && cnt > 0 && (nbyte - nread - cnt) > 0); 545 552 … … 549 556 } 550 557 558 *pos += cnt; 551 559 return nread + cnt; 552 560 } … … 557 565 * 558 566 * @param fildes File descriptor 567 * @param pos Pointer to position to write to 559 568 * @param buf Data, @a nbytes bytes long 560 569 * @param nbytes Number of bytes to write … … 563 572 * On failure, -1 and sets errno. 564 573 */ 565 ssize_t write(int fildes, const void *buf, size_t nbyte)574 ssize_t write(int fildes, aoff64_t *pos, const void *buf, size_t nbyte) 566 575 { 567 576 ssize_t cnt = 0; … … 573 582 bp += cnt; 574 583 nwritten += cnt; 575 rc = _write_short(fildes, bp, nbyte - nwritten, &cnt); 584 *pos += cnt; 585 rc = _write_short(fildes, *pos, bp, nbyte - nwritten, &cnt); 576 586 } while (rc == EOK && ((ssize_t )nbyte - nwritten - cnt) > 0); 577 587 … … 581 591 } 582 592 593 *pos += cnt; 583 594 return nbyte; 584 595 } … … 601 612 602 613 return 0; 603 }604 605 /** Seek to a position.606 *607 * @param fildes File descriptor608 * @param offset Offset609 * @param whence SEEK_SET, SEEK_CUR or SEEK_END610 *611 * @return On success the nonnegative offset from start of file. On error612 * returns (off64_t)-1 and sets errno.613 */614 off64_t lseek(int fildes, off64_t offset, int whence)615 {616 async_exch_t *exch = vfs_exchange_begin();617 618 sysarg_t newoff_lo;619 sysarg_t newoff_hi;620 sysarg_t rc = async_req_4_2(exch, VFS_IN_SEEK, fildes,621 LOWER32(offset), UPPER32(offset), whence,622 &newoff_lo, &newoff_hi);623 624 vfs_exchange_end(exch);625 626 if (rc != EOK) {627 errno = rc;628 return (off64_t) -1;629 }630 631 return (off64_t) MERGE_LOUP32(newoff_lo, newoff_hi);632 614 } 633 615 … … 757 739 758 740 dirp->fd = fd; 741 dirp->pos = 0; 759 742 return dirp; 760 743 } … … 771 754 ssize_t len; 772 755 773 rc = _read_short(dirp->fd, &dirp->res.d_name[0], NAME_MAX + 1, &len); 756 rc = _read_short(dirp->fd, dirp->pos, &dirp->res.d_name[0], 757 NAME_MAX + 1, &len); 774 758 if (rc != EOK) { 775 759 errno = rc; … … 777 761 } 778 762 779 (void) len; 763 dirp->pos += len; 764 780 765 return &dirp->res; 781 766 } … … 787 772 void rewinddir(DIR *dirp) 788 773 { 789 (void) lseek(dirp->fd, 0, SEEK_SET);774 dirp->pos = 0; 790 775 } 791 776
Note:
See TracChangeset
for help on using the changeset viewer.