s3: Add a talloc_move for the inbuf to cli_smb_recv
[samba.git] / source3 / include / async_smb.h
index ef53ee21639c8f1683bec362634c4041554b63ef..b73aed00046a0eec5db1767f6dc781cb2b81d9fd 100644 (file)
 
 #include "includes.h"
 
-/**
- * struct cli_request is the state holder for an async client request we sent
- * to the server. It can consist of more than one struct async_req that we
- * have to server if the application did a cli_chain_cork() and
- * cli_chain_uncork()
- */
-
-struct cli_request {
-       /**
-        * "prev" and "next" form the doubly linked list in
-        * cli_state->outstanding_requests
-        */
-       struct cli_request *prev, *next;
-
-       /**
-        * num_async: How many chained requests do we serve?
-        */
-       int num_async;
-
-       /**
-        * async: This is the list of chained requests that were queued up by
-        * cli_request_chain before we sent out this request
-        */
-       struct async_req **async;
-
-       /**
-        * The client connection for this request
-        */
-       struct cli_state *cli;
-
-       /**
-        * The enc_state to decrypt the reply
-        */
-       struct smb_trans_enc_state *enc_state;
-
-       /**
-        * The mid we used for this request. Mainly used to demultiplex on
-        * receiving replies.
-        */
-       uint16_t mid;
-
-       /**
-        * The bytes we have to ship to the server
-        */
-       uint8_t *outbuf;
-
-       /**
-        * How much from "outbuf" did we already send
-        */
-       size_t sent;
-
-       /**
-        * The reply comes in here. Its intended size is implicit by
-        * smb_len(), its current size can be read via talloc_get_size()
-        */
-       char *inbuf;
-
-       /**
-        * Specific requests might add stuff here. Maybe convert this to a
-        * private_pointer at some point.
-        */
-       union {
-               struct {
-                       off_t ofs;
-                       size_t size;
-                       ssize_t received;
-                       uint8_t *rcvbuf;
-               } read;
-               struct {
-                       DATA_BLOB data;
-                       uint16_t num_echos;
-               } echo;
-       } data;
-
-       /**
-        * For requests that don't follow the strict request/reply pattern
-        * such as the transaction request family and echo requests it is
-        * necessary to break the standard procedure in
-        * handle_incoming_pdu(). For a simple example look at
-        * cli_echo_recv_helper().
-        */
-       struct {
-               void (*fn)(struct async_req *req);
-               void *priv;
-       } recv_helper;
-};
-
-/*
- * Ship a new smb request to the server
- */
-
-struct async_req *cli_request_send(TALLOC_CTX *mem_ctx,
-                                  struct event_context *ev,
-                                  struct cli_state *cli,
-                                  uint8_t smb_command,
-                                  uint8_t additional_flags,
-                                  uint8_t wct, const uint16_t *vwv,
-                                  size_t bytes_alignment,
-                                  uint32_t num_bytes, const uint8_t *bytes);
-
-bool cli_chain_cork(struct cli_state *cli, struct event_context *ev,
-                   size_t size_hint);
-void cli_chain_uncork(struct cli_state *cli);
-bool cli_in_chain(struct cli_state *cli);
-bool smb_splice_chain(uint8_t **poutbuf, uint8_t smb_command,
-                     uint8_t wct, const uint16_t *vwv,
-                     size_t bytes_alignment,
-                     uint32_t num_bytes, const uint8_t *bytes);
-
-NTSTATUS cli_pull_reply(struct async_req *req,
-                       uint8_t *pwct, uint16_t **pvwv,
-                       uint16_t *pnum_bytes, uint8_t **pbytes);
-
 /*
  * Fetch an error out of a NBT packet
  */
@@ -147,4 +34,39 @@ NTSTATUS cli_pull_error(char *buf);
 
 void cli_set_error(struct cli_state *cli, NTSTATUS status);
 
+struct tevent_req *cli_smb_req_create(TALLOC_CTX *mem_ctx,
+                                     struct event_context *ev,
+                                     struct cli_state *cli,
+                                     uint8_t smb_command,
+                                     uint8_t additional_flags,
+                                     uint8_t wct, uint16_t *vwv,
+                                     int iov_count,
+                                     struct iovec *bytes_iov);
+NTSTATUS cli_smb_req_send(struct tevent_req *req);
+size_t cli_smb_wct_ofs(struct tevent_req **reqs, int num_reqs);
+NTSTATUS cli_smb_chain_send(struct tevent_req **reqs, int num_reqs);
+uint8_t *cli_smb_inbuf(struct tevent_req *req);
+bool cli_has_async_calls(struct cli_state *cli);
+void cli_smb_req_unset_pending(struct tevent_req *req);
+bool cli_smb_req_set_pending(struct tevent_req *req);
+uint16_t cli_smb_req_mid(struct tevent_req *req);
+void cli_smb_req_set_mid(struct tevent_req *req, uint16_t mid);
+struct tevent_req *cli_smb_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
+                               struct cli_state *cli,
+                               uint8_t smb_command, uint8_t additional_flags,
+                               uint8_t wct, uint16_t *vwv,
+                               uint32_t num_bytes,
+                               const uint8_t *bytes);
+NTSTATUS cli_smb_recv(struct tevent_req *req,
+                     TALLOC_CTX *mem_ctx, uint8_t **pinbuf,
+                     uint8_t min_wct, uint8_t *pwct, uint16_t **pvwv,
+                     uint32_t *pnum_bytes, uint8_t **pbytes);
+
+struct tevent_req *cli_smb_oplock_break_waiter_send(TALLOC_CTX *mem_ctx,
+                                                   struct event_context *ev,
+                                                   struct cli_state *cli);
+NTSTATUS cli_smb_oplock_break_waiter_recv(struct tevent_req *req,
+                                         uint16_t *pfnum,
+                                         uint8_t *plevel);
+
 #endif