| 1 | use super::weak; |
| 2 | |
| 3 | pub(crate) macro syscall { |
| 4 | ( |
| 5 | fn $name:ident($($param:ident : $t:ty),* $(,)?) -> $ret:ty; |
| 6 | ) => ( |
| 7 | unsafe fn $name($($param: $t),*) -> $ret { |
| 8 | weak!(fn $name($($param: $t),*) -> $ret;); |
| 9 | |
| 10 | // Use a weak symbol from libc when possible, allowing `LD_PRELOAD` |
| 11 | // interposition, but if it's not found just use a raw syscall. |
| 12 | if let Some(fun) = $name.get() { |
| 13 | unsafe { fun($($param),*) } |
| 14 | } else { |
| 15 | unsafe { libc::syscall(libc::${concat(SYS_, $name)}, $($param),*) as $ret } |
| 16 | } |
| 17 | } |
| 18 | ) |
| 19 | } |
| 20 | |