Add size_t ssize_t and socklen_t
This commit is contained in:
parent
42268b6cc2
commit
37bf95704e
@ -147,7 +147,7 @@ int socket(int domain, int type, int protocol) {
|
|||||||
return (int32_t)rtn;
|
return (int32_t)rtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
int setsockopt(int sockfd, int level, int optname, const void* optval, uint64_t optlen) {
|
int setsockopt(int sockfd, int level, int optname, const void* optval, socklen_t optlen) {
|
||||||
long int rtn;
|
long int rtn;
|
||||||
asm volatile (
|
asm volatile (
|
||||||
// Assembly Instructions
|
// Assembly Instructions
|
||||||
@ -162,14 +162,14 @@ int setsockopt(int sockfd, int level, int optname, const void* optval, uint64_t
|
|||||||
// Output operands
|
// Output operands
|
||||||
: "=r" (rtn)
|
: "=r" (rtn)
|
||||||
// Input operand
|
// Input operand
|
||||||
: "r" ((int64_t)sockfd), "r"((int64_t)level), "r"((int64_t)optname), "r"(optval), "r"(optlen)
|
: "r" ((int64_t)sockfd), "r"((int64_t)level), "r"((int64_t)optname), "r"(optval), "r"((uint64_t)optlen)
|
||||||
// Clobbered registers
|
// Clobbered registers
|
||||||
: "x0", "x1", "x2", "x3", "x4", "x8"
|
: "x0", "x1", "x2", "x3", "x4", "x8"
|
||||||
);
|
);
|
||||||
return (int32_t)rtn;
|
return (int32_t)rtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bind(int sockfd, const void* sockaddr, uint64_t addrlen) {
|
int bind(int sockfd, const void* sockaddr, socklen_t addrlen) {
|
||||||
long int rtn;
|
long int rtn;
|
||||||
asm volatile (
|
asm volatile (
|
||||||
// Assembly Instructions
|
// Assembly Instructions
|
||||||
@ -182,7 +182,7 @@ int bind(int sockfd, const void* sockaddr, uint64_t addrlen) {
|
|||||||
// Output operands
|
// Output operands
|
||||||
: "=r" (rtn)
|
: "=r" (rtn)
|
||||||
// Input operand
|
// Input operand
|
||||||
: "r" ((int64_t)sockfd), "r"(sockaddr), "r"(addrlen)
|
: "r" ((int64_t)sockfd), "r"(sockaddr), "r"((uint64_t)addrlen)
|
||||||
// Clobbered registers
|
// Clobbered registers
|
||||||
: "x0", "x1", "x2", "x8"
|
: "x0", "x1", "x2", "x8"
|
||||||
);
|
);
|
||||||
@ -208,7 +208,7 @@ int listen(int fd, int backlog) {
|
|||||||
return (int32_t)rtn;
|
return (int32_t)rtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
int accept(int sockfd, void* addr, uint64_t* addrlen) {
|
int accept(int sockfd, void* addr, socklen_t* addrlen) {
|
||||||
long int rtn;
|
long int rtn;
|
||||||
asm volatile (
|
asm volatile (
|
||||||
// Assembly Instructions
|
// Assembly Instructions
|
||||||
@ -228,7 +228,7 @@ int accept(int sockfd, void* addr, uint64_t* addrlen) {
|
|||||||
return (int32_t)rtn;
|
return (int32_t)rtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
int connect(int sockfd, void* addr, uint64_t addrlen) {
|
int connect(int sockfd, void* addr, socklen_t addrlen) {
|
||||||
long int rtn;
|
long int rtn;
|
||||||
asm volatile (
|
asm volatile (
|
||||||
// Assembly Instructions
|
// Assembly Instructions
|
||||||
@ -241,15 +241,15 @@ int connect(int sockfd, void* addr, uint64_t addrlen) {
|
|||||||
// Output operands
|
// Output operands
|
||||||
: "=r" (rtn)
|
: "=r" (rtn)
|
||||||
// Input operand
|
// Input operand
|
||||||
: "r" ((int64_t)sockfd), "r"(addr), "r"(addrlen)
|
: "r" ((int64_t)sockfd), "r"(addr), "r"((uint64_t)addrlen)
|
||||||
// Clobbered registers
|
// Clobbered registers
|
||||||
: "x0", "x1", "x2", "x8"
|
: "x0", "x1", "x2", "x8"
|
||||||
);
|
);
|
||||||
return (int32_t)rtn;
|
return (int32_t)rtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t sendto(int sockfd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen) {
|
ssize_t sendto(int sockfd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen) {
|
||||||
long int rtn;
|
ssize_t rtn;
|
||||||
asm volatile (
|
asm volatile (
|
||||||
// Assembly Instructions
|
// Assembly Instructions
|
||||||
"mov x8, #206\n" // Syscall number for 'sendto' is 206 in AArch64
|
"mov x8, #206\n" // Syscall number for 'sendto' is 206 in AArch64
|
||||||
@ -264,15 +264,15 @@ int64_t sendto(int sockfd, const void* buf, uint64_t size, int flags, const void
|
|||||||
// Output operands
|
// Output operands
|
||||||
: "=r" (rtn)
|
: "=r" (rtn)
|
||||||
// Input operand
|
// Input operand
|
||||||
: "r" ((int64_t)sockfd), "r"(buf), "r"(size), "r"((int64_t)flags), "r"(sockaddr), "r"(addrlen)
|
: "r" ((int64_t)sockfd), "r"(buf), "r"(size), "r"((int64_t)flags), "r"(sockaddr), "r"((uint64_t)addrlen)
|
||||||
// Clobbered registers
|
// Clobbered registers
|
||||||
: "x0", "x1", "x2", "x3", "x4", "x5", "x8"
|
: "x0", "x1", "x2", "x3", "x4", "x5", "x8"
|
||||||
);
|
);
|
||||||
return rtn;
|
return rtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t recvfrom(int sockfd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen) {
|
ssize_t recvfrom(int sockfd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen) {
|
||||||
long int rtn;
|
ssize_t rtn;
|
||||||
asm volatile (
|
asm volatile (
|
||||||
// Assembly Instructions
|
// Assembly Instructions
|
||||||
"mov x8, #207\n" // Syscall number for 'recvfrom' is 207 in AArch64
|
"mov x8, #207\n" // Syscall number for 'recvfrom' is 207 in AArch64
|
||||||
@ -287,7 +287,7 @@ int64_t recvfrom(int sockfd, const void* buf, uint64_t size, int flags, const vo
|
|||||||
// Output operands
|
// Output operands
|
||||||
: "=r" (rtn)
|
: "=r" (rtn)
|
||||||
// Input operand
|
// Input operand
|
||||||
: "r" ((int64_t)sockfd), "r"(buf), "r"(size), "r"((int64_t)flags), "r"(sockaddr), "r"(addrlen)
|
: "r" ((int64_t)sockfd), "r"(buf), "r"(size), "r"((int64_t)flags), "r"(sockaddr), "r"((uint64_t)addrlen)
|
||||||
// Clobbered registers
|
// Clobbered registers
|
||||||
: "x0", "x1", "x2", "x3", "x4", "x5", "x8", "memory"
|
: "x0", "x1", "x2", "x3", "x4", "x5", "x8", "memory"
|
||||||
);
|
);
|
||||||
|
|||||||
@ -101,21 +101,21 @@ int socket(int domain, int type, int protocol) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define SYS_SETSOCKOPT 54
|
#define SYS_SETSOCKOPT 54
|
||||||
int setsockopt(int fd, int level, int optname, const void* optval, uint64_t optlen) {
|
int setsockopt(int fd, int level, int optname, const void* optval, socklen_t optlen) {
|
||||||
int rtn;
|
int rtn;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"mov %5, %%r10\n"
|
"mov %5, %%r10\n"
|
||||||
"mov %6, %%r8\n"
|
"mov %6, %%r8\n"
|
||||||
"syscall\n"
|
"syscall\n"
|
||||||
: "=a"(rtn)
|
: "=a"(rtn)
|
||||||
: "a"(SYS_SETSOCKOPT), "D"(fd), "S"(level), "d"(optname), "r"(optval), "r"(optlen)
|
: "a"(SYS_SETSOCKOPT), "D"(fd), "S"(level), "d"(optname), "r"(optval), "r"((uint64_t)optlen)
|
||||||
: "rcx", "r11"
|
: "rcx", "r11"
|
||||||
);
|
);
|
||||||
return rtn;
|
return rtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SYS_BIND 49
|
#define SYS_BIND 49
|
||||||
int bind(int fd, const void* sockaddr, uint64_t addrlen) {
|
int bind(int fd, const void* sockaddr, socklen_t addrlen) {
|
||||||
int rtn;
|
int rtn;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"syscall\n"
|
"syscall\n"
|
||||||
@ -139,7 +139,7 @@ int listen(int fd, int backlog) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define SYS_ACCEPT 43
|
#define SYS_ACCEPT 43
|
||||||
int accept(int fd, void* addr, uint64_t* addrlen) {
|
int accept(int fd, void* addr, socklen_t* addrlen) {
|
||||||
int rtn;
|
int rtn;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"syscall\n"
|
"syscall\n"
|
||||||
@ -151,7 +151,7 @@ int accept(int fd, void* addr, uint64_t* addrlen) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define SYS_CONNECT 42
|
#define SYS_CONNECT 42
|
||||||
int connect(int fd, void* addr, uint64_t addrlen) {
|
int connect(int fd, void* addr, socklen_t addrlen) {
|
||||||
int rtn;
|
int rtn;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"syscall\n"
|
"syscall\n"
|
||||||
@ -163,30 +163,30 @@ int connect(int fd, void* addr, uint64_t addrlen) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define SYS_SENDTO 44
|
#define SYS_SENDTO 44
|
||||||
int64_t sendto(int fd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen) {
|
ssize_t sendto(int fd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen) {
|
||||||
int64_t nsent;
|
ssize_t nsent;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"mov %5, %%r10\n"
|
"mov %5, %%r10\n"
|
||||||
"mov %6, %%r8\n"
|
"mov %6, %%r8\n"
|
||||||
"mov %7, %%r9\n"
|
"mov %7, %%r9\n"
|
||||||
"syscall\n"
|
"syscall\n"
|
||||||
: "=a"(nsent)
|
: "=a"(nsent)
|
||||||
: "a"(SYS_SENDTO), "D"(fd), "S"(buf), "d"(size), "r"((int64_t)flags), "r"(sockaddr), "r"(addrlen)
|
: "a"(SYS_SENDTO), "D"(fd), "S"(buf), "d"(size), "r"((int64_t)flags), "r"(sockaddr), "r"((uint64_t)addrlen)
|
||||||
: "rcx", "r11"
|
: "rcx", "r11"
|
||||||
);
|
);
|
||||||
return nsent;
|
return nsent;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SYS_RECVFROM 45
|
#define SYS_RECVFROM 45
|
||||||
int64_t recvfrom(int fd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen) {
|
ssize_t recvfrom(int fd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen) {
|
||||||
int64_t nrecv;
|
ssize_t nrecv;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"mov %5, %%r10\n"
|
"mov %5, %%r10\n"
|
||||||
"mov %6, %%r8\n"
|
"mov %6, %%r8\n"
|
||||||
"mov %7, %%r9\n"
|
"mov %7, %%r9\n"
|
||||||
"syscall\n"
|
"syscall\n"
|
||||||
: "=a"(nrecv)
|
: "=a"(nrecv)
|
||||||
: "a"(SYS_RECVFROM), "D"(fd), "S"(buf), "d"(size), "r"((int64_t)flags), "r"(sockaddr), "r"(addrlen)
|
: "a"(SYS_RECVFROM), "D"(fd), "S"(buf), "d"(size), "r"((int64_t)flags), "r"(sockaddr), "r"((int64_t)addrlen)
|
||||||
: "rcx", "r11", "memory"
|
: "rcx", "r11", "memory"
|
||||||
);
|
);
|
||||||
return nrecv;
|
return nrecv;
|
||||||
|
|||||||
23
int.h
23
int.h
@ -23,15 +23,17 @@ typedef uint64_t uintptr_t;
|
|||||||
#elif __WORDSIZE == 32
|
#elif __WORDSIZE == 32
|
||||||
typedef int32_t intptr_t;
|
typedef int32_t intptr_t;
|
||||||
typedef uint32_t uintptr_t;
|
typedef uint32_t uintptr_t;
|
||||||
|
#else
|
||||||
|
#error Unsupported or unknown wordsize
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef intptr_t ssize_t;
|
||||||
|
typedef uintptr_t size_t;
|
||||||
|
|
||||||
|
typedef uint32_t socklen_t;
|
||||||
|
typedef uint32_t pid_t;
|
||||||
|
|
||||||
// Compile time tests in supported compilers
|
// Compile time tests in supported compilers
|
||||||
#ifdef __SIZEOF_CHAR__
|
|
||||||
#if __SIZEOF_CHAR__ != 1
|
|
||||||
#error __SIZEOF_CHAR__ is not 1
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __SIZEOF_SHORT__
|
#ifdef __SIZEOF_SHORT__
|
||||||
#if __SIZEOF_SHORT__ != 2
|
#if __SIZEOF_SHORT__ != 2
|
||||||
#error __SIZEOF_SHORT__ is not 2
|
#error __SIZEOF_SHORT__ is not 2
|
||||||
@ -56,7 +58,10 @@ typedef uint32_t uintptr_t;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// TODO:
|
#ifdef __SIZEOF_SIZE_T__
|
||||||
// size_t, ssize_t, socklen_t
|
#if __SIZEOF_SIZE_T__ != (__WORDSIZE / 8)
|
||||||
// #ifdef __SIZEOF_SIZE_T__
|
#error __SIZEOF_SIZE_T__ is not (__WORDSIZE / 8)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // !MINIMALINT_H
|
#endif // !MINIMALINT_H
|
||||||
|
|||||||
19
socktest.c
19
socktest.c
@ -5,7 +5,6 @@
|
|||||||
int main() {
|
int main() {
|
||||||
char recvBuff[4096];
|
char recvBuff[4096];
|
||||||
int socket_fd, connection_fd;
|
int socket_fd, connection_fd;
|
||||||
int c;
|
|
||||||
struct sockaddr_in server, client;
|
struct sockaddr_in server, client;
|
||||||
server.sin_family = AF_INET;
|
server.sin_family = AF_INET;
|
||||||
server.sin_addr.s_addr = INADDR_ANY;
|
server.sin_addr.s_addr = INADDR_ANY;
|
||||||
@ -17,7 +16,7 @@ int main() {
|
|||||||
if (socket_fd < 0) {
|
if (socket_fd < 0) {
|
||||||
write(STDERR, "Socket error\n", 13);
|
write(STDERR, "Socket error\n", 13);
|
||||||
close(socket_fd);
|
close(socket_fd);
|
||||||
return(1);
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set socket options
|
// Set socket options
|
||||||
@ -25,14 +24,14 @@ int main() {
|
|||||||
if(0 > setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
|
if(0 > setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
|
||||||
write(STDERR, "Socket error\n", 13);
|
write(STDERR, "Socket error\n", 13);
|
||||||
close(socket_fd);
|
close(socket_fd);
|
||||||
return(2);
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bind the socket
|
// Bind the socket
|
||||||
if( bind(socket_fd, (struct sockaddr *)&server, sizeof(server)) < 0) {
|
if( bind(socket_fd, (struct sockaddr *)&server, sizeof(server)) < 0) {
|
||||||
write(STDERR, "Socket error\n", 13);
|
write(STDERR, "Socket error\n", 13);
|
||||||
close(socket_fd);
|
close(socket_fd);
|
||||||
return(3);
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Listen for incoming connections
|
// Listen for incoming connections
|
||||||
@ -42,14 +41,14 @@ int main() {
|
|||||||
write(STDOUT, "Waiting for incoming connections...\n", 36);
|
write(STDOUT, "Waiting for incoming connections...\n", 36);
|
||||||
|
|
||||||
// Get the new connection
|
// Get the new connection
|
||||||
c = sizeof(struct sockaddr_in);
|
socklen_t c = sizeof(struct sockaddr_in);
|
||||||
connection_fd = accept(socket_fd, (void *)&client, (uint64_t*)&c);
|
connection_fd = accept(socket_fd, (void *)&client, &c);
|
||||||
write(STDOUT, "Got new connection\n", 19);
|
write(STDOUT, "Got new connection\n", 19);
|
||||||
if(connection_fd < 0) {
|
if(connection_fd < 0) {
|
||||||
write(STDERR, "Connection error\n", 17);
|
write(STDERR, "Connection error\n", 17);
|
||||||
close(connection_fd);
|
close(connection_fd);
|
||||||
close(socket_fd);
|
close(socket_fd);
|
||||||
return(5);
|
return 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -63,18 +62,18 @@ int main() {
|
|||||||
write(STDERR, "Connection error\n", 17);
|
write(STDERR, "Connection error\n", 17);
|
||||||
close(connection_fd);
|
close(connection_fd);
|
||||||
close(socket_fd);
|
close(socket_fd);
|
||||||
return(6);
|
return 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recieve stuff
|
// Recieve stuff
|
||||||
write(STDOUT, "Recieving data...\n", 18);
|
write(STDOUT, "Recieving data...\n", 18);
|
||||||
for(;;) {
|
for(;;) {
|
||||||
int64_t incoming = recv(connection_fd, recvBuff, 4096, 0);
|
ssize_t incoming = recv(connection_fd, recvBuff, 4096, 0);
|
||||||
if( incoming < 0) {
|
if( incoming < 0) {
|
||||||
write(STDERR, "Connection error\n", 17);
|
write(STDERR, "Connection error\n", 17);
|
||||||
close(connection_fd);
|
close(connection_fd);
|
||||||
close(socket_fd);
|
close(socket_fd);
|
||||||
return(7);
|
return 7;
|
||||||
}if(incoming == 0) break;
|
}if(incoming == 0) break;
|
||||||
|
|
||||||
// Print the recieved data
|
// Print the recieved data
|
||||||
|
|||||||
26
sys.h
26
sys.h
@ -39,14 +39,14 @@ int fsync(unsigned int fd);
|
|||||||
|
|
||||||
// Socket syscalls
|
// Socket syscalls
|
||||||
int socket(int domain, int type, int protocol);
|
int socket(int domain, int type, int protocol);
|
||||||
int setsockopt(int sockfd, int level, int optname, const void* optval, uint64_t optlen);
|
int setsockopt(int sockfd, int level, int optname, const void* optval, socklen_t optlen);
|
||||||
int bind(int sockfd, const void* sockaddr, uint64_t addrlen);
|
int bind(int sockfd, const void* sockaddr, socklen_t addrlen);
|
||||||
int listen(int fd, int backlog);
|
int listen(int fd, int backlog);
|
||||||
int accept(int sockfd, void* addr, uint64_t* addrlen);
|
int accept(int sockfd, void* addr, socklen_t* addrlen);
|
||||||
int connect(int sockfd, void* addr, uint64_t addrlen);
|
int connect(int sockfd, void* addr, socklen_t addrlen);
|
||||||
int64_t sendto(int sockfd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen);
|
int64_t sendto(int sockfd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen);
|
||||||
#define send(sockfd, buf, size, flags) sendto(sockfd, buf, size, flags, 0, 0)
|
#define send(sockfd, buf, size, flags) sendto(sockfd, buf, size, flags, 0, 0)
|
||||||
int64_t recvfrom(int sockfd, const void* buf, uint64_t size, int flags, const void* sockaddr, uint64_t addrlen);
|
int64_t recvfrom(int sockfd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen);
|
||||||
#define recv(sockfd, buf, size, flags) recvfrom(sockfd, buf, size, flags, 0, 0)
|
#define recv(sockfd, buf, size, flags) recvfrom(sockfd, buf, size, flags, 0, 0)
|
||||||
// Socket Domain constants
|
// Socket Domain constants
|
||||||
typedef unsigned short sa_family_t;
|
typedef unsigned short sa_family_t;
|
||||||
@ -84,22 +84,22 @@ SOCK_PACKET = 10,
|
|||||||
#define SO_BROADCAST 6
|
#define SO_BROADCAST 6
|
||||||
#define SO_SNDBUF 7
|
#define SO_SNDBUF 7
|
||||||
#define SO_RCVBUF 8
|
#define SO_RCVBUF 8
|
||||||
#define SO_SNDBUFFORCE 32
|
|
||||||
#define SO_RCVBUFFORCE 33
|
|
||||||
#define SO_KEEPALIVE 9
|
#define SO_KEEPALIVE 9
|
||||||
#define SO_OOBINLINE 10
|
#define SO_OOBINLINE 10
|
||||||
#define SO_NO_CHECK 11
|
|
||||||
#define SO_PRIORITY 12
|
|
||||||
#define SO_LINGER 13
|
#define SO_LINGER 13
|
||||||
#define SO_BSDCOMPAT 14
|
|
||||||
#define SO_REUSEPORT 15
|
#define SO_REUSEPORT 15
|
||||||
#define SO_PASSCRED 16
|
|
||||||
#define SO_PEERCRED 17
|
|
||||||
#define SO_RCVLOWAT 18
|
#define SO_RCVLOWAT 18
|
||||||
#define SO_SNDLOWAT 19
|
#define SO_SNDLOWAT 19
|
||||||
#define SO_RCVTIMEO 20
|
#define SO_RCVTIMEO 20
|
||||||
#define SO_SNDTIMEO 21
|
#define SO_SNDTIMEO 21
|
||||||
#endif
|
#endif
|
||||||
|
#define SO_STYLE SO_TYPE /* Synonym */
|
||||||
|
/* linux-specific, might as well be the same as on i386 */
|
||||||
|
#define SO_NO_CHECK 11
|
||||||
|
#define SO_PRIORITY 12
|
||||||
|
#define SO_BSDCOMPAT 14
|
||||||
|
#define SO_PASSCRED 17
|
||||||
|
#define SO_PEERCRED 18
|
||||||
|
|
||||||
uint32_t fork();
|
uint32_t fork();
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user