|
7 | 7 | use cap_std_ext::prelude::CapStdExtCommandExt; |
8 | 8 | use cap_std_ext::{cap_std, cap_tempfile}; |
9 | 9 | use futures_util::{Future, FutureExt}; |
| 10 | +use itertools::Itertools; |
10 | 11 | use oci_spec::image::{Descriptor, Digest}; |
11 | 12 | use serde::{Deserialize, Serialize}; |
12 | 13 | use std::fs::File; |
@@ -382,39 +383,27 @@ impl FromReplyFds for () { |
382 | 383 | /// A FinishPipe instance |
383 | 384 | impl FromReplyFds for FinishPipe { |
384 | 385 | fn from_reply(fds: impl IntoIterator<Item = OwnedFd>, pipeid: u32) -> Result<Self> { |
385 | | - let mut fds = fds.into_iter(); |
386 | | - let Some(first_fd) = fds.next() else { |
387 | | - return Err(Error::Other("Expected fd for FinishPipe".into())); |
388 | | - }; |
389 | | - if fds.next().is_some() { |
390 | | - return Err(Error::Other("More than one fd for FinishPipe".into())); |
391 | | - } |
392 | 386 | let Some(pipeid) = PipeId::try_new(pipeid) else { |
393 | 387 | return Err(Error::Other("Expected pipeid for FinishPipe".into())); |
394 | 388 | }; |
395 | | - Ok(Self { |
396 | | - pipeid, |
397 | | - datafd: first_fd, |
398 | | - }) |
| 389 | + let datafd = fds |
| 390 | + .into_iter() |
| 391 | + .exactly_one() |
| 392 | + .map_err(|_| Error::Other("Expected exactly one fd for FinishPipe".into()))?; |
| 393 | + Ok(Self { pipeid, datafd }) |
399 | 394 | } |
400 | 395 | } |
401 | 396 |
|
402 | 397 | /// A DualFds instance |
403 | 398 | impl FromReplyFds for DualFds { |
404 | 399 | fn from_reply(fds: impl IntoIterator<Item = OwnedFd>, pipeid: u32) -> Result<Self> { |
405 | | - let mut fds = fds.into_iter(); |
406 | | - let Some(datafd) = fds.next() else { |
407 | | - return Err(Error::Other("Expected data fd for DualFds".into())); |
408 | | - }; |
409 | | - let Some(errfd) = fds.next() else { |
410 | | - return Err(Error::Other("Expected err fd for DualFds".into())); |
411 | | - }; |
412 | | - if fds.next().is_some() { |
413 | | - return Err(Error::Other("More than two fds for DualFds".into())); |
414 | | - } |
415 | 400 | if pipeid != 0 { |
416 | 401 | return Err(Error::Other("Unexpected pipeid with DualFds".into())); |
417 | 402 | } |
| 403 | + let (datafd, errfd) = fds |
| 404 | + .into_iter() |
| 405 | + .collect_tuple() |
| 406 | + .ok_or_else(|| Error::Other("Expected two fds for DualFds".into()))?; |
418 | 407 | Ok(Self { datafd, errfd }) |
419 | 408 | } |
420 | 409 | } |
|
0 commit comments