2 Unix SMB/Netbios implementation.
5 Copyright (C) Andrew Tridgell 1994-1998
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 /****************************************************************************
28 ****************************************************************************/
29 BOOL
cli_rename(struct cli_state
*cli
, char *fname_src
, char *fname_dst
)
33 memset(cli
->outbuf
,'\0',smb_size
);
34 memset(cli
->inbuf
,'\0',smb_size
);
36 set_message(cli
->outbuf
,1, 0, True
);
38 CVAL(cli
->outbuf
,smb_com
) = SMBmv
;
39 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
40 cli_setup_packet(cli
);
42 SSVAL(cli
->outbuf
,smb_vwv0
,aSYSTEM
| aHIDDEN
| aDIR
);
44 p
= smb_buf(cli
->outbuf
);
46 p
+= clistr_push(cli
, p
, fname_src
, -1,
47 STR_TERMINATE
| STR_CONVERT
);
49 p
+= clistr_push(cli
, p
, fname_dst
, -1,
50 STR_TERMINATE
| STR_CONVERT
);
52 cli_setup_bcc(cli
, p
);
55 if (!cli_receive_smb(cli
)) {
59 if (CVAL(cli
->inbuf
,smb_rcls
) != 0) {
66 /****************************************************************************
68 ****************************************************************************/
69 BOOL
cli_unlink(struct cli_state
*cli
, char *fname
)
73 memset(cli
->outbuf
,'\0',smb_size
);
74 memset(cli
->inbuf
,'\0',smb_size
);
76 set_message(cli
->outbuf
,1, 0,True
);
78 CVAL(cli
->outbuf
,smb_com
) = SMBunlink
;
79 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
80 cli_setup_packet(cli
);
82 SSVAL(cli
->outbuf
,smb_vwv0
,aSYSTEM
| aHIDDEN
);
84 p
= smb_buf(cli
->outbuf
);
86 p
+= clistr_push(cli
, p
, fname
, -1, STR_TERMINATE
| STR_CONVERT
);
88 cli_setup_bcc(cli
, p
);
90 if (!cli_receive_smb(cli
)) {
94 if (CVAL(cli
->inbuf
,smb_rcls
) != 0) {
101 /****************************************************************************
103 ****************************************************************************/
104 BOOL
cli_mkdir(struct cli_state
*cli
, char *dname
)
108 memset(cli
->outbuf
,'\0',smb_size
);
109 memset(cli
->inbuf
,'\0',smb_size
);
111 set_message(cli
->outbuf
,0, 0,True
);
113 CVAL(cli
->outbuf
,smb_com
) = SMBmkdir
;
114 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
115 cli_setup_packet(cli
);
117 p
= smb_buf(cli
->outbuf
);
119 p
+= clistr_push(cli
, p
, dname
, -1, STR_CONVERT
|STR_TERMINATE
);
121 cli_setup_bcc(cli
, p
);
124 if (!cli_receive_smb(cli
)) {
128 if (CVAL(cli
->inbuf
,smb_rcls
) != 0) {
135 /****************************************************************************
137 ****************************************************************************/
138 BOOL
cli_rmdir(struct cli_state
*cli
, char *dname
)
142 memset(cli
->outbuf
,'\0',smb_size
);
143 memset(cli
->inbuf
,'\0',smb_size
);
145 set_message(cli
->outbuf
,0, 0, True
);
147 CVAL(cli
->outbuf
,smb_com
) = SMBrmdir
;
148 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
149 cli_setup_packet(cli
);
151 p
= smb_buf(cli
->outbuf
);
153 p
+= clistr_push(cli
, p
, dname
, -1, STR_TERMINATE
|STR_CONVERT
);
155 cli_setup_bcc(cli
, p
);
158 if (!cli_receive_smb(cli
)) {
162 if (CVAL(cli
->inbuf
,smb_rcls
) != 0) {
169 /****************************************************************************
170 Set or clear the delete on close flag.
171 ****************************************************************************/
173 int cli_nt_delete_on_close(struct cli_state
*cli
, int fnum
, BOOL flag
)
177 uint16 setup
= TRANSACT2_SETFILEINFO
;
180 char *rparam
=NULL
, *rdata
=NULL
;
182 memset(param
, 0, param_len
);
184 SSVAL(param
,2,SMB_SET_FILE_DISPOSITION_INFO
);
188 if (!cli_send_trans(cli
, SMBtrans2
,
190 -1, 0, /* fid, flags */
191 &setup
, 1, 0, /* setup, length, max */
192 param
, param_len
, 2, /* param, length, max */
193 (char *)&data
, data_len
, cli
->max_xmit
/* data, length, max */
198 if (!cli_receive_trans(cli
, SMBtrans2
,
200 &rdata
, &data_len
)) {
204 if (rdata
) free(rdata
);
205 if (rparam
) free(rparam
);
210 /****************************************************************************
211 open a file - exposing the full horror of the NT API :-).
213 ****************************************************************************/
215 int cli_nt_create_full(struct cli_state
*cli
, char *fname
, uint32 DesiredAccess
,
216 uint32 FileAttributes
, uint32 ShareAccess
,
217 uint32 CreateDisposition
, uint32 CreateOptions
)
222 memset(cli
->outbuf
,'\0',smb_size
);
223 memset(cli
->inbuf
,'\0',smb_size
);
225 set_message(cli
->outbuf
,24,0,True
);
227 CVAL(cli
->outbuf
,smb_com
) = SMBntcreateX
;
228 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
229 cli_setup_packet(cli
);
231 SSVAL(cli
->outbuf
,smb_vwv0
,0xFF);
232 if (cli
->use_oplocks
)
233 SIVAL(cli
->outbuf
,smb_ntcreate_Flags
, REQUEST_OPLOCK
|REQUEST_BATCH_OPLOCK
);
235 SIVAL(cli
->outbuf
,smb_ntcreate_Flags
, 0);
236 SIVAL(cli
->outbuf
,smb_ntcreate_RootDirectoryFid
, 0x0);
237 SIVAL(cli
->outbuf
,smb_ntcreate_DesiredAccess
, DesiredAccess
);
238 SIVAL(cli
->outbuf
,smb_ntcreate_FileAttributes
, FileAttributes
);
239 SIVAL(cli
->outbuf
,smb_ntcreate_ShareAccess
, ShareAccess
);
240 SIVAL(cli
->outbuf
,smb_ntcreate_CreateDisposition
, CreateDisposition
);
241 SIVAL(cli
->outbuf
,smb_ntcreate_CreateOptions
, CreateOptions
);
242 SIVAL(cli
->outbuf
,smb_ntcreate_ImpersonationLevel
, 0x02);
244 p
= smb_buf(cli
->outbuf
);
245 /* this alignment and termination is critical for netapp filers. Don't change */
246 p
+= clistr_align(cli
->outbuf
, p
);
247 len
= clistr_push(cli
, p
, fname
, -1, STR_CONVERT
);
249 SSVAL(cli
->outbuf
,smb_ntcreate_NameLength
, len
);
250 /* sigh. this copes with broken netapp filer behaviour */
251 p
+= clistr_push(cli
, p
, "", -1, STR_TERMINATE
);
253 cli_setup_bcc(cli
, p
);
256 if (!cli_receive_smb(cli
)) {
260 if (CVAL(cli
->inbuf
,smb_rcls
) != 0) {
264 return SVAL(cli
->inbuf
,smb_vwv2
+ 1);
267 /****************************************************************************
269 ****************************************************************************/
271 int cli_nt_create(struct cli_state
*cli
, char *fname
, uint32 DesiredAccess
)
273 return cli_nt_create_full(cli
, fname
, DesiredAccess
, 0,
274 FILE_SHARE_READ
|FILE_SHARE_WRITE
, FILE_EXISTS_OPEN
, 0x0);
277 /****************************************************************************
279 WARNING: if you open with O_WRONLY then getattrE won't work!
280 ****************************************************************************/
281 int cli_open(struct cli_state
*cli
, char *fname
, int flags
, int share_mode
)
285 unsigned accessmode
=0;
289 if (!(flags
& O_EXCL
)) {
296 accessmode
= (share_mode
<<4);
298 if ((flags
& O_ACCMODE
) == O_RDWR
) {
300 } else if ((flags
& O_ACCMODE
) == O_WRONLY
) {
305 if ((flags
& O_SYNC
) == O_SYNC
) {
306 accessmode
|= (1<<14);
310 if (share_mode
== DENY_FCB
) {
314 memset(cli
->outbuf
,'\0',smb_size
);
315 memset(cli
->inbuf
,'\0',smb_size
);
317 set_message(cli
->outbuf
,15,0,True
);
319 CVAL(cli
->outbuf
,smb_com
) = SMBopenX
;
320 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
321 cli_setup_packet(cli
);
323 SSVAL(cli
->outbuf
,smb_vwv0
,0xFF);
324 SSVAL(cli
->outbuf
,smb_vwv2
,0); /* no additional info */
325 SSVAL(cli
->outbuf
,smb_vwv3
,accessmode
);
326 SSVAL(cli
->outbuf
,smb_vwv4
,aSYSTEM
| aHIDDEN
);
327 SSVAL(cli
->outbuf
,smb_vwv5
,0);
328 SSVAL(cli
->outbuf
,smb_vwv8
,openfn
);
330 if (cli
->use_oplocks
) {
331 /* if using oplocks then ask for a batch oplock via
332 core and extended methods */
333 CVAL(cli
->outbuf
,smb_flg
) |=
334 FLAG_REQUEST_OPLOCK
|FLAG_REQUEST_BATCH_OPLOCK
;
335 SSVAL(cli
->outbuf
,smb_vwv2
,SVAL(cli
->outbuf
,smb_vwv2
) | 6);
338 p
= smb_buf(cli
->outbuf
);
339 p
+= clistr_push(cli
, p
, fname
, -1, STR_TERMINATE
| STR_CONVERT
);
341 cli_setup_bcc(cli
, p
);
344 if (!cli_receive_smb(cli
)) {
348 if (CVAL(cli
->inbuf
,smb_rcls
) != 0) {
352 return SVAL(cli
->inbuf
,smb_vwv2
);
358 /****************************************************************************
360 ****************************************************************************/
361 BOOL
cli_close(struct cli_state
*cli
, int fnum
)
363 memset(cli
->outbuf
,'\0',smb_size
);
364 memset(cli
->inbuf
,'\0',smb_size
);
366 set_message(cli
->outbuf
,3,0,True
);
368 CVAL(cli
->outbuf
,smb_com
) = SMBclose
;
369 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
370 cli_setup_packet(cli
);
372 SSVAL(cli
->outbuf
,smb_vwv0
,fnum
);
373 SIVALS(cli
->outbuf
,smb_vwv1
,-1);
376 if (!cli_receive_smb(cli
)) {
380 if (CVAL(cli
->inbuf
,smb_rcls
) != 0) {
388 /****************************************************************************
390 ****************************************************************************/
391 BOOL
cli_lock(struct cli_state
*cli
, int fnum
,
392 uint32 offset
, uint32 len
, int timeout
, enum brl_type lock_type
)
395 int saved_timeout
= cli
->timeout
;
397 memset(cli
->outbuf
,'\0',smb_size
);
398 memset(cli
->inbuf
,'\0', smb_size
);
400 set_message(cli
->outbuf
,8,0,True
);
402 CVAL(cli
->outbuf
,smb_com
) = SMBlockingX
;
403 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
404 cli_setup_packet(cli
);
406 CVAL(cli
->outbuf
,smb_vwv0
) = 0xFF;
407 SSVAL(cli
->outbuf
,smb_vwv2
,fnum
);
408 CVAL(cli
->outbuf
,smb_vwv3
) = (lock_type
== READ_LOCK
? 1 : 0);
409 SIVALS(cli
->outbuf
, smb_vwv4
, timeout
);
410 SSVAL(cli
->outbuf
,smb_vwv6
,0);
411 SSVAL(cli
->outbuf
,smb_vwv7
,1);
413 p
= smb_buf(cli
->outbuf
);
414 SSVAL(p
, 0, cli
->pid
);
420 cli_setup_bcc(cli
, p
);
424 cli
->timeout
= (timeout
== -1) ? 0x7FFFFFFF : (timeout
+ 2*1000);
426 if (!cli_receive_smb(cli
)) {
427 cli
->timeout
= saved_timeout
;
431 cli
->timeout
= saved_timeout
;
433 if (CVAL(cli
->inbuf
,smb_rcls
) != 0) {
440 /****************************************************************************
442 ****************************************************************************/
443 BOOL
cli_unlock(struct cli_state
*cli
, int fnum
, uint32 offset
, uint32 len
)
447 memset(cli
->outbuf
,'\0',smb_size
);
448 memset(cli
->inbuf
,'\0',smb_size
);
450 set_message(cli
->outbuf
,8,0,True
);
452 CVAL(cli
->outbuf
,smb_com
) = SMBlockingX
;
453 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
454 cli_setup_packet(cli
);
456 CVAL(cli
->outbuf
,smb_vwv0
) = 0xFF;
457 SSVAL(cli
->outbuf
,smb_vwv2
,fnum
);
458 CVAL(cli
->outbuf
,smb_vwv3
) = 0;
459 SIVALS(cli
->outbuf
, smb_vwv4
, 0);
460 SSVAL(cli
->outbuf
,smb_vwv6
,1);
461 SSVAL(cli
->outbuf
,smb_vwv7
,0);
463 p
= smb_buf(cli
->outbuf
);
464 SSVAL(p
, 0, cli
->pid
);
468 cli_setup_bcc(cli
, p
);
470 if (!cli_receive_smb(cli
)) {
474 if (CVAL(cli
->inbuf
,smb_rcls
) != 0) {
482 /****************************************************************************
483 lock a file with 64 bit offsets
484 ****************************************************************************/
485 BOOL
cli_lock64(struct cli_state
*cli
, int fnum
,
486 SMB_BIG_UINT offset
, SMB_BIG_UINT len
, int timeout
, enum brl_type lock_type
)
489 int saved_timeout
= cli
->timeout
;
492 ltype
= (lock_type
== READ_LOCK
? 1 : 0);
493 ltype
|= LOCKING_ANDX_LARGE_FILES
;
495 memset(cli
->outbuf
,'\0',smb_size
);
496 memset(cli
->inbuf
,'\0', smb_size
);
498 set_message(cli
->outbuf
,8,0,True
);
500 CVAL(cli
->outbuf
,smb_com
) = SMBlockingX
;
501 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
502 cli_setup_packet(cli
);
504 CVAL(cli
->outbuf
,smb_vwv0
) = 0xFF;
505 SSVAL(cli
->outbuf
,smb_vwv2
,fnum
);
506 CVAL(cli
->outbuf
,smb_vwv3
) = ltype
;
507 SIVALS(cli
->outbuf
, smb_vwv4
, timeout
);
508 SSVAL(cli
->outbuf
,smb_vwv6
,0);
509 SSVAL(cli
->outbuf
,smb_vwv7
,1);
511 p
= smb_buf(cli
->outbuf
);
512 SIVAL(p
, 0, cli
->pid
);
513 SOFF_T_R(p
, 4, offset
);
514 SOFF_T_R(p
, 12, len
);
517 cli_setup_bcc(cli
, p
);
520 cli
->timeout
= (timeout
== -1) ? 0x7FFFFFFF : (timeout
+ 2*1000);
522 if (!cli_receive_smb(cli
)) {
523 cli
->timeout
= saved_timeout
;
527 cli
->timeout
= saved_timeout
;
529 if (CVAL(cli
->inbuf
,smb_rcls
) != 0) {
536 /****************************************************************************
537 unlock a file with 64 bit offsets
538 ****************************************************************************/
539 BOOL
cli_unlock64(struct cli_state
*cli
, int fnum
, SMB_BIG_UINT offset
, SMB_BIG_UINT len
)
543 memset(cli
->outbuf
,'\0',smb_size
);
544 memset(cli
->inbuf
,'\0',smb_size
);
546 set_message(cli
->outbuf
,8,0,True
);
548 CVAL(cli
->outbuf
,smb_com
) = SMBlockingX
;
549 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
550 cli_setup_packet(cli
);
552 CVAL(cli
->outbuf
,smb_vwv0
) = 0xFF;
553 SSVAL(cli
->outbuf
,smb_vwv2
,fnum
);
554 CVAL(cli
->outbuf
,smb_vwv3
) = LOCKING_ANDX_LARGE_FILES
;
555 SIVALS(cli
->outbuf
, smb_vwv4
, 0);
556 SSVAL(cli
->outbuf
,smb_vwv6
,1);
557 SSVAL(cli
->outbuf
,smb_vwv7
,0);
559 p
= smb_buf(cli
->outbuf
);
560 SIVAL(p
, 0, cli
->pid
);
561 SOFF_T_R(p
, 4, offset
);
562 SOFF_T_R(p
, 12, len
);
564 cli_setup_bcc(cli
, p
);
566 if (!cli_receive_smb(cli
)) {
570 if (CVAL(cli
->inbuf
,smb_rcls
) != 0) {
581 /****************************************************************************
582 do a SMBgetattrE call
583 ****************************************************************************/
584 BOOL
cli_getattrE(struct cli_state
*cli
, int fd
,
585 uint16
*attr
, size_t *size
,
586 time_t *c_time
, time_t *a_time
, time_t *m_time
)
588 memset(cli
->outbuf
,'\0',smb_size
);
589 memset(cli
->inbuf
,'\0',smb_size
);
591 set_message(cli
->outbuf
,1,0,True
);
593 CVAL(cli
->outbuf
,smb_com
) = SMBgetattrE
;
594 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
595 cli_setup_packet(cli
);
597 SSVAL(cli
->outbuf
,smb_vwv0
,fd
);
600 if (!cli_receive_smb(cli
)) {
604 if (CVAL(cli
->inbuf
,smb_rcls
) != 0) {
609 *size
= IVAL(cli
->inbuf
, smb_vwv6
);
613 *attr
= SVAL(cli
->inbuf
,smb_vwv10
);
617 *c_time
= make_unix_date3(cli
->inbuf
+smb_vwv0
);
621 *a_time
= make_unix_date3(cli
->inbuf
+smb_vwv2
);
625 *m_time
= make_unix_date3(cli
->inbuf
+smb_vwv4
);
632 /****************************************************************************
634 ****************************************************************************/
635 BOOL
cli_getatr(struct cli_state
*cli
, char *fname
,
636 uint16
*attr
, size_t *size
, time_t *t
)
640 memset(cli
->outbuf
,'\0',smb_size
);
641 memset(cli
->inbuf
,'\0',smb_size
);
643 set_message(cli
->outbuf
,0,0,True
);
645 CVAL(cli
->outbuf
,smb_com
) = SMBgetatr
;
646 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
647 cli_setup_packet(cli
);
649 p
= smb_buf(cli
->outbuf
);
651 p
+= clistr_push(cli
, p
, fname
, -1, STR_TERMINATE
| STR_CONVERT
);
653 cli_setup_bcc(cli
, p
);
656 if (!cli_receive_smb(cli
)) {
660 if (CVAL(cli
->inbuf
,smb_rcls
) != 0) {
665 *size
= IVAL(cli
->inbuf
, smb_vwv3
);
669 *t
= make_unix_date3(cli
->inbuf
+smb_vwv1
);
673 *attr
= SVAL(cli
->inbuf
,smb_vwv0
);
681 /****************************************************************************
683 ****************************************************************************/
684 BOOL
cli_setatr(struct cli_state
*cli
, char *fname
, uint16 attr
, time_t t
)
688 memset(cli
->outbuf
,'\0',smb_size
);
689 memset(cli
->inbuf
,'\0',smb_size
);
691 set_message(cli
->outbuf
,8,0,True
);
693 CVAL(cli
->outbuf
,smb_com
) = SMBsetatr
;
694 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
695 cli_setup_packet(cli
);
697 SSVAL(cli
->outbuf
,smb_vwv0
, attr
);
698 put_dos_date3(cli
->outbuf
,smb_vwv1
, t
);
700 p
= smb_buf(cli
->outbuf
);
702 p
+= clistr_push(cli
, p
, fname
, -1, STR_TERMINATE
| STR_CONVERT
);
705 cli_setup_bcc(cli
, p
);
708 if (!cli_receive_smb(cli
)) {
712 if (CVAL(cli
->inbuf
,smb_rcls
) != 0) {
720 /****************************************************************************
721 check for existance of a dir
722 ****************************************************************************/
723 BOOL
cli_chkpath(struct cli_state
*cli
, char *path
)
728 safe_strcpy(path2
,path
,sizeof(pstring
));
729 trim_string(path2
,NULL
,"\\");
730 if (!*path2
) *path2
= '\\';
732 memset(cli
->outbuf
,'\0',smb_size
);
733 set_message(cli
->outbuf
,0,0,True
);
734 SCVAL(cli
->outbuf
,smb_com
,SMBchkpth
);
735 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
736 cli_setup_packet(cli
);
737 p
= smb_buf(cli
->outbuf
);
739 p
+= clistr_push(cli
, p
, path2
, -1, STR_TERMINATE
| STR_CONVERT
);
741 cli_setup_bcc(cli
, p
);
744 if (!cli_receive_smb(cli
)) {
748 if (cli_error(cli
, NULL
, NULL
, NULL
)) return False
;
755 /****************************************************************************
757 ****************************************************************************/
758 BOOL
cli_dskattr(struct cli_state
*cli
, int *bsize
, int *total
, int *avail
)
760 memset(cli
->outbuf
,'\0',smb_size
);
761 set_message(cli
->outbuf
,0,0,True
);
762 CVAL(cli
->outbuf
,smb_com
) = SMBdskattr
;
763 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
764 cli_setup_packet(cli
);
767 if (!cli_receive_smb(cli
)) {
771 *bsize
= SVAL(cli
->inbuf
,smb_vwv1
)*SVAL(cli
->inbuf
,smb_vwv2
);
772 *total
= SVAL(cli
->inbuf
,smb_vwv0
);
773 *avail
= SVAL(cli
->inbuf
,smb_vwv3
);
779 /****************************************************************************
780 create and open a temporary file
781 ****************************************************************************/
782 int cli_ctemp(struct cli_state
*cli
, char *path
, char **tmp_path
)
786 memset(cli
->outbuf
,'\0',smb_size
);
787 memset(cli
->inbuf
,'\0',smb_size
);
789 set_message(cli
->outbuf
,1,strlen(path
)+2,True
);
791 CVAL(cli
->outbuf
,smb_com
) = SMBctemp
;
792 SSVAL(cli
->outbuf
,smb_tid
,cli
->cnum
);
793 cli_setup_packet(cli
);
795 SSVAL(cli
->outbuf
,smb_vwv0
,0);
797 p
= smb_buf(cli
->outbuf
);
799 p
+= clistr_push(cli
, p
, path
, -1, STR_TERMINATE
| STR_CONVERT
);
802 if (!cli_receive_smb(cli
)) {
806 if (CVAL(cli
->inbuf
,smb_rcls
) != 0) {
812 clistr_pull(cli
, path2
, smb_buf(cli
->inbuf
)+1,
813 sizeof(path2
), -1, STR_TERMINATE
| STR_CONVERT
);
814 *tmp_path
= strdup(path2
);
817 return SVAL(cli
->inbuf
,smb_vwv0
);