+ if (lflag & (ICANON | ISIG))
+ goto slowcase;
+ for (;;) {
+ int rcc;
+
+ rcc = RB_CONTIGGET(qp);
+ if (rcc > uio->uio_resid)
+ rcc = uio->uio_resid;
+ if (rcc <= 0) {
+ if (first) {
+ /* queue got flushed (can't happen) */
+ splx(s);
+ goto loop;
+ }
+ break;
+ }
+ error = uiomove(qp->rb_hd, rcc, uio);
+ if (error)
+ splx(s);
+ qp->rb_hd = RB_ROLLOVER(qp, qp->rb_hd + rcc);
+ splx(s);
+ s = spltty();
+ first = 0;
+ }
+ goto out;
+slowcase:
+ for (;;) {
+ c = getc(qp);
+ splx(s);
+ if (c < 0) {
+ if (first)
+ goto loop;
+ break;
+ }