Subversion Repositories Kolibri OS

Rev

Rev 4921 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 1990 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that the above copyright notice and this paragraph are
  7.  * duplicated in all such forms and that any documentation,
  8.  * advertising materials, and other materials related to such
  9.  * distribution and use acknowledge that the software was developed
  10.  * by the University of California, Berkeley.  The name of the
  11.  * University may not be used to endorse or promote products derived
  12.  * from this software without specific prior written permission.
  13.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  14.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  15.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  16.  */
  17. /* No user fns here.  Pesch 15apr92. */
  18.  
  19. #if defined(LIBC_SCCS) && !defined(lint)
  20. static char sccsid[] = "%W% (Berkeley) %G%";
  21. #endif /* LIBC_SCCS and not lint */
  22.  
  23. #include <_ansi.h>
  24. #include <reent.h>
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <errno.h>
  28. #include "local.h"
  29.  
  30. int
  31. _DEFUN(_fwalk, (ptr, function),
  32.        struct _reent *ptr _AND
  33.        register int (*function) (FILE *))
  34. {
  35.   register FILE *fp;
  36.   register int n, ret = 0;
  37.   register struct _glue *g;
  38.  
  39.   /*
  40.    * It should be safe to walk the list without locking it;
  41.    * new nodes are only added to the end and none are ever
  42.    * removed.
  43.    *
  44.    * Avoid locking this list while walking it or else you will
  45.    * introduce a potential deadlock in [at least] refill.c.
  46.    */
  47.   for (g = &ptr->__sglue; g != NULL; g = g->_next)
  48.     for (fp = g->_iobs, n = g->_niobs; --n >= 0; fp++)
  49.       if (fp->_flags != 0 && fp->_flags != 1 && fp->_file != -1)
  50.         ret |= (*function) (fp);
  51.  
  52.   return ret;
  53. }
  54.  
  55. /* Special version of __fwalk where the function pointer is a reentrant
  56.    I/O function (e.g. _fclose_r).  */
  57. int
  58. _DEFUN(_fwalk_reent, (ptr, reent_function),
  59.        struct _reent *ptr _AND
  60.        register int (*reent_function) (struct _reent *, FILE *))
  61. {
  62.   register FILE *fp;
  63.   register int n, ret = 0;
  64.   register struct _glue *g;
  65.  
  66.   /*
  67.    * It should be safe to walk the list without locking it;
  68.    * new nodes are only added to the end and none are ever
  69.    * removed.
  70.    *
  71.    * Avoid locking this list while walking it or else you will
  72.    * introduce a potential deadlock in [at least] refill.c.
  73.    */
  74.   for (g = &ptr->__sglue; g != NULL; g = g->_next)
  75.     for (fp = g->_iobs, n = g->_niobs; --n >= 0; fp++)
  76.       if (fp->_flags != 0 && fp->_flags != 1 && fp->_file != -1)
  77.         ret |= (*reent_function) (ptr, fp);
  78.  
  79.   return ret;
  80. }
  81.