Files
nt-lite/code/user/personalities/posix/posix.h
T

234 lines
6.0 KiB
C

// POSIX compatibility support for posix.
#pragma once
// posix.h - POSIX type and constant definitions for posix.dll
// Covers just what open/read/write/close/lseek/spawn/pthread/chdir need.
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
// errno.
#ifdef errno
#undef errno
#endif
#ifdef EAGAIN
#undef EAGAIN
#endif
#ifdef ENOSYS
#undef ENOSYS
#endif
#ifdef EWOULDBLOCK
#undef EWOULDBLOCK
#endif
#ifdef EINPROGRESS
#undef EINPROGRESS
#endif
#ifdef ETIMEDOUT
#undef ETIMEDOUT
#endif
#ifdef ECONNRESET
#undef ECONNRESET
#endif
#ifdef ENOTSOCK
#undef ENOTSOCK
#endif
extern int errno; // defined in posix_fd.c; single global in v1
#define EPERM 1
#define ENOENT 2
#define ESRCH 3
#define EINTR 4
#define EIO 5
#define EBADF 9
#define ENOMEM 12
#define EACCES 13
#define EEXIST 17
#define ENODEV 19
#define ENOTDIR 20
#define EINVAL 22
#define ESPIPE 29
#define EMFILE 24
#define ENOSPC 28
#define ERANGE 34
#define EAGAIN 35
#define EWOULDBLOCK EAGAIN
#define ENOSYS 38
#define ENOTSOCK 88
#define EINPROGRESS 115
#define ETIMEDOUT 116
#define ECONNRESET 104
// open() flags.
#define O_RDONLY 0x0000
#define O_WRONLY 0x0001
#define O_RDWR 0x0002
#define O_CREAT 0x0040
#define O_TRUNC 0x0200
#define O_APPEND 0x0400
// lseek() whence.
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
// mmap() protection and mapping flags.
#define PROT_NONE 0x0
#define PROT_READ 0x1
#define PROT_WRITE 0x2
#define PROT_EXEC 0x4
#define MAP_SHARED 0x01
#define MAP_PRIVATE 0x02
#define MAP_FAILED ((void*)(intptr_t)-1)
#define MS_SYNC 0x04
#define MS_ASYNC 0x01
#define MS_INVALIDATE 0x02
// Scalar types.
typedef int32_t pid_t;
typedef int32_t off_t;
typedef uint32_t mode_t;
typedef int64_t ssize_t;
__declspec(dllexport) void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset);
__declspec(dllexport) int munmap(void* addr, size_t length);
__declspec(dllexport) int msync(void* addr, size_t length, int flags);
// Sockets.
typedef uint16_t sa_family_t;
typedef uint16_t in_port_t;
typedef uint32_t in_addr_t;
typedef uint32_t socklen_t;
#define AF_INET 2
#define PF_INET AF_INET
#define SOCK_STREAM 1
#define SOCK_DGRAM 2
#define SOCK_RAW 3
#define IPPROTO_ICMP 1
#define IPPROTO_TCP 6
#define IPPROTO_UDP 17
#define SHUT_RD 0
#define SHUT_WR 1
#define SHUT_RDWR 2
#define SOL_SOCKET 1
#define SO_RCVTIMEO 1
#define SO_SNDTIMEO 2
#define SO_NONBLOCK 3
#define INADDR_ANY ((in_addr_t)0x00000000u)
#define INADDR_NONE ((in_addr_t)0xFFFFFFFFu)
struct in_addr {
in_addr_t s_addr;
};
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
};
struct sockaddr_in {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
struct hostent {
char* h_name;
char** h_aliases;
int h_addrtype;
int h_length;
char** h_addr_list;
};
#define h_addr h_addr_list[0]
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_t ai_addrlen;
struct sockaddr* ai_addr;
char* ai_canonname;
struct addrinfo* ai_next;
};
#define AI_PASSIVE 0x0001
struct pollfd {
int fd;
short events;
short revents;
};
#define POLLIN 0x0001
#define POLLOUT 0x0002
#define POLLERR 0x0004
#define POLLHUP 0x0008
#define POLLNVAL 0x0010
typedef unsigned long nfds_t;
typedef struct timeval {
long tv_sec;
long tv_usec;
} timeval;
__declspec(dllexport) uint16_t htons(uint16_t x);
__declspec(dllexport) uint16_t ntohs(uint16_t x);
__declspec(dllexport) uint32_t htonl(uint32_t x);
__declspec(dllexport) uint32_t ntohl(uint32_t x);
__declspec(dllexport) in_addr_t inet_addr(const char* text);
__declspec(dllexport) char* inet_ntoa(struct in_addr in);
__declspec(dllexport) int socket(int domain, int type, int protocol);
__declspec(dllexport) int bind(int fd, const struct sockaddr* addr, socklen_t addrlen);
__declspec(dllexport) int listen(int fd, int backlog);
__declspec(dllexport) int accept(int fd, struct sockaddr* addr, socklen_t* addrlen);
__declspec(dllexport) int connect(int fd, const struct sockaddr* addr, socklen_t addrlen);
__declspec(dllexport) ssize_t send(int fd, const void* buf, size_t len, int flags);
__declspec(dllexport) ssize_t recv(int fd, void* buf, size_t len, int flags);
__declspec(dllexport) ssize_t sendto(int fd, const void* buf, size_t len, int flags, const struct sockaddr* dest, socklen_t destlen);
__declspec(dllexport) ssize_t recvfrom(int fd, void* buf, size_t len, int flags, struct sockaddr* src, socklen_t* srclen);
__declspec(dllexport) int shutdown(int fd, int how);
__declspec(dllexport) int setsockopt(int fd, int level, int optname, const void* optval, socklen_t optlen);
__declspec(dllexport) int getsockopt(int fd, int level, int optname, void* optval, socklen_t* optlen);
__declspec(dllexport) int poll(struct pollfd* fds, nfds_t nfds, int timeout);
__declspec(dllexport) struct hostent* gethostbyname(const char* name);
__declspec(dllexport) int getaddrinfo(const char* node, const char* service, const struct addrinfo* hints, struct addrinfo** res);
__declspec(dllexport) void freeaddrinfo(struct addrinfo* res);
// pthread types.
typedef struct { uint32_t Handle; uint32_t Tid; } pthread_t;
typedef struct { uint32_t Handle; } pthread_mutex_t;
typedef void* pthread_attr_t; // unused in v1
typedef void* pthread_mutexattr_t;
// posix_spawn types (file_actions and attrp both ignored in v1).
typedef void* posix_spawn_file_actions_t;
typedef void* posix_spawnattr_t;
__declspec(dllexport) const char* posix_get_command_line(void);
// dirent (used by posix_dir.c).
#define NAME_MAX 259
typedef struct dirent {
char d_name[NAME_MAX + 1];
unsigned char d_type; // DT_REG or DT_DIR
} dirent;
#define DT_UNKNOWN 0
#define DT_REG 8
#define DT_DIR 4
typedef struct DIR {
uint32_t KHandle; // kernel DIR_OBJECT handle
dirent Current;
bool Valid;
} DIR;