Changeset 3188 for trunk/src/kmk/kmkbuiltin/mscfakes.c
- Timestamp:
- Mar 24, 2018, 4:32:26 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/kmkbuiltin/mscfakes.c
r3140 r3188 45 45 #undef lutimes 46 46 47 extern ssize_t maybe_con_write(int, void const *, size_t); 47 #include "console.h" 48 48 49 49 50 … … 477 478 { 478 479 /* Console output optimization: */ 479 if (cbSrc > 0 && is atty(fd))480 if (cbSrc > 0 && is_console(fd)) 480 481 return maybe_con_write(fd, pvSrc, cbSrc); 481 482 … … 586 587 ssize_t writev(int fd, const struct iovec *vector, int count) 587 588 { 588 int size = 0; 589 int i; 590 for (i = 0; i < count; i++) 591 { 592 int cb = msc_write(fd, vector[i].iov_base, (int)vector[i].iov_len); 593 if (cb < 0) 594 return cb; 595 size += cb; 589 ssize_t size = 0; 590 if (count > 0) 591 { 592 int i; 593 594 /* To get consistent console output, we must try combine the segments 595 when outputing to the console. */ 596 if (count > 1 && is_console(fd)) 597 { 598 char *pbTmp; 599 ssize_t cbTotal; 600 if (count == 1) 601 return maybe_con_write(fd, vector[0].iov_base, (int)vector[0].iov_len); 602 603 cbTotal = 0; 604 for (i = 0; i < count; i++) 605 cbTotal += vector[i].iov_len; 606 pbTmp = malloc(cbTotal); 607 if (pbTmp) 608 { 609 char *pbCur = pbTmp; 610 for (i = 0; i < count; i++) 611 { 612 memcpy(pbCur, vector[i].iov_base, vector[i].iov_len); 613 pbCur += vector[i].iov_len; 614 } 615 size = maybe_con_write(fd, pbTmp, cbTotal); 616 free(pbTmp); 617 return size; 618 } 619 620 /* fall back on segment by segment output. */ 621 } 622 623 for (i = 0; i < count; i++) 624 { 625 int cb = msc_write(fd, vector[i].iov_base, (int)vector[i].iov_len); 626 if (cb < 0) 627 return cb; 628 size += cb; 629 } 596 630 } 597 631 return size;
Note:
See TracChangeset
for help on using the changeset viewer.