/* * Write data to the compressed stream. */ static int archive_compressor_program_write(struct archive_write *a, const void *buff, size_t length) { ssize_t ret; const char *buf; if (a->client_writer == NULL) { archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, "No write callback is registered? " "This is probably an internal programming error."); return (ARCHIVE_FATAL); } buf = buff; while (length > 0) { ret = child_write(a, buf, length); if (ret == -1 || ret == 0) { archive_set_error(&a->archive, EIO, "Can't write to filter"); return (ARCHIVE_FATAL); } length -= ret; buf += ret; } a->archive.file_position += length; return (ARCHIVE_OK); }
static void send_mouse_event(char code, mod_keys mods, pos p) { char buf[6] = "\e[M"; buf[3] = code | (mods & ~cfg.click_target_mod) << 2; buf[4] = p.x + 33; buf[5] = p.y + 33; child_write(buf, 6); }
int main(int argc, char **argv) { int lc, status; tst_parse_opts(argc, argv, options, &help); setup(); for (lc = 0; TEST_LOOPING(lc); lc++) { tst_count = 0; SAFE_PIPE(cleanup, pipe_fd); /* the start of child_init_and_verify and child_write is * already synchronized via pipe */ pids[0] = fork(); switch (pids[0]) { case -1: tst_brkm(TBROK | TERRNO, cleanup, "fork #0"); case 0: child_init_and_verify(); exit(0); default: break; } pids[1] = fork(); switch (pids[1]) { case -1: tst_brkm(TBROK | TERRNO, cleanup, "fork #1"); case 0: child_write(); exit(0); } /* wait until child_write writes into * child_init_and_verify's VM */ SAFE_WAITPID(cleanup, pids[1], &status, 0); if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) tst_resm(TFAIL, "child 1 returns %d", status); /* signal child_init_and_verify to verify its VM now */ TST_SAFE_CHECKPOINT_WAKE(cleanup, 0); SAFE_WAITPID(cleanup, pids[0], &status, 0); if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) tst_resm(TFAIL, "child 0 returns %d", status); } cleanup(); tst_exit(); }
/* * Write data to the compressed stream. */ static int archive_compressor_program_write(struct archive_write_filter *f, const void *buff, size_t length) { ssize_t ret; const char *buf; buf = buff; while (length > 0) { ret = child_write(f, buf, length); if (ret == -1 || ret == 0) { archive_set_error(f->archive, EIO, "Can't write to filter"); return (ARCHIVE_FATAL); } length -= ret; buf += ret; } return (ARCHIVE_OK); }
/* * Write data to the filter stream. */ int __archive_write_program_write(struct archive_write_filter *f, struct archive_write_program_data *data, const void *buff, size_t length) { ssize_t ret; const char *buf; if (data->child == 0) return (ARCHIVE_OK); buf = buff; while (length > 0) { ret = child_write(f, data, buf, length); if (ret == -1 || ret == 0) { archive_set_error(f->archive, EIO, "Can't write to filter"); return (ARCHIVE_FATAL); } length -= ret; buf += ret; } return (ARCHIVE_OK); }