1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-24 21:34:56 +03:00

Add async cli_close

This commit is contained in:
Volker Lendecke 2008-08-01 23:18:15 +02:00
parent 7e73dd4e76
commit f84a2b5dbf
2 changed files with 45 additions and 17 deletions

View 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,

View 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);
SSVAL(cli->outbuf,smb_vwv0,fnum);
SIVALS(cli->outbuf,smb_vwv1,-1);
cli_send_smb(cli);
if (!cli_receive_smb(cli)) {
return False;
}
return !cli_is_error(cli);
return cli_request_send(mem_ctx, cli, SMBclose, 0, 3, vwv, 0, NULL);
}
NTSTATUS cli_close_recv(struct async_req *req)
{
struct cli_request *cli_req = cli_request_get(req);
SMB_ASSERT(req->state >= ASYNC_REQ_DONE);
if (req->state == ASYNC_REQ_ERROR) {
return req->status;
}
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