delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp-workers/2001/10/14/04:53:50

Sender: rich AT phekda DOT freeserve DOT co DOT uk
Message-ID: <3BC9524E.3898B00B@phekda.freeserve.co.uk>
Date: Sun, 14 Oct 2001 09:52:30 +0100
From: Richard Dawe <rich AT phekda DOT freeserve DOT co DOT uk>
X-Mailer: Mozilla 4.77 [en] (X11; U; Linux 2.2.19 i586)
X-Accept-Language: de,fr
MIME-Version: 1.0
To: DJGPP workers <djgpp-workers AT delorie DOT com>
Subject: lseek & llseek: Move pipe check before dos interrupt
Reply-To: djgpp-workers AT delorie DOT com

Hello.

In lseek and llseek we check that the file descriptor is not a pipe, since
you can't seek on pipes. But the check occurs after the DOS interrupt to
do the seek. I think the check should be moved before the interrupt, but
after the __FSEXT_lseek operation, to let FSEXT hooks do their thing.
Below is a patch to do this.

OK to commit?

Thanks, bye, Rich =]

-- 
Richard Dawe
http://www.phekda.freeserve.co.uk/richdawe/

Index: src/libc/posix/unistd/lseek.c
===================================================================
RCS file: /cvs/djgpp/djgpp/src/libc/posix/unistd/lseek.c,v
retrieving revision 1.4
diff -p -c -3 -r1.4 lseek.c
*** src/libc/posix/unistd/lseek.c       2001/03/25 18:17:10     1.4
--- src/libc/posix/unistd/lseek.c       2001/10/14 08:49:29
*************** lseek(int handle, off_t offset, int when
*** 24,29 ****
--- 24,38 ----
        return rv;
    }
  
+   has_props = __has_fd_properties(handle);
+ 
+   /* POSIX doesn't allow seek on a pipe.  */
+   if (has_props && (__fd_properties[handle]->flags & FILE_DESC_PIPE))
+   {
+     errno = ESPIPE;
+     return -1;
+   }
+ 
    r.h.ah = 0x42;
    r.h.al = whence;
    r.x.bx = handle;
*************** lseek(int handle, off_t offset, int when
*** 34,49 ****
    {
      errno = __doserr_to_errno(r.x.ax);
      return -1;
!   }
! 
!   has_props = __has_fd_properties(handle);
! 
!   /* POSIX doesn't allow seek on a pipe.  */
!   if (has_props && (__fd_properties[handle]->flags & FILE_DESC_PIPE))
!   {
!     errno = ESPIPE;
!     return -1;
!   }
  
    if (!has_props ||
        (__fd_properties[handle]->flags & FILE_DESC_DONT_FILL_EOF_GAP) ==
0)
--- 43,49 ----
    {
      errno = __doserr_to_errno(r.x.ax);
      return -1;
!   }  
  
    if (!has_props ||
        (__fd_properties[handle]->flags & FILE_DESC_DONT_FILL_EOF_GAP) ==
0)
Index: src/libc/compat/unistd/llseek.c
===================================================================
RCS file: /cvs/djgpp/djgpp/src/libc/compat/unistd/llseek.c,v
retrieving revision 1.4
diff -p -c -3 -r1.4 llseek.c
*** src/libc/compat/unistd/llseek.c     2001/03/25 18:18:08     1.4
--- src/libc/compat/unistd/llseek.c     2001/10/14 08:49:29
*************** llseek( int handle, offset_t offset, int
*** 33,38 ****
--- 33,47 ----
      }
    }
  
+   has_props = __has_fd_properties(handle);
+ 
+   /* POSIX doesn't allow seek on a pipe.  */
+   if (has_props && (__fd_properties[handle]->flags & FILE_DESC_PIPE))
+   {
+     errno = ESPIPE;
+     return -1;
+   }
+ 
    r.h.ah = 0x42;
    r.h.al = whence;
    r.x.bx = handle;
*************** llseek( int handle, offset_t offset, int
*** 42,56 ****
    if( r.x.flags & 1 )
    {
      errno = __doserr_to_errno(r.x.ax);
-     return -1;
-   }
- 
-   has_props = __has_fd_properties(handle);
- 
-   /* POSIX doesn't allow seek on a pipe.  */
-   if (has_props && (__fd_properties[handle]->flags & FILE_DESC_PIPE))
-   {
-     errno = ESPIPE;
      return -1;
    }
  
--- 51,56 ----

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019