/* [<][>][^][v][top][bottom][index][help] */
1 /*
2 * mingw-compat.h - MinGW compatibility
3 *
4 * Collection of #defines and typedefs to fool Gauche source enough
5 * to compile it on Windows/MinGW.
6 * I tried to put mingw-specific stuff here as much as possible,
7 * instead of scattering #ifdefs around the sources.
8 *
9 * $Id: mingw-compat.h,v 1.3 2004/11/21 22:42:27 shirok Exp $
10 */
11
12 #ifndef GAUCHE_MINGW_COMPAT_H
13 #define GAUCHE_MINGW_COMPAT_H
14
15 #include <windows.h>
16 #include <shlwapi.h>
17
18 /* MinGW's sys/types.h doesn't define these.
19 It appearse that _BSDTYPES_DEFINED is the symbol commonly used
20 to guard them from being typedef'ed multiple times.
21 (see gmon.h or winsock.h in MinGW distribution) */
22
23 #ifndef _BSDTYPES_DEFINED
24 typedef unsigned char u_char;
25 typedef unsigned short u_short;
26 typedef unsigned int u_int;
27 typedef unsigned long u_long;
28 #define _BSDTYPES_DEFINED
29 #endif /* _BSDTYPES_DEFINED */
30
31 /*
32 * Users and groups
33 * MinGW doesn't really have users and groups in the sense of POSIX,
34 * so we fake them.
35 */
36 #ifndef gid_t
37 typedef int gid_t;
38 #endif
39 #ifndef uid_t
40 typedef int uid_t;
41 #endif
42
43 struct passwd {
44 char *pw_name;
45 char *pw_passwd;
46 int pw_uid;
47 int pw_gid;
48 char *pw_comment;
49 char *pw_gecos;
50 char *pw_dir;
51 char *pw_shell;
52 };
53
54 struct passwd *getpwuid(uid_t);
55 struct passwd *getpwnam(const char *t);
56
57 struct group {
58 char *gr_name;
59 char *gr_passwd;
60 gid_t gr_gid;
61 char **gr_mem;
62 };
63
64 struct group *getgrgid(gid_t);
65 struct group *getgrnam(const char *t);
66
67 /* No sigsetjmps. Fake it with ordinary setjmps. */
68 typedef jmp_buf sigjmp_buf;
69
70 #define sigsetjmp(jbuf, flag) setjmp(jbuf)
71 #define siglongjmp(jbuf, val) longjmp(jbuf, val)
72
73 /*
74 * sinaction emulation layer
75 * NB: this may need to be changed if MinGW starts supporting
76 * sigemptyset etc.
77 */
78 #ifndef _SIGSET_T_
79 #define _SIGSET_T_
80 typedef unsigned long sigset_t;
81 #endif /* _SIGSET_T_ */
82
83 #define sigemptyset(pset) (*(pset) = 0)
84 #define sigfillset(pset) (*(pset) = (unsigned int)-1)
85 #define sigaddset(pset, num) (*(pset) |= (1L<<(num)))
86 #define sigdelset(pset, num) (*(pset) &= ~(1L<<(num)))
87 #define sigismember(pset, num) (*(pset) & (1L<<(num)))
88
89 #ifndef SIG_SETMASK
90 #define SIG_SETMASK (0)
91 #define SIG_BLOCK (1)
92 #define SIG_UNBLOCK (2)
93 #endif /*SIG_SETMASK*/
94
95 struct sigaction {
96 int sa_flags;
97 sigset_t sa_mask;
98 __p_sig_fn_t sa_handler; /* see mingw/include/signal.h about the type */
99 };
100
101 /* there's a dummy sigaction defined in src/signal.c */
102 int sigaction(int signum, const struct sigaction *act, struct sigaction *oact);
103
104 /*
105 * Miscellaneous POSIX stuff
106 */
107
108 uid_t getuid(void);
109 uid_t geteuid(void);
110 gid_t getgid(void);
111 gid_t getegid(void);
112 pid_t getppid(void);
113
114 int link(const char *existing, const char *newpath);
115 int fork(void);
116 int kill(pid_t pid, int signal);
117 int pipe(int fd[]);
118 char *ttyname(int desc);
119 int truncate(const char *path, off_t len);
120 int ftruncate(int fd, off_t len);
121 unsigned int alarm(unsigned int seconds);
122
123 /* followings are in auxsys.c */
124 const char *getlogin(void);
125
126 /*
127 * Fakes for networking (ext/net)
128 */
129 struct sockaddr_un {
130 unsigned short sun_family;
131 char sun_path[108];
132 };
133
134 /* winsock2 appears to have only inet_addr(), the obsolete interaface */
135 int inet_aton(const char *cp, struct in_addr *inp);
136
137 /*
138 * Fakes for ext/fcntl
139 */
140 struct flock {
141 short l_type;
142 short l_whence;
143 off_t l_start;
144 off_t l_len;
145 pid_t l_pid;
146 };
147
148 #define F_DUPFD 0
149 #define F_GETFD 1
150 #define F_SETFD 2
151 #define F_GETFL 3
152 #define F_SETFL 4
153 #define F_GETLK 5
154 #define F_SETLK 6
155 #define F_SETLKW 7
156
157 #define F_RDLCK 0
158 #define F_WRLCK 1
159 #define F_UNLCK 2
160
161 #endif /* GAUCHE_MINGW_COMPAT_H */