Damaged

safe_fork

Aug 13th, 2015
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.28 KB | None | 0 0
  1. svar data_packets
  2.  
  3. $def init_svar mode preempt data_packets @ array? not if 0 array_make_dict data_packets ! then setmode
  4.  
  5. : clean_packets
  6. mode var! start_mode
  7. data_packets @ foreach pop var! cur
  8. preempt
  9. cur @ ispid? if start_mode @ setmode continue then
  10. data_packets @ cur @ array_delitem data_packets !
  11. start_mode @ setmode
  12. repeat
  13. start_mode @ setmode
  14. ; PUBLIC clean_packets
  15. $libdef safe_fork_clean_packets
  16.  
  17. : safe_fork[ dbref:program_to_call str:function_to_call ?:data -- int ]
  18. init_svar
  19. mode
  20. "prog" program_to_call @ "func" function_to_call "data" data @ 3 array_make_dict
  21. preempt
  22. data_packets @ pid array_setitem data_packets !
  23. setmode
  24. "*me" match "safe_fork" prog pid intostr enqueue ?dup if exit else -1 exit then
  25. ; PUBLIC safe_fork
  26. $libdef safe_fork
  27.  
  28. : main[ str:calling_pid - ]
  29. command @ tolower "safe_fork" strcmp if me @ dup "%D(%d) attempted to abuse lib/safe_fork" fmtstring abort then
  30. data_packets @ not if "Bad data packet" abort then
  31. data_packets @ calling_pid @ atoi array_getitem var! data_packet
  32. data_packet @ not if pid kill then
  33. preempt
  34. data_packets @ calling_pid @ atoi array_delitem data_packets !
  35. background
  36. data_packet @ "data" array_getitem data_packet @ "prog" array_getitem data_packet @ "func" array_getitem ?dup pop call
  37. ;
Advertisement
Add Comment
Please, Sign In to add comment