+struct cli_oplock_ack_state {
+ uint16_t vwv[8];
+};
+
+static void cli_oplock_ack_done(struct tevent_req *subreq);
+
+struct tevent_req *cli_oplock_ack_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct cli_state *cli,
+ uint16_t fnum, uint8_t level)
+{
+ struct tevent_req *req, *subreq;
+ struct cli_oplock_ack_state *state;
+
+ req = tevent_req_create(mem_ctx, &state, struct cli_oplock_ack_state);;
+ if (req == NULL) {
+ return NULL;
+ }
+ SCVAL(state->vwv+0, 0, 0xff);
+ SCVAL(state->vwv+0, 1, 0);
+ SSVAL(state->vwv+1, 0, 0);
+ SSVAL(state->vwv+2, 0, fnum);
+ SCVAL(state->vwv+3, 0, LOCKING_ANDX_OPLOCK_RELEASE);
+ SCVAL(state->vwv+3, 1, level);
+ SIVAL(state->vwv+4, 0, 0); /* timeout */
+ SSVAL(state->vwv+6, 0, 0); /* unlockcount */
+ SSVAL(state->vwv+7, 0, 0); /* lockcount */
+
+ subreq = cli_smb_send(state, ev, cli, SMBlockingX, 0, 8, state->vwv,
+ 0, NULL);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, cli_oplock_ack_done, req);
+ return req;
+}
+
+static void cli_oplock_ack_done(struct tevent_req *subreq)
+{
+ struct tevent_req *req = tevent_req_callback_data(
+ subreq, struct tevent_req);
+ NTSTATUS status;
+
+ status = cli_smb_recv(subreq, 0, NULL, NULL, NULL, NULL);
+ TALLOC_FREE(subreq);
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
+ return;
+ }
+ tevent_req_done(req);
+}
+
+NTSTATUS cli_oplock_ack_recv(struct tevent_req *req)