kanidm/docs/v1.1.0-alpha.3/rustdoc/src/kanidm_unix_common/client_sync.rs.html
2022-07-20 07:37:37 +00:00

228 lines
17 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `kanidm_unix_int/src/client_sync.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>client_sync.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled><link rel="stylesheet" type="text/css" href="../../dark.css" disabled><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script src="../../crates.js"></script><script defer src="../../main.js"></script><script defer src="../../source-script.js"></script><script defer src="../../source-files.js"></script>
<noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">&#9776;</button><a class="sidebar-logo" href="../../kanidm_unix_common/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div>
</a><h2 class="location"></h2>
</nav>
<nav class="sidebar"><a class="sidebar-logo" href="../../kanidm_unix_common/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div>
</a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../kanidm_unix_common/index.html"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></a><nav class="sub"><div class="theme-picker hidden"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img width="22" height="22" alt="Pick another theme!" src="../../brush.svg"></button><div id="theme-choices" role="menu"></div></div><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1">1</span>
<span id="2">2</span>
<span id="3">3</span>
<span id="4">4</span>
<span id="5">5</span>
<span id="6">6</span>
<span id="7">7</span>
<span id="8">8</span>
<span id="9">9</span>
<span id="10">10</span>
<span id="11">11</span>
<span id="12">12</span>
<span id="13">13</span>
<span id="14">14</span>
<span id="15">15</span>
<span id="16">16</span>
<span id="17">17</span>
<span id="18">18</span>
<span id="19">19</span>
<span id="20">20</span>
<span id="21">21</span>
<span id="22">22</span>
<span id="23">23</span>
<span id="24">24</span>
<span id="25">25</span>
<span id="26">26</span>
<span id="27">27</span>
<span id="28">28</span>
<span id="29">29</span>
<span id="30">30</span>
<span id="31">31</span>
<span id="32">32</span>
<span id="33">33</span>
<span id="34">34</span>
<span id="35">35</span>
<span id="36">36</span>
<span id="37">37</span>
<span id="38">38</span>
<span id="39">39</span>
<span id="40">40</span>
<span id="41">41</span>
<span id="42">42</span>
<span id="43">43</span>
<span id="44">44</span>
<span id="45">45</span>
<span id="46">46</span>
<span id="47">47</span>
<span id="48">48</span>
<span id="49">49</span>
<span id="50">50</span>
<span id="51">51</span>
<span id="52">52</span>
<span id="53">53</span>
<span id="54">54</span>
<span id="55">55</span>
<span id="56">56</span>
<span id="57">57</span>
<span id="58">58</span>
<span id="59">59</span>
<span id="60">60</span>
<span id="61">61</span>
<span id="62">62</span>
<span id="63">63</span>
<span id="64">64</span>
<span id="65">65</span>
<span id="66">66</span>
<span id="67">67</span>
<span id="68">68</span>
<span id="69">69</span>
<span id="70">70</span>
<span id="71">71</span>
<span id="72">72</span>
<span id="73">73</span>
<span id="74">74</span>
<span id="75">75</span>
<span id="76">76</span>
<span id="77">77</span>
<span id="78">78</span>
<span id="79">79</span>
<span id="80">80</span>
<span id="81">81</span>
<span id="82">82</span>
<span id="83">83</span>
<span id="84">84</span>
<span id="85">85</span>
<span id="86">86</span>
<span id="87">87</span>
<span id="88">88</span>
<span id="89">89</span>
<span id="90">90</span>
<span id="91">91</span>
<span id="92">92</span>
<span id="93">93</span>
<span id="94">94</span>
<span id="95">95</span>
<span id="96">96</span>
<span id="97">97</span>
<span id="98">98</span>
<span id="99">99</span>
<span id="100">100</span>
<span id="101">101</span>
<span id="102">102</span>
<span id="103">103</span>
<span id="104">104</span>
<span id="105">105</span>
<span id="106">106</span>
<span id="107">107</span>
<span id="108">108</span>
<span id="109">109</span>
<span id="110">110</span>
</pre><pre class="rust"><code><span class="kw">use</span> <span class="ident">std::error::Error</span>;
<span class="kw">use</span> <span class="ident">std::io::Error</span> <span class="kw">as</span> <span class="ident">IoError</span>;
<span class="kw">use</span> <span class="ident">std::io::ErrorKind</span>;
<span class="kw">use</span> <span class="ident">std::io</span>::{<span class="ident">Read</span>, <span class="ident">Write</span>};
<span class="kw">use</span> <span class="ident">std::os::unix::net::UnixStream</span>;
<span class="kw">use</span> <span class="ident">std::time</span>::{<span class="ident">Duration</span>, <span class="ident">SystemTime</span>};
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::unix_proto</span>::{<span class="ident">ClientRequest</span>, <span class="ident">ClientResponse</span>};
<span class="kw">const</span> <span class="ident">TIMEOUT</span>: <span class="ident">u64</span> <span class="op">=</span> <span class="number">2000</span>;
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">call_daemon_blocking</span>(
<span class="ident">path</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>,
<span class="ident">req</span>: <span class="kw-2">&amp;</span><span class="ident">ClientRequest</span>,
) -&gt; <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">ClientResponse</span>, <span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">Error</span><span class="op">&gt;</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">stream</span> <span class="op">=</span> <span class="ident">UnixStream::connect</span>(<span class="ident">path</span>)
.<span class="ident">and_then</span>(<span class="op">|</span><span class="ident">socket</span><span class="op">|</span> {
<span class="ident">socket</span>
.<span class="ident">set_read_timeout</span>(<span class="prelude-val">Some</span>(<span class="ident">Duration::from_millis</span>(<span class="ident">TIMEOUT</span>)))
.<span class="ident">map</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> <span class="ident">socket</span>)
})
.<span class="ident">and_then</span>(<span class="op">|</span><span class="ident">socket</span><span class="op">|</span> {
<span class="ident">socket</span>
.<span class="ident">set_write_timeout</span>(<span class="prelude-val">Some</span>(<span class="ident">Duration::from_millis</span>(<span class="ident">TIMEOUT</span>)))
.<span class="ident">map</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> <span class="ident">socket</span>)
})
.<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
<span class="macro">error!</span>(<span class="string">&quot;stream setup error -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">e</span>
})
.<span class="ident">map_err</span>(<span class="ident">Box::new</span>)<span class="question-mark">?</span>;
<span class="kw">let</span> <span class="ident">data</span> <span class="op">=</span> <span class="ident">serde_json::to_vec</span>(<span class="kw-2">&amp;</span><span class="ident">req</span>).<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
<span class="macro">error!</span>(<span class="string">&quot;socket encoding error -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">Box::new</span>(<span class="ident">IoError::new</span>(<span class="ident">ErrorKind::Other</span>, <span class="string">&quot;JSON encode error&quot;</span>))
})<span class="question-mark">?</span>;
<span class="comment">// .map_err(Box::new)?;</span>
<span class="ident">stream</span>
.<span class="ident">write_all</span>(<span class="ident">data</span>.<span class="ident">as_slice</span>())
.<span class="ident">and_then</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> <span class="ident">stream</span>.<span class="ident">flush</span>())
.<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
<span class="macro">error!</span>(<span class="string">&quot;stream write error -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">e</span>
})
.<span class="ident">map_err</span>(<span class="ident">Box::new</span>)<span class="question-mark">?</span>;
<span class="comment">// Now wait on the response.</span>
<span class="kw">let</span> <span class="ident">start</span> <span class="op">=</span> <span class="ident">SystemTime::now</span>();
<span class="kw">let</span> <span class="ident">timeout</span> <span class="op">=</span> <span class="ident">Duration::from_millis</span>(<span class="ident">TIMEOUT</span>);
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">read_started</span> <span class="op">=</span> <span class="bool-val">false</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">data</span> <span class="op">=</span> <span class="ident">Vec::with_capacity</span>(<span class="number">1024</span>);
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">counter</span> <span class="op">=</span> <span class="number">0</span>;
<span class="kw">loop</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">buffer</span> <span class="op">=</span> [<span class="number">0</span>; <span class="number">1024</span>];
<span class="kw">let</span> <span class="ident">durr</span> <span class="op">=</span> <span class="ident">SystemTime::now</span>().<span class="ident">duration_since</span>(<span class="ident">start</span>).<span class="ident">map_err</span>(<span class="ident">Box::new</span>)<span class="question-mark">?</span>;
<span class="kw">if</span> <span class="ident">durr</span> <span class="op">&gt;</span> <span class="ident">timeout</span> {
<span class="macro">error!</span>(<span class="string">&quot;Socket timeout&quot;</span>);
<span class="comment">// timed out, not enough activity.</span>
<span class="kw">break</span>;
}
<span class="comment">// Would be a lot easier if we had peek ...</span>
<span class="comment">// https://github.com/rust-lang/rust/issues/76923</span>
<span class="kw">match</span> <span class="ident">stream</span>.<span class="ident">read</span>(<span class="kw-2">&amp;mut</span> <span class="ident">buffer</span>) {
<span class="prelude-val">Ok</span>(<span class="number">0</span>) =&gt; {
<span class="kw">if</span> <span class="ident">read_started</span> {
<span class="macro">debug!</span>(<span class="string">&quot;read_started true, we have completed&quot;</span>);
<span class="comment">// We&#39;re done, no more bytes.</span>
<span class="kw">break</span>;
} <span class="kw">else</span> {
<span class="macro">debug!</span>(<span class="string">&quot;Waiting ...&quot;</span>);
<span class="comment">// Still can wait ...</span>
<span class="kw">continue</span>;
}
}
<span class="prelude-val">Ok</span>(<span class="ident">count</span>) =&gt; {
<span class="ident">data</span>.<span class="ident">extend_from_slice</span>(<span class="kw-2">&amp;</span><span class="ident">buffer</span>);
<span class="ident">counter</span> <span class="op">+</span><span class="op">=</span> <span class="ident">count</span>;
<span class="kw">if</span> <span class="ident">count</span> <span class="op">==</span> <span class="number">1024</span> {
<span class="macro">debug!</span>(<span class="string">&quot;Filled 1024 bytes, looping ...&quot;</span>);
<span class="comment">// We have filled the buffer, we need to copy and loop again.</span>
<span class="ident">read_started</span> <span class="op">=</span> <span class="bool-val">true</span>;
<span class="kw">continue</span>;
} <span class="kw">else</span> {
<span class="macro">debug!</span>(<span class="string">&quot;Filled {} bytes, complete&quot;</span>, <span class="ident">count</span>);
<span class="comment">// We have a partial read, so we are complete.</span>
<span class="kw">break</span>;
}
}
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Steam read failure -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="comment">// Failure!</span>
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">Box::new</span>(<span class="ident">e</span>));
}
}
}
<span class="comment">// Extend from slice fills with 0&#39;s, so we need to truncate now.</span>
<span class="ident">data</span>.<span class="ident">truncate</span>(<span class="ident">counter</span>);
<span class="comment">// Now attempt to decode.</span>
<span class="kw">let</span> <span class="ident">cr</span> <span class="op">=</span> <span class="ident">serde_json::from_slice</span>::<span class="op">&lt;</span><span class="ident">ClientResponse</span><span class="op">&gt;</span>(<span class="ident">data</span>.<span class="ident">as_slice</span>()).<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> {
<span class="macro">error!</span>(<span class="string">&quot;socket encoding error -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">Box::new</span>(<span class="ident">IoError::new</span>(<span class="ident">ErrorKind::Other</span>, <span class="string">&quot;JSON decode error&quot;</span>))
})<span class="question-mark">?</span>;
<span class="prelude-val">Ok</span>(<span class="ident">cr</span>)
}
</code></pre></div>
</section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="kanidm_unix_common" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.62.1 (e092d0b6b 2022-07-16)" ></div>
</body></html>