harddog_user.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /*
  2. * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
  3. * Licensed under the GPL
  4. */
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <errno.h>
  8. #include "user.h"
  9. #include "mconsole.h"
  10. #include "os.h"
  11. #include "choose-mode.h"
  12. #include "mode.h"
  13. struct dog_data {
  14. int stdin;
  15. int stdout;
  16. int close_me[2];
  17. };
  18. static void pre_exec(void *d)
  19. {
  20. struct dog_data *data = d;
  21. dup2(data->stdin, 0);
  22. dup2(data->stdout, 1);
  23. dup2(data->stdout, 2);
  24. os_close_file(data->stdin);
  25. os_close_file(data->stdout);
  26. os_close_file(data->close_me[0]);
  27. os_close_file(data->close_me[1]);
  28. }
  29. int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock)
  30. {
  31. struct dog_data data;
  32. int in_fds[2], out_fds[2], pid, n, err;
  33. char pid_buf[sizeof("nnnnn\0")], c;
  34. char *pid_args[] = { "/usr/bin/uml_watchdog", "-pid", pid_buf, NULL };
  35. char *mconsole_args[] = { "/usr/bin/uml_watchdog", "-mconsole", NULL,
  36. NULL };
  37. char **args = NULL;
  38. err = os_pipe(in_fds, 1, 0);
  39. if(err < 0){
  40. printk("harddog_open - os_pipe failed, err = %d\n", -err);
  41. goto out;
  42. }
  43. err = os_pipe(out_fds, 1, 0);
  44. if(err < 0){
  45. printk("harddog_open - os_pipe failed, err = %d\n", -err);
  46. goto out_close_in;
  47. }
  48. data.stdin = out_fds[0];
  49. data.stdout = in_fds[1];
  50. data.close_me[0] = out_fds[1];
  51. data.close_me[1] = in_fds[0];
  52. if(sock != NULL){
  53. mconsole_args[2] = sock;
  54. args = mconsole_args;
  55. }
  56. else {
  57. /* XXX The os_getpid() is not SMP correct */
  58. sprintf(pid_buf, "%d", CHOOSE_MODE(tracing_pid, os_getpid()));
  59. args = pid_args;
  60. }
  61. pid = run_helper(pre_exec, &data, args);
  62. os_close_file(out_fds[0]);
  63. os_close_file(in_fds[1]);
  64. if(pid < 0){
  65. err = -pid;
  66. printk("harddog_open - run_helper failed, errno = %d\n", -err);
  67. goto out_close_out;
  68. }
  69. n = os_read_file(in_fds[0], &c, sizeof(c));
  70. if(n == 0){
  71. printk("harddog_open - EOF on watchdog pipe\n");
  72. helper_wait(pid);
  73. err = -EIO;
  74. goto out_close_out;
  75. }
  76. else if(n < 0){
  77. printk("harddog_open - read of watchdog pipe failed, "
  78. "err = %d\n", -n);
  79. helper_wait(pid);
  80. err = n;
  81. goto out_close_out;
  82. }
  83. *in_fd_ret = in_fds[0];
  84. *out_fd_ret = out_fds[1];
  85. return 0;
  86. out_close_in:
  87. os_close_file(in_fds[0]);
  88. os_close_file(in_fds[1]);
  89. out_close_out:
  90. os_close_file(out_fds[0]);
  91. os_close_file(out_fds[1]);
  92. out:
  93. return err;
  94. }
  95. void stop_watchdog(int in_fd, int out_fd)
  96. {
  97. os_close_file(in_fd);
  98. os_close_file(out_fd);
  99. }
  100. int ping_watchdog(int fd)
  101. {
  102. int n;
  103. char c = '\n';
  104. n = os_write_file(fd, &c, sizeof(c));
  105. if(n != sizeof(c)){
  106. printk("ping_watchdog - write failed, err = %d\n", -n);
  107. if(n < 0)
  108. return n;
  109. return -EIO;
  110. }
  111. return 1;
  112. }