[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
MiNT 1.09/MinixFS 0.6pl9: FIONREAD broken
FIONREAD always returns 1 on tosfs and minixfs. On the pipefs,
FIONREAD returns -1 if there are no writers, and FIONWRITE returns -1
if there are no readers. This breaks cat from textutils 1.9.
FIONREAD should always return 0 on eof. The patch fixes this.
************************* MiNT 1.09 *************************
--- orig/pipefs.c Fri Jun 25 22:20:54 1993
+++ pipefs.c Tue Dec 14 22:50:10 1993
@@ -747,12 +747,13 @@
this = (struct fifo *)f->fc.index;
- if (mode == FIONREAD) {
+ switch (mode) {
+ case FIONREAD:
p = (f->flags & O_HEAD) ? this->outp : this->inp;
assert(p != 0);
if (p->writers <= 0 || p->writers == VIRGIN_PIPE) {
DEBUG(("pipe FIONREAD: no writers"));
- r = -1;
+ r = 0;
} else {
r = p->tail - p->head;
if (r < 0) r += PIPESIZ;
@@ -760,12 +761,12 @@
r = r >> 2; /* r /= 4 */
}
*((long *) buf) = r;
- }
- else if (mode == FIONWRITE) {
+ break;
+ case FIONWRITE:
p = (f->flags & O_HEAD) ? this->inp : this->outp;
assert(p != 0);
if (p->readers <= 0) {
- r = -1;
+ r = 0;
} else {
r = p->tail - p->head;
if (r < 0) r += PIPESIZ;
@@ -774,8 +775,9 @@
r = r >> 2; /* r /= 4 */
}
*((long *) buf) = r;
- }
- else if (mode == F_SETLK || mode == F_SETLKW) {
+ break;
+ case F_SETLK:
+ case F_SETLKW:
lck = (struct flock *)buf;
while (this->flags & O_LOCK) {
if (this->lockpid != curproc->pid) {
@@ -803,8 +805,8 @@
this->lockpid = curproc->pid;
f->flags |= O_LOCK;
}
- }
- else if (mode == F_GETLK) {
+ break;
+ case F_GETLK:
lck = (struct flock *)buf;
if (this->flags & O_LOCK) {
lck->l_type = F_WRLCK;
@@ -813,8 +815,8 @@
}
else
lck->l_type = F_UNLCK;
- }
- else if (mode == TIOCFLUSH) {
+ break;
+ case TIOCFLUSH:
if (this->inp) {
this->inp->head = this->inp->tail;
wake(IO_Q, (long)this->inp);
@@ -823,11 +825,20 @@
this->outp->head = this->outp->tail;
wake(IO_Q, (long)this->outp);
}
- } else if (mode == TIOCIBAUD || mode == TIOCOBAUD) {
+ break;
+ case TIOCIBAUD:
+ case TIOCOBAUD:
*(long *)buf = -1L;
- } else if (mode == TIOCGFLAGS) {
+ break;
+ case TIOCGFLAGS:
*((unsigned short *)buf) = 0;
- } else if (mode >= TCURSOFF && mode <= TCURSGRATE) {
+ break;
+ case TCURSOFF:
+ case TCURSON:
+ case TCURSSRATE:
+ case TCURSBLINK:
+ case TCURSSTEADY:
+ case TCURSGRATE:
/* kludge: this assumes TOSWIN style escape sequences */
tty_putchar(f, (long)'\033', RAW);
switch (mode) {
@@ -851,7 +862,8 @@
case TCURSGRATE:
return this->cursrate;
}
- } else {
+ break;
+ default:
/* if the file is a terminal, Fcntl will automatically
* call tty_ioctl for us to handle 'generic' terminal
* functions
--- orig/tosfs.c Fri Jun 25 22:24:32 1993
+++ ./tosfs.c Sat Nov 20 02:34:14 1993
@@ -1147,9 +1147,17 @@
extern int flk; /* set in main.c if _FLK already installed */
- if (mode == FIONREAD || mode == FIONWRITE) {
+ switch (mode) {
+ case FIONREAD:
+ r = Fseek (0L, (int) f->devinfo, 1);
+ if (r < 0) return r;
+ *(long *) buf = Fseek (0L, (int) f->devinfo, 2) - r;
+ (void) Fseek (r, (int) f->devinfo, 0);
+ return 0;
+ case FIONWRITE:
*((long *)buf) = 1;
return 0;
- }
- else if (mode == F_SETLK || mode == F_SETLKW || mode == F_GETLK) {
+ case F_SETLK:
+ case F_SETLKW:
+ case F_GETLK:
fl = ((struct flock *)buf);
t.l = *fl;
************************* MinixFS 0.6pl9 *************************
--- orig/minixfs/minixdev.c Sat Nov 27 19:42:24 1993
+++ ./minixfs/minixdev.c Tue Dec 14 19:37:26 1993
@@ -445,7 +445,18 @@
switch (mode)
{
case FIONREAD:
+ {
+ d_inode rip;
+ long nread;
+ read_inode (f->fc.index, &rip, f->fc.dev);
+ nread = rip.i_size - f->pos;
+ if (nread < 0)
+ nread = 0;
+ *(long *) buf = nread;
+ return 0;
+ }
+
case FIONWRITE:
{