tonet.c 917 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /* tonet dest - copy stdin to dest, after dialing dest */
  2. #include <u.h>
  3. #include <libc.h>
  4. enum { TIMEOUT = 10*60*1000 };
  5. int
  6. alarmhandler(void *, char *note)
  7. {
  8. if(strcmp(note, "alarm") == 0) {
  9. fprint(2, "alarm\n");
  10. return 1;
  11. } else
  12. return 0;
  13. }
  14. void
  15. pass(int in, int out)
  16. {
  17. int rv = 0;
  18. static char buf[4096];
  19. for(;;) {
  20. alarm(TIMEOUT); /* to break hanging */
  21. rv = read(in, buf, sizeof buf);
  22. if (rv == 0)
  23. break;
  24. if(rv < 0)
  25. sysfatal("read error: %r");
  26. if(write(out, buf, rv) != rv)
  27. sysfatal("write error: %r");
  28. }
  29. alarm(0);
  30. }
  31. static void
  32. usage(void)
  33. {
  34. fprint(2, "usage: %s network!destination!service\n", argv0);
  35. exits("usage");
  36. }
  37. void
  38. main(int argc, char *argv[])
  39. {
  40. int netfd;
  41. argv0 = argv[0];
  42. if (argc != 2)
  43. usage();
  44. atnotify(alarmhandler, 1);
  45. netfd = dial(argv[1], "net", 0, 0);
  46. if (netfd < 0)
  47. sysfatal("can't dial %s: %r", argv[1]);
  48. pass(0, netfd);
  49. exits(0);
  50. }