2
0

signal.rs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. use core::mem;
  2. use syscall;
  3. use super::{
  4. super::{types::*, Pal, PalSignal},
  5. e, Sys,
  6. };
  7. use crate::{
  8. header::{
  9. errno::EINVAL,
  10. signal::{sigaction, sigset_t, stack_t},
  11. sys_time::{itimerval, ITIMER_REAL},
  12. },
  13. platform::errno,
  14. };
  15. impl PalSignal for Sys {
  16. fn getitimer(which: c_int, out: *mut itimerval) -> c_int {
  17. let path = match which {
  18. ITIMER_REAL => "itimer:1",
  19. _ => unsafe {
  20. errno = EINVAL;
  21. return -1;
  22. },
  23. };
  24. let fd = e(syscall::open(path, syscall::O_RDONLY | syscall::O_CLOEXEC));
  25. if fd == !0 {
  26. return -1;
  27. }
  28. let mut spec = syscall::ITimerSpec::default();
  29. let count = e(syscall::read(fd, &mut spec));
  30. let _ = syscall::close(fd);
  31. if count == !0 {
  32. return -1;
  33. }
  34. unsafe {
  35. (*out).it_interval.tv_sec = spec.it_interval.tv_sec;
  36. (*out).it_interval.tv_usec = spec.it_interval.tv_nsec / 1000;
  37. (*out).it_value.tv_sec = spec.it_value.tv_sec;
  38. (*out).it_value.tv_usec = spec.it_value.tv_nsec / 1000;
  39. }
  40. 0
  41. }
  42. fn kill(pid: pid_t, sig: c_int) -> c_int {
  43. e(syscall::kill(pid as usize, sig as usize)) as c_int
  44. }
  45. fn killpg(pgrp: pid_t, sig: c_int) -> c_int {
  46. e(syscall::kill(-(pgrp as isize) as usize, sig as usize)) as c_int
  47. }
  48. fn raise(sig: c_int) -> c_int {
  49. Self::kill(Self::getpid(), sig)
  50. }
  51. fn setitimer(which: c_int, new: *const itimerval, old: *mut itimerval) -> c_int {
  52. let path = match which {
  53. ITIMER_REAL => "itimer:1",
  54. _ => unsafe {
  55. errno = EINVAL;
  56. return -1;
  57. },
  58. };
  59. let fd = e(syscall::open(path, syscall::O_RDWR | syscall::O_CLOEXEC));
  60. if fd == !0 {
  61. return -1;
  62. }
  63. let mut spec = syscall::ITimerSpec::default();
  64. let mut count = e(syscall::read(fd, &mut spec));
  65. if count != !0 {
  66. unsafe {
  67. if !old.is_null() {
  68. (*old).it_interval.tv_sec = spec.it_interval.tv_sec;
  69. (*old).it_interval.tv_usec = spec.it_interval.tv_nsec / 1000;
  70. (*old).it_value.tv_sec = spec.it_value.tv_sec;
  71. (*old).it_value.tv_usec = spec.it_value.tv_nsec / 1000;
  72. }
  73. spec.it_interval.tv_sec = (*new).it_interval.tv_sec;
  74. spec.it_interval.tv_nsec = (*new).it_interval.tv_usec * 1000;
  75. spec.it_value.tv_sec = (*new).it_value.tv_sec;
  76. spec.it_value.tv_nsec = (*new).it_value.tv_usec * 1000;
  77. }
  78. count = e(syscall::write(fd, &spec));
  79. }
  80. let _ = syscall::close(fd);
  81. if count == !0 {
  82. return -1;
  83. }
  84. 0
  85. }
  86. fn sigaction(sig: c_int, act: Option<&sigaction>, oact: Option<&mut sigaction>) -> c_int {
  87. let new_opt = act.map(|act| {
  88. let m = act.sa_mask;
  89. let sa_handler = unsafe { mem::transmute(act.sa_handler) };
  90. println!("signal called with {:x}", unsafe {
  91. mem::transmute::<_, usize>(sa_handler)
  92. });
  93. syscall::SigAction {
  94. sa_handler,
  95. sa_mask: [m as u64, 0],
  96. sa_flags: syscall::SigActionFlags::from_bits(act.sa_flags as usize)
  97. .expect("sigaction: invalid bit pattern"),
  98. }
  99. });
  100. let mut old_opt = oact.as_ref().map(|_| syscall::SigAction::default());
  101. println!("before : {:?}", new_opt);
  102. println!("before old : {:?}", old_opt);
  103. let ret = e(syscall::sigaction(
  104. sig as usize,
  105. new_opt.as_ref(),
  106. old_opt.as_mut(),
  107. )) as c_int;
  108. println!("after : {:?}", old_opt);
  109. if let (Some(old), Some(oact)) = (old_opt, oact) {
  110. println!("after : {:?}", oact);
  111. oact.sa_handler = unsafe { mem::transmute(old.sa_handler) };
  112. let m = old.sa_mask;
  113. oact.sa_mask = m[0] as c_ulong;
  114. oact.sa_flags = old.sa_flags.bits() as c_ulong;
  115. }
  116. ret
  117. }
  118. fn sigaltstack(ss: *const stack_t, old_ss: *mut stack_t) -> c_int {
  119. unimplemented!()
  120. }
  121. fn sigprocmask(how: c_int, set: *const sigset_t, oset: *mut sigset_t) -> c_int {
  122. let new_opt = if set.is_null() {
  123. None
  124. } else {
  125. Some([unsafe { *set as u64 }, 0])
  126. };
  127. let mut old_opt = if oset.is_null() { None } else { Some([0, 0]) };
  128. let ret = e(syscall::sigprocmask(
  129. how as usize,
  130. new_opt.as_ref(),
  131. old_opt.as_mut(),
  132. )) as c_int;
  133. if let Some(old) = old_opt {
  134. unsafe { *oset = old[0] as sigset_t };
  135. }
  136. ret
  137. }
  138. }