1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
/* -----------------------------------------------------------------------------
*
* (c) The University of Glasgow 2002
*
* Definitions for package `unix' which are visible in Haskell land.
*
* ---------------------------------------------------------------------------*/
#include "HsUnix.h"
#ifdef HAVE_RTLDNEXT
void *__hsunix_rtldNext (void) {return RTLD_NEXT;}
#endif
#ifdef HAVE_RTLDDEFAULT
void *__hsunix_rtldDefault (void) {return RTLD_DEFAULT;}
#endif
#ifdef HAVE_PTSNAME
// On Linux (and others), <stdlib.h> needs to be included while
// `_XOPEN_SOURCE` is already defined. However, GHCs before GHC 8.0
// didn't do that yet for CApiFFI, so we need this workaround here.
char *__hsunix_ptsname(int fd)
{
return ptsname(fd);
}
int __hsunix_grantpt(int fd)
{
return grantpt(fd);
}
int __hsunix_unlockpt(int fd)
{
return unlockpt(fd);
}
#endif
// push a SVR4 STREAMS module; do nothing if STREAMS not available
int __hsunix_push_module(int fd, const char *module)
{
#if defined(I_PUSH) && !defined(HAVE_DEV_PTC)
return ioctl(fd, I_PUSH, module);
#else
return 0;
#endif
}
#ifdef HAVE_UNSETENV
int __hsunix_unsetenv(const char *name)
{
#ifdef UNSETENV_RETURNS_VOID
unsetenv(name);
return 0;
#else
return unsetenv(name);
#endif
}
#endif
/* A size that will contain many path names, but not necessarily all
* (PATH_MAX is not defined on systems with unlimited path length,
* e.g. the Hurd).
*/
HsInt __hsunix_long_path_size(void) {
#ifdef PATH_MAX
return PATH_MAX;
#else
return 4096;
#endif
}
/*
* read an entry from the directory stream; opt for the
* re-entrant friendly way of doing this, if available.
*/
int __hscore_readdir( DIR *dirPtr, struct dirent **pDirEnt )
{
#if HAVE_READDIR_R
struct dirent* p;
int res;
static unsigned int nm_max = (unsigned int)-1;
if (pDirEnt == NULL) {
return -1;
}
if (nm_max == (unsigned int)-1) {
#ifdef NAME_MAX
nm_max = NAME_MAX + 1;
#else
nm_max = pathconf(".", _PC_NAME_MAX);
if (nm_max == -1) { nm_max = 255; }
nm_max++;
#endif
}
p = (struct dirent*)malloc(sizeof(struct dirent) + nm_max);
if (p == NULL) return -1;
res = readdir_r(dirPtr, p, pDirEnt);
if (res != 0) {
*pDirEnt = NULL;
free(p);
}
else if (*pDirEnt == NULL) {
// end of stream
free(p);
}
return res;
#else
if (pDirEnt == NULL) {
return -1;
}
*pDirEnt = readdir(dirPtr);
if (*pDirEnt == NULL) {
return -1;
} else {
return 0;
}
#endif
}
char *__hscore_d_name( struct dirent* d )
{
return (d->d_name);
}
void __hscore_free_dirent(struct dirent *dEnt)
{
#if HAVE_READDIR_R
free(dEnt);
#endif
}
|