New upstream version 0.20.0
authorXimin Luo <infinity0@debian.org>
Thu, 24 Aug 2017 15:01:54 +0000 (17:01 +0200)
committerXimin Luo <infinity0@debian.org>
Thu, 24 Aug 2017 15:01:54 +0000 (17:01 +0200)
213 files changed:
1  2 
vendor/advapi32-sys-0.2.0/.cargo-checksum.json
vendor/advapi32-sys-0.2.0/.cargo-ok
vendor/advapi32-sys-0.2.0/Cargo.toml
vendor/advapi32-sys-0.2.0/README.md
vendor/advapi32-sys-0.2.0/build.rs
vendor/advapi32-sys-0.2.0/src/lib.rs
vendor/aho-corasick-0.5.3/.cargo-checksum.json
vendor/aho-corasick-0.5.3/.gitignore
vendor/aho-corasick-0.6.3/.cargo-checksum.json
vendor/aho-corasick-0.6.3/.gitignore
vendor/backtrace-0.3.2/.cargo-checksum.json
vendor/backtrace-0.3.2/.gitignore
vendor/backtrace-sys-0.1.11/.cargo-checksum.json
vendor/bitflags-0.9.1/.cargo-checksum.json
vendor/bitflags-0.9.1/.gitignore
vendor/bitflags-0.9.1/Cargo.toml.orig
vendor/bufstream-0.1.3/.cargo-checksum.json
vendor/bufstream-0.1.3/.gitignore
vendor/cfg-if-0.1.0/.cargo-checksum.json
vendor/cfg-if-0.1.0/.gitignore
vendor/cmake-0.1.24/.cargo-checksum.json
vendor/cmake-0.1.24/.gitignore
vendor/crossbeam-0.2.10/.cargo-checksum.json
vendor/crossbeam-0.2.10/.gitignore
vendor/curl-0.4.6/.cargo-checksum.json
vendor/curl-0.4.6/.gitignore
vendor/curl-sys-0.3.12/.cargo-checksum.json
vendor/dbghelp-sys-0.2.0/.cargo-checksum.json
vendor/docopt-0.7.0/.cargo-checksum.json
vendor/docopt-0.7.0/.gitignore
vendor/dtoa-0.4.1/.cargo-checksum.json
vendor/dtoa-0.4.1/.gitignore
vendor/env_logger-0.4.3/.cargo-checksum.json
vendor/env_logger-0.4.3/Cargo.toml.orig
vendor/error-chain-0.10.0/.cargo-checksum.json
vendor/error-chain-0.10.0/.gitignore
vendor/filetime-0.1.10/.cargo-checksum.json
vendor/filetime-0.1.10/.gitignore
vendor/flate2-0.2.19/.cargo-checksum.json
vendor/flate2-0.2.19/.gitignore
vendor/foreign-types-0.2.0/.cargo-checksum.json
vendor/foreign-types-0.2.0/.gitignore
vendor/fs2-0.4.1/.cargo-checksum.json
vendor/fs2-0.4.1/.gitignore
vendor/gcc-0.3.50/.cargo-checksum.json
vendor/gcc-0.3.50/.gitignore
vendor/gdi32-sys-0.2.0/.cargo-checksum.json
vendor/git2-0.6.6/.cargo-checksum.json
vendor/git2-0.6.6/.gitignore
vendor/git2-curl-0.7.0/.cargo-checksum.json
vendor/glob-0.2.11/.cargo-checksum.json
vendor/glob-0.2.11/.gitignore
vendor/hamcrest-0.1.1/.cargo-checksum.json
vendor/hamcrest-0.1.1/.gitignore
vendor/idna-0.1.2/.cargo-checksum.json
vendor/itoa-0.3.1/.cargo-checksum.json
vendor/itoa-0.3.1/.gitignore
vendor/jobserver-0.1.6/.cargo-checksum.json
vendor/jobserver-0.1.6/.gitignore
vendor/kernel32-sys-0.2.2/.cargo-checksum.json
vendor/lazy_static-0.2.8/.cargo-checksum.json
vendor/lazy_static-0.2.8/.gitignore
vendor/libc-0.2.23/.cargo-checksum.json
vendor/libc-0.2.23/.gitignore
vendor/libgit2-sys-0.6.12/.cargo-checksum.json
vendor/libssh2-sys-0.2.6/.cargo-checksum.json
vendor/libz-sys-1.0.14/.cargo-checksum.json
vendor/libz-sys-1.0.14/.gitignore
vendor/log-0.3.8/.cargo-checksum.json
vendor/log-0.3.8/.gitignore
vendor/log-0.3.8/Cargo.toml.orig
vendor/matches-0.1.4/.cargo-checksum.json
vendor/memchr-0.1.11/.cargo-checksum.json
vendor/memchr-0.1.11/.gitignore
vendor/memchr-1.0.1/.cargo-checksum.json
vendor/memchr-1.0.1/.gitignore
vendor/miniz-sys-0.1.9/.cargo-checksum.json
vendor/miow-0.2.1/.cargo-checksum.json
vendor/miow-0.2.1/.cargo-ok
vendor/miow-0.2.1/.gitignore
vendor/miow-0.2.1/Cargo.toml
vendor/miow-0.2.1/LICENSE-APACHE
vendor/miow-0.2.1/LICENSE-MIT
vendor/miow-0.2.1/README.md
vendor/miow-0.2.1/appveyor.yml
vendor/miow-0.2.1/src/handle.rs
vendor/miow-0.2.1/src/iocp.rs
vendor/miow-0.2.1/src/lib.rs
vendor/miow-0.2.1/src/net.rs
vendor/miow-0.2.1/src/overlapped.rs
vendor/miow-0.2.1/src/pipe.rs
vendor/net2-0.2.29/.cargo-checksum.json
vendor/net2-0.2.29/.cargo-ok
vendor/net2-0.2.29/.gitignore
vendor/net2-0.2.29/.travis.yml
vendor/net2-0.2.29/Cargo.toml
vendor/net2-0.2.29/LICENSE-APACHE
vendor/net2-0.2.29/LICENSE-MIT
vendor/net2-0.2.29/README.md
vendor/net2-0.2.29/appveyor.yml
vendor/net2-0.2.29/src/ext.rs
vendor/net2-0.2.29/src/lib.rs
vendor/net2-0.2.29/src/socket.rs
vendor/net2-0.2.29/src/sys/unix/impls.rs
vendor/net2-0.2.29/src/sys/unix/mod.rs
vendor/net2-0.2.29/src/sys/windows/impls.rs
vendor/net2-0.2.29/src/sys/windows/mod.rs
vendor/net2-0.2.29/src/tcp.rs
vendor/net2-0.2.29/src/udp.rs
vendor/net2-0.2.29/src/unix.rs
vendor/net2-0.2.29/src/utils.rs
vendor/net2-0.2.29/tests/all.rs
vendor/num-0.1.37/.cargo-checksum.json
vendor/num-0.1.37/.gitignore
vendor/num-0.1.37/ci/.gitignore
vendor/num-bigint-0.1.37/.cargo-checksum.json
vendor/num-complex-0.1.37/.cargo-checksum.json
vendor/num-integer-0.1.34/.cargo-checksum.json
vendor/num-iter-0.1.33/.cargo-checksum.json
vendor/num-rational-0.1.36/.cargo-checksum.json
vendor/num-traits-0.1.37/.cargo-checksum.json
vendor/num_cpus-1.5.0/.cargo-checksum.json
vendor/num_cpus-1.5.0/.gitignore
vendor/num_cpus-1.5.0/Cargo.toml.orig
vendor/openssl-0.9.13/.cargo-checksum.json
vendor/openssl-probe-0.1.1/.cargo-checksum.json
vendor/openssl-probe-0.1.1/.gitignore
vendor/openssl-sys-0.9.13/.cargo-checksum.json
vendor/pkg-config-0.3.9/.cargo-checksum.json
vendor/pkg-config-0.3.9/.gitignore
vendor/psapi-sys-0.1.0/.cargo-checksum.json
vendor/psapi-sys-0.1.0/.cargo-ok
vendor/psapi-sys-0.1.0/Cargo.toml
vendor/psapi-sys-0.1.0/README.md
vendor/psapi-sys-0.1.0/build.rs
vendor/psapi-sys-0.1.0/src/lib.rs
vendor/quote-0.3.15/.cargo-checksum.json
vendor/rand-0.3.15/.cargo-checksum.json
vendor/rand-0.3.15/.gitignore
vendor/regex-0.1.80/.cargo-checksum.json
vendor/regex-0.1.80/.gitignore
vendor/regex-0.2.2/.cargo-checksum.json
vendor/regex-0.2.2/.gitignore
vendor/regex-syntax-0.3.9/.cargo-checksum.json
vendor/regex-syntax-0.4.1/.cargo-checksum.json
vendor/rustc-demangle-0.1.4/.cargo-checksum.json
vendor/rustc-demangle-0.1.4/.gitignore
vendor/rustc-serialize-0.3.24/.cargo-checksum.json
vendor/rustc-serialize-0.3.24/.gitignore
vendor/scoped-tls-0.1.0/.cargo-checksum.json
vendor/scoped-tls-0.1.0/.gitignore
vendor/semver-0.7.0/.cargo-checksum.json
vendor/semver-0.7.0/.gitignore
vendor/semver-parser-0.7.0/.cargo-checksum.json
vendor/semver-parser-0.7.0/.gitignore
vendor/serde-1.0.8/.cargo-checksum.json
vendor/serde-1.0.8/Cargo.toml.orig
vendor/serde_derive-1.0.8/.cargo-checksum.json
vendor/serde_derive-1.0.8/Cargo.toml.orig
vendor/serde_derive_internals-0.15.1/.cargo-checksum.json
vendor/serde_ignored-0.0.3/.cargo-checksum.json
vendor/serde_ignored-0.0.3/.gitignore
vendor/serde_json-1.0.2/.cargo-checksum.json
vendor/shell-escape-0.1.3/.cargo-checksum.json
vendor/shell-escape-0.1.3/.gitignore
vendor/strsim-0.6.0/.cargo-checksum.json
vendor/strsim-0.6.0/.gitignore
vendor/syn-0.11.11/.cargo-checksum.json
vendor/synom-0.11.3/.cargo-checksum.json
vendor/tar-0.4.13/.cargo-checksum.json
vendor/tar-0.4.13/.gitignore
vendor/tempdir-0.3.5/.cargo-checksum.json
vendor/tempdir-0.3.5/.gitignore
vendor/term-0.4.5/.cargo-checksum.json
vendor/term-0.4.5/.gitignore
vendor/thread-id-2.0.0/.cargo-checksum.json
vendor/thread-id-2.0.0/.gitignore
vendor/thread-id-3.1.0/.cargo-checksum.json
vendor/thread-id-3.1.0/.gitignore
vendor/thread_local-0.2.7/.cargo-checksum.json
vendor/thread_local-0.2.7/.gitignore
vendor/thread_local-0.3.3/.cargo-checksum.json
vendor/thread_local-0.3.3/.gitignore
vendor/toml-0.4.1/.cargo-checksum.json
vendor/toml-0.4.1/.gitignore
vendor/unicode-bidi-0.3.3/.cargo-checksum.json
vendor/unicode-bidi-0.3.3/.gitignore
vendor/unicode-normalization-0.1.4/.cargo-checksum.json
vendor/unicode-normalization-0.1.4/.gitignore
vendor/unicode-xid-0.0.4/.cargo-checksum.json
vendor/unicode-xid-0.0.4/.gitignore
vendor/unreachable-0.1.1/.cargo-checksum.json
vendor/unreachable-0.1.1/.gitignore
vendor/url-1.4.1/.cargo-checksum.json
vendor/url-1.4.1/.gitignore
vendor/url-1.4.1/Cargo.toml.orig
vendor/user32-sys-0.2.0/.cargo-checksum.json
vendor/utf8-ranges-0.1.3/.cargo-checksum.json
vendor/utf8-ranges-0.1.3/.gitignore
vendor/utf8-ranges-1.0.0/.cargo-checksum.json
vendor/utf8-ranges-1.0.0/.gitignore
vendor/vcpkg-0.2.1/.cargo-checksum.json
vendor/vcpkg-0.2.1/Cargo.toml.orig
vendor/void-1.0.2/.cargo-checksum.json
vendor/void-1.0.2/.gitignore
vendor/winapi-0.2.8/.cargo-checksum.json
vendor/winapi-build-0.1.1/.cargo-checksum.json
vendor/ws2_32-sys-0.2.1/.cargo-checksum.json
vendor/ws2_32-sys-0.2.1/.cargo-ok
vendor/ws2_32-sys-0.2.1/Cargo.toml
vendor/ws2_32-sys-0.2.1/README.md
vendor/ws2_32-sys-0.2.1/build.rs
vendor/ws2_32-sys-0.2.1/src/lib.rs

index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..22bddd46709f0aed77fee89ea162b184b0ced1ff
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++{"files":{},"package":"e06588080cb19d0acb6739808aafa5f26bfb2ca015b2b6370028b44cf7cb8a9a"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
new file mode 100644 (file)
--- /dev/null
--- /dev/null
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..fccf0ad802462fdbdb74fefb710dd191e37207a8
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,17 @@@
++[package]
++name = "advapi32-sys"
++version = "0.2.0"
++authors = ["Peter Atashian <retep998@gmail.com>"]
++description = "Contains function definitions for the Windows API library advapi32. See winapi for types and constants."
++documentation = "https://retep998.github.io/doc/advapi32/"
++repository = "https://github.com/retep998/winapi-rs"
++readme = "README.md"
++keywords = ["windows", "ffi", "win32"]
++license = "MIT"
++build = "build.rs"
++[lib]
++name = "advapi32"
++[dependencies]
++winapi = { version = "0.2.5", path = "../.." }
++[build-dependencies]
++winapi-build = { version = "0.1.1", path = "../../build" }
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c3d84c3288d9f44c55ee6e359bb4380e45c6d3c0
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++# advapi32 #
++Contains function definitions for the Windows API library advapi32. See winapi for types and constants.
++
++```toml
++[dependencies]
++advapi32-sys = "0.1.2"
++```
++
++```rust
++extern crate advapi32;
++```
++
++[Documentation](https://retep998.github.io/doc/advapi32/)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..639d0b305799e4e61c1e3ff1eaf7223eb1609ff9
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,6 @@@
++// Copyright © 2015, Peter Atashian
++// Licensed under the MIT License <LICENSE.md>
++extern crate build;
++fn main() {
++    build::link("advapi32", false)
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..3c4a5221b7af9fb485b72ca428c0347959938113
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1005 @@@
++// Copyright © 2015, Peter Atashian
++// Licensed under the MIT License <LICENSE.md>
++//! FFI bindings to advapi32.
++#![cfg(windows)]
++extern crate winapi;
++use winapi::*;
++extern "system" {
++    pub fn AbortSystemShutdownA(lpMachineName: LPCSTR) -> BOOL;
++    pub fn AbortSystemShutdownW(lpMachineName: LPWSTR) -> BOOL;
++    // pub fn AccessCheck();
++    // pub fn AccessCheckAndAuditAlarmA();
++    // pub fn AccessCheckAndAuditAlarmW();
++    // pub fn AccessCheckByType();
++    // pub fn AccessCheckByTypeAndAuditAlarmA();
++    // pub fn AccessCheckByTypeAndAuditAlarmW();
++    // pub fn AccessCheckByTypeResultList();
++    // pub fn AccessCheckByTypeResultListAndAuditAlarmA();
++    // pub fn AccessCheckByTypeResultListAndAuditAlarmByHandleA();
++    // pub fn AccessCheckByTypeResultListAndAuditAlarmByHandleW();
++    // pub fn AccessCheckByTypeResultListAndAuditAlarmW();
++    // pub fn AddAccessAllowedAce();
++    // pub fn AddAccessAllowedAceEx();
++    // pub fn AddAccessAllowedObjectAce();
++    // pub fn AddAccessDeniedAce();
++    // pub fn AddAccessDeniedAceEx();
++    // pub fn AddAccessDeniedObjectAce();
++    // pub fn AddAce();
++    // pub fn AddAuditAccessAce();
++    // pub fn AddAuditAccessAceEx();
++    // pub fn AddAuditAccessObjectAce();
++    // pub fn AddConditionalAce();
++    // pub fn AddMandatoryAce();
++    // pub fn AddUsersToEncryptedFile();
++    // pub fn AddUsersToEncryptedFileEx();
++    // pub fn AdjustTokenGroups();
++    pub fn AdjustTokenPrivileges(
++        TokenHandle: HANDLE, DisableAllPrivileges: BOOL, NewState: PTOKEN_PRIVILEGES,
++        BufferLength: DWORD, PreviousState: PTOKEN_PRIVILEGES, ReturnLength: PDWORD,
++    ) -> BOOL;
++    // pub fn AllocateAndInitializeSid();
++    pub fn AllocateLocallyUniqueId(Luid: PLUID) -> BOOL;
++    pub fn AreAllAccessesGranted(GrantedAccess: DWORD, DesiredAccess: DWORD) -> BOOL;
++    pub fn AreAnyAccessesGranted(GrantedAccess: DWORD, DesiredAccess: DWORD) -> BOOL;
++    // pub fn AuditComputeEffectivePolicyBySid();
++    // pub fn AuditComputeEffectivePolicyByToken();
++    // pub fn AuditEnumerateCategories();
++    // pub fn AuditEnumeratePerUserPolicy();
++    // pub fn AuditEnumerateSubCategories();
++    pub fn AuditFree(Buffer: PVOID);
++    // pub fn AuditLookupCategoryGuidFromCategoryId();
++    // pub fn AuditLookupCategoryIdFromCategoryGuid();
++    // pub fn AuditLookupCategoryNameA();
++    // pub fn AuditLookupCategoryNameW();
++    // pub fn AuditLookupSubCategoryNameA();
++    // pub fn AuditLookupSubCategoryNameW();
++    // pub fn AuditQueryGlobalSaclA();
++    // pub fn AuditQueryGlobalSaclW();
++    // pub fn AuditQueryPerUserPolicy();
++    // pub fn AuditQuerySecurity();
++    // pub fn AuditQuerySystemPolicy();
++    // pub fn AuditSetGlobalSaclA();
++    // pub fn AuditSetGlobalSaclW();
++    // pub fn AuditSetPerUserPolicy();
++    // pub fn AuditSetSecurity();
++    // pub fn AuditSetSystemPolicy();
++    // pub fn BackupEventLogA();
++    // pub fn BackupEventLogW();
++    // pub fn BaseRegCloseKey();
++    // pub fn BaseRegCreateKey();
++    // pub fn BaseRegDeleteKeyEx();
++    // pub fn BaseRegDeleteValue();
++    // pub fn BaseRegFlushKey();
++    // pub fn BaseRegGetVersion();
++    // pub fn BaseRegLoadKey();
++    // pub fn BaseRegOpenKey();
++    // pub fn BaseRegRestoreKey();
++    // pub fn BaseRegSaveKeyEx();
++    // pub fn BaseRegSetKeySecurity();
++    // pub fn BaseRegSetValue();
++    // pub fn BaseRegUnLoadKey();
++    // pub fn BuildExplicitAccessWithNameA();
++    // pub fn BuildExplicitAccessWithNameW();
++    // pub fn BuildImpersonateExplicitAccessWithNameA();
++    // pub fn BuildImpersonateExplicitAccessWithNameW();
++    // pub fn BuildImpersonateTrusteeA();
++    // pub fn BuildImpersonateTrusteeW();
++    // pub fn BuildSecurityDescriptorA();
++    // pub fn BuildSecurityDescriptorW();
++    // pub fn BuildTrusteeWithNameA();
++    // pub fn BuildTrusteeWithNameW();
++    // pub fn BuildTrusteeWithObjectsAndNameA();
++    // pub fn BuildTrusteeWithObjectsAndNameW();
++    // pub fn BuildTrusteeWithObjectsAndSidA();
++    // pub fn BuildTrusteeWithObjectsAndSidW();
++    // pub fn BuildTrusteeWithSidA();
++    // pub fn BuildTrusteeWithSidW();
++    // pub fn CancelOverlappedAccess();
++    // pub fn ChangeServiceConfig2A();
++    // pub fn ChangeServiceConfig2W();
++    // pub fn ChangeServiceConfigA();
++    // pub fn ChangeServiceConfigW();
++    // pub fn CheckForHiberboot();
++    // pub fn CheckTokenMembership();
++    // pub fn ClearEventLogA();
++    // pub fn ClearEventLogW();
++    // pub fn CloseCodeAuthzLevel();
++    // pub fn CloseEncryptedFileRaw();
++    // pub fn CloseEventLog();
++    pub fn CloseServiceHandle(hSCObject: SC_HANDLE) -> BOOL;
++    // pub fn CloseThreadWaitChainSession();
++    // pub fn CloseTrace();
++    // pub fn CommandLineFromMsiDescriptor();
++    // pub fn ComputeAccessTokenFromCodeAuthzLevel();
++    pub fn ControlService(
++        hService: SC_HANDLE, dwControl: DWORD, lpServiceStatus: LPSERVICE_STATUS,
++    ) -> BOOL;
++    // pub fn ControlServiceExA();
++    // pub fn ControlServiceExW();
++    // pub fn ControlTraceA();
++    // pub fn ControlTraceW();
++    // pub fn ConvertAccessToSecurityDescriptorA();
++    // pub fn ConvertAccessToSecurityDescriptorW();
++    // pub fn ConvertSDToStringSDDomainW();
++    // pub fn ConvertSDToStringSDRootDomainA();
++    // pub fn ConvertSDToStringSDRootDomainW();
++    // pub fn ConvertSecurityDescriptorToAccessA();
++    // pub fn ConvertSecurityDescriptorToAccessNamedA();
++    // pub fn ConvertSecurityDescriptorToAccessNamedW();
++    // pub fn ConvertSecurityDescriptorToAccessW();
++    // pub fn ConvertSecurityDescriptorToStringSecurityDescriptorA();
++    // pub fn ConvertSecurityDescriptorToStringSecurityDescriptorW();
++    // pub fn ConvertSidToStringSidA();
++    // pub fn ConvertSidToStringSidW();
++    // pub fn ConvertStringSDToSDDomainA();
++    // pub fn ConvertStringSDToSDDomainW();
++    // pub fn ConvertStringSDToSDRootDomainA();
++    // pub fn ConvertStringSDToSDRootDomainW();
++    // pub fn ConvertStringSecurityDescriptorToSecurityDescriptorA();
++    // pub fn ConvertStringSecurityDescriptorToSecurityDescriptorW();
++    // pub fn ConvertStringSidToSidA();
++    // pub fn ConvertStringSidToSidW();
++    // pub fn ConvertToAutoInheritPrivateObjectSecurity();
++    // pub fn CopySid();
++    // pub fn CreateCodeAuthzLevel();
++    // pub fn CreatePrivateObjectSecurity();
++    // pub fn CreatePrivateObjectSecurityEx();
++    // pub fn CreatePrivateObjectSecurityWithMultipleInheritance();
++    // pub fn CreateProcessAsUserA();
++    // pub fn CreateProcessAsUserW();
++    // pub fn CreateProcessWithLogonW();
++    // pub fn CreateProcessWithTokenW();
++    // pub fn CreateRestrictedToken();
++    pub fn CreateServiceA(
++        hSCManager: SC_HANDLE, lpServiceName: LPCSTR, lpDisplayName: LPCSTR,
++        dwDesiredAccess: DWORD, dwServiceType: DWORD, dwStartType: DWORD, dwErrorControl: DWORD,
++        lpBinaryPathName: LPCSTR, lpLoadOrderGroup: LPCSTR, lpdwTagId: LPDWORD,
++        lpDependencies: LPCSTR, lpServiceStartName: LPCSTR, lpPassword: LPCSTR,
++    ) -> SC_HANDLE;
++    pub fn CreateServiceW(
++        hSCManager: SC_HANDLE, lpServiceName: LPCWSTR, lpDisplayName: LPCWSTR,
++        dwDesiredAccess: DWORD, dwServiceType: DWORD, dwStartType: DWORD, dwErrorControl: DWORD,
++        lpBinaryPathName: LPCWSTR, lpLoadOrderGroup: LPCWSTR, lpdwTagId: LPDWORD,
++        lpDependencies: LPCWSTR, lpServiceStartName: LPCWSTR, lpPassword: LPCWSTR,
++    ) -> SC_HANDLE;
++    // pub fn CreateTraceInstanceId();
++    // pub fn CreateWellKnownSid();
++    pub fn CredDeleteA(TargetName: LPCSTR, Type: DWORD, Flags: DWORD) -> BOOL;
++    pub fn CredDeleteW(TargetName: LPCWSTR, Type: DWORD, Flags: DWORD) -> BOOL;
++    // pub fn CredEnumerateA();
++    // pub fn CredEnumerateW();
++    // pub fn CredFindBestCredentialA();
++    // pub fn CredFindBestCredentialW();
++    pub fn CredFree(Buffer: PVOID);
++    // pub fn CredGetSessionTypes();
++    // pub fn CredGetTargetInfoA();
++    // pub fn CredGetTargetInfoW();
++    // pub fn CredIsMarshaledCredentialA();
++    // pub fn CredIsMarshaledCredentialW();
++    // pub fn CredIsProtectedA();
++    // pub fn CredIsProtectedW();
++    // pub fn CredMarshalCredentialA();
++    // pub fn CredMarshalCredentialW();
++    // pub fn CredProtectA();
++    // pub fn CredProtectW();
++    pub fn CredReadA(
++        TargetName: LPCSTR, Type: DWORD, Flags: DWORD, Credential: *mut PCREDENTIALA,
++    ) -> BOOL;
++    // pub fn CredReadDomainCredentialsA();
++    // pub fn CredReadDomainCredentialsW();
++    pub fn CredReadW(
++        TargetName: LPCWSTR, Type: DWORD, Flags: DWORD, Credential: *mut PCREDENTIALW,
++    ) -> BOOL;
++    // pub fn CredRenameA();
++    // pub fn CredRenameW();
++    // pub fn CredUnmarshalCredentialA();
++    // pub fn CredUnmarshalCredentialW();
++    // pub fn CredUnprotectA();
++    // pub fn CredUnprotectW();
++    pub fn CredWriteA(Credential: PCREDENTIALA, Flags: DWORD) -> BOOL;
++    // pub fn CredWriteDomainCredentialsA();
++    // pub fn CredWriteDomainCredentialsW();
++    pub fn CredWriteW(Credential: PCREDENTIALW, Flags: DWORD) -> BOOL;
++    pub fn CryptAcquireContextA(
++        phProv: *mut HCRYPTPROV, szContainer: LPCSTR, szProvider: LPCSTR, dwProvType: DWORD,
++        dwFlags: DWORD,
++    ) -> BOOL;
++    pub fn CryptAcquireContextW(
++        phProv: *mut HCRYPTPROV, szContainer: LPCWSTR, szProvider: LPCWSTR, dwProvType: DWORD,
++        dwFlags: DWORD,
++    ) -> BOOL;
++    pub fn CryptContextAddRef(hProv: HCRYPTPROV, pdwReserved: *mut DWORD, dwFlags: DWORD) -> BOOL;
++    pub fn CryptCreateHash(
++        hProv: HCRYPTPROV, Algid: ALG_ID, hKey: HCRYPTKEY, dwFlags: DWORD, phHash: *mut HCRYPTHASH,
++    ) -> BOOL;
++    pub fn CryptDecrypt(
++        hKey: HCRYPTKEY, hHash: HCRYPTHASH, Final: BOOL, dwFlags: DWORD, pbData: *mut BYTE,
++        pdwDataLen: *mut DWORD,
++    ) -> BOOL;
++    pub fn CryptDeriveKey(
++        hProv: HCRYPTPROV, Algid: ALG_ID, hBaseData: HCRYPTHASH, dwFlags: DWORD,
++        phKey: *mut HCRYPTKEY,
++    ) -> BOOL;
++    pub fn CryptDestroyHash(hHash: HCRYPTHASH) -> BOOL;
++    pub fn CryptDestroyKey(hKey: HCRYPTKEY) -> BOOL;
++    pub fn CryptDuplicateHash(
++        hHash: HCRYPTHASH, pdwReserved: *mut DWORD, dwFlags: DWORD, phHash: *mut HCRYPTHASH,
++    ) -> BOOL;
++    pub fn CryptDuplicateKey(
++        hKey: HCRYPTKEY, pdwReserved: *mut DWORD, dwFlags: DWORD, phKey: *mut HCRYPTKEY,
++    ) -> BOOL;
++    pub fn CryptEncrypt(
++        hKey: HCRYPTKEY, hHash: HCRYPTHASH, Final: BOOL, dwFlags: DWORD, pbData: *mut BYTE,
++        pdwDataLen: *mut DWORD, dwBufLen: DWORD,
++    ) -> BOOL;
++    pub fn CryptEnumProviderTypesA(
++        dwIndex: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD, pdwProvType: *mut DWORD,
++        szTypeName: LPSTR, pcbTypeName: *mut DWORD,
++    ) -> BOOL;
++    pub fn CryptEnumProviderTypesW(
++        dwIndex: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD, pdwProvType: *mut DWORD,
++        szTypeName: LPWSTR, pcbTypeName: *mut DWORD,
++    ) -> BOOL;
++    pub fn CryptEnumProvidersA(
++        dwIndex: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD, pdwProvType: *mut DWORD,
++        szProvName: LPSTR, pcbProvName: *mut DWORD,
++    ) -> BOOL;
++    pub fn CryptEnumProvidersW(
++        dwIndex: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD, pdwProvType: *mut DWORD,
++        szProvName: LPWSTR, pcbProvName: *mut DWORD,
++    ) -> BOOL;
++    pub fn CryptExportKey(
++        hKey: HCRYPTKEY, hExpKey: HCRYPTKEY, dwBlobType: DWORD, dwFlags: DWORD, pbData: *mut BYTE,
++        pdwDataLen: *mut DWORD,
++    ) -> BOOL;
++    pub fn CryptGenKey(
++        hProv: HCRYPTPROV, Algid: ALG_ID, dwFlags: DWORD, phKey: *mut HCRYPTKEY,
++    ) -> BOOL;
++    pub fn CryptGenRandom(hProv: HCRYPTPROV, dwLen: DWORD, pbBuffer: *mut BYTE) -> BOOL;
++    pub fn CryptGetDefaultProviderA(
++        dwProvType: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD, pszProvName: LPSTR,
++        pcbProvName: *mut DWORD,
++    ) -> BOOL;
++    pub fn CryptGetDefaultProviderW(
++        dwProvType: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD, pszProvName: LPWSTR,
++        pcbProvName: *mut DWORD,
++    ) -> BOOL;
++    pub fn CryptGetHashParam(
++        hHash: HCRYPTHASH, dwParam: DWORD, pbData: *mut BYTE, pdwDataLen: *mut DWORD,
++        dwFlags: DWORD,
++    ) -> BOOL;
++    pub fn CryptGetKeyParam(
++        hKey: HCRYPTKEY, dwParam: DWORD, pbData: *mut BYTE, pdwDataLen: *mut DWORD, dwFlags: DWORD,
++    ) -> BOOL;
++    pub fn CryptGetProvParam(
++        hProv: HCRYPTPROV, dwParam: DWORD, pbData: *mut BYTE, pdwDataLen: *mut DWORD,
++        dwFlags: DWORD,
++    ) -> BOOL;
++    pub fn CryptGetUserKey(hProv: HCRYPTPROV, dwKeySpec: DWORD, phUserKey: *mut HCRYPTKEY) -> BOOL;
++    pub fn CryptHashData(
++        hHash: HCRYPTHASH, pbData: *const BYTE, dwDataLen: DWORD, dwFlags: DWORD,
++    ) -> BOOL;
++    pub fn CryptHashSessionKey(hHash: HCRYPTHASH, hKey: HCRYPTKEY, dwFlags: DWORD) -> BOOL;
++    pub fn CryptImportKey(
++        hProv: HCRYPTPROV, pbData: *const BYTE, dwDataLen: DWORD, hPubKey: HCRYPTKEY,
++        dwFlags: DWORD, phKey: *mut HCRYPTKEY,
++    ) -> BOOL;
++    pub fn CryptReleaseContext(hProv: HCRYPTPROV, dwFlags: DWORD) -> BOOL;
++    pub fn CryptSetHashParam(
++        hHash: HCRYPTHASH, dwParam: DWORD, pbData: *const BYTE, dwFlags: DWORD,
++    ) -> BOOL;
++    pub fn CryptSetKeyParam(
++        hKey: HCRYPTKEY, dwParam: DWORD, pbData: *const BYTE, dwFlags: DWORD,
++    ) -> BOOL;
++    pub fn CryptSetProvParam(
++        hProv: HCRYPTPROV, dwParam: DWORD, pbData: *const BYTE, dwFlags: DWORD,
++    ) -> BOOL;
++    pub fn CryptSetProviderA(pszProvName: LPCSTR, dwProvType: DWORD) -> BOOL;
++    pub fn CryptSetProviderExA(
++        pszProvName: LPCSTR, dwProvType: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD,
++    ) -> BOOL;
++    pub fn CryptSetProviderExW(
++        pszProvName: LPCWSTR, dwProvType: DWORD, pdwReserved: *mut DWORD, dwFlags: DWORD,
++    ) -> BOOL;
++    pub fn CryptSetProviderW(pszProvName: LPCWSTR, dwProvType: DWORD) -> BOOL;
++    pub fn CryptSignHashA(
++        hHash: HCRYPTHASH, dwKeySpec: DWORD, szDescription: LPCSTR, dwFlags: DWORD,
++        pbSignature: *mut BYTE, pdwSigLen: *mut DWORD,
++    ) -> BOOL;
++    pub fn CryptSignHashW(
++        hHash: HCRYPTHASH, dwKeySpec: DWORD, szDescription: LPCWSTR, dwFlags: DWORD,
++        pbSignature: *mut BYTE, pdwSigLen: *mut DWORD,
++    ) -> BOOL;
++    pub fn CryptVerifySignatureA(
++        hHash: HCRYPTHASH, pbSignature: *const BYTE, dwSigLen: DWORD, hPubKey: HCRYPTKEY,
++        szDescription: LPCSTR, dwFlags: DWORD,
++    ) -> BOOL;
++    pub fn CryptVerifySignatureW(
++        hHash: HCRYPTHASH, pbSignature: *const BYTE, dwSigLen: DWORD, hPubKey: HCRYPTKEY,
++        szDescription: LPCWSTR, dwFlags: DWORD,
++    ) -> BOOL;
++    // pub fn DecryptFileA();
++    // pub fn DecryptFileW();
++    // pub fn DeleteAce();
++    pub fn DeleteService(hService: SC_HANDLE) -> BOOL;
++    // pub fn DeregisterEventSource();
++    // pub fn DestroyPrivateObjectSecurity();
++    // pub fn DuplicateEncryptionInfoFile();
++    // pub fn DuplicateToken();
++    // pub fn DuplicateTokenEx();
++    // pub fn ElfBackupEventLogFileA();
++    // pub fn ElfBackupEventLogFileW();
++    // pub fn ElfChangeNotify();
++    // pub fn ElfClearEventLogFileA();
++    // pub fn ElfClearEventLogFileW();
++    // pub fn ElfCloseEventLog();
++    // pub fn ElfDeregisterEventSource();
++    // pub fn ElfFlushEventLog();
++    // pub fn ElfNumberOfRecords();
++    // pub fn ElfOldestRecord();
++    // pub fn ElfOpenBackupEventLogA();
++    // pub fn ElfOpenBackupEventLogW();
++    // pub fn ElfOpenEventLogA();
++    // pub fn ElfOpenEventLogW();
++    // pub fn ElfReadEventLogA();
++    // pub fn ElfReadEventLogW();
++    // pub fn ElfRegisterEventSourceA();
++    // pub fn ElfRegisterEventSourceW();
++    // pub fn ElfReportEventA();
++    // pub fn ElfReportEventAndSourceW();
++    // pub fn ElfReportEventW();
++    // pub fn EnableTrace();
++    // pub fn EnableTraceEx();
++    // pub fn EnableTraceEx2();
++    // pub fn EncryptFileA();
++    // pub fn EncryptFileW();
++    // pub fn EncryptedFileKeyInfo();
++    // pub fn EncryptionDisable();
++    // pub fn EnumDependentServicesA();
++    // pub fn EnumDependentServicesW();
++    // pub fn EnumDynamicTimeZoneInformation();
++    // pub fn EnumServiceGroupW();
++    // pub fn EnumServicesStatusA();
++    // pub fn EnumServicesStatusExA();
++    // pub fn EnumServicesStatusExW();
++    // pub fn EnumServicesStatusW();
++    // pub fn EnumerateTraceGuids();
++    // pub fn EnumerateTraceGuidsEx();
++    // pub fn EqualDomainSid();
++    // pub fn EqualPrefixSid();
++    // pub fn EqualSid();
++    // pub fn EtwLogSysConfigExtension();
++    // pub fn EventAccessControl();
++    // pub fn EventAccessQuery();
++    // pub fn EventAccessRemove();
++    // pub fn EventActivityIdControl();
++    // pub fn EventEnabled();
++    // pub fn EventProviderEnabled();
++    // pub fn EventRegister();
++    // pub fn EventSetInformation();
++    // pub fn EventUnregister();
++    // pub fn EventWrite();
++    // pub fn EventWriteEndScenario();
++    // pub fn EventWriteEx();
++    // pub fn EventWriteStartScenario();
++    // pub fn EventWriteString();
++    // pub fn EventWriteTransfer();
++    // pub fn FileEncryptionStatusA();
++    // pub fn FileEncryptionStatusW();
++    // pub fn FindFirstFreeAce();
++    // pub fn FlushEfsCache();
++    // pub fn FlushTraceA();
++    // pub fn FlushTraceW();
++    // pub fn FreeEncryptedFileKeyInfo();
++    // pub fn FreeEncryptedFileMetadata();
++    // pub fn FreeEncryptionCertificateHashList();
++    // pub fn FreeInheritedFromArray();
++    // pub fn FreeSid();
++    // pub fn GetAccessPermissionsForObjectA();
++    // pub fn GetAccessPermissionsForObjectW();
++    // pub fn GetAce();
++    // pub fn GetAclInformation();
++    // pub fn GetAuditedPermissionsFromAclA();
++    // pub fn GetAuditedPermissionsFromAclW();
++    pub fn GetCurrentHwProfileA(lpHwProfileInfo: LPHW_PROFILE_INFOA) -> BOOL;
++    pub fn GetCurrentHwProfileW(lpHwProfileInfo: LPHW_PROFILE_INFOW) -> BOOL;
++    // pub fn GetDynamicTimeZoneInformationEffectiveYears();
++    // pub fn GetEffectiveRightsFromAclA();
++    // pub fn GetEffectiveRightsFromAclW();
++    // pub fn GetEncryptedFileMetadata();
++    // pub fn GetEventLogInformation();
++    // pub fn GetExplicitEntriesFromAclA();
++    // pub fn GetExplicitEntriesFromAclW();
++    // pub fn GetFileSecurityA();
++    // pub fn GetFileSecurityW();
++    // pub fn GetInformationCodeAuthzLevelW();
++    // pub fn GetInformationCodeAuthzPolicyW();
++    // pub fn GetInheritanceSourceA();
++    // pub fn GetInheritanceSourceW();
++    // pub fn GetKernelObjectSecurity();
++    // pub fn GetLengthSid();
++    // pub fn GetLocalManagedApplicationData();
++    // pub fn GetLocalManagedApplications();
++    // pub fn GetManagedApplicationCategories();
++    // pub fn GetManagedApplications();
++    // pub fn GetMultipleTrusteeA();
++    // pub fn GetMultipleTrusteeOperationA();
++    // pub fn GetMultipleTrusteeOperationW();
++    // pub fn GetMultipleTrusteeW();
++    // pub fn GetNamedSecurityInfoA();
++    // pub fn GetNamedSecurityInfoExA();
++    // pub fn GetNamedSecurityInfoExW();
++    // pub fn GetNamedSecurityInfoW();
++    // pub fn GetNumberOfEventLogRecords();
++    // pub fn GetOldestEventLogRecord();
++    // pub fn GetOverlappedAccessResults();
++    // pub fn GetPrivateObjectSecurity();
++    // pub fn GetSecurityDescriptorControl();
++    // pub fn GetSecurityDescriptorDacl();
++    // pub fn GetSecurityDescriptorGroup();
++    // pub fn GetSecurityDescriptorLength();
++    // pub fn GetSecurityDescriptorOwner();
++    // pub fn GetSecurityDescriptorRMControl();
++    // pub fn GetSecurityDescriptorSacl();
++    // pub fn GetSecurityInfo();
++    // pub fn GetSecurityInfoExA();
++    // pub fn GetSecurityInfoExW();
++    // pub fn GetServiceDisplayNameA();
++    // pub fn GetServiceDisplayNameW();
++    // pub fn GetServiceKeyNameA();
++    // pub fn GetServiceKeyNameW();
++    // pub fn GetSidIdentifierAuthority();
++    // pub fn GetSidLengthRequired();
++    // pub fn GetSidSubAuthority();
++    // pub fn GetSidSubAuthorityCount();
++    // pub fn GetStringConditionFromBinary();
++    // pub fn GetThreadWaitChain();
++    // pub fn GetTokenInformation();
++    // pub fn GetTraceEnableFlags();
++    // pub fn GetTraceEnableLevel();
++    // pub fn GetTraceLoggerHandle();
++    // pub fn GetTrusteeFormA();
++    // pub fn GetTrusteeFormW();
++    // pub fn GetTrusteeNameA();
++    // pub fn GetTrusteeNameW();
++    // pub fn GetTrusteeTypeA();
++    // pub fn GetTrusteeTypeW();
++    pub fn GetUserNameA(lpBuffer: LPSTR, pcbBuffer: LPDWORD) -> BOOL;
++    pub fn GetUserNameW(lpBuffer: LPWSTR, pcbBuffer: LPDWORD) -> BOOL;
++    // pub fn GetWindowsAccountDomainSid();
++    // pub fn I_ScSetServiceBitsA();
++    // pub fn I_ScSetServiceBitsW();
++    // pub fn IdentifyCodeAuthzLevelW();
++    // pub fn ImpersonateAnonymousToken();
++    // pub fn ImpersonateLoggedOnUser();
++    // pub fn ImpersonateNamedPipeClient();
++    // pub fn ImpersonateSelf();
++    // pub fn InitializeAcl();
++    // pub fn InitializeSecurityDescriptor();
++    // pub fn InitializeSid();
++    // pub fn InitiateShutdownA();
++    // pub fn InitiateShutdownW();
++    // pub fn InitiateSystemShutdownA();
++    // pub fn InitiateSystemShutdownExA();
++    // pub fn InitiateSystemShutdownExW();
++    // pub fn InitiateSystemShutdownW();
++    // pub fn InstallApplication();
++    // pub fn IsTextUnicode();
++    // pub fn IsTokenRestricted();
++    // pub fn IsTokenUntrusted();
++    // pub fn IsValidAcl();
++    // pub fn IsValidRelativeSecurityDescriptor();
++    // pub fn IsValidSecurityDescriptor();
++    // pub fn IsValidSid();
++    // pub fn IsWellKnownSid();
++    // pub fn LockServiceDatabase();
++    // pub fn LogonUserA();
++    // pub fn LogonUserExA();
++    // pub fn LogonUserExExW();
++    // pub fn LogonUserExW();
++    // pub fn LogonUserW();
++    // pub fn LookupAccountNameA();
++    // pub fn LookupAccountNameW();
++    // pub fn LookupAccountSidA();
++    // pub fn LookupAccountSidW();
++    // pub fn LookupPrivilegeDisplayNameA();
++    // pub fn LookupPrivilegeDisplayNameW();
++    pub fn LookupPrivilegeNameA(
++        lpSystemName: LPCSTR, lpLuid: PLUID, lpName: LPSTR, cchName: LPDWORD,
++    ) -> BOOL;
++    pub fn LookupPrivilegeNameW(
++        lpSystemName: LPCWSTR, lpLuid: PLUID, lpName: LPWSTR, cchName: LPDWORD,
++    ) -> BOOL;
++    pub fn LookupPrivilegeValueA(
++        lpSystemName: LPCSTR, lpName: LPCSTR, lpLuid: PLUID,
++    ) -> BOOL;
++    pub fn LookupPrivilegeValueW(
++        lpSystemName: LPCWSTR, lpName: LPCWSTR, lpLuid: PLUID,
++    ) -> BOOL;
++    // pub fn LookupSecurityDescriptorPartsA();
++    // pub fn LookupSecurityDescriptorPartsW();
++    // pub fn LsaAddAccountRights();
++    // pub fn LsaAddPrivilegesToAccount();
++    // pub fn LsaClearAuditLog();
++    // pub fn LsaClose();
++    // pub fn LsaCreateAccount();
++    // pub fn LsaCreateSecret();
++    // pub fn LsaCreateTrustedDomain();
++    // pub fn LsaCreateTrustedDomainEx();
++    // pub fn LsaDelete();
++    // pub fn LsaDeleteTrustedDomain();
++    // pub fn LsaEnumerateAccountRights();
++    // pub fn LsaEnumerateAccounts();
++    // pub fn LsaEnumerateAccountsWithUserRight();
++    // pub fn LsaEnumeratePrivileges();
++    // pub fn LsaEnumeratePrivilegesOfAccount();
++    // pub fn LsaEnumerateTrustedDomains();
++    // pub fn LsaEnumerateTrustedDomainsEx();
++    // pub fn LsaFreeMemory();
++    // pub fn LsaGetAppliedCAPIDs();
++    // pub fn LsaGetQuotasForAccount();
++    // pub fn LsaGetRemoteUserName();
++    // pub fn LsaGetSystemAccessAccount();
++    // pub fn LsaGetUserName();
++    // pub fn LsaICLookupNames();
++    // pub fn LsaICLookupNamesWithCreds();
++    // pub fn LsaICLookupSids();
++    // pub fn LsaICLookupSidsWithCreds();
++    // pub fn LsaLookupNames();
++    // pub fn LsaLookupNames2();
++    // pub fn LsaLookupPrivilegeDisplayName();
++    // pub fn LsaLookupPrivilegeName();
++    // pub fn LsaLookupPrivilegeValue();
++    // pub fn LsaLookupSids();
++    // pub fn LsaLookupSids2();
++    // pub fn LsaManageSidNameMapping();
++    // pub fn LsaNtStatusToWinError();
++    // pub fn LsaOpenAccount();
++    // pub fn LsaOpenPolicy();
++    // pub fn LsaOpenPolicySce();
++    // pub fn LsaOpenSecret();
++    // pub fn LsaOpenTrustedDomain();
++    // pub fn LsaOpenTrustedDomainByName();
++    // pub fn LsaQueryCAPs();
++    // pub fn LsaQueryDomainInformationPolicy();
++    // pub fn LsaQueryForestTrustInformation();
++    // pub fn LsaQueryInfoTrustedDomain();
++    // pub fn LsaQueryInformationPolicy();
++    // pub fn LsaQuerySecret();
++    // pub fn LsaQuerySecurityObject();
++    // pub fn LsaQueryTrustedDomainInfo();
++    // pub fn LsaQueryTrustedDomainInfoByName();
++    // pub fn LsaRemoveAccountRights();
++    // pub fn LsaRemovePrivilegesFromAccount();
++    // pub fn LsaRetrievePrivateData();
++    // pub fn LsaSetCAPs();
++    // pub fn LsaSetDomainInformationPolicy();
++    // pub fn LsaSetForestTrustInformation();
++    // pub fn LsaSetInformationPolicy();
++    // pub fn LsaSetInformationTrustedDomain();
++    // pub fn LsaSetQuotasForAccount();
++    // pub fn LsaSetSecret();
++    // pub fn LsaSetSecurityObject();
++    // pub fn LsaSetSystemAccessAccount();
++    // pub fn LsaSetTrustedDomainInfoByName();
++    // pub fn LsaSetTrustedDomainInformation();
++    // pub fn LsaStorePrivateData();
++    // pub fn MIDL_user_free_Ext();
++    // pub fn MSChapSrvChangePassword();
++    // pub fn MSChapSrvChangePassword2();
++    // pub fn MakeAbsoluteSD();
++    // pub fn MakeAbsoluteSD2();
++    // pub fn MakeSelfRelativeSD();
++    // pub fn MapGenericMask();
++    // pub fn NotifyBootConfigStatus();
++    // pub fn NotifyChangeEventLog();
++    // pub fn NotifyServiceStatusChange();
++    // pub fn NotifyServiceStatusChangeA();
++    // pub fn NotifyServiceStatusChangeW();
++    // pub fn ObjectCloseAuditAlarmA();
++    // pub fn ObjectCloseAuditAlarmW();
++    // pub fn ObjectDeleteAuditAlarmA();
++    // pub fn ObjectDeleteAuditAlarmW();
++    // pub fn ObjectOpenAuditAlarmA();
++    // pub fn ObjectOpenAuditAlarmW();
++    // pub fn ObjectPrivilegeAuditAlarmA();
++    // pub fn ObjectPrivilegeAuditAlarmW();
++    // pub fn OpenBackupEventLogA();
++    // pub fn OpenBackupEventLogW();
++    // pub fn OpenEncryptedFileRawA();
++    // pub fn OpenEncryptedFileRawW();
++    // pub fn OpenEventLogA();
++    // pub fn OpenEventLogW();
++    pub fn OpenProcessToken(
++        ProcessHandle: HANDLE, DesiredAccess: DWORD, TokenHandle: PHANDLE,
++    ) -> BOOL;
++    pub fn OpenSCManagerA(
++        lpMachineName: LPCSTR, lpDatabaseName: LPCSTR, dwDesiredAccess: DWORD,
++    ) -> SC_HANDLE;
++    pub fn OpenSCManagerW(
++        lpMachineName: LPCWSTR, lpDatabaseName: LPCWSTR, dwDesiredAccess: DWORD,
++    ) -> SC_HANDLE;
++    pub fn OpenServiceA(
++        hSCManager: SC_HANDLE, lpServiceName: LPCSTR, dwDesiredAccess: DWORD,
++    ) -> SC_HANDLE;
++    pub fn OpenServiceW(
++        hSCManager: SC_HANDLE, lpServiceName: LPCWSTR, dwDesiredAccess: DWORD,
++    ) -> SC_HANDLE;
++    // pub fn OpenThreadToken();
++    // pub fn OpenThreadWaitChainSession();
++    // pub fn OpenTraceA();
++    // pub fn OpenTraceW();
++    // pub fn OperationEnd();
++    // pub fn OperationStart();
++    // pub fn PerfAddCounters();
++    // pub fn PerfCloseQueryHandle();
++    // pub fn PerfCreateInstance();
++    // pub fn PerfDecrementULongCounterValue();
++    // pub fn PerfDecrementULongLongCounterValue();
++    // pub fn PerfDeleteCounters();
++    // pub fn PerfDeleteInstance();
++    // pub fn PerfEnumerateCounterSet();
++    // pub fn PerfEnumerateCounterSetInstances();
++    // pub fn PerfIncrementULongCounterValue();
++    // pub fn PerfIncrementULongLongCounterValue();
++    // pub fn PerfOpenQueryHandle();
++    // pub fn PerfQueryCounterData();
++    // pub fn PerfQueryCounterInfo();
++    // pub fn PerfQueryCounterSetRegistrationInfo();
++    // pub fn PerfQueryInstance();
++    // pub fn PerfRegCloseKey();
++    // pub fn PerfRegEnumKey();
++    // pub fn PerfRegEnumValue();
++    // pub fn PerfRegQueryInfoKey();
++    // pub fn PerfRegQueryValue();
++    // pub fn PerfRegSetValue();
++    // pub fn PerfSetCounterRefValue();
++    // pub fn PerfSetCounterSetInfo();
++    // pub fn PerfSetULongCounterValue();
++    // pub fn PerfSetULongLongCounterValue();
++    // pub fn PerfStartProvider();
++    // pub fn PerfStartProviderEx();
++    // pub fn PerfStopProvider();
++    // pub fn PrivilegeCheck();
++    // pub fn PrivilegedServiceAuditAlarmA();
++    // pub fn PrivilegedServiceAuditAlarmW();
++    // pub fn ProcessTrace();
++    // pub fn QueryAllTracesA();
++    // pub fn QueryAllTracesW();
++    // pub fn QueryRecoveryAgentsOnEncryptedFile();
++    // pub fn QuerySecurityAccessMask();
++    // pub fn QueryServiceConfig2A();
++    // pub fn QueryServiceConfig2W();
++    // pub fn QueryServiceConfigA();
++    // pub fn QueryServiceConfigW();
++    // pub fn QueryServiceDynamicInformation();
++    // pub fn QueryServiceLockStatusA();
++    // pub fn QueryServiceLockStatusW();
++    // pub fn QueryServiceObjectSecurity();
++    pub fn QueryServiceStatus(hService: SC_HANDLE, lpServiceStatus: LPSERVICE_STATUS) -> BOOL;
++    pub fn QueryServiceStatusEx(
++        hService: SC_HANDLE, InfoLevel: SC_STATUS_TYPE, lpBuffer: LPBYTE, cbBufSize: DWORD,
++        pcbBytesNeeded: LPDWORD,
++    ) -> BOOL;
++    // pub fn QueryTraceA();
++    // pub fn QueryTraceW();
++    // pub fn QueryUsersOnEncryptedFile();
++    // pub fn ReadEncryptedFileRaw();
++    // pub fn ReadEventLogA();
++    // pub fn ReadEventLogW();
++    pub fn RegCloseKey(hKey: HKEY) -> LONG;
++    pub fn RegConnectRegistryA(lpMachineName: LPCSTR, hKey: HKEY, phkResult: PHKEY) -> LONG;
++    // pub fn RegConnectRegistryExA();
++    // pub fn RegConnectRegistryExW();
++    pub fn RegConnectRegistryW(lpMachineName: LPCWSTR, hKey: HKEY, phkResult: PHKEY) -> LONG;
++    pub fn RegCopyTreeA(hKeySrc: HKEY, lpSubKey: LPCSTR, hKeyDest: HKEY) -> LONG;
++    pub fn RegCopyTreeW(hKeySrc: HKEY, lpSubKey: LPCWSTR, hKeyDest: HKEY) -> LONG;
++    // pub fn RegCreateKeyA();
++    pub fn RegCreateKeyExA(
++        hKey: HKEY, lpSubKey: LPCSTR, Reserved: DWORD, lpClass: LPSTR, dwOptions: DWORD,
++        samDesired: REGSAM, lpSecurityAttributes: LPSECURITY_ATTRIBUTES, phkResult: PHKEY,
++        lpdwDisposition: LPDWORD,
++    ) -> LONG;
++    pub fn RegCreateKeyExW(
++        hKey: HKEY, lpSubKey: LPCWSTR, Reserved: DWORD, lpClass: LPWSTR, dwOptions: DWORD,
++        samDesired: REGSAM, lpSecurityAttributes: LPSECURITY_ATTRIBUTES, phkResult: PHKEY,
++        lpdwDisposition: LPDWORD,
++    ) -> LONG;
++    pub fn RegCreateKeyTransactedA(
++        hKey: HKEY, lpSubKey: LPCSTR, Reserved: DWORD, lpClass: LPSTR, dwOptions: DWORD,
++        samDesired: REGSAM, lpSecurityAttributes: LPSECURITY_ATTRIBUTES, phkResult: PHKEY,
++        lpdwDisposition: LPDWORD, hTransaction: HANDLE, pExtendedParemeter: PVOID,
++    ) -> LONG;
++    pub fn RegCreateKeyTransactedW(
++        hKey: HKEY, lpSubKey: LPCWSTR, Reserved: DWORD, lpClass: LPWSTR, dwOptions: DWORD,
++        samDesired: REGSAM, lpSecurityAttributes: LPSECURITY_ATTRIBUTES, phkResult: PHKEY,
++        lpdwDisposition: LPDWORD, hTransaction: HANDLE, pExtendedParemeter: PVOID,
++    ) -> LONG;
++    // pub fn RegCreateKeyW();
++    pub fn RegDeleteKeyA(hKey: HKEY, lpSubKey: LPCSTR) -> LONG;
++    pub fn RegDeleteKeyExA(
++        hKey: HKEY, lpSubKey: LPCSTR, samDesired: REGSAM, Reserved: DWORD,
++    ) -> LONG;
++    pub fn RegDeleteKeyExW(
++        hKey: HKEY, lpSubKey: LPCWSTR, samDesired: REGSAM, Reserved: DWORD,
++    ) -> LONG;
++    pub fn RegDeleteKeyTransactedA(
++        hKey: HKEY, lpSubKey: LPCSTR, samDesired: REGSAM, Reserved: DWORD,
++        hTransaction: HANDLE, pExtendedParemeter: PVOID,
++    ) -> LONG;
++    pub fn RegDeleteKeyTransactedW(
++        hKey: HKEY, lpSubKey: LPCWSTR, samDesired: REGSAM, Reserved: DWORD,
++        hTransaction: HANDLE, pExtendedParemeter: PVOID,
++    ) -> LONG;
++    pub fn RegDeleteKeyValueA(hKey: HKEY, lpSubKey: LPCSTR, lpValueName: LPCSTR) -> LONG;
++    pub fn RegDeleteKeyValueW(hKey: HKEY, lpSubKey: LPCWSTR, lpValueName: LPCWSTR) -> LONG;
++    pub fn RegDeleteKeyW(hKey: HKEY, lpSubKey: LPCWSTR) -> LONG;
++    pub fn RegDeleteTreeA(hKey: HKEY, lpSubKey: LPCSTR) -> LONG;
++    pub fn RegDeleteTreeW(hKey: HKEY, lpSubKey: LPCWSTR) -> LONG;
++    pub fn RegDeleteValueA(hKey: HKEY, lpValueName: LPCSTR) -> LONG;
++    pub fn RegDeleteValueW(hKey: HKEY, lpValueName: LPCWSTR) -> LONG;
++    pub fn RegDisablePredefinedCache() -> LONG;
++    pub fn RegDisablePredefinedCacheEx() -> LONG;
++    pub fn RegDisableReflectionKey(hBase: HKEY) -> LONG;
++    pub fn RegEnableReflectionKey(hBase: HKEY) -> LONG;
++    // pub fn RegEnumKeyA();
++    pub fn RegEnumKeyExA(
++        hKey: HKEY, dwIndex: DWORD, lpName: LPSTR, lpcName: LPDWORD, lpReserved: LPDWORD,
++        lpClass: LPSTR, lpcClass: LPDWORD, lpftLastWriteTime: PFILETIME,
++    ) -> LONG;
++    pub fn RegEnumKeyExW(
++        hKey: HKEY, dwIndex: DWORD, lpName: LPWSTR, lpcName: LPDWORD, lpReserved: LPDWORD,
++        lpClass: LPWSTR, lpcClass: LPDWORD, lpftLastWriteTime: PFILETIME,
++    ) -> LONG;
++    // pub fn RegEnumKeyW();
++    pub fn RegEnumValueA(
++        hKey: HKEY, dwIndex: DWORD, lpValueName: LPSTR, lpcchValueName: LPDWORD,
++        lpReserved: LPDWORD, lpType: LPDWORD, lpData: LPBYTE, lpcbData: LPDWORD,
++    ) -> LONG;
++    pub fn RegEnumValueW(
++        hKey: HKEY, dwIndex: DWORD, lpValueName: LPWSTR, lpcchValueName: LPDWORD,
++        lpReserved: LPDWORD, lpType: LPDWORD, lpData: LPBYTE, lpcbData: LPDWORD,
++    ) -> LONG;
++    pub fn RegFlushKey(hKey: HKEY) -> LONG;
++    // pub fn RegGetKeySecurity();
++    pub fn RegGetValueA(
++        hkey: HKEY, lpSubKey: LPCSTR, lpValue: LPCSTR, dwFlags: DWORD, pdwType: LPDWORD,
++        pvData: PVOID, pcbData: LPDWORD,
++    ) -> LONG;
++    pub fn RegGetValueW(
++        hkey: HKEY, lpSubKey: LPCWSTR, lpValue: LPCWSTR, dwFlags: DWORD, pdwType: LPDWORD,
++        pvData: PVOID, pcbData: LPDWORD,
++    ) -> LONG;
++    // pub fn RegLoadAppKeyA();
++    // pub fn RegLoadAppKeyW();
++    // pub fn RegLoadKeyA();
++    // pub fn RegLoadKeyW();
++    // pub fn RegLoadMUIStringA();
++    pub fn RegLoadMUIStringW(
++        hKey: HKEY, pszValue: LPCWSTR, pszOutBuf: LPWSTR, cbOutBuf: DWORD, pcbData: LPDWORD,
++        Flags: DWORD, pszDirectory: LPCWSTR,
++    ) -> LONG;
++    pub fn RegNotifyChangeKeyValue(
++        hKey: HKEY, bWatchSubtree: BOOL, dwNotifyFilter: DWORD, hEvent: HANDLE,
++        fAsynchronous: BOOL,
++    ) -> LONG;
++    pub fn RegOpenCurrentUser(samDesired: REGSAM, phkResult: PHKEY) -> LONG;
++    // pub fn RegOpenKeyA();
++    pub fn RegOpenKeyExA(
++        hKey: HKEY, lpSubKey: LPCSTR, ulOptions: DWORD, samDesired: REGSAM, phkResult: PHKEY,
++    ) -> LONG;
++    pub fn RegOpenKeyExW(
++        hKey: HKEY, lpSubKey: LPCWSTR, ulOptions: DWORD, samDesired: REGSAM, phkResult: PHKEY,
++    ) -> LONG;
++    pub fn RegOpenKeyTransactedA(
++        hKey: HKEY, lpSubKey: LPCSTR, ulOptions: DWORD, samDesired: REGSAM, phkResult: PHKEY,
++        hTransaction: HANDLE, pExtendedParemeter: PVOID,
++    ) -> LONG;
++    pub fn RegOpenKeyTransactedW(
++        hKey: HKEY, lpSubKey: LPCWSTR, ulOptions: DWORD, samDesired: REGSAM, phkResult: PHKEY,
++        hTransaction: HANDLE, pExtendedParemeter: PVOID,
++    ) -> LONG;
++    // pub fn RegOpenKeyW();
++    pub fn RegOpenUserClassesRoot(
++        hToken: HANDLE, dwOptions: DWORD, samDesired: REGSAM, phkResult: PHKEY,
++    ) -> LONG;
++    pub fn RegOverridePredefKey(hKey: HKEY, hNewHKey: HKEY) -> LONG;
++    pub fn RegQueryInfoKeyA(
++        hKey: HKEY, lpClass: LPSTR, lpcClass: LPDWORD, lpReserved: LPDWORD, lpcSubKeys: LPDWORD,
++        lpcMaxSubKeyLen: LPDWORD, lpcMaxClassLen: LPDWORD, lpcValues: LPDWORD,
++        lpcMaxValueNameLen: LPDWORD, lpcMaxValueLen: LPDWORD, lpcbSecurityDescriptor: LPDWORD,
++        lpftLastWriteTime: PFILETIME,
++    ) -> LONG;
++    pub fn RegQueryInfoKeyW(
++        hKey: HKEY, lpClass: LPWSTR, lpcClass: LPDWORD, lpReserved: LPDWORD, lpcSubKeys: LPDWORD,
++        lpcMaxSubKeyLen: LPDWORD, lpcMaxClassLen: LPDWORD, lpcValues: LPDWORD,
++        lpcMaxValueNameLen: LPDWORD, lpcMaxValueLen: LPDWORD, lpcbSecurityDescriptor: LPDWORD,
++        lpftLastWriteTime: PFILETIME,
++    ) -> LONG;
++    pub fn RegQueryMultipleValuesA(
++        hKey: HKEY, val_list: PVALENTA, num_vals: DWORD, lpValueBuf: LPSTR, ldwTotsize: LPDWORD,
++    ) -> LONG;
++    pub fn RegQueryMultipleValuesW(
++        hKey: HKEY, val_list: PVALENTW, num_vals: DWORD, lpValueBuf: LPWSTR, ldwTotsize: LPDWORD,
++    ) -> LONG;
++    pub fn RegQueryReflectionKey(hBase: HKEY, bIsReflectionDisabled: PBOOL) -> LONG;
++    pub fn RegQueryValueExA(
++        hKey: HKEY, lpValueName: LPCSTR, lpReserved: LPDWORD, lpType: LPDWORD, lpData: LPBYTE,
++        lpcbData: LPDWORD,
++    ) -> LONG;
++    pub fn RegQueryValueExW(
++        hKey: HKEY, lpValueName: LPCWSTR, lpReserved: LPDWORD, lpType: LPDWORD, lpData: LPBYTE,
++        lpcbData: LPDWORD,
++    ) -> LONG;
++    // pub fn RegQueryValueW();
++    // pub fn RegRenameKey();
++    // pub fn RegReplaceKeyA();
++    // pub fn RegReplaceKeyW();
++    // pub fn RegRestoreKeyA();
++    // pub fn RegRestoreKeyW();
++    // pub fn RegSaveKeyA();
++    // pub fn RegSaveKeyExA();
++    // pub fn RegSaveKeyExW();
++    // pub fn RegSaveKeyW();
++    // pub fn RegSetKeySecurity();
++    pub fn RegSetKeyValueA(
++        hKey: HKEY, lpSubKey: LPCSTR, lpValueName: LPCSTR, dwType: DWORD, lpData: LPCVOID,
++        cbData: DWORD,
++    ) -> LONG;
++    pub fn RegSetValueExA(
++        hKey: HKEY, lpValueName: LPCSTR, Reserved: DWORD, dwType: DWORD, lpData: *const BYTE,
++        cbData: DWORD,
++    ) -> LONG;
++    pub fn RegSetValueExW(
++        hKey: HKEY, lpValueName: LPCWSTR, Reserved: DWORD, dwType: DWORD, lpData: *const BYTE,
++        cbData: DWORD,
++    ) -> LONG;
++    pub fn RegSetKeyValueW(
++        hKey: HKEY, lpSubKey: LPCWSTR, lpValueName: LPCWSTR, dwType: DWORD, lpData: LPCVOID,
++        cbData: DWORD,
++    ) -> LONG;
++    // pub fn RegUnLoadKeyA();
++    // pub fn RegUnLoadKeyW();
++    // pub fn RegisterEventSourceA();
++    // pub fn RegisterEventSourceW();
++    pub fn RegisterServiceCtrlHandlerA(
++        lpServiceName: LPCSTR, lpHandlerProc: LPHANDLER_FUNCTION,
++    ) -> SERVICE_STATUS_HANDLE;
++    pub fn RegisterServiceCtrlHandlerExA(
++        lpServiceName: LPCSTR, lpHandlerProc: LPHANDLER_FUNCTION_EX, lpContext: LPVOID,
++    ) -> SERVICE_STATUS_HANDLE;
++    pub fn RegisterServiceCtrlHandlerExW(
++        lpServiceName: LPCWSTR, lpHandlerProc: LPHANDLER_FUNCTION_EX, lpContext: LPVOID,
++    ) -> SERVICE_STATUS_HANDLE;
++    pub fn RegisterServiceCtrlHandlerW(
++        lpServiceName: LPCWSTR, lpHandlerProc: LPHANDLER_FUNCTION,
++    ) -> SERVICE_STATUS_HANDLE;
++    // pub fn RegisterTraceGuidsA();
++    // pub fn RegisterTraceGuidsW();
++    // pub fn RegisterWaitChainCOMCallback();
++    // pub fn RemoteRegEnumKeyWrapper();
++    // pub fn RemoteRegEnumValueWrapper();
++    // pub fn RemoteRegQueryInfoKeyWrapper();
++    // pub fn RemoteRegQueryValueWrapper();
++    // pub fn RemoveTraceCallback();
++    // pub fn RemoveUsersFromEncryptedFile();
++    // pub fn ReportEventA();
++    // pub fn ReportEventW();
++    // pub fn RevertToSelf();
++    // pub fn SafeBaseRegGetKeySecurity();
++    // pub fn SaferCloseLevel();
++    // pub fn SaferComputeTokenFromLevel();
++    // pub fn SaferCreateLevel();
++    // pub fn SaferGetLevelInformation();
++    // pub fn SaferGetPolicyInformation();
++    // pub fn SaferIdentifyLevel();
++    // pub fn SaferRecordEventLogEntry();
++    // pub fn SaferSetLevelInformation();
++    // pub fn SaferSetPolicyInformation();
++    // pub fn SaferiIsExecutableFileType();
++    // pub fn SetAclInformation();
++    // pub fn SetEncryptedFileMetadata();
++    // pub fn SetEntriesInAccessListA();
++    // pub fn SetEntriesInAccessListW();
++    // pub fn SetEntriesInAclA();
++    // pub fn SetEntriesInAclW();
++    // pub fn SetEntriesInAuditListA();
++    // pub fn SetEntriesInAuditListW();
++    // pub fn SetFileSecurityA();
++    // pub fn SetFileSecurityW();
++    // pub fn SetInformationCodeAuthzLevelW();
++    // pub fn SetInformationCodeAuthzPolicyW();
++    // pub fn SetKernelObjectSecurity();
++    // pub fn SetNamedSecurityInfoA();
++    // pub fn SetNamedSecurityInfoExA();
++    // pub fn SetNamedSecurityInfoExW();
++    // pub fn SetNamedSecurityInfoW();
++    // pub fn SetPrivateObjectSecurity();
++    // pub fn SetPrivateObjectSecurityEx();
++    // pub fn SetSecurityAccessMask();
++    // pub fn SetSecurityDescriptorControl();
++    // pub fn SetSecurityDescriptorDacl();
++    // pub fn SetSecurityDescriptorGroup();
++    // pub fn SetSecurityDescriptorOwner();
++    // pub fn SetSecurityDescriptorRMControl();
++    // pub fn SetSecurityDescriptorSacl();
++    // pub fn SetSecurityInfo();
++    // pub fn SetSecurityInfoExA();
++    // pub fn SetSecurityInfoExW();
++    // pub fn SetServiceBits();
++    // pub fn SetServiceObjectSecurity();
++    pub fn SetServiceStatus(
++        hServiceStatus: SERVICE_STATUS_HANDLE, lpServiceStatus: LPSERVICE_STATUS,
++    ) -> BOOL;
++    // pub fn SetThreadToken();
++    // pub fn SetTokenInformation();
++    // pub fn SetTraceCallback();
++    // pub fn SetUserFileEncryptionKey();
++    // pub fn SetUserFileEncryptionKeyEx();
++    // pub fn StartServiceA();
++    pub fn StartServiceCtrlDispatcherA(lpServiceStartTable: *const SERVICE_TABLE_ENTRYA) -> BOOL;
++    pub fn StartServiceCtrlDispatcherW(lpServiceStartTable: *const SERVICE_TABLE_ENTRYW) -> BOOL;
++    // pub fn StartServiceW();
++    // pub fn StartTraceA();
++    // pub fn StartTraceW();
++    // pub fn StopTraceA();
++    // pub fn StopTraceW();
++    // pub fn SystemFunction001();
++    // pub fn SystemFunction002();
++    // pub fn SystemFunction003();
++    // pub fn SystemFunction004();
++    // pub fn SystemFunction005();
++    // pub fn SystemFunction006();
++    // pub fn SystemFunction007();
++    // pub fn SystemFunction008();
++    // pub fn SystemFunction009();
++    // pub fn SystemFunction010();
++    // pub fn SystemFunction011();
++    // pub fn SystemFunction012();
++    // pub fn SystemFunction013();
++    // pub fn SystemFunction014();
++    // pub fn SystemFunction015();
++    // pub fn SystemFunction016();
++    // pub fn SystemFunction017();
++    // pub fn SystemFunction018();
++    // pub fn SystemFunction019();
++    // pub fn SystemFunction020();
++    // pub fn SystemFunction021();
++    // pub fn SystemFunction022();
++    // pub fn SystemFunction023();
++    // pub fn SystemFunction024();
++    // pub fn SystemFunction025();
++    // pub fn SystemFunction026();
++    // pub fn SystemFunction027();
++    // pub fn SystemFunction028();
++    // pub fn SystemFunction029();
++    // pub fn SystemFunction030();
++    // pub fn SystemFunction031();
++    // pub fn SystemFunction032();
++    // pub fn SystemFunction033();
++    // pub fn SystemFunction034();
++    // pub fn SystemFunction036();
++    // pub fn SystemFunction040();
++    // pub fn SystemFunction041();
++    // pub fn TraceEvent();
++    // pub fn TraceEventInstance();
++    // pub fn TraceMessage();
++    // pub fn TraceMessageVa();
++    // pub fn TraceQueryInformation();
++    // pub fn TraceSetInformation();
++    // pub fn TreeResetNamedSecurityInfoA();
++    // pub fn TreeResetNamedSecurityInfoW();
++    // pub fn TreeSetNamedSecurityInfoA();
++    // pub fn TreeSetNamedSecurityInfoW();
++    // pub fn TrusteeAccessToObjectA();
++    // pub fn TrusteeAccessToObjectW();
++    // pub fn UninstallApplication();
++    // pub fn UnlockServiceDatabase();
++    // pub fn UnregisterTraceGuids();
++    // pub fn UpdateTraceA();
++    // pub fn UpdateTraceW();
++    // pub fn UsePinForEncryptedFilesA();
++    // pub fn UsePinForEncryptedFilesW();
++    // pub fn WaitServiceState();
++    // pub fn WriteEncryptedFileRaw();
++}
index ba22bdbd851ded585dbff2111be9ca62b85bb011,0000000000000000000000000000000000000000..aee687767ec3c33539e2a5d1cb63d923bf89c110
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"ced7672565c96096f95c76aa9cd1b8e11bd7d933da39850cf6329f8873d4ec18","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"b8e416e5dc607e42bf37fd81cac8978f0ff7ffaa23e64b953f388b0319734ffb","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","Makefile":"a45a128685a2ae7d4fa39d310786674417ee113055ef290a11f88002285865fc","README.md":"9bc60d2cec222b50f87c85cf9475349bb228a36f89796c5d6481c52560ddde3a","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","benches/bench.rs":"acf4844efadeafc7bc396c2b16f2a184e140b6c17d1084dbaf454196de2090cd","benches/random.txt":"9386fb3efedc7ffbd09fb49088347f1056bc2d90a861009fa2f804cdb714efcb","benches/sherlock.txt":"242ec73a70f0a03dcbe007e32038e7deeaee004aaec9a09a07fa322743440fa8","ctags.rust":"3d128d3cc59f702e68953ba2fe6c3f46bc6991fc575308db060482d5da0c79f3","examples/dict-search.rs":"30eb44b1a0b599507db4c23a90f74199faabc64a8ae1d603ecdf3bba7428eb1e","session.vim":"95cb1d7caf0ff7fbe76ec911988d908ddd883381c925ba64b537695bc9f021c4","src/autiter.rs":"dc8817af24825c356842c814d771868fb07b6965addf4780e8b9dea9718344a0","src/full.rs":"b83a9c8ff3ef611c316b68650915df2d7f361a49b59dab103dc2c5476f2d8303","src/lib.rs":"68bf2ed02d58bebee6f7f7579038f1e4b60a2c4acc334263cb837bcbe15ffe94","src/main.rs":"fc867cb5f0b02d0f49ecab06b72c05a247cbcf3bf9228c235de8e787bda7bef5"},"package":"ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"}
++{"files":{},"package":"ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d24edbd878654bdd87ebf388b33296131ad53acb
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,9 @@@
++.*.swp
++doc
++tags
++examples/ss10pusa.csv
++build
++target
++Cargo.lock
++scratch*
++bench_large/huge
index 8058957a48cb2135c35c927aaf8ebcaa17020a48,0000000000000000000000000000000000000000..0d4c8db82ff869946bc5e271722089f4beb03acf
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"e17babe5ba0bdd19ec59a37b4a099fd4313bff58be63a2ff506075f9a97dc172","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"b3fa06c2147a4749cd984ded69024ddcc8b7d578ab763b60227b3ba474c3ec70","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","Makefile":"a45a128685a2ae7d4fa39d310786674417ee113055ef290a11f88002285865fc","README.md":"9bc60d2cec222b50f87c85cf9475349bb228a36f89796c5d6481c52560ddde3a","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","benches/bench.rs":"acf4844efadeafc7bc396c2b16f2a184e140b6c17d1084dbaf454196de2090cd","benches/random.txt":"9386fb3efedc7ffbd09fb49088347f1056bc2d90a861009fa2f804cdb714efcb","ctags.rust":"3d128d3cc59f702e68953ba2fe6c3f46bc6991fc575308db060482d5da0c79f3","examples/dict-search.rs":"30eb44b1a0b599507db4c23a90f74199faabc64a8ae1d603ecdf3bba7428eb1e","session.vim":"95cb1d7caf0ff7fbe76ec911988d908ddd883381c925ba64b537695bc9f021c4","src/autiter.rs":"98c31a7fbe21cfacaa858f90409f0d86edd46dda1b7651f4e800d929a50afb7b","src/full.rs":"b83a9c8ff3ef611c316b68650915df2d7f361a49b59dab103dc2c5476f2d8303","src/lib.rs":"68bf2ed02d58bebee6f7f7579038f1e4b60a2c4acc334263cb837bcbe15ffe94","src/main.rs":"fc867cb5f0b02d0f49ecab06b72c05a247cbcf3bf9228c235de8e787bda7bef5"},"package":"500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699"}
++{"files":{},"package":"500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d24edbd878654bdd87ebf388b33296131ad53acb
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,9 @@@
++.*.swp
++doc
++tags
++examples/ss10pusa.csv
++build
++target
++Cargo.lock
++scratch*
++bench_large/huge
index dd3ea689cdf1a6296a84830ce20e14a9d3084d00,0000000000000000000000000000000000000000..884c3eb4e359560bfd7c18e4b1a9ac543df7182c
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"6f11d19317924088c90d605e1d13e4af230b10e289c5df6139c40a62409eabd9","Cargo.toml":"f893b7b701611e48ab80db25670342084b11d8d4ed3f3471b68842c490d247b8","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"11061a4c1e27fde148b5b1fb6df553f8eb464e279be0f5e278d262bf35d7b0f8","appveyor.yml":"29d9f44137560479a75b02a7953cfa0c378c2577ed1925f579b400295c7937e3","examples/backtrace.rs":"fd6e1cc6c3378ec7d41cd03b2bef187051298dceb01147e71f207dbb8a0c4867","examples/raw.rs":"f07be26d1f97cd7ac79290ac99d19c4eec5d27031fe270ab5364c25d9c2ad9e0","src/backtrace/dbghelp.rs":"45c5052763857d4a3727c3082be1b2f6c28f7973afd66706657defda5d97c6ec","src/backtrace/libunwind.rs":"cc9cdc1d389571cdedf43dfc2d39b8c3af85531a3965ed700c724f436afb213e","src/backtrace/mod.rs":"d00f4a574fae44df81b1d40bf44acea84addb70b4c76c85bfaa1f3ab0bcd7f0d","src/backtrace/noop.rs":"dc4a6602e9852b945c382194402314d3d68c8ca90199af9a8159419fb91a3c99","src/backtrace/unix_backtrace.rs":"1bb4a4a2f1e56f8ac04002dd77411116d8b4920f905d1ddfcb289e242f939a86","src/capture.rs":"de3250fcb9ff941391dea24decc8166d058f17abe77d25ff82b766ac384f00ea","src/dylib.rs":"09f3d7f32849cf0daa4de9df48f8e4a4d5ba62e20723c79578201bd271dc4777","src/lib.rs":"7ccd8cc3679435f0e39efd26f23d9d7a01094ab09ba6d411c6587b2420c6886b","src/symbolize/coresymbolication.rs":"99280684791694f560824b39291ee7ad78a2b53f82e5972ff3d9b77b43671f60","src/symbolize/dbghelp.rs":"d743545bb3e64eafc4903e3e7aec115b64da2174e75afd7b465bc0b89573b88a","src/symbolize/dladdr.rs":"8287cbca440a9e92e74d88c5a7b920f6b4cf6d8f50bc8b0f61aca5ba42d5b5ec","src/symbolize/libbacktrace.rs":"0cdad7de2501baef9da193ee6aab21c453d26348a2071c805a133efe1209eaa1","src/symbolize/mod.rs":"7f2efe54ce40f42ba38673614cff2a510632123cb6d1bc3da88566f12bcba588","src/symbolize/noop.rs":"b622fcecb4e22b42c3d3e2ef5dc5a6ab14601fec83c7797ee1fbbacc12fe6ca1","tests/smoke.rs":"fc882d7db0f4842e4415e3319774a33ba27c4d6412a62f8ee194a5dafd8a6128"},"package":"72f9b4182546f4b04ebc4ab7f84948953a118bd6021a1b6a6c909e3e94f6be76"}
++{"files":{},"package":"72f9b4182546f4b04ebc4ab7f84948953a118bd6021a1b6a6c909e3e94f6be76"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 70f4a4ce28fa3f877b85b711396f1660f9544740,0000000000000000000000000000000000000000..6275d4b0dacdb52c9622106b0f7f96df0c1748e7
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"f8d7b705ce625488f8ce9b7222a3284e83ae3243111f452a617efeed0b7e0c50","build.rs":"8ed75592a0040ea0051fb22ac9095b8fe2f2f921e9a142ed866d4500f70b26dd","src/lib.rs":"cb45ba047240bceac6ea74da50c2f48ae81a965b578c833a766a3ea0db1075f3","src/libbacktrace/ChangeLog":"ad6f9058524b950aed734db83419e0624df55a48af8091c8bcad7a125aeeffdd","src/libbacktrace/ChangeLog.jit":"ee143b5c9dc571d9aca006be246a83b1f019c39a3fd7b0025eb37463e30200ce","src/libbacktrace/Makefile.am":"74d0036c9715cb7fa6c749cead794ba96283f47d243cf2b25bc6fac8f04667d5","src/libbacktrace/Makefile.in":"9ca92df95c8d62b8a0e106357a796ef4d2c5ec7fd02ab133fd0a65de1984e096","src/libbacktrace/README":"3d1a15714583197945df8db054da6f30613316ec311c5ec2d68b92fab12364a2","src/libbacktrace/aclocal.m4":"e3a6dfa4ce929624ac289b260987a7fa9b512cfbf3ff6f39c5d1e38cbad1a0ea","src/libbacktrace/alloc.c":"829ceab369210fc60758f339807fe0bf55832c77adb3a4450fae586a90a9673d","src/libbacktrace/ansidecl.h":"14acfcd6c044bc73de85b120cbc3e626771a01712911ee1f6137585fd710fb1e","src/libbacktrace/atomic.c":"3e1882a520e0e1115107e194fbd97daa8d3feef15a70047969f4976e7542c263","src/libbacktrace/backtrace-supported.h.in":"42277f3c383386b6cfa3d3d889336e92303fac0ae1a9fb8a6a56737245dfb8f3","src/libbacktrace/backtrace.c":"76bdabddc4eb8a46a7eec98ce610c86909c89c629eb850a0cde98f5a78c9b99d","src/libbacktrace/backtrace.h":"cd2db6474556b655e42c0a973b871c1b6cb4796809490bf59cc8d3d0e8c083f5","src/libbacktrace/btest.c":"fff55e4acf6ad02a6f719046fc4e3f8bf795166ed9956122a79e17c6be266738","src/libbacktrace/config.guess":"8131853dbc8c3be5171fa96353de7a884a79d3f1d6b3fbf48f99037f5f95fe27","src/libbacktrace/config.h.in":"9b0d30416c93906e5c0ce36c95a7426bfd41228114f381949e89d263305b5b65","src/libbacktrace/config.sub":"3b739084e4b409aacf8531f87b57efa602eccdd17b5cddbc4ae1313a2c866f34","src/libbacktrace/configure":"2b45c89d06809c6ed49d70bfdf51a93e44370fc81f689169a073f47b14b366e5","src/libbacktrace/configure.ac":"360b1a033e33d2c58d2f36aaa6644a2aac0dd8960417df6d64202cc099a1c3f3","src/libbacktrace/dwarf.c":"b969c3abb07a09aa4ac5094dba5777d2c23fee77ade4ec0934142d6b81049785","src/libbacktrace/dwarf2.def":"d947302d8b259f0abdd9dd2f50a0713f4e7395c05ce88ddfdb37a7145b045d82","src/libbacktrace/dwarf2.h":"b3b13fa412a1573e3ee8dcb1d603ec33de7140f00b3bbbaa5292724f0087ace3","src/libbacktrace/elf.c":"728d7e47bf077de4dad6eecc76c134b4b4898dc5866572587692848f29aaec5c","src/libbacktrace/fileline.c":"bae25b6662bfd01a43bccc645206e00aeea27f18a51f6303f00f4fa1d9f2e861","src/libbacktrace/filenames.h":"bce400200dbc7452ca2a7f27dd36516949c4c94a135a6a322f011f3ce7817377","src/libbacktrace/filetype.awk":"9dd5352f288c3737fccd24a2c7583f4d0dbca2b95b2735a90a26b644478018af","src/libbacktrace/hashtab.h":"4cb7f68db5c2e8ff1190ecf859e7feb58447ea20bd9818bb1f447b46e2813c58","src/libbacktrace/install-sh":"d7c113e5484fce8b48f9a34a7a91e385ec279247d415b0b7d749bd56ad8ee8a2","src/libbacktrace/internal.h":"ed657e14aa33b4b5217919435e69019c5a677a00a9c134bf0297f000f146b093","src/libbacktrace/ltmain.sh":"ee4019f80b993cdb1bd13bf39434ad4f1ef15ae57a97594c53fb7b1d76d776a4","src/libbacktrace/missing":"b1a337b731bbb58846d31ca2f5143c293a455fa41b481e236e89a9016d96b034","src/libbacktrace/mmap.c":"fec72286a2d8a0c53fd56ea61b3766b87031f6f803f6de6c3c656e39bc85cdc2","src/libbacktrace/mmapio.c":"32a672fd2b8b3395c8a16ef11d839437ca35570fbc235bb0e2e70ef8097a12fc","src/libbacktrace/nounwind.c":"7694636af38ef488c814ab9b71854d6a259c1f3f635bd4c3ed99a88ca2beb5f1","src/libbacktrace/pecoff.c":"00cf6976cfc1e018f5e5473d4fbef4ae86de825dd2749897c45dfcebcefc6abf","src/libbacktrace/posix.c":"73754fcfa0a5b0342e8fe32166e7228b61e022699a8a3c9a2ef8e46260736704","src/libbacktrace/print.c":"ec1e80e17e27130bf9412470e8dc9155a0dc9ca3a78125081f5073b438b54157","src/libbacktrace/read.c":"399458fb06389aa4bd5ce376c4620cf733b5555d1dabe7ef19f185da1e37e614","src/libbacktrace/simple.c":"686d976c2bdb1a074f9be05af026d4b4c7a4978c2602268747d492563f18e0dc","src/libbacktrace/sort.c":"1a1e44af4e4d02fc568b318aa1517792edd6972a27029ba78e938856ef8ba1a0","src/libbacktrace/state.c":"49d547f5622b0ea0c39bc873b09a7dce276fdc6469118f5ab2e72c55bd0457fb","src/libbacktrace/stest.c":"aa1b90fe2d6dc8ac65ac0168776c2d242efc6460ac596deb14ac1e72bf764871","src/libbacktrace/unknown.c":"914aa113cd17ed678d40927391b35f6027e87b3a02e36e9f1822ec1efe9c0e20","symbol-map":"b941b2516efbb9e46521eeb166c60b31d52b2a4aaaf35d7f9af24946bbe1328a"},"package":"3a0d842ea781ce92be2bf78a9b38883948542749640b8378b3b2f03d1fd9f1ff"}
++{"files":{},"package":"3a0d842ea781ce92be2bf78a9b38883948542749640b8378b3b2f03d1fd9f1ff"}
index f078a5622d36ee84ecf30150c513398985fce1f0,0000000000000000000000000000000000000000..a4e2f84db38f63907fa67456503d4b6fb2ee6f81
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"e7a77c1800f9852e4c9a2acb9df041773ecd0bc005bd1b0657ae0512c67100ac","Cargo.toml":"f35826eec96c765ae8aee4f8a66c6b3cb0d918b49935baf05bae79b6df8e1077","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"602c63819e332e93c85dc8426db4855f18fe0fabbd642c5b2303ed83f1ba926f","src/example_generated.rs":"161b69d92cf6e5fa4b5dc30f06031f3a0fb590b44be2bcf0f31cb8be4fab36fa","src/lib.rs":"56e86a16356d9322fa6b4e9b910041e2e7558c08b52ffbdacc647eba36b37abc","tests/conflicting_trait_impls.rs":"79993ea67ef09a5f99fddd69d8b73b1c137e41d0e8f8535f03865d6766dcc498","tests/external.rs":"15f7901698e286197666ccd309ad1debd3c35eaff680ca090368494e8b06ccf2","tests/external_no_std.rs":"c3556fd19dd91d1b093eb6a65d09a9d0985544f0377ba3d30c0e265c956f7237","tests/i128_bitflags.rs":"c955ef2c9fd385848195bb416e660e946ccbe59acc87862ef2646eb082d82e3f"},"package":"4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"}
++{"files":{},"package":"4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4fffb2f89cbd8f2169ce9914bd16bd43785bb368
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++/target
++/Cargo.lock
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..261bdee2e0feeec7e96ebeaf6498e282992e0f3e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,26 @@@
++[package]
++
++name = "bitflags"
++# NB: When modifying, also modify:
++#   1. html_root_url in lib.rs
++#   2. number in readme (for breaking changes)
++version = "0.9.1"
++authors = ["The Rust Project Developers"]
++license = "MIT/Apache-2.0"
++keywords = ["bit", "bitmask", "bitflags"]
++readme = "README.md"
++repository = "https://github.com/rust-lang-nursery/bitflags"
++homepage = "https://github.com/rust-lang-nursery/bitflags"
++documentation = "https://docs.rs/bitflags"
++categories = ["no-std"]
++description = """
++A macro to generate structures which behave like bitflags.
++"""
++
++[badges]
++travis-ci = { repository = "rust-lang-nursery/bitflags" }
++
++[features]
++default = ["example_generated"]
++unstable_testing = []
++example_generated = []
index 35bcdcc3aee8d9bdd235a765892d70c9e89ab977,0000000000000000000000000000000000000000..589110f7bb797fa09c76d785dcc1d615cceb9733
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"987b79076a914cb1279b1a75ac8cf5f802db080cc986332e01d1d65ef824c598","Cargo.toml":"616eaec02a25406f9f5ed0b3b7b44e9f38ce44dba665fe0d7254edad3aee89df","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"52151641bdec86e4341038ee8abb64154840845c1bf718c56d450b09835d220b","src/lib.rs":"b9829ea348eaba4f3cb0b8cdfee92fec2d4e0d6d2c9a2da0d0778ee857879d80"},"package":"f2f382711e76b9de6c744cc00d0497baba02fb00a787f088c879f01d09468e32"}
++{"files":{},"package":"f2f382711e76b9de6c744cc00d0497baba02fb00a787f088c879f01d09468e32"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 9d5f3f28c9a2b72f69f828b43d3c9e075251cd35,0000000000000000000000000000000000000000..ea7219d8958de97676628403a11d1c3108933e5d
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"e4a302e9494e53483326b0307a2969e73fa7f3930199ad8b7be1015ee1827e03","Cargo.toml":"85c3d6ec135ebe7ba9681d76b08b4fb9ef16e70ad05fbbc5df5864567bbd2429","README.md":"3fa9368c60bc701dea294fbacae0469188c4be1de79f82e972bb9b321776cd52","src/lib.rs":"844d2f52dcc94a0118fab78163ff059342905e17177afbd14afcdb49e289050c","tests/xcrate.rs":"30dcb70fbb9c96fda2b7825592558279f534776f72e2a8a0a3e26df4dedb3caa"},"package":"de1e760d7b6535af4241fca8bd8adf68e2e7edacc6b29f5d399050c5e48cf88c"}
++{"files":{},"package":"de1e760d7b6535af4241fca8bd8adf68e2e7edacc6b29f5d399050c5e48cf88c"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 05418520e7c9e65fb822f72695810ffe93117e77,0000000000000000000000000000000000000000..bf9bb37e222cd02764246f91f032c01446c4319d
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"c5565ac6e1981bf3a88d132c16e381411a239a1c25ec140ee13cf2d50f1f97d0","Cargo.toml":"b00470e46ebb5985066646479d788b7ceb4ec7155c5d0bc99d78230e323c5745","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"8ca528d20639506546044c676ff9069e3e850937b02bff4194dcf9e5c3c50d64","src/lib.rs":"414fe90372fa7c7f67853af871f2ca30c117abe406b405719e615b581a9f55ff"},"package":"b8ebbb35d3dc9cd09497168f33de1acb79b265d350ab0ac34133b98f8509af1f"}
++{"files":{},"package":"b8ebbb35d3dc9cd09497168f33de1acb79b265d350ab0ac34133b98f8509af1f"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4fffb2f89cbd8f2169ce9914bd16bd43785bb368
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++/target
++/Cargo.lock
index 397f92c9af8624fbf2fa1ce81f9b73d39b3f05c1,0000000000000000000000000000000000000000..5eaacf3262a3ef4e4620576ac4ee2d174b2f5998
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"5c1a66c2f3f70d7a6fd7ee40b87863d95b78294244cc037453220d64fc431362","CHANGELOG.md":"729d4632f518b0c699d1b947e5d8ddd3fc6a8878bd7796d7b96b2f58772f0478","Cargo.toml":"778cf5a227b5f6a0200d9385d2a8adc59a559a6822ab4d1941348f3eee92d791","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"ea4153526db8a7b7c33fba324fd87f9e43ecac4c973ec1af242c325768c1a4b3","scala-bench/bench.scala":"8f203f98f2c938115247a8ed5ef9d0848fe0f8dca49fc43e2dba88bdd61029e3","src/bin/bench.rs":"7826ed26fcce96f0e2fe3d0b46c36bbfde70168546124018394b1aae8fbf1ec3","src/bin/extra_impls/mod.rs":"b72e67187cbfc1672faacd7d906604f3adc0c7540c781db88c6f4f1726229db9","src/bin/extra_impls/mpsc_queue.rs":"94551cbe0075c40472bae74cb500070c5c621e3690e15c1374b56c5cb7dd6639","src/bin/stress-msq.rs":"f49ba9adb0308013dbd7ed748572659c8b25d045e20609a21ed29ce35784f8f7","src/lib.rs":"b84c7a07bcae8342ce791e42566d103bfc7ac072994a2fe4d6f0b14c8d905f2d","src/mem/cache_padded.rs":"710de7fc76c04bda2e9eafa9f2e9a038fd381330f0e2ac657b56552a9bd9223c","src/mem/epoch/atomic.rs":"ec73c5e271b6b16bc489d3a6b47a48c5ef21cd1d8320d5ed01a6cac271afb42a","src/mem/epoch/garbage.rs":"dd3a3270481da756cf2e8aece5518642059d72492ffbdb107ad9c92d608ed3d3","src/mem/epoch/global.rs":"901df28fdb255cf2466962fa1fcfe3f3006325b94d80a5edb71e3251cecd592e","src/mem/epoch/guard.rs":"75c2a771d88e859f1f53a79a9466ed1e62a6854a1ddca99c6dcaa3d4ca3520e1","src/mem/epoch/local.rs":"d451c2c05fe50e80bdc92313d074b7db13f54d6caa3cf6df6ba5b717566932ae","src/mem/epoch/mod.rs":"a57570492cc2b23b5d6164e0738af5b8d7d65c4b2de08fdfaa2283a47481fce0","src/mem/epoch/participant.rs":"d16e9a81d34f8368340126e9e420bdeec9e661c94aec7a26057be26cad0982df","src/mem/epoch/participants.rs":"c7f4edd7e632130cd149afad8abbeb21888df55b7e4db4206a8840a218bf764d","src/mem/mod.rs":"c60aaeee01ce6abe2418f6f2a3cdd38564a6a46d3c47285d9730a358f52fa6bf","src/scoped.rs":"9ef97832dea5dbdebc88f6c1c8dee5ac5e801f302b70ba17b667214fc3fe57ed","src/sync/arc_cell.rs":"d12dcaca3d59cb0a7c34470dff60c11cb8e25ecde87baf3940bd0747bb107672","src/sync/atomic_option.rs":"dcdfd1080c35d782f041edc7d6c52c1c8fc05f4fe75a9dad261a8982f954ae97","src/sync/chase_lev.rs":"9679cb37bf777466c714e3b8aca7c583638e4534cbb298449130cfa7a07c1d78","src/sync/mod.rs":"35e5f793530e198e891e6ef619da161bbcd31a1de1419dc5b9e9a954d3542c02","src/sync/ms_queue.rs":"cf735b32c12d3227364b2a2abf75a99e5f36f2980b58f34821462cdaf1aac209","src/sync/seg_queue.rs":"e9178f259a0fec71aeb4fb9d5c2bd668eb3dc5f3a3808f167eaae263d76f6646","src/sync/treiber_stack.rs":"60e7f82a42379fbcc2b418b9d50cef98ebc743d9747bf646eb1f3d723189bea4"},"package":"0c5ea215664ca264da8a9d9c3be80d2eaf30923c259d03e870388eb927508f97"}
++{"files":{},"package":"0c5ea215664ca264da8a9d9c3be80d2eaf30923c259d03e870388eb927508f97"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c9e6185c8e72cb7953bc98a364f1cd9a2dfb6e6d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++# Compiled files
++*.o
++*.so
++*.rlib
++*.dll
++*.class
++
++# Executables
++*.exe
++
++# Generated by Cargo
++/target/
++Cargo.lock
index 0648fb86bd5573aa4ece25cd79f5f1117c4a7422,0000000000000000000000000000000000000000..d35f7bd0259a6e8e6f1cbe8590c8b57fa6d19def
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitmodules":"360dc395ed93285743c292e50bc35cd0cde7882a44f663489e5fe09df2fd0322",".travis.yml":"e6b360b65238bfa081f1399f670768d64f7cbef00d7195b1788ff53a5152f5fd","Cargo.toml":"ed3b0f7036152f8b965c560d4dbbf4206dea47c012b14fdd19fc69a465b8a4ee","LICENSE":"f96def8cba2793fb8582fd12ca6d4dc0ef4ee239e8c3f80e809ec43648da6199","README.md":"66fe8d376d5478e6f7ff3c4d3f8fae69d10493664e776ded83a1c2a14118268c","appveyor.yml":"714bf2b74f6cad8106d490b34785d0e6e8043fa40b5b62dbd5910eb8e68437ab","ci/.cargo/config":"0fc30f27f20cc08c09e3b3107a7b79b0beac992fe66969a744b15900ed5322ab","ci/Dockerfile-linux32":"8f4c3531a36154e2bebf045aed0b9a38bd18ce7142ca7c56ebd2fe551747a5d1","ci/Dockerfile-linux64":"c1e06c4534cb039883950af4442aeb4bc7ca2b112969e3a5b2d7f4ca4728c919","ci/Dockerfile-linux64-curl":"b08eae75dd40b430230d8c225cde0aba88d64192f32d841d7c98648201620537","ci/Dockerfile-mingw":"7fb3093158bbea457b5a6827f337be42b541ea97de851a80e4732b5346b76f05","ci/Dockerfile-musl":"03afb1b28326566a1ee70a66ad0dc5216e6601e642bfbdf120b6403f42786d2a","ci/run.sh":"ad149baac88133d85e211c7e41a79978bc4030d0f22f16d831eef786dbaae3dd","src/easy.rs":"772816c7fd7b1d7667736e3ec99be1ea98295ddf3ea5873fcb94fd41ce65b632","src/error.rs":"06d9ee3cfcf382b098635200b381c742ba80d8fd1c6dfde35ad26e2126f8c8f6","src/lib.rs":"2ec7a9cf3bd188764cadf5e9beff2f433aba3021a9bff745f9349efb609e1d15","src/multi.rs":"7b907e87ae4f3b9c6e8c4a9031327b3b3d0d4a633db9e3ea320e77421c480b1a","src/panic.rs":"4373b2bedb4403fd0cf2059f925a8fdb4a3f4399e83bab817ecd8f7485004f9c","src/version.rs":"cfda858806a50a36c5e58e433a14202401c16941e8677173d964252405c6adce","tests/easy.rs":"54711c01b2fa7a39ca9d9e93047ee08c1396d84ca0f38e76be51a2e03637efd8","tests/formdata":"5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03","tests/multi.rs":"a978f23578ca9d90aae87ba0d72399757dc9745a07564d1aa2bb8c7f1f9dffeb","tests/post.rs":"c4a69b0dc0d5cb11988cd7e93448d45df98b86d90e3d6c7e8c30b6bebac3fd78","tests/server/mod.rs":"4d1d744586caf09a6ac43fdf4c6012c18708e7c788ccf42cbf493b1894a8d8a2"},"package":"c90e1240ef340dd4027ade439e5c7c2064dd9dc652682117bd50d1486a3add7b"}
++{"files":{},"package":"c90e1240ef340dd4027ade439e5c7c2064dd9dc652682117bd50d1486a3add7b"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..1e7caa9ea89a3016bc73f03b5e4c167711a21374
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++Cargo.lock
++target/
index badac403103b465aaba2384930b10345d67649b6,0000000000000000000000000000000000000000..3bf3196a65e8668ebcb2a94180b7ab42914b6e6e
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"2c27dd6b1acf92cec4c005f6466dda8bfe8d1871828a450fd274ee02c308232e","build.rs":"9e21a10c0314212cb30e7d7fe5e4e044cae7069c87a0c87f0094820457503efb","lib.rs":"654de1b0a22be012af9f0f989c086c8e874eb0f44f60dfee02685e7b371dc912"},"package":"f00c8ba847fb0730c293069b4d1203dc01bf3c2e1f90b4e55f426ed8f4a1eeac"}
++{"files":{},"package":"f00c8ba847fb0730c293069b4d1203dc01bf3c2e1f90b4e55f426ed8f4a1eeac"}
index 7b799ca7d86d7babcc3c1ba2b8749e70117c3edf,0000000000000000000000000000000000000000..14a0d401fbc76a15e869d455701000e8d1d81638
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"1f8c2a0d9c67203873c258054f7e3f52d18771e538abf3c183920a8a74b126e5","README.md":"add8bbc7d13eccbb5930f36c8daa8137dfb24cac790eddc0e73385aef6daca0e","build.rs":"c5cc71a0c004d0f0fb7d004d5db0767d72d0b4ecbdc1c9a741a4194c38900668","i686/libdbghelp.a":"fefcc21fbaecbaaae846d5480b72c484cc676509cf5a7d6a5dd08ed8973ffe3c","src/lib.rs":"b039dbc1447e3c68f76f7755d90be97715b433b4eda26e24b035436b823326ac","x86_64/libdbghelp.a":"6805c38acd6f47a7707290bb0838d3722d93d0da0763436647056e125bcbb089"},"package":"97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850"}
++{"files":{},"package":"97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850"}
index 39796038b74f72c791b80605a429eb5fbb94d717,0000000000000000000000000000000000000000..9a48353f84b21dbce8982f5f3e790b47dbbf63da
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"48d991c260cc382d111df9be80e69a13a4896efc6ebad6275bd58b8c154287d5","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"663077949b16d2557d3b99bf98221075202704d95133cd51138c9bce633a7f59","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","Makefile":"db1787c5c7d2daea87d92c0549976a18bbe0601acb2ab5bd8dc5edb9f2b46e63","README.md":"ab86cce5636418ce23068c2a2377fd8645f5446554f2464e8ddab364345b0735","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","completions/docopt-wordlist.bash":"213bf1baea244eeb32af3a24a9ad895212cb538e3cdaee3bfed842b11a2a64d8","ctags.rust":"3d128d3cc59f702e68953ba2fe6c3f46bc6991fc575308db060482d5da0c79f3","examples/cargo.rs":"7f4b8a06244f8e82b94bb659c0346a258499b73aa5c76120261c7ebbfaaa3eb0","examples/cp.rs":"4820c6be6d60714927c8cfd9707b60ebe60b90a0df11cc71f342f4578352f366","examples/decode.rs":"2e5d713f977b7626015fc6e7049039a4f727379b8a5055a40c8d0871983a3044","examples/hashmap.rs":"9066a7b7192e15b3b667702519645d31926a371bc54ab8d70b211d98458d5a8d","examples/optional_command.rs":"eefe58a4ea192bc87262743785be40e9d38de2185b0d7fa8e3a9ac2386cb3d64","examples/verbose_multiple.rs":"47240d86b0a6e69b8156f59dfced062dad1cc418e9de50be85bd8c7ed036cfb9","scripts/mk-testcases":"649f37d391650175c8462171f7a98fce81735c9317630a5eb13db532ddb22976","session.vim":"1d51566b00f8ff2021d56948c1c55f123959f3e24879a6ad9337eccb11fc8fe9","src/dopt.rs":"74b9596e4b84fa7ac6b7a854fd339ddbd60850c9125eb6464c54cc8372b8d651","src/lib.rs":"89e2b734ed5043010b5f2d9f5e26b1376192bd053bcb32dedaf786a7b0e94da2","src/parse.rs":"786ef08bdaea5bf2a978274012856f6485155118201485f0b4970b37a6e75647","src/synonym.rs":"5eeec443a7df8549a31c1510fbeaeadde577d899cd651578cd7145835656b4a6","src/test/mod.rs":"38096547cc5cd6a02008e61e82a2ebfd08c809ca3b5054e17f4c1a3455dc7ccc","src/test/suggestions.rs":"51e044db856a424ef12d2bc2eb541ae922b93d81ac5548767c9c638ccd87d388","src/test/testcases.docopt":"13fcd2948a5625b76f93b98ac7b6cb53ef70c119fc2c5f85d2cb67e56bd4e9c3","src/test/testcases.rs":"cbecfab0c82249a7d8ad193ad5e9e10f45a7a41b37e69cfc025a9cdc6c213f04","src/wordlist.rs":"ef501dae8e2c8ff71f6abe6c63b6406c371bd2cc84955954d86b265203c0652a"},"package":"ab32ea6e284d87987066f21a9e809a73c14720571ef34516f0890b3d355ccfd8"}
++{"files":{},"package":"ab32ea6e284d87987066f21a9e809a73c14720571ef34516f0890b3d355ccfd8"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..0c6e64e4117bc7c77443280b151ecf5780bb72e1
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,6 @@@
++.*.swp
++doc
++tags
++target
++scratch*
++Cargo.lock
index ba512ec8ee8e27c5cdd3c9a3a4507ec1fc1c6b2f,0000000000000000000000000000000000000000..2467a725b889ffc5710f4cc49640bdf9c0a8f713
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"a2b867b2e28af9bde20a669a6ff0f366ecc5150b89314cd7ec97ed95bb427547","Cargo.toml":"5755612ec9d7adc4ec1a68e3b096bfa45af8ae7dfd8237515c9f85786c9a9356","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"e18259ab3aa7f39a194795bdad8039b3c5fd544f6dd922526c9326c44842b76d","README.md":"8de1d7a3224bfae275197dc75d128f73e2970c26f6790b575a8346074f7783c6","benches/bench.rs":"ac713ab4e1c668dea70416504955563fcd6bd2982ae1cfa3a1c0043e09dd893f","performance.png":"5909ebd7b98691502c6f019c126758da40edc7031b9da32bce45df34273b1b87","src/diyfp.rs":"81754c3d1b8ff2347a506187ef43a666f09e20ae0e53436226c969d7e3f737dc","src/dtoa.rs":"f5cdd96d6ac9d3c50289a090a6d6801d36cb121c2a5e6d8acd1aa41013fded76","src/lib.rs":"037eaaf26de236c916332fb76bc72b7a8d588df8c90a8dab5636140976559adb","tests/test.rs":"296f3c322e08508fd372e436434fdd209bb911cab2124ea654d5f78d90f3eeea"},"package":"80c8b71fd71146990a9742fc06dcbbde19161a267e0ad4e572c35162f4578c90"}
++{"files":{},"package":"80c8b71fd71146990a9742fc06dcbbde19161a267e0ad4e572c35162f4578c90"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index d7f599556cc389eeda1c9c87574b744f490c1e0d,0000000000000000000000000000000000000000..79ae0b1f8883119509b9aa0e909b699f53ee3c9a
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"3f4cf313ce063b0d3888a3acdc3a31ed99432415aa4204b143fd39de0d037996","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","src/lib.rs":"5fac719110645152e649993bfd7edb8ca755155844867cbfa8077b486ddde9e1","src/regex.rs":"d8e2a6958d4ed8084867063aae4b5c77ffc5d271dc2e17909d56c5a5e1552034","src/string.rs":"26ede9ab41a2673c3ad6001bc1802c005ce9a4f190f55860a24aa66b6b71bbc7","tests/regexp_filter.rs":"a3f9c01623e90e54b247a62c53b25caf5f502d054f28c0bdf92abbea486a95b5"},"package":"3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b"}
++{"files":{},"package":"3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8672e2531071ebdbe729d686c68c27cb65f4dbb0
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,24 @@@
++[package]
++name = "env_logger"
++version = "0.4.3"
++authors = ["The Rust Project Developers"]
++license = "MIT/Apache-2.0"
++repository = "https://github.com/rust-lang/log"
++documentation = "http://doc.rust-lang.org/log/env_logger"
++homepage = "https://github.com/rust-lang/log"
++description = """
++A logging implementation for `log` which is configured via an environment
++variable.
++"""
++categories = ["development-tools::debugging"]
++
++[dependencies]
++log = { version = "0.3", path = ".." }
++regex = { version = "0.2", optional = true }
++
++[[test]]
++name = "regexp_filter"
++harness = false
++
++[features]
++default = ["regex"]
index 99bcdc418602e346194ca4d9454386ea2d6e7bd4,0000000000000000000000000000000000000000..e374d1299f8bc03c9df94a7a8e3d7dd546cde66a
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"d56246d6c8796c638b5012c2d7a91d9b6ec101b6a47128e2d4bfa957c1c784e8","CHANGELOG.md":"4f602de0b17e0d0121371482dfcf3caf2265b70bf92e8b5db1cba5dd8f391469","Cargo.toml":"8e4d1f0b25be862107a6938190c9817cd7ea516db50e688de1d0fe87519105ee","README.md":"6771ca940645b2f7e7a018c8cd25b25f8bf35786e229b54fa2fded1f2d0ae411","examples/all.rs":"6f073ea0e3db541a4eefb41436fc03a121a1f932fd6a2798b485a72d64bd1a3c","examples/doc.rs":"574948eb776c3d363f5cff9a48015bab6c17828c7306dc3eb8818afa90a31a83","examples/quickstart.rs":"c3142d5139d89c3861b119507a372fba47ac3d7df61aa90b068d518dea8fd6f6","examples/size.rs":"7922acd891dfd06f1d36308a3ccdf03def2646b2f39bfd1b15cf2896247bad8f","src/error_chain.rs":"d0cb3e4a93f9c358e4bd18ab8443573e57ace15442f4697ad95963d10408f882","src/example_generated.rs":"7d5220020aada7def70d3b3e396dadb0b139ed104b1253d06ac53f48517ec668","src/lib.rs":"0d1c972252dd1df3117ddf0a71a4734cdb350b41376e09cbe4b868afb0e2762b","src/quick_error.rs":"1889b9ca1f7a5e9124275fd5da81e709d0d6bd3b06915bf320c23d4c4f083301","src/quick_main.rs":"106a0cf44a6a2fbb9fb1d8932d234f43cd7af230fc6685b28f6b9dfaca2a3210","tests/quick_main.rs":"1d6a726856b954d4cffddab00602583921972ceeeb2bf7ba9ebbac6a51584b53","tests/tests.rs":"67b6acf87f4986fa013f018195e3becd6dd63d8101a7af07a417e8e526cf50ad"},"package":"d9435d864e017c3c6afeac1654189b06cdb491cf2ff73dbf0d73b0f292f42ff8"}
++{"files":{},"package":"d9435d864e017c3c6afeac1654189b06cdb491cf2ff73dbf0d73b0f292f42ff8"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..98171f1fe0316871195ec06c30148d67e69b1691
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++*~
++target/
++Cargo.lock
index 261cf6073e9fcf76fe792e3dfb10619075a4a622,0000000000000000000000000000000000000000..553f2d564a1a7a360c6c383ae7d45766cb5f7df0
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"c8cfe2c700e7b1d6500d0ad8084694be7009095e9572aaf54bf695c1fe7822d6","Cargo.toml":"4e414fe72ef2afcae81fb5a89f39e59ec40844272b589381746623f612333305","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"fef1998633eb2f460e6b12bc1133a21f5674e0b53ae5914ba1e53f1b63a185c3","appveyor.yml":"da991211b72fa6f231af7adb84c9fb72f5a9131d1c0a3d47b8ceffe5a82c8542","src/lib.rs":"8fa03e69ab113e5a30c742f60b6beddc0b77ef41a1eb45e82f9df867c9265815"},"package":"5363ab8e4139b8568a6237db5248646e5a8a2f89bd5ccb02092182b11fd3e922"}
++{"files":{},"package":"5363ab8e4139b8568a6237db5248646e5a8a2f89bd5ccb02092182b11fd3e922"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index db036e1a3043205914b656937d45ea4adfdbe01f,0000000000000000000000000000000000000000..412f2c623ba61edb576d9d8e3dc9b3b9f3b9591d
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"e33073c310c4bc45c4017b793e710c689fbf4fcbd618b3dee92a6343364ece0f","Cargo.toml":"7cccd970edc30578b4fa9fb27762ec77fbd31df0281d0c1d0a69ea16896216eb","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"b875d1d0ca491813f3a2469ea69d37dd667ad0c70f895e6bbda540c99e291154","appveyor.yml":"a39fd7664bf538147bfb494b9f9c96d6f898d9896a5d5e1806019f399cc44bff","src/bufreader.rs":"0a1213858056c8154066f45df7b261c052c6a2c55ec88bc21f56ad3f2748d8c4","src/crc.rs":"869b4cc79a61b6dda02253430c4ca09fd1efee51509a7552bdc0c8dc5bd2b6bb","src/deflate.rs":"4783d36a1a323c0004f2ebd3af7f6ac9c949cd1e7dc5fc54eacdc5d944098271","src/ffi.rs":"7bd962e85dc05b18c878dc3d5abb054f2c41f7b20a793d2ddbba755b7661fcfa","src/gz.rs":"d4fae4fbcf17b7ad7b233eee2027cfbeb7ed138b1efdf64068fdbcc7e1ade26e","src/lib.rs":"572a609457d29bc93340d65f561454c07d3638b4fb741906d1949232d410dc73","src/mem.rs":"51fa61421f1b235ace54596b3a0e4dcd2a67324dcd16d6552d7d6a7368935e50","src/zio.rs":"1d1fc161e40939b1f84da98a433d3b0adbf9e29baee578042c2919b123d0b66d","src/zlib.rs":"ecc52ab6b8034f0fdb89d3a01b75cc181160e44225160800448d183fed4ef2ee","tests/corrupt-file.gz":"083dd284aa1621916a2d0f66ea048c8d3ba7a722b22d0d618722633f51e7d39c","tests/good-file.gz":"87296963e53024a74752179ce7e54087565d358a85d3e65c3b37ef36eaa3d4a6","tests/good-file.txt":"bc4e03658a441fe2ad2df7cd2197144b87e41696f01e327b380e869cd9b485a0","tests/gunzip.rs":"3d2e0a80756474dc2b08f20071685117083765c4f1763456c676f1feeaff35e9","tests/multi.gz":"efa3341da052f95056314cc6920e02a3da15bdef30234b2552fb407812db5cc6","tests/multi.txt":"dbea9325179efe46ea2add94f7b6b745ca983fabb208dc6d34aa064623d7ee23","tests/tokio.rs":"d19defd6c369877f406ed8bd74683a257fde7de51f4161004cea4260faf4464d"},"package":"36df0166e856739905cd3d7e0b210fe818592211a008862599845e012d8d304c"}
++{"files":{},"package":"36df0166e856739905cd3d7e0b210fe818592211a008862599845e012d8d304c"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 8146a0a7a113ff38de652992c9a8d6a1401f8268,0000000000000000000000000000000000000000..8c84cc9be07a38b4abedc02daca469e3d1ae42de
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"79581d46c88f18838ff601dc84ee3bd99a49c21151cc442c3c07ede1c3d23858","Cargo.toml":"c51887565ba77e242868b79f534bb16cc61ff4284ccd5f04274919be264cd2f8","LICENSE-APACHE":"c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08","LICENSE-MIT":"333ea3aaa3cadb819f4acd9f9153f9feee060a995ca8710f32bc5bd9a4b91734","README.md":"6ccabff53d3a27b9125d72612fc4529d76e6e96f9f5dc97d964542dd61ec9b1f","src/lib.rs":"36f4bbd68e5207beffc98a1772e02da0ef1fac79f6009d1b26029de2bf27529c"},"package":"3e4056b9bd47f8ac5ba12be771f77a0dae796d1bbaaf5fd0b9c2d38b69b8a29d"}
++{"files":{},"package":"3e4056b9bd47f8ac5ba12be771f77a0dae796d1bbaaf5fd0b9c2d38b69b8a29d"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..3b874ca574de0550d0ee2608988aeb9655940377
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++target
++Cargo.lock
++.idea
++*.iml
index 413f46c16b9c99ccd54fb5b499aa57a901dd4c8a,0000000000000000000000000000000000000000..11e9c982ed9ab6a2566fa9d7f2e72018780c7bd8
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".appveyor.yml":"15c5548159ad6ebcc02960bb6a3269e729e772df2733b7d4c7cc1583c413ae45",".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"5733d01f7cd27cbdd17a46399103e83eca528727e6cad7f355f6748e772ef916","Cargo.toml":"3e891e5c7d0b3faecc455bf0551c9c43beba354a25a251ca4108b605d6d33934","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"7667acd3dfd050dadccf8b7815435b9108c24c5704944085281beed6a181e220","src/lib.rs":"a960a99addadb842fa806eb2b5414408abb535ed6786eee5955a893259b9d7d5","src/unix.rs":"1d3c808352a4ac18aa6734f692c032287004093ab3f15ce9ee84fd1ab13329fc","src/windows.rs":"5767d923280998e341504f8d2a015b8b0c3f8b2b1188610aa4c1b6a343da5682"},"package":"34edaee07555859dc13ca387e6ae05686bb4d0364c95d649b6dab959511f4baf"}
++{"files":{},"package":"34edaee07555859dc13ca387e6ae05686bb4d0364c95d649b6dab959511f4baf"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index e95c5cd70b8a2755d5dab56af6a38a1b16706792,0000000000000000000000000000000000000000..16ae9a459556ffb6fefefb50b7410a96b4f0908c
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"6ce870c5fe92cc982b64a0301241c2b911f3864a0cca53277ce0697b9a91810b","Cargo.toml":"e7209441d55373f0756a87f6fe4da84cce9e577a24ffbae156f32055402113b0","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"b1a639560fd536f2c3ab708a8e1066b675edd4d018dfa4e5e18d0d7327d81c15","appveyor.yml":"46c77d913eaa45871296942c2cd96ef092c9dcaf19201cb5c500a5107faeb06f","src/bin/gcc-shim.rs":"d6be9137cb48b86891e7b263adbf492e1193ffe682db9ba4a88eb1079b874b58","src/com.rs":"0cb06f5db0fb70d27db0e5917ca337de6e7032119e6aabfea1bad9c719f5f34b","src/lib.rs":"aa154d64ccbf401eac4fd0684411e0c9b6c5260f4e381a9e547416f8dbeb9a9e","src/registry.rs":"3876ef9573e3bbc050aef41a684b9a510cc1a91b15ae874fe032cf4377b4d116","src/setup_config.rs":"1a3eeb11c6847c31f2a4685b62ab35c76f0b6d5a17f7ed99e9df164283a771f7","src/winapi.rs":"b8240086866595c57bc562bbf423e44fd5a286c9f25bbff8694fe4631e918518","src/windows_registry.rs":"54a4c024213dde0e0df4ed2e9e54fb4f4d72dbdc64a18cdab4c483adaf4aaeea","tests/cc_env.rs":"d92c5e3d3d43ac244e63b2cd2c93a521fcf124bf1ccf8d4c6bfa7f8333d88976","tests/support/mod.rs":"56bcfd1e2ff5ae8e581c71229444a3d96094bf689808808dd80e315bd6632083","tests/test.rs":"4a83151925521c2f63bb6ac29d0f0077fecfacaa049c2066e31e69fa350c6463"},"package":"5f837c392f2ea61cb1576eac188653df828c861b7137d74ea4a5caa89621f9e6"}
++{"files":{},"package":"5f837c392f2ea61cb1576eac188653df828c861b7137d74ea4a5caa89621f9e6"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..3b874ca574de0550d0ee2608988aeb9655940377
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++target
++Cargo.lock
++.idea
++*.iml
index dfa36cfe7e24de7709cd7c813e8ebbf287d31fd9,0000000000000000000000000000000000000000..d12f33cda77fbb83dc4a5aef5a72499b7430628a
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"20862f3ca447bad787627843d50ec7ce037076883780fb76d38a5168ce53f270","README.md":"fe7c514d58e569be2a6a59dab506a93acb1a99e298bd98760ffdb665e215c962","build.rs":"42ed995baf6047cc983e11482f23285fc5488399453d82155e8342d77fd9c73a","src/lib.rs":"0d06d543ee154316afd6e86d6f3e5789b41a0e722682a69c81b77c65549af95c"},"package":"0912515a8ff24ba900422ecda800b52f4016a56251922d397c576bf92c690518"}
++{"files":{},"package":"0912515a8ff24ba900422ecda800b52f4016a56251922d397c576bf92c690518"}
index dadba6631c9cb352f9fc255769c55bd46f4b8842,0000000000000000000000000000000000000000..9c16ec38396fbadb3cb109bb58361d98e61b9d73
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitmodules":"768f0798b18f77ffaf1ed319c765a12894c838193490c76478b1cda14cfd0893",".travis.yml":"ad0fcb8e833c122ddfe28b388064f271df5df050ac067f88c1d736df7cea8db4","Cargo.toml":"44ba73a19f4fd3db48b530c1f0064fd91bbc483bff866771471dd085049c80df","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"e08d7203005c68b6f1e32fe240adfd387eb276a741d9698e508962cf0d707c5c","appveyor.yml":"b381895d3a8863f2c0926efdb66f40e9a84cd8811337d78a7e5cd64e1a61c201","examples/add.rs":"7c602f1122bbf107d7ffd56ddf29ff2d14e77c4adf7f739cd2dd9e73ada10513","examples/blame.rs":"841558268e9cb3847bea87640c328356f908d1c8faa3fa10d78d659e59f32db3","examples/cat-file.rs":"e6195ccc7b031de6f9b51e390187c4a90c686b042d9a4a3380001cf7b650594e","examples/clone.rs":"c81d4f719ca8c1c078bf6e52f4b88cf41e455b0e10003ebc6831edb0cc230173","examples/diff.rs":"cdad8a0ba0ab949937702a87fdea0409f9b23d064e86a48cce90391029db8b67","examples/fetch.rs":"6dd7caa619dd3d538cd580dd4b346d04141c1f35071281593fa5ae8ad845f188","examples/init.rs":"7f4645b28198956c7ab3b3bed97a27e677d15befd0e68a28804b3972bc1214e2","examples/log.rs":"873b17918beb2dadaf86d9241d7df6f293263eb98cfab2281c472eca5a35d208","examples/ls-remote.rs":"234600d9397ccdaac950474a4d3bea302d635312be28926e3a2bb642e330887c","examples/rev-list.rs":"7d19066961b71afe3525308f58684f00c1f7ba38c3375cf2225cda2e43590dd2","examples/rev-parse.rs":"6ec6091f2fd9d8f4f474466d0b4bbaf356dcc804dc9889a0d31826c7c16b08d7","examples/status.rs":"c2c8ff341bfcef5c1263fbe05f0a33e23ad76f37f7a704e2a37ecc2762761a05","examples/tag.rs":"ef80c9d2d3051174c5bddfd6360536616b79a742e3dd0fccebbc84b6ded4ffa9","src/blame.rs":"32b47d9fbfcfb14f0ce4106cc49d2d11d53de04fdfea05a1aac232a99189e217","src/blob.rs":"762ce3196d067f01be4bf5d39027d16d885c0e2735670fc062750779d12445cc","src/branch.rs":"b31fcba962ce548f69db9b46ebe03d9875a7ce0e5a88c2a977a922d8dceb7813","src/buf.rs":"5781b512f718fb49fbb582c8dcceb23d528b9ac8c0da69296578bc26bfde0487","src/build.rs":"65d74f1e57675058e379f2b4ef6f813a47a153df4e501f153fa83c0c49817b87","src/call.rs":"c2a548527430532f282b239edddbc04b23850f60051142bbb6389d0790056a83","src/cert.rs":"b90593113ec89c71967ae6b3aea750690c6fa936ea0d8ebb7cb506009c360af7","src/commit.rs":"c15cecb87737f1b7aae56957e2cf3dbe307cf34af543fd5b07363a4b93de96a9","src/config.rs":"c61ef5bfffded88e3582343b6c0b9f45cb7817d86f961e327d7135d2de87f1a4","src/cred.rs":"37f90a6a952a1fd49a27905fc8306aa74202670a878f9365400cdb90d4ffeb47","src/describe.rs":"6585d598bb25b87ff0a40ce51971335755d68ade1051c560ca46b9eab1d5a9ba","src/diff.rs":"19ce9fc1819ba5087a71b73de1ee9cbc429ac8f2d50087af5276ee1b1df75a59","src/error.rs":"560ae0f41be03070fac4de0dce8a3d9a1d16047fdd6c054d6fe64a634406e2ca","src/index.rs":"669d9da378104cd33ba0fc5980909b565d307f8813a4b83c0f43d30a33fe58c2","src/lib.rs":"e963291964a06e4e7fbad9325bac87c0d03c622e8e937d2d7e46c596f2b8c84a","src/merge.rs":"93b29454b588a31296183cf138586fa113c0b292bdbb4e202efa8f6f2cca21c0","src/message.rs":"06f4cecb36946b95e12e225394ce334adb8a6ca40bec01201caf69f9ab949992","src/note.rs":"6cb91b5ae8c58c4d3a46fccc55ceaf8f10a522e2f2c88c19575e7314029359b2","src/object.rs":"284c158a12353323fc769932744e31ff8777d78ebd088a0764f20e351ae37081","src/oid.rs":"8012304647ba4ab16e84fdcbe4875aecef6c308f54efd878c0ff92eb3159de57","src/oid_array.rs":"778ff73f415c3ca088b960dfda67024989c91d9c80b6b7dd8b579886179ae919","src/packbuilder.rs":"28cf5f025420bdec77b89d1b24f8286c85ff6c46cd20dff19db399c344300603","src/panic.rs":"dd97ea907fc10308013de67da87a6de5a95911b0c271d3f4e8567d20fc10b31b","src/patch.rs":"37ad695c510dfb966ca8f919a484047400690069cde0602bf621e4f6290b4c41","src/pathspec.rs":"6903adefa13bc18ed4395895eb30c286f13f8a06eacb61d4d04f471485dd63b3","src/proxy_options.rs":"8d415cbc8691235d3e373d65acf1490b756563e2dd19f174e8cec01511610386","src/reference.rs":"12544dbe200c4427b19ec3ad2f9ee3e5f0a8658ad99790129a3e31b5b496e7cc","src/reflog.rs":"47fff4281d8caf5c0217d6c845cd22b489b34a956ae34b4303527bc3acb3f582","src/refspec.rs":"dce85c33987bb9aa23af09b782bda0e82b6cc585727bfe059780460c9993ac94","src/remote.rs":"5a8ef6c60f8f42e0b31d9452006c0fca27f7336e6cf0df12ef566c1ba3e90d8a","src/remote_callbacks.rs":"749be5bfe938d807df025aa9b1b5e965c2e6f014c60559ceeef65482b92b64e5","src/repo.rs":"db2087b17cf160baeb6349cf2b4c42b0839b839a34718f362834e0ecc9c6ecaf","src/revspec.rs":"b68ee5df102191defc73eabdd948bc2681f9b900047a309fc208d640e5c493ad","src/revwalk.rs":"b04701b8c91b172aef1bc1c1592252998ac94d3be893364d0513aad453c05d68","src/signature.rs":"a8d29dd1103e02c4fc04c8f54a383167a3a12c400861786e881d57f147a77959","src/stash.rs":"825bc4b77de83236fa6c3e95d052f46a0d7b77557e7215e039f25edbe10cfeb4","src/status.rs":"ad549c8c61873677181dc9623fc50eb0d8fa08174e2a56f26d1310b5754efde2","src/string_array.rs":"692f4fc385b74ef07b83483d05d5542431c4b0a56cccecd1bf6b1982ad17999a","src/submodule.rs":"35ba50a6d36b866b525ec6a48e2cb2e810a62af66bf5b4979db8217cd471857d","src/tag.rs":"3fed7d0e25008218972dd06e40c6c750212e35b22bcaa6dcd81edc5f787f0795","src/test.rs":"afe4fbfd41773f5c1cb2ccd60e5b8a6c32833c8c94077e25718f6f97e7252fde","src/time.rs":"3ee4c625da74e1ae0e1aa9488ebf666009736fcc01a1b61287f851906827d947","src/transport.rs":"ce23ea405c76f1a0d2b0d9ce1a08861860443df2f73ee4d23ce714b06fff5242","src/tree.rs":"efacdf6bdd7da1b98ff7891ce9447cd62f6840437fed11777da3837ff83f72e7","src/treebuilder.rs":"c9d065499b44a9b4f83764fec78c9f072eada2a876f281da402d073c62f2f760","src/util.rs":"16c04cd1fda5d5280f55e3ed71f687c3367b7e90e508c5a5e277204eb11a7357"},"package":"aa01936ac96555c083c0e8553f672616274408d9d3fc5b8696603fbf63ff43ee"}
++{"files":{},"package":"aa01936ac96555c083c0e8553f672616274408d9d3fc5b8696603fbf63ff43ee"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2a729c83fabeaeb0a1845cb5637fa18a072716b0
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++target
++Cargo.lock
++src/main.rs
index 7125a361825729c14a94742e9016b61f25439294,0000000000000000000000000000000000000000..94f366616e3eca7152a28a6fa04be1a85241e68c
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"72cddef99c9c1817546416c8cc47ba8173fcfa3683eea02d2a9592716b5a4b07","src/lib.rs":"ca7cf086d4d0bf7442110a0e31bbe2f55da4d2b293828a12c4716b2598536d4d","tests/all.rs":"d9afeccd4d37344cc8b6a326bbd4af28014aa2de9ed5cdd10ca62a695b407322"},"package":"68676bc784bf0bef83278898929bf64a251e87c0340723d0b93fa096c9c5bf8e"}
++{"files":{},"package":"68676bc784bf0bef83278898929bf64a251e87c0340723d0b93fa096c9c5bf8e"}
index 918252fd759621cc81297844b8ae1af06dfd5be0,0000000000000000000000000000000000000000..9a6ec5217006a6086a90676e8ed19a8cd5a437f5
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"a0f88f62deeea7703c0bfa67fb5193618de4243dc44969fe6d1cc958a3b25b0f","Cargo.toml":"b3862d1373f5f97695d78d54323c0d66a703b930ffa1b21ea015a27e0cabc614","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"48acb43311019bbc775d08c25735c7a0b683d5910b2f63d426529e494289a7f5","src/lib.rs":"8cea6efa77fa8cea99bf56acda967cf99df24160a191ee546d89be1592880405","tests/glob-std.rs":"e630baaf33846cd19dd9d2ee45336d8b565844d1db0cb6fd2dafa9f8a4a49e39"},"package":"8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"}
++{"files":{},"package":"8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4fffb2f89cbd8f2169ce9914bd16bd43785bb368
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++/target
++/Cargo.lock
index 90c866b52c7bdd1a066a95c8b44b4426e73df89e,0000000000000000000000000000000000000000..e7a8449e17e04ffd8c8414ea6ff44a1e29bfba77
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"c3565f73cf7ff8e6ef7aea8364bdeec27d115f4c680882af8fc9c246e788458f","CHANGELOG.md":"0770ac8365fcb9437dc64107fa5424830f371b220d523f3989b3a670a7a99424","Cargo.toml":"ca1cd380d06201f50e8063f81a9be70a1cbaef1342a079428cd972ff68291dc5","LICENSE-APACHE":"17b52e22d8ec95244441403e8bc0a35043fab56def8c5cb0744d292cc036c5de","LICENSE-MIT":"fd80a26fbb3f644af1fa994134446702932968519797227e07a1368dea80f0bc","README.md":"e69eda7a8936667d2292bf2b22be05731e83e0d669223783c32cc30a27275e10","src/core.rs":"69f9d895626ccb8023ba2c44f6a7178c972fadc6944f30211e127c10057148f1","src/lib.rs":"a1d1f4072bf70d2996e7076f4971400d1afbda4c537ed8d06de268aedbb071bd","src/matchers/close_to.rs":"b4b4ea07019e3c98948cd859ab56d21fcfc540a1d45cd0340f5a1e01ff22c998","src/matchers/equal_to.rs":"dc1304b498a393c74b029ddbe382b4084602fc5cb43911a6e75d0a9c5a185478","src/matchers/existing_path.rs":"51a0bf5b3f1b26ddacaebee4a9782c6c5439b8134615ede9851880746c4cdef4","src/matchers/is.rs":"3ec9bee4dc88f54a11f6eee6a1dc0fed8b021b0a732c35ed506ae00555622210","src/matchers/mod.rs":"382ada1eae09e50c551fc7092e412e7444057002fc567b96fc127ea72ef80b7c","src/matchers/none.rs":"f954034a0cc587df9c0a0f118972fa36ae702e6090bd01e6f6f8d6aa7a61b87f","src/matchers/regex.rs":"7ab078d7be033bafab5c938ba928daeaa4ffa90398159ffc2bfdfa1a4e90675e","src/matchers/vecs.rs":"21af76f5720909ae7fa079e84de24a0a5e46bf69815fe39e5d6fb69a5e7f7c9f","tests/prelude.rs":"41394d426bc8736c0d2640a6458b8abc3f0e34eb4c47affd4324d4d93f300789"},"package":"bf088f042a467089e9baa4972f57f9247e42a0cc549ba264c7a04fbb8ecb89d4"}
++{"files":{},"package":"bf088f042a467089e9baa4972f57f9247e42a0cc549ba264c7a04fbb8ecb89d4"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2c2345a65fd87f64529702817f51719afbedf373
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++/target
++hamcrest-test
++/Cargo.lock
index 900929a1e4b1cabd33b4b79065d8a089998d42e8,0000000000000000000000000000000000000000..502e5a67242ef4929af00e201806ec26c1f6d2af
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"35fb5d8cfa50a27a476e718e437bfd1405ae4d38ddeb87a7d3404af67f8f6baa","src/IdnaMappingTable.txt":"a20be6e70dd1e48c2d15615455fef6098ba104756e5e37427bf8bd919b9d1118","src/lib.rs":"1fbd82781f2402e3dd3017673e7f2b2c40c8272c5a550cef7695f4e59df90c01","src/make_uts46_mapping_table.py":"60201ddefb8a3cb6f344b79808e5f93dfef5e21dcbacd4c8a0a36f172701c486","src/punycode.rs":"efb547848493d735aab32a0d0b2a2c795360ca9706272412524738794a540223","src/uts46.rs":"e6bb573e1469e9c0b6b83353083120696eb36d224821af5e3f39e8c397870877","src/uts46_mapping_table.rs":"88c01d8bcbd32741a9f3f7ea2cfb9e7e9883e3f83ee2de024d03bdc65a62d7f8","tests/IdnaTest.txt":"24817204a6dc010b91e98d899a8df627a94471f8893d703afca1d022f808c887","tests/punycode.rs":"57854e04949a43ed4b6b263c24d7d6502617a31e439cebb5b1cbd8cbce013dfb","tests/punycode_tests.json":"3d4ac0cf25984c37b9ce197f5df680a0136f728fb8ec82bc76624e42139eb3a8","tests/tests.rs":"bb92e129dc5e17e9a86ec6062dd7b3f4c905c4af69e773d7c70efea177654c7b","tests/uts46.rs":"4723a16d52e453b136a763fd883e48db5f198c45476b541c1917ed44725c3c7f"},"package":"2233d4940b1f19f0418c158509cd7396b8d70a5db5705ce410914dc8fa603b37"}
++{"files":{},"package":"2233d4940b1f19f0418c158509cd7396b8d70a5db5705ce410914dc8fa603b37"}
index ed852d8ae99356a859a5250a5dc7ec87b99ec05e,0000000000000000000000000000000000000000..7480920aa5ae70cdfde3440e4ac4580b43bf35a2
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"a2b867b2e28af9bde20a669a6ff0f366ecc5150b89314cd7ec97ed95bb427547","Cargo.toml":"82b9e862ca8c12656987883e7339d992b770b2a8b23a9cd9ceb5ae0083252687","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"e18259ab3aa7f39a194795bdad8039b3c5fd544f6dd922526c9326c44842b76d","README.md":"f2b713cdc7ade373c4a733c09693cecd288201ec76bde725de65b4ff74530284","benches/bench.rs":"3e7075b70a899ab1e926403856afeb04b34a254b234bbca834f6136a703008a3","performance.png":"a6e70647a44084e65cedaaff3633b0624b37e0f0a84457362c1e078fb56c877d","src/lib.rs":"16169ef9fc6c6a6521daff8fefdfc1b54f4ce145763b9733308d6631dad4d14e","tests/test.rs":"9c7629f758e2833757c15617cd8c1ec2a2fb8437865d05b5d20abb07279d35ea"},"package":"eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c"}
++{"files":{},"package":"eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 87677d9b547d75cb01a07429fc50e7ebb9b503a7,0000000000000000000000000000000000000000..273798dbf2c7d2b233ca5df1f1b72b5c211fb59e
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".appveyor.yml":"f6cf18ef5dd546f75aee42523bab14ed619a3c6ac49fa403ce7a716ef125c52c",".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"31d3c1bfb1d3e6cb18b2360b923a02be52373f4a9232684648f07f9e27815b44","Cargo.toml":"ec0b1630fdaa99e55520513b365ffc7c566f73f7965882101f2c70972fe0bde6","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"f48c83086ae750b2ce48d36affc987d4da7023afc18f746c7ca070d3d0bc1121","src/lib.rs":"c7499f24ae4ba15ac02f3aa441d66ff0fa45f145d6e9fb46fbfa771df97c0359","tests/client-of-myself.rs":"9ba7aba16b276050d791931c9610eec6f33c713fa80d514fa9223a33372e6f71","tests/client.rs":"0f0eecdca8df9e46b5811c5fef33ceddbcf742b9386d970955facb503bc9c8ee","tests/helper.rs":"583e4013e2033bd6cba56219998a86651c3cc24429b2ca27f55152b75de75bdb","tests/make-as-a-client.rs":"844ce6be72c72291c7077e06646b39731f30b025afac1cbc32b2c13a32a3f327","tests/server.rs":"197c5366cb47925fb05598fdc466d4c7512058a66ac0fdbb16df517d8812954f"},"package":"443ae8bc0af6c106e6e8b77e04684faecc1a5ce94e058f4c2b0a037b0ea1b133"}
++{"files":{},"package":"443ae8bc0af6c106e6e8b77e04684faecc1a5ce94e058f4c2b0a037b0ea1b133"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4308d822046df995d72605f3497d02ae5ae307d8
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++target/
++**/*.rs.bk
++Cargo.lock
index 18c5faa1d4581b07c51fbe3d26464b82b4a44fdf,0000000000000000000000000000000000000000..e66b3b74389341deecb4dee35faff9b5184017f0
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"79c920ca9323e28acd5f5a80f2ce0ab81aa6227584397a9f742e78dce36a2117","README.md":"00afb50f0a5a7d548e40feb1f09ce8fa678b46e04c9a72d909fa36fb85fb2200","build.rs":"89e77c6e9e79dcd782fd006431b948d093ec4aeda3b69a280ec857077b7f2020","src/lib.rs":"ab0a8a104a6f747f6389a70d26a62e156ab97cc7c8f4daf1de99b820024da993"},"package":"7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"}
++{"files":{},"package":"7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"}
index 966b15832ce850ad097348e58ceb7ca1c084f114,0000000000000000000000000000000000000000..2db176d914c8dd79d148402988de8303df708365
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"b6983ce563e5ec756033bfef06e2f2b5f0ac2c1e8eb15803051c1929a328ce30","Cargo.toml":"23508414c154ab5ce9d5fc317a87f118395efc77c1edd9cbe75a08b11e4510c5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720","README.md":"ba1c9a9259f38b2db08a7d1edbfba89716aa23a4d4d0180a70ec74b33034ef05","src/core_lazy.rs":"9ecb52f663255829381bd8f00b295b915ea1beeac94e9db6ade3114b047e74ff","src/lazy.rs":"ddc4fd3c57910d89337705484882d3e5a611afc4e8342948dff901425a759463","src/lib.rs":"b480331f63e3e4a309b7d34c8e7d73a0d53332d30b7de2c56c90400422733634","src/nightly_lazy.rs":"4324572c84b8fbdfc7ddb1a6b3dbda843e95706272fc976ac9565f2875187fed","tests/no_std.rs":"2a5236bd3892a253855b4dc192f63138239165fa23b9c3421a9faa5482c780aa","tests/test.rs":"cfaf50ee913f63b7141a8f5ec537b481cde0a52d29dd900ddb0294f0b8925c93"},"package":"3b37545ab726dd833ec6420aaba8231c5b320814b9029ad585555d2a03e94fbf"}
++{"files":{},"package":"3b37545ab726dd833ec6420aaba8231c5b320814b9029ad585555d2a03e94fbf"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..bde55ce913654301ae7b07bdd430a7bd82beab36
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++target
++doc
++Cargo.lock
++.cargo
index 0ef3605e31ca1ae0e1accdddfd3b8bd38129c54b,0000000000000000000000000000000000000000..b80ac70024940437789f7567d285c47b6bddf77f
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"85d7a35a85a0653ea7072811fd0ba37cf00df4e0b2bcc3781bfc171220046001","Cargo.toml":"481ce55d220056d7e8a88c089f59cab58baf1a81974d90d5a75572f089e2579e","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"8a9859c60f78d9075e22bc9f85b40e0b0216cccaeb7025c9f464cc33dcddaf5c","appveyor.yml":"483ae27670e061eb91f055699a9ad88255050b7b300f183b8580340407751bb4","ci/README.md":"be804f15e2128e5fd4b160cb0b13cff5f19e7d77b55ec5254aa6fd8731c84f0d","ci/android-accept-licenses.sh":"84ad00815f628005ed22c5d6cd14990ebc97812a7163bd275b2877904eddab53","ci/android-install-ndk.sh":"73c5f21438c024ce1b8c793184447ff9aecd83c87cbde8de580b782842b3563f","ci/android-install-sdk.sh":"891900fe4e4ceb04717b91a253753858270defc6d6401936d08c09801c1de178","ci/android-sysimage.sh":"901415631752827454c827e8c51906ba4260612e4021eda98eb7fff771c7d0e8","ci/docker/aarch64-linux-android/Dockerfile":"68f375c6e0b3716f8c0b6ed217bc6c3631fa2b86c578b983a0bf60d0344efd74","ci/docker/aarch64-unknown-linux-gnu/Dockerfile":"62ca7317439f9c303990e897450a91cd467be05eb75dfc01456d417932ac8672","ci/docker/arm-linux-androideabi/Dockerfile":"1193bf048efbeb9be3c9fac0836dcf6ae07e12cdf09b36b386dd4cbd62abbffa","ci/docker/arm-unknown-linux-gnueabihf/Dockerfile":"e349f7caa463adbde8d6ec4d2b9f7720ed81c77f48d75bbfb78c89751f55c2dc","ci/docker/i686-linux-android/Dockerfile":"7c353aecdf0b21d8584392cc6ea31d455adad769034c3ea09191a1b26a2521e1","ci/docker/i686-unknown-linux-gnu/Dockerfile":"07e9df6ba91025cbec7ae81ade63f8cfb8a54c5e1e5a8f8def0617e17bd59db0","ci/docker/i686-unknown-linux-musl/Dockerfile":"fcaedc90fbb90375186b36b4324bff0a042aae70695be0f2b632e3cf7479eae6","ci/docker/mips-unknown-linux-gnu/Dockerfile":"860299d96ee50ebdbd788e65eb6ba1f561ef66107647bddffcb2567ac350896b","ci/docker/mips-unknown-linux-musl/Dockerfile":"711c43122fa34cee83a69944493213924b0ff1fccd78c7a141cb2b2127526484","ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile":"163776e0fd38f66df7415421202ac29efc7d345a628947434e573c3885594ab5","ci/docker/mipsel-unknown-linux-musl/Dockerfile":"aef213df08da03ab6a723c3e6e5594a0586251950d81482cf53179d8e64e95c7","ci/docker/powerpc-unknown-linux-gnu/Dockerfile":"08b846a338c2ee70100f4e80db812668dc58bfb536c44a95cd1cf004d965186b","ci/docker/powerpc64-unknown-linux-gnu/Dockerfile":"4da285ffd035d16f5da9e3701841eb86049c8cfa417fa81e53da4ef74152eac0","ci/docker/x86_64-linux-android/Dockerfile":"a73a344c60575b8ef78b0178f93285ffa2e2d9aa5eb0d2e86d4bad3cab63276f","ci/docker/x86_64-rumprun-netbsd/Dockerfile":"44c3107fb30380785aaed6ff73fa334017a5bb4e3b5c7d4876154f09023a2b99","ci/docker/x86_64-unknown-freebsd/Dockerfile":"ef0f9f63065218728d2daafaa5ba71b17e4ccc23d72e859e0a7133fc64c0815e","ci/docker/x86_64-unknown-linux-gnu/Dockerfile":"67fabbc8c6ac02376cf9344251ad49ecdac396b71accb572fd1ae65225325bc0","ci/docker/x86_64-unknown-linux-musl/Dockerfile":"f71019fed5204b950843ef5e56144161fda7e27fad68ed0e8bc4353c388c7bcf","ci/docker/x86_64-unknown-openbsd/Dockerfile":"dfa5c23a6cff8c7a9a846668118c71a8406a360801fd3632fb12e8fbda6b7338","ci/dox.sh":"9ea240a4a607036235fd68c01b5d2a59f365768d103d3be774dcf34aa3ff563e","ci/ios/deploy_and_run_on_ios_simulator.rs":"3175066fd7f82390f6226d881e1a1dda9767ea2705656870e0d7774e2731800e","ci/landing-page-footer.html":"b70b3112c2147f5c967e7481061ef38bc2d79a28dd55a16fb916d9c9426da2c4","ci/landing-page-head.html":"ad69663fac7924f27d0209bc519d55838e86edfc4133713a6fd08caadac1b142","ci/run-docker.sh":"655712ba6127eb2efe2c641cf4cf1246f3e485096d72ec57b423e9d2bff6fb73","ci/run-qemu.sh":"bb859421170871ef23a8940c5e150efec0c01b95e32d2ce2d37b79a45d9d346c","ci/run.sh":"48c0318287f02889cb73a55e3e2058e79c556d11797d47a1ed66d7c55d1be12f","ci/style.rs":"60564abc1d5197ed1598426dd0d6ee9939a16d2875b03373538f58843bb616c4","src/dox.rs":"f732d3c0dcd6ace854ee32d8f898b96ac42204a799c6e386c4ba88f6e58673dc","src/lib.rs":"651696755aed40230cde8a505a2dfef61bea52d6349c9b9343497a5c7158ec92","src/macros.rs":"bd9802772b0e5c8b3c550d1c24307f06c0d1e4ce656b4ae1cf092142bbe5412c","src/redox.rs":"3dd158ba9fbbabe96ce2607e91dbf07b93b37c0427734118702dcb4901fe8964","src/unix/bsd/apple/b32.rs":"110ecff78da0e8d405d861447904da403d8b3f6da1f0f9dc9987633f3f04fe46","src/unix/bsd/apple/b64.rs":"2c51c1c063bfb5076ecf08fbc9371ce9473878d2e046c186eb9433955f6f8ba6","src/unix/bsd/apple/mod.rs":"35595e27644099d93a5a17d461a66a71d795a926370d71027534d7baa46bfa6a","src/unix/bsd/freebsdlike/dragonfly/mod.rs":"54b3b30c4cac35ced9197e7267f209b0f168de8a6899ab0cba290c5ae399f0e7","src/unix/bsd/freebsdlike/freebsd/aarch64.rs":"c7f46b9ae23fde5a9e245a28ed1380066e67f081323b4d253a18e9da3b97b860","src/unix/bsd/freebsdlike/freebsd/mod.rs":"ba1bd1487b41be91115a21e3968d15e4d877043ba4946cd11ed2be2ee66afc19","src/unix/bsd/freebsdlike/freebsd/x86.rs":"54311d3ebf2bb091ab22361e377e6ef9224aec2ecfe459fbfcedde4932db9c58","src/unix/bsd/freebsdlike/freebsd/x86_64.rs":"c7f46b9ae23fde5a9e245a28ed1380066e67f081323b4d253a18e9da3b97b860","src/unix/bsd/freebsdlike/mod.rs":"48512a4922b9a1ff39a2fbdecc424dfb2b61f72f125926e454e30718f49cf2e4","src/unix/bsd/mod.rs":"83aca6470ce5f879d11268229a6643072fc57e8f4f81eb612dbe75de11a9f7bf","src/unix/bsd/netbsdlike/mod.rs":"50ca4e29f06669a0ebff72f2f24b2b08ff55478f580b1684e16a0cf6938a6a50","src/unix/bsd/netbsdlike/netbsd/mod.rs":"5b5c8d295a462ffca8dd65b826ead5d2d210e6a7a71a2909db600fa9aae36151","src/unix/bsd/netbsdlike/netbsd/other/b32/mod.rs":"bd251a102bed65d5cb3459275f6ec3310fe5803ff4c9651212115548f86256d0","src/unix/bsd/netbsdlike/netbsd/other/b64/mod.rs":"927eeccaf3269d299db4c2a55f8010807bf43dfa894aea6a783215f5d3560baa","src/unix/bsd/netbsdlike/netbsd/other/mod.rs":"4d9f7091af8e166943ac6f42ce85558909e5b6e61325039bff7adfbcf4b90212","src/unix/bsd/netbsdlike/openbsdlike/bitrig.rs":"f8cd05dacd3a3136c58da5a2fbe26f703767823b28e74fe8a2b57a7bd98d6d5c","src/unix/bsd/netbsdlike/openbsdlike/mod.rs":"2d4a17eb74ae5ced13fcd9bb1df283e5623a52754ec75b23cf7b76cb03d5f2a7","src/unix/bsd/netbsdlike/openbsdlike/openbsd.rs":"31686679c2df5f11437a338b9281fa0dd4f8d061dcd895d67619992171e115c9","src/unix/bsd/netbsdlike/openbsdlike/other/b32/mod.rs":"bd251a102bed65d5cb3459275f6ec3310fe5803ff4c9651212115548f86256d0","src/unix/bsd/netbsdlike/openbsdlike/other/b64/mod.rs":"927eeccaf3269d299db4c2a55f8010807bf43dfa894aea6a783215f5d3560baa","src/unix/bsd/netbsdlike/openbsdlike/other/mod.rs":"f5d8db6f54efd05520b31b764a6bacbf612e1aebce097d2d5bfaaef3b91f37b5","src/unix/haiku/b32.rs":"bd251a102bed65d5cb3459275f6ec3310fe5803ff4c9651212115548f86256d0","src/unix/haiku/b64.rs":"b422430c550c0ba833c9206d1350861e344e3a2eb33d7d58693efb35044be1cc","src/unix/haiku/mod.rs":"fe24d9863133ee2663b07ff872f4982ea36821c432fb569a9676436506c9a98a","src/unix/mod.rs":"e69109a87bbfeb6c4aff14451e664d96d709226061ae5fff0f96cb1b8f2c98cd","src/unix/notbsd/android/b32/arm.rs":"d63a234f3a2399bdef1fa13c6a209386cb5ddac04c90f2c6d42badc8235dc49d","src/unix/notbsd/android/b32/mod.rs":"c09b53e42b286a7ec56fb28d0a3e71ec42fecaec39b2015d1d4a3338b172c570","src/unix/notbsd/android/b32/x86.rs":"10e6879dcbf136f0e907337987a0609b357e27e0f24ccb907525fcad881c24c3","src/unix/notbsd/android/b64/aarch64.rs":"d0a25e73f8d02f8412fa9237e41d3f4993b45603a2a8f8d1690bc6624a190d42","src/unix/notbsd/android/b64/mod.rs":"172d704a50d6fb9f67683c7e66ff15b5c9f7b11e7064aa8bd129228ff074393f","src/unix/notbsd/android/b64/x86_64.rs":"a2b048dad18c60ede035645bbfea2ba3dd75197c1ee0d54fb5fcab14d6c35194","src/unix/notbsd/android/mod.rs":"6b0bf37d0daa02b01a135a48189657dabc3dc7db1338d8bef0e18f96ccea8fb4","src/unix/notbsd/linux/mips/mips32.rs":"63c3e468e066aa1aebf7e9dafca202d13207bbeb1ce2f426b144f8066e95b1fd","src/unix/notbsd/linux/mips/mips64.rs":"62045a58e371431c1ca9fc6d7e3ab350520518aa71fb21669975aae1f13ebeb9","src/unix/notbsd/linux/mips/mod.rs":"9c263551896f5a4403282a20f39f2113f02cb34d968dc65bd80dc73c65fbeb25","src/unix/notbsd/linux/mod.rs":"60a71885dd1d510589af295772c9d6f8ab7ef28eb8e5db3729cb93d4e5ffc223","src/unix/notbsd/linux/musl/b32/arm.rs":"d43ba5c528926261b1ccd529ab55636254360a084ab84a7ec22a4eb5afddb8f8","src/unix/notbsd/linux/musl/b32/asmjs.rs":"085e410f990312de76f74cb9bbf9fcc27d686e94334143b34511f565d1b8bb91","src/unix/notbsd/linux/musl/b32/mips.rs":"941c88bc413ba2b87eb6a6cfe03355ee148b865f39598456965b3d04b3adbbe6","src/unix/notbsd/linux/musl/b32/mod.rs":"fc7e055edbe6fa170c2bda6b3415066c1871b3e60ebb70a6329d008f77100f0b","src/unix/notbsd/linux/musl/b32/x86.rs":"ffa5781b52a7d2774a34b1e3e2034a498b919fd96eb85e88098dba2e674a3797","src/unix/notbsd/linux/musl/b64/aarch64.rs":"4009c7eaf703472daef2a70bdac910d9fc395a33689ef2e8cf1c4e692445d3f0","src/unix/notbsd/linux/musl/b64/mod.rs":"d9b03a59a54a568b07ffa4380103a926cbb45dbfd87745edef79cd971ef31283","src/unix/notbsd/linux/musl/b64/powerpc64.rs":"dc28f5b7284235d6cf5519053cac59a1c16dc39223b71cca0871e4880755f852","src/unix/notbsd/linux/musl/b64/x86_64.rs":"43291acc0dfc92c2fec8ba6ce77ee9ca3c20bcdccec18e149f95ba911cee704b","src/unix/notbsd/linux/musl/mod.rs":"0bd97702f5c84181c53f45466fb04afb9441f6950580b6ad59257e5c73089796","src/unix/notbsd/linux/other/b32/arm.rs":"d373022fd152341ec8f5d106937c7898dd68fb4c0346bd94a37526542a605e9a","src/unix/notbsd/linux/other/b32/mod.rs":"6122be151c5d85b9df6a3aaefc5cafd0657b371cafa9cb31ed9b1a394976af45","src/unix/notbsd/linux/other/b32/powerpc.rs":"cc85e75675abc37414fc7701dda7c3f6396e7b2d3c52eea7febdc41f7b033ea9","src/unix/notbsd/linux/other/b32/x86.rs":"1ec7dbfa52d59d3f79c46d5b6854e2dd3bd44dd0f020d4e32183eed4c00bbd52","src/unix/notbsd/linux/other/b64/aarch64.rs":"ce342b37a4a60c216625c8e177a50b3f328bdfd5c527e32e06c73f4aa5926829","src/unix/notbsd/linux/other/b64/mod.rs":"bee90e8d9217ee344d0e99fd483766a1b28e8b1ded930d44a0400a5e5224bb6a","src/unix/notbsd/linux/other/b64/powerpc64.rs":"fc7131f39a75a9e35d474d70b0bc829c52590dadf472ae5785972a94ffb95f12","src/unix/notbsd/linux/other/b64/sparc64.rs":"0ba7f399349bc586ebb73d0caef5c67f195c9e3a942eabfb2efd133b4cea9872","src/unix/notbsd/linux/other/b64/x86_64.rs":"a5e62a7e12891fb545d4b9a40c139c254ba392fd3b285a7f317668f8533c3e4f","src/unix/notbsd/linux/other/mod.rs":"46b060787a60493e71406be35b77c24048cdc54326b65c9961fbb1fb9d354de3","src/unix/notbsd/linux/s390x.rs":"2dec96036cadd8354cd56ef8dd7018e75ae92326ec7b5963bc9cdbba0c7d694b","src/unix/notbsd/mod.rs":"5a4a2a7799c7b244c439a9599d8885c17dad0cf6179e8f31fb1de4e72f153b53","src/unix/solaris/mod.rs":"ba70c4ebd371f2580c1fb8f3f6cd32a391ec017e1eed9812137caa94e5149a03","src/unix/uclibc/mips/mips32.rs":"31b23e466cffb86116421ec9240b86e7419aacd84b0b1b04d23c7142c8717566","src/unix/uclibc/mips/mips64.rs":"e67eec1636a998b047d89a4cda1c99cb6bc3071db017762675179a68201c4438","src/unix/uclibc/mips/mod.rs":"74817a9b1ee3998d8e0b751a555d57225f70fd979c283c94ada344a162a8b856","src/unix/uclibc/mod.rs":"ed4b4c76c3750f92c70bf252cc7210fb3d0fa48a3eadead0911536fe32b7e126","src/windows.rs":"acccbd341e81206cb1dc66af41762c193ac0dd719d700b64f7e26c967ee7d670"},"package":"e7eb6b826bfc1fdea7935d46556250d1799b7fe2d9f7951071f4291710665e3e"}
++{"files":{},"package":"e7eb6b826bfc1fdea7935d46556250d1799b7fe2d9f7951071f4291710665e3e"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..f0ff2599d09b56baf64cb3af4906408f5212e00e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++target
++Cargo.lock
++*~
index ae12047fd69ec54ffed6f3d4b169020d17b692dc,0000000000000000000000000000000000000000..ed4f92ed609dfb34c563616eaa0a8ab72908c7bc
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"addac91542721a6903a9c48d286772ac2a5e31f29adb3edd73f5d275f3b1bc8a","build.rs":"eb52a3bd9799b972b16ab76851cbf507fcb4d6a01cef1ae6055494f464d83aac","lib.rs":"f872c427acae00f96d298f33e5f3ad726bdb553ee50f153a8a16c70e99982c45"},"package":"df18a822100352d9863b302faf6f8f25c0e77f0e60feb40e5dbe1238b7f13b1d"}
++{"files":{},"package":"df18a822100352d9863b302faf6f8f25c0e77f0e60feb40e5dbe1238b7f13b1d"}
index 01655b914fb4d8e4e507ed7b2fb2948b13d962b7,0000000000000000000000000000000000000000..1972f6aa3298f98b7a49f30b5d2a27c610766595
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"97b5e794d2c8521fd577a28b776299cd77950e1b961d0ed5968f1e55cc311485","build.rs":"2be0c5f9f0edfd3d9ce72f573bc329e7f3736f03787d0bfc2a650dfaf3a84ff2","lib.rs":"c9f2b1d3cbae622fc612805eb8e4a0c2d9743d379420d737cd57376d27eb0665"},"package":"0db4ec23611747ef772db1c4d650f8bd762f07b461727ec998f953c614024b75"}
++{"files":{},"package":"0db4ec23611747ef772db1c4d650f8bd762f07b461727ec998f953c614024b75"}
index 3d251d17559ec117c3500368362ff943fbf15564,0000000000000000000000000000000000000000..2250ee04f58cc573bec38ef1980a775d77a54d1d
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"a19093729b3ad9644f76f43c23b3583cfc9a7cd029d8c3a728cba6fd624abf1c","Cargo.toml":"87b900f1b539579704d6e06a90c96ccc93b4ff9787e33b73258d003eb75984de","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"5608aaff2a40334a1391969369ec57558f260366695bec2644c6372c7e3e1318","appveyor.yml":"24edb3195fdd6430315f3fddf33c46b5385999b9a5bb9c1c8886c97658dfe84e","build.rs":"31ca92db39bc405f4b640fc0c76eada116a815591a0f1c88a7145a2e0052664c","src/lib.rs":"4f8e0d94503386cd1809f9dc4a3c9037a36c4a7fd863879b9357cac943172e4c"},"package":"e70195f655a44af531ad7135b1ec2a0a82522b451fe09730fbb25674a85996e7"}
++{"files":{},"package":"e70195f655a44af531ad7135b1ec2a0a82522b451fe09730fbb25674a85996e7"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 0a28c39fee4f4adf3e3447709e76f8c5e9804977,0000000000000000000000000000000000000000..c34441b19ed95f77cd8069b0b7426709eda73b92
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"985cf95c79f32c65766927fd6ef5079f8c14f235ddb4213e6410d90a86a95811","Cargo.toml":"0a4a756f7ef47f5dfa221a173b21f9ec496b448aafcd9bde08d9d16935b55007","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"aa8356455efcc3d49f66e7fa394eac292c9158164dff074e32c699b64891cb4b","appveyor.yml":"c61473b8c780ad2626282ce2b2ba0ef278082b6afe151a62ff419f33eaf90221","src/lib.rs":"75b44acfc9627b821cd725649db07693a43b2e44b2fac19b79354c6d950c4038","src/macros.rs":"3953610da3ee2dc393262b753f2406d1864a1cbd74d2bd20d279e09aabfe7131","tests/filters.rs":"cc61ed41a6cd77e5aef91cc8c76216b492d8de34f00635254f3835a3d964ce22"},"package":"880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b"}
++{"files":{},"package":"880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2c96eb1b6517f2617f9ddeae9f07f5fd7bd7ddef
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target/
++Cargo.lock
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..66638c65ef0880fee70fd4da4348b75766cb13f5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,41 @@@
++[package]
++
++name = "log"
++version = "0.3.8"
++authors = ["The Rust Project Developers"]
++license = "MIT/Apache-2.0"
++readme = "README.md"
++repository = "https://github.com/rust-lang/log"
++documentation = "https://docs.rs/log"
++homepage = "https://github.com/rust-lang/log"
++description = """
++A lightweight logging facade for Rust
++"""
++categories = ["development-tools::debugging"]
++
++[[test]]
++name = "filters"
++harness = false
++
++[features]
++max_level_off   = []
++max_level_error = []
++max_level_warn  = []
++max_level_info  = []
++max_level_debug = []
++max_level_trace = []
++
++release_max_level_off   = []
++release_max_level_error = []
++release_max_level_warn  = []
++release_max_level_info  = []
++release_max_level_debug = []
++release_max_level_trace = []
++
++nightly = []
++use_std = []
++default = ["use_std"]
++
++[badges]
++travis-ci = { repository = "rust-lang-nursery/log" }
++appveyor = { repository = "alexcrichton/log" }
index 42b442fd94d56e3047a21ff5e2fcdf36b46afc37,0000000000000000000000000000000000000000..b2b1793711d9da04e8b99e1522d9bea6b6d30746
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"8bbbe858562332a57f5f5551b427e79874ae3c3df52766df61860871288e827a","LICENSE":"d7b49708075b5f43f8e108464f1970c8c66fa8b6afce4f9c944da3af77cc1460","lib.rs":"d927e99fc4fd88b0e30b44580384b411e63bc504e9953ac7cc85029437372266"},"package":"efd7622e3022e1a6eaa602c4cea8912254e5582c9c692e9167714182244801b1"}
++{"files":{},"package":"efd7622e3022e1a6eaa602c4cea8912254e5582c9c692e9167714182244801b1"}
index a03e7ec285331b9c83b955887a271dc346195e47,0000000000000000000000000000000000000000..956ff610c34e136406f9fbb42d7be477107444b0
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"2deed7e3f2822ad15527782209bb7b28ab97266df86cfa5ed73cf3f617646b4d","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"e14364f51823f23ab07d784eabfcbf42e2f47d8c7f12ca5aaeb71493ddeb4e36","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","Makefile":"a45a128685a2ae7d4fa39d310786674417ee113055ef290a11f88002285865fc","README.md":"ace39c7d6a21672a1bc456ed20de82c5a4d9c4bbec8f7ee00af80a6c363ba9c5","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","appveyor.yml":"b5c1a28f805854370f24e530df912764a9520f4581b33da090f44cec0eef181c","benches/bench.rs":"87cfb76154c3c322691201c6f5649b37665ed8bf1cf303bca971309a4eef6b61","ctags.rust":"3d128d3cc59f702e68953ba2fe6c3f46bc6991fc575308db060482d5da0c79f3","session.vim":"95cb1d7caf0ff7fbe76ec911988d908ddd883381c925ba64b537695bc9f021c4","src/lib.rs":"694210b9b046fe2228827e971442344a421431d42649c78dea3784ff3a69247d"},"package":"d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"}
++{"files":{},"package":"d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d24edbd878654bdd87ebf388b33296131ad53acb
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,9 @@@
++.*.swp
++doc
++tags
++examples/ss10pusa.csv
++build
++target
++Cargo.lock
++scratch*
++bench_large/huge
index 0104691e435e5aaef2d3345fdcb3d14f6fb1e848,0000000000000000000000000000000000000000..aa05bd8ef094643555cb91749127f01e34c99ccc
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"7c44542bc6662b5af4f15a98b2bcf052a57190922eb280bce93688785c31e323","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"5413b7fd49541b0fd15a0719f9b1f052c5c965ae3cdee53258a87557ad981e8b","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","Makefile":"a45a128685a2ae7d4fa39d310786674417ee113055ef290a11f88002285865fc","README.md":"74e385c51a2402527a61a500d66e509fea97961f15bfffab85040064e576fe31","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","appveyor.yml":"b5c1a28f805854370f24e530df912764a9520f4581b33da090f44cec0eef181c","benches/bench.rs":"87cfb76154c3c322691201c6f5649b37665ed8bf1cf303bca971309a4eef6b61","ctags.rust":"3d128d3cc59f702e68953ba2fe6c3f46bc6991fc575308db060482d5da0c79f3","session.vim":"95cb1d7caf0ff7fbe76ec911988d908ddd883381c925ba64b537695bc9f021c4","src/lib.rs":"4c0d116ddfdb0fd4130b4c5690671760401937d4108b1d913a17c3a6fde776b1"},"package":"1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4"}
++{"files":{},"package":"1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d24edbd878654bdd87ebf388b33296131ad53acb
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,9 @@@
++.*.swp
++doc
++tags
++examples/ss10pusa.csv
++build
++target
++Cargo.lock
++scratch*
++bench_large/huge
index 5bf026c22e1c18e9cc4c506da9a954608c85eb9d,0000000000000000000000000000000000000000..cd8571c177a73e2021123424554a07a59b5b193e
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"ea9ad87421deb76d7d6ab5232ccf1f2265e813069c6ae8fbcef88aecab3657cc","build.rs":"03c1c5148146084a63e5104078ed29df8a201541e6c45522c5c79e600393f363","lib.rs":"6b4b534e78dee29b006f460245af34f54eefcc39c82740d27cbe9140072b9926","miniz.c":"b2e9875b20eff162e904a3fd8d692afd34fcc4fd83b6bfa57fec2e51329053ed"},"package":"28eaee17666671fa872e567547e8428e83308ebe5808cdf6a0e28397dbe2c726"}
++{"files":{},"package":"28eaee17666671fa872e567547e8428e83308ebe5808cdf6a0e28397dbe2c726"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..93d1f85836f52dc4d348617d366255828c1ad681
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++{"files":{},"package":"8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
new file mode 100644 (file)
--- /dev/null
--- /dev/null
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..6e4252325dc99568b8fe81c87dd04a4008aa87b4
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,23 @@@
++[package]
++name = "miow"
++version = "0.2.1"
++authors = ["Alex Crichton <alex@alexcrichton.com>"]
++license = "MIT/Apache-2.0"
++readme = "README.md"
++keywords = ["iocp", "windows", "io", "overlapped"]
++repository = "https://github.com/alexcrichton/miow"
++homepage = "https://github.com/alexcrichton/miow"
++documentation = "https://docs.rs/miow/0.1/x86_64-pc-windows-msvc/miow/"
++description = """
++A zero overhead I/O library for Windows, focusing on IOCP and Async I/O
++abstractions.
++"""
++
++[dependencies]
++winapi = "0.2"
++kernel32-sys = "0.2"
++ws2_32-sys = "0.2"
++net2 = { version = "0.2.5", default-features = false }
++
++[dev-dependencies]
++rand = "0.3"
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..16fe87b06e802f094b3fbb0894b137bca2b16ef1
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,201 @@@
++                              Apache License
++                        Version 2.0, January 2004
++                     http://www.apache.org/licenses/
++
++TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
++
++1. Definitions.
++
++   "License" shall mean the terms and conditions for use, reproduction,
++   and distribution as defined by Sections 1 through 9 of this document.
++
++   "Licensor" shall mean the copyright owner or entity authorized by
++   the copyright owner that is granting the License.
++
++   "Legal Entity" shall mean the union of the acting entity and all
++   other entities that control, are controlled by, or are under common
++   control with that entity. For the purposes of this definition,
++   "control" means (i) the power, direct or indirect, to cause the
++   direction or management of such entity, whether by contract or
++   otherwise, or (ii) ownership of fifty percent (50%) or more of the
++   outstanding shares, or (iii) beneficial ownership of such entity.
++
++   "You" (or "Your") shall mean an individual or Legal Entity
++   exercising permissions granted by this License.
++
++   "Source" form shall mean the preferred form for making modifications,
++   including but not limited to software source code, documentation
++   source, and configuration files.
++
++   "Object" form shall mean any form resulting from mechanical
++   transformation or translation of a Source form, including but
++   not limited to compiled object code, generated documentation,
++   and conversions to other media types.
++
++   "Work" shall mean the work of authorship, whether in Source or
++   Object form, made available under the License, as indicated by a
++   copyright notice that is included in or attached to the work
++   (an example is provided in the Appendix below).
++
++   "Derivative Works" shall mean any work, whether in Source or Object
++   form, that is based on (or derived from) the Work and for which the
++   editorial revisions, annotations, elaborations, or other modifications
++   represent, as a whole, an original work of authorship. For the purposes
++   of this License, Derivative Works shall not include works that remain
++   separable from, or merely link (or bind by name) to the interfaces of,
++   the Work and Derivative Works thereof.
++
++   "Contribution" shall mean any work of authorship, including
++   the original version of the Work and any modifications or additions
++   to that Work or Derivative Works thereof, that is intentionally
++   submitted to Licensor for inclusion in the Work by the copyright owner
++   or by an individual or Legal Entity authorized to submit on behalf of
++   the copyright owner. For the purposes of this definition, "submitted"
++   means any form of electronic, verbal, or written communication sent
++   to the Licensor or its representatives, including but not limited to
++   communication on electronic mailing lists, source code control systems,
++   and issue tracking systems that are managed by, or on behalf of, the
++   Licensor for the purpose of discussing and improving the Work, but
++   excluding communication that is conspicuously marked or otherwise
++   designated in writing by the copyright owner as "Not a Contribution."
++
++   "Contributor" shall mean Licensor and any individual or Legal Entity
++   on behalf of whom a Contribution has been received by Licensor and
++   subsequently incorporated within the Work.
++
++2. Grant of Copyright License. Subject to the terms and conditions of
++   this License, each Contributor hereby grants to You a perpetual,
++   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
++   copyright license to reproduce, prepare Derivative Works of,
++   publicly display, publicly perform, sublicense, and distribute the
++   Work and such Derivative Works in Source or Object form.
++
++3. Grant of Patent License. Subject to the terms and conditions of
++   this License, each Contributor hereby grants to You a perpetual,
++   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
++   (except as stated in this section) patent license to make, have made,
++   use, offer to sell, sell, import, and otherwise transfer the Work,
++   where such license applies only to those patent claims licensable
++   by such Contributor that are necessarily infringed by their
++   Contribution(s) alone or by combination of their Contribution(s)
++   with the Work to which such Contribution(s) was submitted. If You
++   institute patent litigation against any entity (including a
++   cross-claim or counterclaim in a lawsuit) alleging that the Work
++   or a Contribution incorporated within the Work constitutes direct
++   or contributory patent infringement, then any patent licenses
++   granted to You under this License for that Work shall terminate
++   as of the date such litigation is filed.
++
++4. Redistribution. You may reproduce and distribute copies of the
++   Work or Derivative Works thereof in any medium, with or without
++   modifications, and in Source or Object form, provided that You
++   meet the following conditions:
++
++   (a) You must give any other recipients of the Work or
++       Derivative Works a copy of this License; and
++
++   (b) You must cause any modified files to carry prominent notices
++       stating that You changed the files; and
++
++   (c) You must retain, in the Source form of any Derivative Works
++       that You distribute, all copyright, patent, trademark, and
++       attribution notices from the Source form of the Work,
++       excluding those notices that do not pertain to any part of
++       the Derivative Works; and
++
++   (d) If the Work includes a "NOTICE" text file as part of its
++       distribution, then any Derivative Works that You distribute must
++       include a readable copy of the attribution notices contained
++       within such NOTICE file, excluding those notices that do not
++       pertain to any part of the Derivative Works, in at least one
++       of the following places: within a NOTICE text file distributed
++       as part of the Derivative Works; within the Source form or
++       documentation, if provided along with the Derivative Works; or,
++       within a display generated by the Derivative Works, if and
++       wherever such third-party notices normally appear. The contents
++       of the NOTICE file are for informational purposes only and
++       do not modify the License. You may add Your own attribution
++       notices within Derivative Works that You distribute, alongside
++       or as an addendum to the NOTICE text from the Work, provided
++       that such additional attribution notices cannot be construed
++       as modifying the License.
++
++   You may add Your own copyright statement to Your modifications and
++   may provide additional or different license terms and conditions
++   for use, reproduction, or distribution of Your modifications, or
++   for any such Derivative Works as a whole, provided Your use,
++   reproduction, and distribution of the Work otherwise complies with
++   the conditions stated in this License.
++
++5. Submission of Contributions. Unless You explicitly state otherwise,
++   any Contribution intentionally submitted for inclusion in the Work
++   by You to the Licensor shall be under the terms and conditions of
++   this License, without any additional terms or conditions.
++   Notwithstanding the above, nothing herein shall supersede or modify
++   the terms of any separate license agreement you may have executed
++   with Licensor regarding such Contributions.
++
++6. Trademarks. This License does not grant permission to use the trade
++   names, trademarks, service marks, or product names of the Licensor,
++   except as required for reasonable and customary use in describing the
++   origin of the Work and reproducing the content of the NOTICE file.
++
++7. Disclaimer of Warranty. Unless required by applicable law or
++   agreed to in writing, Licensor provides the Work (and each
++   Contributor provides its Contributions) on an "AS IS" BASIS,
++   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
++   implied, including, without limitation, any warranties or conditions
++   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
++   PARTICULAR PURPOSE. You are solely responsible for determining the
++   appropriateness of using or redistributing the Work and assume any
++   risks associated with Your exercise of permissions under this License.
++
++8. Limitation of Liability. In no event and under no legal theory,
++   whether in tort (including negligence), contract, or otherwise,
++   unless required by applicable law (such as deliberate and grossly
++   negligent acts) or agreed to in writing, shall any Contributor be
++   liable to You for damages, including any direct, indirect, special,
++   incidental, or consequential damages of any character arising as a
++   result of this License or out of the use or inability to use the
++   Work (including but not limited to damages for loss of goodwill,
++   work stoppage, computer failure or malfunction, or any and all
++   other commercial damages or losses), even if such Contributor
++   has been advised of the possibility of such damages.
++
++9. Accepting Warranty or Additional Liability. While redistributing
++   the Work or Derivative Works thereof, You may choose to offer,
++   and charge a fee for, acceptance of support, warranty, indemnity,
++   or other liability obligations and/or rights consistent with this
++   License. However, in accepting such obligations, You may act only
++   on Your own behalf and on Your sole responsibility, not on behalf
++   of any other Contributor, and only if You agree to indemnify,
++   defend, and hold each Contributor harmless for any liability
++   incurred by, or claims asserted against, such Contributor by reason
++   of your accepting any such warranty or additional liability.
++
++END OF TERMS AND CONDITIONS
++
++APPENDIX: How to apply the Apache License to your work.
++
++   To apply the Apache License to your work, attach the following
++   boilerplate notice, with the fields enclosed by brackets "[]"
++   replaced with your own identifying information. (Don't include
++   the brackets!)  The text should be enclosed in the appropriate
++   comment syntax for the file format. We also recommend that a
++   file or class name and description of purpose be included on the
++   same "printed page" as the copyright notice for easier
++   identification within third-party archives.
++
++Copyright [yyyy] [name of copyright owner]
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++      http://www.apache.org/licenses/LICENSE-2.0
++
++Unless required by applicable law or agreed to in writing, software
++distributed under the License is distributed on an "AS IS" BASIS,
++WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++See the License for the specific language governing permissions and
++limitations under the License.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..39e0ed6602151f235148e6c08413aa7eda5b9038
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25 @@@
++Copyright (c) 2014 Alex Crichton
++
++Permission is hereby granted, free of charge, to any
++person obtaining a copy of this software and associated
++documentation files (the "Software"), to deal in the
++Software without restriction, including without
++limitation the rights to use, copy, modify, merge,
++publish, distribute, sublicense, and/or sell copies of
++the Software, and to permit persons to whom the Software
++is furnished to do so, subject to the following
++conditions:
++
++The above copyright notice and this permission notice
++shall be included in all copies or substantial portions
++of the Software.
++
++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
++ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
++TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
++PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
++SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
++CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
++OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
++IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++DEALINGS IN THE SOFTWARE.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..947bd836ac2586197dd4d0bf10e5d38e40434216
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,22 @@@
++# miow
++
++[![Build status](https://ci.appveyor.com/api/projects/status/tc5lsxokjk86949l?svg=true)](https://ci.appveyor.com/project/alexcrichton/miow)
++
++[Documentation](https://docs.rs/miow/0.1/x86_64-pc-windows-msvc/miow/)
++
++A zero overhead Windows I/O library focusing on IOCP and other async I/O
++features.
++
++```toml
++# Cargo.toml
++[dependencies]
++miow = "0.1"
++```
++
++# License
++
++`miow` is primarily distributed under the terms of both the MIT license and
++the Apache License (Version 2.0), with portions covered by various BSD-like
++licenses.
++
++See LICENSE-APACHE, and LICENSE-MIT for details.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2700e425c7063cb80ed9a04de1b170a499b0ef4a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,20 @@@
++environment:
++  matrix:
++  - TARGET: x86_64-pc-windows-msvc
++  - TARGET: i686-pc-windows-msvc
++  - TARGET: i686-pc-windows-gnu
++  GH_TOKEN:
++    secure: nHB4fVo+y/Aak+L0nYfrT8Rcs8OfUNm0F2xcIVFVYJ9ehf0CzvCmSMUvWguM0kKp
++
++install:
++  - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-nightly-${env:TARGET}.exe"
++  - rust-nightly-%TARGET%.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
++  - SET PATH=%PATH%;C:\Program Files (x86)\Rust\bin
++  - SET PATH=%PATH%;C:\MinGW\bin
++  - rustc -V
++  - cargo -V
++
++build: false
++
++test_script:
++  - cargo test --target %TARGET%
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a2be11da6228d47308730ff492a1ec1ee4582857
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,93 @@@
++use std::io;
++use std::cmp;
++
++use winapi::*;
++use kernel32::*;
++
++#[derive(Debug)]
++pub struct Handle(HANDLE);
++
++unsafe impl Send for Handle {}
++unsafe impl Sync for Handle {}
++
++impl Handle {
++    pub fn new(handle: HANDLE) -> Handle {
++        Handle(handle)
++    }
++
++    pub fn raw(&self) -> HANDLE { self.0 }
++
++    pub fn into_raw(self) -> HANDLE {
++        use std::mem;
++
++        let ret = self.0;
++        mem::forget(self);
++        ret
++    }
++
++    pub fn write(&self, buf: &[u8]) -> io::Result<usize> {
++        let mut bytes = 0;
++        let len = cmp::min(buf.len(), <DWORD>::max_value() as usize) as DWORD;
++        try!(::cvt(unsafe {
++            WriteFile(self.0, buf.as_ptr() as *const _, len, &mut bytes,
++                      0 as *mut _)
++        }));
++        Ok(bytes as usize)
++    }
++
++    pub fn read(&self, buf: &mut [u8]) -> io::Result<usize> {
++        let mut bytes = 0;
++        let len = cmp::min(buf.len(), <DWORD>::max_value() as usize) as DWORD;
++        try!(::cvt(unsafe {
++            ReadFile(self.0, buf.as_mut_ptr() as *mut _, len, &mut bytes,
++                     0 as *mut _)
++        }));
++        Ok(bytes as usize)
++    }
++
++    pub unsafe fn read_overlapped(&self, buf: &mut [u8],
++                                  overlapped: *mut OVERLAPPED)
++                                  -> io::Result<Option<usize>> {
++        let len = cmp::min(buf.len(), <DWORD>::max_value() as usize) as DWORD;
++        let mut bytes = 0;
++        let res = ::cvt({
++            ReadFile(self.0,
++                     buf.as_mut_ptr() as *mut _,
++                     len,
++                     &mut bytes,
++                     overlapped)
++        });
++        match res {
++            Ok(_) => Ok(Some(bytes as usize)),
++            Err(ref e) if e.raw_os_error() == Some(ERROR_IO_PENDING as i32)
++                => Ok(None),
++            Err(e) => Err(e),
++        }
++    }
++
++    pub unsafe fn write_overlapped(&self, buf: &[u8],
++                                   overlapped: *mut OVERLAPPED)
++                                   -> io::Result<Option<usize>> {
++        let len = cmp::min(buf.len(), <DWORD>::max_value() as usize) as DWORD;
++        let mut bytes = 0;
++        let res = ::cvt({
++            WriteFile(self.0,
++                      buf.as_ptr() as *const _,
++                      len,
++                      &mut bytes,
++                      overlapped)
++        });
++        match res {
++            Ok(_) => Ok(Some(bytes as usize)),
++            Err(ref e) if e.raw_os_error() == Some(ERROR_IO_PENDING as i32)
++                => Ok(None),
++            Err(e) => Err(e),
++        }
++    }
++}
++
++impl Drop for Handle {
++    fn drop(&mut self) {
++        unsafe { CloseHandle(self.0) };
++    }
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..08b78d1ee2dbebb91ac3699236cf8f7945fb37c2
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,313 @@@
++//! Bindings to IOCP, I/O Completion Ports
++
++use std::cmp;
++use std::io;
++use std::mem;
++use std::os::windows::io::*;
++use std::time::Duration;
++
++use handle::Handle;
++use winapi::*;
++use kernel32::*;
++use Overlapped;
++
++/// A handle to an Windows I/O Completion Port.
++#[derive(Debug)]
++pub struct CompletionPort {
++    handle: Handle,
++}
++
++/// A status message received from an I/O completion port.
++///
++/// These statuses can be created via the `new` or `empty` constructors and then
++/// provided to a completion port, or they are read out of a completion port.
++/// The fields of each status are read through its accessor methods.
++#[derive(Clone, Copy, Debug)]
++pub struct CompletionStatus(OVERLAPPED_ENTRY);
++
++unsafe impl Send for CompletionStatus {}
++unsafe impl Sync for CompletionStatus {}
++
++impl CompletionPort {
++    /// Creates a new I/O completion port with the specified concurrency value.
++    ///
++    /// The number of threads given corresponds to the level of concurrency
++    /// allowed for threads associated with this port. Consult the Windows
++    /// documentation for more information about this value.
++    pub fn new(threads: u32) -> io::Result<CompletionPort> {
++        let ret = unsafe {
++            CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0 as *mut _,
++                                   0, threads)
++        };
++        if ret.is_null() {
++            Err(io::Error::last_os_error())
++        } else {
++            Ok(CompletionPort { handle: Handle::new(ret) })
++        }
++    }
++
++    /// Associates a new `HANDLE` to this I/O completion port.
++    ///
++    /// This function will associate the given handle to this port with the
++    /// given `token` to be returned in status messages whenever it receives a
++    /// notification.
++    ///
++    /// Any object which is convertible to a `HANDLE` via the `AsRawHandle`
++    /// trait can be provided to this function, such as `std::fs::File` and
++    /// friends.
++    pub fn add_handle<T: AsRawHandle + ?Sized>(&self, token: usize,
++                                               t: &T) -> io::Result<()> {
++        self._add(token, t.as_raw_handle())
++    }
++
++    /// Associates a new `SOCKET` to this I/O completion port.
++    ///
++    /// This function will associate the given socket to this port with the
++    /// given `token` to be returned in status messages whenever it receives a
++    /// notification.
++    ///
++    /// Any object which is convertible to a `SOCKET` via the `AsRawSocket`
++    /// trait can be provided to this function, such as `std::net::TcpStream`
++    /// and friends.
++    pub fn add_socket<T: AsRawSocket + ?Sized>(&self, token: usize,
++                                               t: &T) -> io::Result<()> {
++        self._add(token, t.as_raw_socket() as HANDLE)
++    }
++
++    fn _add(&self, token: usize, handle: HANDLE) -> io::Result<()> {
++        assert_eq!(mem::size_of_val(&token), mem::size_of::<ULONG_PTR>());
++        let ret = unsafe {
++            CreateIoCompletionPort(handle, self.handle.raw(),
++                                   token as ULONG_PTR, 0)
++        };
++        if ret.is_null() {
++            Err(io::Error::last_os_error())
++        } else {
++            debug_assert_eq!(ret, self.handle.raw());
++            Ok(())
++        }
++    }
++
++    /// Dequeue a completion status from this I/O completion port.
++    ///
++    /// This function will associate the calling thread with this completion
++    /// port and then wait for a status message to become available. The precise
++    /// semantics on when this function returns depends on the concurrency value
++    /// specified when the port was created.
++    ///
++    /// A timeout can optionally be specified to this function. If `None` is
++    /// provided this function will not time out, and otherwise it will time out
++    /// after the specified duration has passed.
++    ///
++    /// On success this will return the status message which was dequeued from
++    /// this completion port.
++    pub fn get(&self, timeout: Option<Duration>) -> io::Result<CompletionStatus> {
++        let mut bytes = 0;
++        let mut token = 0;
++        let mut overlapped = 0 as *mut _;
++        let timeout = ::dur2ms(timeout);
++        let ret = unsafe {
++            GetQueuedCompletionStatus(self.handle.raw(),
++                                      &mut bytes,
++                                      &mut token,
++                                      &mut overlapped,
++                                      timeout)
++        };
++        ::cvt(ret).map(|_| {
++            CompletionStatus(OVERLAPPED_ENTRY {
++                dwNumberOfBytesTransferred: bytes,
++                lpCompletionKey: token,
++                lpOverlapped: overlapped,
++                Internal: 0,
++            })
++        })
++    }
++
++    /// Dequeues a number of completion statuses from this I/O completion port.
++    ///
++    /// This function is the same as `get` except that it may return more than
++    /// one status. A buffer of "zero" statuses is provided (the contents are
++    /// not read) and then on success this function will return a sub-slice of
++    /// statuses which represent those which were dequeued from this port. This
++    /// function does not wait to fill up the entire list of statuses provided.
++    ///
++    /// Like with `get`, a timeout may be specified for this operation.
++    pub fn get_many<'a>(&self,
++                        list: &'a mut [CompletionStatus],
++                        timeout: Option<Duration>)
++                        -> io::Result<&'a mut [CompletionStatus]>
++    {
++        debug_assert_eq!(mem::size_of::<CompletionStatus>(),
++                         mem::size_of::<OVERLAPPED_ENTRY>());
++        let mut removed = 0;
++        let timeout = ::dur2ms(timeout);
++        let len = cmp::min(list.len(), <ULONG>::max_value() as usize) as ULONG;
++        let ret = unsafe {
++            GetQueuedCompletionStatusEx(self.handle.raw(),
++                                        list.as_ptr() as *mut _,
++                                        len,
++                                        &mut removed,
++                                        timeout,
++                                        FALSE)
++        };
++        match ::cvt(ret) {
++            Ok(_) => Ok(&mut list[..removed as usize]),
++            Err(e) => Err(e),
++        }
++    }
++
++    /// Posts a new completion status onto this I/O completion port.
++    ///
++    /// This function will post the given status, with custom parameters, to the
++    /// port. Threads blocked in `get` or `get_many` will eventually receive
++    /// this status.
++    pub fn post(&self, status: CompletionStatus) -> io::Result<()> {
++        let ret = unsafe {
++            PostQueuedCompletionStatus(self.handle.raw(),
++                                       status.0.dwNumberOfBytesTransferred,
++                                       status.0.lpCompletionKey,
++                                       status.0.lpOverlapped)
++        };
++        ::cvt(ret).map(|_| ())
++    }
++}
++
++impl AsRawHandle for CompletionPort {
++    fn as_raw_handle(&self) -> HANDLE {
++        self.handle.raw()
++    }
++}
++
++impl FromRawHandle for CompletionPort {
++    unsafe fn from_raw_handle(handle: HANDLE) -> CompletionPort {
++        CompletionPort { handle: Handle::new(handle) }
++    }
++}
++
++impl IntoRawHandle for CompletionPort {
++    fn into_raw_handle(self) -> HANDLE {
++        self.handle.into_raw()
++    }
++}
++
++impl CompletionStatus {
++    /// Creates a new completion status with the provided parameters.
++    ///
++    /// This function is useful when creating a status to send to a port with
++    /// the `post` method. The parameters are opaquely passed through and not
++    /// interpreted by the system at all.
++    pub fn new(bytes: u32, token: usize, overlapped: *mut Overlapped)
++               -> CompletionStatus {
++        assert_eq!(mem::size_of_val(&token), mem::size_of::<ULONG_PTR>());
++        CompletionStatus(OVERLAPPED_ENTRY {
++            dwNumberOfBytesTransferred: bytes,
++            lpCompletionKey: token as ULONG_PTR,
++            lpOverlapped: overlapped as *mut _,
++            Internal: 0,
++        })
++    }
++
++    /// Creates a new borrowed completion status from the borrowed
++    /// `OVERLAPPED_ENTRY` argument provided.
++    ///
++    /// This method will wrap the `OVERLAPPED_ENTRY` in a `CompletionStatus`,
++    /// returning the wrapped structure.
++    pub fn from_entry(entry: &OVERLAPPED_ENTRY) -> &CompletionStatus {
++        unsafe { &*(entry as *const _ as *const _) }
++    }
++
++    /// Creates a new "zero" completion status.
++    ///
++    /// This function is useful when creating a stack buffer or vector of
++    /// completion statuses to be passed to the `get_many` function.
++    pub fn zero() -> CompletionStatus {
++        CompletionStatus::new(0, 0, 0 as *mut _)
++    }
++
++    /// Returns the number of bytes that were transferred for the I/O operation
++    /// associated with this completion status.
++    pub fn bytes_transferred(&self) -> u32 {
++        self.0.dwNumberOfBytesTransferred
++    }
++
++    /// Returns the completion key value associated with the file handle whose
++    /// I/O operation has completed.
++    ///
++    /// A completion key is a per-handle key that is specified when it is added
++    /// to an I/O completion port via `add_handle` or `add_socket`.
++    pub fn token(&self) -> usize {
++        self.0.lpCompletionKey as usize
++    }
++
++    /// Returns a pointer to the `Overlapped` structure that was specified when
++    /// the I/O operation was started.
++    pub fn overlapped(&self) -> *mut OVERLAPPED {
++        self.0.lpOverlapped
++    }
++
++    /// Returns a pointer to the internal `OVERLAPPED_ENTRY` object.
++    pub fn entry(&self) -> &OVERLAPPED_ENTRY {
++        &self.0
++    }
++}
++
++#[cfg(test)]
++mod tests {
++    use std::mem;
++    use std::time::Duration;
++
++    use winapi::*;
++
++    use iocp::{CompletionPort, CompletionStatus};
++
++    #[test]
++    fn is_send_sync() {
++        fn is_send_sync<T: Send + Sync>() {}
++        is_send_sync::<CompletionPort>();
++    }
++
++    #[test]
++    fn token_right_size() {
++        assert_eq!(mem::size_of::<usize>(), mem::size_of::<ULONG_PTR>());
++    }
++
++    #[test]
++    fn timeout() {
++        let c = CompletionPort::new(1).unwrap();
++        let err = c.get(Some(Duration::from_millis(1))).unwrap_err();
++        assert_eq!(err.raw_os_error(), Some(WAIT_TIMEOUT as i32));
++    }
++
++    #[test]
++    fn get() {
++        let c = CompletionPort::new(1).unwrap();
++        c.post(CompletionStatus::new(1, 2, 3 as *mut _)).unwrap();
++        let s = c.get(None).unwrap();
++        assert_eq!(s.bytes_transferred(), 1);
++        assert_eq!(s.token(), 2);
++        assert_eq!(s.overlapped(), 3 as *mut _);
++    }
++
++    #[test]
++    fn get_many() {
++        let c = CompletionPort::new(1).unwrap();
++
++        c.post(CompletionStatus::new(1, 2, 3 as *mut _)).unwrap();
++        c.post(CompletionStatus::new(4, 5, 6 as *mut _)).unwrap();
++
++        let mut s = vec![CompletionStatus::zero(); 4];
++        {
++            let s = c.get_many(&mut s, None).unwrap();
++            assert_eq!(s.len(), 2);
++            assert_eq!(s[0].bytes_transferred(), 1);
++            assert_eq!(s[0].token(), 2);
++            assert_eq!(s[0].overlapped(), 3 as *mut _);
++            assert_eq!(s[1].bytes_transferred(), 4);
++            assert_eq!(s[1].token(), 5);
++            assert_eq!(s[1].overlapped(), 6 as *mut _);
++        }
++        assert_eq!(s[2].bytes_transferred(), 0);
++        assert_eq!(s[2].token(), 0);
++        assert_eq!(s[2].overlapped(), 0 as *mut _);
++    }
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..58643ffae50ed7cf74c44cedf5ad81791f370d4d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,57 @@@
++//! A zero overhead Windows I/O library
++
++#![cfg(windows)]
++#![deny(missing_docs)]
++#![allow(bad_style)]
++#![doc(html_root_url = "https://docs.rs/miow/0.1/x86_64-pc-windows-msvc/")]
++
++extern crate kernel32;
++extern crate net2;
++extern crate winapi;
++extern crate ws2_32;
++
++#[cfg(test)] extern crate rand;
++
++use std::cmp;
++use std::io;
++use std::time::Duration;
++
++use winapi::*;
++
++macro_rules! t {
++    ($e:expr) => (match $e {
++        Ok(e) => e,
++        Err(e) => panic!("{} failed with {:?}", stringify!($e), e),
++    })
++}
++
++mod handle;
++mod overlapped;
++
++pub mod iocp;
++pub mod net;
++pub mod pipe;
++
++pub use overlapped::Overlapped;
++
++fn cvt(i: BOOL) -> io::Result<BOOL> {
++    if i == 0 {
++        Err(io::Error::last_os_error())
++    } else {
++        Ok(i)
++    }
++}
++
++fn dur2ms(dur: Option<Duration>) -> u32 {
++    let dur = match dur {
++        Some(dur) => dur,
++        None => return INFINITE,
++    };
++    let ms = dur.as_secs().checked_mul(1_000);
++    let ms_extra = dur.subsec_nanos() / 1_000_000;
++    ms.and_then(|ms| {
++        ms.checked_add(ms_extra as u64)
++    }).map(|ms| {
++        cmp::min(u32::max_value() as u64, ms) as u32
++    }).unwrap_or(INFINITE - 1)
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..f3d19302e6919f1efa0c7abb71e2c85e0e59207b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1183 @@@
++//! Extensions and types for the standard networking primitives.
++//!
++//! This module contains a number of extension traits for the types in
++//! `std::net` for Windows-specific functionality.
++
++use std::cmp;
++use std::io;
++use std::mem;
++use std::sync::atomic::{AtomicUsize, Ordering, ATOMIC_USIZE_INIT};
++use std::net::{TcpStream, UdpSocket, SocketAddr, TcpListener};
++use std::net::{SocketAddrV4, Ipv4Addr, SocketAddrV6, Ipv6Addr};
++use std::os::windows::prelude::*;
++
++use net2::TcpBuilder;
++use winapi::*;
++use ws2_32::*;
++
++/// A type to represent a buffer in which a socket address will be stored.
++///
++/// This type is used with the `recv_from_overlapped` function on the
++/// `UdpSocketExt` trait to provide space for the overlapped I/O operation to
++/// fill in the address upon completion.
++#[derive(Clone, Copy)]
++pub struct SocketAddrBuf {
++    buf: SOCKADDR_STORAGE,
++    len: c_int,
++}
++
++/// A type to represent a buffer in which an accepted socket's address will be
++/// stored.
++///
++/// This type is used with the `accept_overlapped` method on the
++/// `TcpListenerExt` trait to provide space for the overlapped I/O operation to
++/// fill in the socket addresses upon completion.
++#[repr(C)]
++pub struct AcceptAddrsBuf {
++    // For AcceptEx we've got the restriction that the addresses passed in that
++    // buffer need to be at least 16 bytes more than the maximum address length
++    // for the protocol in question, so add some extra here and there
++    local: SOCKADDR_STORAGE,
++    _pad1: [u8; 16],
++    remote: SOCKADDR_STORAGE,
++    _pad2: [u8; 16],
++}
++
++/// The parsed return value of `AcceptAddrsBuf`.
++pub struct AcceptAddrs<'a> {
++    local: LPSOCKADDR,
++    local_len: c_int,
++    remote: LPSOCKADDR,
++    remote_len: c_int,
++    _data: &'a AcceptAddrsBuf,
++}
++
++struct WsaExtension {
++    guid: GUID,
++    val: AtomicUsize,
++}
++
++/// Additional methods for the `TcpStream` type in the standard library.
++pub trait TcpStreamExt {
++    /// Execute an overlapped read I/O operation on this TCP stream.
++    ///
++    /// This function will issue an overlapped I/O read (via `WSARecv`) on this
++    /// socket. The provided buffer will be filled in when the operation
++    /// completes and the given `OVERLAPPED` instance is used to track the
++    /// overlapped operation.
++    ///
++    /// If the operation succeeds, `Ok(Some(n))` is returned indicating how
++    /// many bytes were read. If the operation returns an error indicating that
++    /// the I/O is currently pending, `Ok(None)` is returned. Otherwise, the
++    /// error associated with the operation is returned and no overlapped
++    /// operation is enqueued.
++    ///
++    /// The number of bytes read will be returned as part of the completion
++    /// notification when the I/O finishes.
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe because the kernel requires that the `buf` and
++    /// `overlapped` pointers are valid until the end of the I/O operation. The
++    /// kernel also requires that `overlapped` is unique for this I/O operation
++    /// and is not in use for any other I/O.
++    ///
++    /// To safely use this function callers must ensure that these two input
++    /// pointers are valid until the I/O operation is completed, typically via
++    /// completion ports and waiting to receive the completion notification on
++    /// the port.
++    unsafe fn read_overlapped(&self,
++                              buf: &mut [u8],
++                              overlapped: *mut OVERLAPPED)
++                              -> io::Result<Option<usize>>;
++
++    /// Execute an overlapped write I/O operation on this TCP stream.
++    ///
++    /// This function will issue an overlapped I/O write (via `WSASend`) on this
++    /// socket. The provided buffer will be written when the operation completes
++    /// and the given `OVERLAPPED` instance is used to track the overlapped
++    /// operation.
++    ///
++    /// If the operation succeeds, `Ok(Some(n))` is returned where `n` is the
++    /// number of bytes that were written. If the operation returns an error
++    /// indicating that the I/O is currently pending, `Ok(None)` is returned.
++    /// Otherwise, the error associated with the operation is returned and no
++    /// overlapped operation is enqueued.
++    ///
++    /// The number of bytes written will be returned as part of the completion
++    /// notification when the I/O finishes.
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe because the kernel requires that the `buf` and
++    /// `overlapped` pointers are valid until the end of the I/O operation. The
++    /// kernel also requires that `overlapped` is unique for this I/O operation
++    /// and is not in use for any other I/O.
++    ///
++    /// To safely use this function callers must ensure that these two input
++    /// pointers are valid until the I/O operation is completed, typically via
++    /// completion ports and waiting to receive the completion notification on
++    /// the port.
++    unsafe fn write_overlapped(&self,
++                               buf: &[u8],
++                               overlapped: *mut OVERLAPPED)
++                               -> io::Result<Option<usize>>;
++
++    /// Execute a connection operation for this socket.
++    ///
++    /// For more information about this method, see the
++    /// [`TcpBuilderExt::connect_overlapped`][link] documentation.
++    ///
++    /// [link]: trait.TcpBuilderExt.html#tymethod.connect_overlapped
++    unsafe fn connect_overlapped(&self,
++                                 addr: &SocketAddr,
++                                 buf: &[u8],
++                                 overlapped: *mut OVERLAPPED)
++                                 -> io::Result<Option<usize>>;
++
++    /// Once a `connect_overlapped` has finished, this function needs to be
++    /// called to finish the connect operation.
++    ///
++    /// Currently this just calls `setsockopt` with `SO_UPDATE_CONNECT_CONTEXT`
++    /// to ensure that further functions like `getpeername` and `getsockname`
++    /// work correctly.
++    fn connect_complete(&self) -> io::Result<()>;
++
++    /// Calls the `GetOverlappedResult` function to get the result of an
++    /// overlapped operation for this handle.
++    ///
++    /// This function takes the `OVERLAPPED` argument which must have been used
++    /// to initiate an overlapped I/O operation, and returns either the
++    /// successful number of bytes transferred during the operation or an error
++    /// if one occurred, along with the results of the `lpFlags` parameter of
++    /// the relevant operation, if applicable.
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe as `overlapped` must have previously been used
++    /// to execute an operation for this handle, and it must also be a valid
++    /// pointer to an `OVERLAPPED` instance.
++    ///
++    /// # Panics
++    ///
++    /// This function will panic
++    unsafe fn result(&self, overlapped: *mut OVERLAPPED)
++                     -> io::Result<(usize, u32)>;
++}
++
++/// Additional methods for the `UdpSocket` type in the standard library.
++pub trait UdpSocketExt {
++    /// Execute an overlapped receive I/O operation on this UDP socket.
++    ///
++    /// This function will issue an overlapped I/O read (via `WSARecvFrom`) on
++    /// this socket. The provided buffer will be filled in when the operation
++    /// completes, the source from where the data came from will be written to
++    /// `addr`, and the given `OVERLAPPED` instance is used to track the
++    /// overlapped operation.
++    ///
++    /// If the operation succeeds, `Ok(Some(n))` is returned where `n` is the
++    /// number of bytes that were read. If the operation returns an error
++    /// indicating that the I/O is currently pending, `Ok(None)` is returned.
++    /// Otherwise, the error associated with the operation is returned and no
++    /// overlapped operation is enqueued.
++    ///
++    /// The number of bytes read will be returned as part of the completion
++    /// notification when the I/O finishes.
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe because the kernel requires that the `buf`,
++    /// `addr`, and `overlapped` pointers are valid until the end of the I/O
++    /// operation. The kernel also requires that `overlapped` is unique for this
++    /// I/O operation and is not in use for any other I/O.
++    ///
++    /// To safely use this function callers must ensure that these two input
++    /// pointers are valid until the I/O operation is completed, typically via
++    /// completion ports and waiting to receive the completion notification on
++    /// the port.
++    unsafe fn recv_from_overlapped(&self,
++                                   buf: &mut [u8],
++                                   addr: *mut SocketAddrBuf,
++                                   overlapped: *mut OVERLAPPED)
++                                   -> io::Result<Option<usize>>;
++
++    /// Execute an overlapped receive I/O operation on this UDP socket.
++    ///
++    /// This function will issue an overlapped I/O read (via `WSARecv`) on
++    /// this socket. The provided buffer will be filled in when the operation
++    /// completes, the source from where the data came from will be written to
++    /// `addr`, and the given `OVERLAPPED` instance is used to track the
++    /// overlapped operation.
++    ///
++    /// If the operation succeeds, `Ok(Some(n))` is returned where `n` is the
++    /// number of bytes that were read. If the operation returns an error
++    /// indicating that the I/O is currently pending, `Ok(None)` is returned.
++    /// Otherwise, the error associated with the operation is returned and no
++    /// overlapped operation is enqueued.
++    ///
++    /// The number of bytes read will be returned as part of the completion
++    /// notification when the I/O finishes.
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe because the kernel requires that the `buf`,
++    /// and `overlapped` pointers are valid until the end of the I/O
++    /// operation. The kernel also requires that `overlapped` is unique for this
++    /// I/O operation and is not in use for any other I/O.
++    ///
++    /// To safely use this function callers must ensure that these two input
++    /// pointers are valid until the I/O operation is completed, typically via
++    /// completion ports and waiting to receive the completion notification on
++    /// the port.
++    unsafe fn recv_overlapped(&self,
++                              buf: &mut [u8],
++                              overlapped: *mut OVERLAPPED)
++                              -> io::Result<Option<usize>>;
++
++    /// Execute an overlapped send I/O operation on this UDP socket.
++    ///
++    /// This function will issue an overlapped I/O write (via `WSASendTo`) on
++    /// this socket to the address specified by `addr`. The provided buffer will
++    /// be written when the operation completes and the given `OVERLAPPED`
++    /// instance is used to track the overlapped operation.
++    ///
++    /// If the operation succeeds, `Ok(Some(n0)` is returned where `n` byte
++    /// were written. If the operation returns an error indicating that the I/O
++    /// is currently pending, `Ok(None)` is returned. Otherwise, the error
++    /// associated with the operation is returned and no overlapped operation
++    /// is enqueued.
++    ///
++    /// The number of bytes written will be returned as part of the completion
++    /// notification when the I/O finishes.
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe because the kernel requires that the `buf` and
++    /// `overlapped` pointers are valid until the end of the I/O operation. The
++    /// kernel also requires that `overlapped` is unique for this I/O operation
++    /// and is not in use for any other I/O.
++    ///
++    /// To safely use this function callers must ensure that these two input
++    /// pointers are valid until the I/O operation is completed, typically via
++    /// completion ports and waiting to receive the completion notification on
++    /// the port.
++    unsafe fn send_to_overlapped(&self,
++                                 buf: &[u8],
++                                 addr: &SocketAddr,
++                                 overlapped: *mut OVERLAPPED)
++                                 -> io::Result<Option<usize>>;
++
++    /// Execute an overlapped send I/O operation on this UDP socket.
++    ///
++    /// This function will issue an overlapped I/O write (via `WSASend`) on
++    /// this socket to the address it was previously connected to. The provided 
++    /// buffer will be written when the operation completes and the given `OVERLAPPED`
++    /// instance is used to track the overlapped operation.
++    ///
++    /// If the operation succeeds, `Ok(Some(n0)` is returned where `n` byte
++    /// were written. If the operation returns an error indicating that the I/O
++    /// is currently pending, `Ok(None)` is returned. Otherwise, the error
++    /// associated with the operation is returned and no overlapped operation
++    /// is enqueued.
++    ///
++    /// The number of bytes written will be returned as part of the completion
++    /// notification when the I/O finishes.
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe because the kernel requires that the `buf` and
++    /// `overlapped` pointers are valid until the end of the I/O operation. The
++    /// kernel also requires that `overlapped` is unique for this I/O operation
++    /// and is not in use for any other I/O.
++    ///
++    /// To safely use this function callers must ensure that these two input
++    /// pointers are valid until the I/O operation is completed, typically via
++    /// completion ports and waiting to receive the completion notification on
++    /// the port.
++    unsafe fn send_overlapped(&self,
++                                 buf: &[u8],
++                                 overlapped: *mut OVERLAPPED)
++                                 -> io::Result<Option<usize>>;
++ 
++    /// Calls the `GetOverlappedResult` function to get the result of an
++    /// overlapped operation for this handle.
++    ///
++    /// This function takes the `OVERLAPPED` argument which must have been used
++    /// to initiate an overlapped I/O operation, and returns either the
++    /// successful number of bytes transferred during the operation or an error
++    /// if one occurred, along with the results of the `lpFlags` parameter of
++    /// the relevant operation, if applicable.
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe as `overlapped` must have previously been used
++    /// to execute an operation for this handle, and it must also be a valid
++    /// pointer to an `OVERLAPPED` instance.
++    ///
++    /// # Panics
++    ///
++    /// This function will panic
++    unsafe fn result(&self, overlapped: *mut OVERLAPPED)
++                     -> io::Result<(usize, u32)>;
++}
++
++/// Additional methods for the `TcpBuilder` type in the `net2` library.
++pub trait TcpBuilderExt {
++    /// Attempt to consume the internal socket in this builder by executing an
++    /// overlapped connect operation.
++    ///
++    /// This function will issue a connect operation to the address specified on
++    /// the underlying socket, flagging it as an overlapped operation which will
++    /// complete asynchronously. If successful this function will return the
++    /// corresponding TCP stream.
++    ///
++    /// The `buf` argument provided is an initial buffer of data that should be
++    /// sent after the connection is initiated. It's acceptable to
++    /// pass an empty slice here.
++    ///
++    /// This function will also return whether the connect immediately
++    /// succeeded or not. If `None` is returned then the I/O operation is still
++    /// pending and will complete at a later date, and if `Some(bytes)` is
++    /// returned then that many bytes were transferred.
++    ///
++    /// Note that to succeed this requires that the underlying socket has
++    /// previously been bound via a call to `bind` to a local address.
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe because the kernel requires that the
++    /// `overlapped` and `buf` pointers to be  valid until the end of the I/O
++    /// operation. The kernel also requires that `overlapped` is unique for
++    /// this I/O operation and is not in use for any other I/O.
++    ///
++    /// To safely use this function callers must ensure that this pointer is
++    /// valid until the I/O operation is completed, typically via completion
++    /// ports and waiting to receive the completion notification on the port.
++    unsafe fn connect_overlapped(&self,
++                                 addr: &SocketAddr,
++                                 buf: &[u8],
++                                 overlapped: *mut OVERLAPPED)
++                                 -> io::Result<(TcpStream, Option<usize>)>;
++
++    /// Calls the `GetOverlappedResult` function to get the result of an
++    /// overlapped operation for this handle.
++    ///
++    /// This function takes the `OVERLAPPED` argument which must have been used
++    /// to initiate an overlapped I/O operation, and returns either the
++    /// successful number of bytes transferred during the operation or an error
++    /// if one occurred, along with the results of the `lpFlags` parameter of
++    /// the relevant operation, if applicable.
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe as `overlapped` must have previously been used
++    /// to execute an operation for this handle, and it must also be a valid
++    /// pointer to an `OVERLAPPED` instance.
++    ///
++    /// # Panics
++    ///
++    /// This function will panic
++    unsafe fn result(&self, overlapped: *mut OVERLAPPED)
++                     -> io::Result<(usize, u32)>;
++}
++
++/// Additional methods for the `TcpListener` type in the standard library.
++pub trait TcpListenerExt {
++    /// Perform an accept operation on this listener, accepting a connection in
++    /// an overlapped fashion.
++    ///
++    /// This function will issue an I/O request to accept an incoming connection
++    /// with the specified overlapped instance. The `socket` provided must be a
++    /// configured but not bound or connected socket, and if successful this
++    /// will consume the internal socket of the builder to return a TCP stream.
++    ///
++    /// The `addrs` buffer provided will be filled in with the local and remote
++    /// addresses of the connection upon completion.
++    ///
++    /// If the accept succeeds immediately, `Ok(stream, true)` is returned. If
++    /// the connect indicates that the I/O is currently pending, `Ok(stream,
++    /// false)` is returned. Otherwise, the error associated with the operation
++    /// is returned and no overlapped operation is enqueued.
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe because the kernel requires that the
++    /// `addrs` and `overlapped` pointers are valid until the end of the I/O
++    /// operation. The kernel also requires that `overlapped` is unique for this
++    /// I/O operation and is not in use for any other I/O.
++    ///
++    /// To safely use this function callers must ensure that the pointers are
++    /// valid until the I/O operation is completed, typically via completion
++    /// ports and waiting to receive the completion notification on the port.
++    unsafe fn accept_overlapped(&self,
++                                socket: &TcpBuilder,
++                                addrs: &mut AcceptAddrsBuf,
++                                overlapped: *mut OVERLAPPED)
++                                -> io::Result<(TcpStream, bool)>;
++
++    /// Once an `accept_overlapped` has finished, this function needs to be
++    /// called to finish the accept operation.
++    ///
++    /// Currently this just calls `setsockopt` with `SO_UPDATE_ACCEPT_CONTEXT`
++    /// to ensure that further functions like `getpeername` and `getsockname`
++    /// work correctly.
++    fn accept_complete(&self, socket: &TcpStream) -> io::Result<()>;
++
++    /// Calls the `GetOverlappedResult` function to get the result of an
++    /// overlapped operation for this handle.
++    ///
++    /// This function takes the `OVERLAPPED` argument which must have been used
++    /// to initiate an overlapped I/O operation, and returns either the
++    /// successful number of bytes transferred during the operation or an error
++    /// if one occurred, along with the results of the `lpFlags` parameter of
++    /// the relevant operation, if applicable.
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe as `overlapped` must have previously been used
++    /// to execute an operation for this handle, and it must also be a valid
++    /// pointer to an `OVERLAPPED` instance.
++    ///
++    /// # Panics
++    ///
++    /// This function will panic
++    unsafe fn result(&self, overlapped: *mut OVERLAPPED)
++                     -> io::Result<(usize, u32)>;
++}
++
++#[doc(hidden)]
++trait NetInt {
++    fn from_be(i: Self) -> Self;
++    fn to_be(&self) -> Self;
++}
++macro_rules! doit {
++    ($($t:ident)*) => ($(impl NetInt for $t {
++        fn from_be(i: Self) -> Self { <$t>::from_be(i) }
++        fn to_be(&self) -> Self { <$t>::to_be(*self) }
++    })*)
++}
++doit! { i8 i16 i32 i64 isize u8 u16 u32 u64 usize }
++
++// fn hton<I: NetInt>(i: I) -> I { i.to_be() }
++fn ntoh<I: NetInt>(i: I) -> I { I::from_be(i) }
++
++fn last_err() -> io::Result<Option<usize>> {
++    let err = unsafe { WSAGetLastError() };
++    if err == WSA_IO_PENDING as i32 {
++        Ok(None)
++    } else {
++        Err(io::Error::from_raw_os_error(err))
++    }
++}
++
++fn cvt(i: c_int, size: DWORD) -> io::Result<Option<usize>> {
++    if i == SOCKET_ERROR {
++        last_err()
++    } else {
++        Ok(Some(size as usize))
++    }
++}
++
++fn socket_addr_to_ptrs(addr: &SocketAddr) -> (*const SOCKADDR, c_int) {
++    match *addr {
++        SocketAddr::V4(ref a) => {
++            (a as *const _ as *const _, mem::size_of::<SOCKADDR_IN>() as c_int)
++        }
++        SocketAddr::V6(ref a) => {
++            (a as *const _ as *const _, mem::size_of::<sockaddr_in6>() as c_int)
++        }
++    }
++}
++
++unsafe fn ptrs_to_socket_addr(ptr: *const SOCKADDR,
++                              len: c_int) -> Option<SocketAddr> {
++    if (len as usize) < mem::size_of::<c_int>() {
++        return None
++    }
++    match (*ptr).sa_family as i32 {
++        AF_INET if len as usize >= mem::size_of::<SOCKADDR_IN>() => {
++            let b = &*(ptr as *const SOCKADDR_IN);
++            let ip = ntoh(b.sin_addr.S_un);
++            let ip = Ipv4Addr::new((ip >> 24) as u8,
++                                   (ip >> 16) as u8,
++                                   (ip >>  8) as u8,
++                                   (ip >>  0) as u8);
++            Some(SocketAddr::V4(SocketAddrV4::new(ip, ntoh(b.sin_port))))
++        }
++        AF_INET6 if len as usize >= mem::size_of::<sockaddr_in6>() => {
++            let b = &*(ptr as *const sockaddr_in6);
++            let arr = &b.sin6_addr.s6_addr;
++            let ip = Ipv6Addr::new(
++                ((arr[0] as u16) << 8) | (arr[1] as u16),
++                ((arr[2] as u16) << 8) | (arr[3] as u16),
++                ((arr[4] as u16) << 8) | (arr[5] as u16),
++                ((arr[6] as u16) << 8) | (arr[7] as u16),
++                ((arr[8] as u16) << 8) | (arr[9] as u16),
++                ((arr[10] as u16) << 8) | (arr[11] as u16),
++                ((arr[12] as u16) << 8) | (arr[13] as u16),
++                ((arr[14] as u16) << 8) | (arr[15] as u16));
++            let addr = SocketAddrV6::new(ip, ntoh(b.sin6_port),
++                                         ntoh(b.sin6_flowinfo),
++                                         ntoh(b.sin6_scope_id));
++            Some(SocketAddr::V6(addr))
++        }
++        _ => None
++    }
++}
++
++unsafe fn slice2buf(slice: &[u8]) -> WSABUF {
++    WSABUF {
++        len: cmp::min(slice.len(), <u_long>::max_value() as usize) as u_long,
++        buf: slice.as_ptr() as *mut _,
++    }
++}
++
++unsafe fn result(socket: SOCKET, overlapped: *mut OVERLAPPED)
++                 -> io::Result<(usize, u32)> {
++    let mut transferred = 0;
++    let mut flags = 0;
++    let r = WSAGetOverlappedResult(socket,
++                                   overlapped,
++                                   &mut transferred,
++                                   FALSE,
++                                   &mut flags);
++    if r == 0 {
++        Err(io::Error::last_os_error())
++    } else {
++        Ok((transferred as usize, flags))
++    }
++}
++
++impl TcpStreamExt for TcpStream {
++    unsafe fn read_overlapped(&self,
++                              buf: &mut [u8],
++                              overlapped: *mut OVERLAPPED)
++                              -> io::Result<Option<usize>> {
++        let mut buf = slice2buf(buf);
++        let mut flags = 0;
++        let mut bytes_read: DWORD = 0;
++        let r = WSARecv(self.as_raw_socket(), &mut buf, 1,
++                        &mut bytes_read, &mut flags, overlapped, None);
++        cvt(r, bytes_read)
++    }
++
++    unsafe fn write_overlapped(&self,
++                               buf: &[u8],
++                               overlapped: *mut OVERLAPPED)
++                               -> io::Result<Option<usize>> {
++        let mut buf = slice2buf(buf);
++        let mut bytes_written = 0;
++
++        // Note here that we capture the number of bytes written. The
++        // documentation on MSDN, however, states:
++        //
++        // > Use NULL for this parameter if the lpOverlapped parameter is not
++        // > NULL to avoid potentially erroneous results. This parameter can be
++        // > NULL only if the lpOverlapped parameter is not NULL.
++        //
++        // If we're not passing a null overlapped pointer here, then why are we
++        // then capturing the number of bytes! Well so it turns out that this is
++        // clearly faster to learn the bytes here rather than later calling
++        // `WSAGetOverlappedResult`, and in practice almost all implementations
++        // use this anyway [1].
++        //
++        // As a result we use this to and report back the result.
++        //
++        // [1]: https://github.com/carllerche/mio/pull/520#issuecomment-273983823
++        let r = WSASend(self.as_raw_socket(), &mut buf, 1,
++                        &mut bytes_written, 0, overlapped, None);
++        cvt(r, bytes_written)
++    }
++
++    unsafe fn connect_overlapped(&self,
++                                 addr: &SocketAddr,
++                                 buf: &[u8],
++                                 overlapped: *mut OVERLAPPED)
++                                 -> io::Result<Option<usize>> {
++        connect_overlapped(self.as_raw_socket(), addr, buf, overlapped)
++    }
++
++    fn connect_complete(&self) -> io::Result<()> {
++        const SO_UPDATE_CONNECT_CONTEXT: c_int = 0x7010;
++        let result = unsafe {
++            setsockopt(self.as_raw_socket(),
++                       SOL_SOCKET,
++                       SO_UPDATE_CONNECT_CONTEXT,
++                       0 as *const _,
++                       0)
++        };
++        if result == 0 {
++            Ok(())
++        } else {
++            Err(io::Error::last_os_error())
++        }
++    }
++
++    unsafe fn result(&self, overlapped: *mut OVERLAPPED)
++                     -> io::Result<(usize, u32)> {
++        result(self.as_raw_socket(), overlapped)
++    }
++}
++
++unsafe fn connect_overlapped(socket: SOCKET,
++                             addr: &SocketAddr,
++                             buf: &[u8],
++                             overlapped: *mut OVERLAPPED)
++                             -> io::Result<Option<usize>> {
++    static CONNECTEX: WsaExtension = WsaExtension {
++        guid: GUID {
++            Data1: 0x25a207b9,
++            Data2: 0xddf3,
++            Data3: 0x4660,
++            Data4: [0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e],
++        },
++        val: ATOMIC_USIZE_INIT,
++    };
++    type ConnectEx = unsafe extern "system" fn(SOCKET, *const SOCKADDR,
++                                               c_int, PVOID, DWORD, LPDWORD,
++                                               LPOVERLAPPED) -> BOOL;
++
++    let ptr = try!(CONNECTEX.get(socket));
++    assert!(ptr != 0);
++    let connect_ex = mem::transmute::<_, ConnectEx>(ptr);
++
++    let (addr_buf, addr_len) = socket_addr_to_ptrs(addr);
++    let mut bytes_sent: DWORD = 0;
++    let r = connect_ex(socket, addr_buf, addr_len,
++                       buf.as_ptr() as *mut _,
++                       buf.len() as u32,
++                       &mut bytes_sent, overlapped);
++    if r == TRUE {
++        Ok(Some(bytes_sent as usize))
++    } else {
++        last_err()
++    }
++}
++
++impl UdpSocketExt for UdpSocket {
++    unsafe fn recv_from_overlapped(&self,
++                                   buf: &mut [u8],
++                                   addr: *mut SocketAddrBuf,
++                                   overlapped: *mut OVERLAPPED)
++                                   -> io::Result<Option<usize>> {
++        let mut buf = slice2buf(buf);
++        let mut flags = 0;
++        let mut received_bytes: DWORD = 0;
++        let r = WSARecvFrom(self.as_raw_socket(), &mut buf, 1,
++                            &mut received_bytes, &mut flags,
++                            &mut (*addr).buf as *mut _ as *mut _,
++                            &mut (*addr).len,
++                            overlapped, None);
++        cvt(r, received_bytes)
++    }
++
++    unsafe fn recv_overlapped(&self,
++                              buf: &mut [u8],
++                              overlapped: *mut OVERLAPPED)
++                              -> io::Result<Option<usize>> {
++        let mut buf = slice2buf(buf);
++        let mut flags = 0;
++        let mut received_bytes: DWORD = 0;
++        let r = WSARecv(self.as_raw_socket(), &mut buf, 1,
++                            &mut received_bytes, &mut flags,
++                            overlapped, None);
++        cvt(r, received_bytes)
++    }
++
++    unsafe fn send_to_overlapped(&self,
++                                 buf: &[u8],
++                                 addr: &SocketAddr,
++                                 overlapped: *mut OVERLAPPED)
++                                 -> io::Result<Option<usize>> {
++        let (addr_buf, addr_len) = socket_addr_to_ptrs(addr);
++        let mut buf = slice2buf(buf);
++        let mut sent_bytes = 0;
++        let r = WSASendTo(self.as_raw_socket(), &mut buf, 1,
++                          &mut sent_bytes, 0,
++                          addr_buf as *const _, addr_len,
++                          overlapped, None);
++        cvt(r, sent_bytes)
++    }
++
++    unsafe fn send_overlapped(&self,
++                              buf: &[u8],
++                              overlapped: *mut OVERLAPPED)
++                              -> io::Result<Option<usize>> {
++        let mut buf = slice2buf(buf);
++        let mut sent_bytes = 0;
++        let r = WSASend(self.as_raw_socket(), &mut buf, 1,
++                          &mut sent_bytes, 0,
++                          overlapped, None);
++        cvt(r, sent_bytes)
++    }
++
++    unsafe fn result(&self, overlapped: *mut OVERLAPPED)
++                     -> io::Result<(usize, u32)> {
++        result(self.as_raw_socket(), overlapped)
++    }
++}
++
++impl TcpBuilderExt for TcpBuilder {
++    unsafe fn connect_overlapped(&self,
++                                 addr: &SocketAddr,
++                                 buf: &[u8],
++                                 overlapped: *mut OVERLAPPED)
++                                 -> io::Result<(TcpStream, Option<usize>)> {
++        connect_overlapped(self.as_raw_socket(), addr, buf, overlapped).map(|s| {
++            (self.to_tcp_stream().unwrap(), s)
++        })
++    }
++
++    unsafe fn result(&self, overlapped: *mut OVERLAPPED)
++                     -> io::Result<(usize, u32)> {
++        result(self.as_raw_socket(), overlapped)
++    }
++}
++
++impl TcpListenerExt for TcpListener {
++    unsafe fn accept_overlapped(&self,
++                                socket: &TcpBuilder,
++                                addrs: &mut AcceptAddrsBuf,
++                                overlapped: *mut OVERLAPPED)
++                                -> io::Result<(TcpStream, bool)> {
++        static ACCEPTEX: WsaExtension = WsaExtension {
++            guid: GUID {
++                Data1: 0xb5367df1,
++                Data2: 0xcbac,
++                Data3: 0x11cf,
++                Data4: [0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92],
++            },
++            val: ATOMIC_USIZE_INIT,
++        };
++        type AcceptEx = unsafe extern "system" fn(SOCKET, SOCKET, PVOID,
++                                                  DWORD, DWORD, DWORD, LPDWORD,
++                                                  LPOVERLAPPED) -> BOOL;
++
++        let ptr = try!(ACCEPTEX.get(self.as_raw_socket()));
++        assert!(ptr != 0);
++        let accept_ex = mem::transmute::<_, AcceptEx>(ptr);
++
++        let mut bytes = 0;
++        let (a, b, c, d) = (*addrs).args();
++        let r = accept_ex(self.as_raw_socket(), socket.as_raw_socket(),
++                          a, b, c, d, &mut bytes, overlapped);
++        let succeeded = if r == TRUE {
++            true
++        } else {
++            try!(last_err());
++            false
++        };
++        // NB: this unwrap() should be guaranteed to succeed, and this is an
++        // assert that it does indeed succeed.
++        Ok((socket.to_tcp_stream().unwrap(), succeeded))
++    }
++
++    fn accept_complete(&self, socket: &TcpStream) -> io::Result<()> {
++        const SO_UPDATE_ACCEPT_CONTEXT: c_int = 0x700B;
++        let me = self.as_raw_socket();
++        let result = unsafe {
++            setsockopt(socket.as_raw_socket(),
++                       SOL_SOCKET,
++                       SO_UPDATE_ACCEPT_CONTEXT,
++                       &me as *const _ as *const _,
++                       mem::size_of_val(&me) as c_int)
++        };
++        if result == 0 {
++            Ok(())
++        } else {
++            Err(io::Error::last_os_error())
++        }
++    }
++
++    unsafe fn result(&self, overlapped: *mut OVERLAPPED)
++                     -> io::Result<(usize, u32)> {
++        result(self.as_raw_socket(), overlapped)
++    }
++}
++
++impl SocketAddrBuf {
++    /// Creates a new blank socket address buffer.
++    ///
++    /// This should be used before a call to `recv_from_overlapped` overlapped
++    /// to create an instance to pass down.
++    pub fn new() -> SocketAddrBuf {
++        SocketAddrBuf {
++            buf: unsafe { mem::zeroed() },
++            len: mem::size_of::<SOCKADDR_STORAGE>() as c_int,
++        }
++    }
++
++    /// Parses this buffer to return a standard socket address.
++    ///
++    /// This function should be called after the buffer has been filled in with
++    /// a call to `recv_from_overlapped` being completed. It will interpret the
++    /// address filled in and return the standard socket address type.
++    ///
++    /// If an error is encountered then `None` is returned.
++    pub fn to_socket_addr(&self) -> Option<SocketAddr> {
++        unsafe {
++            ptrs_to_socket_addr(&self.buf as *const _ as *const _, self.len)
++        }
++    }
++}
++
++static GETACCEPTEXSOCKADDRS: WsaExtension = WsaExtension {
++    guid: GUID {
++        Data1: 0xb5367df2,
++        Data2: 0xcbac,
++        Data3: 0x11cf,
++        Data4: [0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92],
++    },
++    val: ATOMIC_USIZE_INIT,
++};
++type GetAcceptExSockaddrs = unsafe extern "system" fn(PVOID, DWORD, DWORD, DWORD,
++                                                      *mut LPSOCKADDR, LPINT,
++                                                      *mut LPSOCKADDR, LPINT);
++
++impl AcceptAddrsBuf {
++    /// Creates a new blank buffer ready to be passed to a call to
++    /// `accept_overlapped`.
++    pub fn new() -> AcceptAddrsBuf {
++        unsafe { mem::zeroed() }
++    }
++
++    /// Parses the data contained in this address buffer, returning the parsed
++    /// result if successful.
++    ///
++    /// This function can be called after a call to `accept_overlapped` has
++    /// succeeded to parse out the data that was written in.
++    pub fn parse(&self, socket: &TcpListener) -> io::Result<AcceptAddrs> {
++        let mut ret = AcceptAddrs {
++            local: 0 as *mut _, local_len: 0,
++            remote: 0 as *mut _, remote_len: 0,
++            _data: self,
++        };
++        let ptr = try!(GETACCEPTEXSOCKADDRS.get(socket.as_raw_socket()));
++        assert!(ptr != 0);
++        unsafe {
++            let get_sockaddrs = mem::transmute::<_, GetAcceptExSockaddrs>(ptr);
++            let (a, b, c, d) = self.args();
++            get_sockaddrs(a, b, c, d,
++                          &mut ret.local, &mut ret.local_len,
++                          &mut ret.remote, &mut ret.remote_len);
++            Ok(ret)
++        }
++    }
++
++    fn args(&self) -> (PVOID, DWORD, DWORD, DWORD) {
++        let remote_offset = unsafe {
++            &(*(0 as *const AcceptAddrsBuf)).remote as *const _ as usize
++        };
++        (self as *const _ as *mut _, 0, remote_offset as DWORD,
++         (mem::size_of_val(self) - remote_offset) as DWORD)
++    }
++}
++
++impl<'a> AcceptAddrs<'a> {
++    /// Returns the local socket address contained in this buffer.
++    pub fn local(&self) -> Option<SocketAddr> {
++        unsafe { ptrs_to_socket_addr(self.local, self.local_len) }
++    }
++
++    /// Returns the remote socket address contained in this buffer.
++    pub fn remote(&self) -> Option<SocketAddr> {
++        unsafe { ptrs_to_socket_addr(self.remote, self.remote_len) }
++    }
++}
++
++impl WsaExtension {
++    fn get(&self, socket: SOCKET) -> io::Result<usize> {
++        let prev = self.val.load(Ordering::SeqCst);
++        if prev != 0 && !cfg!(debug_assertions) {
++            return Ok(prev)
++        }
++        let mut ret = 0 as usize;
++        let mut bytes = 0;
++        let r = unsafe {
++            WSAIoctl(socket, SIO_GET_EXTENSION_FUNCTION_POINTER,
++                     &self.guid as *const _ as *mut _,
++                     mem::size_of_val(&self.guid) as DWORD,
++                     &mut ret as *mut _ as *mut _,
++                     mem::size_of_val(&ret) as DWORD,
++                     &mut bytes,
++                     0 as *mut _, None)
++        };
++        cvt(r, 0).map(|_| {
++            debug_assert_eq!(bytes as usize, mem::size_of_val(&ret));
++            debug_assert!(prev == 0 || prev == ret);
++            self.val.store(ret, Ordering::SeqCst);
++            ret
++        })
++
++    }
++}
++
++#[cfg(test)]
++mod tests {
++    use std::net::{TcpListener, UdpSocket, TcpStream, SocketAddr};
++    use std::thread;
++    use std::io::prelude::*;
++
++    use Overlapped;
++    use iocp::CompletionPort;
++    use net::{TcpStreamExt, UdpSocketExt, SocketAddrBuf};
++    use net::{TcpBuilderExt, TcpListenerExt, AcceptAddrsBuf};
++    use net2::TcpBuilder;
++
++    fn each_ip(f: &mut FnMut(SocketAddr)) {
++        f(t!("127.0.0.1:0".parse()));
++        f(t!("[::1]:0".parse()));
++    }
++
++    #[test]
++    fn tcp_read() {
++        each_ip(&mut |addr| {
++            let l = t!(TcpListener::bind(addr));
++            let addr = t!(l.local_addr());
++            let t = thread::spawn(move || {
++                let mut a = t!(l.accept()).0;
++                t!(a.write_all(&[1, 2, 3]));
++            });
++
++            let cp = t!(CompletionPort::new(1));
++            let s = t!(TcpStream::connect(addr));
++            t!(cp.add_socket(1, &s));
++
++            let mut b = [0; 10];
++            let a = Overlapped::zero();
++            unsafe {
++                t!(s.read_overlapped(&mut b, a.raw()));
++            }
++            let status = t!(cp.get(None));
++            assert_eq!(status.bytes_transferred(), 3);
++            assert_eq!(status.token(), 1);
++            assert_eq!(status.overlapped(), a.raw());
++            assert_eq!(&b[0..3], &[1, 2, 3]);
++
++            t!(t.join());
++        })
++    }
++
++    #[test]
++    fn tcp_write() {
++        each_ip(&mut |addr| {
++            let l = t!(TcpListener::bind(addr));
++            let addr = t!(l.local_addr());
++            let t = thread::spawn(move || {
++                let mut a = t!(l.accept()).0;
++                let mut b = [0; 10];
++                let n = t!(a.read(&mut b));
++                assert_eq!(n, 3);
++                assert_eq!(&b[0..3], &[1, 2, 3]);
++            });
++
++            let cp = t!(CompletionPort::new(1));
++            let s = t!(TcpStream::connect(addr));
++            t!(cp.add_socket(1, &s));
++
++            let b = [1, 2, 3];
++            let a = Overlapped::zero();
++            unsafe {
++                t!(s.write_overlapped(&b, a.raw()));
++            }
++            let status = t!(cp.get(None));
++            assert_eq!(status.bytes_transferred(), 3);
++            assert_eq!(status.token(), 1);
++            assert_eq!(status.overlapped(), a.raw());
++
++            t!(t.join());
++        })
++    }
++
++    #[test]
++    fn tcp_connect() {
++        each_ip(&mut |addr_template| {
++            let l = t!(TcpListener::bind(addr_template));
++            let addr = t!(l.local_addr());
++            let t = thread::spawn(move || {
++                t!(l.accept());
++            });
++
++            let cp = t!(CompletionPort::new(1));
++            let builder = match addr {
++                SocketAddr::V4(..) => t!(TcpBuilder::new_v4()),
++                SocketAddr::V6(..) => t!(TcpBuilder::new_v6()),
++            };
++            t!(cp.add_socket(1, &builder));
++
++            let a = Overlapped::zero();
++            t!(builder.bind(addr_template));
++            let (s, _) = unsafe {
++                t!(builder.connect_overlapped(&addr, &[], a.raw()))
++            };
++            let status = t!(cp.get(None));
++            assert_eq!(status.bytes_transferred(), 0);
++            assert_eq!(status.token(), 1);
++            assert_eq!(status.overlapped(), a.raw());
++            t!(s.connect_complete());
++
++            t!(t.join());
++        })
++    }
++
++    #[test]
++    fn udp_recv_from() {
++        each_ip(&mut |addr| {
++            let a = t!(UdpSocket::bind(addr));
++            let b = t!(UdpSocket::bind(addr));
++            let a_addr = t!(a.local_addr());
++            let b_addr = t!(b.local_addr());
++            let t = thread::spawn(move || {
++                t!(a.send_to(&[1, 2, 3], b_addr));
++            });
++
++            let cp = t!(CompletionPort::new(1));
++            t!(cp.add_socket(1, &b));
++
++            let mut buf = [0; 10];
++            let a = Overlapped::zero();
++            let mut addr = SocketAddrBuf::new();
++            unsafe {
++                t!(b.recv_from_overlapped(&mut buf, &mut addr, a.raw()));
++            }
++            let status = t!(cp.get(None));
++            assert_eq!(status.bytes_transferred(), 3);
++            assert_eq!(status.token(), 1);
++            assert_eq!(status.overlapped(), a.raw());
++            assert_eq!(&buf[..3], &[1, 2, 3]);
++            assert_eq!(addr.to_socket_addr(), Some(a_addr));
++
++            t!(t.join());
++        })
++    }
++
++    #[test]
++    fn udp_recv() {
++        each_ip(&mut |addr| {
++            let a = t!(UdpSocket::bind(addr));
++            let b = t!(UdpSocket::bind(addr));
++            let a_addr = t!(a.local_addr());
++            let b_addr = t!(b.local_addr());
++            assert!(b.connect(a_addr).is_ok());
++            assert!(a.connect(b_addr).is_ok());
++            let t = thread::spawn(move || {
++                t!(a.send_to(&[1, 2, 3], b_addr));
++            });
++
++            let cp = t!(CompletionPort::new(1));
++            t!(cp.add_socket(1, &b));
++
++            let mut buf = [0; 10];
++            let a = Overlapped::zero();
++            unsafe {
++                t!(b.recv_overlapped(&mut buf, a.raw()));
++            }
++            let status = t!(cp.get(None));
++            assert_eq!(status.bytes_transferred(), 3);
++            assert_eq!(status.token(), 1);
++            assert_eq!(status.overlapped(), a.raw());
++            assert_eq!(&buf[..3], &[1, 2, 3]);
++
++            t!(t.join());
++        })
++    }
++
++    #[test]
++    fn udp_send_to() {
++        each_ip(&mut |addr| {
++            let a = t!(UdpSocket::bind(addr));
++            let b = t!(UdpSocket::bind(addr));
++            let a_addr = t!(a.local_addr());
++            let b_addr = t!(b.local_addr());
++            let t = thread::spawn(move || {
++                let mut b = [0; 100];
++                let (n, addr) = t!(a.recv_from(&mut b));
++                assert_eq!(n, 3);
++                assert_eq!(addr, b_addr);
++                assert_eq!(&b[..3], &[1, 2, 3]);
++            });
++
++            let cp = t!(CompletionPort::new(1));
++            t!(cp.add_socket(1, &b));
++
++            let a = Overlapped::zero();
++            unsafe {
++                t!(b.send_to_overlapped(&[1, 2, 3], &a_addr, a.raw()));
++            }
++            let status = t!(cp.get(None));
++            assert_eq!(status.bytes_transferred(), 3);
++            assert_eq!(status.token(), 1);
++            assert_eq!(status.overlapped(), a.raw());
++
++            t!(t.join());
++        })
++    }
++
++    #[test]
++    fn udp_send() {
++        each_ip(&mut |addr| {
++            let a = t!(UdpSocket::bind(addr));
++            let b = t!(UdpSocket::bind(addr));
++            let a_addr = t!(a.local_addr());
++            let b_addr = t!(b.local_addr());
++            assert!(b.connect(a_addr).is_ok());
++            assert!(a.connect(b_addr).is_ok());
++            let t = thread::spawn(move || {
++                let mut b = [0; 100];
++                let (n, addr) = t!(a.recv_from(&mut b));
++                assert_eq!(n, 3);
++                assert_eq!(addr, b_addr);
++                assert_eq!(&b[..3], &[1, 2, 3]);
++            });
++
++            let cp = t!(CompletionPort::new(1));
++            t!(cp.add_socket(1, &b));
++
++            let a = Overlapped::zero();
++            unsafe {
++                t!(b.send_overlapped(&[1, 2, 3], a.raw()));
++            }
++            let status = t!(cp.get(None));
++            assert_eq!(status.bytes_transferred(), 3);
++            assert_eq!(status.token(), 1);
++            assert_eq!(status.overlapped(), a.raw());
++
++            t!(t.join());
++        })
++    }
++
++    #[test]
++    fn tcp_accept() {
++        each_ip(&mut |addr_template| {
++            let l = t!(TcpListener::bind(addr_template));
++            let addr = t!(l.local_addr());
++            let t = thread::spawn(move || {
++                let socket = t!(TcpStream::connect(addr));
++                (socket.local_addr().unwrap(), socket.peer_addr().unwrap())
++            });
++
++            let cp = t!(CompletionPort::new(1));
++            let builder = match addr {
++                SocketAddr::V4(..) => t!(TcpBuilder::new_v4()),
++                SocketAddr::V6(..) => t!(TcpBuilder::new_v6()),
++            };
++            t!(cp.add_socket(1, &l));
++
++            let a = Overlapped::zero();
++            let mut addrs = AcceptAddrsBuf::new();
++            let (s, _) = unsafe {
++                t!(l.accept_overlapped(&builder, &mut addrs, a.raw()))
++            };
++            let status = t!(cp.get(None));
++            assert_eq!(status.bytes_transferred(), 0);
++            assert_eq!(status.token(), 1);
++            assert_eq!(status.overlapped(), a.raw());
++            t!(l.accept_complete(&s));
++
++            let (remote, local) = t!(t.join());
++            let addrs = addrs.parse(&l).unwrap();
++            assert_eq!(addrs.local(), Some(local));
++            assert_eq!(addrs.remote(), Some(remote));
++        })
++    }
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..eade553dc57e0ee4219a65db2728a61e449f5386
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,66 @@@
++use std::mem;
++
++use winapi::*;
++
++/// A wrapper around `OVERLAPPED` to provide "rustic" accessors and
++/// initializers.
++#[derive(Debug)]
++pub struct Overlapped(OVERLAPPED);
++
++unsafe impl Send for Overlapped {}
++unsafe impl Sync for Overlapped {}
++
++impl Overlapped {
++    /// Creates a new zeroed out instance of an overlapped I/O tracking state.
++    ///
++    /// This is suitable for passing to methods which will then later get
++    /// notified via an I/O Completion Port.
++    pub fn zero() -> Overlapped {
++        Overlapped(unsafe { mem::zeroed() })
++    }
++
++    /// Creates a new `Overlapped` function pointer from the underlying
++    /// `OVERLAPPED`, wrapping in the "rusty" wrapper for working with
++    /// accessors.
++    ///
++    /// # Unsafety
++    ///
++    /// This function doesn't validate `ptr` nor the lifetime of the returned
++    /// pointer at all, it's recommended to use this method with extreme
++    /// caution.
++    pub unsafe fn from_raw<'a>(ptr: *mut OVERLAPPED) -> &'a mut Overlapped {
++        &mut *(ptr as *mut Overlapped)
++    }
++
++    /// Gain access to the raw underlying data
++    pub fn raw(&self) -> *mut OVERLAPPED {
++        &self.0 as *const _ as *mut _
++    }
++
++    /// Sets the offset inside this overlapped structure.
++    ///
++    /// Note that for I/O operations in general this only has meaning for I/O
++    /// handles that are on a seeking device that supports the concept of an
++    /// offset.
++    pub fn set_offset(&mut self, offset: u64) {
++        self.0.Offset = offset as u32;
++        self.0.OffsetHigh = (offset >> 32) as u32;
++    }
++
++    /// Reads the offset inside this overlapped structure.
++    pub fn offset(&self) -> u64 {
++        (self.0.Offset as u64) | ((self.0.OffsetHigh as u64) << 32)
++    }
++
++    /// Sets the `hEvent` field of this structure.
++    ///
++    /// The event specified can be null.
++    pub fn set_event(&mut self, event: HANDLE) {
++        self.0.hEvent = event;
++    }
++
++    /// Reads the `hEvent` field of this structure, may return null.
++    pub fn event(&self) -> HANDLE {
++        self.0.hEvent
++    }
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5d55c5457d1ab67d10d0d061de2793791ee4d238
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,611 @@@
++//! Named pipes
++
++use std::ffi::OsStr;
++use std::fs::{OpenOptions, File};
++use std::io::prelude::*;
++use std::io;
++use std::os::windows::ffi::*;
++use std::os::windows::io::*;
++use std::time::Duration;
++
++use winapi::*;
++use kernel32::*;
++use handle::Handle;
++
++/// Readable half of an anonymous pipe.
++#[derive(Debug)]
++pub struct AnonRead(Handle);
++
++/// Writable half of an anonymous pipe.
++#[derive(Debug)]
++pub struct AnonWrite(Handle);
++
++/// A named pipe that can accept connections.
++#[derive(Debug)]
++pub struct NamedPipe(Handle);
++
++/// A builder structure for creating a new named pipe.
++#[derive(Debug)]
++pub struct NamedPipeBuilder {
++    name: Vec<u16>,
++    dwOpenMode: DWORD,
++    dwPipeMode: DWORD,
++    nMaxInstances: DWORD,
++    nOutBufferSize: DWORD,
++    nInBufferSize: DWORD,
++    nDefaultTimeOut: DWORD,
++}
++
++/// Creates a new anonymous in-memory pipe, returning the read/write ends of the
++/// pipe.
++///
++/// The buffer size for this pipe may also be specified, but the system will
++/// normally use this as a suggestion and it's not guaranteed that the buffer
++/// will be precisely this size.
++pub fn anonymous(buffer_size: u32) -> io::Result<(AnonRead, AnonWrite)> {
++    let mut read = 0 as HANDLE;
++    let mut write = 0 as HANDLE;
++    try!(::cvt(unsafe {
++        CreatePipe(&mut read, &mut write, 0 as *mut _, buffer_size)
++    }));
++    Ok((AnonRead(Handle::new(read)), AnonWrite(Handle::new(write))))
++}
++
++impl Read for AnonRead {
++    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { self.0.read(buf) }
++}
++impl<'a> Read for &'a AnonRead {
++    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { self.0.read(buf) }
++}
++
++impl AsRawHandle for AnonRead {
++    fn as_raw_handle(&self) -> HANDLE { self.0.raw() }
++}
++impl FromRawHandle for AnonRead {
++    unsafe fn from_raw_handle(handle: HANDLE) -> AnonRead {
++        AnonRead(Handle::new(handle))
++    }
++}
++impl IntoRawHandle for AnonRead {
++    fn into_raw_handle(self) -> HANDLE { self.0.into_raw() }
++}
++
++impl Write for AnonWrite {
++    fn write(&mut self, buf: &[u8]) -> io::Result<usize> { self.0.write(buf) }
++    fn flush(&mut self) -> io::Result<()> { Ok(()) }
++}
++impl<'a> Write for &'a AnonWrite {
++    fn write(&mut self, buf: &[u8]) -> io::Result<usize> { self.0.write(buf) }
++    fn flush(&mut self) -> io::Result<()> { Ok(()) }
++}
++
++impl AsRawHandle for AnonWrite {
++    fn as_raw_handle(&self) -> HANDLE { self.0.raw() }
++}
++impl FromRawHandle for AnonWrite {
++    unsafe fn from_raw_handle(handle: HANDLE) -> AnonWrite {
++        AnonWrite(Handle::new(handle))
++    }
++}
++impl IntoRawHandle for AnonWrite {
++    fn into_raw_handle(self) -> HANDLE { self.0.into_raw() }
++}
++
++/// A convenience function to connect to a named pipe.
++///
++/// This function will block the calling process until it can connect to the
++/// pipe server specified by `addr`. This will use `NamedPipe::wait` internally
++/// to block until it can connect.
++pub fn connect<A: AsRef<OsStr>>(addr: A) -> io::Result<File> {
++    _connect(addr.as_ref())
++}
++
++fn _connect(addr: &OsStr) -> io::Result<File> {
++    let mut r = OpenOptions::new();
++    let mut w = OpenOptions::new();
++    let mut rw = OpenOptions::new();
++    r.read(true);
++    w.write(true);
++    rw.read(true).write(true);
++    loop {
++        let res = rw.open(addr).or_else(|_| r.open(addr))
++                               .or_else(|_| w.open(addr));
++        match res {
++            Ok(f) => return Ok(f),
++            Err(ref e) if e.raw_os_error() == Some(ERROR_PIPE_BUSY as i32)
++                => {}
++            Err(e) => return Err(e),
++        }
++
++        try!(NamedPipe::wait(addr, Some(Duration::new(20, 0))));
++    }
++}
++
++impl NamedPipe {
++    /// Creates a new initial named pipe.
++    ///
++    /// This function is equivalent to:
++    ///
++    /// ```
++    /// use miow::pipe::NamedPipeBuilder;
++    ///
++    /// # let addr = "foo";
++    /// NamedPipeBuilder::new(addr)
++    ///                  .first(true)
++    ///                  .inbound(true)
++    ///                  .outbound(true)
++    ///                  .out_buffer_size(65536)
++    ///                  .in_buffer_size(65536)
++    ///                  .create();
++    /// ```
++    pub fn new<A: AsRef<OsStr>>(addr: A) -> io::Result<NamedPipe> {
++        NamedPipeBuilder::new(addr).create()
++    }
++
++    /// Waits until either a time-out interval elapses or an instance of the
++    /// specified named pipe is available for connection.
++    ///
++    /// If this function succeeds the process can create a `File` to connect to
++    /// the named pipe.
++    pub fn wait<A: AsRef<OsStr>>(addr: A, timeout: Option<Duration>)
++                                 -> io::Result<()> {
++        NamedPipe::_wait(addr.as_ref(), timeout)
++    }
++
++    fn _wait(addr: &OsStr, timeout: Option<Duration>) -> io::Result<()> {
++        let addr = addr.encode_wide().chain(Some(0)).collect::<Vec<_>>();
++        let timeout = ::dur2ms(timeout);
++        ::cvt(unsafe {
++            WaitNamedPipeW(addr.as_ptr(), timeout)
++        }).map(|_| ())
++    }
++
++    /// Connects this named pipe to a client, blocking until one becomes
++    /// available.
++    ///
++    /// This function will call the `ConnectNamedPipe` function to await for a
++    /// client to connect. This can be called immediately after the pipe is
++    /// created, or after it has been disconnected from a previous client.
++    pub fn connect(&self) -> io::Result<()> {
++        match ::cvt(unsafe { ConnectNamedPipe(self.0.raw(), 0 as *mut _) }) {
++            Ok(_) => Ok(()),
++            Err(ref e) if e.raw_os_error() == Some(ERROR_PIPE_CONNECTED as i32)
++                => Ok(()),
++            Err(e) => Err(e),
++        }
++    }
++
++    /// Issue a connection request with the specified overlapped operation.
++    ///
++    /// This function will issue a request to connect a client to this server,
++    /// returning immediately after starting the overlapped operation.
++    ///
++    /// If this function immediately succeeds then `Ok(true)` is returned. If
++    /// the overlapped operation is enqueued and pending, then `Ok(false)` is
++    /// returned. Otherwise an error is returned indicating what went wrong.
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe because the kernel requires that the
++    /// `overlapped` pointer is valid until the end of the I/O operation. The
++    /// kernel also requires that `overlapped` is unique for this I/O operation
++    /// and is not in use for any other I/O.
++    ///
++    /// To safely use this function callers must ensure that this pointer is
++    /// valid until the I/O operation is completed, typically via completion
++    /// ports and waiting to receive the completion notification on the port.
++    pub unsafe fn connect_overlapped(&self, overlapped: *mut OVERLAPPED)
++                                     -> io::Result<bool> {
++        match ::cvt(ConnectNamedPipe(self.0.raw(), overlapped)) {
++            Ok(_) => Ok(true),
++            Err(ref e) if e.raw_os_error() == Some(ERROR_PIPE_CONNECTED as i32)
++                => Ok(true),
++            Err(ref e) if e.raw_os_error() == Some(ERROR_IO_PENDING as i32)
++                => Ok(false),
++            Err(e) => Err(e),
++        }
++    }
++
++    /// Disconnects this named pipe from any connected client.
++    pub fn disconnect(&self) -> io::Result<()> {
++        ::cvt(unsafe {
++            DisconnectNamedPipe(self.0.raw())
++        }).map(|_| ())
++    }
++
++    /// Issues an overlapped read operation to occur on this pipe.
++    ///
++    /// This function will issue an asynchronous read to occur in an overlapped
++    /// fashion, returning immediately. The `buf` provided will be filled in
++    /// with data and the request is tracked by the `overlapped` function
++    /// provided.
++    ///
++    /// If the operation succeeds immediately, `Ok(Some(n))` is returned where
++    /// `n` is the number of bytes read. If an asynchronous operation is
++    /// enqueued, then `Ok(None)` is returned. Otherwise if an error occurred
++    /// it is returned.
++    ///
++    /// When this operation completes (or if it completes immediately), another
++    /// mechanism must be used to learn how many bytes were transferred (such as
++    /// looking at the filed in the IOCP status message).
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe because the kernel requires that the `buf` and
++    /// `overlapped` pointers to be valid until the end of the I/O operation.
++    /// The kernel also requires that `overlapped` is unique for this I/O
++    /// operation and is not in use for any other I/O.
++    ///
++    /// To safely use this function callers must ensure that the pointers are
++    /// valid until the I/O operation is completed, typically via completion
++    /// ports and waiting to receive the completion notification on the port.
++    pub unsafe fn read_overlapped(&self,
++                                  buf: &mut [u8],
++                                  overlapped: *mut OVERLAPPED)
++                                  -> io::Result<Option<usize>> {
++        self.0.read_overlapped(buf, overlapped)
++    }
++
++    /// Issues an overlapped write operation to occur on this pipe.
++    ///
++    /// This function will issue an asynchronous write to occur in an overlapped
++    /// fashion, returning immediately. The `buf` provided will be filled in
++    /// with data and the request is tracked by the `overlapped` function
++    /// provided.
++    ///
++    /// If the operation succeeds immediately, `Ok(Some(n))` is returned where
++    /// `n` is the number of bytes written. If an asynchronous operation is
++    /// enqueued, then `Ok(None)` is returned. Otherwise if an error occurred
++    /// it is returned.
++    ///
++    /// When this operation completes (or if it completes immediately), another
++    /// mechanism must be used to learn how many bytes were transferred (such as
++    /// looking at the filed in the IOCP status message).
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe because the kernel requires that the `buf` and
++    /// `overlapped` pointers to be valid until the end of the I/O operation.
++    /// The kernel also requires that `overlapped` is unique for this I/O
++    /// operation and is not in use for any other I/O.
++    ///
++    /// To safely use this function callers must ensure that the pointers are
++    /// valid until the I/O operation is completed, typically via completion
++    /// ports and waiting to receive the completion notification on the port.
++    pub unsafe fn write_overlapped(&self,
++                                   buf: &[u8],
++                                   overlapped: *mut OVERLAPPED)
++                                   -> io::Result<Option<usize>> {
++        self.0.write_overlapped(buf, overlapped)
++    }
++
++    /// Calls the `GetOverlappedResult` function to get the result of an
++    /// overlapped operation for this handle.
++    ///
++    /// This function takes the `OVERLAPPED` argument which must have been used
++    /// to initiate an overlapped I/O operation, and returns either the
++    /// successful number of bytes transferred during the operation or an error
++    /// if one occurred.
++    ///
++    /// # Unsafety
++    ///
++    /// This function is unsafe as `overlapped` must have previously been used
++    /// to execute an operation for this handle, and it must also be a valid
++    /// pointer to an `Overlapped` instance.
++    ///
++    /// # Panics
++    ///
++    /// This function will panic
++    pub unsafe fn result(&self, overlapped: *mut OVERLAPPED)
++                         -> io::Result<usize> {
++        let mut transferred = 0;
++        let r = GetOverlappedResult(self.0.raw(),
++                                    overlapped,
++                                    &mut transferred,
++                                    FALSE);
++        if r == 0 {
++            Err(io::Error::last_os_error())
++        } else {
++            Ok(transferred as usize)
++        }
++    }
++}
++
++impl Read for NamedPipe {
++    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { self.0.read(buf) }
++}
++impl<'a> Read for &'a NamedPipe {
++    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { self.0.read(buf) }
++}
++
++impl Write for NamedPipe {
++    fn write(&mut self, buf: &[u8]) -> io::Result<usize> { self.0.write(buf) }
++    fn flush(&mut self) -> io::Result<()> {
++        <&NamedPipe as Write>::flush(&mut &*self)
++    }
++}
++impl<'a> Write for &'a NamedPipe {
++    fn write(&mut self, buf: &[u8]) -> io::Result<usize> { self.0.write(buf) }
++    fn flush(&mut self) -> io::Result<()> {
++        ::cvt(unsafe { FlushFileBuffers(self.0.raw()) }).map(|_| ())
++    }
++}
++
++impl AsRawHandle for NamedPipe {
++    fn as_raw_handle(&self) -> HANDLE { self.0.raw() }
++}
++impl FromRawHandle for NamedPipe {
++    unsafe fn from_raw_handle(handle: HANDLE) -> NamedPipe {
++        NamedPipe(Handle::new(handle))
++    }
++}
++impl IntoRawHandle for NamedPipe {
++    fn into_raw_handle(self) -> HANDLE { self.0.into_raw() }
++}
++
++fn flag(slot: &mut DWORD, on: bool, val: DWORD) {
++    if on {
++        *slot |= val;
++    } else {
++        *slot &= !val;
++    }
++}
++
++impl NamedPipeBuilder {
++    /// Creates a new named pipe builder with the default settings.
++    pub fn new<A: AsRef<OsStr>>(addr: A) -> NamedPipeBuilder {
++        NamedPipeBuilder {
++            name: addr.as_ref().encode_wide().chain(Some(0)).collect(),
++            dwOpenMode: PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE |
++                        FILE_FLAG_OVERLAPPED,
++            dwPipeMode: PIPE_TYPE_BYTE,
++            nMaxInstances: PIPE_UNLIMITED_INSTANCES,
++            nOutBufferSize: 65536,
++            nInBufferSize: 65536,
++            nDefaultTimeOut: 0,
++        }
++    }
++
++    /// Indicates whether data is allowed to flow from the client to the server.
++    pub fn inbound(&mut self, allowed: bool) -> &mut Self {
++        flag(&mut self.dwOpenMode, allowed, PIPE_ACCESS_INBOUND);
++        self
++    }
++
++    /// Indicates whether data is allowed to flow from the server to the client.
++    pub fn outbound(&mut self, allowed: bool) -> &mut Self {
++        flag(&mut self.dwOpenMode, allowed, PIPE_ACCESS_OUTBOUND);
++        self
++    }
++
++    /// Indicates that this pipe must be the first instance.
++    ///
++    /// If set to true, then creation will fail if there's already an instance
++    /// elsewhere.
++    pub fn first(&mut self, first: bool) -> &mut Self {
++        flag(&mut self.dwOpenMode, first, FILE_FLAG_FIRST_PIPE_INSTANCE);
++        self
++    }
++
++    /// Indicates whether this server can accept remote clients or not.
++    pub fn accept_remote(&mut self, accept: bool) -> &mut Self {
++        flag(&mut self.dwPipeMode, !accept, PIPE_REJECT_REMOTE_CLIENTS);
++        self
++    }
++
++    /// Specifies the maximum number of instances of the server pipe that are
++    /// allowed.
++    ///
++    /// The first instance of a pipe can specify this value. A value of 255
++    /// indicates that there is no limit to the number of instances.
++    pub fn max_instances(&mut self, instances: u8) -> &mut Self {
++        self.nMaxInstances = instances as DWORD;
++        self
++    }
++
++    /// Specifies the number of bytes to reserver for the output buffer
++    pub fn out_buffer_size(&mut self, buffer: u32) -> &mut Self {
++        self.nOutBufferSize = buffer as DWORD;
++        self
++    }
++
++    /// Specifies the number of bytes to reserver for the input buffer
++    pub fn in_buffer_size(&mut self, buffer: u32) -> &mut Self {
++        self.nInBufferSize = buffer as DWORD;
++        self
++    }
++
++    /// Using the options in this builder, attempt to create a new named pipe.
++    ///
++    /// This function will call the `CreateNamedPipe` function and return the
++    /// result.
++    pub fn create(&mut self) -> io::Result<NamedPipe> {
++        let h = unsafe {
++            CreateNamedPipeW(self.name.as_ptr(),
++                             self.dwOpenMode, self.dwPipeMode,
++                             self.nMaxInstances, self.nOutBufferSize,
++                             self.nInBufferSize, self.nDefaultTimeOut,
++                             0 as *mut _)
++        };
++        if h == INVALID_HANDLE_VALUE {
++            Err(io::Error::last_os_error())
++        } else {
++            Ok(NamedPipe(Handle::new(h)))
++        }
++    }
++}
++
++#[cfg(test)]
++mod tests {
++    use std::fs::{File, OpenOptions};
++    use std::io::prelude::*;
++    use std::sync::mpsc::channel;
++    use std::thread;
++    use std::time::Duration;
++
++    use rand::{thread_rng, Rng};
++
++    use super::{anonymous, NamedPipe, NamedPipeBuilder};
++    use iocp::CompletionPort;
++    use Overlapped;
++
++    fn name() -> String {
++        let name = thread_rng().gen_ascii_chars().take(30).collect::<String>();
++        format!(r"\\.\pipe\{}", name)
++    }
++
++    #[test]
++    fn anon() {
++        let (mut read, mut write) = t!(anonymous(256));
++        assert_eq!(t!(write.write(&[1, 2, 3])), 3);
++        let mut b = [0; 10];
++        assert_eq!(t!(read.read(&mut b)), 3);
++        assert_eq!(&b[..3], &[1, 2, 3]);
++    }
++
++    #[test]
++    fn named_not_first() {
++        let name = name();
++        let _a = t!(NamedPipe::new(&name));
++        assert!(NamedPipe::new(&name).is_err());
++
++        t!(NamedPipeBuilder::new(&name).first(false).create());
++    }
++
++    #[test]
++    fn named_connect() {
++        let name = name();
++        let a = t!(NamedPipe::new(&name));
++
++        let t = thread::spawn(move || {
++            t!(File::open(name));
++        });
++
++        t!(a.connect());
++        t!(a.disconnect());
++        t!(t.join());
++    }
++
++    #[test]
++    fn named_wait() {
++        let name = name();
++        let a = t!(NamedPipe::new(&name));
++
++        let (tx, rx) = channel();
++        let t = thread::spawn(move || {
++            t!(NamedPipe::wait(&name, None));
++            t!(File::open(&name));
++            assert!(NamedPipe::wait(&name, Some(Duration::from_millis(1))).is_err());
++            t!(tx.send(()));
++        });
++
++        t!(a.connect());
++        t!(rx.recv());
++        t!(a.disconnect());
++        t!(t.join());
++    }
++
++    #[test]
++    fn named_connect_overlapped() {
++        let name = name();
++        let a = t!(NamedPipe::new(&name));
++
++        let t = thread::spawn(move || {
++            t!(File::open(name));
++        });
++
++        let cp = t!(CompletionPort::new(1));
++        t!(cp.add_handle(2, &a));
++
++        let over = Overlapped::zero();
++        unsafe {
++            t!(a.connect_overlapped(over.raw()));
++        }
++
++        let status = t!(cp.get(None));
++        assert_eq!(status.bytes_transferred(), 0);
++        assert_eq!(status.token(), 2);
++        assert_eq!(status.overlapped(), over.raw());
++        t!(t.join());
++    }
++
++    #[test]
++    fn named_read_write() {
++        let name = name();
++        let mut a = t!(NamedPipe::new(&name));
++
++        let t = thread::spawn(move || {
++            let mut f = t!(OpenOptions::new().read(true).write(true).open(name));
++            t!(f.write_all(&[1, 2, 3]));
++            let mut b = [0; 10];
++            assert_eq!(t!(f.read(&mut b)), 3);
++            assert_eq!(&b[..3], &[1, 2, 3]);
++        });
++
++        t!(a.connect());
++        let mut b = [0; 10];
++        assert_eq!(t!(a.read(&mut b)), 3);
++        assert_eq!(&b[..3], &[1, 2, 3]);
++        t!(a.write_all(&[1, 2, 3]));
++        t!(a.flush());
++        t!(a.disconnect());
++        t!(t.join());
++    }
++
++    #[test]
++    fn named_read_overlapped() {
++        let name = name();
++        let a = t!(NamedPipe::new(&name));
++
++        let t = thread::spawn(move || {
++            let mut f = t!(File::create(name));
++            t!(f.write_all(&[1, 2, 3]));
++        });
++
++        let cp = t!(CompletionPort::new(1));
++        t!(cp.add_handle(3, &a));
++        t!(a.connect());
++
++        let mut b = [0; 10];
++        let over = Overlapped::zero();
++        unsafe {
++            t!(a.read_overlapped(&mut b, over.raw()));
++        }
++        let status = t!(cp.get(None));
++        assert_eq!(status.bytes_transferred(), 3);
++        assert_eq!(status.token(), 3);
++        assert_eq!(status.overlapped(), over.raw());
++        assert_eq!(&b[..3], &[1, 2, 3]);
++
++        t!(t.join());
++    }
++
++    #[test]
++    fn named_write_overlapped() {
++        let name = name();
++        let a = t!(NamedPipe::new(&name));
++
++        let t = thread::spawn(move || {
++            let mut f = t!(super::connect(name));
++            let mut b = [0; 10];
++            assert_eq!(t!(f.read(&mut b)), 3);
++            assert_eq!(&b[..3], &[1, 2, 3])
++        });
++
++        let cp = t!(CompletionPort::new(1));
++        t!(cp.add_handle(3, &a));
++        t!(a.connect());
++
++        let over = Overlapped::zero();
++        unsafe {
++            t!(a.write_overlapped(&[1, 2, 3], over.raw()));
++        }
++
++        let status = t!(cp.get(None));
++        assert_eq!(status.bytes_transferred(), 3);
++        assert_eq!(status.token(), 3);
++        assert_eq!(status.overlapped(), over.raw());
++
++        t!(t.join());
++    }
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..09b2d03b2ead4d9084e476d1a57cf3acd1ca6e62
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++{"files":{},"package":"bc01404e7568680f1259aa5729539f221cb1e6d047a0d9053cab4be8a73b5d67"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
new file mode 100644 (file)
--- /dev/null
--- /dev/null
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..b6073dadd04aa82ece869832ecf5b67bcf8a83f9
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,31 @@@
++language: rust
++rust:
++  - stable
++  - beta
++  - nightly
++sudo: false
++before_script:
++  - pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH
++script:
++  - if [ "$TRAVIS_RUST_VERSION" = "1.1.0" ]; then
++      cargo test --no-default-features;
++    else
++      cargo test;
++    fi
++  - if [ "$TRAVIS_RUST_VERSION" = "nightly" ]; then
++      cargo test --features nightly;
++      cargo doc --features nightly --no-deps;
++    fi
++  - rustdoc --test README.md -L target/debug -L target/debug/deps
++after_success:
++  - travis-cargo --only nightly doc-upload
++notifications:
++  email:
++    on_success: never
++env:
++  global:
++    secure: "n7C4SSdi9Q1WcPxc9BKQi/vhPhhxCfK/ljqG0l8PpNhkJ1BzFgb/0O4zA2W1/JzHxp0VB7rGwRCTSZkePvH1ycZuNtIezFc2HktElpRGwmo8X2OHp2+GLkTKozjhV0qZho+XoQnB0zgZRAdTq+MSN2EpTUKsaNvZwrTK90MprUPKU06Hvq93oEWmDh0jyKee0LlMezS6ihTgNk43zIa6bNumIWoaUM9ePnN7IvKSnoiynKjrBU52GPF5cWKih35mTXNxXW89Ht2h1NhIAHwmUpNfyOsBb2LOfvathVitfqk81R6+1qWzFyWSHdFoDAM0HHs8sySFK3P2YVcAp4tNIBw29oAtCpSGK6XeDyxmEU9VAq2H7DzEaBnkZM5A4oNnJWsValBmY+8m21OwV/XRed+eiqg5WUfnjeEoBn/5BJxMsc+kkVztS1Yos1meHZazTIaSpICxJ8fieHnzTOKD3wKgHwXSQaCAQHAErM301DRlChkXj61txDCmLVrU4qVRSMrAQQFPUBeploNaQtvCr/JI7huOhw5A6DphnGH8bbNivwATuUnbvQRJF+VGU3yOkJieJAQzArjGQ1A+qMds+DKlfFH/mPMxQcKv7bEE7cTZ3DY8ZzJfMzsh6YIa/YP0hpDZ5z4tJaeEXRyNVPEAwMGk4pCITP949WaTs97XOpM="
++
++os:
++  - linux
++  - osx
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e2c1c58ddee87a0e9181b974793653dcbbe9a428
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,38 @@@
++[package]
++name = "net2"
++version = "0.2.29"
++authors = ["Alex Crichton <alex@alexcrichton.com>"]
++license = "MIT/Apache-2.0"
++readme = "README.md"
++repository = "https://github.com/rust-lang-nursery/net2-rs"
++homepage = "https://github.com/rust-lang-nursery/net2-rs"
++documentation = "https://doc.rust-lang.org/net2-rs/"
++description = """
++Extensions to the standard library's networking types as proposed in RFC 1158.
++"""
++
++[target."cfg(windows)".dependencies]
++ws2_32-sys = "0.2"
++winapi = "0.2"
++kernel32-sys = "0.2"
++
++[target."cfg(unix)".dependencies]
++libc = "0.2.14"
++
++# Compat with older Cargo versions temporarily
++[target.x86_64-unknown-linux-gnu.dependencies]
++libc = "0.2.14"
++[target.i686-unknown-linux-gnu.dependencies]
++libc = "0.2.14"
++[target.x86_64-apple-darwin.dependencies]
++libc = "0.2.14"
++[target.i686-apple-darwin.dependencies]
++libc = "0.2.14"
++
++[dependencies]
++cfg-if = "0.1"
++
++[features]
++nightly = []
++duration = []
++default = ["duration"]
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..16fe87b06e802f094b3fbb0894b137bca2b16ef1
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,201 @@@
++                              Apache License
++                        Version 2.0, January 2004
++                     http://www.apache.org/licenses/
++
++TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
++
++1. Definitions.
++
++   "License" shall mean the terms and conditions for use, reproduction,
++   and distribution as defined by Sections 1 through 9 of this document.
++
++   "Licensor" shall mean the copyright owner or entity authorized by
++   the copyright owner that is granting the License.
++
++   "Legal Entity" shall mean the union of the acting entity and all
++   other entities that control, are controlled by, or are under common
++   control with that entity. For the purposes of this definition,
++   "control" means (i) the power, direct or indirect, to cause the
++   direction or management of such entity, whether by contract or
++   otherwise, or (ii) ownership of fifty percent (50%) or more of the
++   outstanding shares, or (iii) beneficial ownership of such entity.
++
++   "You" (or "Your") shall mean an individual or Legal Entity
++   exercising permissions granted by this License.
++
++   "Source" form shall mean the preferred form for making modifications,
++   including but not limited to software source code, documentation
++   source, and configuration files.
++
++   "Object" form shall mean any form resulting from mechanical
++   transformation or translation of a Source form, including but
++   not limited to compiled object code, generated documentation,
++   and conversions to other media types.
++
++   "Work" shall mean the work of authorship, whether in Source or
++   Object form, made available under the License, as indicated by a
++   copyright notice that is included in or attached to the work
++   (an example is provided in the Appendix below).
++
++   "Derivative Works" shall mean any work, whether in Source or Object
++   form, that is based on (or derived from) the Work and for which the
++   editorial revisions, annotations, elaborations, or other modifications
++   represent, as a whole, an original work of authorship. For the purposes
++   of this License, Derivative Works shall not include works that remain
++   separable from, or merely link (or bind by name) to the interfaces of,
++   the Work and Derivative Works thereof.
++
++   "Contribution" shall mean any work of authorship, including
++   the original version of the Work and any modifications or additions
++   to that Work or Derivative Works thereof, that is intentionally
++   submitted to Licensor for inclusion in the Work by the copyright owner
++   or by an individual or Legal Entity authorized to submit on behalf of
++   the copyright owner. For the purposes of this definition, "submitted"
++   means any form of electronic, verbal, or written communication sent
++   to the Licensor or its representatives, including but not limited to
++   communication on electronic mailing lists, source code control systems,
++   and issue tracking systems that are managed by, or on behalf of, the
++   Licensor for the purpose of discussing and improving the Work, but
++   excluding communication that is conspicuously marked or otherwise
++   designated in writing by the copyright owner as "Not a Contribution."
++
++   "Contributor" shall mean Licensor and any individual or Legal Entity
++   on behalf of whom a Contribution has been received by Licensor and
++   subsequently incorporated within the Work.
++
++2. Grant of Copyright License. Subject to the terms and conditions of
++   this License, each Contributor hereby grants to You a perpetual,
++   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
++   copyright license to reproduce, prepare Derivative Works of,
++   publicly display, publicly perform, sublicense, and distribute the
++   Work and such Derivative Works in Source or Object form.
++
++3. Grant of Patent License. Subject to the terms and conditions of
++   this License, each Contributor hereby grants to You a perpetual,
++   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
++   (except as stated in this section) patent license to make, have made,
++   use, offer to sell, sell, import, and otherwise transfer the Work,
++   where such license applies only to those patent claims licensable
++   by such Contributor that are necessarily infringed by their
++   Contribution(s) alone or by combination of their Contribution(s)
++   with the Work to which such Contribution(s) was submitted. If You
++   institute patent litigation against any entity (including a
++   cross-claim or counterclaim in a lawsuit) alleging that the Work
++   or a Contribution incorporated within the Work constitutes direct
++   or contributory patent infringement, then any patent licenses
++   granted to You under this License for that Work shall terminate
++   as of the date such litigation is filed.
++
++4. Redistribution. You may reproduce and distribute copies of the
++   Work or Derivative Works thereof in any medium, with or without
++   modifications, and in Source or Object form, provided that You
++   meet the following conditions:
++
++   (a) You must give any other recipients of the Work or
++       Derivative Works a copy of this License; and
++
++   (b) You must cause any modified files to carry prominent notices
++       stating that You changed the files; and
++
++   (c) You must retain, in the Source form of any Derivative Works
++       that You distribute, all copyright, patent, trademark, and
++       attribution notices from the Source form of the Work,
++       excluding those notices that do not pertain to any part of
++       the Derivative Works; and
++
++   (d) If the Work includes a "NOTICE" text file as part of its
++       distribution, then any Derivative Works that You distribute must
++       include a readable copy of the attribution notices contained
++       within such NOTICE file, excluding those notices that do not
++       pertain to any part of the Derivative Works, in at least one
++       of the following places: within a NOTICE text file distributed
++       as part of the Derivative Works; within the Source form or
++       documentation, if provided along with the Derivative Works; or,
++       within a display generated by the Derivative Works, if and
++       wherever such third-party notices normally appear. The contents
++       of the NOTICE file are for informational purposes only and
++       do not modify the License. You may add Your own attribution
++       notices within Derivative Works that You distribute, alongside
++       or as an addendum to the NOTICE text from the Work, provided
++       that such additional attribution notices cannot be construed
++       as modifying the License.
++
++   You may add Your own copyright statement to Your modifications and
++   may provide additional or different license terms and conditions
++   for use, reproduction, or distribution of Your modifications, or
++   for any such Derivative Works as a whole, provided Your use,
++   reproduction, and distribution of the Work otherwise complies with
++   the conditions stated in this License.
++
++5. Submission of Contributions. Unless You explicitly state otherwise,
++   any Contribution intentionally submitted for inclusion in the Work
++   by You to the Licensor shall be under the terms and conditions of
++   this License, without any additional terms or conditions.
++   Notwithstanding the above, nothing herein shall supersede or modify
++   the terms of any separate license agreement you may have executed
++   with Licensor regarding such Contributions.
++
++6. Trademarks. This License does not grant permission to use the trade
++   names, trademarks, service marks, or product names of the Licensor,
++   except as required for reasonable and customary use in describing the
++   origin of the Work and reproducing the content of the NOTICE file.
++
++7. Disclaimer of Warranty. Unless required by applicable law or
++   agreed to in writing, Licensor provides the Work (and each
++   Contributor provides its Contributions) on an "AS IS" BASIS,
++   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
++   implied, including, without limitation, any warranties or conditions
++   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
++   PARTICULAR PURPOSE. You are solely responsible for determining the
++   appropriateness of using or redistributing the Work and assume any
++   risks associated with Your exercise of permissions under this License.
++
++8. Limitation of Liability. In no event and under no legal theory,
++   whether in tort (including negligence), contract, or otherwise,
++   unless required by applicable law (such as deliberate and grossly
++   negligent acts) or agreed to in writing, shall any Contributor be
++   liable to You for damages, including any direct, indirect, special,
++   incidental, or consequential damages of any character arising as a
++   result of this License or out of the use or inability to use the
++   Work (including but not limited to damages for loss of goodwill,
++   work stoppage, computer failure or malfunction, or any and all
++   other commercial damages or losses), even if such Contributor
++   has been advised of the possibility of such damages.
++
++9. Accepting Warranty or Additional Liability. While redistributing
++   the Work or Derivative Works thereof, You may choose to offer,
++   and charge a fee for, acceptance of support, warranty, indemnity,
++   or other liability obligations and/or rights consistent with this
++   License. However, in accepting such obligations, You may act only
++   on Your own behalf and on Your sole responsibility, not on behalf
++   of any other Contributor, and only if You agree to indemnify,
++   defend, and hold each Contributor harmless for any liability
++   incurred by, or claims asserted against, such Contributor by reason
++   of your accepting any such warranty or additional liability.
++
++END OF TERMS AND CONDITIONS
++
++APPENDIX: How to apply the Apache License to your work.
++
++   To apply the Apache License to your work, attach the following
++   boilerplate notice, with the fields enclosed by brackets "[]"
++   replaced with your own identifying information. (Don't include
++   the brackets!)  The text should be enclosed in the appropriate
++   comment syntax for the file format. We also recommend that a
++   file or class name and description of purpose be included on the
++   same "printed page" as the copyright notice for easier
++   identification within third-party archives.
++
++Copyright [yyyy] [name of copyright owner]
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++      http://www.apache.org/licenses/LICENSE-2.0
++
++Unless required by applicable law or agreed to in writing, software
++distributed under the License is distributed on an "AS IS" BASIS,
++WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++See the License for the specific language governing permissions and
++limitations under the License.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..39d4bdb5acd313c1a92dbeaa1c379aaf0596a315
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25 @@@
++Copyright (c) 2014 The Rust Project Developers
++
++Permission is hereby granted, free of charge, to any
++person obtaining a copy of this software and associated
++documentation files (the "Software"), to deal in the
++Software without restriction, including without
++limitation the rights to use, copy, modify, merge,
++publish, distribute, sublicense, and/or sell copies of
++the Software, and to permit persons to whom the Software
++is furnished to do so, subject to the following
++conditions:
++
++The above copyright notice and this permission notice
++shall be included in all copies or substantial portions
++of the Software.
++
++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
++ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
++TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
++PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
++SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
++CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
++OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
++IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++DEALINGS IN THE SOFTWARE.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..dffad8fc2a2fb728db0d7c012360fbe48786283b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,26 @@@
++# net2
++
++[![Build Status](https://travis-ci.org/rust-lang-nursery/net2-rs.svg?branch=master)](https://travis-ci.org/rust-lang-nursery/net2-rs)
++[![Build status](https://ci.appveyor.com/api/projects/status/ns78f02jt2uvd2lp?svg=true)](https://ci.appveyor.com/project/alexcrichton/net2-rs)
++
++[Documentation](https://doc.rust-lang.org/net2-rs/)
++
++Extensions to the standard library's networking types, proposed in [RFC
++1158][rfc].
++
++
++[rfc]: https://github.com/alexcrichton/rfcs/blob/net2.1/text/0000-io-net-2.1.md
++
++```toml
++# Cargo.toml
++[dependencies]
++net2 = "0.2"
++```
++
++# License
++
++`net2-rs` is primarily distributed under the terms of both the MIT license and
++the Apache License (Version 2.0), with portions covered by various BSD-like
++licenses.
++
++See LICENSE-APACHE, and LICENSE-MIT for details.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..9b61bafe1c20ec664532be84e6c5475c3747ac44
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,17 @@@
++environment:
++  matrix:
++  - TARGET: x86_64-pc-windows-msvc
++  - TARGET: i686-pc-windows-msvc
++  - TARGET: i686-pc-windows-gnu
++install:
++  - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-nightly-${env:TARGET}.exe"
++  - rust-nightly-%TARGET%.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
++  - SET PATH=%PATH%;C:\Program Files (x86)\Rust\bin
++  - SET PATH=%PATH%;C:\MinGW\bin
++  - rustc -V
++  - cargo -V
++
++build: false
++
++test_script:
++  - cargo test --verbose --features nightly --target %TARGET%
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d78a57bcf408f4d0214f3951a8916c2e8f7dcba4
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1341 @@@
++// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
++// file at the top-level directory of this distribution and at
++// http://rust-lang.org/COPYRIGHT.
++//
++// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
++// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
++// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
++// option. This file may not be copied, modified, or distributed
++// except according to those terms.
++
++#![allow(bad_style, dead_code)]
++
++use std::io;
++use std::mem;
++use std::net::{TcpStream, TcpListener, UdpSocket, Ipv4Addr, Ipv6Addr};
++use std::net::ToSocketAddrs;
++
++use {TcpBuilder, UdpBuilder, FromInner};
++use sys;
++use socket;
++
++cfg_if! {
++    if #[cfg(any(target_os = "dragonfly",
++                 target_os = "freebsd",
++                 target_os = "ios",
++                 target_os = "macos",
++                 target_os = "netbsd",
++                 target_os = "openbsd",
++                 target_os = "solaris"))] {
++        use libc::IPV6_JOIN_GROUP as IPV6_ADD_MEMBERSHIP;
++        use libc::IPV6_LEAVE_GROUP as IPV6_DROP_MEMBERSHIP;
++    } else {
++        // ...
++    }
++}
++
++#[cfg(any(feature = "nightly", feature = "duration"))]
++use std::time::Duration;
++
++#[cfg(unix)] pub type Socket = c_int;
++#[cfg(unix)] use std::os::unix::prelude::*;
++#[cfg(unix)] use libc::*;
++#[cfg(windows)] pub type Socket = SOCKET;
++#[cfg(windows)] use std::os::windows::prelude::*;
++#[cfg(windows)] use ws2_32::*;
++#[cfg(windows)] use winapi::*;
++
++#[cfg(windows)] const SIO_KEEPALIVE_VALS: DWORD = 0x98000004;
++#[cfg(windows)]
++#[repr(C)]
++struct tcp_keepalive {
++    onoff: c_ulong,
++    keepalivetime: c_ulong,
++    keepaliveinterval: c_ulong,
++}
++
++#[cfg(windows)] fn v(opt: IPPROTO) -> c_int { opt.0 as c_int }
++#[cfg(unix)] fn v(opt: c_int) -> c_int { opt }
++
++pub fn set_opt<T: Copy>(sock: Socket, opt: c_int, val: c_int,
++                       payload: T) -> io::Result<()> {
++    unsafe {
++        let payload = &payload as *const T as *const c_void;
++        try!(::cvt(setsockopt(sock, opt, val, payload as *const _,
++                              mem::size_of::<T>() as socklen_t)));
++        Ok(())
++    }
++}
++
++pub fn get_opt<T: Copy>(sock: Socket, opt: c_int, val: c_int) -> io::Result<T> {
++    unsafe {
++        let mut slot: T = mem::zeroed();
++        let mut len = mem::size_of::<T>() as socklen_t;
++        try!(::cvt(getsockopt(sock, opt, val,
++                              &mut slot as *mut _ as *mut _,
++                              &mut len)));
++        assert_eq!(len as usize, mem::size_of::<T>());
++        Ok(slot)
++    }
++}
++
++/// Extension methods for the standard [`TcpStream` type][link] in `std::net`.
++///
++/// [link]: https://doc.rust-lang.org/std/net/struct.TcpStream.html
++pub trait TcpStreamExt {
++    /// Sets the value of the `TCP_NODELAY` option on this socket.
++    ///
++    /// If set, this option disables the Nagle algorithm. This means that
++    /// segments are always sent as soon as possible, even if there is only a
++    /// small amount of data. When not set, data is buffered until there is a
++    /// sufficient amount to send out, thereby avoiding the frequent sending of
++    /// small packets.
++    fn set_nodelay(&self, nodelay: bool) -> io::Result<()>;
++
++    /// Gets the value of the `TCP_NODELAY` option on this socket.
++    ///
++    /// For more information about this option, see [`set_nodelay`][link].
++    ///
++    /// [link]: #tymethod.set_nodelay
++    fn nodelay(&self) -> io::Result<bool>;
++
++    /// Sets the value of the `SO_RCVBUF` option on this socket.
++    ///
++    /// Changes the size of the operating system's receive buffer associated with the socket.
++    fn set_recv_buffer_size(&self, size: usize) -> io::Result<()>;
++
++    /// Gets the value of the `SO_RCVBUF` option on this socket.
++    ///
++    /// For more information about this option, see [`set_recv_buffer_size`][link].
++    ///
++    /// [link]: #tymethod.set_recv_buffer_size
++    fn recv_buffer_size(&self) -> io::Result<usize>;
++
++    /// Sets the value of the `SO_SNDBUF` option on this socket.
++    ///
++    /// Changes the size of the operating system's send buffer associated with the socket.
++    fn set_send_buffer_size(&self, size: usize) -> io::Result<()>;
++
++    /// Gets the value of the `SO_SNDBUF` option on this socket.
++    ///
++    /// For more information about this option, see [`set_send_buffer`][link].
++    ///
++    /// [link]: #tymethod.set_send_buffer
++    fn send_buffer_size(&self) -> io::Result<usize>;
++
++    /// Sets whether keepalive messages are enabled to be sent on this socket.
++    ///
++    /// On Unix, this option will set the `SO_KEEPALIVE` as well as the
++    /// `TCP_KEEPALIVE` or `TCP_KEEPIDLE` option (depending on your platform).
++    /// On Windows, this will set the `SIO_KEEPALIVE_VALS` option.
++    ///
++    /// If `None` is specified then keepalive messages are disabled, otherwise
++    /// the number of milliseconds specified will be the time to remain idle
++    /// before sending a TCP keepalive probe.
++    ///
++    /// Some platforms specify this value in seconds, so sub-second millisecond
++    /// specifications may be omitted.
++    fn set_keepalive_ms(&self, keepalive: Option<u32>) -> io::Result<()>;
++
++    /// Returns whether keepalive messages are enabled on this socket, and if so
++    /// the amount of milliseconds between them.
++    ///
++    /// For more information about this option, see [`set_keepalive_ms`][link].
++    ///
++    /// [link]: #tymethod.set_keepalive_ms
++    fn keepalive_ms(&self) -> io::Result<Option<u32>>;
++
++    /// Sets whether keepalive messages are enabled to be sent on this socket.
++    ///
++    /// On Unix, this option will set the `SO_KEEPALIVE` as well as the
++    /// `TCP_KEEPALIVE` or `TCP_KEEPIDLE` option (depending on your platform).
++    /// On Windows, this will set the `SIO_KEEPALIVE_VALS` option.
++    ///
++    /// If `None` is specified then keepalive messages are disabled, otherwise
++    /// the duration specified will be the time to remain idle before sending a
++    /// TCP keepalive probe.
++    ///
++    /// Some platforms specify this value in seconds, so sub-second
++    /// specifications may be omitted.
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn set_keepalive(&self, keepalive: Option<Duration>) -> io::Result<()>;
++
++    /// Returns whether keepalive messages are enabled on this socket, and if so
++    /// the duration of time between them.
++    ///
++    /// For more information about this option, see [`set_keepalive`][link].
++    ///
++    /// [link]: #tymethod.set_keepalive
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn keepalive(&self) -> io::Result<Option<Duration>>;
++
++    /// Sets the `SO_RCVTIMEO` option for this socket.
++    ///
++    /// This option specifies the timeout, in milliseconds, of how long calls to
++    /// this socket's `read` function will wait before returning a timeout. A
++    /// value of `None` means that no read timeout should be specified and
++    /// otherwise `Some` indicates the number of milliseconds for the timeout.
++    fn set_read_timeout_ms(&self, val: Option<u32>) -> io::Result<()>;
++
++    /// Sets the `SO_RCVTIMEO` option for this socket.
++    ///
++    /// This option specifies the timeout of how long calls to this socket's
++    /// `read` function will wait before returning a timeout. A value of `None`
++    /// means that no read timeout should be specified and otherwise `Some`
++    /// indicates the number of duration of the timeout.
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn set_read_timeout(&self, val: Option<Duration>) -> io::Result<()>;
++
++    /// Gets the value of the `SO_RCVTIMEO` option for this socket.
++    ///
++    /// For more information about this option, see [`set_read_timeout_ms`][link].
++    ///
++    /// [link]: #tymethod.set_read_timeout_ms
++    fn read_timeout_ms(&self) -> io::Result<Option<u32>>;
++
++    /// Gets the value of the `SO_RCVTIMEO` option for this socket.
++    ///
++    /// For more information about this option, see [`set_read_timeout`][link].
++    ///
++    /// [link]: #tymethod.set_read_timeout
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn read_timeout(&self) -> io::Result<Option<Duration>>;
++
++    /// Sets the `SO_SNDTIMEO` option for this socket.
++    ///
++    /// This option specifies the timeout, in milliseconds, of how long calls to
++    /// this socket's `write` function will wait before returning a timeout. A
++    /// value of `None` means that no read timeout should be specified and
++    /// otherwise `Some` indicates the number of milliseconds for the timeout.
++    fn set_write_timeout_ms(&self, val: Option<u32>) -> io::Result<()>;
++
++    /// Sets the `SO_SNDTIMEO` option for this socket.
++    ///
++    /// This option specifies the timeout of how long calls to this socket's
++    /// `write` function will wait before returning a timeout. A value of `None`
++    /// means that no read timeout should be specified and otherwise `Some`
++    /// indicates the duration of the timeout.
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn set_write_timeout(&self, val: Option<Duration>) -> io::Result<()>;
++
++    /// Gets the value of the `SO_SNDTIMEO` option for this socket.
++    ///
++    /// For more information about this option, see [`set_write_timeout_ms`][link].
++    ///
++    /// [link]: #tymethod.set_write_timeout_ms
++    fn write_timeout_ms(&self) -> io::Result<Option<u32>>;
++
++    /// Gets the value of the `SO_SNDTIMEO` option for this socket.
++    ///
++    /// For more information about this option, see [`set_write_timeout`][link].
++    ///
++    /// [link]: #tymethod.set_write_timeout
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn write_timeout(&self) -> io::Result<Option<Duration>>;
++
++    /// Sets the value for the `IP_TTL` option on this socket.
++    ///
++    /// This value sets the time-to-live field that is used in every packet sent
++    /// from this socket.
++    fn set_ttl(&self, ttl: u32) -> io::Result<()>;
++
++    /// Gets the value of the `IP_TTL` option for this socket.
++    ///
++    /// For more information about this option, see [`set_ttl`][link].
++    ///
++    /// [link]: #tymethod.set_ttl
++    fn ttl(&self) -> io::Result<u32>;
++
++    /// Sets the value for the `IPV6_V6ONLY` option on this socket.
++    ///
++    /// If this is set to `true` then the socket is restricted to sending and
++    /// receiving IPv6 packets only. In this case two IPv4 and IPv6 applications
++    /// can bind the same port at the same time.
++    ///
++    /// If this is set to `false` then the socket can be used to send and
++    /// receive packets from an IPv4-mapped IPv6 address.
++    fn set_only_v6(&self, only_v6: bool) -> io::Result<()>;
++
++    /// Gets the value of the `IPV6_V6ONLY` option for this socket.
++    ///
++    /// For more information about this option, see [`set_only_v6`][link].
++    ///
++    /// [link]: #tymethod.set_only_v6
++    fn only_v6(&self) -> io::Result<bool>;
++
++    /// Executes a `connect` operation on this socket, establishing a connection
++    /// to the host specified by `addr`.
++    ///
++    /// Note that this normally does not need to be called on a `TcpStream`,
++    /// it's typically automatically done as part of a normal
++    /// `TcpStream::connect` function call or `TcpBuilder::connect` method call.
++    ///
++    /// This should only be necessary if an unconnected socket was extracted
++    /// from a `TcpBuilder` and then needs to be connected.
++    fn connect<T: ToSocketAddrs>(&self, addr: T) -> io::Result<()>;
++
++    /// Get the value of the `SO_ERROR` option on this socket.
++    ///
++    /// This will retrieve the stored error in the underlying socket, clearing
++    /// the field in the process. This can be useful for checking errors between
++    /// calls.
++    fn take_error(&self) -> io::Result<Option<io::Error>>;
++
++    /// Moves this TCP stream into or out of nonblocking mode.
++    ///
++    /// On Unix this corresponds to calling fcntl, and on Windows this
++    /// corresponds to calling ioctlsocket.
++    fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()>;
++
++    /// Sets the linger duration of this socket by setting the SO_LINGER option
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn set_linger(&self, dur: Option<Duration>) -> io::Result<()>;
++
++    /// reads the linger duration for this socket by getting the SO_LINGER option
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn linger(&self) -> io::Result<Option<Duration>>;
++}
++
++/// Extension methods for the standard [`TcpListener` type][link] in `std::net`.
++///
++/// [link]: https://doc.rust-lang.org/std/net/struct.TcpListener.html
++pub trait TcpListenerExt {
++    /// Sets the value for the `IP_TTL` option on this socket.
++    ///
++    /// This is the same as [`TcpStreamExt::set_ttl`][other].
++    ///
++    /// [other]: trait.TcpStreamExt.html#tymethod.set_ttl
++    fn set_ttl(&self, ttl: u32) -> io::Result<()>;
++
++    /// Gets the value of the `IP_TTL` option for this socket.
++    ///
++    /// For more information about this option, see
++    /// [`TcpStreamExt::set_ttl`][link].
++    ///
++    /// [link]: trait.TcpStreamExt.html#tymethod.set_ttl
++    fn ttl(&self) -> io::Result<u32>;
++
++    /// Sets the value for the `IPV6_V6ONLY` option on this socket.
++    ///
++    /// For more information about this option, see
++    /// [`TcpStreamExt::set_only_v6`][link].
++    ///
++    /// [link]: trait.TcpStreamExt.html#tymethod.set_only_v6
++    fn set_only_v6(&self, only_v6: bool) -> io::Result<()>;
++
++    /// Gets the value of the `IPV6_V6ONLY` option for this socket.
++    ///
++    /// For more information about this option, see
++    /// [`TcpStreamExt::set_only_v6`][link].
++    ///
++    /// [link]: trait.TcpStreamExt.html#tymethod.set_only_v6
++    fn only_v6(&self) -> io::Result<bool>;
++
++    /// Get the value of the `SO_ERROR` option on this socket.
++    ///
++    /// This will retrieve the stored error in the underlying socket, clearing
++    /// the field in the process. This can be useful for checking errors between
++    /// calls.
++    fn take_error(&self) -> io::Result<Option<io::Error>>;
++
++    /// Moves this TCP listener into or out of nonblocking mode.
++    ///
++    /// For more information about this option, see
++    /// [`TcpStreamExt::set_nonblocking`][link].
++    ///
++    /// [link]: trait.TcpStreamExt.html#tymethod.set_nonblocking
++    fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()>;
++    
++    /// Sets the linger duration of this socket by setting the SO_LINGER option
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn set_linger(&self, dur: Option<Duration>) -> io::Result<()>;
++
++    /// reads the linger duration for this socket by getting the SO_LINGER option
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn linger(&self) -> io::Result<Option<Duration>>;
++}
++
++/// Extension methods for the standard [`UdpSocket` type][link] in `std::net`.
++///
++/// [link]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html
++pub trait UdpSocketExt {
++    /// Sets the value of the `SO_RCVBUF` option on this socket.
++    ///
++    /// Changes the size of the operating system's receive buffer associated with the socket.
++    fn set_recv_buffer_size(&self, size: usize) -> io::Result<()>;
++
++    /// Gets the value of the `SO_RCVBUF` option on this socket.
++    ///
++    /// For more information about this option, see [`set_recv_buffer_size`][link].
++    ///
++    /// [link]: #tymethod.set_recv_buffer_size
++    fn recv_buffer_size(&self) -> io::Result<usize>;
++
++    /// Sets the value of the `SO_SNDBUF` option on this socket.
++    ///
++    /// Changes the size of the operating system's send buffer associated with the socket.
++    fn set_send_buffer_size(&self, size: usize) -> io::Result<()>;
++
++    /// Gets the value of the `SO_SNDBUF` option on this socket.
++    ///
++    /// For more information about this option, see [`set_send_buffer`][link].
++    ///
++    /// [link]: #tymethod.set_send_buffer
++    fn send_buffer_size(&self) -> io::Result<usize>;
++
++    /// Sets the value of the `SO_BROADCAST` option for this socket.
++    ///
++    /// When enabled, this socket is allowed to send packets to a broadcast
++    /// address.
++    fn set_broadcast(&self, broadcast: bool) -> io::Result<()>;
++
++    /// Gets the value of the `SO_BROADCAST` option for this socket.
++    ///
++    /// For more information about this option, see
++    /// [`set_broadcast`][link].
++    ///
++    /// [link]: #tymethod.set_broadcast
++    fn broadcast(&self) -> io::Result<bool>;
++
++    /// Sets the value of the `IP_MULTICAST_LOOP` option for this socket.
++    ///
++    /// If enabled, multicast packets will be looped back to the local socket.
++    /// Note that this may not have any affect on IPv6 sockets.
++    fn set_multicast_loop_v4(&self, multicast_loop_v4: bool) -> io::Result<()>;
++
++    /// Gets the value of the `IP_MULTICAST_LOOP` option for this socket.
++    ///
++    /// For more information about this option, see
++    /// [`set_multicast_loop_v4`][link].
++    ///
++    /// [link]: #tymethod.set_multicast_loop_v4
++    fn multicast_loop_v4(&self) -> io::Result<bool>;
++
++    /// Sets the value of the `IP_MULTICAST_TTL` option for this socket.
++    ///
++    /// Indicates the time-to-live value of outgoing multicast packets for
++    /// this socket. The default value is 1 which means that multicast packets
++    /// don't leave the local network unless explicitly requested.
++    ///
++    /// Note that this may not have any affect on IPv6 sockets.
++    fn set_multicast_ttl_v4(&self, multicast_ttl_v4: u32) -> io::Result<()>;
++
++    /// Gets the value of the `IP_MULTICAST_TTL` option for this socket.
++    ///
++    /// For more information about this option, see
++    /// [`set_multicast_ttl_v4`][link].
++    ///
++    /// [link]: #tymethod.set_multicast_ttl_v4
++    fn multicast_ttl_v4(&self) -> io::Result<u32>;
++
++    /// Sets the value of the `IPV6_MULTICAST_LOOP` option for this socket.
++    ///
++    /// Controls whether this socket sees the multicast packets it sends itself.
++    /// Note that this may not have any affect on IPv4 sockets.
++    fn set_multicast_loop_v6(&self, multicast_loop_v6: bool) -> io::Result<()>;
++
++    /// Gets the value of the `IPV6_MULTICAST_LOOP` option for this socket.
++    ///
++    /// For more information about this option, see
++    /// [`set_multicast_loop_v6`][link].
++    ///
++    /// [link]: #tymethod.set_multicast_loop_v6
++    fn multicast_loop_v6(&self) -> io::Result<bool>;
++
++    /// Sets the value for the `IP_TTL` option on this socket.
++    ///
++    /// This is the same as [`TcpStreamExt::set_ttl`][other].
++    ///
++    /// [other]: trait.TcpStreamExt.html#tymethod.set_ttl
++    fn set_ttl(&self, ttl: u32) -> io::Result<()>;
++
++    /// Gets the value of the `IP_TTL` option for this socket.
++    ///
++    /// For more information about this option, see
++    /// [`TcpStreamExt::set_ttl`][link].
++    ///
++    /// [link]: trait.TcpStreamExt.html#tymethod.set_ttl
++    fn ttl(&self) -> io::Result<u32>;
++
++    /// Sets the value for the `IPV6_V6ONLY` option on this socket.
++    ///
++    /// For more information about this option, see
++    /// [`TcpStreamExt::set_only_v6`][link].
++    ///
++    /// [link]: trait.TcpStreamExt.html#tymethod.set_only_v6
++    fn set_only_v6(&self, only_v6: bool) -> io::Result<()>;
++
++    /// Gets the value of the `IPV6_V6ONLY` option for this socket.
++    ///
++    /// For more information about this option, see
++    /// [`TcpStreamExt::set_only_v6`][link].
++    ///
++    /// [link]: trait.TcpStreamExt.html#tymethod.set_only_v6
++    fn only_v6(&self) -> io::Result<bool>;
++
++    /// Executes an operation of the `IP_ADD_MEMBERSHIP` type.
++    ///
++    /// This function specifies a new multicast group for this socket to join.
++    /// The address must be a valid multicast address, and `interface` is the
++    /// address of the local interface with which the system should join the
++    /// multicast group. If it's equal to `INADDR_ANY` then an appropriate
++    /// interface is chosen by the system.
++    fn join_multicast_v4(&self, multiaddr: &Ipv4Addr, interface: &Ipv4Addr)
++                         -> io::Result<()>;
++
++    /// Executes an operation of the `IPV6_ADD_MEMBERSHIP` type.
++    ///
++    /// This function specifies a new multicast group for this socket to join.
++    /// The address must be a valid multicast address, and `interface` is the
++    /// index of the interface to join/leave (or 0 to indicate any interface).
++    fn join_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32)
++                         -> io::Result<()>;
++
++    /// Executes an operation of the `IP_DROP_MEMBERSHIP` type.
++    ///
++    /// For more information about this option, see
++    /// [`join_multicast_v4`][link].
++    ///
++    /// [link]: #tymethod.join_multicast_v4
++    fn leave_multicast_v4(&self, multiaddr: &Ipv4Addr, interface: &Ipv4Addr)
++                          -> io::Result<()>;
++
++    /// Executes an operation of the `IPV6_DROP_MEMBERSHIP` type.
++    ///
++    /// For more information about this option, see
++    /// [`join_multicast_v6`][link].
++    ///
++    /// [link]: #tymethod.join_multicast_v6
++    fn leave_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32)
++                          -> io::Result<()>;
++
++    /// Sets the `SO_RCVTIMEO` option for this socket.
++    ///
++    /// This option specifies the timeout, in milliseconds, of how long calls to
++    /// this socket's `read` function will wait before returning a timeout. A
++    /// value of `None` means that no read timeout should be specified and
++    /// otherwise `Some` indicates the number of milliseconds for the timeout.
++    fn set_read_timeout_ms(&self, val: Option<u32>) -> io::Result<()>;
++
++    /// Sets the `SO_RCVTIMEO` option for this socket.
++    ///
++    /// This option specifies the timeout of how long calls to this socket's
++    /// `read` function will wait before returning a timeout. A value of `None`
++    /// means that no read timeout should be specified and otherwise `Some`
++    /// indicates the number of duration of the timeout.
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn set_read_timeout(&self, val: Option<Duration>) -> io::Result<()>;
++
++    /// Gets the value of the `SO_RCVTIMEO` option for this socket.
++    ///
++    /// For more information about this option, see [`set_read_timeout_ms`][link].
++    ///
++    /// [link]: #tymethod.set_read_timeout_ms
++    fn read_timeout_ms(&self) -> io::Result<Option<u32>>;
++
++    /// Gets the value of the `SO_RCVTIMEO` option for this socket.
++    ///
++    /// For more information about this option, see [`set_read_timeout`][link].
++    ///
++    /// [link]: #tymethod.set_read_timeout
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn read_timeout(&self) -> io::Result<Option<Duration>>;
++
++    /// Sets the `SO_SNDTIMEO` option for this socket.
++    ///
++    /// This option specifies the timeout, in milliseconds, of how long calls to
++    /// this socket's `write` function will wait before returning a timeout. A
++    /// value of `None` means that no read timeout should be specified and
++    /// otherwise `Some` indicates the number of milliseconds for the timeout.
++    fn set_write_timeout_ms(&self, val: Option<u32>) -> io::Result<()>;
++
++    /// Sets the `SO_SNDTIMEO` option for this socket.
++    ///
++    /// This option specifies the timeout of how long calls to this socket's
++    /// `write` function will wait before returning a timeout. A value of `None`
++    /// means that no read timeout should be specified and otherwise `Some`
++    /// indicates the duration of the timeout.
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn set_write_timeout(&self, val: Option<Duration>) -> io::Result<()>;
++
++    /// Gets the value of the `SO_SNDTIMEO` option for this socket.
++    ///
++    /// For more information about this option, see [`set_write_timeout_ms`][link].
++    ///
++    /// [link]: #tymethod.set_write_timeout_ms
++    fn write_timeout_ms(&self) -> io::Result<Option<u32>>;
++
++    /// Gets the value of the `SO_SNDTIMEO` option for this socket.
++    ///
++    /// For more information about this option, see [`set_write_timeout`][link].
++    ///
++    /// [link]: #tymethod.set_write_timeout
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn write_timeout(&self) -> io::Result<Option<Duration>>;
++
++    /// Get the value of the `SO_ERROR` option on this socket.
++    ///
++    /// This will retrieve the stored error in the underlying socket, clearing
++    /// the field in the process. This can be useful for checking errors between
++    /// calls.
++    fn take_error(&self) -> io::Result<Option<io::Error>>;
++
++    /// Connects this UDP socket to a remote address, allowing the `send` and
++    /// `recv` syscalls to be used to send data and also applies filters to only
++    /// receive data from the specified address.
++    fn connect<A: ToSocketAddrs>(&self, addr: A) -> io::Result<()>;
++
++    /// Sends data on the socket to the remote address to which it is connected.
++    ///
++    /// The `connect` method will connect this socket to a remote address. This
++    /// method will fail if the socket is not connected.
++    fn send(&self, buf: &[u8]) -> io::Result<usize>;
++
++    /// Receives data on the socket from the remote address to which it is
++    /// connected.
++    ///
++    /// The `connect` method will connect this socket to a remote address. This
++    /// method will fail if the socket is not connected.
++    fn recv(&self, buf: &mut [u8]) -> io::Result<usize>;
++
++    /// Moves this UDP socket into or out of nonblocking mode.
++    ///
++    /// For more information about this option, see
++    /// [`TcpStreamExt::set_nonblocking`][link].
++    ///
++    /// [link]: trait.TcpStreamExt.html#tymethod.set_nonblocking
++    fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()>;
++}
++
++#[doc(hidden)]
++pub trait AsSock {
++    fn as_sock(&self) -> Socket;
++}
++
++#[cfg(unix)]
++impl<T: AsRawFd> AsSock for T {
++    fn as_sock(&self) -> Socket { self.as_raw_fd() }
++}
++#[cfg(windows)]
++impl<T: AsRawSocket> AsSock for T {
++    fn as_sock(&self) -> Socket { self.as_raw_socket() }
++}
++
++cfg_if! {
++    if #[cfg(any(target_os = "macos", target_os = "ios"))] {
++        use libc::TCP_KEEPALIVE as KEEPALIVE_OPTION;
++    } else if #[cfg(any(target_os = "openbsd", target_os = "netbsd"))] {
++        use libc::SO_KEEPALIVE as KEEPALIVE_OPTION;
++    } else if #[cfg(unix)] {
++        use libc::TCP_KEEPIDLE as KEEPALIVE_OPTION;
++    } else {
++        // ...
++    }
++}
++
++impl TcpStreamExt for TcpStream {
++
++    fn set_recv_buffer_size(&self, size: usize) -> io::Result<()> {
++        // TODO: casting usize to a c_int should be a checked cast
++        set_opt(self.as_sock(), SOL_SOCKET, SO_RCVBUF, size as c_int)
++    }
++
++    fn recv_buffer_size(&self) -> io::Result<usize> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_RCVBUF).map(int2usize)
++    }
++
++    fn set_send_buffer_size(&self, size: usize) -> io::Result<()> {
++        set_opt(self.as_sock(), SOL_SOCKET, SO_SNDBUF, size as c_int)
++    }
++
++    fn send_buffer_size(&self) -> io::Result<usize> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_SNDBUF).map(int2usize)
++    }
++
++    fn set_nodelay(&self, nodelay: bool) -> io::Result<()> {
++        set_opt(self.as_sock(), v(IPPROTO_TCP), TCP_NODELAY,
++               nodelay as c_int)
++    }
++    fn nodelay(&self) -> io::Result<bool> {
++        get_opt(self.as_sock(), v(IPPROTO_TCP), TCP_NODELAY)
++            .map(int2bool)
++    }
++
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn set_keepalive(&self, keepalive: Option<Duration>) -> io::Result<()> {
++        self.set_keepalive_ms(keepalive.map(dur2ms))
++    }
++
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn keepalive(&self) -> io::Result<Option<Duration>> {
++        self.keepalive_ms().map(|o| o.map(ms2dur))
++    }
++
++    #[cfg(unix)]
++    fn set_keepalive_ms(&self, keepalive: Option<u32>) -> io::Result<()> {
++        try!(set_opt(self.as_sock(), SOL_SOCKET, SO_KEEPALIVE,
++                    keepalive.is_some() as c_int));
++        if let Some(dur) = keepalive {
++            try!(set_opt(self.as_sock(), v(IPPROTO_TCP), KEEPALIVE_OPTION,
++                        (dur / 1000) as c_int));
++        }
++        Ok(())
++    }
++
++    #[cfg(unix)]
++    fn keepalive_ms(&self) -> io::Result<Option<u32>> {
++        let keepalive = try!(get_opt::<c_int>(self.as_sock(), SOL_SOCKET,
++                                             SO_KEEPALIVE));
++        if keepalive == 0 {
++            return Ok(None)
++        }
++        let secs = try!(get_opt::<c_int>(self.as_sock(), v(IPPROTO_TCP),
++                                        KEEPALIVE_OPTION));
++        Ok(Some((secs as u32) * 1000))
++    }
++
++    #[cfg(windows)]
++    fn set_keepalive_ms(&self, keepalive: Option<u32>) -> io::Result<()> {
++        let ms = keepalive.unwrap_or(INFINITE);
++        let ka = tcp_keepalive {
++            onoff: keepalive.is_some() as c_ulong,
++            keepalivetime: ms as c_ulong,
++            keepaliveinterval: ms as c_ulong,
++        };
++        unsafe {
++            ::cvt_win(WSAIoctl(self.as_sock(),
++                               SIO_KEEPALIVE_VALS,
++                               &ka as *const _ as *mut _,
++                               mem::size_of_val(&ka) as DWORD,
++                               0 as *mut _,
++                               0,
++                               0 as *mut _,
++                               0 as *mut _,
++                               None)).map(|_| ())
++        }
++    }
++
++    #[cfg(windows)]
++    fn keepalive_ms(&self) -> io::Result<Option<u32>> {
++        let mut ka = tcp_keepalive {
++            onoff: 0,
++            keepalivetime: 0,
++            keepaliveinterval: 0,
++        };
++        unsafe {
++            try!(::cvt_win(WSAIoctl(self.as_sock(),
++                                    SIO_KEEPALIVE_VALS,
++                                    0 as *mut _,
++                                    0,
++                                    &mut ka as *mut _ as *mut _,
++                                    mem::size_of_val(&ka) as DWORD,
++                                    0 as *mut _,
++                                    0 as *mut _,
++                                    None)));
++        }
++        Ok({
++            if ka.onoff == 0 {
++                None
++            } else {
++                timeout2ms(ka.keepaliveinterval as DWORD)
++            }
++        })
++    }
++
++    fn set_read_timeout_ms(&self, dur: Option<u32>) -> io::Result<()> {
++        set_opt(self.as_sock(), SOL_SOCKET, SO_RCVTIMEO,
++               ms2timeout(dur))
++    }
++
++    fn read_timeout_ms(&self) -> io::Result<Option<u32>> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_RCVTIMEO)
++            .map(timeout2ms)
++    }
++
++    fn set_write_timeout_ms(&self, dur: Option<u32>) -> io::Result<()> {
++        set_opt(self.as_sock(), SOL_SOCKET, SO_SNDTIMEO,
++               ms2timeout(dur))
++    }
++
++    fn write_timeout_ms(&self) -> io::Result<Option<u32>> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_SNDTIMEO)
++            .map(timeout2ms)
++    }
++
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
++        self.set_read_timeout_ms(dur.map(dur2ms))
++    }
++
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn read_timeout(&self) -> io::Result<Option<Duration>> {
++        self.read_timeout_ms().map(|o| o.map(ms2dur))
++    }
++
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
++        self.set_write_timeout_ms(dur.map(dur2ms))
++    }
++
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn write_timeout(&self) -> io::Result<Option<Duration>> {
++        self.write_timeout_ms().map(|o| o.map(ms2dur))
++    }
++
++    fn set_ttl(&self, ttl: u32) -> io::Result<()> {
++        set_opt(self.as_sock(), IPPROTO_IP, IP_TTL, ttl as c_int)
++    }
++
++    fn ttl(&self) -> io::Result<u32> {
++        get_opt::<c_int>(self.as_sock(), IPPROTO_IP, IP_TTL)
++            .map(|b| b as u32)
++    }
++
++    fn set_only_v6(&self, only_v6: bool) -> io::Result<()> {
++        set_opt(self.as_sock(), v(IPPROTO_IPV6), IPV6_V6ONLY, only_v6 as c_int)
++    }
++
++    fn only_v6(&self) -> io::Result<bool> {
++        get_opt(self.as_sock(), v(IPPROTO_IPV6), IPV6_V6ONLY).map(int2bool)
++    }
++
++    fn connect<T: ToSocketAddrs>(&self, addr: T) -> io::Result<()> {
++        do_connect(self.as_sock(), addr)
++    }
++
++    fn take_error(&self) -> io::Result<Option<io::Error>> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_ERROR).map(int2err)
++    }
++
++    fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> {
++        set_nonblocking(self.as_sock(), nonblocking)
++    }
++    
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn set_linger(&self, dur: Option<Duration>) -> io::Result<()> {
++        set_opt(self.as_sock(), SOL_SOCKET, SO_LINGER, dur2linger(dur))
++    }
++
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn linger(&self) -> io::Result<Option<Duration>> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_LINGER).map(linger2dur)        
++    }
++}
++
++#[cfg(unix)]
++fn ms2timeout(dur: Option<u32>) -> timeval {
++    // TODO: be more rigorous
++    match dur {
++        Some(d) => timeval {
++            tv_sec: (d / 1000) as time_t,
++            tv_usec: (d % 1000) as suseconds_t,
++        },
++        None => timeval { tv_sec: 0, tv_usec: 0 },
++    }
++}
++
++#[cfg(unix)]
++fn timeout2ms(dur: timeval) -> Option<u32> {
++    if dur.tv_sec == 0 && dur.tv_usec == 0 {
++        None
++    } else {
++        Some(dur.tv_sec as u32 * 1000 + dur.tv_usec as u32 / 1000)
++    }
++}
++
++#[cfg(windows)]
++fn ms2timeout(dur: Option<u32>) -> DWORD {
++    dur.unwrap_or(0)
++}
++
++#[cfg(windows)]
++fn timeout2ms(dur: DWORD) -> Option<u32> {
++    if dur == 0 {
++        None
++    } else {
++        Some(dur)
++    }
++}
++
++#[cfg(any(feature = "nightly", feature = "duration"))]
++fn linger2dur(linger_opt: linger) -> Option<Duration> {
++    if linger_opt.l_onoff == 0 {
++        None
++    }
++    else {
++        Some(Duration::from_secs(linger_opt.l_linger as u64))
++    }
++}
++
++#[cfg(all(any(feature = "nightly", feature = "duration"), windows))]
++fn dur2linger(dur: Option<Duration>) -> linger {
++    match dur {
++        Some(d) => {
++            linger {
++                l_onoff: 1,
++                l_linger: d.as_secs() as u16,
++            }
++        },
++        None => linger { l_onoff: 0, l_linger: 0 },
++    }
++}
++
++#[cfg(all(any(feature = "nightly", feature = "duration"), unix))]
++fn dur2linger(dur: Option<Duration>) -> linger {
++    match dur {
++        Some(d) => {
++            linger {
++                l_onoff: 1,
++                l_linger: d.as_secs() as c_int,
++            }
++        },
++        None => linger { l_onoff: 0, l_linger: 0 },
++    }
++}
++
++#[cfg(any(feature = "nightly", feature = "duration"))]
++fn ms2dur(ms: u32) -> Duration {
++    Duration::new((ms as u64) / 1000, (ms as u32) % 1000 * 1_000_000)
++}
++
++#[cfg(any(feature = "nightly", feature = "duration"))]
++fn dur2ms(dur: Duration) -> u32 {
++    (dur.as_secs() as u32 * 1000) + (dur.subsec_nanos() / 1_000_000)
++}
++
++pub fn int2bool(n: c_int) -> bool {
++    if n == 0 {false} else {true}
++}
++
++pub fn int2usize(n: c_int) -> usize {
++    // TODO: casting c_int to a usize should be a checked cast
++    n as usize
++}
++
++pub fn int2err(n: c_int) -> Option<io::Error> {
++    if n == 0 {
++        None
++    } else {
++        Some(io::Error::from_raw_os_error(n as i32))
++    }
++}
++
++impl UdpSocketExt for UdpSocket {
++
++    fn set_recv_buffer_size(&self, size: usize) -> io::Result<()> {
++        set_opt(self.as_sock(), SOL_SOCKET, SO_RCVBUF, size as c_int)
++    }
++
++    fn recv_buffer_size(&self) -> io::Result<usize> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_RCVBUF).map(int2usize)
++    }
++
++    fn set_send_buffer_size(&self, size: usize) -> io::Result<()> {
++        set_opt(self.as_sock(), SOL_SOCKET, SO_SNDBUF, size as c_int)
++    }
++
++    fn send_buffer_size(&self) -> io::Result<usize> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_SNDBUF).map(int2usize)
++    }
++
++    fn set_broadcast(&self, broadcast: bool) -> io::Result<()> {
++        set_opt(self.as_sock(), SOL_SOCKET, SO_BROADCAST,
++               broadcast as c_int)
++    }
++    fn broadcast(&self) -> io::Result<bool> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_BROADCAST)
++            .map(int2bool)
++    }
++    fn set_multicast_loop_v4(&self, multicast_loop_v4: bool) -> io::Result<()> {
++        set_opt(self.as_sock(), IPPROTO_IP, IP_MULTICAST_LOOP,
++               multicast_loop_v4 as c_int)
++    }
++    fn multicast_loop_v4(&self) -> io::Result<bool> {
++        get_opt(self.as_sock(), IPPROTO_IP, IP_MULTICAST_LOOP)
++            .map(int2bool)
++    }
++    fn set_multicast_ttl_v4(&self, multicast_ttl_v4: u32) -> io::Result<()> {
++        set_opt(self.as_sock(), IPPROTO_IP, IP_MULTICAST_TTL,
++               multicast_ttl_v4 as c_int)
++    }
++    fn multicast_ttl_v4(&self) -> io::Result<u32> {
++        get_opt::<c_int>(self.as_sock(), IPPROTO_IP, IP_MULTICAST_TTL)
++            .map(|b| b as u32)
++    }
++    fn set_multicast_loop_v6(&self, multicast_loop_v6: bool) -> io::Result<()> {
++        set_opt(self.as_sock(), v(IPPROTO_IPV6), IPV6_MULTICAST_LOOP,
++               multicast_loop_v6 as c_int)
++    }
++    fn multicast_loop_v6(&self) -> io::Result<bool> {
++        get_opt(self.as_sock(), v(IPPROTO_IPV6), IPV6_MULTICAST_LOOP)
++            .map(int2bool)
++    }
++
++    fn set_ttl(&self, ttl: u32) -> io::Result<()> {
++        set_opt(self.as_sock(), IPPROTO_IP, IP_TTL, ttl as c_int)
++    }
++
++    fn ttl(&self) -> io::Result<u32> {
++        get_opt::<c_int>(self.as_sock(), IPPROTO_IP, IP_TTL)
++            .map(|b| b as u32)
++    }
++
++    fn set_only_v6(&self, only_v6: bool) -> io::Result<()> {
++        set_opt(self.as_sock(), v(IPPROTO_IPV6), IPV6_V6ONLY, only_v6 as c_int)
++    }
++
++    fn only_v6(&self) -> io::Result<bool> {
++        get_opt(self.as_sock(), v(IPPROTO_IPV6), IPV6_V6ONLY).map(int2bool)
++    }
++
++    fn join_multicast_v4(&self, multiaddr: &Ipv4Addr, interface: &Ipv4Addr)
++                         -> io::Result<()> {
++        let mreq = ip_mreq {
++            imr_multiaddr: ip2in_addr(multiaddr),
++            imr_interface: ip2in_addr(interface),
++        };
++        set_opt(self.as_sock(), IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
++    }
++
++    fn join_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32)
++                         -> io::Result<()> {
++        let mreq = ipv6_mreq {
++            ipv6mr_multiaddr: ip2in6_addr(multiaddr),
++            ipv6mr_interface: to_ipv6mr_interface(interface),
++        };
++        set_opt(self.as_sock(), v(IPPROTO_IPV6), IPV6_ADD_MEMBERSHIP,
++               mreq)
++    }
++
++    fn leave_multicast_v4(&self, multiaddr: &Ipv4Addr, interface: &Ipv4Addr)
++                          -> io::Result<()> {
++        let mreq = ip_mreq {
++            imr_multiaddr: ip2in_addr(multiaddr),
++            imr_interface: ip2in_addr(interface),
++        };
++        set_opt(self.as_sock(), IPPROTO_IP, IP_DROP_MEMBERSHIP, mreq)
++    }
++
++    fn leave_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32)
++                          -> io::Result<()> {
++        let mreq = ipv6_mreq {
++            ipv6mr_multiaddr: ip2in6_addr(multiaddr),
++            ipv6mr_interface: to_ipv6mr_interface(interface),
++        };
++        set_opt(self.as_sock(), v(IPPROTO_IPV6), IPV6_DROP_MEMBERSHIP,
++               mreq)
++    }
++
++    fn set_read_timeout_ms(&self, dur: Option<u32>) -> io::Result<()> {
++        set_opt(self.as_sock(), SOL_SOCKET, SO_RCVTIMEO,
++               ms2timeout(dur))
++    }
++
++    fn read_timeout_ms(&self) -> io::Result<Option<u32>> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_RCVTIMEO)
++            .map(timeout2ms)
++    }
++
++    fn set_write_timeout_ms(&self, dur: Option<u32>) -> io::Result<()> {
++        set_opt(self.as_sock(), SOL_SOCKET, SO_SNDTIMEO,
++               ms2timeout(dur))
++    }
++
++    fn write_timeout_ms(&self) -> io::Result<Option<u32>> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_SNDTIMEO)
++            .map(timeout2ms)
++    }
++
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
++        self.set_read_timeout_ms(dur.map(dur2ms))
++    }
++
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn read_timeout(&self) -> io::Result<Option<Duration>> {
++        self.read_timeout_ms().map(|o| o.map(ms2dur))
++    }
++
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
++        self.set_write_timeout_ms(dur.map(dur2ms))
++    }
++
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn write_timeout(&self) -> io::Result<Option<Duration>> {
++        self.write_timeout_ms().map(|o| o.map(ms2dur))
++    }
++
++    fn take_error(&self) -> io::Result<Option<io::Error>> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_ERROR).map(int2err)
++    }
++
++    fn connect<A: ToSocketAddrs>(&self, addr: A) -> io::Result<()> {
++        do_connect(self.as_sock(), addr)
++    }
++
++    #[cfg(unix)]
++    fn send(&self, buf: &[u8]) -> io::Result<usize> {
++        unsafe {
++            ::cvt(send(self.as_sock(), buf.as_ptr() as *const _, buf.len(), 0)).map(|n| n as usize)
++        }
++    }
++
++    #[cfg(windows)]
++    fn send(&self, buf: &[u8]) -> io::Result<usize> {
++        let len = ::std::cmp::min(buf.len(), c_int::max_value() as usize);
++        let buf = &buf[..len];
++        unsafe {
++            ::cvt(send(self.as_sock(), buf.as_ptr() as *const _, len as c_int, 0))
++                .map(|n| n as usize)
++        }
++    }
++
++    #[cfg(unix)]
++    fn recv(&self, buf: &mut [u8]) -> io::Result<usize> {
++        unsafe {
++            ::cvt(recv(self.as_sock(), buf.as_mut_ptr() as *mut _, buf.len(), 0))
++                .map(|n| n as usize)
++        }
++    }
++
++    #[cfg(windows)]
++    fn recv(&self, buf: &mut [u8]) -> io::Result<usize> {
++        let len = ::std::cmp::min(buf.len(), c_int::max_value() as usize);
++        let buf = &mut buf[..len];
++        unsafe {
++            ::cvt(recv(self.as_sock(), buf.as_mut_ptr() as *mut _, buf.len() as c_int, 0))
++                .map(|n| n as usize)
++        }
++    }
++
++    fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> {
++        set_nonblocking(self.as_sock(), nonblocking)
++    }
++}
++
++fn do_connect<A: ToSocketAddrs>(sock: Socket, addr: A) -> io::Result<()> {
++    let err = io::Error::new(io::ErrorKind::Other,
++                             "no socket addresses resolved");
++    let addrs = try!(addr.to_socket_addrs());
++    let sys = sys::Socket::from_inner(sock);
++    let sock = socket::Socket::from_inner(sys);
++    let ret = addrs.fold(Err(err), |prev, addr| {
++        prev.or_else(|_| sock.connect(&addr))
++    });
++    mem::forget(sock);
++    return ret
++}
++
++#[cfg(unix)]
++fn set_nonblocking(sock: Socket, nonblocking: bool) -> io::Result<()> {
++    let mut nonblocking = nonblocking as c_ulong;
++    ::cvt(unsafe {
++        ioctl(sock, FIONBIO, &mut nonblocking)
++    }).map(|_| ())
++}
++
++#[cfg(windows)]
++fn set_nonblocking(sock: Socket, nonblocking: bool) -> io::Result<()> {
++    let mut nonblocking = nonblocking as c_ulong;
++    ::cvt(unsafe {
++        ioctlsocket(sock, FIONBIO as c_int, &mut nonblocking)
++    }).map(|_| ())
++}
++
++#[cfg(unix)]
++fn ip2in_addr(ip: &Ipv4Addr) -> in_addr {
++    let oct = ip.octets();
++    in_addr {
++        s_addr: ::hton(((oct[0] as u32) << 24) |
++                       ((oct[1] as u32) << 16) |
++                       ((oct[2] as u32) <<  8) |
++                       ((oct[3] as u32) <<  0)),
++    }
++}
++
++#[cfg(windows)]
++fn ip2in_addr(ip: &Ipv4Addr) -> in_addr {
++    let oct = ip.octets();
++    in_addr {
++        S_un: ::hton(((oct[0] as u32) << 24) |
++                     ((oct[1] as u32) << 16) |
++                     ((oct[2] as u32) <<  8) |
++                     ((oct[3] as u32) <<  0)),
++    }
++}
++
++#[cfg(target_os = "android")]
++fn to_ipv6mr_interface(value: u32) -> c_int {
++    value as c_int
++}
++
++#[cfg(not(target_os = "android"))]
++fn to_ipv6mr_interface(value: u32) -> c_uint {
++    value as c_uint
++}
++
++fn ip2in6_addr(ip: &Ipv6Addr) -> in6_addr {
++    let mut ret: in6_addr = unsafe { mem::zeroed() };
++    let seg = ip.segments();
++    ret.s6_addr = [
++        (seg[0] >> 8) as u8,
++        (seg[0] >> 0) as u8,
++        (seg[1] >> 8) as u8,
++        (seg[1] >> 0) as u8,
++        (seg[2] >> 8) as u8,
++        (seg[2] >> 0) as u8,
++        (seg[3] >> 8) as u8,
++        (seg[3] >> 0) as u8,
++        (seg[4] >> 8) as u8,
++        (seg[4] >> 0) as u8,
++        (seg[5] >> 8) as u8,
++        (seg[5] >> 0) as u8,
++        (seg[6] >> 8) as u8,
++        (seg[6] >> 0) as u8,
++        (seg[7] >> 8) as u8,
++        (seg[7] >> 0) as u8,
++    ];
++    return ret
++}
++
++impl TcpListenerExt for TcpListener {
++    fn set_ttl(&self, ttl: u32) -> io::Result<()> {
++        set_opt(self.as_sock(), IPPROTO_IP, IP_TTL, ttl as c_int)
++    }
++
++    fn ttl(&self) -> io::Result<u32> {
++        get_opt::<c_int>(self.as_sock(), IPPROTO_IP, IP_TTL)
++            .map(|b| b as u32)
++    }
++
++    fn set_only_v6(&self, only_v6: bool) -> io::Result<()> {
++        set_opt(self.as_sock(), v(IPPROTO_IPV6), IPV6_V6ONLY, only_v6 as c_int)
++    }
++
++    fn only_v6(&self) -> io::Result<bool> {
++        get_opt(self.as_sock(), v(IPPROTO_IPV6), IPV6_V6ONLY).map(int2bool)
++    }
++
++    fn take_error(&self) -> io::Result<Option<io::Error>> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_ERROR).map(int2err)
++    }
++
++    fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> {
++        set_nonblocking(self.as_sock(), nonblocking)
++    }
++
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn set_linger(&self, dur: Option<Duration>) -> io::Result<()> {
++        set_opt(self.as_sock(), SOL_SOCKET, SO_LINGER, dur2linger(dur))
++    }
++
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn linger(&self) -> io::Result<Option<Duration>> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_LINGER).map(linger2dur)        
++    }
++}
++
++impl TcpBuilder {
++    /// Sets the value for the `IP_TTL` option on this socket.
++    ///
++    /// This is the same as [`TcpStreamExt::set_ttl`][other].
++    ///
++    /// [other]: trait.TcpStreamExt.html#tymethod.set_ttl
++    pub fn ttl(&self, ttl: u32) -> io::Result<&Self> {
++        set_opt(self.as_sock(), IPPROTO_IP, IP_TTL, ttl as c_int)
++            .map(|()| self)
++    }
++
++    /// Sets the value for the `IPV6_V6ONLY` option on this socket.
++    ///
++    /// This is the same as [`TcpStreamExt::set_only_v6`][other].
++    ///
++    /// [other]: trait.TcpStreamExt.html#tymethod.set_only_v6
++    pub fn only_v6(&self, only_v6: bool) -> io::Result<&Self> {
++        set_opt(self.as_sock(), v(IPPROTO_IPV6), IPV6_V6ONLY, only_v6 as c_int)
++            .map(|()| self)
++    }
++
++    /// Set value for the `SO_REUSEADDR` option on this socket.
++    ///
++    /// This indicates that futher calls to `bind` may allow reuse of local
++    /// addresses. For IPv4 sockets this means that a socket may bind even when
++    /// there's a socket already listening on this port.
++    pub fn reuse_address(&self, reuse: bool) -> io::Result<&Self> {
++        set_opt(self.as_sock(), SOL_SOCKET, SO_REUSEADDR,
++               reuse as c_int).map(|()| self)
++    }
++
++    /// Check the `SO_REUSEADDR` option on this socket.
++    pub fn get_reuse_address(&self) -> io::Result<bool> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_REUSEADDR).map(int2bool)
++    }
++
++    /// Get the value of the `SO_ERROR` option on this socket.
++    ///
++    /// This will retrieve the stored error in the underlying socket, clearing
++    /// the field in the process. This can be useful for checking errors between
++    /// calls.
++    pub fn take_error(&self) -> io::Result<Option<io::Error>> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_ERROR).map(int2err)
++    }
++
++    /// Sets the linger option for this socket
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn set_linger(&self, dur: Option<Duration>) -> io::Result<()> {
++        set_opt(self.as_sock(), SOL_SOCKET, SO_LINGER, dur2linger(dur))
++    }
++
++    /// Gets the linger option for this socket
++    #[cfg(any(feature = "nightly", feature = "duration"))]
++    fn linger(&self) -> io::Result<Option<Duration>> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_LINGER).map(linger2dur)        
++    }
++}
++
++impl UdpBuilder {
++    /// Sets the value for the `IP_TTL` option on this socket.
++    ///
++    /// This is the same as [`TcpStreamExt::set_ttl`][other].
++    ///
++    /// [other]: trait.TcpStreamExt.html#tymethod.set_ttl
++    pub fn ttl(&self, ttl: u32) -> io::Result<&Self> {
++        set_opt(self.as_sock(), IPPROTO_IP, IP_TTL, ttl as c_int)
++            .map(|()| self)
++    }
++
++    /// Sets the value for the `IPV6_V6ONLY` option on this socket.
++    ///
++    /// This is the same as [`TcpStream::only_v6`][other].
++    ///
++    /// [other]: struct.TcpBuilder.html#method.only_v6
++    pub fn only_v6(&self, only_v6: bool) -> io::Result<&Self> {
++        set_opt(self.as_sock(), v(IPPROTO_IPV6), IPV6_V6ONLY, only_v6 as c_int)
++            .map(|()| self)
++    }
++
++    /// Set value for the `SO_REUSEADDR` option on this socket.
++    ///
++    /// This is the same as [`TcpBuilder::reuse_address`][other].
++    ///
++    /// [other]: struct.TcpBuilder.html#method.reuse_address
++    pub fn reuse_address(&self, reuse: bool) -> io::Result<&Self> {
++        set_opt(self.as_sock(), SOL_SOCKET, SO_REUSEADDR,
++               reuse as c_int).map(|()| self)
++    }
++
++    /// Check the `SO_REUSEADDR` option on this socket.
++    pub fn get_reuse_address(&self) -> io::Result<bool> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_REUSEADDR).map(int2bool)
++    }
++
++    /// Get the value of the `SO_ERROR` option on this socket.
++    ///
++    /// This will retrieve the stored error in the underlying socket, clearing
++    /// the field in the process. This can be useful for checking errors between
++    /// calls.
++    pub fn take_error(&self) -> io::Result<Option<io::Error>> {
++        get_opt(self.as_sock(), SOL_SOCKET, SO_ERROR).map(int2err)
++    }
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..f31f0db752cd279731f0970d07c98d77e2e3c327
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,125 @@@
++// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
++// file at the top-level directory of this distribution and at
++// http://rust-lang.org/COPYRIGHT.
++//
++// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
++// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
++// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
++// option. This file may not be copied, modified, or distributed
++// except according to those terms.
++
++//! Extensions to `std::net` networking types.
++//!
++//! This crate implements a number of extensions to the standard `std::net`
++//! networking types, hopefully being slated for inclusion into the standard
++//! library in the future. The goal of this crate is to expose all sorts of
++//! cross-platform and platform-specific configuration options of UDP/TCP
++//! sockets. System APIs are wrapped with as thin a layer as possible instead of
++//! bundling multiple actions into one API call.
++//!
++//! More information about the design of this crate can be found in the
++//! [associated rfc][rfc]
++//!
++//! [rfc]: https://github.com/rust-lang/rfcs/pull/1158
++//!
++//! # Examples
++//!
++//! ```no_run
++//! use net2::TcpBuilder;
++//!
++//! let tcp = TcpBuilder::new_v4().unwrap();
++//! tcp.reuse_address(true).unwrap()
++//!    .only_v6(false).unwrap();
++//!
++//! let mut stream = tcp.connect("127.0.0.1:80").unwrap();
++//!
++//! // use `stream` as a TcpStream
++//! ```
++
++#![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
++       html_favicon_url = "https://doc.rust-lang.org/favicon.ico",
++       html_root_url = "https://doc.rust-lang.org/net2-rs")]
++#![deny(missing_docs, warnings)]
++
++
++#[cfg(unix)] extern crate libc;
++
++#[cfg(windows)] extern crate kernel32;
++#[cfg(windows)] extern crate winapi;
++#[cfg(windows)] extern crate ws2_32;
++
++#[macro_use] extern crate cfg_if;
++
++use std::io;
++use std::ops::Neg;
++use std::net::{ToSocketAddrs, SocketAddr};
++
++use utils::{One, NetInt};
++
++mod tcp;
++mod udp;
++mod socket;
++mod ext;
++mod utils;
++
++#[cfg(unix)] #[path = "sys/unix/mod.rs"] mod sys;
++#[cfg(windows)] #[path = "sys/windows/mod.rs"] mod sys;
++// FIXME: should include android here once SO_REUSEPORT has been fixed in
++//        liblibc on android
++#[cfg(all(unix, not(any(target_os = "android", target_os = "solaris"))))] pub mod unix;
++
++pub use tcp::TcpBuilder;
++pub use udp::UdpBuilder;
++pub use ext::{TcpStreamExt, TcpListenerExt, UdpSocketExt};
++
++fn one_addr<T: ToSocketAddrs>(tsa: T) -> io::Result<SocketAddr> {
++    let mut addrs = try!(tsa.to_socket_addrs());
++    let addr = match addrs.next() {
++        Some(addr) => addr,
++        None => return Err(io::Error::new(io::ErrorKind::Other,
++                                          "no socket addresses could be resolved"))
++    };
++    if addrs.next().is_none() {
++        Ok(addr)
++    } else {
++        Err(io::Error::new(io::ErrorKind::Other,
++                           "more than one address resolved"))
++    }
++}
++
++fn cvt<T: One + PartialEq + Neg<Output=T>>(t: T) -> io::Result<T> {
++    let one: T = T::one();
++    if t == -one {
++        Err(io::Error::last_os_error())
++    } else {
++        Ok(t)
++    }
++}
++
++#[cfg(windows)]
++fn cvt_win<T: PartialEq + utils::Zero>(t: T) -> io::Result<T> {
++    if t == T::zero() {
++        Err(io::Error::last_os_error())
++    } else {
++        Ok(t)
++    }
++}
++
++fn hton<I: NetInt>(i: I) -> I { i.to_be() }
++
++fn ntoh<I: NetInt>(i: I) -> I { I::from_be(i) }
++
++trait AsInner {
++    type Inner;
++    fn as_inner(&self) -> &Self::Inner;
++}
++
++trait FromInner {
++    type Inner;
++    fn from_inner(inner: Self::Inner) -> Self;
++}
++
++trait IntoInner {
++    type Inner;
++    fn into_inner(self) -> Self::Inner;
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..972b0cf4240799dedc76c476389954290c1d200f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,143 @@@
++// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
++// file at the top-level directory of this distribution and at
++// http://rust-lang.org/COPYRIGHT.
++//
++// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
++// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
++// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
++// option. This file may not be copied, modified, or distributed
++// except according to those terms.
++
++use std::fmt;
++use std::io;
++use std::mem;
++use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
++#[cfg(unix)]
++use libc::c_int;
++#[cfg(windows)]
++use winapi::c_int;
++
++use sys;
++use sys::c;
++
++pub struct Socket {
++    inner: sys::Socket,
++}
++
++impl Socket {
++    pub fn new(family: c_int, ty: c_int) -> io::Result<Socket> {
++        Ok(Socket { inner: try!(sys::Socket::new(family, ty)) })
++    }
++
++    pub fn bind(&self, addr: &SocketAddr) -> io::Result<()> {
++        #[cfg(not(all(target_arch = "aarch64",target_os = "android")))]
++        use sys::c::socklen_t as len_t;
++        #[cfg(all(target_arch = "aarch64",target_os = "android"))]
++        use libc::c_int as len_t;
++
++        let (addr, len) = addr2raw(addr);
++        unsafe {
++            ::cvt(c::bind(self.inner.raw(), addr, len as len_t)).map(|_| ())
++        }
++    }
++
++    pub fn listen(&self, backlog: i32) -> io::Result<()> {
++        unsafe {
++            ::cvt(c::listen(self.inner.raw(), backlog)).map(|_| ())
++        }
++    }
++
++    pub fn connect(&self, addr: &SocketAddr) -> io::Result<()> {
++        let (addr, len) = addr2raw(addr);
++        unsafe {
++            ::cvt(c::connect(self.inner.raw(), addr, len)).map(|_| ())
++        }
++    }
++
++    pub fn getsockname(&self) -> io::Result<SocketAddr> {
++        unsafe {
++            let mut storage: c::sockaddr_storage = mem::zeroed();
++            let mut len = mem::size_of_val(&storage) as c::socklen_t;
++            try!(::cvt(c::getsockname(self.inner.raw(),
++                                      &mut storage as *mut _ as *mut _,
++                                      &mut len)));
++            raw2addr(&storage, len)
++        }
++    }
++}
++
++impl fmt::Debug for Socket {
++    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
++        self.inner.raw().fmt(f)
++    }
++}
++
++impl ::AsInner for Socket {
++    type Inner = sys::Socket;
++    fn as_inner(&self) -> &sys::Socket { &self.inner }
++}
++
++impl ::FromInner for Socket {
++    type Inner = sys::Socket;
++    fn from_inner(sock: sys::Socket) -> Socket {
++        Socket { inner: sock }
++    }
++}
++
++impl ::IntoInner for Socket {
++    type Inner = sys::Socket;
++    fn into_inner(self) -> sys::Socket { self.inner }
++}
++
++fn addr2raw(addr: &SocketAddr) -> (*const c::sockaddr, c::socklen_t) {
++    match *addr {
++        SocketAddr::V4(ref a) => {
++            (a as *const _ as *const _, mem::size_of_val(a) as c::socklen_t)
++        }
++        SocketAddr::V6(ref a) => {
++            (a as *const _ as *const _, mem::size_of_val(a) as c::socklen_t)
++        }
++    }
++}
++
++fn raw2addr(storage: &c::sockaddr_storage, len: c::socklen_t) -> io::Result<SocketAddr> {
++    match storage.ss_family as c_int {
++        c::AF_INET => {
++            unsafe {
++                assert!(len as usize >= mem::size_of::<c::sockaddr_in>());
++                let sa = storage as *const _ as *const c::sockaddr_in;
++                let bits = c::sockaddr_in_u32(&(*sa));
++                let ip = Ipv4Addr::new((bits >> 24) as u8,
++                                       (bits >> 16) as u8,
++                                       (bits >> 8) as u8,
++                                       bits as u8);
++                Ok(SocketAddr::V4(SocketAddrV4::new(ip, ::ntoh((*sa).sin_port))))
++            }
++        }
++        c::AF_INET6 => {
++            unsafe {
++                assert!(len as usize >= mem::size_of::<c::sockaddr_in6>());
++
++                let sa = storage as *const _ as *const c::sockaddr_in6;
++                let arr = (*sa).sin6_addr.s6_addr;
++
++                let ip = Ipv6Addr::new(
++                    (arr[0] as u16) << 8 | (arr[1] as u16),
++                    (arr[2] as u16) << 8 | (arr[3] as u16),
++                    (arr[4] as u16) << 8 | (arr[5] as u16),
++                    (arr[6] as u16) << 8 | (arr[7] as u16),
++                    (arr[8] as u16) << 8 | (arr[9] as u16),
++                    (arr[10] as u16) << 8 | (arr[11] as u16),
++                    (arr[12] as u16) << 8 | (arr[13] as u16),
++                    (arr[14] as u16) << 8 | (arr[15] as u16),
++                );
++
++                Ok(SocketAddr::V6(SocketAddrV6::new(ip,
++                                                    ::ntoh((*sa).sin6_port),
++                                                    (*sa).sin6_flowinfo,
++                                                    (*sa).sin6_scope_id)))
++            }
++        }
++        _ => Err(io::Error::new(io::ErrorKind::InvalidInput, "invalid argument")),
++    }
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..95c2fb8081175c8d2127c38d53b683b1193cdee1
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,44 @@@
++// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
++// file at the top-level directory of this distribution and at
++// http://rust-lang.org/COPYRIGHT.
++//
++// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
++// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
++// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
++// option. This file may not be copied, modified, or distributed
++// except according to those terms.
++
++use std::os::unix::io::{FromRawFd, AsRawFd};
++use libc::c_int;
++
++use {TcpBuilder, UdpBuilder, FromInner, AsInner};
++use socket::Socket;
++use sys;
++
++impl FromRawFd for TcpBuilder {
++    unsafe fn from_raw_fd(fd: c_int) -> TcpBuilder {
++        let sock = sys::Socket::from_inner(fd);
++        TcpBuilder::from_inner(Socket::from_inner(sock))
++    }
++}
++
++impl AsRawFd for TcpBuilder {
++    fn as_raw_fd(&self) -> c_int {
++        // TODO: this unwrap() is very bad
++        self.as_inner().borrow().as_ref().unwrap().as_inner().raw()
++    }
++}
++
++impl FromRawFd for UdpBuilder {
++    unsafe fn from_raw_fd(fd: c_int) -> UdpBuilder {
++        let sock = sys::Socket::from_inner(fd);
++        UdpBuilder::from_inner(Socket::from_inner(sock))
++    }
++}
++
++impl AsRawFd for UdpBuilder {
++    fn as_raw_fd(&self) -> c_int {
++        // TODO: this unwrap() is very bad
++        self.as_inner().borrow().as_ref().unwrap().as_inner().raw()
++    }
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..3bd0a66b35078704e9af9ad2a966ed2327459727
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,89 @@@
++// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
++// file at the top-level directory of this distribution and at
++// http://rust-lang.org/COPYRIGHT.
++//
++// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
++// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
++// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
++// option. This file may not be copied, modified, or distributed
++// except according to those terms.
++
++
++use std::io;
++use std::mem;
++use std::net::{TcpListener, TcpStream, UdpSocket};
++use std::os::unix::io::FromRawFd;
++use libc::{self, c_int};
++#[cfg(not(target_os = "solaris"))]
++use libc::{ioctl, FIOCLEX};
++
++mod impls;
++
++pub mod c {
++    pub use libc::*;
++
++    pub fn sockaddr_in_u32(sa: &sockaddr_in) -> u32 {
++        ::ntoh((*sa).sin_addr.s_addr)
++    }
++}
++
++pub struct Socket {
++    fd: c_int,
++}
++
++impl Socket {
++    #[cfg(not(target_os = "solaris"))]
++    pub fn new(family: c_int, ty: c_int) -> io::Result<Socket> {
++        unsafe {
++            let fd = try!(::cvt(libc::socket(family, ty, 0)));
++            ioctl(fd, FIOCLEX);
++            Ok(Socket { fd: fd })
++        }
++    }
++
++    // ioctl(FIOCLEX) is not supported by Solaris/Illumos,
++    // use fcntl(FD_CLOEXEC) instead
++    #[cfg(target_os = "solaris")]
++    pub fn new(family: c_int, ty: c_int) -> io::Result<Socket> {
++        unsafe {
++            let fd = try!(::cvt(libc::socket(family, ty, 0)));
++            libc::fcntl(fd, libc::FD_CLOEXEC);
++            Ok(Socket { fd: fd })
++        }
++    }
++
++    pub fn raw(&self) -> c_int { self.fd }
++
++    fn into_fd(self) -> c_int {
++        let fd = self.fd;
++        mem::forget(self);
++        fd
++    }
++
++    pub fn into_tcp_listener(self) -> TcpListener {
++        unsafe { TcpListener::from_raw_fd(self.into_fd()) }
++    }
++
++    pub fn into_tcp_stream(self) -> TcpStream {
++        unsafe { TcpStream::from_raw_fd(self.into_fd()) }
++    }
++
++    pub fn into_udp_socket(self) -> UdpSocket {
++        unsafe { UdpSocket::from_raw_fd(self.into_fd()) }
++    }
++}
++
++impl ::FromInner for Socket {
++    type Inner = c_int;
++    fn from_inner(fd: c_int) -> Socket {
++        Socket { fd: fd }
++    }
++}
++
++impl Drop for Socket {
++    fn drop(&mut self) {
++        unsafe {
++            let _ = libc::close(self.fd);
++        }
++    }
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..59c120716f08b05950faec81cf93a2db785c2857
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,44 @@@
++// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
++// file at the top-level directory of this distribution and at
++// http://rust-lang.org/COPYRIGHT.
++//
++// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
++// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
++// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
++// option. This file may not be copied, modified, or distributed
++// except according to those terms.
++
++use std::os::windows::io::{FromRawSocket, AsRawSocket};
++use winapi::SOCKET;
++
++use {TcpBuilder, UdpBuilder, FromInner, AsInner};
++use socket::Socket;
++use sys;
++
++impl FromRawSocket for TcpBuilder {
++    unsafe fn from_raw_socket(fd: SOCKET) -> TcpBuilder {
++        let sock = sys::Socket::from_inner(fd);
++        TcpBuilder::from_inner(Socket::from_inner(sock))
++    }
++}
++
++impl AsRawSocket for TcpBuilder {
++    fn as_raw_socket(&self) -> SOCKET {
++        // TODO: this unwrap() is very bad
++        self.as_inner().borrow().as_ref().unwrap().as_inner().raw()
++    }
++}
++
++impl FromRawSocket for UdpBuilder {
++    unsafe fn from_raw_socket(fd: SOCKET) -> UdpBuilder {
++        let sock = sys::Socket::from_inner(fd);
++        UdpBuilder::from_inner(Socket::from_inner(sock))
++    }
++}
++
++impl AsRawSocket for UdpBuilder {
++    fn as_raw_socket(&self) -> SOCKET {
++        // TODO: this unwrap() is very bad
++        self.as_inner().borrow().as_ref().unwrap().as_inner().raw()
++    }
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..6399466a38724edce7c54d48efdf79750d7e6198
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,110 @@@
++// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
++// file at the top-level directory of this distribution and at
++// http://rust-lang.org/COPYRIGHT.
++//
++// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
++// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
++// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
++// option. This file may not be copied, modified, or distributed
++// except according to those terms.
++
++#![allow(bad_style)]
++
++use std::io;
++use std::mem;
++use std::net::{TcpListener, TcpStream, UdpSocket};
++use std::os::windows::io::FromRawSocket;
++use std::sync::{Once, ONCE_INIT};
++
++use winapi::*;
++use ws2_32::*;
++use kernel32::*;
++
++const WSA_FLAG_OVERLAPPED: DWORD = 0x01;
++const HANDLE_FLAG_INHERIT: DWORD = 0x00000001;
++
++pub mod c {
++    pub use winapi::*;
++    pub use ws2_32::*;
++
++    pub use winapi::SOCKADDR as sockaddr;
++    pub use winapi::SOCKADDR_STORAGE as sockaddr_storage;
++    pub use winapi::SOCKADDR_IN as sockaddr_in;
++
++    pub fn sockaddr_in_u32(sa: &sockaddr_in) -> u32 {
++        ::ntoh(sa.sin_addr.S_un)
++    }
++}
++
++mod impls;
++
++fn init() {
++    static INIT: Once = ONCE_INIT;
++
++    INIT.call_once(|| {
++        // Initialize winsock through the standard library by just creating a
++        // dummy socket. Whether this is successful or not we drop the result as
++        // libstd will be sure to have initialized winsock.
++        let _ = UdpSocket::bind("127.0.0.1:34254");
++    });
++}
++
++pub struct Socket {
++    socket: SOCKET,
++}
++
++impl Socket {
++    pub fn new(family: c_int, ty: c_int) -> io::Result<Socket> {
++        init();
++        let socket = try!(unsafe {
++            match WSASocketW(family, ty, 0, 0 as *mut _, 0,
++                             WSA_FLAG_OVERLAPPED) {
++                INVALID_SOCKET => Err(io::Error::last_os_error()),
++                n => Ok(Socket { socket: n }),
++            }
++        });
++        try!(socket.set_no_inherit());
++        Ok(socket)
++    }
++
++    pub fn raw(&self) -> SOCKET { self.socket }
++
++    fn into_socket(self) -> SOCKET {
++        let socket = self.socket;
++        mem::forget(self);
++        socket
++    }
++
++    pub fn into_tcp_listener(self) -> TcpListener {
++        unsafe { TcpListener::from_raw_socket(self.into_socket()) }
++    }
++
++    pub fn into_tcp_stream(self) -> TcpStream {
++        unsafe { TcpStream::from_raw_socket(self.into_socket()) }
++    }
++
++    pub fn into_udp_socket(self) -> UdpSocket {
++        unsafe { UdpSocket::from_raw_socket(self.into_socket()) }
++    }
++
++    fn set_no_inherit(&self) -> io::Result<()> {
++        ::cvt_win(unsafe {
++            SetHandleInformation(self.socket as HANDLE, HANDLE_FLAG_INHERIT, 0)
++        }).map(|_| ())
++    }
++}
++
++impl ::FromInner for Socket {
++    type Inner = SOCKET;
++    fn from_inner(socket: SOCKET) -> Socket {
++        Socket { socket: socket }
++    }
++}
++
++impl Drop for Socket {
++    fn drop(&mut self) {
++        unsafe {
++            let _ = closesocket(self.socket);
++        }
++    }
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5a535dbb5c30a5638a547e45d158fe186ce2e863
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,161 @@@
++// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
++// file at the top-level directory of this distribution and at
++// http://rust-lang.org/COPYRIGHT.
++//
++// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
++// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
++// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
++// option. This file may not be copied, modified, or distributed
++// except according to those terms.
++
++use std::cell::RefCell;
++use std::io;
++use std::net::{SocketAddr, ToSocketAddrs, TcpListener, TcpStream};
++use std::fmt;
++
++use IntoInner;
++use socket::Socket;
++use sys::c;
++
++/// An "in progress" TCP socket which has not yet been connected or listened.
++///
++/// Allows configuration of a socket before one of these operations is executed.
++pub struct TcpBuilder {
++    socket: RefCell<Option<Socket>>,
++}
++
++impl TcpBuilder {
++    /// Constructs a new TcpBuilder with the `AF_INET` domain, the `SOCK_STREAM`
++    /// type, and with a protocol argument of 0.
++    ///
++    /// Note that passing other kinds of flags or arguments can be done through
++    /// the `FromRaw{Fd,Socket}` implementation.
++    pub fn new_v4() -> io::Result<TcpBuilder> {
++        Socket::new(c::AF_INET, c::SOCK_STREAM).map(::FromInner::from_inner)
++    }
++
++    /// Constructs a new TcpBuilder with the `AF_INET6` domain, the `SOCK_STREAM`
++    /// type, and with a protocol argument of 0.
++    ///
++    /// Note that passing other kinds of flags or arguments can be done through
++    /// the `FromRaw{Fd,Socket}` implementation.
++    pub fn new_v6() -> io::Result<TcpBuilder> {
++        Socket::new(c::AF_INET6, c::SOCK_STREAM).map(::FromInner::from_inner)
++    }
++
++    /// Binds this socket to the specified address.
++    ///
++    /// This function directly corresponds to the bind(2) function on Windows
++    /// and Unix.
++    pub fn bind<T>(&self, addr: T) -> io::Result<&TcpBuilder>
++        where T: ToSocketAddrs
++    {
++        self.with_socket(|sock| {
++            let addr = try!(::one_addr(addr));
++            sock.bind(&addr)
++        }).map(|()| self)
++    }
++
++    /// Mark a socket as ready to accept incoming connection requests using
++    /// accept()
++    ///
++    /// This function directly corresponds to the listen(2) function on Windows
++    /// and Unix.
++    ///
++    /// An error will be returned if `listen` or `connect` has already been
++    /// called on this builder.
++    pub fn listen(&self, backlog: i32) -> io::Result<TcpListener> {
++        self.with_socket(|sock| {
++            sock.listen(backlog)
++        }).and_then(|()| {
++            self.to_tcp_listener()
++        })
++    }
++
++    /// Initiate a connection on this socket to the specified address.
++    ///
++    /// This function directly corresponds to the connect(2) function on Windows
++    /// and Unix.
++    ///
++    /// An error will be returned if `listen` or `connect` has already been
++    /// called on this builder.
++    pub fn connect<T>(&self, addr: T) -> io::Result<TcpStream>
++        where T: ToSocketAddrs
++    {
++        self.with_socket(|sock| {
++            let err = io::Error::new(io::ErrorKind::Other,
++                                     "no socket addresses resolved");
++            try!(addr.to_socket_addrs()).fold(Err(err), |prev, addr| {
++                prev.or_else(|_| sock.connect(&addr))
++            })
++        }).and_then(|()| {
++            self.to_tcp_stream()
++        })
++    }
++
++    /// Converts this builder into a `TcpStream`
++    ///
++    /// This function will consume the internal socket and return it re-wrapped
++    /// as a `TcpStream`. An error will be returned if the internal socket has
++    /// already been consumed from a successful call to `connect`, `listen`,
++    /// etc.
++    pub fn to_tcp_stream(&self) -> io::Result<TcpStream> {
++        self.socket.borrow_mut().take().map(|s| s.into_inner().into_tcp_stream())
++            .ok_or(io::Error::new(io::ErrorKind::Other,
++                                  "socket has already been consumed"))
++    }
++
++    /// Converts this builder into a `TcpListener`
++    ///
++    /// This function will consume the internal socket and return it re-wrapped
++    /// as a `TcpListener`. An error will be returned if the internal socket has
++    /// already been consumed from a successful call to `connect`, `listen`,
++    /// etc.
++    pub fn to_tcp_listener(&self) -> io::Result<TcpListener> {
++        self.socket.borrow_mut().take()
++            .map(|s| s.into_inner().into_tcp_listener())
++            .ok_or(io::Error::new(io::ErrorKind::Other,
++                                  "socket has already been consumed"))
++    }
++
++    /// Returns the address of the local half of this TCP socket.
++    ///
++    /// An error will be returned if `listen` or `connect` has already been
++    /// called on this builder.
++    pub fn local_addr(&self) -> io::Result<SocketAddr> {
++        match *self.socket.borrow() {
++            Some(ref s) => s.getsockname(),
++            None => Err(io::Error::new(io::ErrorKind::Other,
++                                       "builder has already finished its socket")),
++        }
++    }
++
++    fn with_socket<F>(&self, f: F) -> io::Result<()>
++        where F: FnOnce(&Socket) -> io::Result<()>
++    {
++        match *self.socket.borrow() {
++            Some(ref s) => f(s),
++            None => Err(io::Error::new(io::ErrorKind::Other,
++                                       "builder has already finished its socket")),
++        }
++    }
++}
++
++impl fmt::Debug for TcpBuilder {
++    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
++        write!(f, "TcpBuilder {{ socket: {:?} }}",
++               self.socket.borrow().as_ref().unwrap())
++    }
++}
++
++impl ::AsInner for TcpBuilder {
++    type Inner = RefCell<Option<Socket>>;
++    fn as_inner(&self) -> &RefCell<Option<Socket>> { &self.socket }
++}
++
++impl ::FromInner for TcpBuilder {
++    type Inner = Socket;
++    fn from_inner(sock: Socket) -> TcpBuilder {
++        TcpBuilder { socket: RefCell::new(Some(sock)) }
++    }
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d061ab5c6f42c61c15609a957a04b6ad273ffc94
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,89 @@@
++// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
++// file at the top-level directory of this distribution and at
++// http://rust-lang.org/COPYRIGHT.
++//
++// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
++// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
++// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
++// option. This file may not be copied, modified, or distributed
++// except according to those terms.
++
++use std::cell::RefCell;
++use std::fmt;
++use std::io;
++use std::net::{ToSocketAddrs, UdpSocket};
++
++use IntoInner;
++use socket::Socket;
++use sys::c;
++
++/// An "in progress" UDP socket which has not yet been connected.
++///
++/// Allows configuration of a socket before the socket is connected.
++pub struct UdpBuilder {
++    socket: RefCell<Option<Socket>>,
++}
++
++impl UdpBuilder {
++    /// Constructs a new UdpBuilder with the `AF_INET` domain, the `SOCK_DGRAM`
++    /// type, and with a protocol argument of 0.
++    ///
++    /// Note that passing other kinds of flags or arguments can be done through
++    /// the `FromRaw{Fd,Socket}` implementation.
++    pub fn new_v4() -> io::Result<UdpBuilder> {
++        Socket::new(c::AF_INET, c::SOCK_DGRAM).map(::FromInner::from_inner)
++    }
++
++    /// Constructs a new UdpBuilder with the `AF_INET6` domain, the `SOCK_DGRAM`
++    /// type, and with a protocol argument of 0.
++    ///
++    /// Note that passing other kinds of flags or arguments can be done through
++    /// the `FromRaw{Fd,Socket}` implementation.
++    pub fn new_v6() -> io::Result<UdpBuilder> {
++        Socket::new(c::AF_INET6, c::SOCK_DGRAM).map(::FromInner::from_inner)
++    }
++
++    /// Binds this socket to the specified address.
++    ///
++    /// This function directly corresponds to the bind(2) function on Windows
++    /// and Unix.
++    pub fn bind<T>(&self, addr: T) -> io::Result<UdpSocket>
++        where T: ToSocketAddrs
++    {
++        try!(self.with_socket(|sock| {
++            let addr = try!(::one_addr(addr));
++            sock.bind(&addr)
++        }));
++        Ok(self.socket.borrow_mut().take().unwrap().into_inner().into_udp_socket())
++    }
++
++    fn with_socket<F>(&self, f: F) -> io::Result<()>
++        where F: FnOnce(&Socket) -> io::Result<()>
++    {
++        match *self.socket.borrow() {
++            Some(ref s) => f(s),
++            None => Err(io::Error::new(io::ErrorKind::Other,
++                                       "builder has already finished its socket")),
++        }
++    }
++}
++
++impl fmt::Debug for UdpBuilder {
++    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
++        write!(f, "UdpBuilder {{ socket: {:?} }}",
++               self.socket.borrow().as_ref().unwrap())
++    }
++}
++
++impl ::AsInner for UdpBuilder {
++    type Inner = RefCell<Option<Socket>>;
++    fn as_inner(&self) -> &RefCell<Option<Socket>> { &self.socket }
++}
++
++impl ::FromInner for UdpBuilder {
++    type Inner = Socket;
++    fn from_inner(sock: Socket) -> UdpBuilder {
++        UdpBuilder { socket: RefCell::new(Some(sock)) }
++    }
++}
++
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..21dcb2a24d2d8c83560330c833b638a48e70e1cc
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,57 @@@
++//! Unix-specific extensions to the `std::net` types.
++
++use std::io;
++use sys::c::{self, c_int};
++
++use {TcpBuilder, UdpBuilder};
++use ext::{self, AsSock};
++
++/// Unix-specific extensions for the `TcpBuilder` type in this library.
++pub trait UnixTcpBuilderExt {
++    /// Set value for the `SO_REUSEPORT` option on this socket.
++    ///
++    /// This indicates that futher calls to `bind` may allow reuse of local
++    /// addresses. For IPv4 sockets this means that a socket may bind even when
++    /// there's a socket already listening on this port.
++    fn reuse_port(&self, reuse: bool) -> io::Result<&Self>;
++
++    /// Check the value of the `SO_REUSEPORT` option on this socket.
++    fn get_reuse_port(&self) -> io::Result<bool>;
++}
++
++impl UnixTcpBuilderExt for TcpBuilder {
++    fn reuse_port(&self, reuse: bool) -> io::Result<&Self> {
++        ext::set_opt(self.as_sock(), c::SOL_SOCKET, c::SO_REUSEPORT,
++                    reuse as c_int).map(|()| self)
++    }
++
++    fn get_reuse_port(&self) -> io::Result<bool> {
++        ext::get_opt(self.as_sock(), c::SOL_SOCKET, c::SO_REUSEPORT)
++            .map(ext::int2bool)
++    }
++}
++
++/// Unix-specific extensions for the `UdpBuilder` type in this library.
++pub trait UnixUdpBuilderExt {
++    /// Set value for the `SO_REUSEPORT` option on this socket.
++    ///
++    /// This indicates that futher calls to `bind` may allow reuse of local
++    /// addresses. For IPv4 sockets this means that a socket may bind even when
++    /// there's a socket already listening on this port.
++    fn reuse_port(&self, reuse: bool) -> io::Result<&Self>;
++
++    /// Check the value of the `SO_REUSEPORT` option on this socket.
++    fn get_reuse_port(&self) -> io::Result<bool>;
++}
++
++impl UnixUdpBuilderExt for UdpBuilder {
++    fn reuse_port(&self, reuse: bool) -> io::Result<&Self> {
++        ext::set_opt(self.as_sock(), c::SOL_SOCKET, c::SO_REUSEPORT,
++                    reuse as c_int).map(|()| self)
++    }
++
++    fn get_reuse_port(&self) -> io::Result<bool> {
++        ext::get_opt(self.as_sock(), c::SOL_SOCKET, c::SO_REUSEPORT)
++            .map(ext::int2bool)
++    }
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..21fe9d61fcee353cfd5cbf9f82af1f2eb3144261
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,51 @@@
++// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
++// file at the top-level directory of this distribution and at
++// http://rust-lang.org/COPYRIGHT.
++//
++// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
++// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
++// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
++// option. This file may not be copied, modified, or distributed
++// except according to those terms.
++
++
++#[doc(hidden)]
++pub trait NetInt {
++    fn from_be(i: Self) -> Self;
++    fn to_be(&self) -> Self;
++}
++macro_rules! doit {
++    ($($t:ident)*) => ($(impl NetInt for $t {
++        fn from_be(i: Self) -> Self { <$t>::from_be(i) }
++        fn to_be(&self) -> Self { <$t>::to_be(*self) }
++    })*)
++}
++doit! { i8 i16 i32 i64 isize u8 u16 u32 u64 usize }
++
++#[doc(hidden)]
++pub trait One {
++    fn one() -> Self;
++}
++
++macro_rules! one {
++    ($($t:ident)*) => ($(
++        impl One for $t { fn one() -> $t { 1 } }
++    )*)
++}
++
++one! { i8 i16 i32 i64 isize u8 u16 u32 u64 usize }
++
++
++#[doc(hidden)]
++pub trait Zero {
++    fn zero() -> Self;
++}
++
++macro_rules! zero {
++    ($($t:ident)*) => ($(
++        impl Zero for $t { fn zero() -> $t { 0 } }
++    )*)
++}
++
++zero! { i8 i16 i32 i64 isize u8 u16 u32 u64 usize }
++
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..9413c0e6bad3e51dc3452271629eb0091fe5e213
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,45 @@@
++extern crate net2;
++
++use std::net::{TcpStream, IpAddr, Ipv4Addr, Ipv6Addr};
++use std::io::prelude::*;
++use std::thread;
++
++use net2::TcpBuilder;
++
++macro_rules! t {
++    ($e:expr) => (match $e {
++        Ok(e) => e,
++        Err(e) => panic!("{} failed with: {}", stringify!($e), e),
++    })
++}
++
++#[test]
++fn smoke_build_listener() {
++    let b = t!(TcpBuilder::new_v4());
++    t!(b.bind("127.0.0.1:0"));
++
++    let addr = t!(b.local_addr());
++    assert_eq!(addr.ip(), IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)));
++
++    let listener = t!(b.listen(200));
++
++    let t = thread::spawn(move || {
++        let mut s = t!(listener.accept()).0;
++        let mut b = [0; 4];
++        t!(s.read(&mut b));
++        assert_eq!(b, [1, 2, 3, 0]);
++    });
++
++    let mut stream = t!(TcpStream::connect(&addr));
++    t!(stream.write(&[1,2,3]));
++    t.join().unwrap();
++}
++
++#[test]
++fn smoke_build_listener_v6() {
++    let b = t!(TcpBuilder::new_v6());
++    t!(b.bind("::1:0"));
++
++    let addr = t!(b.local_addr());
++    assert_eq!(addr.ip(), IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)));
++}
index 8f812158b6139e909718e8b7d10dd2c5dca842ff,0000000000000000000000000000000000000000..7677d54d7354f79012ec44e2dc21f1359427953b
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"9764d2f312c0ffd5e766f590fa3cbbe09059d10bf04b869e937c9ebf5d674eb9","Cargo.toml":"f533d81572ed9dc06e953829c4a837dce6f8ae096dc1f3a6bbd33095ad85aa8a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"8c15b94f3309d43f316d58f351c143d4c8ef779382631fc65ea32d2dcdcddc4a","benches/bigint.rs":"20d98b7f41d721c62d46711ef9aa61d29d49b3a901faa715ff61bd43c61156f9","benches/shootout-pidigits.rs":"4e2392cdeba33986f8b294c0808b30c85bcf4bbc2a39537af849648cd0d749e1","ci/deploy.enc":"96fd3f8e1dc04d22c877a49b68788794f6cb515d0b7606df51d8b6be53131cd8","ci/deploy.sh":"8b7eeb9822e49bbfe36a22d846d5c06b4b7962330b3e4a5a64d59aeee1e45d66","ci/rustup.sh":"57e22a9e2a1dcfe4dcea577db7703e5700adf81792b5f0e2c04800f653094eda","ci/test_full.sh":"edc8bd2a61f3ec9886f4076c84b5c5ac667ca879f570b24608dd70bf4fdedd14","doc/favicon.ico":"7bc6bd910e0a3b5ccf9c8480a35cbec866563224d12b23052f1a7ffe9eb17c75","doc/index.html":"6977977443a0dd8c930a798c16e39bd99cdcbf78e5829e9502456117aa3a28dd","doc/rust-logo-128x128-blk-v2.png":"a3b727c6ff3ff9014b01a9ac0e721b027344a080ca7dc1107533b4c63a369af1","src/lib.rs":"8d45ef22ffe42258a8636ff482bb7fe1077eb7326fb4c4a6852e77e92a881742"},"package":"98b15ba84e910ea7a1973bccd3df7b31ae282bf9d8bd2897779950c9b8303d40"}
++{"files":{},"package":"98b15ba84e910ea7a1973bccd3df7b31ae282bf9d8bd2897779950c9b8303d40"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..fa8d85ac52f19959d6fc9942c265708b4b3c2b04
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++Cargo.lock
++target
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4cb44b1b2b52dffe32f25e9336fe8b96959354f6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++/deploy
index 4a253878a38ba0dc6ed5b500ff6b3e8ba2387fcf,0000000000000000000000000000000000000000..62ab4e14c97d6efa61856855a6f5666b853ab2bf
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"726cc744ab4c66553e73dc9a2a70db40fcbcbe2623b71c15c3ffc5a49cebce4d","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","src/algorithms.rs":"8bb6a51167b3641580061dbb41fd20da0c3830f2bb9f276afac1ba030fda41c0","src/bigint.rs":"ae39e27a00740051a50a93dc4116083064e4b272211cd6eb7599ac3a7cd975fd","src/biguint.rs":"2106eef291be1be216a25850b6182c3795bc033611e10922c0a115e0ce7be761","src/lib.rs":"4ffa74d272875d8312d5b9430b9f011e42b71e0f14b050da5c333b882aa4c267","src/macros.rs":"d8b699369f4faa9198272982050d17b19bd1c40dcfa7d7699e840643f53a3327","src/tests/bigint.rs":"b84d2223b9c8d6b41da679569a10c45942e7bf04f778fd64a6961b8bad66d4de","src/tests/biguint.rs":"6bcf9bb1f2d707c3f51258fc9098742a4ebaab699b78a05366e9ae75d036160c"},"package":"ba6d838b16e56da1b6c383d065ff1ec3c7d7797f65a3e8f6ba7092fd87820bac"}
++{"files":{},"package":"ba6d838b16e56da1b6c383d065ff1ec3c7d7797f65a3e8f6ba7092fd87820bac"}
index 5cdee19cb13259850ad89d6b52e7d1100473b3eb,0000000000000000000000000000000000000000..82b429678706660d65c69c319811b82f385528ce
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"739e9959018c89d352a104b1e81957d6a0cb6ee903a3837a5d825a65cc6ae4e8","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","src/lib.rs":"cc049e33d3f93b8fe6db7735b3627b1199b200305c963fd57fa09b2add6a413f"},"package":"148eb324ca772230853418731ffdf13531738b50f89b30692a01fcdcb0a64677"}
++{"files":{},"package":"148eb324ca772230853418731ffdf13531738b50f89b30692a01fcdcb0a64677"}
index ffd971fe1e6ab275fe0d22d92af91399e3f51f30,0000000000000000000000000000000000000000..283a5ebf9944b567429caa9075f095f7c7570cd9
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"e426efc281ed77f607387459647f5d1cd3b0c687a83905eb57bb9435b883f34f","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","src/lib.rs":"8526b07deb77957ee84ac0ccbb7b30d7570a44dbf3bc06c5db36debce7516163"},"package":"ef1a4bf6f9174aa5783a9b4cc892cacd11aebad6c69ad027a0b65c6ca5f8aa37"}
++{"files":{},"package":"ef1a4bf6f9174aa5783a9b4cc892cacd11aebad6c69ad027a0b65c6ca5f8aa37"}
index 9dc26ef26ebb74c7ddb1bf55364385313fe95eab,0000000000000000000000000000000000000000..89ff102faf532fba1ae32ed9bc54b594279eaaf9
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"4da183ea870d8853d14a5c95bed8f9ceaa26b50118dd398344821cbd25452dd0","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","src/lib.rs":"7cc73113897d1399dafc7f64ecc53f809295a4df3b401b42c2c8b1a7743a3748"},"package":"f7d1891bd7b936f12349b7d1403761c8a0b85a18b148e9da4429d5d102c1a41e"}
++{"files":{},"package":"f7d1891bd7b936f12349b7d1403761c8a0b85a18b148e9da4429d5d102c1a41e"}
index 5d96e38ade1cd0c587b72600b1913054a30abc8f,0000000000000000000000000000000000000000..6a3befbfd7779340c991cf074e37b9537de2bc57
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"c92590f122785fecf90a84d3d2a813c607125dfea6c1688e8aa297dd30bed233","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","src/lib.rs":"b65b5aaff12ccdb54a02b7fe2527d9ffc1f6e1c4b564db7c5005a32a959c72cc"},"package":"c2dc5ea04020a8f18318ae485c751f8cfa1c0e69dcf465c29ddaaa64a313cc44"}
++{"files":{},"package":"c2dc5ea04020a8f18318ae485c751f8cfa1c0e69dcf465c29ddaaa64a313cc44"}
index 72a142d86576911a21ff933fd224bc1c35d05097,0000000000000000000000000000000000000000..6d0002e623cb392d7f3225c3eab48cfa416c0ca1
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"c1f571e6884f2643c11053465800afe4056253687fd332e7a9c2d32fb30704ed","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","src/bounds.rs":"32f69f86640520478eff7978951a6d2dc0d51fe263782970185fb31ffcc4a9e1","src/cast.rs":"d76053ff336eadb80a18725c174226b4be147b876c6aa70d7aa81a16d85e9f25","src/float.rs":"1f9d571bd3946d1d93dc7f4f4ae344bfabf5fd871243145aad120e242599c2e4","src/identities.rs":"188c63de57997fb8468732251a3a8d7f665b8f61d512222c2553baefe1c827bb","src/int.rs":"b7b42dfa10423308f858216ac63fa52e26c49a7bc8900cd98de210992efc3f5f","src/lib.rs":"f99d825e652698d9b39b1e26132139542e12e968d87cf804d46e95ec0c21f14f","src/ops/checked.rs":"f02fd815b99edf079043d3621c1566e0ab3e755fe284d0b8fdf5d7ca56d546e7","src/ops/mod.rs":"668ea4d117bc1fdf7eaf0fe16692fa40dfbdfcbc7a2010237fe395ce0086e02e","src/ops/saturating.rs":"46821d815c90c16b2f6bec0b94b4d7ebdbddf3ea42edc0467de738c56abf6436","src/ops/wrapping.rs":"aa750486640063fad24175fd3b622eba2d4453d4de5a3d8bc93e1c3f50ced485","src/pow.rs":"73b611ad8d595ef917871ba859ff0c25efc2382220d30568e5fbb930bf6b4daa","src/sign.rs":"c08ad1647d393571cc73344b174b1764d7d7d5fb57170cc8f1d26e7ab9527e7c"},"package":"e1cbfa3781f3fe73dc05321bed52a06d2d491eaa764c52335cf4399f046ece99"}
++{"files":{},"package":"e1cbfa3781f3fe73dc05321bed52a06d2d491eaa764c52335cf4399f046ece99"}
index 656c5bbcacb0cfb25592a9492a1db4b662ce89bf,0000000000000000000000000000000000000000..89af9bb5f83fe0010babd674166317fc5f91af71
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".appveyor.yml":"2f3f82a91e82a6c0b601048a5c9cd9b39fa78dfb7172ecfe7ff3d4d010af66d8",".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"979eec484d5ceb95a6553860cafa053694613fbafda322e6d159cfab261d99a0","Cargo.toml":"6e36e1e24e3e7edb176b16fa0d528b8e21fd143817438f5014063315f4d336f3","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0593d22d122d4bfec6407115e3907546312976f75473417aaa4c57ecd2095ae6","README.md":"4d586d8185ea43e6472db25ad748da265024869eabdcd62805c2bf3de06c4eb4","src/lib.rs":"b290f7ffd778744e48592d36fb4067542d3f6b8b0f3aa0e0ddd19e02cbefd655"},"package":"f6e850c7f35c3de263e6094e819f6b4b9c09190ff4438fc6dec1aef1568547bc"}
++{"files":{},"package":"f6e850c7f35c3de263e6094e819f6b4b9c09190ff4438fc6dec1aef1568547bc"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..87f324af86137eafd12ee94e7acd96e626e7856c
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,14 @@@
++[package]
++
++name = "num_cpus"
++version = "1.5.0"
++description = "Get the number of CPUs on a machine."
++authors = ["Sean McArthur <sean.monstar@gmail.com>"]
++license = "MIT/Apache-2.0"
++repository = "https://github.com/seanmonstar/num_cpus"
++documentation = "https://docs.rs/num_cpus"
++keywords = ["cpu", "cpus", "cores"]
++categories = ["hardware-support"]
++
++[dependencies]
++libc = "0.2.6"
index 695ca1c044ffd1e1e833c7c1ac57f455db9788c9,0000000000000000000000000000000000000000..2c158d233aa49d41cd7bc4e89861ccb364d96133
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"59882876d096c97ecba35035950b3f2b33cd2ac5038003591e7666624bb34834","LICENSE":"76f077cfc83e5a527f1e8e1db92355d748b8a0316396dece983b836eebe27b7b","build.rs":"42041ec546a2c6b786b4f91fdab36f181a9fcf993cfa5dbe905c7fc8bf73d7ed","src/aes.rs":"0da632149d5764b1e55fae56277ce1d276609d936891408f348f94a6e1afcdfc","src/asn1.rs":"693e13e1b8654fcbd6440f7f63bcc025df840a72df3830f9c56ca1bc0f9c3bc8","src/bio.rs":"5dae7d22477c37205d05a26c521e122931bd05c9c77ba92c96e7a6e251870223","src/bn.rs":"e460c531a8e9272be0c79261e25368b0382b5c98564e62ba0ac07bedff0ddfbb","src/conf.rs":"1e1c19ef5907daf961da99b9b4c48c84678f93721b9631dbec98b06509d43026","src/crypto.rs":"a28c61a16626e264668d50c597d02690eceafa391f7dc8101b05c930976700df","src/dh.rs":"3661d4b72494bae4b70ed5c91a0dda935c85b965f1d7de190ec2300c588e1564","src/dsa.rs":"dfbccb5016934daec4a5a169a938841eb45e1deeaf1ce42896c929d0f8dcc9bd","src/ec.rs":"095a51120d4ba4d9b433904c7775fa9fdf907856a14ed0005da3a625ae3c3a8c","src/ec_key.rs":"7d9b65fd3437baa5710d6ddaa05282afa67b7a14cc9720dabdc41a8354c3b117","src/error.rs":"bed703051b6dba578d112254c721e77806e5a8d5f0642683577ddd438bc2b9b5","src/hash.rs":"982768968ef87f87a30a419beb8f401df2353113d2429e3264c72ce0435a030d","src/lib.rs":"b4b0146b054f130c5d6412bc978a58618c4dd1b985f208a7eb34a2a7ec8291cd","src/macros.rs":"437f390034acf87ca7de20e2cd8447cfd827fcb6ad9839529863fca93837c299","src/memcmp.rs":"4bb35cff8d63301a1a50b1f07cdda79e931f728640860ad7dbc460717d73450a","src/nid.rs":"37577dbd59db1e959eeb0e86c1fecbb080e78ffa72878c539528a5c002c737ed","src/ocsp.rs":"a65d55aee9579d98f27b0059ed778cd714c829831308785bc28032d035cd414a","src/pkcs12.rs":"ca1cd356a8f18e823526eaa3fe459891ca3de184e1e173e5ef91c96cc63b1103","src/pkcs5.rs":"2612655860ff4f06fadc7538f2afb62c187f11a2aa851997383c4e9aed586c1e","src/pkey.rs":"12490da4a2c9aef24c6906ca29067e967ada099e83a7e8b2967af6de35f1dbaf","src/rand.rs":"2d95f7f4aa3c6663407569697864c840f10843b7ccfc51b260d5e94ac3c9536c","src/rsa.rs":"e2f3f46f5bad90443bd19b00310493bb1095f61ce98c67a77a2e6f261ab2b2f2","src/sha.rs":"24e1a7a0797abe9a499253d3c7fb3bf38d81d6b772da62f98baa5ea75fa9fcdf","src/sign.rs":"1b1ecad0c8ad7bab6e8d5c244d2a8e2beb4c3ddfb80aa08bee0893f84a158a03","src/ssl/bio.rs":"26844964dac2d87d7c6d1a16d12458347eae8656dc2a03e2693598ad3c65dbf7","src/ssl/connector.rs":"0e6f806d042dee8ac86aecd091b692d6512ebed8ee25ad4b7ceed5c0433d62e8","src/ssl/error.rs":"3c700a68aa70a84a7e8fc8e4730bc5b16fbba7d8c565dc724f87749fa649c944","src/ssl/mod.rs":"147935f53762684195c812cab199e8c8a3179781dea9d7f0eecd4abe6b7c35be","src/ssl/tests/mod.rs":"68da0c23e8c7bc2715fb84686aee83487f6442a3da6feb0229fa5da419b984c1","src/ssl/tests/select.rs":"9677bbcf5a7aaa57fb70b95290cd7d679a02479e229a809c4568d8108a238bc9","src/stack.rs":"71dddd1c0546b2ef8666979e469f5f3bc0ce5012ab6d266e7121fc4c0ce25a80","src/string.rs":"67b2c04a96f02596bb94f1deb670dfde5505dcf10a4b2e3108fd76b95ac384c7","src/symm.rs":"7fa99820a44a55fa9144978af3e81c3c04fdef99bc399fdbd9bb90caf1a0a602","src/types.rs":"8a89d8f1a95830fe25bda1033a22724293a6d318ba88dc7bdcb53b8fceec3d1b","src/util.rs":"52de1f67d6d0c01d851d57120465c3d6e4ecd8f62b8441dd29b2308070590a3f","src/verify.rs":"2fe5e5b746780e4714ece4f5e3d663f2e8d005265737af13b173d288cef32f25","src/version.rs":"47fae25026a12058867bc0fa02caa065cc556e6908a3d97467a525520cecad31","src/x509/extension.rs":"08b92fc6ebb7a03bdc0bb0904ff682618b8a522f0b99b5e806b648587cca1e0d","src/x509/mod.rs":"9645c7b55060f317e403b04895a78a19e8bb2030de17c43eb9d9f04b9d24bbff","src/x509/store.rs":"e8f2db57703a89d44731ffeeb43b15c313f3c45e2419987fa1ab07da0450e48e","src/x509/tests.rs":"2d45c0084c2eeef60383dd6624f94c2f9ed9cbfdd99019c8fdd92a57aa78690e","src/x509/verify.rs":"aa957d1073eac377a06873ab1c671e458251a818c66e2456e963bb31a9da6584","test/alt_name_cert.pem":"53bf9f10c35695019e9d1bc38751e234d8212d9cf3962736acf5e1fac245ab9f","test/build.sh":"9d0c8ad113729a60b1d81365101735c7258c2abccba5dd486229922edbf7188f","test/cert.pem":"53c8b338be254490c71a6b13da90dc5a59ba596587c548be5673657e04824afb","test/certs.pem":"106d5d22c86e26c3db619b9525567f22333d22de82e4d2850ed379150c638008","test/dhparams.pem":"14d9461949d9ae8ca50a393b008ee2168254f14342b0e17b56c0a62d2905b963","test/dsa-encrypted.pem":"b553599182b55a600358f2d53b78f76cb8c8ac64b19215005daec832028a79bc","test/dsa.pem":"826d513234205fd3dee0bbbf844f0b6fea501145bdf05ea3b14e14df98cbe090","test/dsa.pem.pub":"721677bebf9ab28b8650f98a0cd27658de0c1acd867a4b6e985fe1df95a8bd37","test/dsaparam.pem":"94a1284bdd7d7566151cfde0c7f245e84f7b99ba840f202e3f27ea0160f82988","test/identity.p12":"aceeb3e5516471bd5af9a44bbeffc9559c4f228f67c677d29f36a4b368e2779f","test/key.der.pub":"e559d56bb6ec57ad743dbf972bbcaf263a9fa7d320433baa71b04f849d987060","test/key.pem":"12d9105a92bf39b615ccb4820c5c1e38c61905483cd30be13f9ab99b98af64ed","test/key.pem.pub":"f5d030df843ddbaba5bf316ae18f1434de5a63a955be66442429dd4f16f161ef","test/keystore-empty-chain.p12":"bbea280f6fe10556d7470df7072ef0e4ee3997e2c0b3666197f423430c0e6b61","test/nid_test_cert.pem":"7047e8d317e284c6b698eee4a0f1a629d50cd4615ad7da85fe90a2ffb6c21611","test/nid_uid_test_cert.pem":"a735211f3b40edbde7084337138fb0aea06aea6c78369c52015253e4b7a17d83","test/pkcs8.der":"8719fc002d59313fb97e46e068ae40db4d9acc0e2debd308ac9eb46329bea487","test/root-ca.key":"b37cf88614980c38e43c4329cdf7162bae48cc8af1fafd54db2fe0d17e458e1d","test/root-ca.pem":"59b9200c35e818bf21be4aaa97ba87bb6a18fd780527a9f9c51cc74212c631a0","test/rsa-encrypted.pem":"ea41b0f1816056672de6abbab43d0e8089da047c329ceed14aace5a5bde713f1","test/rsa.pem":"f866a5506ea9a37ed2f73f62f503e1aff32f7e4145be62b023535f4da1c24416","test/rsa.pem.pub":"2c5eeea39708e90396f9f09d920f2af8b7e9f84ace963c1319072224dd3d302b","test/run.sh":"20240517dcb782bb4cec4fe6b9d9da3c32d5104ec5adade83a852eccc2b4ea41"},"package":"b34cd77cf91301fff3123fbd46b065c3b728b17a392835de34c397315dce5586"}
++{"files":{},"package":"b34cd77cf91301fff3123fbd46b065c3b728b17a392835de34c397315dce5586"}
index 32e974f2916c6c89268dc29fb0273aeaaa0baa2c,0000000000000000000000000000000000000000..d1ac0036a71a72defdd5985ea151befc314404ff
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"6a3b580f4b36c9760d5aab49803a45a46b12a28bdd46e82d0de26ae001603104","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","src/lib.rs":"c6c83cbdfff35daf9beb9c90fa07458509888863aad4be9d5de027de7c73d475"},"package":"d98df0270d404ccd3c050a41d579c52d1db15375168bb3471e04ec0f5f378daf"}
++{"files":{},"package":"d98df0270d404ccd3c050a41d579c52d1db15375168bb3471e04ec0f5f378daf"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 7afb2b95692b7930e448a9d514d8d6151d84e0ba,0000000000000000000000000000000000000000..a4f5be3da9ce0d406ba101e82efc03f8149925b3
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"f264b826731a4e3f06712f4fe223bdc544e49d3f4c3c3a22d46b5ceb5cec04bc","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","build.rs":"1bca0ed24735651fafa18081830dab4b2c829c169d88bb7470cfef05b86efb31","src/lib.rs":"5afaf16550af4fac6b1cd2e7d46b493e19710bdb903889383c5eea432e79159c","src/libressl/mod.rs":"a88a7b52019a0f7b6354270d9fb92c3aef61bd4e80aba3ddc227d019b5c75d9e","src/libressl/v250.rs":"c7f98f25032808853ff6e7cc606ef7853873e6c023dc3808036c13b446e53411","src/libressl/v25x.rs":"08a71c8fac38851f9b9e58ae5f1ca39185a8057f93accc142da822c6bf3488f4","src/ossl10x.rs":"753584440c158baf5b1f8dc11284ce3287463c83e4956203373572d3a11ce9a9","src/ossl110.rs":"b71a5edfd7076997b7ae360795c31eedf700d680aa0b152de56b20336885f5ae"},"package":"e035022a50faa380bd7ccdbd184d946ce539ebdb0a358780de92a995882af97a"}
++{"files":{},"package":"e035022a50faa380bd7ccdbd184d946ce539ebdb0a358780de92a995882af97a"}
index 47d5d3f1f9249abfa985a5589aba608d59250385,0000000000000000000000000000000000000000..ddd53beea9e7f30fea612b2bbdbc3f054aac54d3
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"f2b3b481e61dee9f83649f2079c7637fef1f3e4c181926bf77d39128f3ea82c7","Cargo.toml":"425339eef4a01cf8773dc69444115e5771c84194f68f1748a22b0c0f200dd475","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"6259efd2a3ba18ea50579f0af2ef3d4e797231522e18bad915ca25901fb31de2","src/lib.rs":"163a48484a96ab21529b42bfe3448753c898a42f4b204aa352bf0f87ff49f30e","tests/foo.pc":"f77712847e77ea81ac6362de5861dc0eddf14b9c07dce1853b3e3e587ffcac5e","tests/framework.pc":"4d02091799252777afb0547321cc04e7df1e017226a6b05630fed5eaf37e0125","tests/test.rs":"09bf2811e3d58432080a76b0d297131e43d215253894a2919626e71b30924b0b"},"package":"3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"}
++{"files":{},"package":"3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4fffb2f89cbd8f2169ce9914bd16bd43785bb368
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++/target
++/Cargo.lock
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..beb8ec3a38186bdd3e7253bd67722c2351848a2e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++{"files":{},"package":"abcd5d1a07d360e29727f757a9decb3ce8bc6e0efa8969cfaad669a8317a2478"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
new file mode 100644 (file)
--- /dev/null
--- /dev/null
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..60e9782fcd0d4bc5c3ea6c47c25290226d53f0a1
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,20 @@@
++[package]
++name = "psapi-sys"
++version = "0.1.0"
++authors = ["Peter Atashian <retep998@gmail.com>"]
++description = "FFI bindings to psapi."
++documentation = "https://retep998.github.io/doc/psapi-sys/"
++repository = "https://github.com/retep998/winapi-rs"
++readme = "README.md"
++keywords = ["Windows", "FFI", "WinSDK"]
++license = "MIT"
++build = "build.rs"
++links = "psapi"
++
++[lib]
++name = "psapi"
++
++[dependencies]
++winapi = { version = "*", path = "../.." }
++[build-dependencies]
++winapi-build = { version = "*", path = "../../build" }
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..6d44a8d967e07c2556a4583af39e9e953ca08ccf
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++# psapi-sys #
++FFI bindings to psapi.
++
++[Documentation](https://retep998.github.io/doc/psapi-sys/)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8e28eb2c8e382dce22229efcb9c3c1673abc307d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,6 @@@
++// Copyright © 2015, Peter Atashian
++// Licensed under the MIT License <LICENSE.md>
++extern crate build;
++fn main() {
++    build::link("psapi", false)
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e96eef1a3f52f5b75d7d965b86b9e96c0660cc70
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,39 @@@
++// Copyright © 2015, Peter Atashian
++// Licensed under the MIT License <LICENSE.md>
++//! FFI bindings to psapi.
++#![cfg(windows)]
++extern crate winapi;
++use winapi::*;
++extern "system" {
++    // pub fn EmptyWorkingSet();
++    // pub fn EnumDeviceDrivers();
++    // pub fn EnumPageFilesA();
++    // pub fn EnumPageFilesW();
++    // pub fn EnumProcessModules();
++    // pub fn EnumProcessModulesEx();
++    // pub fn EnumProcesses();
++    // pub fn GetDeviceDriverBaseNameA();
++    // pub fn GetDeviceDriverBaseNameW();
++    // pub fn GetDeviceDriverFileNameA();
++    // pub fn GetDeviceDriverFileNameW();
++    // pub fn GetMappedFileNameA();
++    // pub fn GetMappedFileNameW();
++    // pub fn GetModuleBaseNameA();
++    // pub fn GetModuleBaseNameW();
++    // pub fn GetModuleFileNameExA();
++    // pub fn GetModuleFileNameExW();
++    // pub fn GetModuleInformation();
++    // pub fn GetPerformanceInfo();
++    pub fn GetProcessImageFileNameA(
++        hProcess: HANDLE, lpImageFileName: LPSTR, nSize: DWORD,
++    ) -> DWORD;
++    pub fn GetProcessImageFileNameW(
++        hProcess: HANDLE, lpImageFileName: LPWSTR, nSize: DWORD,
++    ) -> DWORD;
++    // pub fn GetProcessMemoryInfo();
++    // pub fn GetWsChanges();
++    // pub fn GetWsChangesEx();
++    // pub fn InitializeProcessForWsWatch();
++    // pub fn QueryWorkingSet();
++    // pub fn QueryWorkingSetEx();
++}
index 4b59fccc314d296921770c43de9694abab4dcb05,0000000000000000000000000000000000000000..181f14266d92ea0532e1456b0f1ab16010e6d059
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"983b4a016a497eded8adc6a23963343693ab4520826a1bc916e6f8448c9bb309","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"3390fa1362c73052a268ae97a4777c5bcd8e991f866f9cce88ddde8d0963fd4d","src/ident.rs":"830077b64dce8c8ede1fb6ab664cae72f5496f4ab6be21a5b4e3b5e4e57ec425","src/lib.rs":"f799c898057a4e8e1620b32c70e13d3fee7af3a0352a5a4a1da6393942d21cc7","src/to_tokens.rs":"a871cb84506fa9e0783ac29617d686327ce5d05a9711a3a10833430b00345ccc","src/tokens.rs":"9a6010d7c0c6ccbe8b7bb1dae99722c91fc0559ea6ac6ea03ab2baafc2ec77ae","tests/test.rs":"8951d46b62d6922cc5fc130759be9723a862947738dda25cc84ff8cfdfebf729"},"package":"7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"}
++{"files":{},"package":"7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"}
index d30e9c748f4b89c0886731b13ddb4d4f85042490,0000000000000000000000000000000000000000..b9f2b88b43272f3eaf74e4ae81bc55a9afae0141
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"977ae778ea9d60b5abec3674cec33720b9db33c1e3da255ccaa58ad6a70b4c7f","Cargo.toml":"f000bcadb1b0f90fea9defd4d650a5d7bb3f15fb2705be5e96788fa59eedf6cc","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"969ef4c906eb704377d99bb69125f3aa3c523daa5b410d426ac5dcdd107b008d","appveyor.yml":"3a74394c3e3ef3b2c7d9458f526e47587977e98d026b63f00be29479075ff597","benches/bench.rs":"e6adfb15146d3176164a345a6d978071cb71aa3f9761000702e798cb53fde2b5","benches/distributions/exponential.rs":"99cb59c013a0b6bb390d34c5649b341fc3b88ea7df0caf2470bdda8798f9fe3d","benches/distributions/gamma.rs":"3533f311e4b55d743c5b01a7eb6529c94fd97726ef6702a6372f914f5f33666b","benches/distributions/mod.rs":"0028f1cb96f61152ed5b49a4fe91227d809ef6d19035592c36032a538af7f95e","benches/distributions/normal.rs":"4e10c18cb583ccb96301ea953c8e0aa9ee3b6662060271d1b8d19ca23364dc6b","src/chacha.rs":"ed43d7966192f265a22fe6913b799e081703b42c1ba7b1214128f42b70aaab3a","src/distributions/exponential.rs":"a63bfb1ec564408697ab587da3bd85417983405b2af4fd14a185e6f21cfe2723","src/distributions/gamma.rs":"26edf7055f31c12d31fc89d2da9357723693c1358cd343089df2cf6f58355d5c","src/distributions/mod.rs":"696f4f2edd0d1a26916fbe6ab330971d810d60bbcb2c06cf6f179a5c27038bbd","src/distributions/normal.rs":"414806b102d77707c9a4e03df65e059f487c463a85db80c33ef8f5ef7c40ca8c","src/distributions/range.rs":"9fac31b9d8dfc258be725a83c60f97e71efbbca725830e053d8f53c508b3e288","src/distributions/ziggurat_tables.rs":"4eacf94fc352c91c455a6623de6a721e53842e1690f13a5662b6a79c7fbb73de","src/isaac.rs":"8426fa913a163c13c1c81d166204c9748f79d3e47d83fd14319c3499eac4fcb3","src/lib.rs":"d4ad3ceb63b735ab41e0cc5f500363196918a553a53af493de3173246a49dc98","src/os.rs":"355f0cee9643442d521851460af6bb593d690f29f1cb9144dc6e7b484edb3fd9","src/rand_impls.rs":"6bafe095c291c1718cc880a830beca46eb26a257a4fe44e4087245bbdca0656b","src/read.rs":"bdad8df5687fd90180bc602967d66248d3f051a11b4459aedcd3f21dbfa93f9b","src/reseeding.rs":"9f0d154e4d0fcc3024622adc386ead8ce222dac56761e9a6d92c4fb3c6e0d47b"},"package":"022e0636ec2519ddae48154b028864bdce4eaf7d35226ab8e65c611be97b189d"}
++{"files":{},"package":"022e0636ec2519ddae48154b028864bdce4eaf7d35226ab8e65c611be97b189d"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 8b5bd5d5adb4abb9f9366b65696b2dcdbc3ab8f2,0000000000000000000000000000000000000000..3233038f647fe48ca73a4f6a3b710d635b78c1ed
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"55a8dfde968dcea744ffa78a98e379fa6ced8fd45548afe5e5b15d1dc3a43eb4","CHANGELOG.md":"43678907dd4797cbfa448d1015a2fc8a527070b59548c644363ee3307df46111","Cargo.toml":"8f8edc7e1926f1b63f290f792f4eb9ef92d878d50b328e074f450cb295700b22","HACKING.md":"37ea34650ce307a1d561aa915ada82cc8b44153085f327aa2b342fcf8e7afc62","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","PERFORMANCE.md":"d23d6dbe3791bc0689c5a876922b8264d6d3069b577772440b8caa01867f0cb4","README.md":"ba97e808dc8caefb60d3e6b6b14d99162b8519429b4a5f832197ad9a18e487f5","appveyor.yml":"da991211b72fa6f231af7adb84c9fb72f5a9131d1c0a3d47b8ceffe5a82c8542","examples/regexdna-input.txt":"156a49710bb3e1ed4bc2bbb0af0f383b747b3d0281453cfff39c296124c598f8","examples/regexdna-output.txt":"35e85b19b70a893d752fd43e54e1e9da08bac43559191cea85b33387c24c4cc1","examples/shootout-regex-dna-bytes.rs":"3266b8268d49b498ff3f6d2c99966cc3d46c548f9ab4d06bc2b6a8d958c3d977","examples/shootout-regex-dna-cheat.rs":"d299b39300186c93c2ef461b43e7beda5308b43f0b536605c64eabb75d6ad8fa","examples/shootout-regex-dna-replace.rs":"7126dca681dc52a8cf838c6cae354be1ea1a6fcbb658779da8f4bc709941911f","examples/shootout-regex-dna-single-cheat.rs":"33dd4ee6c628929cc6fd885d62f33c31bdcdb62a74ff3b4d7373f62e4972ea11","examples/shootout-regex-dna-single.rs":"1fa3ab9fb8bf015b01935cfb0ef3dba9b5036ac720a0194effb69c73b755ff92","examples/shootout-regex-dna.rs":"c97ad85a0886ba7bbd7c9c8de803a5493b445959276709f5b77f7a4d94543dbb","run-kcov":"e079f06032d738d57ce75d32f6152bf1972f8a4e5d05e04d137bce507361ca9e","run-shootout-test":"be7edb66a4a65eaef6a2b7e6036b4b732effa8dcd931bf4cbd591d0ca32b8264","scripts/frequencies.py":"df2cac150bc4ed42d2d97762535a5f260f3fe06d9d516721f68a52671a3b7a3b","scripts/regex-match-tests.py":"f1b3ad870c893510172bd84f8328b66ee99cd7aee7715a95a858468ff3e33635","scripts/unicode.py":"4b1330e733bbc22e677e22855bf8a88ab134aae56a10fda97081320aa12a6228","src/backtrack.rs":"ba8cc04be819749b405b80a50e6b85de9e16da821f11e603aa9fb3a2e207f00b","src/compile.rs":"4c0504a1530f6580d5e5e936592907b8111e8854029d27ba5d4fe3d403c84d3d","src/dfa.rs":"eacf0b2d0f45e00aae44e6dd87371469af4218d403f04a889df0c83619876ef7","src/error.rs":"953a99852e15d5034cbb0f7d32d5f7fef04203f570a1b9536122cc6d55e0f30d","src/exec.rs":"9164f4fe970351720c82992d3e033b6534c5c73b9e455aeb9855f67c3f647fcc","src/expand.rs":"a3c83f3f3f2b3ea3fe1c97b601df04799bab15c2aaae8518808382c2dcc9da28","src/freqs.rs":"e25871eec51d1c02c15abbc04d61dbea71fb2dbc15f370c98279687416c969de","src/input.rs":"c2710458e38398a0eba357c76c38fde42b50c22b6e39764ea68984fab3acfab7","src/lib.rs":"aeeb3a721625b727123de7e0d7774d8e7fe5c2062fbb20216304e42b133b3cef","src/literals.rs":"7a2efe252c21660794bd27054e997151763c8f0ea68c2be7994e1a36f4811675","src/pattern.rs":"433b2240d72f8cb4a393c604e02220d8ac38735cb7db826ad75e110458f9ef07","src/pikevm.rs":"bc9d00bd5aed5463121fc98ce9390381137f842c821da48242b2f6fae1137f22","src/prog.rs":"3b3d472ced5958e140e96d367067ab53edba72804c80009a46131ec904a75f2a","src/re_builder.rs":"38c1a24a7d0fcedf22b7e41e36b48c76424fe5f3e6a45c79dc47c8eb0a93adbc","src/re_bytes.rs":"cc3de66a72165e7db748d37ef3244f91ddc88651b6963ab67607e7e9c7a3da3f","src/re_plugin.rs":"81c91868d8a51fdc4d7b76660af7134182a459129b5db3e19d24d8876b988d3e","src/re_set.rs":"a129b215af87b052daa848ee18881221367422e0cc222f5395d69e27e6666269","src/re_trait.rs":"3b0e35e7376853e2816983578d03bf3bb2680c03f414dbb7c8b84c7f7256d7b6","src/re_unicode.rs":"55c2285ae6d187ec288d394e97d9066711402d532f69e969f9c5177656e1d2dd","src/simd_accel/mod.rs":"a3eb2c7fcc296137cfc135da47cdfe745606e8159c3263591bebced2c09fdd54","src/simd_accel/teddy128.rs":"339b174c43275c4144e2bd437de445c0b28c5e24b2be31356c8d318f3e863214","src/simd_fallback/mod.rs":"4cb8a77e2d3e167e9bfc47cb7e4734179f743c2f727e26838864d9959275239b","src/simd_fallback/teddy128.rs":"502d3bff4c78963f343875aa00b15e3625f3ee2ba1de01f029211292a5721912","src/sparse.rs":"04e70bb0bd006f806e8c9cf19825625e907036304823bc03b6c8f2e5046a38ef","src/testdata/LICENSE":"58cf078acc03da3e280a938c2bd9943f554fc9b6ced89ad93ba35ca436872899","src/testdata/README":"45f869e37f798905c773bfbe0ef19a5fb7e585cbf0b7c21b5b5a784e8cec3c14","src/testdata/basic.dat":"3756a5bdd6f387ed34731197fbdaab8521b0ae1726250100ba235756cb42b4b1","src/testdata/nullsubexpr.dat":"496ac0278eec3b6d9170faace14554569032dd3d909618364d9326156de39ecf","src/testdata/repetition.dat":"1f7959063015b284b18a4a2c1c8b416d438a2d6c4b1a362da43406b865f50e69","src/utf8.rs":"422c7b84507cf3ec3900ff4f3787364e1213fac0c731994e34a813e44aaf47ff","tests/api.rs":"af8c86a5d73227896a7385ebcdfe9d3f08f736c81a78b7bf285d5c1a2e2cfb20","tests/api_str.rs":"3d163651d13710317da7d5206dfd608d8fe5f6c5be0cae8328c3f6d6c55cba07","tests/bytes.rs":"f765b4004d798f9e29fc522b26f75aac567c30e01fb2b73765bb51736be42db1","tests/crazy.rs":"52e683facb96ebcff0ca03c1b9cf666c03f97d41bbc844538bbc07a41c880cc9","tests/flags.rs":"cd3788760defc667b32adb2732b6657b289372e1051fc240dfd0e435e2835353","tests/fowler.rs":"e0b7420fa5b636301d4c11cd4dfb803ec09fa7b27be47c594d231167de1241e3","tests/macros.rs":"cfb23248b3de41dbe538485938a8b608b10164bac580b2d27f9240e254252ae3","tests/macros_bytes.rs":"5cb55bf5a2a8a9f09539881e8ca503868bc2261ec710daffda6c3a0e9097ece0","tests/macros_str.rs":"9448ecb60546236c4f331e1b246414c84dcc5197117e7adb5de29ed2f87d6ff9","tests/misc.rs":"6ea9d2218f6d1fae7bdb8c63147b934139f3e649b9950537a7f44bc03cf40e55","tests/multiline.rs":"4e872a9473bc229d955716c18c77aa3530625a8f3a28ecaefdb70b9aff0f0a8b","tests/noparse.rs":"9c5acf252655f8daba67d5aa15a98f556a8bb5de87de9ecc8e8e3b50614a65c2","tests/plugin.rs":"9a51dfcbdad4e2a19f43598d74e0dd745a862a01b4165fce387a94083e5b588f","tests/regression.rs":"a72e028c61682382a2aa66c0bad2effa0d0749d10cbbbb0d830921a4cb62b0b6","tests/replace.rs":"f8cfe306967a21a19753668580d35a9e11f9caab76b8cf92152fa84fc805105f","tests/searcher.rs":"124c9909a1e8fcfddee8ecfae3a1fb9d76f9ddac62fda23d9b895744728a0aa8","tests/set.rs":"1ef1131a4ced809620b9ff6aef26ce0dd08ce85d6b834ef38065aa6d688a528a","tests/shortest_match.rs":"7ca223e0a61b1a26a1f36465ab49de021475295e18f4d6421497461af1e107be","tests/suffix_reverse.rs":"cd497c1a51246a8fc727062133470e0c6300620ad80333d20d63c0ee4224ef1c","tests/test_backtrack.rs":"b25c726b092214ea81e7b687e91dee539a68739e40d1059e7b32148ab9d2b9f1","tests/test_backtrack_bytes.rs":"9c3ecca34d845ebb06319734bfbd59c11b0aca508711de6487c9494e601d952d","tests/test_backtrack_utf8bytes.rs":"8e34bca30f5d2d97a6a655b5c40559a83ab8f646829e37b0964303aca3652ea4","tests/test_default.rs":"b7be77cd8bb9656488a2fc38b6eb30e8e0d7438d2972bce14205a8d44ee22b13","tests/test_default_bytes.rs":"d57f8ed0b66469aeeba1f8526db3576be40fa9ca396021b82b381870ab2b375d","tests/test_nfa.rs":"8b2afd65381577a9620816569ed3a90a27045946c303f97b4a11b89f020b5158","tests/test_nfa_bytes.rs":"adb96f6b9758fa9e926ff50ee6eedc55b4c3a1b6caf187a6b18e67ac21d7e3d6","tests/test_nfa_utf8bytes.rs":"477a8ba689b1331ada9df28520450cd5bbfc85ee97aff22cf7147781cdf2e762","tests/test_plugin.rs":"84be9cabe1cf8fb208638475436b020a75e9ec3e7f885af39e5404adb6fcae03","tests/unicode.rs":"1ccc0b81ee88e604afb45570542eee02052c48862bde9b07d9e59bb7c72e9d2b","tests/word_boundary.rs":"7081317ddcec1e82dd4a2090a571c6abf2ff4bbfa8cd10395e1eb3f386157fae","tests/word_boundary_ascii.rs":"6a079f3babcfcfc6aa6d1b58b60617798dc95ebfd2be44dce16e985f2b25b676","tests/word_boundary_unicode.rs":"ae4ac0689c6b42ff7628a681d6d99a124d254f35eb1b809137859d3a8afe84fc"},"package":"4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"}
++{"files":{},"package":"4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7c25d48667b8ac2aff589f7a89bfb3aa1a35ac07
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,6 @@@
++target
++Cargo.lock
++bench-log
++.*.swp
++wiki
++tags
index 74391a85bf0fbda71f6b9a277bdd66a789cc8cc2,0000000000000000000000000000000000000000..36b53673df136c11545198491472c422e3dca05b
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"28fc87d41a27bc03d9a8c6b5f7bc1bca55444dbd0001100b85060acada1449d7","CHANGELOG.md":"1056eb04d324b46354605713b40b76bb68d29e5d6ff7ab8d67a58f24534d1860","Cargo.toml":"db32762fb82d997942d0ccebdfab132e742a3d384b2f3b10b2e1000515bd40e7","HACKING.md":"37ea34650ce307a1d561aa915ada82cc8b44153085f327aa2b342fcf8e7afc62","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","PERFORMANCE.md":"d23d6dbe3791bc0689c5a876922b8264d6d3069b577772440b8caa01867f0cb4","README.md":"e88b7b2f1982115b1bfa8dd1b305ae1315af6f426c919009d80b63007509ed1c","appveyor.yml":"6855c14a64fec423d67c1ddcc47644593ae3ad1f26e8d157cd5c395efee1efc0","ci/after_success.sh":"6c9562098234f7484e2496918386505185c43018c3f3d17f8df95a59457d8f1f","ci/run-kcov":"721a0ebfb72deb34e4b45141279eae5b4a40c22d47159e01b4e6f176ed3bbc22","ci/run-shootout-test":"be7edb66a4a65eaef6a2b7e6036b4b732effa8dcd931bf4cbd591d0ca32b8264","ci/script.sh":"7f640b7a469c2764f6c12dc84a75fa956c24bc1f611cd72f1ae3a53bacd3ee06","examples/bug347.rs":"93fde9707dd78978dffed46b08bde095a515151bc94f892c0159ac3c0060852d","examples/regexdna-input.txt":"156a49710bb3e1ed4bc2bbb0af0f383b747b3d0281453cfff39c296124c598f8","examples/regexdna-output.txt":"35e85b19b70a893d752fd43e54e1e9da08bac43559191cea85b33387c24c4cc1","examples/shootout-regex-dna-bytes.rs":"3d36b08dd34c51d022e9b3a3dcfbc780bc9dc3d46a601256db5d4d5e2213119c","examples/shootout-regex-dna-cheat.rs":"4b5a590ec88a9ba67cc4a34621cb038a400d45e64a15a354f3e07fdaf41a935b","examples/shootout-regex-dna-replace.rs":"15677e7de356427fe2b983e918de073a7a730337b090d4ab0e815e1e66f74f73","examples/shootout-regex-dna-single-cheat.rs":"5e743b3a6ec968713ce064a289b1fbd11c302add824d1c749a2ffb546c73128e","examples/shootout-regex-dna-single.rs":"021292ec6999be33a9b8e833759bf3509dc0e6b6365fad8e3a882cf3835b0405","examples/shootout-regex-dna.rs":"b892242cea6b6b16f0511ea672c24a49909585224fb69085f0f2fca77ce30aea","examples/shootout-regex-redux-1.rs":"191f47847f5466261a308c8cdc19a3502603a208f40e4e650024dec80241b9e3","examples/shootout-regex-redux-chunked.rs":"6da0b6af66df64dfe45fb2e08532e2b3712cebcf0d3f19ff8d5f87fe712278c9","examples/shootout-regex-redux.rs":"c587bef968feb9c329f5c1896f79ec09e509885dec27091678b28a221a5d40e8","scripts/frequencies.py":"df2cac150bc4ed42d2d97762535a5f260f3fe06d9d516721f68a52671a3b7a3b","scripts/regex-match-tests.py":"f1b3ad870c893510172bd84f8328b66ee99cd7aee7715a95a858468ff3e33635","scripts/unicode.py":"4b1330e733bbc22e677e22855bf8a88ab134aae56a10fda97081320aa12a6228","src/backtrack.rs":"221e12b4afaff096f8a61bb274eade928845e194e1ec37fa75b684b18c126b1b","src/compile.rs":"4c2159961364d001e9191840a878c3c3ca0b641f2356ba2abcc3356581b7b47c","src/dfa.rs":"985b5f880814452edae862347584f2e53c08eaccae0e01ee5c5d8564dd8381ad","src/error.rs":"b4052872f9a7bc48c478fe73e145ac1acf7533140f827999808fadcba09754d3","src/exec.rs":"b696cd65cca692d4ddf55e60bcd29986c5f2fd43a2e32ffea23c0c95548915d9","src/expand.rs":"94d7fb06544639d94338fc426bd15d1883efd4e0204552c9def667b9b415ef63","src/freqs.rs":"e25871eec51d1c02c15abbc04d61dbea71fb2dbc15f370c98279687416c969de","src/input.rs":"c2710458e38398a0eba357c76c38fde42b50c22b6e39764ea68984fab3acfab7","src/lib.rs":"1652707e4c259cd39e5c45011c5c8d001f582944527af8d78637600bfe162b44","src/literals.rs":"7a2efe252c21660794bd27054e997151763c8f0ea68c2be7994e1a36f4811675","src/pattern.rs":"4e820c17a2b983050f47d3fd13282094ce9f27b75fd852fcec438d61f07f0b0b","src/pikevm.rs":"bc9d00bd5aed5463121fc98ce9390381137f842c821da48242b2f6fae1137f22","src/prog.rs":"3b3d472ced5958e140e96d367067ab53edba72804c80009a46131ec904a75f2a","src/re_builder.rs":"d14baf810f1248a030eca31475989115f6254a438acbba1eec14b59ed58d2f12","src/re_bytes.rs":"a5b7afee1460fb1957284a2483e6708f6357acc7c13288dee409b6aa0fa15b74","src/re_plugin.rs":"74999c35abc02cb7c18adb74c1d8ebd08b56141f66f174c67b7157c5c27e2a49","src/re_set.rs":"43f40dba1273b8b359d4010616be62b41f71b1d803f0c6e4b04169dc57cb6318","src/re_trait.rs":"37d791af9cc737e0a144be64ddb7104114222e5034cfc9c948078b0b2c799295","src/re_unicode.rs":"34cff9ae054084d870803f1c8d092847fe32a34c9572e67bfc524da03cbfc905","src/simd_accel/mod.rs":"a3eb2c7fcc296137cfc135da47cdfe745606e8159c3263591bebced2c09fdd54","src/simd_accel/teddy128.rs":"4b913c67f5b7105f75b02fff092c3d76895612425c3f8b3e5ded2c41aae4279c","src/simd_fallback/mod.rs":"4cb8a77e2d3e167e9bfc47cb7e4734179f743c2f727e26838864d9959275239b","src/simd_fallback/teddy128.rs":"502d3bff4c78963f343875aa00b15e3625f3ee2ba1de01f029211292a5721912","src/sparse.rs":"04e70bb0bd006f806e8c9cf19825625e907036304823bc03b6c8f2e5046a38ef","src/testdata/LICENSE":"58cf078acc03da3e280a938c2bd9943f554fc9b6ced89ad93ba35ca436872899","src/testdata/README":"45f869e37f798905c773bfbe0ef19a5fb7e585cbf0b7c21b5b5a784e8cec3c14","src/testdata/basic.dat":"3756a5bdd6f387ed34731197fbdaab8521b0ae1726250100ba235756cb42b4b1","src/testdata/nullsubexpr.dat":"496ac0278eec3b6d9170faace14554569032dd3d909618364d9326156de39ecf","src/testdata/repetition.dat":"1f7959063015b284b18a4a2c1c8b416d438a2d6c4b1a362da43406b865f50e69","src/utf8.rs":"75a4516d636566938e896f10687fc16b3ecd8b09de0093015359eb0d11471d5d","tests/api.rs":"803faacd9ac5efc149959ff63a2132f5ca155f75a246b79807c549b464b5c497","tests/api_str.rs":"aef1388c9de8fe9044539745d1975c734e9d268ff02a2dbb1edc5b754cc56d77","tests/bytes.rs":"ae7601bf69307c541b56d85b6f77369051f55096dddfa9d81d470adb54f42a5d","tests/crazy.rs":"bf3a1c3b8620d7d4c9aa72ab5e027fec02ef4bcec45a884e89ad70e82c445a8d","tests/flags.rs":"cd3788760defc667b32adb2732b6657b289372e1051fc240dfd0e435e2835353","tests/fowler.rs":"e0b7420fa5b636301d4c11cd4dfb803ec09fa7b27be47c594d231167de1241e3","tests/macros.rs":"e0329eedbe073e9dca649e651bc869ef2e6030b4b2a2d5959033b58bfddeb858","tests/macros_bytes.rs":"647c42525b8df5151f4f4cab40f515dd2fa5a05246562f5575902e162b0af2c0","tests/macros_str.rs":"124767f6ff33766502e89050ad498d3aba21e975aefeaf64ae76b0abe13b4fdb","tests/misc.rs":"c8cc85ac916980ebd053df2444fe9b795a00f2ac42c5cd828fc3df487f689265","tests/multiline.rs":"4e872a9473bc229d955716c18c77aa3530625a8f3a28ecaefdb70b9aff0f0a8b","tests/noparse.rs":"9c5acf252655f8daba67d5aa15a98f556a8bb5de87de9ecc8e8e3b50614a65c2","tests/plugin.rs":"9a51dfcbdad4e2a19f43598d74e0dd745a862a01b4165fce387a94083e5b588f","tests/regression.rs":"28bd9e3b6df7b8b48b4c2e069f72f4f59d5e64b091ed2559bd3b0516e27f626a","tests/replace.rs":"4a65b863ad012366328062784e323f13c4bbccce89ff709196e4d84d94ef1636","tests/searcher.rs":"124c9909a1e8fcfddee8ecfae3a1fb9d76f9ddac62fda23d9b895744728a0aa8","tests/set.rs":"0cecf5d2acb3d0df2b051e0ab56a4a853bb58c0e922480f5e460b9a05a0d16af","tests/shortest_match.rs":"7ca223e0a61b1a26a1f36465ab49de021475295e18f4d6421497461af1e107be","tests/suffix_reverse.rs":"cd497c1a51246a8fc727062133470e0c6300620ad80333d20d63c0ee4224ef1c","tests/test_backtrack.rs":"b07a114b2eb7f1f17357629be9c8458e31f7952fb2c327d66d9415f08855c624","tests/test_backtrack_bytes.rs":"dd3cec3c630d6f41892c9111bee87227bf47126651b2402672c30b084fa9c28c","tests/test_backtrack_utf8bytes.rs":"b576b933d6be21f8cedb281e456441d4278350b0145a139dbccb1861639a54f9","tests/test_default.rs":"768a1fabafc7eb815bfaf55c22606dc884e1dbb88d7fc40fd561e8faaa61e6d9","tests/test_default_bytes.rs":"c0b66b63abd263f3fc7e5fcacf4a93cb7fc40c17b764edf8700ae9ba1ab950ff","tests/test_nfa.rs":"aad36ca01f3f7eb23633a1207056e9056d686be2ef6e3661fad83805fa482927","tests/test_nfa_bytes.rs":"198f7b58c5c7dd0a05f16ddb3b9b63dab29ef2a56448378ac602c5d087c01e4e","tests/test_nfa_utf8bytes.rs":"854d80114ca1bed14d4ad3f2b3bf292ff0fa44e12d7d3f2ec6dd17cbbaa82175","tests/test_plugin.rs":"84be9cabe1cf8fb208638475436b020a75e9ec3e7f885af39e5404adb6fcae03","tests/unicode.rs":"7bd3095678fa227dc722f2b5f60a072c2b1752a5ac8df234cd023ece34c80d8a","tests/word_boundary.rs":"7081317ddcec1e82dd4a2090a571c6abf2ff4bbfa8cd10395e1eb3f386157fae","tests/word_boundary_ascii.rs":"cd0be5b5b485de0ba7994b42e2864585556c3d2d8bf5eab05b58931d9aaf4b87","tests/word_boundary_unicode.rs":"ae4ac0689c6b42ff7628a681d6d99a124d254f35eb1b809137859d3a8afe84fc"},"package":"1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b"}
++{"files":{},"package":"1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..6879ab176c53bc15f2bc7279b070e836333dd1a6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,7 @@@
++target
++Cargo.lock
++bench-log
++.*.swp
++wiki
++tags
++examples/debug.rs
index fda64cd1d679cbe41c2ef3a339b0444404b8f269,0000000000000000000000000000000000000000..0b18084219ce06693dea0c6bf472276e5597e1ff
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"30f20ea3b1885dc74918c19ec86273148b74f24de36dafa5d11c51835b35ff25","src/lib.rs":"b85080ba8584fe22281cfe651b2606377153775bb537c02d2d70e5a97e5bf874","src/literals.rs":"4c6d5678ef4df87e95cffde99aa3e0c8ab8012014b11f1b61e0e3b0a99ec9b17","src/parser.rs":"e85980699f16d82fb7c5103686daa4d1b8da36e0593dea7abe54b1cbc3ad2cce","src/properties.rs":"b3faea84cde7db615c7d502972fa5b92f2edf46fc7dfb39b35c0721c5fe497b7","src/unicode.rs":"5bbab13485910b55a56e8f8437786e820f409902e96d07ba2018c28cecb033fc"},"package":"f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"}
++{"files":{},"package":"f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"}
index 1ff998093042686c0c1f2b11100741b47bfce62e,0000000000000000000000000000000000000000..fadb470594aad691d7fdd907766938988e3ab186
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"264a95f5e516e60aecbe9f8a5f1c551bf71debb7249cf4bc3c102d68b9bb0dde","src/lib.rs":"e8eb3529e5bf62913439605d478b7385e43e5ef8ebb6c4800630a16f8ab3cb26","src/literals.rs":"4e7d4afa303ffe241bd17621728a1e0c018386f4f77b4d8f0f4403f74650bc6a","src/parser.rs":"975f570f86914c8bc8a132f5ced11484fa912ed0f7071f2bd2764600b611ec46","src/properties.rs":"ba19030e905d133039eb97b167dc82b4a9f78dd88c3b79b381ec7e5fbc6f6a8c","src/unicode.rs":"5bbab13485910b55a56e8f8437786e820f409902e96d07ba2018c28cecb033fc"},"package":"ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"}
++{"files":{},"package":"ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"}
index c918158f28e4838dff206b359884d2dd4b12c1f6,0000000000000000000000000000000000000000..49fa1c971ad2f103f0d47141a3cf652e12d793c2
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"ff608da9edb53d86860db37ca32b87abb9423785544d763b0776eb654e1896c0","Cargo.toml":"f36d04ef66479455b1adb0a96e7c7ee16282f526dfa241ee878c9f810a11e93f","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"2ab3793abfd94209549d28f157f223ff43a7f3bfeefe90cf5572ed49c69c52fd","src/lib.rs":"60a242b81e0bbe06dfeec2640a31d5d71458a35c187b5b3c3ee30fc9a2d0ddd5"},"package":"3058a43ada2c2d0b92b3ae38007a2d0fa5e9db971be260e0171408a4ff471c95"}
++{"files":{},"package":"3058a43ada2c2d0b92b3ae38007a2d0fa5e9db971be260e0171408a4ff471c95"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 10c754a7c6da1eb8d202589765f6bb9a2af63c99,0000000000000000000000000000000000000000..2ec27f4bc71e42e4af17df4a89743f19cc159baf
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"03dcea6dcd54625b42d91176e86718626dfd911744a343dee3edefa001e87dc5","Cargo.toml":"01199fa6ca6337a7513e9ef8951268b8882347e5affaa50e710ac4960d9c65e0","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"0aebc3beb6fc32d6073582d5fea170761689a2c83cddb5436aa26e57b7d04e7b","appveyor.yml":"da991211b72fa6f231af7adb84c9fb72f5a9131d1c0a3d47b8ceffe5a82c8542","benches/base64.rs":"96f7d0c7d260362e41b8cefb4839f1e1b3c18c2f10344f6ccafac7c434f99ca9","benches/hex.rs":"057821307b4b7de02f2c267f9248457386035382916c5afe4b72d6f2e905062c","benches/json.rs":"659f2ae2e1ad5ed022fafce6418d17dfe09c3dcb3f054857dce0effc907da850","src/base64.rs":"57649c590c1fba643ff955910f1d4427feda43414bb0863cd279bea56c3ff178","src/collection_impls.rs":"8ae6bc0d61a4777d834c2b24fa987550cb13c570e1564f87ee32eceff3cb2d5b","src/hex.rs":"a2ba86cf47035b5d9cbf4adf8dc3e941d4e0a6ce1a61a29cbb14ea1fdabac6bb","src/json.rs":"75a788a46612c73bfd14af20fb48855dc8c930747c5255a288d2d09de25ea960","src/lib.rs":"a0e4a368a609f019434e7584f54448cf33ebf3e37e3fb1dd5537d300088184b1","src/serialize.rs":"7ddcc3c32843850e30d05b82a8cda8ae63ec0016e2b0bfbcc46a03ea3ea986e8"},"package":"dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"}
++{"files":{},"package":"dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4fffb2f89cbd8f2169ce9914bd16bd43785bb368
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++/target
++/Cargo.lock
index a8f3ed8bd48e96d2552600e4670502c61dc36337,0000000000000000000000000000000000000000..4e807c181c65287652f37c8a3294298da17df7ff
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"3eb5f096dc0fa1f3a3b0abaa000a26296720bf8074b4823eb7daf905ce85660a","Cargo.toml":"ac2be902201c6ed727fc1a35d5d55322127f0f155a9b51dfb9caade37b383b68","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"9d85b54d8b58f56770bb280919b04b6387942c7b1aae6be380e7f6f144817230","appveyor.yml":"da991211b72fa6f231af7adb84c9fb72f5a9131d1c0a3d47b8ceffe5a82c8542","src/lib.rs":"31c17694802e227246b06d64be3b30f3e378e82d2ee010f42896a6734e1f7682"},"package":"f417c22df063e9450888a7561788e9bd46d3bb3c1466435b4eccb903807f147d"}
++{"files":{},"package":"f417c22df063e9450888a7561788e9bd46d3bb3c1466435b4eccb903807f147d"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 1876525ae18b310e33de411d78fcf45327ec91fe,0000000000000000000000000000000000000000..fbed0cceba8c4a7501c078b8538180e800730324
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"c9f96f84fd07f4d2b4b76d20bc17a4bebe0ec6f527a0d8707bc40a94152b8c84","Cargo.toml":"cfbf903b8a7aea7a5481ccafeaf1d368e882e7a0b270e8bd86a8177ee21c7d63","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"bb80bfbd16bf7dc34de45891c21333c42590d5c5c10e8ba0ed59549fce5af1dd","src/lib.rs":"cb1725a8bb90c1043f187c6ba504d0a9d07793e2f39f5205f926c58849311770","src/version.rs":"f871fe41495d1f7b1230ed91fab6fb3f577c455c4a7f196fdab35bcff566b898","src/version_req.rs":"093f2ac08f2bc8fcf6a93ae0fc333eccc1ea04932e0c0b26835a952bb220eca1","tests/deprecation.rs":"b5ec79e19d61968d05b96b876c449e54d43cbd1762c6e63c23c3470f9db56292","tests/regression.rs":"180b699ad029b81e6135d42f0a8e6d782177bc29a41132f875ee6f8607a46b56","tests/serde.rs":"271d6d47ca8ee2600fe4476a14192f8879f21e5f66fb0f202d93d71fd5ffa368"},"package":"3fdd61b85a0fa777f7fb7c454b9189b2941b110d1385ce84d7f76efdf1606a85"}
++{"files":{},"package":"3fdd61b85a0fa777f7fb7c454b9189b2941b110d1385ce84d7f76efdf1606a85"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..cc3b58977e168059b71cad4d2f12e327f00c3e6b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++target/
++*.sw?
++Cargo.lock
index 15de79cc7c0f1c03d6bb2f2a58ea7037d53baedb,0000000000000000000000000000000000000000..d2dc5138852fe3d7ef826a208b0f39b7b46eb55d
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"67597114802114d2a7fdb457c1cf5f7e0c951b21e287c6a47b9a86b9028cf64d","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"d38feaa4f9468cd1e0ece22e0ad2eadfe6195a9a0a3843b7c722d5c7d81804fb","src/common.rs":"dc42336abd34e19ca9f732f33657e106f98dcc8c10d4c2564bc4f160cb31926e","src/lib.rs":"3ac8ef5a280344a25cb18ac386034c0fee8d64060fa14af5e25ed49f0cb2fd9e","src/range.rs":"3596f048d466d43887aff1e8c8c834476672a4627631ed35379c35466b5f02ec","src/recognize.rs":"9f16eda9fcd7d8af7eee4c3b89c611bd648040273fde6b35778f8a50b004c8b1","src/version.rs":"dbd91a4e4fd92a0aa9eb4f858ecbc1ecd680aa60572cc2ad2085e5c5c30e5b77"},"package":"388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"}
++{"files":{},"package":"388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index fe3de5883daf02e104d9d4d2d0df79b696ac1e60,0000000000000000000000000000000000000000..ef1788ce7255584a57e98545194d9532722a31e7
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"0537077146c955003ccbb274e748e727b66447fc4f07b585935a407e9ecee73a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"eedee04bddb61e99bc816656bb3b8ae2fa50ff00045ecdb5212682f3592d9ab2","src/de/from_primitive.rs":"28ec3ab1c430cf27d632b642ccfccb6d055eeb9fb576e7e446ba24c66f507fb4","src/de/ignored_any.rs":"1b5ee592f5ae58d69e321144d4397f149c047e327529d0b880e1a5285e781a35","src/de/impls.rs":"8088c7cb2427c9c32bb7104b6d473c9242e98b630b95949543b322348dba4969","src/de/mod.rs":"761d9bd018fe75b8dbd9ec78e2882e533e2488a7cb7980805c1939143eb7a5af","src/de/utf8.rs":"956b124b7ce98353cb781b56e43a6fed2e67f1389d35b7a468d5be75b1485853","src/de/value.rs":"26eec47336c3d31ecbc2b7c131d71954a68ae62b8f13574d85d118eb69177ed1","src/export.rs":"a3e62187f57748cc12109b109cc850343adfab83b74b6b60123fd531c68d5d8d","src/lib.rs":"7659af7266821d1aca648ae48146216dfed0415f134f3989fa25a00ed6f265e2","src/macros.rs":"e1d542b1dac2c1d1f9d5ada7cc5b6639767fc67851421cc3adfb942a7cf750b6","src/private/de.rs":"598f6736d3c23b2e1481932df3636701f36cc5943428647742335081c5c7a650","src/private/macros.rs":"6861a4f332ea24d0ed5db1c28fe3105d2716523902f045c0bbbd439ebf9e44de","src/private/mod.rs":"bcd7c54838e139475c23a323678e20eccbe88c0be93f7977f7675cead4d3b6ed","src/private/ser.rs":"12e686fa3bf7f10ca21642c6308c6ef0b2158ee66ebda412b5d5c388019e7cd7","src/ser/impls.rs":"534f0f94757b0e87304bdbe6f2440b51cb4fc2933d23a62ac61b8c382d80b4c0","src/ser/impossible.rs":"35bd09bb517b28eda0048b0622eb5a0313d5aebf37c03b5a44dbca200d0a9ac8","src/ser/mod.rs":"fc6d1d8dc5e1e1459fda4349634a955c3e59a9bc6d98978be5f8a37bc9c1b02c"},"package":"c2f530d36fb84ec48fb7146936881f026cdbf4892028835fd9398475f82c1bb4"}
++{"files":{},"package":"c2f530d36fb84ec48fb7146936881f026cdbf4892028835fd9398475f82c1bb4"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..045d52f4aad140085b5dca3f4867a0a8a8aa7e38
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,75 @@@
++[package]
++name = "serde"
++version = "1.0.8" # remember to update html_root_url
++authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
++license = "MIT/Apache-2.0"
++description = "A generic serialization/deserialization framework"
++homepage = "https://serde.rs"
++repository = "https://github.com/serde-rs/serde"
++documentation = "https://docs.serde.rs/serde/"
++keywords = ["serde", "serialization", "no_std"]
++categories = ["encoding"]
++readme = "README.md"
++include = ["Cargo.toml", "src/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"]
++
++[badges]
++travis-ci = { repository = "serde-rs/serde" }
++appveyor = { repository = "serde-rs/serde" }
++
++[dependencies]
++serde_derive = { version = "1.0", optional = true, path = "../serde_derive" }
++
++[dev-dependencies]
++serde_derive = { version = "1.0", path = "../serde_derive" }
++
++
++### FEATURES #################################################################
++
++[features]
++default = ["std"]
++
++# Re-export the derive(Serialize, Deserialize) macros. This is specifically
++# intended for library crates that provide optional Serde impls behind a Cargo
++# cfg of their own. All other crates should depend on serde_derive directly.
++#
++# Please refer to the long comment above the line `pub use serde_derive::*` in
++# src/lib.rs before enabling this feature. If you think you need this feature
++# and your use case does not precisely match the one described in the comment,
++# please open an issue to let us know about your use case.
++derive = ["serde_derive"]
++
++# Provide impls for common standard library types like Vec<T> and HashMap<K, V>.
++# Requires a dependency on the Rust standard library.
++std = []
++
++# Provide impls for types that require unstable functionality. For tracking and
++# discussion of unstable functionality please refer to this issue:
++#
++#    https://github.com/serde-rs/serde/issues/812
++unstable = []
++
++# Provide impls for types that require memory allocation like Box<T> and Rc<T>.
++# This is a subset of std but may be enabled without depending on all of std.
++#
++# Requires a dependency on the unstable core allocation library:
++#
++#    https://doc.rust-lang.org/alloc/
++alloc = ["unstable"]
++
++# Provide impls for collection types like String and Cow<T>. This is a subset of
++# std but may be enabled without depending on all of std.
++#
++# Requires a dependency on the unstable collections library:
++#
++#    https://doc.rust-lang.org/collections/
++collections = ["alloc"]
++
++# Opt into impls for Rc<T> and Arc<T>. Serializing and deserializing these types
++# does not preserve identity and may result in multiple copies of the same data.
++# Be sure that this is what you want before enabling this feature.
++rc = []
++
++# Get serde_derive picked up by the Integer 32 playground. Not public API.
++#
++#    http://play.integer32.com/
++playground = ["serde_derive"]
index 5149ec22b68227c7a9fcf709731fbe97d8538220,0000000000000000000000000000000000000000..b9d50b2597a44381f7e53311e4bee082e633d07f
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"fc1c90305d1d8d6debda370913068486b2465b4ac548651f9122169def6da94c","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"eedee04bddb61e99bc816656bb3b8ae2fa50ff00045ecdb5212682f3592d9ab2","src/bound.rs":"c01b1ec82b830b01a840d27654f2b1d3354e62a2b404227fccbb84d80cc6a593","src/de.rs":"518d74b38a7c254383fa6b2e5bfd71137e3abfbeda8b2577d25b7d8acdb03df5","src/fragment.rs":"f1642a1c2abbc36191206a5ec8077e314bdc20a420d7649e4bec3a69d555f78d","src/lib.rs":"fda8bd7ae031370f004d2672c12bfb9a5ae4314f499b5c7cbf9947e810d1d255","src/ser.rs":"b573af63ecfc51849b1157e2c3ae55b3bc256c3ce4b2712a639c5750e42eddfa"},"package":"10552fad5500771f3902d0c5ba187c5881942b811b7ba0d8fbbfbf84d80806d3"}
++{"files":{},"package":"10552fad5500771f3902d0c5ba187c5881942b811b7ba0d8fbbfbf84d80806d3"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..b9fb57b4fb609b8d7b52871991889550b4b5825a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,24 @@@
++[package]
++name = "serde_derive"
++version = "1.0.8" # remember to update html_root_url
++authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
++license = "MIT/Apache-2.0"
++description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]"
++homepage = "https://serde.rs"
++repository = "https://github.com/serde-rs/serde"
++documentation = "https://serde.rs/codegen.html"
++keywords = ["serde", "serialization", "no_std"]
++readme = "README.md"
++include = ["Cargo.toml", "src/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"]
++
++[badges]
++travis-ci = { repository = "serde-rs/serde" }
++
++[lib]
++name = "serde_derive"
++proc-macro = true
++
++[dependencies]
++quote = "0.3.8"
++serde_derive_internals = { version = "=0.15.1", default-features = false, path = "../serde_derive_internals" }
++syn = { version = "0.11", features = ["visit"] }
index ac56eb2d389857ad5659a4e97316fee047f5d8c1,0000000000000000000000000000000000000000..45c0ffaa78977c9a07dc19a173880a0aae2ecfcd
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"511194979a2e34ebea7b27d4abe9350a6d6d2beb4ee074e296c5b95f4c8fc6e9","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"eedee04bddb61e99bc816656bb3b8ae2fa50ff00045ecdb5212682f3592d9ab2","src/ast.rs":"6d41e5055cc012474f72a2fb25874d8f59b872ccccddc2dee83ceaaa08135cd9","src/attr.rs":"bfd6120502807f8a5531a846fd76128ce133b9f9d162a6ea35e471afb73a3b20","src/case.rs":"036711fc550a405ab86d9470c94bac1d58dcdcad4e3a672c73cc0c5a0ecc138b","src/check.rs":"69ecc07d0916ae33ba868eb697ca35f7cd2e97127187f1e95efdcf7ad8e5e2f8","src/ctxt.rs":"98eab1acd3de8617b516d1de7d5d870bb1d2a1c1aca258a4cca2bde3f8df88e4","src/lib.rs":"7fef231c76b77486d813fa43a5dc7394fdeb8b1e95e02f5c1205213725ed400b"},"package":"37aee4e0da52d801acfbc0cc219eb1eda7142112339726e427926a6f6ee65d3a"}
++{"files":{},"package":"37aee4e0da52d801acfbc0cc219eb1eda7142112339726e427926a6f6ee65d3a"}
index 21ce096900ee952ac61aa65f692322565a994bad,0000000000000000000000000000000000000000..09e41b74f5227afc97cd239343e16ed178cce752
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"b109f7a2852b00d79dbfce349d6b79053eaa3c96fad1dc3f04016f6c4c545bfa","Cargo.toml":"37b7a6162ede583d2aa96b11b631b0997a9009d6543117677ca199cf4a66e960","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"f0ddb31269922cfaff502701ef7a1c44910696f8ec7be06ca85afeb85bc2ac24","src/lib.rs":"883dcca8fc98a6bfa20a989a87f1e84b37622925bd724df0ce74d5bfc2334e86"},"package":"c10e798e4405d7dcec3658989e35ee6706f730a9ed7c1184d5ebd84317e82f46"}
++{"files":{},"package":"c10e798e4405d7dcec3658989e35ee6706f730a9ed7c1184d5ebd84317e82f46"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index a41a8581adc3352060e91846b8a185e9d9c03548,0000000000000000000000000000000000000000..03d42083312262bcbaff9ab9fd5fd8ee47e9b884
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"a6da291ad12b4e006a0110e0588508eb56f2f764ff2f412c2fc19a6164a6cf8b","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"7156cde613b4f2a2112446b76df493034fcb81bbd2c295ba531e4777996460ff","src/de.rs":"9de29050b97027037c5680381a796a5255c42fe641e5fd1802cec88dae5ddeff","src/error.rs":"e529ed64eae31e4ac12821974501eb7f03f8555ee031526ca871ece465213781","src/iter.rs":"b5c77c5482e45bed1e63bd36a0f991a08f732811546a163228be48303e7f1b4d","src/lib.rs":"94f580785c3a7ab03471a397cea816220b1fc6e2395e95cf8306249f9b4fd38f","src/macros.rs":"fca059b7c353528bd18da3dbf1552229ea6363d4b5942349765b250a86badd89","src/map.rs":"5dd15d8d5bdb1b3421c70adfae05a6b851621e591d2133ef072fade92a4ea65d","src/number.rs":"2143a6d6ffdbb993c46294283659a1b2380da6eb24de2b114a2103f8040a5f30","src/read.rs":"2031b9db0a16da166ef960faea72aa7be8472118d7c9f65189dcccb40aff8b09","src/ser.rs":"bc28b718135c5a56bd3d9c1e44e9dc60066431ec32ff1ddab39849cf72c6b0c3","src/value/de.rs":"462a19784e18597e411318d3de610756031bade2beec30cc2b59b5af78dcff43","src/value/from.rs":"4d8014c358458ad1a7985eb04aa7214d7ed9beeafa912ec53b84a1adb6b89b59","src/value/index.rs":"6bde3aa3610bb2a05cf5fc31a77759f44526f3ede82ebae1c670a1ccf71a985e","src/value/mod.rs":"b1f2f678d5ab61007465706997e5cb155225cdfa76150311283c9576f208eb6d","src/value/partial_eq.rs":"cff03c5c3c87dcfd52d3620c9b37110a1b2d771aead231bbbf8018403f0ca226","src/value/ser.rs":"6e327ee7a15466ff2ccbb5d0f37cfe66d184d844571296b22e2221151b00d09c"},"package":"48b04779552e92037212c3615370f6bd57a40ebba7f20e554ff9f55e41a69a7b"}
++{"files":{},"package":"48b04779552e92037212c3615370f6bd57a40ebba7f20e554ff9f55e41a69a7b"}
index 174bad52a370967c23b47eec71e3c42e4a838f1a,0000000000000000000000000000000000000000..aa86065758756a367e1874f3e6a03c7eebbc79bb
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"79581d46c88f18838ff601dc84ee3bd99a49c21151cc442c3c07ede1c3d23858","Cargo.toml":"bf44b7da46932cc011385871268cc7419eab8e2bfb0d40611ca494bfb012bf35","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"cbd63c6e6350c12c7e07041b84553a6a217d6ef0ee66ff8f60bd19893134b8f9","src/lib.rs":"cf5a182d35c2a3bb861e6ec2b758f95440c1f2c7a76fec7447d1073b58674cc7"},"package":"dd5cc96481d54583947bfe88bf30c23d53f883c6cd0145368b69989d97b84ef8"}
++{"files":{},"package":"dd5cc96481d54583947bfe88bf30c23d53f883c6cd0145368b69989d97b84ef8"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..3b874ca574de0550d0ee2608988aeb9655940377
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++target
++Cargo.lock
++.idea
++*.iml
index 53ca483ccc91cda72c4d10d1d8d49c5e2bb0177b,0000000000000000000000000000000000000000..674525a8cdfafc2df0f881d161e7e0370e37b746
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".editorconfig":"d87dec5ba57378b3c32bbf67526e434f7ac4f44d8b1acc7f44b6d8e7ee6919ad",".travis.yml":"10ee132e43d2a5e3c304a4970adfec8939014403c32d178728a56c8cb18046ee","CHANGELOG.md":"5f3e55f36768b2d2e40ee54702d6298175b7736e9b8918ca03592011f053c25f","Cargo.toml":"ff9b4b5bd80560ed36b14313261763d321cfb9e3f212896ec565fb872e26c3f0","LICENSE":"9b60c5838cbe7953b84bb2206835cb2bc898802da4c449e4442cf23e3ad4841e","README.md":"1778e287c6788197322a352721414f7ceab0c84ee0918513bb9f5382d3e40bc6","appveyor.yml":"b41eae9798a9bb250f6046509d9bbd6e63bac9ad2655d342b3d9c8975584f0c0","dev":"498932c7296d8abeb9e432e797a579787a85a052fa514325b873c4fe3200ec67","src/lib.rs":"a79164ec2334c477ca9d25e10c161e0e9bb8ae8670eb22976948c2a574b40985","tests/lib.rs":"43c707f9c9d35fafa07b34f61418ac877687daba5a0790d87e47b3d2c8bad274"},"package":"b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694"}
++{"files":{},"package":"b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..3a612b5c1815e22955c3a77832bc4e3a070c68c4
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5 @@@
++/target
++/Cargo.lock
++.vagrant
++*.swp
++
index 41dbe46064a2e8d618c2c2f5517745fca5e0115c,0000000000000000000000000000000000000000..1fdb7742f31c45d001f72f6862564061a23cc6fa
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"e1c76f5a888ab4a9047a9079a2c69a666170ef5bbdbd540720cbfe4b6c2a5b78","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"aa140842ad00ec4f0601fefdeef5046bfeae3834d58c9ba6d9721d65885fc016","src/aster/generics.rs":"030a8e7f4de881ef60c171fe48bcb65aec8d58f3558f755a3b9b953b2c9f1819","src/aster/ident.rs":"e9d082664f008a56bd854011310b4258ab072740ba82e57495b6e8a868a5f36b","src/aster/invoke.rs":"2b1b993973ab4f5c8fa6d6a286576b2542edce21fe9904f5133c470c072e6d3f","src/aster/lifetime.rs":"304101622e102586946802ae17a0a76d53a7f3a3e72e520d0e2ac3c8664db3ef","src/aster/mod.rs":"12220f73b0021e72b4c50f6a513cff174b9c7267209aa23f183043d96ccc9ab7","src/aster/path.rs":"7298bcbd522e10a48ec9d54a1959eec4a0b6368fda9ef10d6e19fc488507d5bb","src/aster/qpath.rs":"5ba33af56ccf74f5c516ed542d117d1f6ca9f7dfd1a74d08b4ac50d95666c497","src/aster/ty.rs":"07d783269047f3be20e73ccc962bb4c4cd63c869d73de8bae7bef25b53986d09","src/aster/ty_param.rs":"4f17c12e0b7cb306cfdfaea648eaccee5116923b2abb4d35d085d88f70c40385","src/aster/where_predicate.rs":"5fb8ec3fcb67bcc1d9bb7b64cf2f5beb601aac6502d6db30c0cdf8641fa248d1","src/attr.rs":"2c0c14c45f39af22ea10e0d15c24ef349b23408b6c4e24b6e91c48d38a5e5ca2","src/constant.rs":"b68686cdf371d76d7ac548184d52e46fa1312e84b02a5b504fedbbc54a3b26ff","src/data.rs":"1d6c3c29b1d94a01fb6ec41b4144c22a8ebd7a7fe9074d87fbe2fd1776f2f38b","src/derive.rs":"5d474fa52c19c4d46ff79be39038254887ca01f1786c0032b54e0b5ad8697b03","src/escape.rs":"7263b3df626ad26e5b82b329557584f7cdd61589977ce82c9e794e1b61f042b2","src/expr.rs":"77e22fbf2d1003366296a05d42806a69fdaaa73b4a02e6a99438d8fc886d06b6","src/fold.rs":"879928ea8de2b228f9073658ffa100c689ec85edabfa4f876f9aee3b13057522","src/generics.rs":"02ddd46f39d771d7f229d69f763278e75ee50a5af2c7d2746080e959639726f7","src/ident.rs":"9eb6354d2b58e14191e44592c122501232539b53480389ab9e35d426c3962123","src/item.rs":"c91ec1b423877590acd3fa01b094f452ef6b177db6c177056f33caf61f3fe92d","src/krate.rs":"78f89e1f12f5b790d99d88a3a013178585f6715a27eb26f604e72e763a47dfdf","src/lib.rs":"2931fc34ec99b9ce1776debaca8114eb3531c0851ca584239c03637c90b1cf7d","src/lit.rs":"f8cdfd540f038f699cb546fc3cfc43ec6f72551aa12ca351ea0beb9c8100fa4c","src/mac.rs":"b3ba8e7531980abecec4a9f86f68ae136c5982617e0e37aaa823d288ba6f5e4e","src/op.rs":"232f84ba605ed50e70ee02169dd551548872135cf56f155637917ec3bf810ce1","src/ty.rs":"d71d75de0c0a6d27bc1d425a4ce282e42f7d6126e34ecaa7798353dffb231229","src/visit.rs":"a0c4c7d9768bd5b8fab5441932fc4075e7dc827b73144e5972a04fc7c2e676ff"},"package":"d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"}
++{"files":{},"package":"d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"}
index d735da0139a2b56b0ece718493d5f1243718eb1c,0000000000000000000000000000000000000000..b4c4fd376e0da08e618a97f9229faf23eeea6976
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"29e0c995838581264edd9230cb79799698f7677c0384c6c84f61beadcbc42917","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"b2d43372ff5db084b4f2ef5178e1fbdba83e0f05a9cfc298f188cc130e8de794","src/helper.rs":"010d2b18a73eabdd4045e254910df90bb7f6314c63b2d2b6f1b9d908fa2d2cd6","src/lib.rs":"93c66afd80f9806ddac92b9d3a6382fad34c6b52cb3a8d37ae1067ae1ed5bec9","src/space.rs":"6fe05780dd47ed9d264bb436cbccf385f86bafc4debdd39bf250099b8210f660"},"package":"a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"}
++{"files":{},"package":"a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"}
index a9ce74b6bb1b7b80dfbfc45f23ffe0270f4950e9,0000000000000000000000000000000000000000..ae1bc4bf4c118e33a0d25e4b9e155ed7f18a9c21
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"641ce50921f9dd45b1d9043a44f61f4fb15cfbaf3b5d957f87fe4be2ba866593","Cargo.toml":"d16288c031c67eebd5793563108976a7f9bef1802c9d0864fb23ebe72ba6456d","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"aa8360f3aa2630d68b5a3517c6fa7be8e756ecbe34b54778f46f06383d05239b","appveyor.yml":"2b698d8ab9a0b4b3781eb592d5d688f8b79c7e8044c9ccb3f3c5b5593fe1fb3b","examples/extract_file.rs":"22a009d59b85488bf6cc9dacde51516abc82934ce0ea813a0bea254e4794e56e","examples/list.rs":"36e412205eaffea8ab7f39be4173594b74e36acb369e091362b1975ee4a7a14b","examples/raw_list.rs":"491dd12840edc6460cce53a6aa5e824030a75231a0bf0209d1f33d902f49f32f","examples/write.rs":"94c6bd57a8e7a1f066121e58d761203b5a77f3584288eae09e9e2277fdf0ac71","src/archive.rs":"6f53af5666a0134754ec6fc1d632e58e29693fd2118454fa1483f209900977e6","src/builder.rs":"d118bb66c5a2faa5c9128ed7abd71dfda9b6872211e5aad3244dd405edfe5dd7","src/entry.rs":"fc472ad6f35f12fb4ed68ea637fe74550bc7ff04a8a0e7b09257016f3037a9b3","src/entry_type.rs":"2d6deb5520569f38949ac1a4309798212179cd93f34c8a0acf39cb2521eac599","src/error.rs":"64652621ecf5c605e8905c5dd004cacd9facfa1222b2ea215907d1d0b0ddbcc2","src/header.rs":"405024985aa4e38b01ccccf33ac50f708962964e7a477e1f65bf3ec8075a7a8e","src/lib.rs":"90b9fd4a72d1264da90b224ab062e2a45d4113e1a68839b0a456abafc92471cf","src/pax.rs":"127bcd5916be8c2a0080ad1f46a50e54cda6b6c461eed13ba65c7ab2b886ba48","tests/all.rs":"fbdb6fc2e19599ac007b0f5f9675ff14e4e31ef65a94d229e1917315784965b6","tests/archives/directory.tar":"ada2bda5ee257056ef9fbe6338f66f7188c9f32614991d73f83005b7972802f3","tests/archives/duplicate_dirs.tar":"7732db3e60c56e4bdf027021347b301452bcce66e83f2cfb4d4aa44e1b219a28","tests/archives/empty_filename.tar":"c58a599a8d6342841a7bff96f49e94fd779b96ab5d4f93795577b504afe1060a","tests/archives/file_times.tar":"35e1d58c149dafe0ec57793eedd14f4c3e7d36768d4068650a6cde63de014ba9","tests/archives/link.tar":"06ce2045e1d97d617821e7257721d446c876065a665a38bea6d5e9ce31a52f59","tests/archives/pax.tar":"ae37540f6940aad3707491ce2f37d0998cbee480919b1e6566794748cae9a097","tests/archives/reading_files.tar":"543b51829fbd4c5df77f873c63380c960c6dbea244999030cf7672b0b3a456a2","tests/archives/simple.tar":"1c3b1e2a39e83b85a8ee5c920aa3ed809cee2eeaa40b0ed79f10dfea91826daf","tests/archives/spaces.tar":"4f7d19a9fe2785e97a128d27263dee9d9df2fd8866dcece9fb44dcf20c2c0b24","tests/archives/sparse.tar":"64db241afcbfd9ced33a9482c577774f47c74cbd835207478ec235946c3c639d","tests/archives/xattrs.tar":"6df389a5be73fe184c0427d74a1689cce6af0d3488b270acdf3224e3b3f4acbb","tests/entry.rs":"788ee07e88b4b19162496d523fa69777f9450277a02dea1f56ae0490af0d49cf","tests/header/mod.rs":"86c4dfbfc35094e01ae2cf5420582838dab84ee2f3905d4418faf66d2db13861"},"package":"281285b717926caa919ad905ef89c63d75805c7d89437fb873100925a53f2b1b"}
++{"files":{},"package":"281285b717926caa919ad905ef89c63d75805c7d89437fb873100925a53f2b1b"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4fffb2f89cbd8f2169ce9914bd16bd43785bb368
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++/target
++/Cargo.lock
index 2bbb6371fbf933a9e35a16db310c6abfe006e9a4,0000000000000000000000000000000000000000..a6935973d453752d2e706974ca1b3f404766fa44
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"a4229a7e2eaa72b54020926415d7715144a291fe433380d371bbb0e1207f8326","Cargo.toml":"a6c08b72f1ed2a2ab14761024d023eb1c270c272cd6cd62b42041ea30e112824","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"fe89569b23ecd71d60148f1356c286b4a8614327cec4ff8518dfab17e57c5487","src/lib.rs":"2235297adddfa32e4ab3a4506c538717d89f2c0bdf196893132dc65f52a991c9","tests/smoke.rs":"b2b2ed4a10c1d1965b1effee0995da73cb7b1480aefcd77ba4ad5456651253e4"},"package":"87974a6f5c1dfb344d733055601650059a3363de2a6104819293baff662132d6"}
++{"files":{},"package":"87974a6f5c1dfb344d733055601650059a3363de2a6104819293baff662132d6"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 38b0391e1efafab28e8f86ff1cdc4e413c2e6619,0000000000000000000000000000000000000000..ee98a2065f2e74d7d0f8c97a7282a4b6abc51564
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"8a98e02ce273cefe3e6bdc92966575a9a71957ec49dba52301f5bdea8c194f9f","Cargo.toml":"419a08f81fb02036cf387d13af4ce9782d9096256f599c6b9316064efda9d57c","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"f5d6df44431e0814368b2890d954ae2253efb7765925582de8be11eb16a505a6","appveyor.yml":"da991211b72fa6f231af7adb84c9fb72f5a9131d1c0a3d47b8ceffe5a82c8542","rustfmt.toml":"be851a0fa92766755e54e163ccceedee0b28ea6d527888c48f1cbc766f23733c","scripts/id_rsa.enc":"210d1476adba1c08d77329d9f71dba828c0516d8ae659c6317c9bee4683e5d50","scripts/travis-doc-upload.cfg":"2609cb89644596a2ede3cd63b7a5fb6e84ee56c2b880ff67584e9655f4a2e777","src/lib.rs":"89a6d51f00881c7f67484fb350fa072069d81770aefd9eb17aa504aa14835c81","src/terminfo/mod.rs":"511a7bccf196089daaea601e670d92c3d78a37ed6b7ac00220f18959dbfea73f","src/terminfo/parm.rs":"efde5f3ab1cb5a646f51f07bd90cd05154e7d080c96dc03ae33dc2a125c5aedd","src/terminfo/parser/compiled.rs":"2f353fa3f4cf01974407c4a6cd0e94fc2b02f123ed3d5887bd454ef91d1d4eba","src/terminfo/parser/names.rs":"dd32022a5f198abc40fa68566c0798725451345173a7d80c80e05a121c8cf0f8","src/terminfo/searcher.rs":"5602a32e555762e5171c1865c2c1b3b6bb092b8c233f413bc0933658bed40b67","src/win.rs":"9efbdc4bb18b317e3d98fa58e441cc8903710ac0e6f315899329660cf6d10277","tests/data/dumb":"123c85a2812a517d967db5f31660db0e6aded4a0b95ed943c5ab435368e7a25c","tests/data/linux":"9dcec472e8ec612e84b46c2b8ae17a4f47b2ccfe93bc7b16970bbaaa20fab1e9","tests/data/linux-16color":"eb0b5684a42db662ebaa0043cc4bb5e082b09a7312796ec669e0159fce6af499","tests/data/linux-basic":"1373c033c6a891911a0a478e5f9654600e84dbfe2d16f649ba2fc08802335a0c","tests/data/linux-c":"50807ab8371b45bd80ca9d563de882b733b5db88cff7646e40c344e98ef755ed","tests/data/linux-c-nc":"d88eb59f749d91be3148ce39dec7c050d95feb516702ed7f9f6cec7a58b424a7","tests/data/linux-koi8":"4b7d942f03ce95d45802029db0c87879eb93be50b43026c63c18a3552dd37c93","tests/data/linux-koi8r":"7267d93deec24396a9955e95da621c054d8d677634b465d798f792141b24e1de","tests/data/linux-lat":"b72b2ec68fa445e2e0ae96cc7bb2149a1527e11ae475d1957c8a22d9ec2c0905","tests/data/linux-m":"4a92f6fef1eeb679ec4511579d3004cfe6fc1d4dd73fed5299cde568f6cf3fbf","tests/data/linux-nic":"eac886df04c80e6ba02687087ddc93635c0f433f4f28195447499a8963989f21","tests/data/linux-vt":"2ebd4c761a492190609f6d8bcdd8f9c8c81e281b0d5e8a51b87f4ba126370bb4","tests/data/linux2.2":"c3d6e1466e9fb4111f4bf243b87a3de290d85224f1a4241947a3f51bdff08b82","tests/data/linux2.6":"52c2930ab1cad8271c280fefb1f581b12b7b3be445348d047a39f5e3448b3614","tests/data/linux2.6.26":"88f5a62b78956a21015ac887c5189a9f72900a842c2f844a1a5e197151a078d2","tests/data/linux3.0":"29b2aad27b5c291adab85e4150883fa6dc0034671c67e889d722168735ba2504","tests/data/rxvt":"9411be0058e147fc7a1962cd35145446d3d439ac3be9b6ca9d3aa2aa0c28ef5e","tests/data/rxvt-16color":"d41e75a0bad0e7c6d957c727f68dc507898685f3bbd71f0721a0a4beb14daf08","tests/data/rxvt-256color":"e6415e230d7962133d1da913cfcf23a0e2d3ed75379164a921feb9462c475a8e","tests/data/rxvt-88color":"958a81509d2b1e2cfe5a7bcf7a15e81d12575e4ccaa1dd308eda8edf7905a36a","tests/data/rxvt-basic":"3989e1c659121cb8fd8f67b8bff7f304e52c1f401cd1d09e906e11a58e0bc587","tests/data/rxvt-color":"3d2b49d48aca7fad7a3bf26d06592207b3c3cbf7afc3a5223fd0613f50a2739b","tests/data/rxvt-cygwin":"d50e434af6b3ab85b26e4f6af21c9c612d271efacaff3e64ef3da8c350a91809","tests/data/rxvt-cygwin-native":"34ee4ef070d9c366f5aba8f72a29a0e45ab552ba43b3e32265dfbe9eef157994","tests/data/rxvt-xpm":"4e8e40313ef00f0572456724249a625c36f2c5338b5014b87f236e29f612212e","tests/data/screen":"57c2888ffb9d7632381dc6191657abda998ca5f0958ad5787f848ff2206198f9","tests/data/screen-256color":"13fd658c693283ffb495d7f473bf525422e312e199bff6e64abdb70db5b22f46","tests/data/xterm":"67a59e4f0807759546dbf45c0bc2dddb30944ef553990345b1d08d7d19ddc13a","tests/data/xterm-256color":"e2525d133091a1ac38b2ad4eecd8df48eee31789c8fafac0ed99bcd6b746d8ce","tests/terminfo.rs":"5338fa4feae9e0d7d2c5f6ae3e911e6b88f668a23a4313e89b329d84464ef904"},"package":"d168af3930b369cfe245132550579d47dfd873d69470755a19c2c6568dbbd989"}
++{"files":{},"package":"d168af3930b369cfe245132550579d47dfd873d69470755a19c2c6568dbbd989"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4fffb2f89cbd8f2169ce9914bd16bd43785bb368
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++/target
++/Cargo.lock
index 50619f1a272244e2b3b39e7616bc9b3a462c9e30,0000000000000000000000000000000000000000..d04b964bafe5463a119a056a731f876e2669121f
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".appveyor.yml":"de4b4d0101675a34db32738cd44d831796a37fe5953b11720f0b2e7e68f04857",".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"2c6bb65a8bdfaa7f7dcba6b7c73897752a0f756fc2a9361627b0f49ed0e84cfc","Cargo.toml":"b8244852f17a7607e2ad19e845d756f7b33555806e27d14a5ec412c18097f87c","license":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","readme.md":"44d3bc46e51a91fbd4d9b7b397e218914dc6fe9ab683f7c1cacdc6ebe9ffb4a2","src/lib.rs":"92d7d1f4fd23e2866f5cab2f10d04c099eb63a5b70a23f0c818884be06dac04d"},"package":"a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"}
++{"files":{},"package":"a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5809b04e992b786cfb27eab342d7961cd86229bd
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,7 @@@
++# Cargo files
++/target
++/Cargo.lock
++
++# Editor files
++*.swp
++*.swo
index e1d895bcf229f151bcaedad250cd9cf26e5c5690,0000000000000000000000000000000000000000..390ddc25537f14f19c806aff72bd4a5e8115cd14
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".appveyor.yml":"86b8a7bf3ff316a2d8c58ba1fc365c5773c926ee3e4abccf889a95e5ec4f393a",".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"731fd15b3f516c8da8241d2c5e7a56e638f0295f637d448fb009131092792264","Cargo.toml":"fbe4f546589b570dff000201397c059cc16a5807211a436c17f03aade65690ff","changelog.md":"71ecf0389739517ce6e84fc230f1b42f7532c545c0690fbcff270c83012f0d30","license-apache":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","license-mit":"69a1ca9eaf8e5276eade8931f42808d7c39c6a26011e34450c4ebb10f11c653f","readme.md":"2dc47b0ce86bb82f007639782c12ba9376be7d31635ba5cdf7cc828e27a9ba54","src/lib.rs":"214ad7a56dd4715387bbdbe91e53cd93f49fedc88f4c818b4e52378b71d98232"},"package":"8df7875b676fddfadffd96deea3b1124e5ede707d4884248931077518cf1f773"}
++{"files":{},"package":"8df7875b676fddfadffd96deea3b1124e5ede707d4884248931077518cf1f773"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5809b04e992b786cfb27eab342d7961cd86229bd
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,7 @@@
++# Cargo files
++/target
++/Cargo.lock
++
++# Editor files
++*.swp
++*.swo
index 7b6d186b446f485306507618f16827290db93edb,0000000000000000000000000000000000000000..21d2ad490895ea8ac075643ac59f60a2ade91686
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"e2815de849cd128d1fad16155ef08aed29f8a17496869611f788ebc2faabffaa","Cargo.toml":"b3bbbe6a197f0a91dea7b955c3a4f6cb6dc53af1fca242b5817fa0b2ab54919c","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"02160c918345d1e5bd1eb854fdf8253fb17ed5a61d5b3a9335aab84daacb5958","src/lib.rs":"cc7b6b3048323163be4b57acd7bbd1d3f7cdf2a36121ff4d9fac021b10a26e02"},"package":"8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"}
++{"files":{},"package":"8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 229791d9025561024d646e31070343b722320504,0000000000000000000000000000000000000000..84bdea94b94e0aff1be784235d3a6432dd7f8914
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"474743a2a8c8c7bbcc86ed6a4b68165405635651493757d97c06e965c608ee74","Cargo.toml":"0ec34b07cd55626697c62496ab1f826c9b7928697cf3362e7f5a7bcf9e080fda","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"00a29378d5aeb66b7a48b77bee0d463c8b408b8a9cb0abb7674edb10d142aca0","src/lib.rs":"f5d04966ff4da2a79fe4f484687f4b845df5a2fe2b94151d4cad3f595ef6fce2"},"package":"c85048c6260d17cf486ceae3282d9fb6b90be220bf5b28c400f5485ffc29f0c7"}
++{"files":{},"package":"c85048c6260d17cf486ceae3282d9fb6b90be220bf5b28c400f5485ffc29f0c7"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index 882c40353577fdc0f5c57354faa6ef8b3cd17e80,0000000000000000000000000000000000000000..38e91292a0049e2070bf85b201d4f6f8223aab37
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"4e6efa5d144d66b6cfb64d2e5c60a4679e979cea64f4aae77dd275b73eeb0655","Cargo.toml":"ea1d972c019b8e3efec3454537c6b3166ba913e009d1a8742137d5e0b2b4557b","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"cdb1e357027407997a4666c3cb7d4db6676ef151289dbc49b1ab6df744e06047","examples/decode.rs":"c6b42a3c8ab2ce81bbdf6e355450d2c152aed59845c4bfea5272ccf1c7a7cb15","examples/toml2json.rs":"eaa9ad85ec19714f6437048ae28b844966225a17055d1a37878f41bcbc2c5e47","src/datetime.rs":"01ad55841644e81ff53c8b763b3f97b6f46c3cba3898f68cf6e88ffe447787b1","src/de.rs":"2022b206fa95dc6e4702f5bc4f668b935ec782714747f79de181425466a894dc","src/lib.rs":"e4ccdfbbd490740d9be80a851449131d6fe724f597c94759a627d0943d909c23","src/ser.rs":"82a4e50b89d311f093df212fa377155f92004727e8207762fac91f6974ca21d1","src/tokens.rs":"ccc58d254a4a5666573fe42cf21b88621292c59858067169f102f2533cea9372","src/value.rs":"4accddbdffd55eea5e4b3df915cc994457a692f23b92e53a441d9c5e10a8342a","tests/README.md":"3e7d07d64c34e117c3d862ee12e4947af8c133fb0b53f6f0de43cc3bfa5057b8","tests/backcompat.rs":"1d40b13ed379832d31c5d1ae35b9a3c9d9f66ab0ec40e7c16f46139d2fb4c35e","tests/datetime.rs":"c76e7f60514a748c56e09c369d888ea22d8e600b0200275da62dc8ad47ce9761","tests/display-tricky.rs":"e0ffa4f992ac1b3f6c88cf2dc299b605c6352ca3dcf18a4253fdb9b98ef410fd","tests/display.rs":"4472cf88c0ccc58d47b109570f8b19a218ac274ab5293df9e67db2db4f6e5945","tests/formatting.rs":"8941f2fe843d5294ef3dc7ff8aaa3db325d4ec368f1d138f8c28ab4e18c8261b","tests/invalid-encoder/array-mixed-types-ints-and-floats.json":"206d2a353153efbcee74e7ee7b0f852e7a948cfb88417f74607b3ad6f020e373","tests/invalid-misc.rs":"7ff25428e87ba797d9cfa5c181845a6d7669873be1d891cbead4e4aa4f236349","tests/invalid.rs":"f6798f22652c2c09c23b066af33b402319399f7106ef5c9fda1a5222af522856","tests/invalid/array-mixed-types-arrays-and-ints.toml":"c1547b686357c7a865e333a7ce7eed1e30743ebc4daac8ea6148bdd84b7e4dc7","tests/invalid/array-mixed-types-ints-and-floats.toml":"baa235fc168869716680955fd5bdafab30b6fa9b3d09185086261a56ef12960e","tests/invalid/array-mixed-types-strings-and-ints.toml":"4440057ed90d4461db0be55cfd71299cad96b601d5faec2140666242f6fde147","tests/invalid/datetime-malformed-no-leads.toml":"1fa6bf72ea0b96be835ac031408f7acfd0b8d18d5f54b4c0fce8136aad27d22e","tests/invalid/datetime-malformed-no-secs.toml":"b9c30b7fa1847c80e381d68cc79834eefbb8813cd0eff465fb7cbe0733df429b","tests/invalid/datetime-malformed-no-t.toml":"490a46d2e707ef4f87987ec12a22afa5a71c97c5eaa0f4201a174c47846c6a4a","tests/invalid/datetime-malformed-with-milli.toml":"62bfd0a6645bcb3f78211523e5673a3d1fa726d9e942c1643df243d6fba474c8","tests/invalid/duplicate-key-table.toml":"a896ea2180d16fcdd4f6c30aa27529b5b29e7e195a4e7a9944343028783602e9","tests/invalid/duplicate-keys.toml":"4bb0a65c22e7704893a2a51334eb2518af702850ef59aeecd5226e7b26bc07ec","tests/invalid/duplicate-tables.toml":"23b16ce26e1155ee6bf1fff559701dce86475c6a2878536b61f6b7e68be340de","tests/invalid/empty-implicit-table.toml":"d6026110dc0dee7babd69592218819328caa425f48cc879e895b29e48550c06c","tests/invalid/empty-table.toml":"37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570","tests/invalid/float-no-leading-zero.toml":"159654461094c938574ba2d2d09baa3d3c387dd6ed024fd411530c0573a1ec42","tests/invalid/float-no-trailing-digits.toml":"64e4f336186cd096be2804532dbd694dd50ea551d292a9cdbf0bef2abf227101","tests/invalid/key-after-array.toml":"314af33770170b53bf2ec3be43ea1609d981c81d62c968052499b85ed54ccce8","tests/invalid/key-after-table.toml":"ed0dcf38f003d184dd18d1518702da0115cbfb05a5a28cbcf42de2f9bdee05fa","tests/invalid/key-empty.toml":"4303477abf4c0b920b42e96edd61caecf9c1f2d5d97f56af876854cd725aff3c","tests/invalid/key-hash.toml":"cd2a2eba6032d32c829633d3cd2778aeba81f5ff554e69f62af6557d1dc712f6","tests/invalid/key-newline.toml":"06a313a6bd70c2db6a1f5bda479d854d8f87e037e3cabf18fb5db822466ffcac","tests/invalid/key-open-bracket.toml":"52dea939022949290e3a19f1291d15605429344dce3cd1aa1f1568ecad8ca365","tests/invalid/key-single-open-bracket.toml":"245843abef9e72e7efac30138a994bf6301e7e1d7d7042a33d42e863d2638811","tests/invalid/key-space.toml":"b4e336d07c27fb3d0f0a6e50b733e1546202dfd58aaf2f7956f56fd6f075b0a1","tests/invalid/key-start-bracket.toml":"3bd3748a9df1d25ab2661330a3da187bd4da3958292bbf0e8b59d7963634dd87","tests/invalid/key-two-equals.toml":"3ac0c4e339d47c86e57564e43147b772ae83933b78083dc78d0ef77e231df3f1","tests/invalid/string-bad-byte-escape.toml":"c665dcec7c02f442c4fdc80423698eed2376ce65779cf855371772293bec2927","tests/invalid/string-bad-escape.toml":"eeca691fbba3d270f58ae2953d2d1369a773e619e39d8c11f38d6bf6f8472e82","tests/invalid/string-byte-escapes.toml":"4a4604b32971de3a252cd01d2997b450972c3ec9030cf22a070d49c57f050da4","tests/invalid/string-no-close.toml":"bb2eaf96eb9f83a52bd0772abb313060a06b94f650efeb45edce774622686882","tests/invalid/table-array-implicit.toml":"9b841ea64d68be4deb54f67fc807b05fd235452ee563ffa7de69dbca64b2f7dd","tests/invalid/table-array-malformed-bracket.toml":"164f641b2628bf04f8202d9746a360a4a243faca1408dc2ecd0c0fdd2d1c2c27","tests/invalid/table-array-malformed-empty.toml":"56ca2a15019cf5c3555041a191f983dc72b1678f0de0afd1a7b8f46ed7970420","tests/invalid/table-empty.toml":"37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570","tests/invalid/table-nested-brackets-close.toml":"991e1210f81e24abcd735988f0d960d4ee94d2ec3b133c6fea6e24932d91c507","tests/invalid/table-nested-brackets-open.toml":"8fb569fc90fa606ae94708ee2bf205bff8db8a023624b3e52ef6b2c1a98ba1c6","tests/invalid/table-whitespace.toml":"2c2db1259adc641df0459e896d349d3db60965d5368d5c8ed50aedd3bc88f040","tests/invalid/table-with-pound.toml":"d8070437f07bd115ac8006c61e286401bd3be88728a62264796e757121750ecd","tests/invalid/text-after-array-entries.toml":"2530cace13292313983b90b01d63e4b8ac484809e7ef0ac79904923573eda7ec","tests/invalid/text-after-integer.toml":"6168ed823a135b8914956b04307aeec2347b10eb1aa79008406d7b547cbde682","tests/invalid/text-after-string.toml":"1771987dd679e1cc181cf53406ba313fdc3413a081d17a93da6041bf6ccccf5e","tests/invalid/text-after-table.toml":"f27ae56bb0b42d3af4c813392857afdfeb4bf8ab77ff896cd93ba32cf1a21b26","tests/invalid/text-before-array-separator.toml":"192d28699573abbdc521797576d4885adf756336c3e76971f10270603c957464","tests/invalid/text-in-array.toml":"50d7b16d7a03d470f1a907eebfeb156d0c696e6f9a8c734a5e4caa2365f54654","tests/parser.rs":"fc0de1ac5f02505f82f9886403416914e0dd810927081a9ffb0f69da385b1b50","tests/serde.rs":"9606364cb39de098909d7d6bcc0c9f062ec6f13d3041e0480799a838c0a0f61e","tests/tables-last.rs":"593c60ea4727f08168a4a016ef876283d50f78888c5eab7d407092681712f912","tests/valid.rs":"3011cfabfd3b726cee3ffc68f35b905f29d2bdc03f77cf987443fe3c6fee8aee","tests/valid/array-empty.json":"4ed46e8aa3586a7ddd9097cda38919699860052f188880de18e12d4acbee5307","tests/valid/array-empty.toml":"769faa42a690b02ad1b573277f0d793a4a38a7ecf30b9db67bf9836fe2b7778c","tests/valid/array-nospaces.json":"7c82b474797871488c2b522e9b852772a78c681a86900f780f7a0be4f901e1ec","tests/valid/array-nospaces.toml":"01fba63551b1051f7e117c9551c488b293bd3cd4745cbeec6b3709c32f2a3a64","tests/valid/arrays-hetergeneous.json":"dac4702412c90d5ddd6b898c3657c71d782d0aca46e5b9ca19cc694d3e226c0f","tests/valid/arrays-hetergeneous.toml":"361ae2e8470b47b12b336eb61eedd09abb20e216fbeb582b46d16a2831adda4d","tests/valid/arrays-nested.json":"34d6f8fd770f0728f38dbf0d686bed2c218bc16da978290c0208d3bf3704bdec","tests/valid/arrays-nested.toml":"a5941a01a2ba2fa179a3885039a5f81ca6c9876b2e8bea7b880563238be9f004","tests/valid/arrays.json":"315fff195a7d4c80e867e1f14c12a23e36dcc666e8de36138249b15e99bdd4dd","tests/valid/arrays.toml":"2d3c91b77d4f6a65a6a5a2c5ad521dbe86cc2f0ff389dfe58e8c34275cdc35c7","tests/valid/bool.json":"bb608b912fe4d89cb2186da957c10951780575bb34b2f43305335c745eff049c","tests/valid/bool.toml":"3c06ad4dce7430326f5f867105b2e9382def90cccb3ecb69f657c0b88974ab04","tests/valid/comments-everywhere.json":"800f8efd86d1bab4f91f0e367da52a2465e1480387df892561ed8948fd1a38c3","tests/valid/comments-everywhere.toml":"8636108c34f50d45244b142d342234b7535e01fba2db2d2ffed3430223009cea","tests/valid/datetime.json":"94f130c3b2a5f30c625a3a3168b9dfe52aa109b470c4e077f352b3dd79382a69","tests/valid/datetime.toml":"4e1b71ba31a1feef80a1e436225aa9c5d291bf780f558e7cfa76998fe2a29e08","tests/valid/empty.json":"ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356","tests/valid/empty.toml":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","tests/valid/example-bom.toml":"50f3607be97de2f894ccd41a29d3a8a1b1f430982e5ab5bf43047874837f6a42","tests/valid/example-v0.3.0.json":"ec02332eb59dab93a50560771e4b01b972a29d93b6dca8954728c0631e1799a0","tests/valid/example-v0.3.0.toml":"aba9349588c1ba6af2a3ad0c1db2c3d311dca66b64f654480340a0823dfd4546","tests/valid/example-v0.4.0.json":"8b967b246ca2383172eaaecf790b2115a18020f63c70d0848d1dc25fc1fed5a9","tests/valid/example-v0.4.0.toml":"47ee4c4cd83637cd09aca6518f88c8ed56acc2b3022e5ea53d9121e5d35335ed","tests/valid/example.json":"c57fabb1be0ae7ed140fe7ae5082051571c85180204b8ae8d8da1e86133278c9","tests/valid/example.toml":"6f02b2a52ea63c70b629e41e06a8eb1eb4aab359ab966a7a397b248e13849c9c","tests/valid/example2.json":"de89432e78f0a074aae54650fedf151ceca3b0ccb148b8a66e18e2ed68024ba2","tests/valid/example2.toml":"c389eeb485fb7cb9445d617a9a0f8ba70049f08d66cf6b6f2a9a986574295de1","tests/valid/float.json":"9676c13fef00a01bc729456bfe27f1b24a1bd059c9a5913bb0b0401e976a0aab","tests/valid/float.toml":"b6784f554aa38bb210f0905c3bafdfae6db723a4f53288fb07febc66451bbc2d","tests/valid/hard_example.json":"8d170e73e156b8b6be559246880e9cb6a79b36f63d14bc97e3bdf2f2091e7a17","tests/valid/hard_example.toml":"cd3b89f8917a44f944b12fe47f69f86bb39f17db85d1a081bf0c134831eb90f9","tests/valid/implicit-and-explicit-after.json":"6dcaeaf8ee3479bf2cd5c14eb58970757175aaefab014bce9acb0b85e7bf9dd0","tests/valid/implicit-and-explicit-after.toml":"0599b16822764cdb1c3d3cf53f71186b97afc9f60f8d58358a4a89fe4d9477c3","tests/valid/implicit-and-explicit-before.json":"6dcaeaf8ee3479bf2cd5c14eb58970757175aaefab014bce9acb0b85e7bf9dd0","tests/valid/implicit-and-explicit-before.toml":"33435dddb68144b652ca5f5e0c4c53e4f7b3ca0166f9b944eda55f8d76ed2871","tests/valid/implicit-groups.json":"fc2bb43ec20c8c9148c8a70490b3a054506932c41687222ea11faae47eafb723","tests/valid/implicit-groups.toml":"248b3e8272ec43ce4af872981acde10628eeae73537ed6763a1f4245f5a9610c","tests/valid/integer.json":"0fc2d0cb1fb46d7805c1007b1fa4c46a65b273e56ae9d751df686e81d3a3354f","tests/valid/integer.toml":"74b964eb9561be6aa7266f6034cee1cd0657bdab8043a5ec9da33d9b184345da","tests/valid/key-equals-nospace.json":"b9878ee3585d1b48710a4bc09f2163b910ea71a2bfdaa8f1da68e599e8b30f47","tests/valid/key-equals-nospace.toml":"24cab0d01b67b184d0a737de3a5b5d47b8b69b36203273296d5ef763f7fdcf68","tests/valid/key-space.json":"30be539b01420be5cedc9078b88c3279bbef7c0bdde36ba8249ed8906112d5c7","tests/valid/key-space.toml":"9e9459b8cfebc404cf93d77c2d4082cadcd57165a2f9ce9cb35d1d12dc94a8c0","tests/valid/key-special-chars.json":"8bbebb20660d93efa73707bdb09e87a43c2b31c18f13df6388c701a1bc7cab8c","tests/valid/key-special-chars.toml":"c6cb0ba12d32f03cda4206097a1edb27cd154215d72e1c5791cc4f8dff2270b3","tests/valid/key-with-pound.json":"ea4dd79d0ad2a824bcce5c4c194d7fae82a7584a2ab7c0d83d6ddaae6130973e","tests/valid/key-with-pound.toml":"c334f676e19c01b96111277248654358cc8222fd0639aecaf429407e63b6a2dc","tests/valid/long-float.json":"7e103f56e490aa1b1fe5a762000ceb1f8c599f7d81aa215c90f5da41ab4ba6db","tests/valid/long-float.toml":"4d23f706f2a0d241840f6ea78657820c9c7b904c0c3c16828f8cc2574d7c8761","tests/valid/long-integer.json":"9ed7976639f0c2cd7f112584e2f5d272e92569be7135ea5bb9ba597abaff0767","tests/valid/long-integer.toml":"309f94be7ff5fd6f6dedbd257a1e6c171cb71aa74409ff3f8babda951f89d687","tests/valid/multiline-string.json":"3d67a8b992b85e9a2e58b77a1b76dc29745a9c2b4a362ad517786fed541948d7","tests/valid/multiline-string.toml":"7d6650009eb31a03d5b40b20712ef0157e9b787d9c966e66c38873a34e3b861c","tests/valid/raw-multiline-string.json":"4c95e34497433168cac25eb4132485c3bd13c35cad9d13d7becf7f90469dacca","tests/valid/raw-multiline-string.toml":"c724151024ccde432e0ec0d4ba60a5320d77841008116324c39516b8cbb94f4d","tests/valid/raw-string.json":"19268797aff8dfa28437d6ed8f9d813035f6eee50aade5fc774ba12b3290216b","tests/valid/raw-string.toml":"16510e05d477a0856ebaf38cacd0e9e18f02ab63ac7bd1a2eabbaa47a54d0e49","tests/valid/string-empty.json":"ece7d01326742a46e37d6404175118c0a91a2494f7ba2290bbc1d6f990ddb65b","tests/valid/string-empty.toml":"251e9e4052ede79f6b2462e71f73e0b7c9f5927484f6f77f0cd8b3c839b0c13b","tests/valid/string-escapes.json":"3d516f03cf94d5b5ee6b0887b8d37fdf21152752f049f5922a24adaacb5b8c35","tests/valid/string-escapes.toml":"86b1569e10fec91301709ad747012f0f42395050a2343b42aca450e001120f7a","tests/valid/string-simple.json":"622676e347676cce9f9733210acbd8056ce77a0588772ffd6efb05bb4e81b571","tests/valid/string-simple.toml":"ae74db09acea3be2ccae7f854f7b6f7c874ace9d4d87bf2f437b059a7d38a464","tests/valid/string-with-pound.json":"458a0add71536c1df5e1ed3ee5483c6eb48578abce0b0ebcdf75ea20d41ed6f4","tests/valid/string-with-pound.toml":"1aee397830d9ad2a93d41ee9c435acdbfef3758d1bb7c48bca7424fbbec89466","tests/valid/table-array-implicit.json":"3f7d3cdb468de67bc183162805d9c753ef5772f6f363ac2a26598387a5d991ea","tests/valid/table-array-implicit.toml":"66bcb030899a95e9a25ec44b7c9291b02f80ecbc324061cf1cd93223a2919f21","tests/valid/table-array-many.json":"3f21243eeb71ca3e5657a43559c806e12e3833e9f74c43c0c12aad9b0c853e4c","tests/valid/table-array-many.toml":"8d8ea546f954a81ca149a02147ae5f4bf075151cfcd530e62dcf05a04d843ffb","tests/valid/table-array-nest.json":"0a987d2bf1d5bc85f5c9433f23d389063600682a68538b6e57938a3c572959e4","tests/valid/table-array-nest.toml":"71b9c753bf773f232ac71cb2469a54ee0110ff137829045421edd7c5a64d6b6a","tests/valid/table-array-one.json":"7dc0ea3f7f843f7dc7443e68af43a1e5130a5fbae8a27fb02d8d92fa2487888e","tests/valid/table-array-one.toml":"4c478aea2dd7dfcfda682503b49e610f0fa4ce85a3b3cd0bc9041d4959e3626a","tests/valid/table-empty.json":"11e43e212d87b3b2547a5f2541f4091a3d2f6ba00b2a2004b07e02734e927ea7","tests/valid/table-empty.toml":"24d4941e67d5965d270eaebdb9816b994311e0f2f0e79ef6bb626f362c52842e","tests/valid/table-sub-empty.json":"85cca6d48a5993c4f207c21ed96652af4f50b6936b0807659c75317c1763b6db","tests/valid/table-sub-empty.toml":"ae92e90a806ffefcbf8cda83cb82acf7448f75efa50dcfb5e2384632d36471b3","tests/valid/table-whitespace.json":"ad84ac49a6d13f7c4a8af0e1e71fd7ff2a446aa16a34c21a809a0850dfa76e73","tests/valid/table-whitespace.toml":"2f15dafb263d2771671db299f6202b4b78d293aec1ded7641ec7eb1cb024b52c","tests/valid/table-with-pound.json":"151e76606efe77500cbb0aa8fcf8ccfadb124d533bb79a9caa62e937b826e676","tests/valid/table-with-pound.toml":"a1f86c2e3789cc89500ec1d5eac2ec0bdb94bf445fddc3cab558b5228f3aba56","tests/valid/unicode-escape.json":"ebbf81930fa92ea5822bb1ed808b798731abe5c97e64f6471e1e86878d79037c","tests/valid/unicode-escape.toml":"aa26e55e5526a0d00ad68eca774d5c43cbcdf24ae753e0219bf3ab31b9e628b8","tests/valid/unicode-literal.json":"1dd42756384b954955815dc3e906db64b4cd2c0c094f9b3c86633d1652d6d79d","tests/valid/unicode-literal.toml":"bffc6c3d4757de31d0cbfd7b8dc591edd2910fe8a4e1c46bbee422dddc841003"},"package":"4cc5dbfb20a481e64b99eb7ae280859ec76730c7191570ba5edaa962394edb0a"}
++{"files":{},"package":"4cc5dbfb20a481e64b99eb7ae280859ec76730c7191570ba5edaa962394edb0a"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a9d37c560c6ab8d4afbf47eda643e8c42e857716
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++target
++Cargo.lock
index f28e1e9813196d41140192067aa928789af99f77,0000000000000000000000000000000000000000..75f08a934c8f7cc5f0e7f5d68750f2d9f0fc8c51
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".rustfmt.toml":"4587a30e695dc4afdd3b5d33370cf712c90a716de06ab0c5a2c023b0f269ab1a",".travis.yml":"e340419604a35e795fc3afdab237eb0ea3a31e71c98fb98fa88626d61b8a50f7","AUTHORS":"1ff3a7c8519b29544bb28ba9b1e7502df0cb764051fb9a1172e60006aa2b8dcc","COPYRIGHT":"edb20b474f6cbd4f4db066b54a9e0f687d0009d309412a63431189b59b8e2a07","Cargo.toml":"dc21922a66df3876268bc4c187aeaf8db875aee8a1869c7f78e2c67b2e572680","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"e764abd9a6abbe9517dd9dedc003dd64594351282437a509fec9362ef136686d","benches/basic.rs":"e1538acb2de8b0c510d663d5ba0b6877f148955774c713a7aa2374b62ceb6e6a","benches/udhr.rs":"7869911021fc0f0a71246d2535183a4610a0b9efd14fc8fc58daf121a02acd21","benches/udhr_data/README.md":"103dd98f2777082f73dd90ce441245370169a6e889b329da81ee4b9c236c0e05","src/char_data/mod.rs":"6fa055d2c81061bcc15854eb91f897998ed9109725827932266a0dc4d4051166","src/char_data/tables.rs":"3742ed00360d3955b10ba690b1446e69ddf04f2cee13e86dd185ba6641bc6198","src/deprecated.rs":"ce1b62ac47d0d7ea547a1e03d17cd86b6b850e4e095642ba2e9c29130f13fa72","src/explicit.rs":"273c56d064891a9b2f1ef61f81845c0467c81db4e3ce756a9f2ac58f7e6e3e14","src/format_chars.rs":"0b60e26adfff7f61abfbaf63bc5e37896f12f9d420a6df630c4f71e0acb4222a","src/implicit.rs":"ab583bd9f0e9ecff8bd5e26253912c1f40598d0212a6bc78664774149c38dccb","src/level.rs":"b8739d4dd84d9270140047972167d9e72db8637c769228eec17d12e07c5ab55f","src/lib.rs":"f264fe18c7ae5d4c4b100f9304be0466a138384cbcc9b08cb7b5185c5aac6bd4","src/prepare.rs":"cacf4ff9f7b0adf700b9f5cd82165c67eec93fd8e4d05cb6c7fe54111d9bbe40","tests/conformance_tests.rs":"777c74cbb3946d5b4495d4f8abe1f8edd0169a38bb724c44eea82eff5ca9581d","tools/generate.py":"12f94bdf2226f306d993fe2a0fa623b8dc9b1db1ac038a17ab44892ccdc8feeb"},"package":"a6a2c4e3710edd365cd7e78383153ed739fa31af19f9172f72d3575060f5a43a"}
++{"files":{},"package":"a6a2c4e3710edd365cd7e78383153ed739fa31af19f9172f72d3575060f5a43a"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..25f3c8545d84913aa39c4167e0d28c6dd40fb17b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++Cargo.lock
++/data/
++/target/
index 444446f6d10d68057638f693ba139067050d72f0,0000000000000000000000000000000000000000..07eb96d56cec0831657abef98d570f8dd61f44d4
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"493704d6a0d0f27ad2ad6e950f8bce5f42d9ec4081daeb3c5a48066f1030f467","COPYRIGHT":"23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d","Cargo.toml":"1898b4a4ea43acc71f3700c57d388b800c47c6f36b34d5baaa9df5cb536fdcec","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"4f0f6696be822c6e05c38ada717f1d99790b18f46d88ba4c029e80be93e735d8","scripts/unicode.py":"64a1b919ab0e251fdb1db8b9c5363d84227fca33ac8375268bb88b74c4462f8f","scripts/unicode_gen_normtests.py":"da891d433fa58068747a1cd121774435b7d486394ce5c85c8079b227d20ea507","src/decompose.rs":"04818a6b0271412ec58508e44535b18c58c80384a5836fe5b2c24e489a5ab4cc","src/lib.rs":"3a2b271fa833f159d899875a88172b053a7a57c0d9786d5c6ac96fd82c6d7efb","src/normalize.rs":"c49af1939734065cd089c75c3612f9fec20063fd63ccb97416d8e894f0910b70","src/recompose.rs":"96b8aea91e09f1fa439467378f2d1fa2aa4c81c86e597d3d36a2a35d7750a0d6","src/tables.rs":"449e09a608ed21b3026e4b60fc728244749bc5347c6c4bc72cd34e6c45357555","src/test.rs":"e47de49aeef9231f5ff177eeb9946618577fc67ed798e889b99710c877e92e1b","src/testdata.rs":"8def8bcd8a24c700881c57eab78c6fdf19295969f4783eb4a138f25616519d75"},"package":"e28fa37426fceeb5cf8f41ee273faa7c82c47dc8fba5853402841e665fcd86ff"}
++{"files":{},"package":"e28fa37426fceeb5cf8f41ee273faa7c82c47dc8fba5853402841e665fcd86ff"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..ec1ef20e0aafc39e2e9f3ccd2ba32445543ff1d8
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5 @@@
++target
++Cargo.lock
++scripts/tmp
++*.pyc
++*.txt
index bff4136dff9523c26a14723b017b54a1ad8eca39,0000000000000000000000000000000000000000..a0bae9a9f0f758f038bc209e5a6bc94f208496c2
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"f3e106aaaa534eb9090f1213ff5d0c7f9861ede7f1c973d9e0e13b4a84cb7791","COPYRIGHT":"23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d","Cargo.toml":"1be08526c07c40136071faf603a382456ad1a6bafbb45d9ace01c52b50a9a55c","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"67998486b32f4fe46abbbaa411b92528750e7f0e22452dc8a5b95d87d80fde75","scripts/unicode.py":"762eea92dd51238c6bf877570bde1149932ba15cf87be1618fc21cd53e941733","src/lib.rs":"4a89fadf452ae7c53536eaa4496f951a3153f8189dd1cbc532648731d30f0b11","src/tables.rs":"0643459b6ebeeed83aecd7604f0ea29c06bea7ce6c1cd9acd4988d27ace1ec53","src/tests.rs":"35a459382e190197e7b9a78832ae79f310b48a02a5b4227bf9bbc89d46c8deac"},"package":"8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"}
++{"files":{},"package":"8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5cdcdba3ff80a210b10a0c1cf7a8435f43a1b6e4
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++target
++Cargo.lock
++scripts/tmp
index b9b2f514fdd475a6278f0623105fa07d0c7c49f4,0000000000000000000000000000000000000000..b6383c9a72e1dee2616474628e5398cba0139c4b
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"180cc837b1ea2ce0ed737c2e15208e83abf6f92291a77ed1ebcc564c628c2077","Cargo.toml":"cc09349f0610a327f3562a4c44b9c3889e5a9bf43c290ce436bfb98a4e66b0ed","README.md":"447088161e4b8c6060ae830d41ba2adf3cac2dbd8b1195c618b062878832be82","src/lib.rs":"2cb4bbb6a0c7058e49f5bbc0c1e2f208b5374cf70c495813401a357f9dfad188"},"package":"1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91"}
++{"files":{},"package":"1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8ac5ebd272c10eab3bbad3fb7eaf601fd27d16e9
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,19 @@@
++.DS_Store
++*~
++*#
++*.o
++*.so
++*.swp
++*.dylib
++*.dSYM
++*.dll
++*.rlib
++*.dummy
++*.exe
++*-test
++/doc/
++/target/
++/examples/*
++!/examples/*.rs
++Cargo.lock
++
index 9ab53110b47eb9333f6bcb1e3071ea9936053255,0000000000000000000000000000000000000000..ff848ac9f413d9f460a2cbbe8c1e08d928cca3e9
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"7a0722a759238d2a804e715e4afd3cbe7a2696771fd4e5d6ef9cf8d36354d306","Cargo.toml":"9487d35eec356799c7e06355d25c65275900a546769da368c55e1947e3d38d2f","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e","Makefile":"bffd75d34654b2955d4f005f1a5e85c821c90becf1a8a52cbe10121972f43148","README.md":"eb3f4694003f408cbe3c7f3e9fbbc71241defb940cc55a816981f0f0f144c8eb","UPGRADING.md":"fbcc2d39bdf17db0745793db6626fcd5c909dddd4ce13b27566cfabece22c368","appveyor.yml":"c78486dbfbe6ebbf3d808afb9a19f7ec18c4704ce451c6305f0716999b70a1a6","docs/.nojekyll":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","docs/404.html":"f61e6271c1ea1aa113b64b356e994595fa548f0433f89948d747503ad22195cd","docs/index.html":"f61e6271c1ea1aa113b64b356e994595fa548f0433f89948d747503ad22195cd","github.png":"b432fd855efe7c430fe6a57ccf83935c1996f03a7cdc8d6e1b34154b8c43f6ec","src/encoding.rs":"7fb43e1c109bf9f2a80a05525082f90e79dba8e8056547571c49fba074406d39","src/form_urlencoded.rs":"0778240691a4b501dc1bde94e03b60e933f8f3f163025ef5dcf124fd946845e2","src/host.rs":"76474c04c3b998ce6891d6c7e8ef30fd4680308da8e451c0052655835588bd5d","src/lib.rs":"c433461a2fe3b37ff3f4b1f078ea40ea159d368b315c734f081f4ee770e3998c","src/origin.rs":"76b91ec7522e4a578c3d848541e3c1e08fba8cc0d5a5baabf829797dacc2275d","src/parser.rs":"670f1c36b1e1c2af0456af45196d23fd7b3d83d4f574e23d7ba536eb0003fa73","src/path_segments.rs":"85e16d4e3a7bf4162b2ddd6a14beda0d753395da7c8efe208c52862fc2b21221","src/percent_encoding.rs":"d8f9c2cc18615f705898b4d5e2b8e41506c9639190c74b1615b5f42ea41bafe3","src/quirks.rs":"1231f965e22bb3632c22993e2a8d4c7470bcb4a8de25d049f31784303f0def03","src/slicing.rs":"4e539886b23945a92094625f3e531a4bff40daa44240b5d19ee8577478c4f7fe","tests/data.rs":"c333766897f6492fb6583ab5c8a511973b7a55f58ca550799432343da64d5ca7","tests/setters_tests.json":"ebcbdb52e9a4b5a565f8806d52ebc610d46a34df883e10b0be080d026468ff73","tests/unit.rs":"9cc21b36e7dba8bec4af465cd0b2c1ed3c015cd3c0f85d610aef39109afeb2c4","tests/urltestdata.json":"430c74aa3a31afaa57a92805544e00825f4dffe2def98c1e3c212c3db80268af"},"package":"3e2ba3456fbe5c0098cb877cf08b92b76c3e18e0be9e47c35b487220d377d24e"}
++{"files":{},"package":"3e2ba3456fbe5c0098cb877cf08b92b76c3e18e0be9e47c35b487220d377d24e"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..0284c25cc7cdff24c9c6b81e6fe1e5f53cfe2f34
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++target
++Cargo.lock
++/.cargo/config
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c30fdcf0cee31c34a6b2ed3b324997051c3dfe1e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,48 @@@
++[package]
++
++name = "url"
++# When updating version, also modify html_root_url in the lib.rs
++version = "1.4.1"
++authors = ["The rust-url developers"]
++
++description = "URL library for Rust, based on the WHATWG URL Standard"
++documentation = "https://docs.rs/url"
++repository = "https://github.com/servo/rust-url"
++readme = "README.md"
++keywords = ["url", "parser"]
++categories = ["parser-implementations", "web-programming", "encoding"]
++license = "MIT/Apache-2.0"
++
++[badges]
++travis-ci = { repository = "servo/rust-url" }
++appveyor = { repository = "servo/rust-url" }
++
++[workspace]
++members = [".", "idna", "url_serde"]
++
++[[test]]
++name = "unit"
++
++[[test]]
++name = "data"
++harness = false
++
++[lib]
++test = false
++
++[dev-dependencies]
++rustc-test = "0.1"
++rustc-serialize = "0.3"
++serde_json = ">=0.6.1, <0.9"
++
++[features]
++query_encoding = ["encoding"]
++heap_size = ["heapsize"]
++
++[dependencies]
++encoding = {version = "0.2", optional = true}
++heapsize = {version = ">=0.1.1, <0.5", optional = true}
++idna = { version = "0.1.0", path = "./idna" }
++matches = "0.1"
++rustc-serialize = {version = "0.3", optional = true}
++serde = {version = ">=0.6.1, <0.9", optional = true}
index c41a5e712c48f4a8c983d1b12e60c05896876f4d,0000000000000000000000000000000000000000..de403179ded73c575906909ab8b4d4587f087c16
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"56857d1d8a20ad92e2ba04c0a239b6c80e5de7e93a94da7fba78d84b80b0e6d4","README.md":"0f296ffa0eece6393079cb43dd94ecb064f9d6f8bcca2310ecac6c75b5b74be6","build.rs":"5880159389af1b9ab6d88e9f6206ab265dba0f4ded68b5689a0809c182d347f6","src/lib.rs":"e7f755ec0816d0142a4f25f6dc2f816aa452898709f6e5acc538529025127be9"},"package":"4ef4711d107b21b410a3a974b1204d9accc8b10dad75d8324b5d755de1617d47"}
++{"files":{},"package":"4ef4711d107b21b410a3a974b1204d9accc8b10dad75d8324b5d755de1617d47"}
index 3aa22904ff5d49715a43fd55987fa23d08ae809d,0000000000000000000000000000000000000000..9ef3d4787a9e4544f9f7e194ff54b4c4585d8141
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"226c048238f7daed2021c02fe40fbea25a29614045af8d015d9066e067cea172","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"f545c29caba39eb0432b9348e0d7c1f4255078f92df620550ee7b833ce41ece3","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","Makefile":"a45a128685a2ae7d4fa39d310786674417ee113055ef290a11f88002285865fc","README.md":"22d0566e76148a800fa0403f5de90a72de7beee5e09a40a8ab659ec1309ee0c5","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","benches/bench.rs":"584fefa78c1d0041e1eae4f04a7112864ddc4f39a62ce16e4de73c6df6857d66","ctags.rust":"3d128d3cc59f702e68953ba2fe6c3f46bc6991fc575308db060482d5da0c79f3","session.vim":"95cb1d7caf0ff7fbe76ec911988d908ddd883381c925ba64b537695bc9f021c4","src/char_utf8.rs":"e8125d4809fb94ac9ebc57bdf67b2dc61c9f356d76dc154576064937095e1915","src/lib.rs":"3d0d5c180320442a326f3fe2907bf85711960be596bd3a54512755198f5c6922"},"package":"a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"}
++{"files":{},"package":"a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d24edbd878654bdd87ebf388b33296131ad53acb
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,9 @@@
++.*.swp
++doc
++tags
++examples/ss10pusa.csv
++build
++target
++Cargo.lock
++scratch*
++bench_large/huge
index f98d19b3fc8b15831a63d1dce40a86f3ec83fa42,0000000000000000000000000000000000000000..d2999c8575c14e9606d2e989b4e38125b774de43
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"efb6a811205188b9caafb2500fc6ef00ae4ffae6798adbe316230797be51b168","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"2f28e69bcdd91620ffb72fb8f1bfe840e5c3fdcb2918abe1d73ca852d1f55f1b","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","Makefile":"a45a128685a2ae7d4fa39d310786674417ee113055ef290a11f88002285865fc","README.md":"98c7359c2b09f257411b32553c40254ef1df89d8b19cef6217dbb3c25dd3c6c7","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","benches/bench.rs":"584fefa78c1d0041e1eae4f04a7112864ddc4f39a62ce16e4de73c6df6857d66","ctags.rust":"3d128d3cc59f702e68953ba2fe6c3f46bc6991fc575308db060482d5da0c79f3","session.vim":"95cb1d7caf0ff7fbe76ec911988d908ddd883381c925ba64b537695bc9f021c4","src/char_utf8.rs":"e8125d4809fb94ac9ebc57bdf67b2dc61c9f356d76dc154576064937095e1915","src/lib.rs":"c1263642becda4bbbeaf2d29bcce6c934fc326d1c85593ab67886eeba392a001"},"package":"662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122"}
++{"files":{},"package":"662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d24edbd878654bdd87ebf388b33296131ad53acb
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,9 @@@
++.*.swp
++doc
++tags
++examples/ss10pusa.csv
++build
++target
++Cargo.lock
++scratch*
++bench_large/huge
index 065b43bed65a4f5d60aa435e87787fddd5966924,0000000000000000000000000000000000000000..a95d05ea179024f340157c15e19d26842d78607c
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"dcc6567f3038296b238e98dbb1eacdf1d5b3b17a7f546587459a99e08430fa8c","src/lib.rs":"014b14d8d4c8dde130e880767feba4d078138a628471f003d1cb49bae96ec938"},"package":"4ec083fe2a55f0c710db951078348f978d4132a702d45d7e4702ed9221f5acad"}
++{"files":{},"package":"4ec083fe2a55f0c710db951078348f978d4132a702d45d7e4702ed9221f5acad"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..01a4d84a9789f62116b1e2f97bcf8d2ba22b4b14
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,18 @@@
++[package]\r
++name = "vcpkg"\r
++version = "0.2.1"\r
++authors = ["Jim McGrath <jimmc2@gmail.com>"]\r
++license = "MIT/Apache-2.0"\r
++repository = "https://github.com/mcgoo/vcpkg-rs"\r
++documentation = "https://docs.rs/vcpkg"\r
++description = """\r
++A library to find native dependencies in a vcpkg tree at build\r
++time in order to be used in Cargo build scripts.\r
++"""\r
++keywords = ["build-dependencies"]\r
++\r
++[badges]\r
++travis-ci = { repository = "mcgoo/vcpkg-rs" }\r
++appveyor = { repository = "mcgoo/vcpkg-rs" }\r
++\r
++[dependencies]\r
index f582327788c9e05b2e67ba3d5b3ac0279abf7190,0000000000000000000000000000000000000000..1981dcac667bdf894f901ca0f47b6c4c4faefc19
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"ad9b1a707a5c6bcc7c43fddb17a76f633893b0e6fa6891d99415704ae5ca58c2","Cargo.toml":"ea686f87a150a8e43c4b7db57c56d3eda2a4963420d5570d91d99d7d610dd3fb","README.md":"f85783a6fcf9ecc19edabd710775a88430d9e886f46728bfd7d65cef55ff3e73","src/lib.rs":"7ab8269f30715c0729b0e04e5a09be4c413664dc4b530746ea3240ac80a64c66"},"package":"6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"}
++{"files":{},"package":"6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8ac5ebd272c10eab3bbad3fb7eaf601fd27d16e9
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,19 @@@
++.DS_Store
++*~
++*#
++*.o
++*.so
++*.swp
++*.dylib
++*.dSYM
++*.dll
++*.rlib
++*.dummy
++*.exe
++*-test
++/doc/
++/target/
++/examples/*
++!/examples/*.rs
++Cargo.lock
++
index 84d20af66b1f7ceb4feb0588a25389e399ff9ed7,0000000000000000000000000000000000000000..b8bde7066ce6d44fbb96e74fbcb6a53333de057a
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"d15a0464554e57323507a2ff34925a2c592f3dffec9beb092c7ce985440f5bda","LICENSE.md":"fd232cfaeeff018cd3b9f22e0279b1c2237742999277596638800e967f6e4a29","src/activation.rs":"0e25834dfecd59391e2ecfdaa2e01bb5ac4d181778b47d0b9f67c56a6b2bd75f","src/audioclient.rs":"8c645d4ddb171620a527bcc14fa2904ff9aeb529262e68a0a9957d2ed77118be","src/audiosessiontypes.rs":"ba8cd1950cdab112861208ac1ecc35e656cbbe36e60c31315e547cfe47707685","src/basetsd.rs":"7b879d3164d5e6ec1b94d18a6b58f74a7f4e62fc279df32126e76c4f3138239d","src/bcrypt.rs":"05fe44190a37dd744bff8fc682f25a47c5f4239d417b213d18542aaa19b08b06","src/cfg.rs":"057ace203f04f8c09b6f68fefba7d3eb6644c46f2e44ca8f1364a8bc3bdd4970","src/cfgmgr32.rs":"714289f058283fc89fc79bbd4932bdbc0e9a88edd62a1787aac82c338f2dfb45","src/combaseapi.rs":"45458b1e0d918b237afd7e9581e2714b58ee009a91bbec45827694d1159a2e8b","src/commctrl.rs":"c0173aabd50f34a85c2523876fa0191d052d1d0c157f95ed228d98508806cc7d","src/commdlg.rs":"e75f64491eea54f651884eb3cc5353588c7fe54b086b43557d6d4917abbf95cd","src/corsym.rs":"301f937c7cb394675b2127a24595beef261d269d8f7cb45d6b4ac21a063985e3","src/d2d1.rs":"e7aa08883d85e2631f5327541e644b650ad009095daadef606bb06d9ac99afd3","src/d2dbasetypes.rs":"5a26048c997a580d8bb2a3512f1cb20dba411da99ffd6b23f4b0615ab9378058","src/d3d10shader.rs":"d6edf923fa8442be35b7f4ebebcd2e4bec4c3842ed5aee4bfd05c2de11edc4e0","src/d3d11.rs":"3f2f681357730df7ea954fb78903f0f0ad0bb3b577727307e751fd9598a4e837","src/d3d11shader.rs":"29612cc75ba238e2cd691fdcc01be9c79ca12b046e207d3cbfc5af23f04c4cb9","src/d3d12.rs":"906e512385e78756fe84f9a9622c510ce5a6daeb121127cf93f11af0f2fa3763","src/d3d12sdklayers.rs":"b50edb48a1c51bc7e3bf7176733c3dad4eb45a4e9747096e3b5a723052e130c8","src/d3d12shader.rs":"ff58932ef32c108348e41864f09ac6f909d641cac4f94c3e4f6c3dc4e5916521","src/d3d9.rs":"e01614130a4d68bb6e2a23f62ffb4d5016381e9026f8477aaca64851c8dcad53","src/d3d9caps.rs":"d4bcf91b7ae307388c91c19eacdb808506faea184b03178feee5c47959211b7b","src/d3d9types.rs":"1e10aae6297bc8dc083b111da496313ff19dcb9b88450e2637f8e98c0401519c","src/d3dcommon.rs":"f841b2e4df6dfccb9eb1955add24689db7b173780ec25e99b89097140a012152","src/d3dcompiler.rs":"02269410bd7f83f49391f852320ca0d76fd8d907ed22c68a003af65b3f5ab54a","src/dbghelp.rs":"c0ea5bcd04f414a696cd876439a7c4d6ee63627f4662705d189fd6e0412622f8","src/dcommon.rs":"8889ca66e2f89f1c275e5d6b7d6b203e7f25b4e7a262689b2ec6f04b9d1b5ae8","src/devpropdef.rs":"74948513ed623d3bdf1ea3fbf1f540b3e9e46efb9c1674ecccfe7f2fae5792f2","src/docobj.rs":"43e214d9d0c436a88ed2c620b8386e58e4d549ba9c8be51bf52291caf95e225d","src/dpapi.rs":"d44a1a6c9e52b34e8e87df1079b97081c646f07d0eee51f0d0cf66ae1c6fd58a","src/dsgetdc.rs":"5911c35ef3d80a5162fdbea6902f9b07033b746ff91bff2657a0971edb07bff2","src/dsound.rs":"53a5532d645e1b7995f0b4a0f0711fc66da8a27b7f8c87ce3d9e0882cfdca07c","src/dsrole.rs":"50b27a8afb11188ce24ab49620fe69ea21658148d8fd6076b8927175db5c1a9e","src/dwmapi.rs":"e65ca961eec0db275e211e04c59a8995c8c13d36ab08dc36ce197d9a4856266f","src/dwrite.rs":"f138d36e8b93778a7866cc755893b4da19cfd6ce42427139589a0bbaa294eb44","src/dxgi.rs":"5b6fcc5c665df1c0c6ed3de5d678a7bade1bb8ab1acbe952b784ce99fc817e53","src/dxgi1_2.rs":"6ba44755d715f2493236103fc5c24d7d45dff2e1fc3690aefbd4eb6c859dbc07","src/dxgi1_3.rs":"1f86a9db5fd45199fcc3ce56423e5fcf0c58df4001e2b50c5586d38ab820b78f","src/dxgi1_4.rs":"c578e6fcb82d535b20fc10232b75a7b9512d068919cc1e3f1c7cf55f3eb46460","src/dxgiformat.rs":"2e73df34f480b6ef3b5e21de0a520dacec91b00772e42786568fd162ca5e9aa6","src/dxgitype.rs":"204b8dae38c13a1dd8cd2ce6ca68851f743b416213d6db1cd0d96808bcbf7058","src/errhandlingapi.rs":"a70f9db3dd8ab60aba0daf39f12b527e54e312ca640e0b80d80c93ffdb6913c6","src/excpt.rs":"b07cf9ff0d23dd50c0776d048d0c579e401b7d729635f78998f85d35f33f05a4","src/fileapi.rs":"d31814c612bbd9372abbf6f8455fc2af89ac236c6b1855da10d66545e485ec57","src/gl.rs":"9429708bb97aeecb2c40030460ed0c3415fc0f2335c9513c68afa6157bd9b465","src/guiddef.rs":"86618dcd39c77048c7e453e6e86dafe90358eb7f97144f9672ae09e7b9855729","src/heapapi.rs":"21e420ba7641e507e8f2801d2b0ed25dbcb98e967924d711beb5cbfa8a5785e4","src/hidclass.rs":"a93380d35dc4d45807b10bbd69ee63eb8517b75989b68391685070a2fcfbefa1","src/hidpi.rs":"0b641fc119ac35761fe8e5eaed9a0781e9018598ea269d6cd386dbf5563ab9a0","src/hidsdi.rs":"50abb938ea8d0af90ccdea7ac3de4bc10fe42e34bc6a6d6eb4da1b330727da34","src/hidusage.rs":"44adc029bc89f0d4977b1295b7e998ddabf5283de66e1e33146bda8968d1d98b","src/hstring.rs":"51b3e63e3f1ed48f54c63c3e820e0563fb857b2743529d5f947f718d43425b89","src/http.rs":"ebb8b8db9e786e2683ad8b9a9066ef418df773ae7ce4d75f166cb5321f85f5a0","src/imm.rs":"b9277502f17f4cc6bde4f80f722ec1b976913355edbf162814ccfec2b3b080fd","src/inaddr.rs":"938143669da02c83a31d207be11e2176ed5219edf0e6f8f7a5534a5c6c3ce8d1","src/inspectable.rs":"b01f1814a233a77bf9f25c264747252c0464388c7d9c7302e5bde57502b8139b","src/ksmedia.rs":"acb96b1ea0cf3b5397f9037958093c6b4dbb54c4246516e57b9fed055e8e69c1","src/lib.rs":"8a7840b030f56883f68bdf90a1a04df8be2a5e2698a9ea86c73fac59c9f09b6e","src/libloaderapi.rs":"21a5d17c9f8ac4c006b515979964a8870f30710be4482083f45c6a41a16a36ce","src/lmaccess.rs":"712661c871569513334152bdcdf56c07776c560a22cd5b892a0f38e1957e28db","src/lmcons.rs":"3449aab4399cc36e7d7db551e384d82dfa4204178c4cfb9642f90645687fbc81","src/lmdfs.rs":"c351cdb2d10bf3a7c5ce7400dcdca41a792554e21e75fa9e5378ac18d8d3e4e7","src/lmerrlog.rs":"7937928544d27575e302c5e9c5e6803e9033e1f4d715e7ca29be202276d7d7a6","src/lmjoin.rs":"362cdc71f3f50099b862eff0733b3a57dd0f95cac15943135f794424f651b916","src/lsalookup.rs":"4aef1a95033444181f2b2b9df364ea165b0fdedb396c63e5d12db6b7398a3d5f","src/macros.rs":"5dacc570f226b6f1ad31d76a03675f0d182a3d578846920000fabb7cd92fc7f8","src/memoryapi.rs":"2273b8bfd7fc36dcf654c320826952ad502e8922a84174f8c1f7ed08aa555a04","src/minschannel.rs":"139828de63a0a4476de2bee454f5bca5e8a46cc29f1680339bb2804ee2d17322","src/minwinbase.rs":"6cd387a7f79e1a708bc48b5b27eaeaa7aadf0fff7a5e0a76cda0bdf3fa871863","src/minwindef.rs":"47ba4f2ec7789109ae339170715ed76288ae60ee57a4f06d5cc50a0e6855699f","src/mmdeviceapi.rs":"c8b7f7b6b78488d23ccba2b34e8765eac60ec9f08e19c96b377d957f65b1b6d1","src/mmreg.rs":"1621fad6eaa16d1e5ca95055fd11bf066b777b1343625f9fdc74e4d313d60dea","src/mmsystem.rs":"f6a2bff3bf80af1468de2c2a5f7ff2ced2b625adaf24f08f9b303965ed5ee371","src/mscat.rs":"9226a8e30546c4142e4fcdc716f8a15cc7c8081c9e875ec72ff9e8551f86f9a1","src/mssip.rs":"d7e2b91e358ff4986e700396d04f92aa1671aafada0d4889914a413177c091e1","src/nb30.rs":"dd85d7849111f04d33895835269929dc219e04de4373e91468eb053e3e0a5c52","src/ncrypt.rs":"29f168dcddeaa2cb231a7174cec672be83cca192ffc4632cead4c4a25189fb49","src/ntdef.rs":"3be66042d16a862f0fed8f48406b08c3091fbf92885a44efb7747f4a764d7de7","src/ntsecapi.rs":"dfb2cc7e23e8b20fa5ffd30ccecdb81b62d8ffeb68fdf99f93fb141ff4155afd","src/ntstatus.rs":"de6208f4e119a6405c1726433ea5e47a8b5f46b345f5809e9f580cce88360a79","src/oaidl.rs":"640c911e39888928baf77145cca34c1a768bfd759ec9709f70649a2946cb3246","src/objbase.rs":"7c9edb6a9ea72baddb15a6aec3602b3f9e7b1ce969dd655f440eae0ede1372e2","src/objidl.rs":"2a623b989f2a216edca3bd118eceff41267632839a3fd4410df9a7c126a87b64","src/objidlbase.rs":"3415a0bcd1b5b63ff48e17138ff87dae7c31eaeb323ae81f34b6712efade1d04","src/olectl.rs":"da2014c3d5858c5abff1635e1b8c8223333e7d22d28cac614aac3305a7f04ee4","src/pdh.rs":"eb01459c2acc456ecd204c6716d26027a6c77c2b4a9b698d3c922254fe2cc319","src/playsoundapi.rs":"7efddfc8601de565946c8c93074211c83b20866a1588e36e0518bba9864d0cf0","src/processsnapshot.rs":"df99a56280e6e41c5896341ffa1abe734f6c8662f4d7ea960cb97fb34c5b85d9","src/processthreadsapi.rs":"bf8edf8984ee97bc5054e68d02ec4633b5f15720602ab19c95d78e7d420c9cc8","src/propidl.rs":"88b5f176e4624063cadd8db95db52bf07cff421d73a8cfe319f992a9c99cd315","src/propsys.rs":"05c411639479f88e77383c585117a886f48ea7453260210db9f283e2cafdffbf","src/prsht.rs":"f862538c0010a51a02e5f24b3a44b54ba5993c32400b98a3b0558741ae7473a3","src/psapi.rs":"512523c5f8334c9ad221a73776c0ed2da93d8e2353dc4d2cee951ffa6ea7c163","src/qos.rs":"9ef6183b7c03b5b412f81f38ebb06048ff6266032bc236964dd994f173b82ec4","src/reason.rs":"c92aded3bbea859f110eed73b9b0fb40df6ac4a6ed6431ca69882b46b5ad5229","src/restrictederrorinfo.rs":"b8c53f4ae149ea806028cdafe699390a20202d72028b5f62836bcbf97720d133","src/roapi.rs":"dbbefb19f402a2aece66b500739b0a9e2c4d0133a8bc94d076510d5a67def175","src/roerrorapi.rs":"84a0a71a3f9ce67a577954ee5761cbd97d892eb5e7eb2c381f6bd29d4e1d4af7","src/rpc.rs":"e2293651222edf37f3ad3076adaae9033b25b06bd7b88ed7372585a4ae46c7d9","src/rpcdce.rs":"de77ca3c9b689ffaaf395a6882d3dfc3a1cec181efa6cb6075e605e4462bc3f6","src/sapi.rs":"05dbc1166b836251538c9e52a772fa584a1d0a1ad823e4336ab5e6cfefb96d57","src/schannel.rs":"e48926896227ffae5033bd634a7c71f5359d7a08b7b8c6e94e03864d87a37f8b","src/servprov.rs":"f086b4330162c7da711ea59d7023304a8fa2a53470b54d846ea1c11567703693","src/setupapi.rs":"4959862dd39597cd711022fcefbaf5c75b61410d57d04e9dbec2ddf7a2fa6f31","src/shellapi.rs":"ce3e3e7cd8aefe8068d6c51256827c0c3d51a449e4ab73e7125ea28d44dd6b6d","src/shellscalingapi.rs":"59c162b0215ff4b71b3535b6e142cca8cd99028031f47f0a6efb960c160a8776","src/shlguid.rs":"dcb7a1ada1b1b90f405e6dea8bcf1fc6994725b49a3165b7908670b2c31490e5","src/shlobj.rs":"53ff059ec6123001bed8f007c36e40812f83e4e04bd50b371319d10b4e38c36f","src/shobjidl.rs":"953d6ef4dc2a0d175d7133dc2f41255123ab8f778b22feaebd8ca1fa77356aa7","src/shtypes.rs":"ff785004e819bcfc521ab79327e58f98debab4e40c20412bbecdcee1b2801371","src/spapidef.rs":"9abe751425b6aaac7e4a7ea49f6d8e859f8f73164abd4d69b48e3e224d7de829","src/sql.rs":"004ed353b40bb4bceab55d6e8c33063a8eac992b076e47e6ead8303dbbc5b67f","src/sqltypes.rs":"0c5fa183c9f5b9e16e292de6a9afdf73f554730e651250856148ac04718803b8","src/sspi.rs":"dbd9d544abea4396983867ef4f7fbe2588673cc953dbeb74e7edc46503b16fa0","src/strmif.rs":"168040999cf99843cc1447988e46c56481a7a343ae41ab854db40ef566fa1119","src/subauth.rs":"183dd0df6436e9f0e859d62ca78e8ed42d4c1a5dc0690dcf22d42467fd2e0700","src/synchapi.rs":"cfce677c85377a340cb9307d9ac9eb06ffe9fd5e2ce08ed4a0390729e3a7d717","src/sysinfoapi.rs":"9a5579143263ce20d8c365b9874a0ae90ef28bc3295eab26ba3782efa48b464a","src/threadpoolapi.rs":"57876ea70b86d08663f7916ce076547f17596c26b8bf4dfafbad60e78264ff95","src/timezoneapi.rs":"5ccd80e6d16a858c56e20a7f3c5570e29777dab0fdfc057b6d2fb06463d56eb3","src/tlhelp32.rs":"c96ef7416bceab473463cc4ad98f037aeaac87bb7adf45cc16c281308537e82f","src/unknwnbase.rs":"2708c19491deb7364100025f3bb88a791c219551a65af70a776f8f3c5bf18b05","src/urlhist.rs":"8c8c0d0a613e59f68bf0e8cec061ea2126baa98d1479df4d07c8df5e41b50bc1","src/urlmon.rs":"0652e602ef2f5826360e5eab68bdf4f9365827a012c2c89289c54016ea001b74","src/usb.rs":"7e682ee819b237eabe796e604cff2434c450f724f4c86d919683eb7a5167c343","src/usbspec.rs":"d19671960838eb592cda4cd7c84c6f66cd9484f0904b5a28e1d8fd91e9c2c6af","src/usp10.rs":"baa2c1ef6ca5f064bc55b24f39c0553ede45a87b9183318572916fd4f1c679c6","src/vadefs.rs":"0e2f12fd1c521a943908669b2d10fceea409bac45242ec6e87c0e69706c1b3d0","src/vsbackup.rs":"af71cb851bd7eacde9d3e46a112497baef3ecebb472aae3c76c7faff804d33f9","src/vss.rs":"a626613810a69309b8f50d0a3bd75928d9de771c2287b6242487cb8cd55394a0","src/vsserror.rs":"f06b108d66ea9f06ad15d83b981117ed6a2a9cd218bb3bf53f13b0055acd9b2e","src/vswriter.rs":"8c4f5d27fa0883d187506538136cc610074941bb952afbe0984f7cb7c3c656f7","src/werapi.rs":"a2d692514ff3a61126971c5c2c5a7298c0f822559550a7f14501f8c96d1d951a","src/winbase.rs":"e224c40d827b1f1a9c74643c000f71e87ad18f749810cc611425af325c9472b8","src/wincon.rs":"402c5ebf80aa6ab1002935b7ddca17e8a243d0c714982054395862fe0ae40a04","src/wincred.rs":"e5fa987622dd880151ae190bb45daa666ffae3ae8e2da97407210afe01dd93d6","src/wincrypt.rs":"f7f8743b6a89d3f5e8b07405e43010bb3729aa8a8cf4546cc02705f802947ebc","src/windef.rs":"89fa9f5ab2909a4840f16979ebbc0afa2134abcb1d47cb7435b581f31b227658","src/windowscodecs.rs":"7c63bc4e2d0e7ce60c7bb13b93ef5aa12213f71a46845b6e034a9c224ef3eb3c","src/windowsx.rs":"414a9a841590f88804da3eb9ba55d583372a467cc50ab1ebdd7cfc653ce5f627","src/winerror.rs":"f3882eba4e299acbdedd548feb1ff89de958fb72d665bd6ba013b6a1f7596b52","src/winevt.rs":"64ae96f475ed98da7a84704d53d16caccbac2dbd525de0ef0f65fc58a6775ed1","src/wingdi.rs":"35aa9dd14b4b4c5a227ac3df0d312c19cbaede2d1388c26ad8eb910e80efeafd","src/winhttp.rs":"37769be104a2eb9efa70ffd74c8f38a09d9639cf575a677ad75d941e8d87cd58","src/winioctl.rs":"0f0efe0a41894a325b70428d04aeddec8dd7a87a91489a4e564a248e8498861b","src/winnetwk.rs":"d492c3d14a422f611166d39b895ddc6dd749ebc64a020bf3125af452494f91dd","src/winnls.rs":"90904d6adad70081a620165223fb4a71b64d747596c64d0df7de9511cd0f75c6","src/winnt.rs":"2c51ad0a065006010f1cfe7a3335274304e4747adc63f9798e1ca1f7091154a5","src/winreg.rs":"c687a5c6433daa13793815ef9af8befaedc9635be14eea0c618ad5334952dc31","src/winscard.rs":"78ab1d3ae22e486726740c343a4cc6268ca318de43f4b7d7ba51acbdf1b93936","src/winsmcrd.rs":"62be129c3d4cdea9dd31e769b587f071a94c347c8df71a43bb1eea18d52a60cc","src/winsock2.rs":"21dc0393f37f56c15c59d49a32861fb24c8f28d43ce26b56d958a174a5040a76","src/winspool.rs":"a3bd8e04f2db6118fe529bf52cb856a773cd8b816d197fc8edc8ac942578fd74","src/winstring.rs":"dc535f972d93be2fe067a5ca64edb45b6ad8e4549ecc0ce24486bd94555d5707","src/winsvc.rs":"7999f00b341f3e0e8701ea89f71986a6600650ff8cffdb1292e9f55d47bd0a3e","src/winusb.rs":"0ac355aa879a4aae501db04f1e8859dbef5e33fda9d46a7a12ef25e5524ec396","src/winusbio.rs":"8e2d64832999b59b2ea900396184c36d34cf94c97f31e15916c299213748a3e1","src/winuser.rs":"791bd8625812feccc8ec421489194d635c94cb4c4d754287a0caa54fa8f71c19","src/ws2def.rs":"0a1c7a69e4da8edc0584b0e3fb4ad1fa4aed621510b1bc1b0d104990577c6a38","src/ws2ipdef.rs":"c6a898cf25d187ad83e110af1e2286824868691a60818ecc44e68fa0bbbd4ff6","src/ws2spi.rs":"e63da700de55a317769230319eb9e4ec85cc0ac80b2baa076399367338b7ca0f","src/ws2tcpip.rs":"698084fd5d631a2ef236fe76001e7c44afd9b8958243e4ad4c098ac4beb4b352","src/wtypes.rs":"2689e8f442ccdc0b0e1ec82160a5cc3e80abf95dca82855ec595314062774a14","src/wtypesbase.rs":"f6dc0a8b09f3f003339c5dd366bdddb9dd671894be9dcf4a42058b226d2917a8","src/xinput.rs":"e15cd46bf18977481e22d609f8e0bb5508776902d7fa64477bb5b78596c0f67d"},"package":"167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"}
++{"files":{},"package":"167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"}
index 17c79f49bdbddd489acf1e8a818da7b0f87a14f0,0000000000000000000000000000000000000000..4583b01a9e9867d4d3b339439f30d43919425528
mode 100644,000000..100644
--- /dev/null
@@@ -1,1 -1,0 +1,1 @@@
- {"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"982633c62ba05c95429b1768896a54c9a032a40fbd1e11049a9b087e9fd89176","src/lib.rs":"1d88932534b784973d3d87ac18cd8f2a0294ce5166cf30488c68ca90443e1750"},"package":"2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"}
++{"files":{},"package":"2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..09b314af9915fbb8df6d5207dbfa36a39b49bb73
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++{"files":{},"package":"d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
new file mode 100644 (file)
--- /dev/null
--- /dev/null
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..71dc56645d31fa7f86d4455771b6a5e9690976b3
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,17 @@@
++[package]
++name = "ws2_32-sys"
++version = "0.2.1"
++authors = ["Peter Atashian <retep998@gmail.com>"]
++description = "Contains function definitions for the Windows API library ws2_32. See winapi for types and constants."
++documentation = "https://retep998.github.io/doc/ws2_32/"
++repository = "https://github.com/retep998/winapi-rs"
++readme = "README.md"
++keywords = ["windows", "ffi", "win32"]
++license = "MIT"
++build = "build.rs"
++[lib]
++name = "ws2_32"
++[dependencies]
++winapi = { version = "0.2.5", path = "../.." }
++[build-dependencies]
++winapi-build = { version = "0.1.1", path = "../../build" }
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8dd54c8e3b1ca6b53b9a91ca918a33630378e6ff
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++# ws2_32 #
++Contains function definitions for the Windows API library ws2_32. See winapi for types and constants.
++
++```toml
++[dependencies]
++ws2_32-sys = "0.2.0"
++```
++
++```rust
++extern crate ws2_32;
++```
++
++[Documentation](https://retep998.github.io/doc/ws2_32/)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..30b8283bb9ebe993e994a66000e23b459244accc
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,6 @@@
++// Copyright © 2015, Peter Atashian
++// Licensed under the MIT License <LICENSE.md>
++extern crate build;
++fn main() {
++    build::link("ws2_32", false)
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8a1cd4f47e4bd069c06d4c293cdee2ec71665b39
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,483 @@@
++// Copyright © 2015, Peter Atashian
++// Licensed under the MIT License <LICENSE.md>
++//! FFI bindings to ws2_32.
++#![cfg(windows)]
++extern crate winapi;
++use winapi::*;
++extern "system" {
++    pub fn FreeAddrInfoEx(pAddrInfoEx: PADDRINFOEXA);
++    pub fn FreeAddrInfoExW(pAddrInfoEx: PADDRINFOEXW);
++    pub fn FreeAddrInfoW(pAddrInfo: PADDRINFOW);
++    pub fn GetAddrInfoExA(
++        pName: PCSTR, pServiceName: PCSTR, dwNameSpace: DWORD, lpNspId: LPGUID,
++        hints: *const ADDRINFOEXA, ppResult: *mut PADDRINFOEXA, timeout: *mut timeval,
++        lpOverlapped: LPOVERLAPPED, lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
++        lpNameHandle: LPHANDLE,
++    ) -> INT;
++    pub fn GetAddrInfoExCancel(lpHandle: LPHANDLE) -> INT;
++    pub fn GetAddrInfoExOverlappedResult(lpOverlapped: LPOVERLAPPED) -> INT;
++    pub fn GetAddrInfoExW(
++        pName: PCWSTR, pServiceName: PCWSTR, dwNameSpace: DWORD, lpNspId: LPGUID,
++        hints: *const ADDRINFOEXW, ppResult: *mut PADDRINFOEXW, timeout: *mut timeval,
++        lpOverlapped: LPOVERLAPPED, lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
++        lpNameHandle: LPHANDLE,
++    ) -> INT;
++    pub fn GetAddrInfoW(
++        pNodeName: PCWSTR, pServiceName: PCWSTR, pHints: *const ADDRINFOW,
++        ppResult: *mut PADDRINFOW,
++    ) -> INT;
++    pub fn GetHostNameW(name: PWSTR, namelen: c_int) -> c_int;
++    pub fn GetNameInfoW(
++        pSockaddr: *const SOCKADDR, SockaddrLength: socklen_t, pNodeBuffer: PWCHAR,
++        NodeBufferSize: DWORD, pServiceBuffer: PWCHAR, ServiceBufferSize: DWORD, Flags: INT,
++    ) -> INT;
++    pub fn InetNtopW(Family: INT, pAddr: PVOID, pStringBuf: PWSTR, StringBufSize: size_t) -> PCWSTR;
++    pub fn InetPtonW(Family: INT, pszAddrString: PCWSTR, pAddrBuf: PVOID) -> INT;
++    pub fn SetAddrInfoExA(
++        pName: PCSTR, pServiceName: PCSTR, pAddresses: *mut SOCKET_ADDRESS, dwAddressCount: DWORD,
++        lpBlob: LPBLOB, dwFlags: DWORD, dwNameSpace: DWORD, lpNspId: LPGUID, timeout: *mut timeval,
++        lpOverlapped: LPOVERLAPPED, lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
++        lpNameHandle: LPHANDLE,
++    ) -> INT;
++    pub fn SetAddrInfoExW(
++        pName: PCWSTR, pServiceName: PCWSTR, pAddresses: *mut SOCKET_ADDRESS, dwAddressCount: DWORD,
++        lpBlob: LPBLOB, dwFlags: DWORD, dwNameSpace: DWORD, lpNspId: LPGUID, timeout: *mut timeval,
++        lpOverlapped: LPOVERLAPPED, lpCompletionRoutine: LPLOOKUPSERVICE_COMPLETION_ROUTINE,
++        lpNameHandle: LPHANDLE,
++    ) -> INT;
++    // pub fn WEP();
++    pub fn WPUCompleteOverlappedRequest(
++        s: SOCKET, lpOverlapped: LPWSAOVERLAPPED, dwError: DWORD, cbTransferred: DWORD,
++        lpErrno: LPINT,
++    ) -> c_int;
++    // pub fn WPUGetProviderPathEx();
++    pub fn WSAAccept(
++        s: SOCKET, addr: *mut SOCKADDR, addrlen: LPINT, lpfnCondition: LPCONDITIONPROC,
++        dwCallbackData: DWORD_PTR,
++    ) -> SOCKET;
++    pub fn WSAAddressToStringA(
++        lpsaAddress: LPSOCKADDR, dwAddressLength: DWORD, lpProtocolInfo: LPWSAPROTOCOL_INFOA,
++        lpszAddressString: LPSTR, lpdwAddressStringLength: LPDWORD,
++    ) -> INT;
++    pub fn WSAAddressToStringW(
++        lpsaAddress: LPSOCKADDR, dwAddressLength: DWORD, lpProtocolInfo: LPWSAPROTOCOL_INFOW,
++        lpszAddressString: LPWSTR, lpdwAddressStringLength: LPDWORD,
++    ) -> INT;
++    pub fn WSAAdvertiseProvider(
++        puuidProviderId: *const GUID, pNSPv2Routine: *const LPCNSPV2_ROUTINE,
++    ) -> INT;
++    pub fn WSAAsyncGetHostByAddr(
++        hWnd: HWND, wMsg: u_int, addr: *const c_char, len: c_int, _type: c_int, buf: *mut c_char,
++        buflen: c_int,
++    ) -> HANDLE;
++    pub fn WSAAsyncGetHostByName(
++        hWnd: HWND, wMsg: u_int, name: *const c_char, buf: *mut c_char, buflen: c_int,
++    ) -> HANDLE;
++    pub fn WSAAsyncGetProtoByName(
++        hWnd: HWND, wMsg: u_int, name: *const c_char, buf: *mut c_char, buflen: c_int,
++    ) -> HANDLE;
++    pub fn WSAAsyncGetProtoByNumber(
++        hWnd: HWND, wMsg: u_int, number: c_int, buf: *mut c_char, buflen: c_int,
++    ) -> HANDLE;
++    pub fn WSAAsyncGetServByName(
++        hWnd: HWND, wMsg: u_int, name: *const c_char, proto: *const c_char, buf: *mut c_char,
++        buflen: c_int,
++    ) -> HANDLE;
++    pub fn WSAAsyncGetServByPort(
++        hWnd: HWND, wMsg: u_int, port: c_int, proto: *const c_char, buf: *mut c_char, buflen: c_int,
++    ) -> HANDLE;
++    pub fn WSAAsyncSelect(s: SOCKET, hWnd: HWND, wMsg: u_int, lEvent: c_long) -> c_int;
++    pub fn WSACancelAsyncRequest(hAsyncTaskHandle: HANDLE) -> c_int;
++    pub fn WSACancelBlockingCall() -> c_int;
++    pub fn WSACleanup() -> c_int;
++    pub fn WSACloseEvent(hEvent: WSAEVENT) -> BOOL;
++    pub fn WSAConnect(
++        s: SOCKET, name: *const SOCKADDR, namelen: c_int, lpCallerData: LPWSABUF,
++        lpCalleeData: LPWSABUF, lpSQOS: LPQOS, lpGQOS: LPQOS,
++    ) -> c_int;
++    pub fn WSAConnectByList(
++        s: SOCKET, SocketAddress: PSOCKET_ADDRESS_LIST, LocalAddressLength: LPDWORD,
++        LocalAddress: LPSOCKADDR, RemoteAddressLength: LPDWORD, RemoteAddress: LPSOCKADDR,
++        timeout: *const timeval, Reserved: LPWSAOVERLAPPED,
++    ) -> BOOL;
++    pub fn WSAConnectByNameA(
++        s: SOCKET, nodename: LPCSTR, servicename: LPCSTR, LocalAddressLength: LPDWORD,
++        LocalAddress: LPSOCKADDR, RemoteAddressLength: LPDWORD, RemoteAddress: LPSOCKADDR,
++        timeout: *const timeval, Reserved: LPWSAOVERLAPPED,
++    ) -> BOOL;
++    pub fn WSAConnectByNameW(
++        s: SOCKET, nodename: LPWSTR, servicename: LPWSTR, LocalAddressLength: LPDWORD,
++        LocalAddress: LPSOCKADDR, RemoteAddressLength: LPDWORD, RemoteAddress: LPSOCKADDR,
++        timeout: *const timeval, Reserved: LPWSAOVERLAPPED,
++    ) -> BOOL;
++    pub fn WSACreateEvent() -> WSAEVENT;
++    pub fn WSADuplicateSocketA(
++        s: SOCKET, dwProcessId: DWORD, lpProtocolInfo: LPWSAPROTOCOL_INFOA,
++    ) -> c_int;
++    pub fn WSADuplicateSocketW(
++        s: SOCKET, dwProcessId: DWORD, lpProtocolInfo: LPWSAPROTOCOL_INFOW,
++    ) -> c_int;
++    pub fn WSAEnumNameSpaceProvidersA(
++        lpdwBufferLength: LPDWORD, lpnspBuffer: LPWSANAMESPACE_INFOA,
++    ) -> INT;
++    pub fn WSAEnumNameSpaceProvidersExA(
++        lpdwBufferLength: LPDWORD, lpnspBuffer: LPWSANAMESPACE_INFOEXA,
++    ) -> INT;
++    pub fn WSAEnumNameSpaceProvidersExW(
++        lpdwBufferLength: LPDWORD, lpnspBuffer: LPWSANAMESPACE_INFOEXW,
++    ) -> INT;
++    pub fn WSAEnumNameSpaceProvidersW(
++        lpdwBufferLength: LPDWORD, lpnspBuffer: LPWSANAMESPACE_INFOW,
++    ) -> INT;
++    pub fn WSAEnumNetworkEvents(
++        s: SOCKET, hEventObject: WSAEVENT, lpNetworkEvents: LPWSANETWORKEVENTS,
++    ) -> c_int;
++    pub fn WSAEnumProtocolsA(
++        lpiProtocols: LPINT, lpProtocolBuffer: LPWSAPROTOCOL_INFOA, lpdwBufferLength: LPDWORD,
++    ) -> c_int;
++    pub fn WSAEnumProtocolsW(
++        lpiProtocols: LPINT, lpProtocolBuffer: LPWSAPROTOCOL_INFOW, lpdwBufferLength: LPDWORD,
++    ) -> c_int;
++    pub fn WSAEventSelect(s: SOCKET, hEventObject: WSAEVENT, lNetworkEvents: c_long) -> c_int;
++    pub fn WSAGetLastError() -> c_int;
++    pub fn WSAGetOverlappedResult(
++        s: SOCKET, lpOverlapped: LPWSAOVERLAPPED, lpcbTransfer: LPDWORD, fWait: BOOL,
++        lpdwFlags: LPDWORD,
++    ) -> BOOL;
++    pub fn WSAGetQOSByName(s: SOCKET, lpQOSName: LPWSABUF, lpQOS: LPQOS) -> BOOL;
++    pub fn WSAGetServiceClassInfoA(
++        lpProviderId: LPGUID, lpServiceClassId: LPGUID, lpdwBufSize: LPDWORD,
++        lpServiceClassInfo: LPWSASERVICECLASSINFOA,
++    ) -> INT;
++    pub fn WSAGetServiceClassInfoW(
++        lpProviderId: LPGUID, lpServiceClassId: LPGUID, lpdwBufSize: LPDWORD,
++        lpServiceClassInfo: LPWSASERVICECLASSINFOW,
++    ) -> INT;
++    pub fn WSAGetServiceClassNameByClassIdA(
++        lpServiceClassId: LPGUID, lpszServiceClassName: LPSTR, lpdwBufferLength: LPDWORD,
++    ) -> INT;
++    pub fn WSAGetServiceClassNameByClassIdW(
++        lpServiceClassId: LPGUID, lpszServiceClassName: LPWSTR, lpdwBufferLength: LPDWORD,
++    ) -> INT;
++    pub fn WSAHtonl(s: SOCKET, hostlong: u_long, lpnetlong: *mut u_long) -> c_int;
++    pub fn WSAHtons(s: SOCKET, hostshort: u_short, lpnetshort: *mut u_short) -> c_int;
++    pub fn WSAInstallServiceClassA(lpServiceClassInfo: LPWSASERVICECLASSINFOA) -> INT;
++    pub fn WSAInstallServiceClassW(lpServiceClassInfo: LPWSASERVICECLASSINFOW) -> INT;
++    pub fn WSAIoctl(
++        s: SOCKET, dwIoControlCode: DWORD, lpvInBuffer: LPVOID, cbInBuffer: DWORD,
++        lpvOutBuffer: LPVOID, cbOutBuffer: DWORD, lpcbBytesReturned: LPDWORD,
++        lpOverlapped: LPWSAOVERLAPPED, lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
++    ) -> c_int;
++    pub fn WSAIsBlocking() -> BOOL;
++    pub fn WSAJoinLeaf(
++        s: SOCKET, name: *const SOCKADDR, namelen: c_int, lpCallerData: LPWSABUF,
++        lpCalleeData: LPWSABUF, lpSQOS: LPQOS, lpGQOS: LPQOS, dwFlags: DWORD,
++    ) -> SOCKET;
++    pub fn WSALookupServiceBeginA(
++        lpqsRestrictions: LPWSAQUERYSETA, dwControlFlags: DWORD, lphLookup: LPHANDLE,
++    ) -> INT;
++    pub fn WSALookupServiceBeginW(
++        lpqsRestrictions: LPWSAQUERYSETW, dwControlFlags: DWORD, lphLookup: LPHANDLE,
++    ) -> INT;
++    pub fn WSALookupServiceEnd(hLookup: HANDLE) -> INT;
++    pub fn WSALookupServiceNextA(
++        hLookup: HANDLE, dwControlFlags: DWORD, lpdwBufferLength: LPDWORD,
++        lpqsResults: LPWSAQUERYSETA,
++    ) -> INT;
++    pub fn WSALookupServiceNextW(
++        hLookup: HANDLE, dwControlFlags: DWORD, lpdwBufferLength: LPDWORD,
++        lpqsResults: LPWSAQUERYSETW,
++    ) -> INT;
++    pub fn WSANSPIoctl(
++        hLookup: HANDLE, dwControlFlags: DWORD, lpvInBuffer: LPVOID, cbInBuffer: DWORD,
++        lpvOutBuffer: LPVOID, cbOutBuffer: DWORD, lpcbBytesReturned: LPDWORD,
++        lpCompletion: LPWSACOMPLETION,
++    ) -> INT;
++    pub fn WSANtohl(s: SOCKET, netlong: u_long, lphostlong: *mut c_long) -> c_int;
++    pub fn WSANtohs(s: SOCKET, netshort: u_short, lphostshort: *mut c_short) -> c_int;
++    pub fn WSAPoll(fdArray: LPWSAPOLLFD, fds: ULONG, timeout: INT) -> c_int;
++    pub fn WSAProviderCompleteAsyncCall(hAsyncCall: HANDLE, iRetCode: INT) -> INT;
++    pub fn WSAProviderConfigChange(
++        lpNotificationHandle: LPHANDLE, lpOverlapped: LPWSAOVERLAPPED,
++        lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
++    ) -> INT;
++    pub fn WSARecv(
++        s: SOCKET, lpBuffers: LPWSABUF, dwBufferCount: DWORD, lpNumberOfBytesRecvd: LPDWORD,
++        lpFlags: LPDWORD, lpOverlapped: LPWSAOVERLAPPED,
++        lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
++    ) -> c_int;
++    pub fn WSARecvDisconnect(s: SOCKET, lpInboundDisconnectData: LPWSABUF) -> c_int;
++    pub fn WSARecvFrom(
++        s: SOCKET, lpBuffers: LPWSABUF, dwBufferCount: DWORD, lpNumberOfBytesRecvd: LPDWORD,
++        lpFlags: LPDWORD, lpFrom: *mut SOCKADDR, lpFromlen: LPINT, lpOverlapped: LPWSAOVERLAPPED,
++        lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
++    ) -> c_int;
++    pub fn WSARemoveServiceClass(lpServiceClassId: LPGUID) -> INT;
++    pub fn WSAResetEvent(hEvent: WSAEVENT) -> BOOL;
++    pub fn WSASend(
++        s: SOCKET, lpBuffers: LPWSABUF, dwBufferCount: DWORD, lpNumberOfBytesSent: LPDWORD,
++        dwFlags: DWORD, lpOverlapped: LPWSAOVERLAPPED,
++        lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
++    ) -> c_int;
++    pub fn WSASendDisconnect(s: SOCKET, lpOutboundDisconnectData: LPWSABUF) -> c_int;
++    pub fn WSASendMsg(
++        Handle: SOCKET, lpMsg: LPWSAMSG, dwFlags: DWORD, lpNumberOfBytesSent: LPDWORD,
++        lpOverlapped: LPWSAOVERLAPPED, lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
++    ) -> c_int;
++    pub fn WSASendTo(
++        s: SOCKET, lpBuffers: LPWSABUF, dwBufferCount: DWORD, lpNumberOfBytesSent: LPDWORD,
++        dwFlags: DWORD, lpTo: *const SOCKADDR, iToLen: c_int, lpOverlapped: LPWSAOVERLAPPED,
++        lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
++    ) -> c_int;
++    pub fn WSASetBlockingHook(lpBlockFunc: FARPROC) -> FARPROC;
++    pub fn WSASetEvent(hEvent: WSAEVENT) -> BOOL;
++    pub fn WSASetLastError(iError: c_int);
++    pub fn WSASetServiceA(
++        lpqsRegInfo: LPWSAQUERYSETA, essoperation: WSAESETSERVICEOP, dwControlFlags: DWORD,
++    ) -> INT;
++    pub fn WSASetServiceW(
++        lpqsRegInfo: LPWSAQUERYSETW, essoperation: WSAESETSERVICEOP, dwControlFlags: DWORD,
++    ) -> INT;
++    pub fn WSASocketA(
++        af: c_int, _type: c_int, protocol: c_int, lpProtocolInfo: LPWSAPROTOCOL_INFOA, g: GROUP,
++        dwFlags: DWORD,
++    ) -> SOCKET;
++    pub fn WSASocketW(
++        af: c_int, _type: c_int, protocol: c_int, lpProtocolInfo: LPWSAPROTOCOL_INFOW, g: GROUP,
++        dwFlags: DWORD,
++    ) -> SOCKET;
++    pub fn WSAStartup(wVersionRequested: WORD, lpWSAData: LPWSADATA) -> c_int;
++    pub fn WSAStringToAddressA(
++        AddressString: LPSTR, AddressFamily: INT, lpProtocolInfo: LPWSAPROTOCOL_INFOA,
++        lpAddress: LPSOCKADDR, lpAddressLength: LPINT,
++    ) -> INT;
++    pub fn WSAStringToAddressW(
++        AddressString: LPWSTR, AddressFamily: INT, lpProtocolInfo: LPWSAPROTOCOL_INFOW,
++        lpAddress: LPSOCKADDR, lpAddressLength: LPINT,
++    ) -> INT;
++    pub fn WSAUnadvertiseProvider(puuidProviderId: *const GUID) -> INT;
++    pub fn WSAUnhookBlockingHook() -> c_int;
++    pub fn WSAWaitForMultipleEvents(
++        cEvents: DWORD, lphEvents: *const WSAEVENT, fWaitAll: BOOL, dwTimeout: DWORD,
++        fAlertable: BOOL,
++    ) -> DWORD;
++    pub fn WSCDeinstallProvider(lpProviderId: LPGUID, lpErrno: LPINT) -> c_int;
++    // pub fn WSCDeinstallProviderEx();
++    pub fn WSCEnableNSProvider(lpProviderId: LPGUID, fEnable: BOOL) -> INT;
++    pub fn WSCEnumProtocols(
++        lpiProtocols: LPINT, lpProtocolBuffer: LPWSAPROTOCOL_INFOW, lpdwBufferLength: LPDWORD,
++        lpErrno: LPINT,
++    ) -> c_int;
++    // pub fn WSCEnumProtocolsEx();
++    pub fn WSCGetApplicationCategory(
++        Path: LPCWSTR, PathLength: DWORD, Extra: LPCWSTR, ExtraLength: DWORD,
++        pPermittedLspCategories: *mut DWORD, lpErrno: LPINT,
++    ) -> c_int;
++    // pub fn WSCGetApplicationCategoryEx();
++    pub fn WSCGetProviderInfo(
++        lpProviderId: LPGUID, InfoType: WSC_PROVIDER_INFO_TYPE, Info: PBYTE, InfoSize: *mut size_t,
++        Flags: DWORD, lpErrno: LPINT,
++    ) -> c_int;
++    pub fn WSCGetProviderPath(
++        lpProviderId: LPGUID, lpszProviderDllPath: *mut WCHAR, lpProviderDllPathLen: LPINT,
++        lpErrno: LPINT,
++    ) -> c_int;
++    pub fn WSCInstallNameSpace(
++        lpszIdentifier: LPWSTR, lpszPathName: LPWSTR, dwNameSpace: DWORD, dwVersion: DWORD,
++        lpProviderId: LPGUID,
++    ) -> INT;
++    pub fn WSCInstallNameSpaceEx(
++        lpszIdentifier: LPWSTR, lpszPathName: LPWSTR, dwNameSpace: DWORD, dwVersion: DWORD,
++        lpProviderId: LPGUID, lpProviderSpecific: LPBLOB,
++    ) -> INT;
++    // pub fn WSCInstallNameSpaceEx2();
++    pub fn WSCInstallProvider(
++        lpProviderId: LPGUID, lpszProviderDllPath: *const WCHAR,
++        lpProtocolInfoList: LPWSAPROTOCOL_INFOW, dwNumberOfEntries: DWORD, lpErrno: LPINT,
++    ) -> c_int;
++    // pub fn WSCInstallProviderEx();
++    pub fn WSCSetApplicationCategory(
++        Path: LPCWSTR, PathLength: DWORD, Extra: LPCWSTR, ExtraLength: DWORD,
++        PermittedLspCategories: DWORD, pPrevPermLspCat: *mut DWORD, lpErrno: LPINT,
++    ) -> c_int;
++    // pub fn WSCSetApplicationCategoryEx();
++    pub fn WSCSetProviderInfo(
++        lpProviderId: LPGUID, InfoType: WSC_PROVIDER_INFO_TYPE, Info: PBYTE, InfoSize: size_t,
++        Flags: DWORD, lpErrno: LPINT,
++    ) -> c_int;
++    pub fn WSCUnInstallNameSpace(lpProviderId: LPGUID) -> INT;
++    // pub fn WSCUnInstallNameSpaceEx2();
++    pub fn WSCUpdateProvider(
++        lpProviderId: LPGUID, lpszProviderDllPath: *const WCHAR,
++        lpProtocolInfoList: LPWSAPROTOCOL_INFOW, dwNumberOfEntries: DWORD, lpErrno: LPINT,
++    ) -> c_int;
++    // pub fn WSCUpdateProviderEx();
++    pub fn WSCWriteNameSpaceOrder(lpProviderId: LPGUID, dwNumberOfEntries: DWORD) -> c_int;
++    pub fn WSCWriteProviderOrder(lpwdCatalogEntryId: LPDWORD, dwNumberOfEntries: DWORD) -> c_int;
++    // pub fn WSCWriteProviderOrderEx();
++    // pub fn WahCloseApcHelper();
++    // pub fn WahCloseHandleHelper();
++    // pub fn WahCloseNotificationHandleHelper();
++    // pub fn WahCloseSocketHandle();
++    // pub fn WahCloseThread();
++    // pub fn WahCompleteRequest();
++    // pub fn WahCreateHandleContextTable();
++    // pub fn WahCreateNotificationHandle();
++    // pub fn WahCreateSocketHandle();
++    // pub fn WahDestroyHandleContextTable();
++    // pub fn WahDisableNonIFSHandleSupport();
++    // pub fn WahEnableNonIFSHandleSupport();
++    // pub fn WahEnumerateHandleContexts();
++    // pub fn WahInsertHandleContext();
++    // pub fn WahNotifyAllProcesses();
++    // pub fn WahOpenApcHelper();
++    // pub fn WahOpenCurrentThread();
++    // pub fn WahOpenHandleHelper();
++    // pub fn WahOpenNotificationHandleHelper();
++    // pub fn WahQueueUserApc();
++    // pub fn WahReferenceContextByHandle();
++    // pub fn WahRemoveHandleContext();
++    // pub fn WahWaitForNotification();
++    // pub fn WahWriteLSPEvent();
++    pub fn __WSAFDIsSet(fd: SOCKET, _: *mut fd_set) -> c_int;
++    pub fn accept(s: SOCKET, addr: *mut SOCKADDR, addrlen: *mut c_int) -> SOCKET;
++    pub fn bind(s: SOCKET, name: *const SOCKADDR, namelen: c_int) -> c_int;
++    pub fn closesocket(s: SOCKET) -> c_int;
++    pub fn connect(s: SOCKET, name: *const SOCKADDR, namelen: c_int) -> c_int;
++    pub fn freeaddrinfo(pAddrInfo: PADDRINFOA);
++    pub fn getaddrinfo(
++        pNodeName: PCSTR, pServiceName: PCSTR, pHints: *const ADDRINFOA, ppResult: *mut PADDRINFOA,
++    ) -> INT;
++    pub fn gethostbyaddr(addr: *const c_char, len: c_int, _type: c_int) -> *mut hostent;
++    pub fn gethostbyname(name: *const c_char) -> *mut hostent;
++    pub fn gethostname(name: *mut c_char, namelen: c_int) -> c_int;
++    pub fn getnameinfo(
++        pSockaddr: *const SOCKADDR, SockaddrLength: socklen_t, pNodeBuffer: PCHAR,
++        NodeBufferSize: DWORD, pServiceBuffer: PCHAR, ServiceBufferSize: DWORD, Flags: INT,
++    ) -> INT;
++    pub fn getpeername(s: SOCKET, name: *mut SOCKADDR, namelen: *mut c_int) -> c_int;
++    pub fn getprotobyname(name: *const c_char) -> *mut protoent;
++    pub fn getprotobynumber(number: c_int) -> *mut protoent;
++    pub fn getservbyname(name: *const c_char, proto: *const c_char) -> *mut servent;
++    pub fn getservbyport(port: c_int, proto: *const c_char) -> *mut servent;
++    pub fn getsockname(s: SOCKET, name: *mut SOCKADDR, namelen: *mut c_int) -> c_int;
++    pub fn getsockopt(
++        s: SOCKET, level: c_int, optname: c_int, optval: *mut c_char, optlen: *mut c_int,
++    ) -> c_int;
++    pub fn htonl(hostlong: u_long) -> u_long;
++    pub fn htons(hostshort: u_short) -> u_short;
++    pub fn inet_addr(cp: *const c_char) -> c_ulong;
++    pub fn inet_ntoa(_in: in_addr) -> *mut c_char;
++    pub fn inet_ntop(Family: INT, pAddr: PVOID, pStringBuf: PSTR, StringBufSize: size_t) -> PCSTR;
++    pub fn inet_pton(Family: INT, pszAddrString: PCSTR, pAddrBuf: PVOID) -> INT;
++    pub fn ioctlsocket(s: SOCKET, cmd: c_long, argp: *mut u_long) -> c_int;
++    pub fn listen(s: SOCKET, backlog: c_int) -> c_int;
++    pub fn ntohl(netlong: u_long) -> u_long;
++    pub fn ntohs(netshort: u_short) -> u_short;
++    pub fn recv(s: SOCKET, buf: *mut c_char, len: c_int, flags: c_int) -> c_int;
++    pub fn recvfrom(
++        s: SOCKET, buf: *mut c_char, len: c_int, flags: c_int, from: *mut SOCKADDR,
++        fromlen: *mut c_int,
++    ) -> c_int;
++    pub fn select(
++        nfds: c_int, readfds: *mut fd_set, writefds: *mut fd_set, exceptfds: *mut fd_set,
++        timeout: *const timeval,
++    ) -> c_int;
++    pub fn send(s: SOCKET, buf: *const c_char, len: c_int, flags: c_int) -> c_int;
++    pub fn sendto(
++        s: SOCKET, buf: *const c_char, len: c_int, flags: c_int, to: *const SOCKADDR, tolen: c_int,
++    ) -> c_int;
++    pub fn setsockopt(
++        s: SOCKET, level: c_int, optname: c_int, optval: *const c_char, optlen: c_int,
++    ) -> c_int;
++    pub fn shutdown(s: SOCKET, how: c_int) -> c_int;
++    pub fn socket(af: c_int, _type: c_int, protocol: c_int) -> SOCKET;
++}
++#[cfg(any(target_arch = "x86", target_arch = "arm"))]
++extern "system" {
++    pub fn WSCInstallProviderAndChains(
++        lpProviderId: LPGUID, lpszProviderDllPath: LPWSTR, lpszLspName: LPWSTR,
++        dwServiceFlags: DWORD, lpProtocolInfoList: LPWSAPROTOCOL_INFOW, dwNumberOfEntries: DWORD,
++        lpdwCatalogEntryId: LPDWORD, lpErrno: LPINT,
++    ) -> c_int;
++}
++#[cfg(target_arch = "x86_64")]
++extern "system" {
++    pub fn WSCDeinstallProvider32(lpProviderId: LPGUID, lpErrno: LPINT) -> c_int;
++    pub fn WSCEnableNSProvider32(lpProviderId: LPGUID, fEnable: BOOL) -> INT;
++    pub fn WSCEnumNameSpaceProviders32(
++        lpdwBufferLength: LPDWORD, lpnspBuffer: LPWSANAMESPACE_INFOW,
++    ) -> INT;
++    pub fn WSCEnumNameSpaceProvidersEx32(
++        lpdwBufferLength: LPDWORD, lpnspBuffer: LPWSANAMESPACE_INFOEXW,
++    ) -> INT;
++    pub fn WSCEnumProtocols32(
++        lpiProtocols: LPINT, lpProtocolBuffer: LPWSAPROTOCOL_INFOW, lpdwBufferLength: LPDWORD,
++        lpErrno: LPINT,
++    ) -> c_int;
++    pub fn WSCGetProviderInfo32(
++        lpProviderId: LPGUID, InfoType: WSC_PROVIDER_INFO_TYPE, Info: PBYTE, InfoSize: *mut size_t,
++        Flags: DWORD, lpErrno: LPINT,
++    ) -> c_int;
++    pub fn WSCGetProviderPath32(
++        lpProviderId: LPGUID, lpszProviderDllPath: *mut WCHAR, lpProviderDllPathLen: LPINT,
++        lpErrno: LPINT,
++    ) -> c_int;
++    pub fn WSCInstallNameSpace32(
++        lpszIdentifier: LPWSTR, lpszPathName: LPWSTR, dwNameSpace: DWORD, dwVersion: DWORD,
++        lpProviderId: LPGUID,
++    ) -> INT;
++    pub fn WSCInstallNameSpaceEx32(
++        lpszIdentifier: LPWSTR, lpszPathName: LPWSTR, dwNameSpace: DWORD, dwVersion: DWORD,
++        lpProviderId: LPGUID, lpProviderSpecific: LPBLOB,
++    ) -> INT;
++    pub fn WSCInstallProvider64_32(
++        lpProviderId: LPGUID, lpszProviderDllPath: *const WCHAR,
++        lpProtocolInfoList: LPWSAPROTOCOL_INFOW, dwNumberOfEntries: DWORD, lpErrno: LPINT,
++    ) -> c_int;
++    pub fn WSCInstallProviderAndChains64_32(
++        lpProviderId: LPGUID, lpszProviderDllPath: LPWSTR, lpszProviderDllPath32: LPWSTR,
++        lpszLspName: LPWSTR, dwServiceFlags: DWORD, lpProtocolInfoList: LPWSAPROTOCOL_INFOW,
++        dwNumberOfEntries: DWORD, lpdwCatalogEntryId: LPDWORD, lpErrno: LPINT,
++    ) -> c_int;
++    pub fn WSCSetProviderInfo32(
++        lpProviderId: LPGUID, InfoType: WSC_PROVIDER_INFO_TYPE, Info: PBYTE, InfoSize: size_t,
++        Flags: DWORD, lpErrno: LPINT,
++    ) -> c_int;
++    pub fn WSCUnInstallNameSpace32(lpProviderId: LPGUID) -> INT;
++    pub fn WSCUpdateProvider32(
++        lpProviderId: LPGUID, lpszProviderDllPath: *const WCHAR,
++        lpProtocolInfoList: LPWSAPROTOCOL_INFOW, dwNumberOfEntries: DWORD, lpErrno: LPINT,
++    ) -> c_int;
++    pub fn WSCWriteNameSpaceOrder32(lpProviderId: LPGUID, dwNumberOfEntries: DWORD) -> c_int;
++    pub fn WSCWriteProviderOrder32(lpwdCatalogEntryId: LPDWORD, dwNumberOfEntries: DWORD) -> c_int;
++}
++extern {
++    // pub static AddressFamilyInformation;
++    // pub static eui48_broadcast;
++    // pub static in4addr_alligmpv3routersonlink;
++    // pub static in4addr_allnodesonlink;
++    // pub static in4addr_allroutersonlink;
++    // pub static in4addr_allteredohostsonlink;
++    // pub static in4addr_any;
++    // pub static in4addr_broadcast;
++    // pub static in4addr_linklocalprefix;
++    // pub static in4addr_loopback;
++    // pub static in4addr_multicastprefix;
++    // pub static in6addr_6to4prefix;
++    // pub static in6addr_allmldv2routersonlink;
++    // pub static in6addr_allnodesonlink;
++    // pub static in6addr_allnodesonnode;
++    // pub static in6addr_allroutersonlink;
++    // pub static in6addr_any;
++    // pub static in6addr_linklocalprefix;
++    // pub static in6addr_loopback;
++    // pub static in6addr_multicastprefix;
++    // pub static in6addr_solicitednodemulticastprefix;
++    // pub static in6addr_teredoinitiallinklocaladdress;
++    // pub static in6addr_teredoprefix;
++    // pub static in6addr_teredoprefix_old;
++    // pub static in6addr_v4mappedprefix;
++    // pub static scopeid_unspecified;
++    // pub static sockaddr_size;
++}