Annotation of coherent/g/usr/lib/uucp/tay104/unix/dirent.c, revision 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.