system.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #define wait4 __wait4
  2. #define execl __execl
  3. #define signal __signal
  4. #define vfork __vfork
  5. #define fork __fork
  6. #include <stdio.h>
  7. #include <stddef.h>
  8. #include <signal.h>
  9. #include <unistd.h>
  10. #include <sys/wait.h>
  11. /* uClinux-2.0 has vfork, but Linux 2.0 doesn't */
  12. #include <sys/syscall.h>
  13. #if ! defined __NR_vfork
  14. #define vfork fork
  15. #endif
  16. int __libc_system(char *command)
  17. {
  18. int wait_val, pid;
  19. __sighandler_t save_quit, save_int, save_chld;
  20. if (command == 0)
  21. return 1;
  22. save_quit = signal(SIGQUIT, SIG_IGN);
  23. save_int = signal(SIGINT, SIG_IGN);
  24. save_chld = signal(SIGCHLD, SIG_DFL);
  25. if ((pid = vfork()) < 0) {
  26. signal(SIGQUIT, save_quit);
  27. signal(SIGINT, save_int);
  28. signal(SIGCHLD, save_chld);
  29. return -1;
  30. }
  31. if (pid == 0) {
  32. signal(SIGQUIT, SIG_DFL);
  33. signal(SIGINT, SIG_DFL);
  34. signal(SIGCHLD, SIG_DFL);
  35. execl("/bin/sh", "sh", "-c", command, (char *) 0);
  36. _exit_internal(127);
  37. }
  38. /* Signals are not absolutly guarenteed with vfork */
  39. signal(SIGQUIT, SIG_IGN);
  40. signal(SIGINT, SIG_IGN);
  41. #if 0
  42. __printf("Waiting for child %d\n", pid);
  43. #endif
  44. if (wait4(pid, &wait_val, 0, 0) == -1)
  45. wait_val = -1;
  46. signal(SIGQUIT, save_quit);
  47. signal(SIGINT, save_int);
  48. signal(SIGCHLD, save_chld);
  49. return wait_val;
  50. }
  51. weak_alias(__libc_system, system)