[project @ 2002-01-05 11:28:31 by sof]
[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   struct dirent* r;
83   int res;
84   static unsigned int nm_max = -1;
85   
86   if (pDirE == NULL) {
87     return -1;
88   }
89   if (nm_max == -1) {
90 #ifdef NAME_MAX
91     nm_max = NAME_MAX + 1;
92 #else
93     nm_max = pathconf(".", _PC_NAME_MAX);
94     if (nm_max == -1) { nm_max = 255; }
95     nm_max++;
96 #endif
97   }
98   p = (struct dirent*)malloc(sizeof(struct dirent) + nm_max);
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 }