home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / ixemul-45.0-src.tgz / tar.out / contrib / ixemul / library / opendir.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  2KB  |  78 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Library General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Library General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Library General Public
  16.  *  License along with this library; if not, write to the Free
  17.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  *  opendir.c,v 1.1.1.1 1994/04/04 04:30:50 amiga Exp
  20.  *
  21.  *  opendir.c,v
  22.  * Revision 1.1.1.1  1994/04/04  04:30:50  amiga
  23.  * Initial CVS check in.
  24.  *
  25.  *  Revision 1.2  1992/08/09  20:59:35  amiga
  26.  *  add cast
  27.  *
  28.  *  Revision 1.1  1992/05/14  19:55:40  mwild
  29.  *  Initial revision
  30.  *
  31.  */
  32.  
  33. #define _KERNEL
  34. #include "ixemul.h"
  35. #include "kprintf.h"
  36. #include <sys/stat.h>
  37. #include <dirent.h>
  38.  
  39. extern void *kmalloc ();
  40.  
  41. DIR *
  42. opendir (const char *name)
  43. {
  44.   DIR *d;
  45.   int err;
  46.   struct stat stb;
  47.  
  48.   if (!(d = (DIR *) syscall (SYS_malloc, sizeof (*d)))) return 0;
  49.  
  50.   if ((d->dd_fd = syscall (SYS_open, name, 0)) >= 0)
  51.     {
  52.       if (syscall (SYS_fstat, d->dd_fd, &stb) == 0)
  53.     {
  54.       if (! S_ISDIR (stb.st_mode))
  55.         {
  56.               syscall (SYS_close, d->dd_fd);
  57.           syscall (SYS_free, d);
  58.           errno = ENOTDIR;
  59.           KPRINTF (("&errno = %lx, errno = %ld\n", &errno, errno));
  60.           return 0;
  61.         }
  62.  
  63.       return d;
  64.     }
  65.     
  66.       err = errno;
  67.  
  68.       syscall (SYS_close, d->dd_fd);
  69.     }
  70.   else
  71.     err = errno;
  72.  
  73.   syscall (SYS_free, d);
  74.   errno = err;
  75.   KPRINTF (("&errno = %lx, errno = %ld\n", &errno, errno));
  76.   return 0;
  77. }
  78.