Skip to content

Commit a2b497c

Browse files
committed
WIP: TLS sockets
This fixes #329. Changelog: added
1 parent 131c0e1 commit a2b497c

21 files changed

+585
-119
lines changed

Cargo.lock

+95-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/src/linker.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,11 @@ pub(crate) fn link(
256256
cmd.arg("-lm");
257257
cmd.arg("-lpthread");
258258
}
259-
_ => {}
259+
OperatingSystem::Mac => {
260+
// This is needed for TLS support.
261+
cmd.arg("-framework Security");
262+
cmd.arg("-framework CoreFoundation");
263+
}
260264
}
261265

262266
let mut static_linking = state.config.static_linking;

rt/Cargo.toml

+13
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,19 @@ unicode-segmentation = "^1.10"
2323
backtrace = "^0.3"
2424
rustix = { version = "^0.38", features = ["fs", "mm", "param", "process", "net", "std", "time", "event"], default-features = false }
2525

26+
# The dependencies needed for TLS support.
27+
#
28+
# We use ring instead of the default aws-lc-sys because:
29+
#
30+
# 1. aws-lc-sys requires cmake to be installed when building on FreeBSD (and
31+
# potentially other platforms), as aws-lc-sys only provides generated
32+
# bindings for a limited set of platforms
33+
# 2. aws-lc-sys increases compile times quite a bit
34+
# 3. We don't care about FIPS compliance at the time of writing
35+
rustls = { version = "^0.23", features = ["ring", "tls12", "std"], default-features = false }
36+
rustls-native-certs = "^0.7"
37+
rustls-pemfile = "^2.1"
38+
2639
[dependencies.socket2]
2740
version = "^0.5"
2841
features = ["all"]

rt/src/network_poller.rs

+11
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,17 @@ pub(crate) type NetworkPoller = sys::Poller;
2828
pub(crate) enum Interest {
2929
Read,
3030
Write,
31+
ReadWrite,
32+
}
33+
34+
impl Interest {
35+
pub(crate) fn new(read: bool, write: bool) -> Interest {
36+
match (read, write) {
37+
(true, true) => Interest::ReadWrite,
38+
(false, true) => Interest::Write,
39+
_ => Interest::Read,
40+
}
41+
}
3142
}
3243

3344
/// A thread that polls a poller and reschedules processes.

rt/src/network_poller/epoll.rs

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ fn flags_for(interest: Interest) -> EventFlags {
1111
let flags = match interest {
1212
Interest::Read => EventFlags::IN,
1313
Interest::Write => EventFlags::OUT,
14+
Interest::ReadWrite => EventFlags::IN | EventFlags::OUT,
1415
};
1516

1617
flags | EventFlags::ET | EventFlags::ONESHOT

rt/src/network_poller/kqueue.rs

+15-9
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,24 @@ impl Poller {
4040
source: impl AsFd,
4141
interest: Interest,
4242
) {
43-
let fd = source.as_fd().as_raw_fd();
44-
let (add, del) = match interest {
45-
Interest::Read => (EventFilter::Read(fd), EventFilter::Write(fd)),
46-
Interest::Write => (EventFilter::Write(fd), EventFilter::Read(fd)),
47-
};
4843
let id = process.identifier() as isize;
44+
let fd = source.as_fd().as_raw_fd();
4945
let flags =
5046
EventFlags::CLEAR | EventFlags::ONESHOT | EventFlags::RECEIPT;
51-
let events = [
52-
Event::new(add, EventFlags::ADD | flags, id),
53-
Event::new(del, EventFlags::DELETE, 0),
54-
];
47+
let events = match interest {
48+
Interest::Read => [
49+
Event::new(EventFilter::Read(fd), EventFlags::ADD | flags, id),
50+
Event::new(EventFilter::Write(fd), EventFlags::DELETE, 0),
51+
],
52+
Interest::Write => [
53+
Event::new(EventFilter::Write(fd), EventFlags::ADD | flags, id),
54+
Event::new(EventFilter::Read(fd), EventFlags::DELETE, 0),
55+
],
56+
Interest::ReadWrite => [
57+
Event::new(EventFilter::Write(fd), EventFlags::ADD | flags, id),
58+
Event::new(EventFilter::Read(fd), EventFlags::ADD | flags, id),
59+
],
60+
};
5561

5662
self.apply(&events);
5763
}

rt/src/result.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ impl Result {
6060
}
6161

6262
pub(crate) fn io_error(error: io::Error) -> Result {
63-
Self::error({ error_to_int(error) } as _)
63+
Self::error(error_to_int(error) as _)
6464
}
6565
}
6666

rt/src/runtime.rs

+6
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ pub unsafe extern "system" fn inko_runtime_new(
6767
// does for us when compiling an executable.
6868
signal_sched::block_all();
6969

70+
// Configure the TLS provider. This must be done once before we start the
71+
// program.
72+
rustls::crypto::ring::default_provider()
73+
.install_default()
74+
.expect("failed to set up the default TLS cryptography provider");
75+
7076
Box::into_raw(Box::new(Runtime::new(&*counts, args)))
7177
}
7278

rt/src/runtime/env.rs

-20
Original file line numberDiff line numberDiff line change
@@ -40,26 +40,6 @@ pub unsafe extern "system" fn inko_env_size(state: *const State) -> i64 {
4040
(*state).environment.len() as _
4141
}
4242

43-
#[no_mangle]
44-
pub unsafe extern "system" fn inko_env_home_directory(
45-
state: *const State,
46-
) -> InkoResult {
47-
let state = &*state;
48-
49-
// Rather than performing all sorts of magical incantations to get the home
50-
// directory, we're just going to require that HOME is set.
51-
//
52-
// If the home is explicitly set to an empty string we still ignore it,
53-
// because there's no scenario in which Some("") is useful.
54-
state
55-
.environment
56-
.get("HOME")
57-
.filter(|&path| !path.is_empty())
58-
.cloned()
59-
.map(|v| InkoResult::ok(InkoString::alloc(state.string_class, v) as _))
60-
.unwrap_or_else(InkoResult::none)
61-
}
62-
6343
#[no_mangle]
6444
pub unsafe extern "system" fn inko_env_temp_directory(
6545
state: *const State,

0 commit comments

Comments
 (0)