io.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include <reproc/drain.h>
  2. #include <reproc/reproc.h>
  3. #include "assert.h"
  4. #define MESSAGE "reproc stands for REdirected PROCess"
  5. static void io()
  6. {
  7. int r = -1;
  8. reproc_t *process = reproc_new();
  9. ASSERT(process);
  10. const char *argv[] = { RESOURCE_DIRECTORY "/io", NULL };
  11. r = reproc_start(process, argv,
  12. (reproc_options){
  13. .redirect.err.type = REPROC_REDIRECT_STDOUT });
  14. ASSERT_OK(r);
  15. r = reproc_write(process, (uint8_t *) MESSAGE, strlen(MESSAGE));
  16. ASSERT_OK(r);
  17. ASSERT_EQ_INT(r, (int) strlen(MESSAGE));
  18. r = reproc_close(process, REPROC_STREAM_IN);
  19. ASSERT_OK(r);
  20. char *out = NULL;
  21. r = reproc_drain(process, reproc_sink_string(&out), REPROC_SINK_NULL);
  22. ASSERT_OK(r);
  23. ASSERT(out != NULL);
  24. ASSERT_EQ_STR(out, MESSAGE MESSAGE);
  25. r = reproc_wait(process, REPROC_INFINITE);
  26. ASSERT_OK(r);
  27. reproc_destroy(process);
  28. reproc_free(out);
  29. }
  30. static void timeout(void)
  31. {
  32. int r = -1;
  33. reproc_t *process = reproc_new();
  34. ASSERT(process);
  35. const char *argv[] = { RESOURCE_DIRECTORY "/io", NULL };
  36. r = reproc_start(process, argv, (reproc_options){ 0 });
  37. ASSERT_OK(r);
  38. reproc_event_source source = { process, REPROC_EVENT_OUT | REPROC_EVENT_ERR,
  39. 0 };
  40. r = reproc_poll(&source, 1, 200);
  41. ASSERT(r == 0);
  42. r = reproc_close(process, REPROC_STREAM_IN);
  43. ASSERT_OK(r);
  44. r = reproc_poll(&source, 1, 200);
  45. ASSERT_OK(r);
  46. reproc_destroy(process);
  47. }
  48. int main(void)
  49. {
  50. io();
  51. timeout();
  52. }