cat.c 824 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /* See LICENSE file for copyright and license details. */
  2. #include <fcntl.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include "util.h"
  6. static void
  7. usage(void)
  8. {
  9. eprintf("usage: %s [-u] [file ...]\n", argv0);
  10. }
  11. int
  12. main(int argc, char *argv[])
  13. {
  14. int fd, ret = 0;
  15. ARGBEGIN {
  16. case 'u':
  17. break;
  18. default:
  19. usage();
  20. } ARGEND
  21. if (!argc) {
  22. if (concat(0, "<stdin>", 1, "<stdout>") < 0)
  23. ret = 1;
  24. } else {
  25. for (; *argv; argc--, argv++) {
  26. if (!strcmp(*argv, "-")) {
  27. *argv = "<stdin>";
  28. fd = 0;
  29. } else if ((fd = open(*argv, O_RDONLY)) < 0) {
  30. weprintf("open %s:", *argv);
  31. ret = 1;
  32. continue;
  33. }
  34. switch (concat(fd, *argv, 1, "<stdout>")) {
  35. case -1:
  36. ret = 1;
  37. break;
  38. case -2:
  39. return 1; /* exit on write error */
  40. }
  41. if (fd != 0)
  42. close(fd);
  43. }
  44. }
  45. return ret;
  46. }