int skaclient2_startf (skaclient2_t_ref a, char const *prog, char const *const *argv, char const *const *envp, char const *before, unsigned int beforelen, char const *after, unsigned int afterlen, uint32 options, struct taia const *deadline, struct taia *stamp)
{
  int fds[3] ;
  unsigned int pid = child_spawn2(prog, argv, envp, 0, 0, fds) ;
  register int e ;
  if (!pid) return 0 ;
  a->sync.pid = pid ;
  a->sync.options = options ;
  skaclientin_init(&a->sync.in, fds[0]) ;
  bufalloc_init(&a->sync.out, &fd_write, fds[1]) ;
  skaclientin_init(&a->async, fds[2]) ;
  {
    char tmp[beforelen] ;
    if (skaclientin_read(&a->sync.in, tmp, beforelen, deadline, stamp) < beforelen) { e = errno ; goto err ; }
    if (byte_diff(tmp, beforelen, before)) { e = EPROTO ; goto err ; }
  }
  {
    char tmp[afterlen] ;
    if (skaclientin_read(&a->async, tmp, afterlen, deadline, stamp) < afterlen) { e = errno ; goto err ; }
    if (byte_diff(tmp, afterlen, after)) { e = EPROTO ; goto err ; }
  }
  return 1 ;

 err:
  skaclient_end(&a->sync) ;
  skaclientin_end(&a->async) ;
  errno = e ;
  return 0 ;
}
Exemplo n.º 2
0
void skaclient3_end (skaclient3_t_ref a)
{
  skaclient_end(&a->sync) ;
  skaclientin_end(&a->asyncin) ;
  {
    register int e = errno ;
    fd_close(bufalloc_fd(&a->asyncout)) ;
    errno = e ;
  }
  bufalloc_free(&a->asyncout) ;
}