base/sys/linux/descriptor.rs
1// Copyright 2020 The ChromiumOS Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use crate::descriptor::SafeDescriptor;
6
7const KCMP_FILE: u32 = 0;
8
9impl PartialEq for SafeDescriptor {
10 fn eq(&self, other: &Self) -> bool {
11 // If RawFd numbers match then we can return early without calling kcmp
12 if self.descriptor == other.descriptor {
13 return true;
14 }
15
16 // SAFETY:
17 // safe because we only use the return value and libc says it's always successful
18 let pid = unsafe { libc::getpid() };
19 // SAFETY:
20 // safe because we are passing everything by value and checking the return value
21 let ret = unsafe {
22 libc::syscall(
23 libc::SYS_kcmp,
24 pid,
25 pid,
26 KCMP_FILE,
27 self.descriptor,
28 other.descriptor,
29 )
30 };
31
32 ret == 0
33 }
34}