This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Remove the update from perldelta
[perl5.git] / pod / perliol.pod
index 26ad305..b70a510 100644 (file)
@@ -10,8 +10,7 @@ perliol - C API for Perl's implementation of IO in Layers.
 =head1 DESCRIPTION
 
 This document describes the behavior and implementation of the PerlIO
-abstraction described in L<perlapio> when C<USE_PERLIO> is defined (and
-C<USE_SFIO> is not).
+abstraction described in L<perlapio> when C<USE_PERLIO> is defined.
 
 =head2 History and Background
 
@@ -22,7 +21,7 @@ maintain (source) compatibility.
 
 The aim of the implementation is to provide the PerlIO API in a flexible
 and platform neutral manner. It is also a trial of an "Object Oriented
-C, with vtables" approach which may be applied to perl6.
+C, with vtables" approach which may be applied to Perl 6.
 
 =head2 Basic Structure
 
@@ -70,10 +69,10 @@ handling binary data.  The "pushed" layers are processed in left-to-right
 order.
 
 sysopen() operates (unsurprisingly) at a lower level in the stack than
-open().  For example in UNIX or UNIX-like systems sysopen() operates
+open().  For example in Unix or Unix-like systems sysopen() operates
 directly at the level of file descriptors: in the terms of PerlIO
 layers, it uses only the "unix" layer, which is a rather thin wrapper
-on top of the UNIX file descriptors.
+on top of the Unix file descriptors.
 
 =head2 Layers vs Disciplines
 
@@ -99,7 +98,7 @@ The basic data structure is a PerlIOl:
        {
         PerlIOl *      next;       /* Lower layer */
         PerlIO_funcs * tab;        /* Functions for this layer */
-        IV             flags;      /* Various flags for state */
+        U32            flags;      /* Various flags for state */
        };
 
 A C<PerlIOl *> is a pointer to the struct, and the I<application>
@@ -136,45 +135,51 @@ member of C<PerlIOl>. The functions (methods of the layer "class") are
 fixed, and are defined by the C<PerlIO_funcs> type. They are broadly the
 same as the public C<PerlIO_xxxxx> functions:
 
-  struct _PerlIO_funcs
-  {
-   Size_t              fsize;
-   char *              name;
-   Size_t              size;
-   IV          kind;
-   IV          (*Pushed)(pTHX_ PerlIO *f,const char *mode,SV *arg, PerlIO_funcs *tab);
-   IV          (*Popped)(pTHX_ PerlIO *f);
-   PerlIO *    (*Open)(pTHX_ PerlIO_funcs *tab,
-                       AV *layers, IV n,
-                       const char *mode,
-                       int fd, int imode, int perm,
-                       PerlIO *old,
-                       int narg, SV **args);
-   IV          (*Binmode)(pTHX_ PerlIO *f);
-   SV *                (*Getarg)(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
-   IV          (*Fileno)(pTHX_ PerlIO *f);
-   PerlIO *     (*Dup)(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
-   /* Unix-like functions - cf sfio line disciplines */
-   SSize_t     (*Read)(pTHX_ PerlIO *f, void *vbuf, Size_t count);
-   SSize_t     (*Unread)(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
-   SSize_t     (*Write)(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
-   IV          (*Seek)(pTHX_ PerlIO *f, Off_t offset, int whence);
-   Off_t       (*Tell)(pTHX_ PerlIO *f);
-   IV          (*Close)(pTHX_ PerlIO *f);
-   /* Stdio-like buffered IO functions */
-   IV          (*Flush)(pTHX_ PerlIO *f);
-   IV          (*Fill)(pTHX_ PerlIO *f);
-   IV          (*Eof)(pTHX_ PerlIO *f);
-   IV          (*Error)(pTHX_ PerlIO *f);
-   void                (*Clearerr)(pTHX_ PerlIO *f);
-   void                (*Setlinebuf)(pTHX_ PerlIO *f);
-   /* Perl's snooping functions */
-   STDCHAR *   (*Get_base)(pTHX_ PerlIO *f);
-   Size_t      (*Get_bufsiz)(pTHX_ PerlIO *f);
-   STDCHAR *   (*Get_ptr)(pTHX_ PerlIO *f);
-   SSize_t     (*Get_cnt)(pTHX_ PerlIO *f);
-   void                (*Set_ptrcnt)(pTHX_ PerlIO *f,STDCHAR *ptr,SSize_t cnt);
-  };
+ struct _PerlIO_funcs
+ {
+  Size_t     fsize;
+  char *     name;
+  Size_t     size;
+  IV         kind;
+  IV         (*Pushed)(pTHX_ PerlIO *f,
+                             const char *mode,
+                             SV *arg,
+                             PerlIO_funcs *tab);
+  IV         (*Popped)(pTHX_ PerlIO *f);
+  PerlIO *   (*Open)(pTHX_ PerlIO_funcs *tab,
+                           PerlIO_list_t *layers, IV n,
+                           const char *mode,
+                           int fd, int imode, int perm,
+                           PerlIO *old,
+                           int narg, SV **args);
+  IV         (*Binmode)(pTHX_ PerlIO *f);
+  SV *       (*Getarg)(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
+  IV         (*Fileno)(pTHX_ PerlIO *f);
+  PerlIO *   (*Dup)(pTHX_ PerlIO *f,
+                          PerlIO *o,
+                          CLONE_PARAMS *param,
+                          int flags)
+  /* Unix-like functions - cf sfio line disciplines */
+  SSize_t    (*Read)(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+  SSize_t    (*Unread)(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+  SSize_t    (*Write)(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+  IV         (*Seek)(pTHX_ PerlIO *f, Off_t offset, int whence);
+  Off_t      (*Tell)(pTHX_ PerlIO *f);
+  IV         (*Close)(pTHX_ PerlIO *f);
+  /* Stdio-like buffered IO functions */
+  IV         (*Flush)(pTHX_ PerlIO *f);
+  IV         (*Fill)(pTHX_ PerlIO *f);
+  IV         (*Eof)(pTHX_ PerlIO *f);
+  IV         (*Error)(pTHX_ PerlIO *f);
+  void       (*Clearerr)(pTHX_ PerlIO *f);
+  void       (*Setlinebuf)(pTHX_ PerlIO *f);
+  /* Perl's snooping functions */
+  STDCHAR *  (*Get_base)(pTHX_ PerlIO *f);
+  Size_t     (*Get_bufsiz)(pTHX_ PerlIO *f);
+  STDCHAR *  (*Get_ptr)(pTHX_ PerlIO *f);
+  SSize_t    (*Get_cnt)(pTHX_ PerlIO *f);
+  void       (*Set_ptrcnt)(pTHX_ PerlIO *f,STDCHAR *ptr,SSize_t cnt);
+ };
 
 The first few members of the struct give a function table size for
 compatibility check "name" for the layer, the  size to C<malloc> for the per-instance data,
@@ -246,7 +251,7 @@ representing open (allocated) handles. For example the first three slots
 in the table correspond to C<stdin>,C<stdout> and C<stderr>. The table
 in turn points to the current "top" layer for the handle - in this case
 an instance of the generic buffering layer "perlio". That layer in turn
-points to the next layer down - in this case the lowlevel "unix" layer.
+points to the next layer down - in this case the low-level "unix" layer.
 
 The above is roughly equivalent to a "stdio" buffered stream, but with
 much more flexibility:
@@ -444,7 +449,7 @@ flag is used it's up to the layer to validate the args.
 
 =item Pushed
 
      IV      (*Pushed)(pTHX_ PerlIO *f,const char *mode, SV *arg);
IV    (*Pushed)(pTHX_ PerlIO *f,const char *mode, SV *arg);
 
 The only absolutely mandatory method. Called when the layer is pushed
 onto the stack.  The C<mode> argument may be NULL if this occurs
@@ -486,7 +491,7 @@ C<PerlIO_fdopen> and C<PerlIO_reopen>.  The full prototype is as
 follows:
 
  PerlIO *      (*Open)(pTHX_ PerlIO_funcs *tab,
-                       AV *layers, IV n,
+                       PerlIO_list_t *layers, IV n,
                        const char *mode,
                        int fd, int imode, int perm,
                        PerlIO *old,
@@ -494,12 +499,20 @@ follows:
 
 Open should (perhaps indirectly) call C<PerlIO_allocate()> to allocate
 a slot in the table and associate it with the layers information for
-the opened file, by calling C<PerlIO_push>.  The I<layers> AV is an
+the opened file, by calling C<PerlIO_push>.  The I<layers> is an
 array of all the layers destined for the C<PerlIO *>, and any
 arguments passed to them, I<n> is the index into that array of the
 layer being called. The macro C<PerlIOArg> will return a (possibly
 C<NULL>) SV * for the argument passed to the layer.
 
+Where a layer opens or takes ownership of a file descriptor, that layer is
+responsible for getting the file descriptor's close-on-exec flag into the
+correct state.  The flag should be clear for a file descriptor numbered
+less than or equal to C<PL_maxsysfd>, and set for any file descriptor
+numbered higher.  For thread safety, when a layer opens a new file
+descriptor it should if possible open it with the close-on-exec flag
+initially set.
+
 The I<mode> string is an "C<fopen()>-like" string which would match
 the regular expression C</^[I#]?[rwa]\+?[bt]?$/>.
 
@@ -520,17 +533,21 @@ If I<fd> not negative then it is the numeric file descriptor I<fd>,
 which will be open in a manner compatible with the supplied mode
 string, the call is thus equivalent to C<PerlIO_fdopen>. In this case
 I<nargs> will be zero.
+The file descriptor may have the close-on-exec flag either set or clear;
+it is the responsibility of the layer that takes ownership of it to get
+the flag into the correct state.
 
 If I<nargs> is greater than zero then it gives the number of arguments
 passed to C<open>, otherwise it will be 1 if for example
 C<PerlIO_open> was called.  In simple cases SvPV_nolen(*args) is the
 pathname to open.
 
-Having said all that translation-only layers do not need to provide
-C<Open()> at all, but rather leave the opening to a lower level layer
-and wait to be "pushed".  If a layer does provide C<Open()> it should
-normally call the C<Open()> method of next layer down (if any) and
-then push itself on top if that succeeds.
+If a layer provides C<Open()> it should normally call the C<Open()>
+method of next layer down (if any) and then push itself on top if that
+succeeds.  C<PerlIOBase_open> is provided to do exactly that, so in
+most cases you don't have to write your own C<Open()> method.  If this
+method is not defined, other layers may have difficulty pushing
+themselves on top of it during open.
 
 If C<PerlIO_push> was performed and open has failed, it must
 C<PerlIO_pop> itself, since if it's not, the layer won't be removed
@@ -684,7 +701,7 @@ Returns 0 on end-of-file, 1 if not end-of-file, -1 on error.
 
 Return error indicator. C<PerlIOBase_error()> is normally sufficient.
 
-Returns 1 if there is an error (usually when C<PERLIO_F_ERROR> is set,
+Returns 1 if there is an error (usually when C<PERLIO_F_ERROR> is set),
 0 otherwise.
 
 =item  Clearerr
@@ -837,8 +854,9 @@ The following table summarizes the behaviour:
     Unread      PerlIOBase_unread
     Write       FAILURE
 
- FAILURE        Set errno (to EINVAL in UNIXish, to LIB$_INVARG in VMS) and
-                return -1 (for numeric return values) or NULL (for pointers)
+ FAILURE        Set errno (to EINVAL in Unixish, to LIB$_INVARG in VMS)
+                and return -1 (for numeric return values) or NULL (for
+                pointers)
  INHERITED      Inherited from the layer below
  SUCCESS        Return 0 (for numeric return values) or a pointer 
 
@@ -922,7 +940,7 @@ which do not need to do anything special for a particular method.
 
 =head2 Extension Layers
 
-Layers can made available by extension modules. When an unknown layer
+Layers can be made available by extension modules. When an unknown layer
 is encountered the PerlIO code will perform the equivalent of :
 
    use PerlIO 'layer';