commit c2ff887cd1693c23a9c944aeda924f0b130770da Author: codecrafters-bot Date: Sat Dec 9 17:38:38 2023 +0000 init [skip ci] diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..176a458 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..73fab07 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..677817d --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,168 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anyhow" +version = "1.0.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" + +[[package]] +name = "bytes" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "dns-starter-rust" +version = "0.1.0" +dependencies = [ + "anyhow", + "bytes", + "nom", + "rand", + "thiserror", +] + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "libc" +version = "0.2.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "syn" +version = "1.0.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc371affeffc477f42a221a1e4297aedcea33d47d19b61455588bd9d8f6b19ac" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "thiserror" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..2ca7ae9 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,26 @@ +# DON'T EDIT THIS! +# +# Codecrafters relies on this file being intact to run tests successfully. Any changes +# here will not reflect when CodeCrafters tests your code, and might even cause build +# failures. +# +# DON'T EDIT THIS! +[package] +name = "dns-starter-rust" +version = "0.1.0" +authors = ["Codecrafters "] +edition = "2021" + +# DON'T EDIT THIS! +# +# Codecrafters relies on this file being intact to run tests successfully. Any changes +# here will not reflect when CodeCrafters tests your code, and might even cause build +# failures. +# +# DON'T EDIT THIS! +[dependencies] +anyhow = "1.0.68" # error handling +bytes = "1.3.0" # helps manage buffers +thiserror = "1.0.38" # error handling +nom = "7.1.3" # parsing +rand = "0.8.5" # randomness diff --git a/README.md b/README.md new file mode 100644 index 0000000..8494ab7 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +[![progress-banner](https://backend.codecrafters.io/progress/dns-server/22c61a61-5dcf-45df-895a-25e26a281c86)](https://app.codecrafters.io/users/codecrafters-bot?r=2qF) + +This is a starting point for Rust solutions to the +["Build Your Own DNS server" Challenge](https://app.codecrafters.io/courses/dns-server/overview). + +In this challenge, you'll build a DNS server that's capable of parsing and +creating DNS packets, responding to DNS queries, handling various record types +and doing recursive resolve. Along the way we'll learn about the DNS protocol, +DNS packet format, root servers, authoritative servers, forwarding servers, +various record types (A, AAAA, CNAME, etc) and more. + +**Note**: If you're viewing this repo on GitHub, head over to +[codecrafters.io](https://codecrafters.io) to try the challenge. + +# Passing the first stage + +The entry point for your `your_server.sh` implementation is in `src/main.rs`. +Study and uncomment the relevant code, and push your changes to pass the first +stage: + +```sh +git add . +git commit -m "pass 1st stage" # any msg +git push origin master +``` + +Time to move on to the next stage! + +# Stage 2 & beyond + +Note: This section is for stages 2 and beyond. + +1. Ensure you have `cargo (1.70)` installed locally +1. Run `./your_server.sh` to run your program, which is implemented in + `src/main.rs`. This command compiles your Rust project, so it might be slow + the first time you run it. Subsequent runs will be fast. +1. Commit your changes and run `git push origin master` to submit your solution + to CodeCrafters. Test output will be streamed to your terminal. diff --git a/codecrafters.yml b/codecrafters.yml new file mode 100644 index 0000000..5adf6b9 --- /dev/null +++ b/codecrafters.yml @@ -0,0 +1,11 @@ +# Set this to true if you want debug logs. +# +# These can be VERY verbose, so we suggest turning them off +# unless you really need them. +debug: false + +# Use this to change the Rust version used to run your code +# on Codecrafters. +# +# Available versions: rust-1.70 +language_pack: rust-1.70 diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..eb5f125 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,28 @@ +// Uncomment this block to pass the first stage +// use std::net::UdpSocket; + +fn main() { + // You can use print statements as follows for debugging, they'll be visible when running tests. + println!("Logs from your program will appear here!"); + + // Uncomment this block to pass the first stage + // let udp_socket = UdpSocket::bind("127.0.0.1:2053").expect("Failed to bind to address"); + // let mut buf = [0; 512]; + // + // loop { + // match udp_socket.recv_from(&mut buf) { + // Ok((size, source)) => { + // let _received_data = String::from_utf8_lossy(&buf[0..size]); + // println!("Received {} bytes from {}", size, source); + // let response = []; + // udp_socket + // .send_to(&response, source) + // .expect("Failed to send response"); + // } + // Err(e) => { + // eprintln!("Error receiving data: {}", e); + // break; + // } + // } + // } +} diff --git a/your_server.sh b/your_server.sh new file mode 100755 index 0000000..a0ec58d --- /dev/null +++ b/your_server.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# +# DON'T EDIT THIS! +# +# CodeCrafters uses this file to test your code. Don't make any changes here! +# +# DON'T EDIT THIS! +exec cargo run \ + --quiet \ + --release \ + --target-dir=/tmp/codecrafters-dns-target \ + --manifest-path $(dirname $0)/Cargo.toml -- "$@"