1/*
2   Unix SMB/CIFS implementation.
3   SMB client oplock functions
4   Copyright (C) Andrew Tridgell 2001
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2 of the License, or
9   (at your option) any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software
18   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#define NO_SYSLOG
22
23#include "includes.h"
24
25/****************************************************************************
26send an ack for an oplock break request
27****************************************************************************/
28BOOL cli_oplock_ack(struct cli_state *cli, int fnum, unsigned char level)
29{
30	char *oldbuf = cli->outbuf;
31	pstring buf;
32	BOOL ret;
33
34	cli->outbuf = buf;
35
36        memset(buf,'\0',smb_size);
37        set_message(buf,8,0,True);
38
39        SCVAL(buf,smb_com,SMBlockingX);
40	SSVAL(buf,smb_tid, cli->cnum);
41        cli_setup_packet(cli);
42	SSVAL(buf,smb_vwv0,0xFF);
43	SSVAL(buf,smb_vwv1,0);
44	SSVAL(buf,smb_vwv2,fnum);
45	if (level == 1)
46		SSVAL(buf,smb_vwv3,0x102); /* levelII oplock break ack */
47	else
48		SSVAL(buf,smb_vwv3,2); /* exclusive oplock break ack */
49	SIVAL(buf,smb_vwv4,0); /* timoeut */
50	SSVAL(buf,smb_vwv6,0); /* unlockcount */
51	SSVAL(buf,smb_vwv7,0); /* lockcount */
52
53        ret = cli_send_smb(cli);
54
55	cli->outbuf = oldbuf;
56
57	return ret;
58}
59
60
61/****************************************************************************
62set the oplock handler for a connection
63****************************************************************************/
64void cli_oplock_handler(struct cli_state *cli,
65			BOOL (*handler)(struct cli_state *, int, unsigned char))
66{
67	cli->oplock_handler = handler;
68}
69