diff options
Diffstat (limited to 'lib/erl_interface/src/connect/send.c')
| -rw-r--r-- | lib/erl_interface/src/connect/send.c | 74 | 
1 files changed, 49 insertions, 25 deletions
| diff --git a/lib/erl_interface/src/connect/send.c b/lib/erl_interface/src/connect/send.c index 37d7db6d68..d97532d123 100644 --- a/lib/erl_interface/src/connect/send.c +++ b/lib/erl_interface/src/connect/send.c @@ -58,10 +58,17 @@ int ei_send_encoded_tmo(int fd, const erlang_pid *to,      char *s, header[1200]; /* see size calculation below */      erlang_trace *token = NULL;      int index = 5; /* reserve 5 bytes for control message */ -    int res; -#ifdef HAVE_WRITEV -    struct iovec v[2]; -#endif +    int err; +    ei_socket_callbacks *cbs; +    void *ctx; +    ssize_t len, tot_len; +    unsigned tmo = ms == 0 ? EI_SCLBK_INF_TMO : ms; + +    err = EI_GET_CBS_CTX__(&cbs, &ctx, fd); +    if (err) { +        EI_CONN_SAVE_ERRNO__(err); +        return ERL_ERROR; +    }      /* are we tracing? */      /* check that he can receive trace tokens first */ @@ -91,30 +98,47 @@ int ei_send_encoded_tmo(int fd, const erlang_pid *to,      if (ei_tracelevel >= 4)  	ei_show_sendmsg(stderr,header,msg); -#ifdef HAVE_WRITEV -     -    v[0].iov_base = (char *)header; -    v[0].iov_len = index; -    v[1].iov_base = (char *)msg; -    v[1].iov_len = msglen; -     -    if ((res = ei_writev_fill_t(fd,v,2,ms)) != index+msglen) { -	erl_errno = (res == -2) ? ETIMEDOUT : EIO; -	return -1; -    } -   -#else  /* !HAVE_WRITEV */ -   -    if ((res = ei_write_fill_t(fd,header,index,ms)) != index) {  -	erl_errno = (res == -2) ? ETIMEDOUT : EIO; -	return -1; + +#ifdef EI_HAVE_STRUCT_IOVEC__ +    if (ei_socket_callbacks_have_writev__(cbs)) { +        struct iovec v[2]; + +        v[0].iov_base = (char *)header; +        v[0].iov_len = index; +        v[1].iov_base = (char *)msg; +        v[1].iov_len = msglen; + +        len = tot_len = (ssize_t) index+msglen; +        err = ei_writev_fill_ctx_t__(cbs, ctx, v, 2, &len, tmo); +        if (!err && len != tot_len) +            err = EIO; +        if (err) { +            EI_CONN_SAVE_ERRNO__(err); +            return -1; +        } + +        return 0;      } -    if ((res = ei_write_fill_t(fd,msg,msglen,ms)) != msglen) {  -	erl_errno = (res == -2) ? ETIMEDOUT : EIO; -	return -1; +#endif /* EI_HAVE_STRUCT_IOVEC__ */ + +    /* no writev() */ +    len = tot_len = (ssize_t) index; +    err = ei_write_fill_ctx_t__(cbs, ctx, header, &len, tmo); +    if (!err && len != tot_len) +        err = EIO; +    if (err) { +        EI_CONN_SAVE_ERRNO__(err); +        return -1;      } -#endif  /* !HAVE_WRITEV */ +    len = tot_len = (ssize_t) msglen; +    err = ei_write_fill_ctx_t__(cbs, ctx, msg, &len, tmo); +    if (!err && len != tot_len) +        err = EIO; +    if (err) { +        EI_CONN_SAVE_ERRNO__(err); +        return -1; +    }      return 0;  } | 
