[project @ 2002-02-12 11:44:54 by simonmar]
[ghc-hetmet.git] / ghc / lib / std / cbits / dirUtils.c
1 /* 
2  * (c) The GRASP/AQUA Project, Glasgow University, 1994-
3  *
4  * Directory Runtime Support
5  */
6 #include "dirUtils.h"
7
8 #if defined(mingw32_TARGET_OS)
9 #include <windows.h>
10 #endif
11
12 #ifdef HAVE_STDLIB_H
13 # include <stdlib.h>
14 #endif
15 #ifdef HAVE_STDDEF_H
16 # include <stddef.h>
17 #endif
18 #ifdef HAVE_ERRNO_H
19 # include <errno.h>
20 #endif
21
22 HsInt
23 prel_mkdir(HsAddr pathName, HsInt mode)
24 {
25 #if defined(mingw32_TARGET_OS)
26   return mkdir(pathName);
27 #else
28   return mkdir(pathName,mode);
29 #endif
30 }
31
32 HsInt
33 prel_lstat(HsAddr fname, HsAddr st)
34 {
35 #ifdef HAVE_LSTAT
36   return lstat((const char*)fname, (struct stat*)st);
37 #else
38   return stat((const char*)fname, (struct stat*)st);
39 #endif
40 }
41
42 HsInt prel_s_ISDIR(mode_t m) {return S_ISDIR(m);}
43 HsInt prel_s_ISREG(mode_t m) {return S_ISREG(m);}
44
45 HsInt prel_path_max() { return PATH_MAX; }
46 mode_t prel_R_OK() { return R_OK; }
47 mode_t prel_W_OK() { return W_OK; }
48 mode_t prel_X_OK() { return X_OK; }
49
50 mode_t prel_S_IRUSR() { return S_IRUSR; }
51 mode_t prel_S_IWUSR() { return S_IWUSR; }
52 mode_t prel_S_IXUSR() { return S_IXUSR; }
53
54 HsAddr prel_d_name(struct dirent* d)
55
56 #ifndef mingw32_TARGET_OS
57   return (HsAddr)(&d->d_name);
58 #else
59   return (HsAddr)(d->d_name);
60 #endif
61 }
62
63 HsInt prel_end_of_dir()
64 {
65 #ifndef mingw32_TARGET_OS
66   return 0;
67 #else
68   return ENOENT;
69 #endif  
70 }
71
72 /*
73  * read an entry from the directory stream; opt for the
74  * re-entrant friendly way of doing this, if available.
75  */
76 HsInt
77 prel_readdir(HsAddr dirPtr, HsAddr pDirEnt)
78 {
79   struct dirent **pDirE = (struct dirent**)pDirEnt;
80 #if HAVE_READDIR_R
81   struct dirent* p;
82   int res;
83   static unsigned int nm_max = -1;
84   
85   if (pDirE == NULL) {
86     return -1;
87   }
88   if (nm_max == -1) {
89 #ifdef NAME_MAX
90     nm_max = NAME_MAX + 1;
91 #else
92     nm_max = pathconf(".", _PC_NAME_MAX);
93     if (nm_max == -1) { nm_max = 255; }
94     nm_max++;
95 #endif
96   }
97   p = (struct dirent*)malloc(sizeof(struct dirent) + nm_max);
98   if (p == NULL) return -1;
99   res = readdir_r((DIR*)dirPtr, p, pDirE);
100   if (res != 0) {
101     *pDirE = NULL;
102     free(p);
103   }
104   return res;
105 #else
106
107   if (pDirE == NULL) {
108     return -1;
109   }
110
111   *pDirE = readdir((DIR*)dirPtr);
112   if (*pDirE == NULL) {
113     return -1;
114   } else {
115     return 0;
116   }  
117 #endif
118 }
119
120 void
121 prel_free_dirent(HsAddr dEnt)
122 {
123 #if HAVE_READDIR_R
124   free(dEnt);
125 #endif
126 }