diff options
Diffstat (limited to 'lib/lib.c')
| -rw-r--r-- | lib/lib.c | 22 | 
1 files changed, 13 insertions, 9 deletions
| @@ -547,16 +547,20 @@ void poke(void *ptr, uint64_t val, int size)  }  // Iterate through an array of files, opening each one and calling a function -// on that filehandle and name.  The special filename "-" means stdin if -// flags is O_RDONLY, stdout otherwise.  An empty argument list calls +// on that filehandle and name. The special filename "-" means stdin if +// flags is O_RDONLY, stdout otherwise. An empty argument list calls  // function() on just stdin/stdout.  //  // Note: pass O_CLOEXEC to automatically close filehandles when function() -// returns, otherwise filehandles must be closed by function() -void loopfiles_rw(char **argv, int flags, int permissions, int failok, +// returns, otherwise filehandles must be closed by function(). +// pass WARN_ONLY to produce warning messages about files it couldn't +// open/create, and skip them. Otherwise function is called with fd -1. +void loopfiles_rw(char **argv, int flags, int permissions,    void (*function)(int fd, char *name))  { -  int fd; +  int fd, failok = !(flags&WARN_ONLY); + +  flags &= ~WARN_ONLY;    // If no arguments, read from stdin.    if (!*argv) function((flags & O_ACCMODE) != O_RDONLY ? 1 : 0, "-"); @@ -564,8 +568,8 @@ void loopfiles_rw(char **argv, int flags, int permissions, int failok,      // Filename "-" means read from stdin.      // Inability to open a file prints a warning, but doesn't exit. -    if (!strcmp(*argv, "-")) fd=0; -    else if (0>(fd = open(*argv, flags, permissions)) && !failok) { +    if (!strcmp(*argv, "-")) fd = 0; +    else if (0>(fd = notstdio(open(*argv, flags, permissions))) && !failok) {        perror_msg_raw(*argv);        continue;      } @@ -574,10 +578,10 @@ void loopfiles_rw(char **argv, int flags, int permissions, int failok,    } while (*++argv);  } -// Call loopfiles_rw with O_RDONLY|O_CLOEXEC and !failok (common case). +// Call loopfiles_rw with O_RDONLY|O_CLOEXEC|WARN_ONLY (common case)  void loopfiles(char **argv, void (*function)(int fd, char *name))  { -  loopfiles_rw(argv, O_RDONLY|O_CLOEXEC, 0, 0, function); +  loopfiles_rw(argv, O_RDONLY|O_CLOEXEC|WARN_ONLY, 0, function);  }  // Slow, but small. | 
