Lines Matching refs:subproc
71 static void subproc_finalize(subproc_t *subproc);
450 subproc_t **sp, *subproc;
452 subproc = *sp;
453 if (subproc->pid == pid) {
455 *sp = subproc->next;
457 subproc->callback(subproc->context, status, NULL);
459 subproc->finished = true;
460 RELEASE_HERE(subproc, subproc);
1570 subproc_finalize(subproc_t *subproc)
1573 for (i = 0; i < subproc->argc; i++) {
1574 if (subproc->argv[i] != NULL) {
1575 free(subproc->argv[i]);
1576 subproc->argv[i] = NULL;
1579 if (subproc->output_fd != NULL) {
1580 ioloop_file_descriptor_release(subproc->output_fd);
1582 if (subproc->finalize != NULL) {
1583 subproc->finalize(subproc->context);
1585 free(subproc);
1591 subproc_t *subproc = context;
1592 if (subproc->output_fd) {
1593 subproc->output_fd = NULL;
1595 RELEASE_HERE(subproc, subproc);
1599 ioloop_subproc_release_(subproc_t *subproc, const char *file, int line)
1601 RELEASE(subproc, subproc);
1610 subproc_t *subproc;
1621 callback(NULL, 0, "too many subproc args");
1625 subproc = calloc(1, sizeof(*subproc));
1626 if (subproc == NULL) {
1630 RETAIN_HERE(subproc, subproc);
1632 rv = pipe(subproc->pipe_fds);
1635 RELEASE_HERE(subproc, subproc);
1638 subproc->output_fd = ioloop_file_descriptor_create(subproc->pipe_fds[0], subproc, subproc_output_finalize);
1639 if (subproc->output_fd == NULL) {
1640 // subproc->output_fd holds a reference to subproc.
1641 RETAIN_HERE(subproc, subproc);
1643 close(subproc->pipe_fds[0]);
1644 close(subproc->pipe_fds[1]);
1645 RELEASE_HERE(subproc, subproc);
1650 subproc->argv[0] = strdup(exepath);
1651 if (subproc->argv[0] == NULL) {
1652 RELEASE_HERE(subproc, subproc);
1656 subproc->argc++;
1658 subproc->argv[i + 1] = strdup(argv[i]);
1659 if (subproc->argv[i + 1] == NULL) {
1660 RELEASE_HERE(subproc, subproc);
1664 subproc->argc++;
1670 posix_spawn_file_actions_adddup2(&actions, subproc->pipe_fds[1], STDOUT_FILENO);
1671 posix_spawn_file_actions_addclose(&actions, subproc->pipe_fds[0]);
1672 posix_spawn_file_actions_addclose(&actions, subproc->pipe_fds[1]);
1676 rv = posix_spawn(&subproc->pid, exepath, &actions, &attrs, subproc->argv, environ);
1681 ERROR("posix_spawn failed for %s: %s", subproc->argv[0], strerror(err));
1682 callback(subproc, 0, strerror(err));
1683 RELEASE_HERE(subproc, subproc);
1686 subproc->callback = callback;
1687 subproc->context = context;
1688 subproc->next = subprocesses;
1689 subprocesses = subproc;
1690 RETAIN_HERE(subproc, subproc);
1693 if (output_callback != NULL && subproc->output_fd != NULL) {
1694 close(subproc->pipe_fds[1]);
1695 ioloop_add_reader(subproc->output_fd, output_callback);
1697 return subproc;
1701 ioloop_subproc_run_sync(subproc_t *subproc)
1704 RETAIN_HERE(subproc, subproc);
1708 if (subproc->finished) {
1709 RELEASE_HERE(subproc, subproc);