librpc/rpc: add dcerpc_binding_handle_raw_call()
authorStefan Metzmacher <metze@samba.org>
Sun, 13 Mar 2011 13:58:12 +0000 (14:58 +0100)
committerStefan Metzmacher <metze@samba.org>
Sun, 13 Mar 2011 15:53:05 +0000 (16:53 +0100)
metze

librpc/rpc/binding_handle.c
librpc/rpc/rpc_common.h

index 9ad7a9bde874e0068a3c903d5a8fcbced6aa486b..6c2d8a8b12bca78708db5bcb14029cf537e112d8 100644 (file)
@@ -186,6 +186,66 @@ NTSTATUS dcerpc_binding_handle_raw_call_recv(struct tevent_req *req,
        return NT_STATUS_OK;
 }
 
        return NT_STATUS_OK;
 }
 
+NTSTATUS dcerpc_binding_handle_raw_call(struct dcerpc_binding_handle *h,
+                                       const struct GUID *object,
+                                       uint32_t opnum,
+                                       uint32_t in_flags,
+                                       const uint8_t *in_data,
+                                       size_t in_length,
+                                       TALLOC_CTX *mem_ctx,
+                                       uint8_t **out_data,
+                                       size_t *out_length,
+                                       uint32_t *out_flags)
+{
+       TALLOC_CTX *frame = talloc_stackframe();
+       struct tevent_context *ev;
+       struct tevent_req *subreq;
+       NTSTATUS status;
+
+       /*
+        * TODO: allow only one sync call
+        */
+
+       if (h->sync_ev) {
+               ev = h->sync_ev;
+       } else {
+               ev = tevent_context_init(frame);
+       }
+       if (ev == NULL) {
+               talloc_free(frame);
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       subreq = dcerpc_binding_handle_raw_call_send(frame, ev,
+                                                    h, object, opnum,
+                                                    in_flags,
+                                                    in_data,
+                                                    in_length);
+       if (subreq == NULL) {
+               talloc_free(frame);
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       if (!tevent_req_poll(subreq, ev)) {
+               status = map_nt_error_from_unix(errno);
+               talloc_free(frame);
+               return status;
+       }
+
+       status = dcerpc_binding_handle_raw_call_recv(subreq,
+                                                    mem_ctx,
+                                                    out_data,
+                                                    out_length,
+                                                    out_flags);
+       if (!NT_STATUS_IS_OK(status)) {
+               talloc_free(frame);
+               return status;
+       }
+
+       TALLOC_FREE(frame);
+       return NT_STATUS_OK;
+}
+
 struct dcerpc_binding_handle_disconnect_state {
        const struct dcerpc_binding_handle_ops *ops;
 };
 struct dcerpc_binding_handle_disconnect_state {
        const struct dcerpc_binding_handle_ops *ops;
 };
index f940c3f234592e7342189818eadd484fafbcc128..bd9c46dab477e3fae19a92b2a4fbf55235a9eb51 100644 (file)
@@ -195,6 +195,16 @@ NTSTATUS dcerpc_binding_handle_raw_call_recv(struct tevent_req *req,
                                             uint8_t **out_data,
                                             size_t *out_length,
                                             uint32_t *out_flags);
                                             uint8_t **out_data,
                                             size_t *out_length,
                                             uint32_t *out_flags);
+NTSTATUS dcerpc_binding_handle_raw_call(struct dcerpc_binding_handle *h,
+                                       const struct GUID *object,
+                                       uint32_t opnum,
+                                       uint32_t in_flags,
+                                       const uint8_t *in_data,
+                                       size_t in_length,
+                                       TALLOC_CTX *mem_ctx,
+                                       uint8_t **out_data,
+                                       size_t *out_length,
+                                       uint32_t *out_flags);
 
 struct tevent_req *dcerpc_binding_handle_disconnect_send(TALLOC_CTX *mem_ctx,
                                                struct tevent_context *ev,
 
 struct tevent_req *dcerpc_binding_handle_disconnect_send(TALLOC_CTX *mem_ctx,
                                                struct tevent_context *ev,