/* * queue a wbsrv_call reply on a wbsrv_connection * NOTE: that this implies talloc_free(call), * use talloc_reference(call) if you need it after * calling wbsrv_queue_reply */ NTSTATUS wbsrv_samba3_send_reply(struct wbsrv_samba3_call *call) { struct wbsrv_connection *wbsrv_conn = call->wbconn; struct tevent_req *subreq; NTSTATUS status; status = wbsrv_samba3_push_reply(call); NT_STATUS_NOT_OK_RETURN(status); call->out_iov[0].iov_base = (char *) call->out.data; call->out_iov[0].iov_len = call->out.length; subreq = tstream_writev_queue_send(call, wbsrv_conn->conn->event.ctx, wbsrv_conn->tstream, wbsrv_conn->send_queue, call->out_iov, 1); if (subreq == NULL) { wbsrv_terminate_connection(wbsrv_conn, "wbsrv_call_loop: " "no memory for tstream_writev_queue_send"); return NT_STATUS_NO_MEMORY; } tevent_req_set_callback(subreq, wbsrv_samba3_send_reply_done, call); return status; }
/* * queue a wbsrv_call reply on a wbsrv_connection * NOTE: that this implies talloc_free(call), * use talloc_reference(call) if you need it after * calling wbsrv_queue_reply */ NTSTATUS wbsrv_samba3_send_reply(struct wbsrv_samba3_call *call) { struct wbsrv_connection *wbconn = call->wbconn; DATA_BLOB rep; NTSTATUS status; status = wbsrv_samba3_push_reply(call, call, &rep); NT_STATUS_NOT_OK_RETURN(status); status = packet_send(call->wbconn->packet, rep); talloc_free(call); if (!NT_STATUS_IS_OK(status)) { wbsrv_terminate_connection(wbconn, "failed to packet_send winbindd reply"); return status; } /* the call isn't needed any more */ return status; }