pass.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include <u.h>
  2. #include <libc.h>
  3. int alarmed;
  4. int done;
  5. void
  6. usage(void)
  7. {
  8. fprint(2, "usage: %s [-q]\n", argv0);
  9. exits("usage");
  10. }
  11. void
  12. ding(void*, char *s)
  13. {
  14. if(strstr(s, "alarm")){
  15. alarmed = 1;
  16. noted(NCONT);
  17. } else
  18. noted(NDFLT);
  19. }
  20. void
  21. main(int argc, char **argv)
  22. {
  23. int fd, cfd;
  24. int i;
  25. char buf[1];
  26. int quiet = 0;
  27. ARGBEGIN {
  28. case 'q':
  29. quiet = 1;
  30. break;
  31. } ARGEND;
  32. notify(ding);
  33. fd = open("/dev/cons", ORDWR);
  34. if(fd < 0)
  35. sysfatal("opening /dev/cons: %r");
  36. cfd = open("/dev/consctl", OWRITE);
  37. if(cfd >= 0)
  38. fprint(cfd, "rawon");
  39. switch(rfork(RFPROC|RFFDG|RFMEM)){
  40. case -1:
  41. sysfatal("forking: %r");
  42. default:
  43. // read until we're done writing or
  44. // we get an end of line
  45. while(!done){
  46. alarmed = 0;
  47. alarm(250);
  48. i = read(0, buf, 1);
  49. alarm(0);
  50. if(i == 0)
  51. break;
  52. if(i < 0){
  53. if(alarmed)
  54. continue;
  55. else
  56. break;
  57. }
  58. if(!quiet && write(fd, buf, 1) < 1)
  59. break;
  60. if(buf[0] == '\n' || buf[0] == '\r')
  61. break;
  62. }
  63. break;
  64. case 0:
  65. // pass one character at a time till end of line
  66. for(;;){
  67. if(read(fd, buf, 1) <= 0)
  68. break;
  69. if(write(1, buf, 1) < 0)
  70. break;
  71. if(buf[0] == '\n' || buf[0] == '\r')
  72. break;
  73. }
  74. // tell reader to give up after next char
  75. done = 1;
  76. break;
  77. }
  78. exits(0);
  79. }