Add async cli_close
authorVolker Lendecke <vl@samba.org>
Fri, 1 Aug 2008 21:18:15 +0000 (23:18 +0200)
committerVolker Lendecke <vl@samba.org>
Thu, 28 Aug 2008 15:53:36 +0000 (17:53 +0200)
(This used to be commit f84a2b5dbf8a072a9e356fa39523f65d042a2643)

source3/include/proto.h
source3/libsmb/clifile.c

index 0e691d9062175ece1559287b9886d7bac7996998..41185a63b989731ecbdfe78a0abcd7d5361637f7 100644 (file)
@@ -4379,6 +4379,9 @@ int cli_nt_create_full(struct cli_state *cli, const char *fname,
                 uint8 SecuityFlags);
 int cli_nt_create(struct cli_state *cli, const char *fname, uint32 DesiredAccess);
 int cli_open(struct cli_state *cli, const char *fname, int flags, int share_mode);
+struct async_req *cli_close_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
+                                struct cli_state *cli, int fnum);
+NTSTATUS cli_close_recv(struct async_req *req);
 bool cli_close(struct cli_state *cli, int fnum);
 bool cli_ftruncate(struct cli_state *cli, int fnum, uint64_t size);
 NTSTATUS cli_locktype(struct cli_state *cli, int fnum,
index 12b10ba0a0dff399348de5b79d196dc62b60635e..20357bbec0451472b39dad9975d3b38c77e1998a 100644 (file)
@@ -865,28 +865,53 @@ int cli_open(struct cli_state *cli, const char *fname, int flags, int share_mode
  Close a file.
 ****************************************************************************/
 
-bool cli_close(struct cli_state *cli, int fnum)
+struct async_req *cli_close_send(TALLOC_CTX *mem_ctx, struct cli_state *cli,
+                                int fnum)
 {
-       memset(cli->outbuf,'\0',smb_size);
-       memset(cli->inbuf,'\0',smb_size);
+       uint16_t vwv[3];
 
-       cli_set_message(cli->outbuf,3,0,True);
+       SSVAL(vwv+0, 0, fnum);
+       SIVALS(vwv+1, 0, -1);
 
-       SCVAL(cli->outbuf,smb_com,SMBclose);
-       SSVAL(cli->outbuf,smb_tid,cli->cnum);
-       cli_setup_packet(cli);
+       return cli_request_send(mem_ctx, cli, SMBclose, 0, 3, vwv, 0, NULL);
+}
 
-       SSVAL(cli->outbuf,smb_vwv0,fnum);
-       SIVALS(cli->outbuf,smb_vwv1,-1);
+NTSTATUS cli_close_recv(struct async_req *req)
+{
+       struct cli_request *cli_req = cli_request_get(req);
 
-       cli_send_smb(cli);
-       if (!cli_receive_smb(cli)) {
-               return False;
+       SMB_ASSERT(req->state >= ASYNC_REQ_DONE);
+       if (req->state == ASYNC_REQ_ERROR) {
+               return req->status;
        }
 
-       return !cli_is_error(cli);
+       return cli_pull_error(cli_req->inbuf);
 }
 
+bool cli_close(struct cli_state *cli, int fnum)
+{
+       TALLOC_CTX *frame = talloc_stackframe();
+       struct async_req *req;
+       bool result = false;
+
+       if (cli_tmp_event_ctx(frame, cli) == NULL) {
+               goto fail;
+       }
+
+       req = cli_close_send(frame, cli, fnum);
+       if (req == NULL) {
+               goto fail;
+       }
+
+       while (req->state < ASYNC_REQ_DONE) {
+               event_loop_once(cli->event_ctx);
+       }
+
+       result = NT_STATUS_IS_OK(cli_close_recv(req));
+ fail:
+       TALLOC_FREE(frame);
+       return result;
+}
 
 /****************************************************************************
  Truncate a file to a specified size