summaryrefslogtreecommitdiff
path: root/meap/meap-code/ch10/ch10-basic-handler
diff options
context:
space:
mode:
authorAdam Carpenter <53hornet@gmail.com>2019-03-27 15:32:37 -0400
committerAdam Carpenter <53hornet@gmail.com>2019-03-27 15:32:37 -0400
commit67cdcc2e12118becb823e20a40cc2687f2b8425a (patch)
treeed92c3234b89079e6d4cf36f5e80c5ffa79def48 /meap/meap-code/ch10/ch10-basic-handler
parente25482fca375d318a39c3b54db396b0db6e0b263 (diff)
downloadlearning-rust-67cdcc2e12118becb823e20a40cc2687f2b8425a.tar.xz
learning-rust-67cdcc2e12118becb823e20a40cc2687f2b8425a.zip
Started Rust in Action MEAP.
Diffstat (limited to 'meap/meap-code/ch10/ch10-basic-handler')
-rw-r--r--meap/meap-code/ch10/ch10-basic-handler/Cargo.toml9
-rw-r--r--meap/meap-code/ch10/ch10-basic-handler/Dockerfile36
-rw-r--r--meap/meap-code/ch10/ch10-basic-handler/Makefile2
-rw-r--r--meap/meap-code/ch10/ch10-basic-handler/src/main.rs58
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