Skip to content
This repository was archived by the owner on Oct 25, 2020. It is now read-only.

chore(macOS): fix compile and running error for macOS #6

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
*.lo
*.o
*.la

compile
config.guess
config.h
config.h.in
config.log
config.status
config.sub
configure
depcomp
install-sh
libtool
ltmain.sh

*.udb

Makefile
Makefile.in
aclocal.m4
autom4te.cache/
m4/
man/Makefile
man/Makefile.in
missing

src/.deps/
src/.libs/
stamp-h1
8 changes: 8 additions & 0 deletions include/qemu-common.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,12 @@

typedef void Monitor;

# ifndef O_CLOEXEC
# define O_CLOEXEC 02000000
# endif

# ifndef SOCK_CLOEXEC
#define SOCK_CLOEXEC O_CLOEXEC
# endif

#endif
80 changes: 51 additions & 29 deletions src/libslirp.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <signal.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <fcntl.h>

#include <include/libslirp.h>
#include <slirp.h>
Expand All @@ -31,6 +32,7 @@
#define MAXMTU 4096
#define APPSIDE 0
#define DAEMONSIDE 1
#define SOCKBUF (2*1024*1024)
static int slirpdaemonfd[2];
static pthread_t slirpdaemon_tid;

Expand All @@ -49,25 +51,25 @@ struct slirp_init_data {
char **vdnssearch;
};

struct slirp_conn;
struct slirp {
typedef struct slirp {
struct slirp_init_data *init_data;
int channel[2];
struct slirp_conn *slirp_conn;
};
} slirp_t;
slirp_t slirp_conn;

struct slirp_conn {
typedef struct slirp_conn {
Slirp *slirp;
int outfd;
};
} slirp_conn_t;

#define SLIRP_ADD_FWD 0x11
#define SLIRP_DEL_FWD 0x12
#define SLIRP_ADD_UNIXFWD 0x21
#define SLIRP_DEL_UNIXFWD 0x22
#define SLIRP_ADD_EXEC 0x31

struct slirp_request {
typedef struct slirp_request {
int tag;
int pipefd[2];
int intarg;
Expand All @@ -76,17 +78,27 @@ struct slirp_request {
int host_port;
struct in_addr guest_addr;
int guest_port;
};
} slirp_request_t;

SLIRP *slirp_open(uint32_t flags) {
SLIRP *rval = malloc(sizeof(struct slirp));
SLIRP *rval = malloc(sizeof(slirp_t));
if (rval == NULL)
goto rval_err;
rval->init_data = calloc(1,sizeof(struct slirp_init_data));
if (rval->init_data == NULL)
goto init_data_err;
if (socketpair(AF_LOCAL, SOCK_DGRAM | SOCK_CLOEXEC, 0, rval->channel) < 0)
if (socketpair(AF_LOCAL, SOCK_DGRAM, 0, rval->channel) < 0)
goto socketpair_err;
/* set SOCK_CLOEXEC */
fcntl(rval->channel[0], F_SETFD, SOCK_CLOEXEC);
fcntl(rval->channel[1], F_SETFD, SOCK_CLOEXEC);
/* set sock buf */
int nBufferLen = SOCKBUF;
int nLen = sizeof(int);
setsockopt(rval->channel[0], SOL_SOCKET, SO_SNDBUF, (char*)&nBufferLen, nLen);
setsockopt(rval->channel[0], SOL_SOCKET, SO_RCVBUF, (char*)&nBufferLen, nLen);
setsockopt(rval->channel[1], SOL_SOCKET, SO_SNDBUF, (char*)&nBufferLen, nLen);
setsockopt(rval->channel[1], SOL_SOCKET, SO_RCVBUF, (char*)&nBufferLen, nLen);
/* default values */
if ((flags & (SLIRP_IPV4 | SLIRP_IPV6)) == 0)
flags |= SLIRP_IPV4;
Expand Down Expand Up @@ -234,11 +246,11 @@ int slirp_set_vdnssearch(SLIRP *slirp, char **vdnssearch) {
int slirp_start(SLIRP *slirp) {
if (slirp->init_data) {
struct slirp_conn *slirp_conn=NULL;
struct iovec iovout[]={{&slirp_conn,sizeof(slirp_conn)},{&slirp,sizeof(slirp)}};
if (writev(slirpdaemonfd[APPSIDE], iovout, 2) < 0) {
struct iovec iovout[]={{&slirp_conn,sizeof(slirp_conn_t*)},{&slirp,sizeof(SLIRP*)}};
if(writev(slirpdaemonfd[APPSIDE], iovout, 2) < 0){
return -1;
}
if (read(slirp->channel[APPSIDE], &slirp_conn, sizeof(slirp_conn)) < sizeof(slirp_conn)) {
if (read(slirp->channel[APPSIDE], &slirp_conn, sizeof(struct slirp_conn*)) < sizeof(struct slirp_conn*)) {
return -1;
}
if (slirp_conn != NULL) {
Expand All @@ -255,7 +267,7 @@ int slirp_start(SLIRP *slirp) {
ssize_t slirp_send(SLIRP *slirp, const void *buf, size_t count) {
struct slirp_conn *slirp_conn = slirp->slirp_conn;
if (slirp_conn && count > sizeof(void *)) {
struct iovec iovout[]={{&slirp_conn,sizeof(slirp_conn)},{(char *)buf,count}};
struct iovec iovout[]={{&slirp_conn,sizeof(slirp_conn_t*)},{(char *)buf,count}};
ssize_t rval = writev(slirpdaemonfd[APPSIDE], iovout, 2);
return rval - sizeof(slirp_conn);
} else {
Expand Down Expand Up @@ -287,7 +299,7 @@ int slirp_fd(SLIRP *slirp) {
int slirp_close(SLIRP *slirp) {
struct slirp_conn *slirp_conn = slirp->slirp_conn;
if (slirp_conn) {
struct iovec iovout[]={{&slirp_conn,sizeof(slirp_conn)}};
struct iovec iovout[]={{&slirp_conn,sizeof(slirp_conn_t*)}};
ssize_t rval = writev(slirpdaemonfd[APPSIDE], iovout, 1);
if (rval >= 0) {
close(slirp->channel[APPSIDE]);
Expand All @@ -301,8 +313,8 @@ int slirp_close(SLIRP *slirp) {
}
}

static int slirp_send_req(struct slirp_conn *slirp_conn, struct slirp_request *preq) {
struct iovec iovout[]={{&slirp_conn,sizeof(slirp_conn)},{&preq,sizeof(preq)}};
static int slirp_send_req(slirp_conn_t *slirp_conn, slirp_request_t *preq) {
struct iovec iovout[]={{&slirp_conn,sizeof(slirp_conn_t*)},{&preq,sizeof(slirp_request_t*)}};
int rval;
pipe(preq->pipefd);
writev(slirpdaemonfd[APPSIDE], iovout, 2);
Expand Down Expand Up @@ -381,9 +393,9 @@ static void netmask6 (struct in6_addr *prefixaddr, struct in6_addr *host, int pr
}

static void slirp_conn_open(void **arg) {
struct slirp *slirp = *arg;
slirp_t *slirp = *arg;
if (slirp && slirp->init_data) {
struct slirp_conn *slirp_conn = calloc(1, sizeof(*slirp_conn));
slirp_conn_t *slirp_conn = calloc(1, sizeof(slirp_conn_t));
struct slirp_init_data *data = slirp->init_data;
struct in_addr vnetwork, vnetmask;
struct in6_addr vprefix_addr6;
Expand All @@ -410,18 +422,18 @@ static void slirp_conn_open(void **arg) {
(const char **) data->vdnssearch,
slirp_conn);
slirp_conn->outfd = slirp->channel[DAEMONSIDE];
write(slirp_conn->outfd, &slirp_conn, sizeof(slirp_conn));
write(slirp_conn->outfd, &slirp_conn, sizeof(slirp_conn_t*));
}
}

void slirp_conn_close(struct slirp_conn *slirp_conn) {
void slirp_conn_close(slirp_conn_t *slirp_conn) {
slirp_clean_hostunixfwd(slirp_conn->slirp);
slirp_cleanup(slirp_conn->slirp);
free(slirp_conn);
}

void slirp_do_req(struct slirp_conn *slirp_conn, void **arg) {
struct slirp_request *preq = *arg;
void slirp_do_req(slirp_conn_t *slirp_conn, void **arg) {
slirp_request_t *preq = *arg;
int rval = -1;

switch (preq->tag) {
Expand Down Expand Up @@ -453,7 +465,7 @@ void slirp_do_req(struct slirp_conn *slirp_conn, void **arg) {
}

void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len) {
struct slirp_conn *slirp_conn = (struct slirp_conn *) opaque;
slirp_conn_t *slirp_conn = (slirp_conn_t *) opaque;
write(slirp_conn->outfd, pkt, pkt_len);
}

Expand All @@ -479,23 +491,23 @@ static void *slirpdaemon_thread (void *arg) {
#endif
pollout = poll(mainloopfds.pfd, mainloopfds.len, timeout);
if (mainloopfds.pfd[0].revents) {
struct slirp_conn *slirp_conn;
slirp_conn_t *slirp_conn;
uint8_t buf[MAXMTU];
struct iovec iovin[]={{&slirp_conn,sizeof(slirp_conn)},{buf,MAXMTU}};
struct iovec iovin[]={{&slirp_conn,sizeof(slirp_conn_t*)},{buf,MAXMTU}};
size_t len = readv(slirpdaemonfd[DAEMONSIDE], iovin, 2);
if (len == 0)
break;
if (slirp_conn == NULL) {
/* NEW CONN */
slirp_conn_open((void **) buf);
} else if (len <= sizeof(slirp_conn) + sizeof(struct slirp_request *)) {
if (len == sizeof(slirp_conn))
} else if (len <= sizeof(slirp_conn_t*) + sizeof(slirp_request_t*)) {
if (len == sizeof(slirp_conn_t*))
slirp_conn_close(slirp_conn);
else
slirp_do_req(slirp_conn, (void **) buf);
} else {
/* incoming msg */
slirp_input(slirp_conn->slirp, buf, len - sizeof(slirp_conn));
slirp_input(slirp_conn->slirp, buf, len - sizeof(slirp_conn_t*));
}
pollout--;
}
Expand All @@ -507,7 +519,17 @@ static void *slirpdaemon_thread (void *arg) {

__attribute__((constructor)) static void init() {
//fprintf(stderr, "INIT!\n");
socketpair(AF_LOCAL, SOCK_SEQPACKET | SOCK_CLOEXEC, 0, slirpdaemonfd);
socketpair(AF_LOCAL, SOCK_DGRAM, 0, slirpdaemonfd);
/* set SOCK_CLOEXEC */
fcntl(slirpdaemonfd[0], F_SETFD, SOCK_CLOEXEC);
fcntl(slirpdaemonfd[1], F_SETFD, SOCK_CLOEXEC);
/* set sock buf */
int nBufferLen = SOCKBUF;
int nLen = sizeof(int);
setsockopt(slirpdaemonfd[0], SOL_SOCKET, SO_SNDBUF, (char*)&nBufferLen, nLen);
setsockopt(slirpdaemonfd[0], SOL_SOCKET, SO_RCVBUF, (char*)&nBufferLen, nLen);
setsockopt(slirpdaemonfd[1], SOL_SOCKET, SO_SNDBUF, (char*)&nBufferLen, nLen);
setsockopt(slirpdaemonfd[1], SOL_SOCKET, SO_RCVBUF, (char*)&nBufferLen, nLen);
pthread_create(&slirpdaemon_tid, NULL, slirpdaemon_thread, NULL);
}

Expand Down