Annotation of coherent/g/usr/lib/uucp/tay104/unix/dirent.c, revision 1.1.1.1

1.1       root        1: /* dirent.c
                      2:    Replacements for opendir, readdir and closedir for the original
                      3:    Unix filesystem only.
                      4: 
                      5:    Copyright (C) 1992 Ian Lance Taylor
                      6: 
                      7:    This file is part of the Taylor UUCP package.
                      8: 
                      9:    This program is free software; you can redistribute it and/or
                     10:    modify it under the terms of the GNU General Public License as
                     11:    published by the Free Software Foundation; either version 2 of the
                     12:    License, or (at your option) any later version.
                     13: 
                     14:    This program is distributed in the hope that it will be useful, but
                     15:    WITHOUT ANY WARRANTY; without even the implied warranty of
                     16:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     17:    General Public License for more details.
                     18: 
                     19:    You should have received a copy of the GNU General Public License
                     20:    along with this program; if not, write to the Free Software
                     21:    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     22: 
                     23:    The author of the program may be contacted at [email protected] or
                     24:    c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
                     25:    */
                     26: 
                     27: #include "uucp.h"
                     28: 
                     29: #include "sysdep.h"
                     30: 
                     31: #include <errno.h>
                     32: 
                     33: #if HAVE_FCNTL_H
                     34: #include <fcntl.h>
                     35: #else
                     36: #if HAVE_SYS_FILE_H
                     37: #include <sys/file.h>
                     38: #endif
                     39: #endif
                     40: 
                     41: #ifndef O_RDONLY
                     42: #define O_RDONLY 0
                     43: #endif
                     44: 
                     45: #ifndef O_NOCTTY
                     46: #define O_NOCTTY 0
                     47: #endif
                     48: 
                     49: #ifndef FD_CLOEXEC
                     50: #define FD_CLOEXEC 1
                     51: #endif
                     52: 
                     53: /* Simple emulations of opendir/readdir/closedir for systems which
                     54:    have the original format of Unix directories.  It's probably better
                     55:    to get Doug Gwyn's public domain set of emulation functions.  */
                     56: 
                     57: DIR *
                     58: opendir (zdir)
                     59:      const char *zdir;
                     60: {
                     61:   int o;
                     62:   struct stat s;
                     63:   DIR *qret;
                     64: 
                     65:   o = open ((char *) zdir, O_RDONLY | O_NOCTTY, 0);
                     66:   if (o < 0)
                     67:     return NULL;
                     68:   if (fcntl (o, F_SETFD, fcntl (o, F_GETFD, 0) | FD_CLOEXEC) < 0
                     69:       || fstat (o, &s) < 0)
                     70:     {
                     71:       int isave;
                     72: 
                     73:       isave = errno;
                     74:       (void) close (o);
                     75:       errno = isave;
                     76:       return NULL;
                     77:     }
                     78:   if (! S_ISDIR (s.st_mode))
                     79:     {
                     80:       (void) close (o);
                     81:       errno = ENOTDIR;
                     82:       return NULL;
                     83:     }
                     84:   qret = (DIR *) xmalloc (sizeof (DIR));
                     85:   qret->o = o;
                     86:   return qret;
                     87: }
                     88: 
                     89: struct dirent *
                     90: readdir (q)
                     91:     DIR *q;
                     92: {
                     93:   struct direct sdir;
                     94:   int cgot;
                     95: 
                     96:   do
                     97:     {
                     98:       cgot = read (q->o, &sdir, sizeof (struct direct));
                     99:       if (cgot <= 0)
                    100:        return NULL;
                    101:       if (cgot != sizeof (struct direct))
                    102:        {
                    103:          errno = ENOENT;
                    104:          return NULL;
                    105:        }
                    106:     }
                    107:   while (sdir.d_ino == 0);
                    108: 
                    109:   strncpy (q->s.d_name, sdir.d_name, DIRSIZ);
                    110:   q->s.d_name[DIRSIZ] = '\0';
                    111:   return &q->s;
                    112: }
                    113: 
                    114: int
                    115: closedir (q)
                    116:     DIR *q;
                    117: {
                    118:   int o;
                    119: 
                    120:   o = q->o;
                    121:   xfree (q);
                    122:   return close (o);
                    123: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.