diff options
Diffstat (limited to 'meap/meap-code/ch10/ch10-basic-handler')
-rw-r--r-- | meap/meap-code/ch10/ch10-basic-handler/Cargo.toml | 9 | ||||
-rw-r--r-- | meap/meap-code/ch10/ch10-basic-handler/Dockerfile | 36 | ||||
-rw-r--r-- | meap/meap-code/ch10/ch10-basic-handler/Makefile | 2 | ||||
-rw-r--r-- | meap/meap-code/ch10/ch10-basic-handler/src/main.rs | 58 |
4 files changed, 105 insertions, 0 deletions
diff --git a/meap/meap-code/ch10/ch10-basic-handler/Cargo.toml b/meap/meap-code/ch10/ch10-basic-handler/Cargo.toml new file mode 100644 index 0000000..7cc2735 --- /dev/null +++ b/meap/meap-code/ch10/ch10-basic-handler/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "basic-handler" +version = "0.1.0" +authors = ["Tim McNamara <code@timmcnamara.co.nz>"] + +[dependencies] + +[target.'cfg(not(windows))'.dependencies] +libc = "0.2"
\ No newline at end of file diff --git a/meap/meap-code/ch10/ch10-basic-handler/Dockerfile b/meap/meap-code/ch10/ch10-basic-handler/Dockerfile new file mode 100644 index 0000000..cc17065 --- /dev/null +++ b/meap/meap-code/ch10/ch10-basic-handler/Dockerfile @@ -0,0 +1,36 @@ +# strategy sourced from:
+
+# https://www.fpcomplete.com/blog/2018/07/deploying-rust-with-docker-and-kubernetes
+# http://whitfin.io/speeding-up-rust-docker-builds/
+
+# This image will build all dependencies before you
+# introducing the project's source code, which means
+# they'll be cached most of the time.
+
+FROM rust:latest as intermediate
+RUN rustup target add x86_64-unknown-linux-musl
+
+ENV PATH $PATH:/root/.cargo/bin
+ENV PKG_CONFIG_ALLOW_CROSS=1
+
+# fetch dependencies using a minimal project,
+# enabling the docker image to be cached with dependencies installed
+RUN USER=root cargo new --bin project
+WORKDIR /project
+
+COPY ./Cargo.lock ./Cargo.lock
+COPY ./Cargo.toml ./Cargo.toml
+
+#RUN cargo -v build --target x86_64-unknown-linux-musl
+
+# build actual project
+#RUN rm src/*.rs
+COPY ./src ./src
+RUN cargo -v check
+RUN cargo -v build --target x86_64-unknown-linux-musl
+RUN ls -R /project/target
+
+FROM alpine
+COPY --from=intermediate /project/target/x86_64-unknown-linux-musl/debug/basic-handler /
+
+CMD /basic-handler
diff --git a/meap/meap-code/ch10/ch10-basic-handler/Makefile b/meap/meap-code/ch10/ch10-basic-handler/Makefile new file mode 100644 index 0000000..9d1a25f --- /dev/null +++ b/meap/meap-code/ch10/ch10-basic-handler/Makefile @@ -0,0 +1,2 @@ +container:
+ docker build -t ria-ch10-simple-handler .
\ No newline at end of file diff --git a/meap/meap-code/ch10/ch10-basic-handler/src/main.rs b/meap/meap-code/ch10/ch10-basic-handler/src/main.rs new file mode 100644 index 0000000..a7ecb33 --- /dev/null +++ b/meap/meap-code/ch10/ch10-basic-handler/src/main.rs @@ -0,0 +1,58 @@ +#![cfg(not(windows))] // <1> + +extern crate libc; + +use std::mem; +use std::time; +use std::thread::{sleep}; +use libc::{SIGTERM, SIGALRM, SIGHUP, SIGQUIT}; + +static mut SHUT_DOWN: bool = false; + +fn register_signal_handler() { + let fn_ptr: fn(i32) -> () = handle_signals; // <2> + + unsafe { + let fn_ptr_as_usize: usize = mem::transmute(fn_ptr); // <3> + libc::signal(SIGTERM, fn_ptr_as_usize); // <4> + } +} + +#[allow(dead_code)] // <5> +fn handle_signals(sig: i32) { + register_signal_handler(); + + unsafe { // <6> + SHUT_DOWN = match sig { // <7> + SIGHUP => false, // <7> + SIGALRM => false, // <7> + SIGTERM => true, // <7> + SIGQUIT => true, // <7> + _ => false, // <7> + }; + } +} + +fn main() { + + register_signal_handler(); + let delay = time::Duration::from_secs(1); + + for i in 1_usize.. { // <7> + unsafe { // <7> + if SHUT_DOWN { + println!(); // only print a newline character + return; + } + } + + sleep(delay); + print!("{} ", i); + + if i > 10 { + unsafe { + libc::raise(SIGTERM); + } + } + } +}
\ No newline at end of file |