Skip to content

Commit 1f9e522

Browse files
committed
pthread
1 parent 3fc2561 commit 1f9e522

File tree

1 file changed

+76
-2
lines changed

1 file changed

+76
-2
lines changed

src/libcrun/handlers/krun.c

Lines changed: 76 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,56 @@ libkrun_create_context (void *handle, libcrun_error_t *err)
95104
return ctx_id;
96105
}
97106

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

362423
ret = libkrun_read_vm_config (&config_tree, &err);
363424
if (UNLIKELY (ret < 0))
@@ -460,8 +521,21 @@ libkrun_exec (void *cookie, libcrun_container_t *container, const char *pathname
460521

461522
yajl_tree_free (config_tree);
462523

463-
ret = krun_start_enter (ctx_id);
464-
return -ret;
524+
cid = krun_start_enter (ctx_id);
525+
526+
ret = pthread_create(&thread, NULL, listen_enclave_output, (void *) cid);
527+
if (ret < 0) {
528+
perror("unable to create new listener thread");
529+
exit(1);
530+
}
531+
532+
ret = pthread_join(thread, NULL);
533+
if (ret < 0) {
534+
perror("unable to join listener thread");
535+
exit(1);
536+
}
537+
538+
return 0;
465539
}
466540

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

0 commit comments

Comments
 (0)