mingw.h 5.6 KB
Newer Older
J
Johannes Sixt 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#include <winsock2.h>

/*
 * things that are not available in header files
 */

typedef int pid_t;
#define hstrerror strerror

#define S_IFLNK    0120000 /* Symbolic link */
#define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK)
#define S_ISSOCK(x) 0
#define S_IRGRP 0
#define S_IWGRP 0
#define S_IXGRP 0
#define S_ISGID 0
#define S_IROTH 0
#define S_IXOTH 0

#define WIFEXITED(x) ((unsigned)(x) < 259)	/* STILL_ACTIVE */
#define WEXITSTATUS(x) ((x) & 0xff)
#define WIFSIGNALED(x) ((unsigned)(x) > 259)

J
Johannes Sixt 已提交
24 25 26 27 28 29
#define SIGHUP 1
#define SIGQUIT 3
#define SIGKILL 9
#define SIGPIPE 13
#define SIGALRM 14
#define SIGCHLD 17
J
Johannes Sixt 已提交
30 31 32 33 34 35 36 37 38 39 40

#define F_GETFD 1
#define F_SETFD 2
#define FD_CLOEXEC 0x1

struct passwd {
	char *pw_name;
	char *pw_gecos;
	char *pw_dir;
};

41 42
extern char *getpass(const char *prompt);

J
Johannes Sixt 已提交
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
struct pollfd {
	int fd;           /* file descriptor */
	short events;     /* requested events */
	short revents;    /* returned events */
};
#define POLLIN 1
#define POLLHUP 2

typedef void (__cdecl *sig_handler_t)(int);
struct sigaction {
	sig_handler_t sa_handler;
	unsigned sa_flags;
};
#define sigemptyset(x) (void)0
#define SA_RESTART 0

struct itimerval {
	struct timeval it_value, it_interval;
};
#define ITIMER_REAL 0

/*
 * trivial stubs
 */

static inline int readlink(const char *path, char *buf, size_t bufsiz)
{ errno = ENOSYS; return -1; }
static inline int symlink(const char *oldpath, const char *newpath)
{ errno = ENOSYS; return -1; }
static inline int fchmod(int fildes, mode_t mode)
{ errno = ENOSYS; return -1; }
static inline int fork(void)
{ errno = ENOSYS; return -1; }
static inline unsigned int alarm(unsigned int seconds)
{ return 0; }
static inline int fsync(int fd)
{ return 0; }
static inline int getppid(void)
{ return 1; }
static inline void sync(void)
{}
static inline int getuid()
{ return 1; }
static inline struct passwd *getpwnam(const char *name)
{ return NULL; }
static inline int fcntl(int fd, int cmd, long arg)
{
	if (cmd == F_GETFD || cmd == F_SETFD)
		return 0;
	errno = EINVAL;
	return -1;
}

/*
 * simple adaptors
 */

static inline int mingw_mkdir(const char *path, int mode)
{
	return mkdir(path);
}
#define mkdir mingw_mkdir

106 107 108 109 110 111 112 113
static inline int mingw_unlink(const char *pathname)
{
	/* read-only files cannot be removed */
	chmod(pathname, 0666);
	return unlink(pathname);
}
#define unlink mingw_unlink

114
static inline int waitpid(pid_t pid, int *status, unsigned options)
J
Johannes Sixt 已提交
115 116 117 118 119 120 121 122 123 124 125
{
	if (options == 0)
		return _cwait(status, pid, 0);
	errno = EINVAL;
	return -1;
}

/*
 * implementations of missing functions
 */

126
int pipe(int filedes[2]);
J
Johannes Sixt 已提交
127 128 129 130 131 132 133 134 135 136
unsigned int sleep (unsigned int seconds);
int mkstemp(char *template);
int gettimeofday(struct timeval *tv, void *tz);
int poll(struct pollfd *ufds, unsigned int nfds, int timeout);
struct tm *gmtime_r(const time_t *timep, struct tm *result);
struct tm *localtime_r(const time_t *timep, struct tm *result);
int getpagesize(void);	/* defined in MinGW's libgcc.a */
struct passwd *getpwuid(int uid);
int setitimer(int type, struct itimerval *in, struct itimerval *out);
int sigaction(int sig, struct sigaction *in, struct sigaction *out);
P
Petr Kodl 已提交
137
int link(const char *oldpath, const char *newpath);
138

139 140 141 142
/*
 * replacements of existing functions
 */

143 144 145
int mingw_open (const char *filename, int oflags, ...);
#define open mingw_open

146 147 148
char *mingw_getcwd(char *pointer, int len);
#define getcwd mingw_getcwd

149 150 151
char *mingw_getenv(const char *name);
#define getenv mingw_getenv

152 153 154 155 156 157 158 159 160
struct hostent *mingw_gethostbyname(const char *host);
#define gethostbyname mingw_gethostbyname

int mingw_socket(int domain, int type, int protocol);
#define socket mingw_socket

int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz);
#define connect mingw_connect

161 162 163
int mingw_rename(const char*, const char*);
#define rename mingw_rename

J
Janos Laube 已提交
164 165 166 167 168
#ifdef USE_WIN32_MMAP
int mingw_getpagesize(void);
#define getpagesize mingw_getpagesize
#endif

169 170 171
/* Use mingw_lstat() instead of lstat()/stat() and
 * mingw_fstat() instead of fstat() on Windows.
 */
J
Johannes Schindelin 已提交
172 173 174
#define off_t off64_t
#define stat _stati64
#define lseek _lseeki64
175 176
int mingw_lstat(const char *file_name, struct stat *buf);
int mingw_fstat(int fd, struct stat *buf);
177 178
#define fstat mingw_fstat
#define lstat mingw_lstat
179
#define _stati64(x,y) mingw_lstat(x,y)
180

181 182 183
int mingw_utime(const char *file_name, const struct utimbuf *times);
#define utime mingw_utime

184
pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **env);
185 186 187
void mingw_execvp(const char *cmd, char *const *argv);
#define execvp mingw_execvp

188 189 190 191
static inline unsigned int git_ntohl(unsigned int x)
{ return (unsigned int)ntohl(x); }
#define ntohl git_ntohl

192 193 194
sig_handler_t mingw_signal(int sig, sig_handler_t handler);
#define signal mingw_signal

195 196 197 198 199 200 201 202 203 204 205
/*
 * ANSI emulation wrappers
 */

int winansi_fputs(const char *str, FILE *stream);
int winansi_printf(const char *format, ...) __attribute__((format (printf, 1, 2)));
int winansi_fprintf(FILE *stream, const char *format, ...) __attribute__((format (printf, 2, 3)));
#define fputs winansi_fputs
#define printf(...) winansi_printf(__VA_ARGS__)
#define fprintf(...) winansi_fprintf(__VA_ARGS__)

206 207 208 209
/*
 * git specific compatibility
 */

210 211
#define has_dos_drive_prefix(path) (isalpha(*(path)) && (path)[1] == ':')
#define is_dir_sep(c) ((c) == '/' || (c) == '\\')
212
#define PATH_SEP ';'
J
Johannes Sixt 已提交
213
#define PRIuMAX "I64u"
214

215 216 217
void mingw_open_html(const char *path);
#define open_html mingw_open_html

218 219 220 221 222 223 224
/*
 * helpers
 */

char **copy_environ(void);
void free_environ(char **env);
char **env_setenv(char **env, const char *name);
225 226 227 228 229

/*
 * A replacement of main() that ensures that argv[0] has a path
 */

230 231 232
#define main(c,v) dummy_decl_mingw_main(); \
static int mingw_main(); \
int main(int argc, const char **argv) \
233 234 235 236 237
{ \
	argv[0] = xstrdup(_pgmptr); \
	return mingw_main(argc, argv); \
} \
static int mingw_main(c,v)