1 /* @(#)dirent.h 1.29 11/08/04 Copyright 1987, 1998, 2000-2011 J. Schilling */ 2 /* 3 * Copyright (c) 1987, 1998, 2000-2011 J. Schilling 4 */ 5 /* 6 * The contents of this file are subject to the terms of the 7 * Common Development and Distribution License, Version 1.0 only 8 * (the "License"). You may not use this file except in compliance 9 * with the License. 10 * 11 * See the file CDDL.Schily.txt in this distribution for details. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file CDDL.Schily.txt from this distribution. 15 */ 16 17 #ifndef _SCHILY_DIRENT_H 18 #define _SCHILY_DIRENT_H 19 20 #ifndef _SCHILY_MCONFIG_H 21 #include <schily/mconfig.h> 22 #endif 23 24 #ifdef __cplusplus 25 extern "C" { 26 #endif 27 28 #ifdef JOS 29 # ifdef HAVE_SYS_STYPES_H 30 # ifndef _INCL_SYS_STYPES_H 31 # include <sys/stypes.h> 32 # define _INCL_SYS_STYPES_H 33 # endif 34 # endif 35 # ifdef HAVE_SYS_FILEDESC_H 36 # ifndef _INCL_SYS_FILEDESC_H 37 # include <sys/filedesc.h> 38 # define _INCL_SYS_FILEDESC_H 39 # endif 40 # endif 41 # define NEED_READDIR 42 # define dirent _direct 43 # define DIR_NAMELEN(dirent) strlen((dirent)->d_name) 44 # define DIRSIZE 30 45 # define FOUND_DIRSIZE 46 typedef struct _dirent { 47 char name[DIRSIZE]; 48 short ino; 49 } dirent; 50 51 #else /* !JOS */ 52 53 # ifndef _SCHILY_TYPES_H 54 # include <schily/types.h> 55 # endif 56 # ifndef _SCHILY_STAT_H 57 # include <schily/stat.h> 58 # endif 59 # ifndef _SCHILY_LIMITS_H 60 # include <schily/limits.h> 61 # endif 62 # ifndef _SCHILY_PARAM_H 63 # include <schily/param.h> 64 # endif 65 # ifndef _SCHILY_STDLIB_H 66 # include <schily/stdlib.h> /* MSVC: get _MAX_DIR */ 67 # endif 68 69 # ifdef HAVE_DIRENT_H /* This a POSIX compliant system */ 70 # ifndef _INCL_DIRENT_H 71 # include <dirent.h> 72 # define _INCL_DIRENT_H 73 # endif 74 # define DIR_NAMELEN(dirent) strlen((dirent)->d_name) 75 # define _FOUND_DIR_ 76 # else /* This is a Pre POSIX system */ 77 78 # define dirent direct 79 # define DIR_NAMELEN(dirent) (dirent)->d_namlen 80 81 # if defined(HAVE_SYS_DIR_H) 82 # ifndef _INCL_SYS_DIR_H 83 # include <sys/dir.h> 84 # define _INCL_SYS_DIR_H 85 # endif 86 # define _FOUND_DIR_ 87 # endif 88 89 # if defined(HAVE_NDIR_H) && !defined(_FOUND_DIR_) 90 # ifndef _INCL_NDIR_H 91 # include <ndir.h> 92 # define _INCL_NDIR_H 93 # endif 94 # define _FOUND_DIR_ 95 # endif 96 97 # if defined(HAVE_SYS_NDIR_H) && !defined(_FOUND_DIR_) 98 # ifndef _INCL_SYS_NDIR_H 99 # include <sys/ndir.h> 100 # define _INCL_SYS_NDIR_H 101 # endif 102 # define _FOUND_DIR_ 103 # endif 104 # endif /* HAVE_DIRENT_H */ 105 106 # if defined(_FOUND_DIR_) 107 /* 108 * Don't use defaults here to allow recognition of problems. 109 */ 110 # if !defined(FOUND_DIRSIZE) && defined(MAXNAMELEN) 111 # define DIRSIZE MAXNAMELEN /* From sys/param.h */ 112 # define FOUND_DIRSIZE 113 # endif 114 115 # if !defined(FOUND_DIRSIZE) && defined(MAXNAMLEN) 116 # define DIRSIZE MAXNAMLEN /* From dirent.h */ 117 # define FOUND_DIRSIZE 118 # endif 119 120 # ifdef __never__ 121 /* 122 * DIRSIZ(dp) is a parameterized macro, we cannot use it here. 123 */ 124 # if !defined(FOUND_DIRSIZE) && defined(DIRSIZ) 125 # define DIRSIZE DIRSIZ /* From sys/dir.h */ 126 # define FOUND_DIRSIZE 127 # endif 128 # endif /* __never__ */ 129 130 # if !defined(FOUND_DIRSIZE) && defined(NAME_MAX) 131 # define DIRSIZE NAME_MAX /* From limits.h */ 132 # define FOUND_DIRSIZE 133 # endif 134 135 # else /* !_FOUND_DIR_ */ 136 137 # if !defined(FOUND_DIRSIZE) && defined(_MAX_DIR) 138 # if defined(__MINGW32__) || defined(_MSC_VER) 139 # define DIRSIZE _MAX_DIR /* From stdlib.h */ 140 # define FOUND_DIRSIZE 141 # define NEED_READDIR 142 # undef dirent 143 # define dirent _direct 144 # undef DIR_NAMELEN 145 # define DIR_NAMELEN(dirent) strlen((dirent)->d_name) 146 # endif 147 # endif 148 149 # ifndef NEED_READDIR 150 # define NEED_DIRENT 151 # define NEED_READDIR 152 # undef dirent 153 # define dirent _direct 154 # undef DIR_NAMELEN 155 # define DIR_NAMELEN(dirent) strlen((dirent)->d_name) 156 # endif /* !NEED_READDIR */ 157 158 # endif /* _FOUND_DIR_ */ 159 160 161 #ifdef NEED_DIRENT 162 163 #ifndef FOUND_DIRSIZE 164 #define DIRSIZE 14 /* The old UNIX standard value */ 165 #define FOUND_DIRSIZE 166 #endif 167 168 typedef struct _dirent { 169 short ino; 170 char name[DIRSIZE]; 171 } dirent; 172 173 #endif /* NEED_DIRENT */ 174 175 #endif /* !JOS */ 176 177 #ifdef NEED_READDIR 178 179 #ifndef _SCHILY_STDIO_H 180 #include <schily/stdio.h> 181 #endif 182 #if defined(__MINGW32__) || defined(_MSC_VER) 183 #ifndef _SCHILY_IO_H 184 #include <schily/io.h> /* for _findfirst() */ 185 #endif 186 #ifndef _SCHILY_UTYPES_H 187 #include <schily/utypes.h> 188 #endif 189 #endif 190 191 struct _direct { 192 unsigned long d_ino; 193 unsigned short d_reclen; 194 unsigned short d_namlen; 195 char d_name[DIRSIZE +1]; 196 }; 197 #define HAVE_DIRENT_D_INO 198 199 typedef struct __dirdesc { 200 FILE *dd_fd; 201 202 #if defined(__MINGW32__) || defined(_MSC_VER) 203 struct _direct dd_dir; /* dirent for this dir */ 204 struct _finddata_t dd_data; /* _findnext() results */ 205 intptr_t dd_handle; /* _findnext() handle */ 206 int dd_state; /* Current Dir state */ 207 char dd_dirname[1]; /* Dir to open */ 208 #endif 209 } DIR; 210 211 extern DIR *opendir __PR((const char *)); 212 extern int closedir __PR((DIR *)); 213 extern struct dirent *readdir __PR((DIR *)); 214 215 #endif /* NEED_READDIR */ 216 217 #if !defined(HAVE_DIRFD) && defined(HAVE_DIR_DD_FD) 218 # define dirfd(dirp) ((dirp)->dd_fd) 219 #endif 220 221 #ifdef __cplusplus 222 } 223 #endif 224 225 #endif /* _SCHILY_DIRENT_H */ 226