Update vsock to 0.2.6 am: bc5a1c46a7 am: 12119859e2 am: eadfc342ff

Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/vsock/+/2005052

Change-Id: I043a75863ce7428517cdb243d3a4844de23ea475
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
index 4fc9144..3d9568d 100644
--- a/.cargo_vcs_info.json
+++ b/.cargo_vcs_info.json
@@ -1,5 +1,5 @@
 {
   "git": {
-    "sha1": "56852d4006efce337875594e6a21ec49f0fc9c89"
+    "sha1": "9b5e180bf04fd1d02db0c1e79c5ddd838dd42328"
   }
 }
diff --git a/Android.bp b/Android.bp
index b2544e0..17b9a91 100644
--- a/Android.bp
+++ b/Android.bp
@@ -23,7 +23,7 @@
     host_supported: true,
     crate_name: "vsock",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.2.4",
+    cargo_pkg_version: "0.2.6",
     srcs: ["src/lib.rs"],
     edition: "2018",
     rustlibs: [
diff --git a/Cargo.toml b/Cargo.toml
index be4c916..0002416 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -3,17 +3,16 @@
 # When uploading crates to the registry Cargo will automatically
 # "normalize" Cargo.toml files for maximal compatibility
 # with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g., crates.io) dependencies
+# to registry (e.g., crates.io) dependencies.
 #
-# If you believe there's an error in this file please file an
-# issue against the rust-lang/cargo repository. If you're
-# editing this file be aware that the upstream Cargo.toml
-# will likely look very different (and much more reasonable)
+# If you are reading this file be aware that the original Cargo.toml
+# will likely look very different (and much more reasonable).
+# See Cargo.toml.orig for the original contents.
 
 [package]
 edition = "2018"
 name = "vsock"
-version = "0.2.4"
+version = "0.2.6"
 authors = ["fsyncd", "rust-vsock"]
 exclude = ["test_fixture"]
 description = "Virtio socket support for Rust"
@@ -25,7 +24,7 @@
 version = "0.2.79"
 
 [dependencies.nix]
-version = "0.19.1"
+version = "0.23.0"
 [dev-dependencies.rand]
 version = "0.8.3"
 
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
index aa90128..7a6d39a 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "vsock"
-version = "0.2.4"
+version = "0.2.6"
 authors = ["fsyncd", "rust-vsock"]
 description = "Virtio socket support for Rust"
 repository = "https://github.com/rust-vsock/vsock-rs"
@@ -12,7 +12,7 @@
 
 [dependencies]
 libc = "0.2.79"
-nix = "0.19.1"
+nix = "0.23.0"
 
 [dev-dependencies]
 rand = "0.8.3"
diff --git a/METADATA b/METADATA
index 1bb714c..768fa97 100644
--- a/METADATA
+++ b/METADATA
@@ -7,13 +7,13 @@
   }
   url {
     type: ARCHIVE
-    value: "https://static.crates.io/crates/vsock/vsock-0.2.4.crate"
+    value: "https://static.crates.io/crates/vsock/vsock-0.2.6.crate"
   }
-  version: "0.2.4"
+  version: "0.2.6"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2021
-    month: 6
-    day: 21
+    year: 2022
+    month: 3
+    day: 1
   }
 }
diff --git a/src/lib.rs b/src/lib.rs
index 065ca57..aaeb393 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -17,15 +17,17 @@
 
 //! Virtio socket support for Rust.
 
+use libc::*;
+use nix::ioctl_read_bad;
+use std::ffi::c_void;
+use std::fs::File;
 use std::io::{Error, ErrorKind, Read, Result, Write};
 use std::mem::{self, size_of};
-use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
-
-use libc::*;
-use std::ffi::c_void;
 use std::net::Shutdown;
+use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
 use std::time::Duration;
 
+pub use libc::{VMADDR_CID_ANY, VMADDR_CID_HOST, VMADDR_CID_HYPERVISOR, VMADDR_CID_LOCAL};
 pub use nix::sys::socket::{SockAddr, VsockAddr};
 
 fn new_socket() -> libc::c_int {
@@ -505,3 +507,22 @@
         unsafe { close(self.socket) };
     }
 }
+
+const IOCTL_VM_SOCKETS_GET_LOCAL_CID: usize = 0x7b9;
+ioctl_read_bad!(
+    vm_sockets_get_local_cid,
+    IOCTL_VM_SOCKETS_GET_LOCAL_CID,
+    u32
+);
+
+/// Gets the CID of the local machine.
+///
+/// Note that when calling [`VsockListener::bind`], you should generally use [`VMADDR_CID_ANY`]
+/// instead, and for making a loopback connection you should use [`VMADDR_CID_LOCAL`].
+pub fn get_local_cid() -> Result<u32> {
+    let f = File::open("/dev/vsock")?;
+    let mut cid = 0;
+    // SAFETY: the kernel only modifies the given u32 integer.
+    unsafe { vm_sockets_get_local_cid(f.as_raw_fd(), &mut cid) }?;
+    Ok(cid)
+}
diff --git a/tests/vsock.rs b/tests/vsock.rs
index d51bad0..52d908b 100644
--- a/tests/vsock.rs
+++ b/tests/vsock.rs
@@ -17,7 +17,7 @@
 use rand::RngCore;
 use sha2::{Digest, Sha256};
 use std::io::{Read, Write};
-use vsock::{SockAddr, VsockAddr, VsockStream};
+use vsock::{get_local_cid, SockAddr, VsockAddr, VsockStream, VMADDR_CID_HOST};
 
 const TEST_BLOB_SIZE: usize = 1_000_000;
 const TEST_BLOCK_SIZE: usize = 5_000;
@@ -67,3 +67,8 @@
 
     assert_eq!(expected, actual);
 }
+
+#[test]
+fn test_get_local_cid() {
+    assert_eq!(get_local_cid().unwrap(), VMADDR_CID_HOST);
+}