Print this page
NEX-14666 Need to provide SMB 2.1 Client
NEX-17187 panic in smbfs_acl_store
NEX-17231 smbfs create xattr files finds wrong file
NEX-17224 smbfs lookup EINVAL should be ENOENT
NEX-17260 SMB1 client fails to list directory after NEX-14666
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
and: (cleanup)
NEX-16824 SMB client connection setup rework
NEX-17232 SMB client reconnect failures
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
and: (improve debug)
NEX-16818 Add fksmbcl development tool
NEX-17264 SMB client test tp_smbutil_013 fails after NEX-14666
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
and: (fix ref leaks)
1575 untangle libmlrpc from SMB server
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Toomas Soome <tsoome@me.com>
Approved by: Richard Lowe <richlowe@richlowe.net>

*** 31,43 **** * * $Id: file.c,v 1.4 2004/12/13 00:25:21 lindak Exp $ */ /* - * Copyright 2011 Nexenta Systems, Inc. All rights reserved. * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #include <sys/param.h> #include <sys/ioctl.h> #include <sys/time.h> --- 31,44 ---- * * $Id: file.c,v 1.4 2004/12/13 00:25:21 lindak Exp $ */ /* * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * + * Copyright 2018 Nexenta Systems, Inc. All rights reserved. */ #include <sys/param.h> #include <sys/ioctl.h> #include <sys/time.h>
*** 60,73 **** #include <netsmb/smb.h> #include <netsmb/smb_lib.h> #include "private.h" int smb_fh_close(int fd) { ! return (close(fd)); } int smb_fh_ntcreate( struct smb_ctx *ctx, char *path, --- 61,80 ---- #include <netsmb/smb.h> #include <netsmb/smb_lib.h> #include "private.h" + /* + * It's not actually necessary to call the CLOSEFH ioctl, but doing it + * makes debugging a little easier. If we were to skip the ioctl, + * nsmb_close would cleanup the handle, here or in process exit. + */ int smb_fh_close(int fd) { ! (void) nsmb_ioctl(fd, SMBIOC_CLOSEFH, NULL); ! return (nsmb_close(fd)); } int smb_fh_ntcreate( struct smb_ctx *ctx, char *path,
*** 94,104 **** if (new_fd < 0) { err = errno; goto errout; } from_fd = ctx->ct_dev_fd; ! if (ioctl(new_fd, SMBIOC_DUP_DEV, &from_fd) == -1) { err = errno; goto errout; } /* --- 101,111 ---- if (new_fd < 0) { err = errno; goto errout; } from_fd = ctx->ct_dev_fd; ! if (nsmb_ioctl(new_fd, SMBIOC_DUP_DEV, &from_fd) == -1) { err = errno; goto errout; } /*
*** 109,128 **** ioc.ioc_req_acc = req_acc; ioc.ioc_efattr = efattr; ioc.ioc_share_acc = share_acc; ioc.ioc_open_disp = open_disp; ioc.ioc_creat_opts = create_opts; ! if (ioctl(new_fd, SMBIOC_NTCREATE, &ioc) == -1) { err = errno; goto errout; } return (new_fd); errout: if (new_fd != -1) ! close(new_fd); errno = err; return (-1); } /* --- 116,135 ---- ioc.ioc_req_acc = req_acc; ioc.ioc_efattr = efattr; ioc.ioc_share_acc = share_acc; ioc.ioc_open_disp = open_disp; ioc.ioc_creat_opts = create_opts; ! if (nsmb_ioctl(new_fd, SMBIOC_NTCREATE, &ioc) == -1) { err = errno; goto errout; } return (new_fd); errout: if (new_fd != -1) ! nsmb_close(new_fd); errno = err; return (-1); } /*
*** 202,239 **** free(ntpath); return (fd); } int ! smb_fh_read(int fd, off_t offset, size_t count, char *dst) { struct smbioc_rw rwrq; bzero(&rwrq, sizeof (rwrq)); - rwrq.ioc_fh = -1; /* tell driver to supply this */ rwrq.ioc_base = dst; rwrq.ioc_cnt = count; rwrq.ioc_offset = offset; ! if (ioctl(fd, SMBIOC_READ, &rwrq) == -1) { return (-1); } return (rwrq.ioc_cnt); } int ! smb_fh_write(int fd, off_t offset, size_t count, const char *src) { struct smbioc_rw rwrq; bzero(&rwrq, sizeof (rwrq)); - rwrq.ioc_fh = -1; /* tell driver to supply this */ rwrq.ioc_base = (char *)src; rwrq.ioc_cnt = count; rwrq.ioc_offset = offset; ! if (ioctl(fd, SMBIOC_WRITE, &rwrq) == -1) { return (-1); } return (rwrq.ioc_cnt); } --- 209,244 ---- free(ntpath); return (fd); } int ! smb_fh_read(int fd, off64_t offset, size_t count, char *dst) { struct smbioc_rw rwrq; bzero(&rwrq, sizeof (rwrq)); rwrq.ioc_base = dst; rwrq.ioc_cnt = count; rwrq.ioc_offset = offset; ! if (nsmb_ioctl(fd, SMBIOC_READ, &rwrq) == -1) { return (-1); } return (rwrq.ioc_cnt); } int ! smb_fh_write(int fd, off64_t offset, size_t count, const char *src) { struct smbioc_rw rwrq; bzero(&rwrq, sizeof (rwrq)); rwrq.ioc_base = (char *)src; rwrq.ioc_cnt = count; rwrq.ioc_offset = offset; ! if (nsmb_ioctl(fd, SMBIOC_WRITE, &rwrq) == -1) { return (-1); } return (rwrq.ioc_cnt); }
*** 249,271 **** smb_fh_xactnp(int fd, int tdlen, const char *tdata, /* transmit */ int *rdlen, char *rdata, /* receive */ int *more) { ! int err, rparamcnt; ! uint16_t setup[2]; ! setup[0] = TRANS_TRANSACT_NAMED_PIPE; ! setup[1] = 0xFFFF; /* driver replaces this */ ! rparamcnt = 0; ! err = smb_t2_request(fd, 2, setup, "\\PIPE\\", ! 0, NULL, /* TX paramcnt, params */ ! tdlen, (void *)tdata, ! &rparamcnt, NULL, /* no RX params */ ! rdlen, rdata, more); ! ! if (err) *rdlen = 0; ! return (err); } --- 254,278 ---- smb_fh_xactnp(int fd, int tdlen, const char *tdata, /* transmit */ int *rdlen, char *rdata, /* receive */ int *more) { ! smbioc_xnp_t ioc; ! /* this gets copyin & copyout */ ! bzero(&ioc, sizeof (ioc)); ! ioc.ioc_tdlen = tdlen; ! ioc.ioc_rdlen = *rdlen; ! ioc.ioc_more = 0; ! ioc.ioc_tdata = (char *)tdata; ! ioc.ioc_rdata = rdata; ! if (nsmb_ioctl(fd, SMBIOC_XACTNP, &ioc) == -1) { *rdlen = 0; + return (-1); + } ! *rdlen = ioc.ioc_rdlen; ! *more = ioc.ioc_more; ! ! return (0); }