This file is like libbb.h for MinGW port. Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com> --- include/mingw.h | 292 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 292 insertions(+), 0 deletions(-) create mode 100644 include/mingw.h
diff --git a/include/mingw.h b/include/mingw.h new file mode 100644 index 0000000..62cae38 --- /dev/null +++ b/include/mingw.h @@ -0,0 +1,292 @@ +#include <fnmatch.h> +#include <sys/utime.h> + +#define NOIMPL(name,...) static inline int name(__VA_ARGS__) { errno = ENOSYS; return -1; } +#define IMPL(name,ret,retval,...) static inline ret name(__VA_ARGS__) { return retval; } + +/* + * sys/types.h + */ +typedef int gid_t; +typedef int uid_t; +typedef int pid_t; + +/* + * arpa/inet.h + */ +static inline unsigned int git_ntohl(unsigned int x) { return (unsigned int)ntohl(x); } +#define ntohl git_ntohl + +/* + * fcntl.h + */ +#define F_DUPFD 0 +#define F_GETFD 1 +#define F_SETFD 2 +#define F_GETFL 3 +#define F_SETFL 3 +#define FD_CLOEXEC 0x1 +#define O_NONBLOCK 04000 + +/* + * grp.h + */ + +struct group { + char *gr_name; + char *gr_passwd; + gid_t gr_gid; + char **gr_mem; +}; +IMPL(getgrnam,struct group *,NULL,const char *name UNUSED_PARAM); +IMPL(getgrgid,struct group *,NULL,gid_t gid UNUSED_PARAM); +NOIMPL(initgroups,const char *group UNUSED_PARAM,gid_t gid UNUSED_PARAM); +static inline void endgrent(void) {} + +/* + * limits.h + */ +#define NAME_MAX 255 +#define MAXSYMLINKS 20 + + +/* + * poll.h + */ +struct pollfd { + int fd; /* file descriptor */ + short events; /* requested events */ + short revents; /* returned events */ +}; +typedef unsigned long nfds_t; +#define POLLIN 1 +#define POLLHUP 2 + +int poll(struct pollfd *ufds, unsigned int nfds, int timeout); + +/* + * pwd.h + */ +struct passwd { + char *pw_name; + char *pw_gecos; + char *pw_dir; + uid_t pw_uid; + gid_t pw_gid; +}; + +IMPL(getpwnam,struct passwd *,NULL,const char *name UNUSED_PARAM); +struct passwd *getpwuid(int uid); + +/* + * signal.h + */ +#define SIGHUP 1 +#define SIGQUIT 3 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGWINCH 28 + +#define SIG_UNBLOCK 1 + +typedef void (__cdecl *sighandler_t)(int); +struct sigaction { + sighandler_t sa_handler; + unsigned sa_flags; + int sa_mask; +}; +#define sigemptyset(x) (void)0 +#define SA_RESTART 0 + +int sigaction(int sig, struct sigaction *in, struct sigaction *out); +sighandler_t mingw_signal(int sig, sighandler_t handler); +NOIMPL(sigfillset,int *mask UNUSED_PARAM); +#define signal mingw_signal + +/* + * stdio.h + */ +#define fseeko(f,o,w) fseek(f,o,w) + +int fdprintf(int fd, const char *format, ...); + +/* + * stdlib.h + */ +#define WIFEXITED(x) ((unsigned)(x) < 259) /* STILL_ACTIVE */ +#define WEXITSTATUS(x) ((x) & 0xff) +#define WIFSIGNALED(x) ((unsigned)(x) > 259) +#define WTERMSIG(x) ((x) & 0x7f) + +int clearenv(void); +char *mingw_getenv(const char *name); +int mkstemp(char *template); +char *realpath(const char *path, char *resolved_path); +int setenv(const char *name, const char *value, int replace); +void unsetenv(const char *env); + +#define getenv mingw_getenv +/* + * string.h + */ +char *strsep(char **stringp, const char *delim); + +/* + * sys/socket.h + */ +#define hstrerror strerror + +NOIMPL(mingw_socket,int domain UNUSED_PARAM, int type UNUSED_PARAM, int protocol UNUSED_PARAM); +NOIMPL(mingw_sendto,SOCKET s UNUSED_PARAM, const char *buf UNUSED_PARAM, int len UNUSED_PARAM, int flags UNUSED_PARAM, const struct sockaddr *sa UNUSED_PARAM, int salen UNUSED_PARAM); +NOIMPL(mingw_listen,SOCKET s UNUSED_PARAM,int backlog UNUSED_PARAM); +NOIMPL(mingw_bind,SOCKET s UNUSED_PARAM,const struct sockaddr* sa UNUSED_PARAM,int salen UNUSED_PARAM); + +/* Windows declaration is different */ +#define socket mingw_socket +#define sendto mingw_sendto +#define listen mingw_listen +#define bind mingw_bind + +/* + * sys/stat.h + */ +#define S_ISUID 04000 +#define S_ISGID 02000 +#define S_ISVTX 01000 +#ifndef S_IRWXU +#define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) +#endif +#define S_IRWXG (S_IRWXU >> 3) +#define S_IRWXO (S_IRWXG >> 3) + +#define S_IFSOCK 0140000 +#define S_IFLNK 0120000 /* Symbolic link */ +#define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK) +#define S_ISSOCK(x) 0 + +#define S_IRGRP (S_IRUSR >> 3) +#define S_IWGRP (S_IWUSR >> 3) +#define S_IXGRP (S_IXUSR >> 3) +#define S_IROTH (S_IRGRP >> 3) +#define S_IWOTH (S_IWGRP >> 3) +#define S_IXOTH (S_IXGRP >> 3) + +NOIMPL(fchmod,int fildes UNUSED_PARAM, mode_t mode UNUSED_PARAM); +NOIMPL(fchown,int fd UNUSED_PARAM, uid_t uid UNUSED_PARAM, gid_t gid UNUSED_PARAM); +int mingw_mkdir(const char *path, int mode); + +#define mkdir mingw_mkdir +#define lstat stat + +/* + * sys/sysmacros.h + */ +#define makedev(a,b) 0*(a)*(b) /* avoid unused warning */ +#define minor(x) 0 +#define major(x) 0 + +/* + * sys/time.h + */ +struct itimerval { + struct timeval it_value, it_interval; +}; +#define ITIMER_REAL 0 + +int setitimer(int type, struct itimerval *in, struct itimerval *out); +int gettimeofday(struct timeval *tv, void *tz); + +/* + * sys/wait.h + */ +#define WNOHANG 1 +int waitpid(pid_t pid, int *status, unsigned options); + +/* + * time.h + */ +struct tm *gmtime_r(const time_t *timep, struct tm *result); +struct tm *localtime_r(const time_t *timep, struct tm *result); +IMPL(strptime,char*,NULL,const char *s UNUSED_PARAM, const char *format UNUSED_PARAM, struct tm *tm UNUSED_PARAM); + +/* + * unistd.h + */ +#define PIPE_BUF 8192 + +IMPL(alarm,unsigned int,0,unsigned int seconds UNUSED_PARAM); +NOIMPL(chown,const char *path UNUSED_PARAM, uid_t uid UNUSED_PARAM, gid_t gid UNUSED_PARAM); +NOIMPL(chroot,const char *root UNUSED_PARAM); +int mingw_dup (int fd); +char *mingw_getcwd(char *pointer, int len); + + +#ifdef USE_WIN32_MMAP +int mingw_getpagesize(void); +#define getpagesize mingw_getpagesize +#else +int getpagesize(void); /* defined in MinGW's libgcc.a */ +#endif + +IMPL(getgid,int,1,void); +NOIMPL(getgroups,int n UNUSED_PARAM,gid_t *groups UNUSED_PARAM); +IMPL(getppid,int,1,void); +IMPL(getegid,int,1,void); +IMPL(geteuid,int,1,void); +NOIMPL(getsid,pid_t pid UNUSED_PARAM); +IMPL(getuid,int,1,void); +int fcntl(int fd, int cmd, ...); +#define fork() -1 +IMPL(fsync,int,0,int fd UNUSED_PARAM); +NOIMPL(kill,pid_t pid UNUSED_PARAM, int sig UNUSED_PARAM); +int link(const char *oldpath, const char *newpath); +NOIMPL(mknod,const char *name UNUSED_PARAM, mode_t mode UNUSED_PARAM, dev_t device UNUSED_PARAM); +int pipe(int filedes[2]); +NOIMPL(readlink,const char *path UNUSED_PARAM, char *buf UNUSED_PARAM, size_t bufsiz UNUSED_PARAM); +NOIMPL(setgid,gid_t gid UNUSED_PARAM); +NOIMPL(setsid,void); +NOIMPL(setuid,uid_t gid UNUSED_PARAM); +unsigned int sleep (unsigned int seconds); +NOIMPL(symlink,const char *oldpath UNUSED_PARAM, const char *newpath UNUSED_PARAM); +static inline void sync(void) {} +NOIMPL(vfork,void); + +#define getcwd mingw_getcwd +#define lchown(a,b,c) chown(a,b,c) + +/* + * utime.h + */ +int mingw_utime(const char *file_name, const struct utimbuf *times); +NOIMPL(utimes,const char *filename UNUSED_PARAM, const struct timeval times[2] UNUSED_PARAM); + +#define utime mingw_utime + +/* + * MinGW specific + */ +#define has_dos_drive_prefix(path) (isalpha(*(path)) && (path)[1] == ':') +#define is_dir_sep(c) ((c) == '/' || (c) == '\\') +#define PRIuMAX "I64u" + +/* + * helpers + */ + +char **copy_environ(const char *const *env); +void free_environ(char **env); +char **env_setenv(char **env, const char *name); + +const char *get_busybox_exec_path(void);
_______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox