├── .gitignore ├── tests ├── plaintext.php └── index.php ├── php-sys ├── wrapper.h ├── src │ └── lib.rs ├── Cargo.toml ├── README.md ├── build.rs └── Cargo.lock ├── Cargo.toml ├── .travis.yml ├── .travis └── install-php.sh ├── LICENSE-MIT ├── src ├── shim.c ├── main.rs └── sapi.rs ├── README.md ├── LICENSE-APACHE └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | -------------------------------------------------------------------------------- /tests/plaintext.php: -------------------------------------------------------------------------------- 1 | 2 | #include
3 | #include 4 | -------------------------------------------------------------------------------- /tests/index.php: -------------------------------------------------------------------------------- 1 | "] 5 | links = "php7" 6 | build = "build.rs" 7 | 8 | [build-dependencies] 9 | bindgen = "0.29" 10 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "php-rpm" 3 | version = "0.1.0" 4 | authors = ["Herman J. Radtke III "] 5 | 6 | [dependencies] 7 | log = "0.3" 8 | env_logger = "0.3" 9 | clap = "2.26" 10 | yansi = "0.3" 11 | hyper = "0.11" 12 | futures = "0.1" 13 | futures-cpupool = "0.1" 14 | php-sys = { version = "0.1", path = "php-sys" } 15 | num_cpus = "1.6" 16 | 17 | [build-dependencies] 18 | gcc = "0.3" 19 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: rust 2 | dist: trusty 3 | sudo: required 4 | 5 | rust: 6 | - stable 7 | - beta 8 | - nightly 9 | 10 | matrix: 11 | allow_failures: 12 | - rust: nightly 13 | 14 | cache: 15 | cargo: true 16 | directories: 17 | - $HOME/php-7.1.10 18 | 19 | install: 20 | - sudo sh ./.travis/install-php.sh php-7.1.10 21 | 22 | before_script: 23 | - export PHP_LIB_DIR=~/php-7.1.10/libs 24 | - export PHP_INCLUDE_DIR=~/php-7.1.10 25 | - export LD_LIBRARY_PATH=~/php-7.1.10/libs 26 | -------------------------------------------------------------------------------- /.travis/install-php.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | VERSION=$1 6 | 7 | if [ ! -f "$HOME/$VERSION/libs/libphp7.so" ]; then 8 | cd $HOME 9 | rm -fr $VERSION 10 | curl -o $VERSION.tar.gz http://php.net/distributions/$VERSION.tar.gz 11 | tar xzf $VERSION.tar.gz 12 | cd $VERSION 13 | sed -e 's/void zend_signal_startup/ZEND_API void zend_signal_startup/g' -ibk Zend/zend_signal.c Zend/zend_signal.h 14 | ./configure --enable-debug --enable-embed=shared --enable-maintainer-zts 15 | make 16 | cd $HOME 17 | else 18 | echo 'Using cached directory.' 19 | fi 20 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 The weldr Project Developers 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /src/shim.c: -------------------------------------------------------------------------------- 1 | /** 2 | * This file defines some simple C functions to make ffi interop easier. The 3 | * majority of the functions are wrapping some pre-processor define that is 4 | * critical to PHP internals. 5 | */ 6 | 7 | #include 8 | #include
9 | #include 10 | 11 | sapi_request_info * sg_request_info() { 12 | return &SG(request_info); 13 | } 14 | 15 | void * sg_server_context() { 16 | return SG(server_context); 17 | } 18 | 19 | void sg_set_server_context(void *context) { 20 | SG(server_context) = context; 21 | } 22 | 23 | sapi_headers_struct * sg_sapi_headers() { 24 | return &SG(sapi_headers); 25 | } 26 | 27 | unsigned char sg_headers_sent() { 28 | return SG(headers_sent); 29 | } 30 | 31 | void sg_set_headers_sent(unsigned char is_sent) { 32 | SG(headers_sent) = is_sent; 33 | } 34 | 35 | void zend_tsrmls_cache_update() { 36 | ZEND_TSRMLS_CACHE_UPDATE(); 37 | } 38 | 39 | /* 40 | * Create a wrapper around fopen 41 | * 42 | * I tried to use libc, but libc defines FILE different from the php bindings 43 | * generated by bindgen. Thus, it was easier to wrap this and expose it in Rust 44 | * via an extern fn definition. 45 | */ 46 | FILE *phprpm_fopen(const char *filename, const char *mode) { 47 | return fopen(filename, mode); 48 | } 49 | -------------------------------------------------------------------------------- /php-sys/README.md: -------------------------------------------------------------------------------- 1 | # php-sys 2 | 3 | Bindings to php. 4 | 5 | Note: I have only tested this without ZTS. 6 | 7 | ## PHP 8 | 9 | In order to compile php-sys, we need development headers and the libphp7 library. That library may come in the form of `libphp7.so` or `libphp7.a` depending on how you install/compile PHP. 10 | 11 | ### From Package 12 | 13 | * For Ubuntu, please refer to the [.travis.yml](../.travis.yml) _install_ section for the commands. 14 | * For Mac OS X, I could not find a set of packages that worked. 15 | 16 | ### From Source 17 | 18 | Some basic instructions on how to install PHP so you can embed it into Rust. 19 | 20 | #### Mac OS X 21 | 22 | I had to use brew to install bison. I believe autoconf and other tools were either already installed or provided by Mac OS X. Brew installed some modified version of libiconv which confused PHP. I also had some problems, so I stopped building xml related stuff. To build I had to do: 23 | 24 | ``` 25 | $ ./genfiles 26 | $ ./buildconf --force 27 | $ PATH="/usr/local/opt/bison/bin:$PATH" ./configure --enable-debug --enable-embed=static --without-iconv --disable-libxml --disable-dom --disable-xml --disable-simplexml --disable-xmlwriter --disable-xmlreader --without-pear 28 | $ PATH="/usr/local/opt/bison/bin:$PATH" make 29 | $ PATH="/usr/local/opt/bison/bin:$PATH" make test 30 | ``` 31 | 32 | Note: I embed a static library on Mac OS X. If you want to do embed PHP with a shared library, then use `--enable-embed=shared`. 33 | 34 | #### Linux 35 | 36 | Here are the dependencies needed (in apt-get form): 37 | 38 | ```bash 39 | $ apt-get install git make gcc libxml2-dev autoconf bison valgrind clang re2c 40 | ``` 41 | 42 | ``` 43 | $ ./genfiles 44 | $ ./buildconf --force 45 | $ ./configure --enable-debug --enable-embed=shared 46 | $ make 47 | $ make test 48 | ``` 49 | -------------------------------------------------------------------------------- /php-sys/build.rs: -------------------------------------------------------------------------------- 1 | extern crate bindgen; 2 | 3 | use std::env; 4 | use std::path::PathBuf; 5 | 6 | fn main () { 7 | 8 | println!("cargo:rerun-if-env-changed=PHP_LIB_DIR"); 9 | println!("cargo:rerun-if-env-changed=PHP_INCLUDE_DIR"); 10 | println!("cargo:rerun-if-env-changed=PHP_LINK_STATIC"); 11 | 12 | let default_lib_dir = PathBuf::from("/usr/lib"); 13 | let default_include_dir = PathBuf::from("/usr/include/php"); 14 | let default_link_static = false; 15 | 16 | let lib_dir = env::var_os("PHP_LIB_DIR").map(PathBuf::from).unwrap_or(default_lib_dir); 17 | let include_dir = env::var_os("PHP_INCLUDE_DIR").map(PathBuf::from).unwrap_or(default_include_dir); 18 | let link_static = env::var_os("PHP_LINK_STATIC").map(|_| true).unwrap_or(default_link_static); 19 | 20 | if !lib_dir.exists() { 21 | panic!( 22 | "PHP library directory does not exist: {}", 23 | lib_dir.to_string_lossy() 24 | ); 25 | } 26 | 27 | if !include_dir.exists() { 28 | panic!( 29 | "PHP include directory does not exist: {}", 30 | include_dir.to_string_lossy() 31 | ); 32 | } 33 | 34 | let link_type = if link_static { 35 | "=static" 36 | } else { 37 | "" 38 | }; 39 | 40 | println!("cargo:rustc-link-lib{}=php7", link_type); 41 | println!("cargo:rustc-link-search=native={}", lib_dir.to_string_lossy()); 42 | 43 | let includes = ["/", "/TSRM", "/Zend", "/main"].iter().map(|d| { 44 | format!("-I{}{}", include_dir.to_string_lossy(), d) 45 | }).collect::>(); 46 | 47 | let bindings = bindgen::Builder::default() 48 | .header("wrapper.h") 49 | .clang_args(includes) 50 | .hide_type("FP_NAN") 51 | .hide_type("FP_INFINITE") 52 | .hide_type("FP_ZERO") 53 | .hide_type("FP_SUBNORMAL") 54 | .hide_type("FP_NORMAL") 55 | .hide_type("max_align_t") 56 | .derive_default(true) 57 | .generate() 58 | .expect("Unable to generate bindings"); 59 | 60 | let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); 61 | bindings 62 | .write_to_file(out_path.join("bindings.rs")) 63 | .expect("Couldn't write bindings!"); 64 | } 65 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PHP Rust Process Manager (php-rpm) 2 | 3 | [![Build Status](https://travis-ci.org/hjr3/php-rpm.svg?branch=master)](https://travis-ci.org/hjr3/php-rpm) 4 | 5 | An _experimental_ process manager that uses Rust's hyper library to act as a frontend for PHP. 6 | 7 | ## Problem 8 | 9 | The standard way to run PHP is to use nginx + php_fpm. Not only is this a pain to setup, but FastCGI is not very fast. 10 | 11 | ## Solution 12 | 13 | Embed PHP into Rust so that hyper can accept the HTTP request, spawn a thread in which we pass that information off to a PHP script and then have hyper return the HTTP response. 14 | 15 | ## Installation 16 | 17 | This package depends on PHP. The default location for the PHP includes is in `/usr/include/php`. You can set an environment variable `PHP_INCLUDE_DIR` to override this. The default location for `libphp7` is in `/usr/lib`. You can set an environment variable `PHP_LIB_DIR` to override this. For details on how to install or compile PHP, see [php-sys/README.md](php-sys/README.md). Please note that in order to safely spawn threads with PHP, `--enable-maintainer-zts` must be used. 18 | 19 | The code uses bindgen to dynamically build bindings for PHP 7. If you want to compile against a static `libphp7`, then specify `PHP_LINK_STATIC=1`. Using `cargo build` should give you a working binary. 20 | 21 | ## Usage 22 | 23 | Depending on the location of `libphp7` you may need to provide `LD_LIBRARY_PATH`. The first argument to the program is the document root. Currently the index is hardcoded to `index.php`. Example: `PHP_LIB_DIR="/path/to/lib" PHP_INCLUDE_DIR="/path/to/include" LD_LIBRARY_PATH="/path/to/lib" cargo run -- tests/`. This will send requests to a script in `./tests/index.php`. 24 | 25 | The `tests/index.php` is the entry point of the PHP program. A hyper server listens for new requests and dispatches each request to the PHP engine, which executes `tests/index.php`. The response headers and body are sent back through hyper and then to the client. 26 | 27 | ## Inspiration 28 | 29 | I thought of this idea while working on weldr and thinking about how weldr would be used at my day job (which uses PHP). 30 | 31 | ## Related 32 | 33 | See php_fpm. 34 | 35 | ## Thanks 36 | 37 | A big thanks to Sara Goleman and her book _Extending and Embedding PHP_. Also thanks to the people that created bindgen. 38 | 39 | ## License 40 | 41 | Licensed under either of 42 | * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) 43 | * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) 44 | at your option. 45 | 46 | ### Contribution 47 | 48 | Unless you explicitly state otherwise, any contribution intentionally submitted 49 | for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any 50 | additional terms or conditions. 51 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | // uncomment for valgrind support 2 | //#![feature(alloc_system)] 3 | //extern crate alloc_system; 4 | 5 | extern crate futures; 6 | extern crate futures_cpupool; 7 | extern crate hyper; 8 | #[macro_use] 9 | extern crate log; 10 | extern crate env_logger; 11 | extern crate php_sys as php; 12 | extern crate clap; 13 | extern crate yansi; 14 | extern crate num_cpus; 15 | 16 | use std::fs; 17 | use std::net::SocketAddr; 18 | use std::path::PathBuf; 19 | 20 | use clap::{Arg, App}; 21 | use yansi::Paint; 22 | 23 | use futures::{Future, Stream}; 24 | use futures_cpupool::CpuPool; 25 | 26 | use hyper::server::{Http, Request, Response, Service}; 27 | 28 | pub mod sapi; 29 | 30 | /// Server representation 31 | struct Server { 32 | document_root: PathBuf, 33 | dir_index: String, 34 | addr: SocketAddr, 35 | thread_pool: CpuPool, 36 | } 37 | 38 | impl Server { 39 | pub fn new(document_root: PathBuf, dir_index: String, addr: SocketAddr, thread_pool: CpuPool) -> Server { 40 | Server { 41 | document_root: document_root, 42 | dir_index: dir_index, 43 | addr: addr, 44 | thread_pool: thread_pool, 45 | } 46 | } 47 | } 48 | 49 | impl Service for Server { 50 | type Request = Request; 51 | type Response = Response; 52 | type Error = hyper::Error; 53 | type Future = Box>; 54 | 55 | fn call(&self, request: Request) -> Self::Future { 56 | let doc_root = self.document_root.clone(); 57 | let dir_index = self.dir_index.clone(); 58 | let addr = self.addr.clone(); 59 | let thread_pool = self.thread_pool.clone(); 60 | let (method, uri, http_version, headers, body) = request.deconstruct(); 61 | Box::new(body.concat2().and_then(move |chunk| { 62 | thread_pool.spawn_fn(move || { 63 | let response = sapi::execute(method, uri, http_version, headers, chunk.as_ref(), doc_root.as_path(), &dir_index, &addr); 64 | futures::future::ok(response) 65 | }) 66 | })) 67 | } 68 | } 69 | 70 | fn main() { 71 | 72 | env_logger::init().expect("Failed to start logger"); 73 | 74 | let matches = App::new("php-rpm") 75 | .arg( 76 | Arg::with_name("host") 77 | .long("host") 78 | .short("h") 79 | .value_name("host") 80 | .takes_value(true) 81 | .help( 82 | "Listening ip and port for server. Default: 0.0.0.0:3000", 83 | ), 84 | ) 85 | .arg( 86 | Arg::with_name("index") 87 | .long("index") 88 | .short("i") 89 | .value_name("index") 90 | .takes_value(true) 91 | .help( 92 | "Name of directory index file. Default: index.php", 93 | ), 94 | ) 95 | .arg( 96 | Arg::with_name("threads") 97 | .long("threads") 98 | .short("t") 99 | .value_name("threads") 100 | .takes_value(true) 101 | .help( 102 | "Number of threads to use. Default: CPUs * 2", 103 | ), 104 | ) 105 | .arg(Arg::with_name("doc_root") 106 | .help("Path to document root for built-in web server. Default: ./") 107 | .index(1)) 108 | .get_matches(); 109 | 110 | let addr = matches.value_of("host").unwrap_or("0.0.0.0:3000"); 111 | let addr = addr.parse::().unwrap(); 112 | 113 | let doc_root = matches.value_of("doc_root").unwrap_or("./"); 114 | let doc_root = PathBuf::from(doc_root); 115 | let abs_doc_root = fs::canonicalize(&doc_root).unwrap(); 116 | 117 | let index = matches.value_of("index").unwrap_or("index.php"); 118 | let index = index.to_string(); 119 | 120 | let threads = matches.value_of("threads").and_then(|t| t.parse::().ok()).unwrap_or(num_cpus::get() * 2); 121 | let thread_pool = CpuPool::new(threads); 122 | 123 | println!(" => address: {}", Paint::white(addr.ip())); 124 | println!(" => port: {}", Paint::white(addr.port())); 125 | println!(" => document root: {}", Paint::white(abs_doc_root.display())); 126 | println!(" => directory index: {}", Paint::white(&index)); 127 | println!(" => threads: {}", Paint::white(threads)); 128 | // TODO: log level, tls, php.ini path 129 | 130 | let server = Http::new().bind(&addr, move || Ok(Server::new(abs_doc_root.clone(), index.clone(), addr.clone(), thread_pool.clone()))).unwrap(); 131 | 132 | sapi::bootstrap(threads); 133 | server.run().unwrap(); 134 | sapi::teardown(); 135 | } 136 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /src/sapi.rs: -------------------------------------------------------------------------------- 1 | use std::default::Default; 2 | use std::ffi::{CString, CStr, NulError}; 3 | use std::net::SocketAddr; 4 | use std::os::raw::{c_char, c_uchar, c_int, c_void}; 5 | use std::path::{PathBuf, Path}; 6 | use std::ptr; 7 | use std::slice; 8 | use std::str; 9 | 10 | use hyper::header::{Headers, ContentLength, ContentType, Cookie}; 11 | use hyper::{self, Response}; 12 | 13 | use php; 14 | 15 | extern { 16 | fn sg_request_info() -> *mut php::sapi_request_info; 17 | fn sg_server_context() -> *mut c_void; 18 | fn sg_set_server_context(context: *mut c_void); 19 | fn sg_sapi_headers() -> *mut php::sapi_headers_struct; 20 | fn sg_headers_sent() -> c_uchar; 21 | fn sg_set_headers_sent(is_sent: c_uchar); 22 | fn zend_tsrmls_cache_update(); 23 | fn phprpm_fopen(filename: *const c_char, mode: *const c_char) -> *mut php::FILE; 24 | } 25 | 26 | struct ServerContext { 27 | buffer: Vec, 28 | response: Response, 29 | document_root: PathBuf, 30 | script: String, 31 | addr: SocketAddr, 32 | method: hyper::Method, 33 | uri: hyper::Uri, 34 | http_version: hyper::HttpVersion, 35 | headers: hyper::Headers, 36 | body: Box<[u8]>, 37 | } 38 | 39 | impl ServerContext { 40 | pub fn new(method: hyper::Method, uri: hyper::Uri, http_version: hyper::HttpVersion, headers: hyper::Headers, body: Box<[u8]>, document_root: PathBuf, script: String, addr: SocketAddr) -> ServerContext { 41 | ServerContext { 42 | buffer: Vec::with_capacity(1028), 43 | response: Response::new(), 44 | document_root: document_root, 45 | script: script, 46 | addr: addr, 47 | method: method, 48 | uri: uri, 49 | http_version: http_version, 50 | headers: headers, 51 | body: body, 52 | } 53 | } 54 | } 55 | 56 | pub fn bootstrap(threads: usize) { 57 | 58 | assert!(threads < c_int::max_value() as usize); 59 | 60 | unsafe { php_startup(threads as c_int); } 61 | } 62 | 63 | fn create_handle_filename(document_root: &Path, filename: &str) -> Result { 64 | let abs_filename = document_root.join(filename); 65 | Ok(CString::new(abs_filename.to_str().unwrap())?) 66 | } 67 | 68 | pub fn execute(method: hyper::Method, uri: hyper::Uri, http_version: hyper::HttpVersion, headers: hyper::Headers, chunk: &[u8], document_root: &Path, filename: &str, addr: &SocketAddr) -> Response { 69 | let handle_filename = create_handle_filename(document_root, filename).unwrap(); 70 | let mode = CString::new("rb").unwrap(); 71 | 72 | let (headers, body) = unsafe { 73 | php::ts_resource_ex(0, ptr::null_mut()); 74 | 75 | let fp = phprpm_fopen(handle_filename.as_ptr(), mode.as_ptr()); 76 | let mut handle = php::_zend_file_handle__bindgen_ty_1::default(); 77 | *handle.fp.as_mut() = fp; 78 | let script = Box::new(php::zend_file_handle { 79 | handle: handle, 80 | filename: handle_filename.as_ptr(), 81 | opened_path: ptr::null_mut(), 82 | type_: php::zend_stream_type::ZEND_HANDLE_FP, 83 | free_filename: 0, 84 | }); 85 | let script_ptr = Box::into_raw(script); 86 | 87 | (*sg_sapi_headers()).http_response_code = 200; 88 | let context = Box::new(ServerContext::new(method, uri, http_version, headers, chunk.to_owned().into_boxed_slice(), document_root.to_path_buf(), filename.to_string(), addr.clone())); 89 | let context_ptr = Box::into_raw(context); 90 | sg_set_server_context(context_ptr as *mut c_void); 91 | php::php_request_startup(); 92 | 93 | php::php_execute_script(script_ptr); 94 | 95 | drop(Box::from_raw(script_ptr)); 96 | 97 | let context = sg_server_context() as *mut ServerContext; 98 | let buffer: &Vec = &(*context).buffer; 99 | let headers = (*context).response.headers().clone(); 100 | 101 | // TODO move this into the request shutdown block 102 | // note: strangely enough, php_request_shutdown will not call our request shutdown callback 103 | if !(*sg_request_info()).cookie_data.is_null() { 104 | drop(CString::from_raw((*sg_request_info()).cookie_data)); 105 | } 106 | (*sg_request_info()).cookie_data = ptr::null_mut(); 107 | drop(Box::from_raw(sg_server_context() as *mut ServerContext)); 108 | sg_set_server_context(ptr::null_mut()); 109 | 110 | php::php_request_shutdown(ptr::null_mut()); 111 | 112 | (headers, buffer) 113 | }; 114 | 115 | Response::new() 116 | .with_headers(headers) 117 | .with_header(ContentLength(body.len() as u64)) 118 | .with_body(body.clone()) 119 | } 120 | 121 | pub fn teardown() { 122 | unsafe { 123 | php::php_module_shutdown(); 124 | php::sapi_shutdown(); 125 | 126 | drop(CString::from_raw((*sg_request_info()).path_translated)); 127 | drop(CString::from_raw(php::sapi_module.name)); 128 | drop(CString::from_raw(php::sapi_module.pretty_name)); 129 | 130 | // PHP is a bit funny in that we create an `php::sapi_module_struct`, create a pointer to that 131 | // and then pass it to some core PHP functions. When it is passed, those core functions 132 | // dereference the pointer and store the memory in a global. As we used `Box::into_raw` to 133 | // create the pointer, we need to use `Box::from_raw` to free the underlying memory. In order 134 | // to use `Box::from_raw`, we must first get a reference to the global. 135 | // TODO check that this is the right way to do this 136 | drop(Box::from_raw(&mut php::sapi_module)); 137 | 138 | php::tsrm_shutdown(); 139 | } 140 | } 141 | 142 | unsafe fn php_startup(threads: c_int) { 143 | // TODO set expected resources 144 | php::tsrm_startup(threads, 1, 0, ptr::null_mut()); 145 | php::ts_resource_ex(0, ptr::null_mut()); 146 | zend_tsrmls_cache_update(); 147 | 148 | php::zend_signal_startup(); 149 | 150 | let mut module = Box::new(php::sapi_module_struct::default()); 151 | let name = CString::new("php-rpm").unwrap(); 152 | let pretty_name = CString::new("PHP Rust Process Manager").unwrap(); 153 | 154 | module.name = name.into_raw(); 155 | module.pretty_name = pretty_name.into_raw(); 156 | module.startup = Some(sapi_server_startup); 157 | module.shutdown = Some(sapi_server_shutdown); 158 | module.ub_write = Some(sapi_server_ub_write); 159 | module.flush = Some(sapi_server_flush); 160 | module.sapi_error = Some(php::zend_error); 161 | module.send_headers = Some(sapi_server_send_headers); 162 | module.read_post = Some(sapi_server_read_post); 163 | module.read_cookies = Some(sapi_server_read_cookies); 164 | module.register_server_variables = Some(sapi_server_register_variables); 165 | module.log_message = Some(sapi_server_log_message); 166 | 167 | let module_ptr = Box::into_raw(module); 168 | 169 | // TODO error check 170 | // this function assigns the module pointer to the `php::sapi_module` global variable 171 | php::sapi_startup(module_ptr); 172 | 173 | let request_method = CString::new("GET").unwrap(); 174 | let path_translated = CString::new("/home/herman/projects/php-rpm/tests/index.php").unwrap(); 175 | let content_type = CString::new("text/html").unwrap(); 176 | (*sg_request_info()).request_method = request_method.as_ptr(); 177 | (*sg_request_info()).content_length = 0; 178 | (*sg_request_info()).path_translated = path_translated.into_raw(); 179 | (*sg_request_info()).content_type = content_type.as_ptr(); 180 | 181 | // this function also assigns the module pointer to the `php::sapi_module` global variable 182 | php::php_module_startup(module_ptr, ptr::null_mut(), 0); 183 | } 184 | 185 | unsafe extern "C" fn sapi_server_startup(_module: *mut php::sapi_module_struct) -> c_int { 186 | trace!("sapi_server_startup"); 187 | php::ZEND_RESULT_CODE::SUCCESS as c_int 188 | } 189 | 190 | unsafe extern "C" fn sapi_server_shutdown(_module: *mut php::sapi_module_struct) -> c_int { 191 | trace!("sapi_server_shutdown"); 192 | php::ZEND_RESULT_CODE::SUCCESS as c_int 193 | } 194 | 195 | unsafe extern "C" fn sapi_server_ub_write(s: *const c_char, s_len: usize) -> usize { 196 | trace!("sapi_server_ub_write"); 197 | let s_: *const c_uchar = s as *const c_uchar; 198 | let rs = slice::from_raw_parts(s_, s_len); 199 | let context = sg_server_context() as *mut ServerContext; 200 | (*context).buffer.extend_from_slice(&rs); 201 | 202 | s_len 203 | } 204 | 205 | unsafe extern "C" fn sapi_server_flush(_server_context: *mut c_void) { 206 | trace!("sapi_server_flush"); 207 | if sg_headers_sent() == 1 { 208 | return; 209 | } 210 | 211 | php::sapi_send_headers(); 212 | } 213 | 214 | // TODO hyper has no way to set the HTTP version. this should change when the http crate is stabilized 215 | fn set_response_status(response: &mut Response, _request_http_version: hyper::HttpVersion, http_status_line: *mut c_char, sapi_http_response_code: c_int) { 216 | if http_status_line.is_null() { 217 | response.set_status(hyper::StatusCode::try_from(sapi_http_response_code as u16).unwrap()); 218 | } else { 219 | // TODO use a better parser for this 220 | let status_line = unsafe { CStr::from_ptr(http_status_line).to_string_lossy() }; 221 | let (_, status) = status_line.split_at("HTTP/1.1 ".len()); 222 | let status_code = &status[0..3]; 223 | let status_code = status_code.parse::().unwrap(); 224 | response.set_status(hyper::StatusCode::try_from(status_code).unwrap()); 225 | } 226 | } 227 | 228 | unsafe extern "C" fn sapi_server_send_headers(sapi_headers: *mut php::sapi_headers_struct) -> c_int { 229 | trace!("sapi_server_send_headers"); 230 | let context = sg_server_context() as *mut ServerContext; 231 | if context.is_null() { 232 | return php::SAPI_HEADER_SENT_SUCCESSFULLY as c_int; 233 | } 234 | 235 | let shs: &php::sapi_headers_struct = sapi_headers.as_ref().unwrap(); 236 | 237 | set_response_status(&mut (*context).response, (*context).http_version, shs.http_status_line, shs.http_response_code); 238 | 239 | let mut headers = shs.headers; 240 | let mut zle = php::zend_llist_element::default(); 241 | let mut pos: php::zend_llist_position = &mut zle; 242 | let mut h = php::zend_llist_get_first_ex(&mut headers, &mut pos); 243 | 244 | while !h.is_null() { 245 | let header = h as *const php::sapi_header_struct; 246 | 247 | if (*header).header_len > 0 { 248 | let v: *const c_uchar = (*header).header as *const c_uchar; 249 | let rs = slice::from_raw_parts(v, (*header).header_len); 250 | let colon_pos = rs.iter().position(|c| *c == ':' as u8).unwrap(); 251 | let (name, value) = rs.split_at(colon_pos); 252 | 253 | // we must allocate memory here so we do not pass a PHP allocated string to Rust 254 | let name = String::from_utf8_unchecked(name.to_vec()); 255 | let value = String::from_utf8_unchecked(value[2..].to_vec()); 256 | (*context).response.headers_mut().set_raw(name, value); 257 | } 258 | h = php::zend_llist_get_next_ex(&mut headers, &mut pos); 259 | } 260 | 261 | 262 | // used so flush can try and send headers prior to output 263 | sg_set_headers_sent(1); 264 | 265 | // bindgen treats this as a `c_uint` type but this function requires a c_int 266 | php::SAPI_HEADER_SENT_SUCCESSFULLY as c_int 267 | } 268 | 269 | unsafe extern "C" fn sapi_server_read_post(buf: *mut c_char, bytes: usize) -> usize { 270 | trace!("read_post"); 271 | 272 | let context = sg_server_context() as *mut ServerContext; 273 | let body = &(*context).body; 274 | let copied = ::std::cmp::min(bytes, body.len()); 275 | if copied > 0 { 276 | let (to_send, to_retain) = body.split_at(copied); 277 | let ptr = to_send.as_ptr() as *const i8; 278 | ::std::ptr::copy(ptr, buf, copied); 279 | (*context).body = to_retain.to_owned().into_boxed_slice(); 280 | 281 | } 282 | copied 283 | } 284 | 285 | fn read_cookies(context: &ServerContext) -> *mut c_char { 286 | let cookies = (*context).headers.get::(); 287 | match cookies { 288 | Some(c) => { 289 | let value = format!("{}", c); 290 | let value = CString::new(value).unwrap(); 291 | value.into_raw() 292 | } 293 | None => ptr::null_mut(), 294 | } 295 | } 296 | 297 | unsafe extern "C" fn sapi_server_read_cookies() -> *mut c_char { 298 | trace!("read_cookies"); 299 | let context = sg_server_context() as *mut ServerContext; 300 | read_cookies(&(*context)) 301 | } 302 | 303 | fn register_variable(key: &str, value: &str, track_vars_array: *mut php::zval) { 304 | // TODO answer the below question: 305 | // for ffi how bad is it to do the cast below? i am essentially saying that PHP will never 306 | // actually mutate these variables. otherwise, i have to loop back through this hash table and 307 | // manually free all of the underlying data 308 | let key = CString::new(key).unwrap(); 309 | let key_ptr = key.as_ptr() as *mut c_char; 310 | let value_len = value.len(); 311 | let value = CString::new(value).unwrap(); 312 | let value_ptr = value.as_ptr() as *mut c_char; 313 | 314 | unsafe { 315 | php::php_register_variable_safe(key_ptr, value_ptr, value_len, track_vars_array); 316 | } 317 | } 318 | 319 | fn register_variables(context: &ServerContext, track_vars_array: *mut php::zval) { 320 | 321 | register_variable("PHP_SELF", &context.script, track_vars_array); 322 | // TODO script name should include path info 323 | register_variable("SCRIPT_NAME", &context.script, track_vars_array); 324 | 325 | let mut script_filename = context.document_root.clone(); 326 | script_filename.push(&context.script); 327 | register_variable("SCRIPT_FILENAME", &script_filename.to_string_lossy(), track_vars_array); 328 | register_variable("DOCUMENT_ROOT", &context.document_root.to_string_lossy(), track_vars_array); 329 | register_variable("REQUEST_METHOD", context.method.as_ref(), track_vars_array); 330 | register_variable("REQUEST_URI", context.uri.as_ref(), track_vars_array); 331 | register_variable("QUERY_STRING", context.uri.query().unwrap_or(""), track_vars_array); 332 | // per PHP documentation, argv contains the query string on a GET request 333 | register_variable("argv", context.uri.query().unwrap_or(""), track_vars_array); 334 | register_variable("SERVER_SOFTWARE", "PHP RPM", track_vars_array); 335 | register_variable("SERVER_PROTOCOL", &format!("{}", context.http_version), track_vars_array); 336 | register_variable("SERVER_ADDR", &format!("{}", context.addr.ip()), track_vars_array); 337 | register_variable("SERVER_PORT", &context.addr.port().to_string(), track_vars_array); 338 | 339 | let headers: &Headers = &context.headers; 340 | for header in headers.iter() { 341 | let name = header.name().to_uppercase().replace("-", "_"); 342 | 343 | if header.is::() { 344 | register_variable("CONTENT_TYPE", &header.value_string(), track_vars_array); 345 | } 346 | 347 | if header.is::() { 348 | register_variable("CONTENT_LENGTH", &header.value_string(), track_vars_array); 349 | } 350 | 351 | let key = format!("HTTP_{}", &name); 352 | register_variable(&key, &header.value_string(), track_vars_array); 353 | } 354 | 355 | // TODO 356 | // SERVER_NAME 357 | // REMOTE_ADDR 358 | // REMOTE_PORT 359 | // PATH_INFO 360 | } 361 | 362 | unsafe extern "C" fn sapi_server_register_variables(track_vars_array: *mut php::zval) { 363 | trace!("sapi_server_register_varibles"); 364 | 365 | let context = sg_server_context() as *mut ServerContext; 366 | register_variables(&(*context), track_vars_array); 367 | } 368 | 369 | unsafe extern "C" fn sapi_server_log_message(message: *mut c_char, _syslog_type_int: c_int) { 370 | let m = CStr::from_ptr(message); 371 | // TODO map syslog levels to log crate macros 372 | warn!("{}", m.to_string_lossy()); 373 | } 374 | -------------------------------------------------------------------------------- /php-sys/Cargo.lock: -------------------------------------------------------------------------------- 1 | [root] 2 | name = "php-sys" 3 | version = "0.1.0" 4 | dependencies = [ 5 | "bindgen 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)", 6 | ] 7 | 8 | [[package]] 9 | name = "aho-corasick" 10 | version = "0.6.3" 11 | source = "registry+https://github.com/rust-lang/crates.io-index" 12 | dependencies = [ 13 | "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 14 | ] 15 | 16 | [[package]] 17 | name = "ansi_term" 18 | version = "0.9.0" 19 | source = "registry+https://github.com/rust-lang/crates.io-index" 20 | 21 | [[package]] 22 | name = "aster" 23 | version = "0.41.0" 24 | source = "registry+https://github.com/rust-lang/crates.io-index" 25 | dependencies = [ 26 | "syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 27 | ] 28 | 29 | [[package]] 30 | name = "atty" 31 | version = "0.2.2" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | dependencies = [ 34 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 35 | "libc 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)", 36 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 37 | ] 38 | 39 | [[package]] 40 | name = "bindgen" 41 | version = "0.29.0" 42 | source = "registry+https://github.com/rust-lang/crates.io-index" 43 | dependencies = [ 44 | "aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", 45 | "cexpr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 46 | "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 47 | "clang-sys 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", 48 | "clap 2.26.0 (registry+https://github.com/rust-lang/crates.io-index)", 49 | "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 50 | "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 51 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 52 | "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 53 | "quasi 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)", 54 | "quasi_codegen 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)", 55 | "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 56 | "syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 57 | ] 58 | 59 | [[package]] 60 | name = "bitflags" 61 | version = "0.8.2" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | 64 | [[package]] 65 | name = "bitflags" 66 | version = "0.9.1" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | 69 | [[package]] 70 | name = "cexpr" 71 | version = "0.2.2" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | dependencies = [ 74 | "nom 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 75 | ] 76 | 77 | [[package]] 78 | name = "cfg-if" 79 | version = "0.1.2" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | 82 | [[package]] 83 | name = "clang-sys" 84 | version = "0.19.0" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | dependencies = [ 87 | "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 88 | "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 89 | "libc 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)", 90 | "libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 91 | ] 92 | 93 | [[package]] 94 | name = "clap" 95 | version = "2.26.0" 96 | source = "registry+https://github.com/rust-lang/crates.io-index" 97 | dependencies = [ 98 | "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 99 | "atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 100 | "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 101 | "strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 102 | "term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 103 | "textwrap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 104 | "unicode-segmentation 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 105 | "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 106 | "vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 107 | ] 108 | 109 | [[package]] 110 | name = "env_logger" 111 | version = "0.4.3" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | dependencies = [ 114 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 115 | "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 116 | ] 117 | 118 | [[package]] 119 | name = "glob" 120 | version = "0.2.11" 121 | source = "registry+https://github.com/rust-lang/crates.io-index" 122 | 123 | [[package]] 124 | name = "kernel32-sys" 125 | version = "0.2.2" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | dependencies = [ 128 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 129 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 130 | ] 131 | 132 | [[package]] 133 | name = "lazy_static" 134 | version = "0.2.8" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | 137 | [[package]] 138 | name = "libc" 139 | version = "0.2.29" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | 142 | [[package]] 143 | name = "libloading" 144 | version = "0.4.0" 145 | source = "registry+https://github.com/rust-lang/crates.io-index" 146 | dependencies = [ 147 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 148 | "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 149 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 150 | ] 151 | 152 | [[package]] 153 | name = "log" 154 | version = "0.3.8" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | 157 | [[package]] 158 | name = "memchr" 159 | version = "1.0.1" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | dependencies = [ 162 | "libc 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)", 163 | ] 164 | 165 | [[package]] 166 | name = "nom" 167 | version = "3.2.0" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | dependencies = [ 170 | "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 171 | ] 172 | 173 | [[package]] 174 | name = "peeking_take_while" 175 | version = "0.1.2" 176 | source = "registry+https://github.com/rust-lang/crates.io-index" 177 | 178 | [[package]] 179 | name = "quasi" 180 | version = "0.32.0" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | dependencies = [ 183 | "syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 184 | "syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 185 | ] 186 | 187 | [[package]] 188 | name = "quasi_codegen" 189 | version = "0.32.0" 190 | source = "registry+https://github.com/rust-lang/crates.io-index" 191 | dependencies = [ 192 | "aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", 193 | "syntex 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 194 | "syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 195 | "syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 196 | ] 197 | 198 | [[package]] 199 | name = "regex" 200 | version = "0.2.2" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | dependencies = [ 203 | "aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", 204 | "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 205 | "regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 206 | "thread_local 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 207 | "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 208 | ] 209 | 210 | [[package]] 211 | name = "regex-syntax" 212 | version = "0.4.1" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | 215 | [[package]] 216 | name = "rustc-serialize" 217 | version = "0.3.24" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | 220 | [[package]] 221 | name = "strsim" 222 | version = "0.6.0" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | 225 | [[package]] 226 | name = "syntex" 227 | version = "0.58.1" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | dependencies = [ 230 | "syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 231 | "syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 232 | ] 233 | 234 | [[package]] 235 | name = "syntex_errors" 236 | version = "0.58.1" 237 | source = "registry+https://github.com/rust-lang/crates.io-index" 238 | dependencies = [ 239 | "libc 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)", 240 | "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", 241 | "syntex_pos 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 242 | "term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 243 | "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 244 | ] 245 | 246 | [[package]] 247 | name = "syntex_pos" 248 | version = "0.58.1" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | dependencies = [ 251 | "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", 252 | ] 253 | 254 | [[package]] 255 | name = "syntex_syntax" 256 | version = "0.58.1" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | dependencies = [ 259 | "bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", 260 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 261 | "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", 262 | "syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 263 | "syntex_pos 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 264 | "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 265 | ] 266 | 267 | [[package]] 268 | name = "term" 269 | version = "0.4.6" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | dependencies = [ 272 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 273 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 274 | ] 275 | 276 | [[package]] 277 | name = "term_size" 278 | version = "0.3.0" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | dependencies = [ 281 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 282 | "libc 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)", 283 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 284 | ] 285 | 286 | [[package]] 287 | name = "textwrap" 288 | version = "0.7.0" 289 | source = "registry+https://github.com/rust-lang/crates.io-index" 290 | dependencies = [ 291 | "term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 292 | "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 293 | ] 294 | 295 | [[package]] 296 | name = "thread_local" 297 | version = "0.3.4" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | dependencies = [ 300 | "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 301 | "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 302 | ] 303 | 304 | [[package]] 305 | name = "unicode-segmentation" 306 | version = "1.2.0" 307 | source = "registry+https://github.com/rust-lang/crates.io-index" 308 | 309 | [[package]] 310 | name = "unicode-width" 311 | version = "0.1.4" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | 314 | [[package]] 315 | name = "unicode-xid" 316 | version = "0.0.4" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | 319 | [[package]] 320 | name = "unreachable" 321 | version = "1.0.0" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | dependencies = [ 324 | "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 325 | ] 326 | 327 | [[package]] 328 | name = "utf8-ranges" 329 | version = "1.0.0" 330 | source = "registry+https://github.com/rust-lang/crates.io-index" 331 | 332 | [[package]] 333 | name = "vec_map" 334 | version = "0.8.0" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | 337 | [[package]] 338 | name = "void" 339 | version = "1.0.2" 340 | source = "registry+https://github.com/rust-lang/crates.io-index" 341 | 342 | [[package]] 343 | name = "winapi" 344 | version = "0.2.8" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | 347 | [[package]] 348 | name = "winapi-build" 349 | version = "0.1.1" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | 352 | [metadata] 353 | "checksum aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699" 354 | "checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" 355 | "checksum aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ccfdf7355d9db158df68f976ed030ab0f6578af811f5a7bb6dcf221ec24e0e0" 356 | "checksum atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d912da0db7fa85514874458ca3651fe2cddace8d0b0505571dbdcd41ab490159" 357 | "checksum bindgen 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0c338079dafc81bef7d581f494b906603d12359c4306979eae6ca081925a4984" 358 | "checksum bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1370e9fc2a6ae53aea8b7a5110edbd08836ed87c88736dfabccade1c2b44bff4" 359 | "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" 360 | "checksum cexpr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cdbb21df6ff3497a61df5059994297f746267020ba38ce237aad9c875f7b4313" 361 | "checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" 362 | "checksum clang-sys 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "611ec2e3a7623afd8a8c0d027887b6b55759d894abbf5fe11b9dc11b50d5b49a" 363 | "checksum clap 2.26.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2267a8fdd4dce6956ba6649e130f62fb279026e5e84b92aa939ac8f85ce3f9f0" 364 | "checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b" 365 | "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" 366 | "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 367 | "checksum lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3b37545ab726dd833ec6420aaba8231c5b320814b9029ad585555d2a03e94fbf" 368 | "checksum libc 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)" = "8a014d9226c2cc402676fbe9ea2e15dd5222cd1dd57f576b5b283178c944a264" 369 | "checksum libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "be99f814beb3e9503a786a592c909692bb6d4fc5a695f6ed7987223acfbd5194" 370 | "checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b" 371 | "checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4" 372 | "checksum nom 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "06989cbd367e06f787a451f3bc67d8c3e0eaa10b461cc01152ffab24261a31b1" 373 | "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" 374 | "checksum quasi 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18c45c4854d6d1cf5d531db97c75880feb91c958b0720f4ec1057135fec358b3" 375 | "checksum quasi_codegen 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "51b9e25fa23c044c1803f43ca59c98dac608976dd04ce799411edd58ece776d4" 376 | "checksum regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b" 377 | "checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db" 378 | "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" 379 | "checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694" 380 | "checksum syntex 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a8f5e3aaa79319573d19938ea38d068056b826db9883a5d47f86c1cecc688f0e" 381 | "checksum syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "867cc5c2d7140ae7eaad2ae9e8bf39cb18a67ca651b7834f88d46ca98faadb9c" 382 | "checksum syntex_pos 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13ad4762fe52abc9f4008e85c4fb1b1fe3aa91ccb99ff4826a439c7c598e1047" 383 | "checksum syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6e0e4dbae163dd98989464c23dd503161b338790640e11537686f2ef0f25c791" 384 | "checksum term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" 385 | "checksum term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b6b55df3198cc93372e85dd2ed817f0e38ce8cc0f22eb32391bfad9c4bf209" 386 | "checksum textwrap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f728584ea33b0ad19318e20557cb0a39097751dbb07171419673502f848c7af6" 387 | "checksum thread_local 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1697c4b57aeeb7a536b647165a2825faddffb1d3bad386d507709bd51a90bb14" 388 | "checksum unicode-segmentation 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8083c594e02b8ae1654ae26f0ade5158b119bd88ad0e8227a5d8fcd72407946" 389 | "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f" 390 | "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" 391 | "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" 392 | "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" 393 | "checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c" 394 | "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 395 | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 396 | "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 397 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | [root] 2 | name = "php-rpm" 3 | version = "0.1.0" 4 | dependencies = [ 5 | "clap 2.26.0 (registry+https://github.com/rust-lang/crates.io-index)", 6 | "env_logger 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", 7 | "futures 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 8 | "futures-cpupool 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 9 | "gcc 0.3.53 (registry+https://github.com/rust-lang/crates.io-index)", 10 | "hyper 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", 11 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 12 | "num_cpus 1.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 13 | "php-sys 0.1.0", 14 | "yansi 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 15 | ] 16 | 17 | [[package]] 18 | name = "aho-corasick" 19 | version = "0.5.3" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | dependencies = [ 22 | "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 23 | ] 24 | 25 | [[package]] 26 | name = "aho-corasick" 27 | version = "0.6.3" 28 | source = "registry+https://github.com/rust-lang/crates.io-index" 29 | dependencies = [ 30 | "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 31 | ] 32 | 33 | [[package]] 34 | name = "ansi_term" 35 | version = "0.9.0" 36 | source = "registry+https://github.com/rust-lang/crates.io-index" 37 | 38 | [[package]] 39 | name = "aster" 40 | version = "0.41.0" 41 | source = "registry+https://github.com/rust-lang/crates.io-index" 42 | dependencies = [ 43 | "syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 44 | ] 45 | 46 | [[package]] 47 | name = "atty" 48 | version = "0.2.2" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | dependencies = [ 51 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 52 | "libc 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)", 53 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 54 | ] 55 | 56 | [[package]] 57 | name = "base64" 58 | version = "0.6.0" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | dependencies = [ 61 | "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 62 | "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 63 | ] 64 | 65 | [[package]] 66 | name = "bindgen" 67 | version = "0.29.0" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | dependencies = [ 70 | "aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", 71 | "cexpr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 72 | "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 73 | "clang-sys 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", 74 | "clap 2.26.0 (registry+https://github.com/rust-lang/crates.io-index)", 75 | "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 76 | "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 77 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 78 | "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 79 | "quasi 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)", 80 | "quasi_codegen 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)", 81 | "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 82 | "syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 83 | ] 84 | 85 | [[package]] 86 | name = "bitflags" 87 | version = "0.7.0" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | 90 | [[package]] 91 | name = "bitflags" 92 | version = "0.8.2" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | 95 | [[package]] 96 | name = "bitflags" 97 | version = "0.9.1" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | 100 | [[package]] 101 | name = "byteorder" 102 | version = "1.1.0" 103 | source = "registry+https://github.com/rust-lang/crates.io-index" 104 | 105 | [[package]] 106 | name = "bytes" 107 | version = "0.4.4" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | dependencies = [ 110 | "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 111 | "iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 112 | ] 113 | 114 | [[package]] 115 | name = "cexpr" 116 | version = "0.2.2" 117 | source = "registry+https://github.com/rust-lang/crates.io-index" 118 | dependencies = [ 119 | "nom 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 120 | ] 121 | 122 | [[package]] 123 | name = "cfg-if" 124 | version = "0.1.2" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | 127 | [[package]] 128 | name = "clang-sys" 129 | version = "0.19.0" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | dependencies = [ 132 | "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 133 | "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 134 | "libc 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)", 135 | "libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 136 | ] 137 | 138 | [[package]] 139 | name = "clap" 140 | version = "2.26.0" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | dependencies = [ 143 | "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 144 | "atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 145 | "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 146 | "strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 147 | "term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 148 | "textwrap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 149 | "unicode-segmentation 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 150 | "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 151 | "vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 152 | ] 153 | 154 | [[package]] 155 | name = "conv" 156 | version = "0.3.3" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | dependencies = [ 159 | "custom_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 160 | ] 161 | 162 | [[package]] 163 | name = "custom_derive" 164 | version = "0.1.7" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | 167 | [[package]] 168 | name = "env_logger" 169 | version = "0.3.5" 170 | source = "registry+https://github.com/rust-lang/crates.io-index" 171 | dependencies = [ 172 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 173 | "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", 174 | ] 175 | 176 | [[package]] 177 | name = "env_logger" 178 | version = "0.4.3" 179 | source = "registry+https://github.com/rust-lang/crates.io-index" 180 | dependencies = [ 181 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 182 | "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 183 | ] 184 | 185 | [[package]] 186 | name = "futures" 187 | version = "0.1.14" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | 190 | [[package]] 191 | name = "futures-cpupool" 192 | version = "0.1.5" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | dependencies = [ 195 | "futures 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 196 | "num_cpus 1.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 197 | ] 198 | 199 | [[package]] 200 | name = "gcc" 201 | version = "0.3.53" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | 204 | [[package]] 205 | name = "glob" 206 | version = "0.2.11" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | 209 | [[package]] 210 | name = "httparse" 211 | version = "1.2.3" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | 214 | [[package]] 215 | name = "hyper" 216 | version = "0.11.2" 217 | source = "registry+https://github.com/rust-lang/crates.io-index" 218 | dependencies = [ 219 | "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 220 | "bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", 221 | "futures 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 222 | "futures-cpupool 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 223 | "httparse 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 224 | "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 225 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 226 | "mime 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 227 | "percent-encoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 228 | "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)", 229 | "tokio-core 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 230 | "tokio-io 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 231 | "tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 232 | "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 233 | "unicase 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 234 | ] 235 | 236 | [[package]] 237 | name = "iovec" 238 | version = "0.1.0" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | dependencies = [ 241 | "libc 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)", 242 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 243 | ] 244 | 245 | [[package]] 246 | name = "kernel32-sys" 247 | version = "0.2.2" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | dependencies = [ 250 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 251 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 252 | ] 253 | 254 | [[package]] 255 | name = "language-tags" 256 | version = "0.2.2" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | 259 | [[package]] 260 | name = "lazy_static" 261 | version = "0.2.8" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | 264 | [[package]] 265 | name = "lazycell" 266 | version = "0.5.1" 267 | source = "registry+https://github.com/rust-lang/crates.io-index" 268 | 269 | [[package]] 270 | name = "libc" 271 | version = "0.2.28" 272 | source = "registry+https://github.com/rust-lang/crates.io-index" 273 | 274 | [[package]] 275 | name = "libloading" 276 | version = "0.4.0" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | dependencies = [ 279 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 280 | "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 281 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 282 | ] 283 | 284 | [[package]] 285 | name = "log" 286 | version = "0.3.8" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | 289 | [[package]] 290 | name = "magenta" 291 | version = "0.1.1" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | dependencies = [ 294 | "conv 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 295 | "magenta-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 296 | ] 297 | 298 | [[package]] 299 | name = "magenta-sys" 300 | version = "0.1.1" 301 | source = "registry+https://github.com/rust-lang/crates.io-index" 302 | dependencies = [ 303 | "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 304 | ] 305 | 306 | [[package]] 307 | name = "memchr" 308 | version = "0.1.11" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | dependencies = [ 311 | "libc 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)", 312 | ] 313 | 314 | [[package]] 315 | name = "memchr" 316 | version = "1.0.1" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | dependencies = [ 319 | "libc 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)", 320 | ] 321 | 322 | [[package]] 323 | name = "mime" 324 | version = "0.3.2" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | dependencies = [ 327 | "unicase 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 328 | ] 329 | 330 | [[package]] 331 | name = "mio" 332 | version = "0.6.10" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | dependencies = [ 335 | "iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 336 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 337 | "lazycell 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 338 | "libc 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)", 339 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 340 | "magenta 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 341 | "magenta-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 342 | "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 343 | "net2 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)", 344 | "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 345 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 346 | ] 347 | 348 | [[package]] 349 | name = "miow" 350 | version = "0.2.1" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | dependencies = [ 353 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 354 | "net2 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)", 355 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 356 | "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 357 | ] 358 | 359 | [[package]] 360 | name = "net2" 361 | version = "0.2.30" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | dependencies = [ 364 | "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 365 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 366 | "libc 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)", 367 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 368 | "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 369 | ] 370 | 371 | [[package]] 372 | name = "nom" 373 | version = "3.2.0" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | dependencies = [ 376 | "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 377 | ] 378 | 379 | [[package]] 380 | name = "num_cpus" 381 | version = "1.6.2" 382 | source = "registry+https://github.com/rust-lang/crates.io-index" 383 | dependencies = [ 384 | "libc 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)", 385 | ] 386 | 387 | [[package]] 388 | name = "peeking_take_while" 389 | version = "0.1.2" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | 392 | [[package]] 393 | name = "percent-encoding" 394 | version = "1.0.0" 395 | source = "registry+https://github.com/rust-lang/crates.io-index" 396 | 397 | [[package]] 398 | name = "php-sys" 399 | version = "0.1.0" 400 | dependencies = [ 401 | "bindgen 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)", 402 | ] 403 | 404 | [[package]] 405 | name = "quasi" 406 | version = "0.32.0" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | dependencies = [ 409 | "syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 410 | "syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 411 | ] 412 | 413 | [[package]] 414 | name = "quasi_codegen" 415 | version = "0.32.0" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | dependencies = [ 418 | "aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", 419 | "syntex 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 420 | "syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 421 | "syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 422 | ] 423 | 424 | [[package]] 425 | name = "rand" 426 | version = "0.3.16" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | dependencies = [ 429 | "libc 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)", 430 | "magenta 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 431 | ] 432 | 433 | [[package]] 434 | name = "redox_syscall" 435 | version = "0.1.29" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | 438 | [[package]] 439 | name = "regex" 440 | version = "0.1.80" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | dependencies = [ 443 | "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 444 | "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 445 | "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 446 | "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 447 | "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 448 | ] 449 | 450 | [[package]] 451 | name = "regex" 452 | version = "0.2.2" 453 | source = "registry+https://github.com/rust-lang/crates.io-index" 454 | dependencies = [ 455 | "aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", 456 | "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 457 | "regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 458 | "thread_local 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 459 | "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 460 | ] 461 | 462 | [[package]] 463 | name = "regex-syntax" 464 | version = "0.3.9" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | 467 | [[package]] 468 | name = "regex-syntax" 469 | version = "0.4.1" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | 472 | [[package]] 473 | name = "rustc-serialize" 474 | version = "0.3.24" 475 | source = "registry+https://github.com/rust-lang/crates.io-index" 476 | 477 | [[package]] 478 | name = "rustc_version" 479 | version = "0.1.7" 480 | source = "registry+https://github.com/rust-lang/crates.io-index" 481 | dependencies = [ 482 | "semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", 483 | ] 484 | 485 | [[package]] 486 | name = "safemem" 487 | version = "0.2.0" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | 490 | [[package]] 491 | name = "scoped-tls" 492 | version = "0.1.0" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | 495 | [[package]] 496 | name = "semver" 497 | version = "0.1.20" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | 500 | [[package]] 501 | name = "slab" 502 | version = "0.3.0" 503 | source = "registry+https://github.com/rust-lang/crates.io-index" 504 | 505 | [[package]] 506 | name = "smallvec" 507 | version = "0.2.1" 508 | source = "registry+https://github.com/rust-lang/crates.io-index" 509 | 510 | [[package]] 511 | name = "strsim" 512 | version = "0.6.0" 513 | source = "registry+https://github.com/rust-lang/crates.io-index" 514 | 515 | [[package]] 516 | name = "syntex" 517 | version = "0.58.1" 518 | source = "registry+https://github.com/rust-lang/crates.io-index" 519 | dependencies = [ 520 | "syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 521 | "syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 522 | ] 523 | 524 | [[package]] 525 | name = "syntex_errors" 526 | version = "0.58.1" 527 | source = "registry+https://github.com/rust-lang/crates.io-index" 528 | dependencies = [ 529 | "libc 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)", 530 | "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", 531 | "syntex_pos 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 532 | "term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 533 | "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 534 | ] 535 | 536 | [[package]] 537 | name = "syntex_pos" 538 | version = "0.58.1" 539 | source = "registry+https://github.com/rust-lang/crates.io-index" 540 | dependencies = [ 541 | "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", 542 | ] 543 | 544 | [[package]] 545 | name = "syntex_syntax" 546 | version = "0.58.1" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | dependencies = [ 549 | "bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", 550 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 551 | "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", 552 | "syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 553 | "syntex_pos 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)", 554 | "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 555 | ] 556 | 557 | [[package]] 558 | name = "take" 559 | version = "0.1.0" 560 | source = "registry+https://github.com/rust-lang/crates.io-index" 561 | 562 | [[package]] 563 | name = "term" 564 | version = "0.4.6" 565 | source = "registry+https://github.com/rust-lang/crates.io-index" 566 | dependencies = [ 567 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 568 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 569 | ] 570 | 571 | [[package]] 572 | name = "term_size" 573 | version = "0.3.0" 574 | source = "registry+https://github.com/rust-lang/crates.io-index" 575 | dependencies = [ 576 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 577 | "libc 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)", 578 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 579 | ] 580 | 581 | [[package]] 582 | name = "textwrap" 583 | version = "0.7.0" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | dependencies = [ 586 | "term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 587 | "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 588 | ] 589 | 590 | [[package]] 591 | name = "thread-id" 592 | version = "2.0.0" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | dependencies = [ 595 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 596 | "libc 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)", 597 | ] 598 | 599 | [[package]] 600 | name = "thread_local" 601 | version = "0.2.7" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | dependencies = [ 604 | "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 605 | ] 606 | 607 | [[package]] 608 | name = "thread_local" 609 | version = "0.3.4" 610 | source = "registry+https://github.com/rust-lang/crates.io-index" 611 | dependencies = [ 612 | "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 613 | "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 614 | ] 615 | 616 | [[package]] 617 | name = "time" 618 | version = "0.1.38" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | dependencies = [ 621 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 622 | "libc 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)", 623 | "redox_syscall 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 624 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 625 | ] 626 | 627 | [[package]] 628 | name = "tokio-core" 629 | version = "0.1.9" 630 | source = "registry+https://github.com/rust-lang/crates.io-index" 631 | dependencies = [ 632 | "bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", 633 | "futures 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 634 | "iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 635 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 636 | "mio 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", 637 | "scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 638 | "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 639 | "tokio-io 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 640 | ] 641 | 642 | [[package]] 643 | name = "tokio-io" 644 | version = "0.1.2" 645 | source = "registry+https://github.com/rust-lang/crates.io-index" 646 | dependencies = [ 647 | "bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", 648 | "futures 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 649 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 650 | ] 651 | 652 | [[package]] 653 | name = "tokio-proto" 654 | version = "0.1.1" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | dependencies = [ 657 | "futures 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 658 | "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 659 | "net2 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)", 660 | "rand 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", 661 | "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 662 | "smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 663 | "take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 664 | "tokio-core 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 665 | "tokio-io 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 666 | "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 667 | ] 668 | 669 | [[package]] 670 | name = "tokio-service" 671 | version = "0.1.0" 672 | source = "registry+https://github.com/rust-lang/crates.io-index" 673 | dependencies = [ 674 | "futures 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 675 | ] 676 | 677 | [[package]] 678 | name = "unicase" 679 | version = "2.0.0" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | dependencies = [ 682 | "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 683 | ] 684 | 685 | [[package]] 686 | name = "unicode-segmentation" 687 | version = "1.2.0" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | 690 | [[package]] 691 | name = "unicode-width" 692 | version = "0.1.4" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | 695 | [[package]] 696 | name = "unicode-xid" 697 | version = "0.0.4" 698 | source = "registry+https://github.com/rust-lang/crates.io-index" 699 | 700 | [[package]] 701 | name = "unreachable" 702 | version = "1.0.0" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | dependencies = [ 705 | "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 706 | ] 707 | 708 | [[package]] 709 | name = "utf8-ranges" 710 | version = "0.1.3" 711 | source = "registry+https://github.com/rust-lang/crates.io-index" 712 | 713 | [[package]] 714 | name = "utf8-ranges" 715 | version = "1.0.0" 716 | source = "registry+https://github.com/rust-lang/crates.io-index" 717 | 718 | [[package]] 719 | name = "vec_map" 720 | version = "0.8.0" 721 | source = "registry+https://github.com/rust-lang/crates.io-index" 722 | 723 | [[package]] 724 | name = "void" 725 | version = "1.0.2" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | 728 | [[package]] 729 | name = "winapi" 730 | version = "0.2.8" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | 733 | [[package]] 734 | name = "winapi-build" 735 | version = "0.1.1" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | 738 | [[package]] 739 | name = "ws2_32-sys" 740 | version = "0.2.1" 741 | source = "registry+https://github.com/rust-lang/crates.io-index" 742 | dependencies = [ 743 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 744 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 745 | ] 746 | 747 | [[package]] 748 | name = "yansi" 749 | version = "0.3.3" 750 | source = "registry+https://github.com/rust-lang/crates.io-index" 751 | 752 | [metadata] 753 | "checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66" 754 | "checksum aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699" 755 | "checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" 756 | "checksum aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ccfdf7355d9db158df68f976ed030ab0f6578af811f5a7bb6dcf221ec24e0e0" 757 | "checksum atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d912da0db7fa85514874458ca3651fe2cddace8d0b0505571dbdcd41ab490159" 758 | "checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9" 759 | "checksum bindgen 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0c338079dafc81bef7d581f494b906603d12359c4306979eae6ca081925a4984" 760 | "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" 761 | "checksum bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1370e9fc2a6ae53aea8b7a5110edbd08836ed87c88736dfabccade1c2b44bff4" 762 | "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" 763 | "checksum byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff81738b726f5d099632ceaffe7fb65b90212e8dce59d518729e7e8634032d3d" 764 | "checksum bytes 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8b24f16593f445422331a5eed46b72f7f171f910fead4f2ea8f17e727e9c5c14" 765 | "checksum cexpr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cdbb21df6ff3497a61df5059994297f746267020ba38ce237aad9c875f7b4313" 766 | "checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" 767 | "checksum clang-sys 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "611ec2e3a7623afd8a8c0d027887b6b55759d894abbf5fe11b9dc11b50d5b49a" 768 | "checksum clap 2.26.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2267a8fdd4dce6956ba6649e130f62fb279026e5e84b92aa939ac8f85ce3f9f0" 769 | "checksum conv 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "78ff10625fd0ac447827aa30ea8b861fead473bb60aeb73af6c1c58caf0d1299" 770 | "checksum custom_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "ef8ae57c4978a2acd8b869ce6b9ca1dfe817bff704c220209fdef2c0b75a01b9" 771 | "checksum env_logger 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "15abd780e45b3ea4f76b4e9a26ff4843258dd8a3eed2775a0e7368c2e7936c2f" 772 | "checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b" 773 | "checksum futures 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4b63a4792d4f8f686defe3b39b92127fea6344de5d38202b2ee5a11bbbf29d6a" 774 | "checksum futures-cpupool 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a283c84501e92cade5ea673a2a7ca44f71f209ccdd302a3e0896f50083d2c5ff" 775 | "checksum gcc 0.3.53 (registry+https://github.com/rust-lang/crates.io-index)" = "e8310f7e9c890398b0e80e301c4f474e9918d2b27fca8f48486ca775fa9ffc5a" 776 | "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" 777 | "checksum httparse 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "af2f2dd97457e8fb1ae7c5a420db346af389926e36f43768b96f101546b04a07" 778 | "checksum hyper 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "641abc3e3fcf0de41165595f801376e01106bca1fd876dda937730e477ca004c" 779 | "checksum iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29d062ee61fccdf25be172e70f34c9f6efc597e1fb8f6526e8437b2046ab26be" 780 | "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 781 | "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" 782 | "checksum lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3b37545ab726dd833ec6420aaba8231c5b320814b9029ad585555d2a03e94fbf" 783 | "checksum lazycell 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3b585b7a6811fb03aa10e74b278a0f00f8dd9b45dc681f148bb29fa5cb61859b" 784 | "checksum libc 0.2.28 (registry+https://github.com/rust-lang/crates.io-index)" = "bb7b49972ee23d8aa1026c365a5b440ba08e35075f18c459980c7395c221ec48" 785 | "checksum libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "be99f814beb3e9503a786a592c909692bb6d4fc5a695f6ed7987223acfbd5194" 786 | "checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b" 787 | "checksum magenta 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf0336886480e671965f794bc9b6fce88503563013d1bfb7a502c81fe3ac527" 788 | "checksum magenta-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "40d014c7011ac470ae28e2f76a02bfea4a8480f73e701353b49ad7a8d75f4699" 789 | "checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20" 790 | "checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4" 791 | "checksum mime 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c5ca99d8a021c1687882fd68dca26e601ceff5c26571c7cb41cf4ed60d57cb2d" 792 | "checksum mio 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "dbd91d3bfbceb13897065e97b2ef177a09a438cb33612b2d371bf568819a9313" 793 | "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" 794 | "checksum net2 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)" = "94101fd932816f97eb9a5116f6c1a11511a1fed7db21c5ccd823b2dc11abf566" 795 | "checksum nom 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "06989cbd367e06f787a451f3bc67d8c3e0eaa10b461cc01152ffab24261a31b1" 796 | "checksum num_cpus 1.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aec53c34f2d0247c5ca5d32cca1478762f301740468ee9ee6dcb7a0dd7a0c584" 797 | "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" 798 | "checksum percent-encoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de154f638187706bde41d9b4738748933d64e6b37bdbffc0b47a97d16a6ae356" 799 | "checksum quasi 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18c45c4854d6d1cf5d531db97c75880feb91c958b0720f4ec1057135fec358b3" 800 | "checksum quasi_codegen 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "51b9e25fa23c044c1803f43ca59c98dac608976dd04ce799411edd58ece776d4" 801 | "checksum rand 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "eb250fd207a4729c976794d03db689c9be1d634ab5a1c9da9492a13d8fecbcdf" 802 | "checksum redox_syscall 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "3c9309631a35303bffb47e397198e3668cb544fe8834cd3da2a744441e70e524" 803 | "checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f" 804 | "checksum regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b" 805 | "checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957" 806 | "checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db" 807 | "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" 808 | "checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084" 809 | "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" 810 | "checksum scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f417c22df063e9450888a7561788e9bd46d3bb3c1466435b4eccb903807f147d" 811 | "checksum semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac" 812 | "checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23" 813 | "checksum smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4c8cbcd6df1e117c2210e13ab5109635ad68a929fcbb8964dc965b76cb5ee013" 814 | "checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694" 815 | "checksum syntex 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a8f5e3aaa79319573d19938ea38d068056b826db9883a5d47f86c1cecc688f0e" 816 | "checksum syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "867cc5c2d7140ae7eaad2ae9e8bf39cb18a67ca651b7834f88d46ca98faadb9c" 817 | "checksum syntex_pos 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13ad4762fe52abc9f4008e85c4fb1b1fe3aa91ccb99ff4826a439c7c598e1047" 818 | "checksum syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6e0e4dbae163dd98989464c23dd503161b338790640e11537686f2ef0f25c791" 819 | "checksum take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b157868d8ac1f56b64604539990685fa7611d8fa9e5476cf0c02cf34d32917c5" 820 | "checksum term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" 821 | "checksum term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b6b55df3198cc93372e85dd2ed817f0e38ce8cc0f22eb32391bfad9c4bf209" 822 | "checksum textwrap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f728584ea33b0ad19318e20557cb0a39097751dbb07171419673502f848c7af6" 823 | "checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03" 824 | "checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5" 825 | "checksum thread_local 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1697c4b57aeeb7a536b647165a2825faddffb1d3bad386d507709bd51a90bb14" 826 | "checksum time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d788d3aa77bc0ef3e9621256885555368b47bd495c13dd2e7413c89f845520" 827 | "checksum tokio-core 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e85d419699ec4b71bfe35bbc25bb8771e52eff0471a7f75c853ad06e200b4f86" 828 | "checksum tokio-io 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c2c3ce9739f7387a0fa65b5421e81feae92e04d603f008898f4257790ce8c2db" 829 | "checksum tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fbb47ae81353c63c487030659494b295f6cb6576242f907f203473b191b0389" 830 | "checksum tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" 831 | "checksum unicase 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2e01da42520092d0cd2d6ac3ae69eb21a22ad43ff195676b86f8c37f487d6b80" 832 | "checksum unicode-segmentation 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8083c594e02b8ae1654ae26f0ade5158b119bd88ad0e8227a5d8fcd72407946" 833 | "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f" 834 | "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" 835 | "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" 836 | "checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f" 837 | "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" 838 | "checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c" 839 | "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 840 | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 841 | "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 842 | "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 843 | "checksum yansi 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8200521fa88cba2d4ec8d7500616a284ae8bd92d492a309773478a870660573a" 844 | --------------------------------------------------------------------------------