- c = read(SHIN, fbuf[buf] + off, BUFSIZ - off);
-#else FILEC
- if (intty) /* then use tenex routine */
- {
- c = numleft ? numleft : tenex(ttyline, BUFSIZ);
- if (c > roomleft) /* No room in this buffer? */
- {
- /* start with fresh buffer */
- feobp = fseekp = fblocks * BUFSIZ;
- numleft = c;
- goto again;
- }
- if (c > 0)
- copy (fbuf[buf] + off, ttyline, c);
- numleft = 0;
- }
- else
- c = read(SHIN, fbuf[buf] + off, roomleft);
-#endif FILEC
- while (c < 0 && errno == EINTR);
+ for (;;) {
+ c = read(SHIN, fbuf[buf] + off, BUFSIZ - off);
+#else
+ roomleft = BUFSIZ - off;
+ for (;;) {
+ if (filec && intty) {
+ c = numleft ? numleft : tenex(ttyline, BUFSIZ);
+ if (c > roomleft) {
+ /* start with fresh buffer */
+ feobp = fseekp = fblocks * BUFSIZ;
+ numleft = c;
+ goto again;
+ }
+ if (c > 0)
+ copy(fbuf[buf] + off, ttyline, c);
+ numleft = 0;
+ } else
+ c = read(SHIN, fbuf[buf] + off, roomleft);
+#endif
+ if (c >= 0)
+ break;
+ if (errno == EWOULDBLOCK) {
+ int off = 0;
+
+ (void) ioctl(SHIN, FIONBIO, (char *)&off);
+ } else if (errno != EINTR)
+ break;
+ }