Skip to content

Commit 7a302ea

Browse files
committed
pthread
1 parent 3fc2561 commit 7a302ea

File tree

1 file changed

+82
-2
lines changed

1 file changed

+82
-2
lines changed

src/libcrun/handlers/krun.c

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@
3232
#include <sched.h>
3333
#include <ocispec/runtime_spec_schema_config_schema.h>
3434

35+
#include <pthread.h>
36+
#include <sys/time.h>
37+
#include <sys/un.h>
38+
#include <sys/socket.h>
39+
#include <linux/vm_sockets.h>
40+
41+
#define VMADDR_CID_HYPERVISOR 0
42+
#define CID_TO_CONSOLE_PORT_OFFSET 10000
43+
3544
#ifdef HAVE_DLOPEN
3645
# include <dlfcn.h>
3746
#endif
@@ -95,6 +104,62 @@ libkrun_create_context (void *handle, libcrun_error_t *err)
95104
return ctx_id;
96105
}
97106

107+
void *listen_enclave_output(void *opaque)
108+
{
109+
fprintf(stderr, "thread\n");
110+
111+
socklen_t addr_sz = sizeof(struct sockaddr_vm);
112+
struct sockaddr_vm addr;
113+
int ret, sock_fd, cid;
114+
struct timeval timeval;
115+
char buf[256];
116+
117+
cid = (int) opaque;
118+
119+
sock_fd = socket(AF_VSOCK, SOCK_STREAM, 0);
120+
if (sock_fd < 0)
121+
return (void *) -1;
122+
123+
bzero((char *) &addr, sizeof(struct sockaddr_vm));
124+
addr.svm_family = AF_VSOCK;
125+
addr.svm_cid = VMADDR_CID_HYPERVISOR;
126+
addr.svm_port = cid + CID_TO_CONSOLE_PORT_OFFSET;
127+
128+
// Set vsock timeout limit to 5 seconds.
129+
memset(&timeval, 0, sizeof(struct timeval));
130+
timeval.tv_sec = 5;
131+
132+
ret = setsockopt(sock_fd, AF_VSOCK, SO_VM_SOCKETS_CONNECT_TIMEOUT,
133+
(void *) &timeval, sizeof(struct timeval));
134+
if (ret < 0) {
135+
close(sock_fd);
136+
return (void *) -1;
137+
}
138+
139+
fprintf(stderr, "connecting\n");
140+
141+
ret = connect(sock_fd, (struct sockaddr *) &addr, addr_sz);
142+
if (ret < 0) {
143+
close(sock_fd);
144+
return (void *) -1;
145+
}
146+
147+
fprintf(stderr, "connected\n");
148+
149+
bzero(buf, 256);
150+
for (;;) {
151+
ret = read(sock_fd, &buf, 256);
152+
if (ret <= 0)
153+
break;
154+
155+
buf[ret] = '/0';
156+
157+
fprintf(stderr, "%s", buf);
158+
}
159+
160+
fprintf(stderr, "\n");
161+
}
162+
98163
static int
99164
libkrun_configure_kernel (uint32_t ctx_id, void *handle, yajl_val *config_tree, libcrun_error_t *err)
100165
{
@@ -358,6 +423,8 @@ libkrun_exec (void *cookie, libcrun_container_t *container, const char *pathname
358423
libcrun_error_t err;
359424
bool configured = false;
360425
yajl_val config_tree = NULL;
426+
pthread_t thread;
427+
int cid;
361428

362429
ret = libkrun_read_vm_config (&config_tree, &err);
363430
if (UNLIKELY (ret < 0))
@@ -460,8 +527,21 @@ libkrun_exec (void *cookie, libcrun_container_t *container, const char *pathname
460527

461528
yajl_tree_free (config_tree);
462529

463-
ret = krun_start_enter (ctx_id);
464-
return -ret;
530+
ret = pthread_create(&thread, NULL, listen_enclave_output, (void *) cid);
531+
if (ret < 0) {
532+
perror("unable to create new listener thread");
533+
exit(1);
534+
}
535+
536+
cid = krun_start_enter (ctx_id);
537+
538+
ret = pthread_join(thread, NULL);
539+
if (ret < 0) {
540+
perror("unable to join listener thread");
541+
exit(1);
542+
}
543+
544+
return 0;
465545
}
466546

467547
/* libkrun_create_kvm_device: explicitly adds kvm device. */

0 commit comments

Comments
 (0)