smb_dev.c (82042) | smb_dev.c (87192) |
---|---|
1/* 2 * Copyright (c) 2000-2001 Boris Popov 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 15 unchanged lines hidden (view full) --- 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * | 1/* 2 * Copyright (c) 2000-2001 Boris Popov 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 15 unchanged lines hidden (view full) --- 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * |
32 * $FreeBSD: head/sys/netsmb/smb_dev.c 82042 2001-08-21 08:58:02Z bp $ | 32 * $FreeBSD: head/sys/netsmb/smb_dev.c 87192 2001-12-02 08:47:29Z bp $ |
33 */ 34#include <sys/param.h> 35#include <sys/kernel.h> 36#include <sys/systm.h> 37#include <sys/conf.h> 38#include <sys/fcntl.h> 39#include <sys/ioccom.h> 40#include <sys/lock.h> --- 74 unchanged lines hidden (view full) --- 115 if (*dev != NODEV) 116 return; 117 if (dev_stdclone(name, NULL, NSMB_NAME, &min) != 1) 118 return; 119 *dev = make_dev(&nsmb_cdevsw, min, 0, 0, 0600, NSMB_NAME"%d", min); 120} 121 122static int | 33 */ 34#include <sys/param.h> 35#include <sys/kernel.h> 36#include <sys/systm.h> 37#include <sys/conf.h> 38#include <sys/fcntl.h> 39#include <sys/ioccom.h> 40#include <sys/lock.h> --- 74 unchanged lines hidden (view full) --- 115 if (*dev != NODEV) 116 return; 117 if (dev_stdclone(name, NULL, NSMB_NAME, &min) != 1) 118 return; 119 *dev = make_dev(&nsmb_cdevsw, min, 0, 0, 0600, NSMB_NAME"%d", min); 120} 121 122static int |
123nsmb_dev_open(dev_t dev, int oflags, int devtype, struct proc *p) | 123nsmb_dev_open(dev_t dev, int oflags, int devtype, struct thread *td) |
124{ 125 struct smb_dev *sdp; | 124{ 125 struct smb_dev *sdp; |
126 struct proc *p = td->td_proc; |
|
126 struct ucred *cred = p->p_ucred; 127 int s; 128 129 sdp = SMB_GETDEV(dev); 130 if (sdp && (sdp->sd_flags & NSMBFL_OPEN)) 131 return EBUSY; 132 if (sdp == NULL) { 133 sdp = malloc(sizeof(*sdp), M_NSMBDEV, M_WAITOK); --- 15 unchanged lines hidden (view full) --- 149 s = splimp(); 150 sdp->sd_level = -1; 151 sdp->sd_flags |= NSMBFL_OPEN; 152 splx(s); 153 return 0; 154} 155 156static int | 127 struct ucred *cred = p->p_ucred; 128 int s; 129 130 sdp = SMB_GETDEV(dev); 131 if (sdp && (sdp->sd_flags & NSMBFL_OPEN)) 132 return EBUSY; 133 if (sdp == NULL) { 134 sdp = malloc(sizeof(*sdp), M_NSMBDEV, M_WAITOK); --- 15 unchanged lines hidden (view full) --- 150 s = splimp(); 151 sdp->sd_level = -1; 152 sdp->sd_flags |= NSMBFL_OPEN; 153 splx(s); 154 return 0; 155} 156 157static int |
157nsmb_dev_close(dev_t dev, int flag, int fmt, struct proc *p) | 158nsmb_dev_close(dev_t dev, int flag, int fmt, struct thread *td) |
158{ 159 struct smb_dev *sdp; 160 struct smb_vc *vcp; 161 struct smb_share *ssp; 162 struct smb_cred scred; 163 int s; 164 165 SMB_CHECKMINOR(dev); 166 s = splimp(); 167 if ((sdp->sd_flags & NSMBFL_OPEN) == 0) { 168 splx(s); 169 return EBADF; 170 } | 159{ 160 struct smb_dev *sdp; 161 struct smb_vc *vcp; 162 struct smb_share *ssp; 163 struct smb_cred scred; 164 int s; 165 166 SMB_CHECKMINOR(dev); 167 s = splimp(); 168 if ((sdp->sd_flags & NSMBFL_OPEN) == 0) { 169 splx(s); 170 return EBADF; 171 } |
171 smb_makescred(&scred, p, NULL); | 172 smb_makescred(&scred, td, NULL); |
172 ssp = sdp->sd_share; 173 if (ssp != NULL) 174 smb_share_rele(ssp, &scred); 175 vcp = sdp->sd_vc; 176 if (vcp != NULL) 177 smb_vc_rele(vcp, &scred); 178/* 179 smb_flushq(&sdp->sd_rqlist); 180 smb_flushq(&sdp->sd_rplist); 181*/ 182 dev->si_drv1 = NULL; 183 free(sdp, M_NSMBDEV); 184 destroy_dev(dev); 185 splx(s); 186 return 0; 187} 188 189 190static int | 173 ssp = sdp->sd_share; 174 if (ssp != NULL) 175 smb_share_rele(ssp, &scred); 176 vcp = sdp->sd_vc; 177 if (vcp != NULL) 178 smb_vc_rele(vcp, &scred); 179/* 180 smb_flushq(&sdp->sd_rqlist); 181 smb_flushq(&sdp->sd_rplist); 182*/ 183 dev->si_drv1 = NULL; 184 free(sdp, M_NSMBDEV); 185 destroy_dev(dev); 186 splx(s); 187 return 0; 188} 189 190 191static int |
191nsmb_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) | 192nsmb_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) |
192{ 193 struct smb_dev *sdp; 194 struct smb_vc *vcp; 195 struct smb_share *ssp; 196 struct smb_cred scred; 197 int error = 0; 198 199 SMB_CHECKMINOR(dev); 200 if ((sdp->sd_flags & NSMBFL_OPEN) == 0) 201 return EBADF; 202 | 193{ 194 struct smb_dev *sdp; 195 struct smb_vc *vcp; 196 struct smb_share *ssp; 197 struct smb_cred scred; 198 int error = 0; 199 200 SMB_CHECKMINOR(dev); 201 if ((sdp->sd_flags & NSMBFL_OPEN) == 0) 202 return EBADF; 203 |
203 smb_makescred(&scred, p, NULL); | 204 smb_makescred(&scred, td, NULL); |
204 switch (cmd) { 205 case SMBIOC_OPENSESSION: 206 if (sdp->sd_vc) 207 return EISCONN; 208 error = smb_usr_opensession((struct smbioc_ossn*)data, 209 &scred, &vcp); 210 if (error) 211 break; 212 sdp->sd_vc = vcp; | 205 switch (cmd) { 206 case SMBIOC_OPENSESSION: 207 if (sdp->sd_vc) 208 return EISCONN; 209 error = smb_usr_opensession((struct smbioc_ossn*)data, 210 &scred, &vcp); 211 if (error) 212 break; 213 sdp->sd_vc = vcp; |
213 smb_vc_unlock(vcp, 0, p); | 214 smb_vc_unlock(vcp, 0, td); |
214 sdp->sd_level = SMBL_VC; 215 break; 216 case SMBIOC_OPENSHARE: 217 if (sdp->sd_share) 218 return EISCONN; 219 if (sdp->sd_vc == NULL) 220 return ENOTCONN; 221 error = smb_usr_openshare(sdp->sd_vc, 222 (struct smbioc_oshare*)data, &scred, &ssp); 223 if (error) 224 break; 225 sdp->sd_share = ssp; | 215 sdp->sd_level = SMBL_VC; 216 break; 217 case SMBIOC_OPENSHARE: 218 if (sdp->sd_share) 219 return EISCONN; 220 if (sdp->sd_vc == NULL) 221 return ENOTCONN; 222 error = smb_usr_openshare(sdp->sd_vc, 223 (struct smbioc_oshare*)data, &scred, &ssp); 224 if (error) 225 break; 226 sdp->sd_share = ssp; |
226 smb_share_unlock(ssp, 0, p); | 227 smb_share_unlock(ssp, 0, td); |
227 sdp->sd_level = SMBL_SHARE; 228 break; 229 case SMBIOC_REQUEST: 230 if (sdp->sd_share == NULL) 231 return ENOTCONN; 232 error = smb_usr_simplerequest(sdp->sd_share, 233 (struct smbioc_rq*)data, &scred); 234 break; --- 12 unchanged lines hidden (view full) --- 247 on = fl->ioc_flags & SMBV_PERMANENT; 248 if ((vcp = sdp->sd_vc) == NULL) 249 return ENOTCONN; 250 error = smb_vc_get(vcp, LK_EXCLUSIVE, &scred); 251 if (error) 252 break; 253 if (on && (vcp->obj.co_flags & SMBV_PERMANENT) == 0) { 254 vcp->obj.co_flags |= SMBV_PERMANENT; | 228 sdp->sd_level = SMBL_SHARE; 229 break; 230 case SMBIOC_REQUEST: 231 if (sdp->sd_share == NULL) 232 return ENOTCONN; 233 error = smb_usr_simplerequest(sdp->sd_share, 234 (struct smbioc_rq*)data, &scred); 235 break; --- 12 unchanged lines hidden (view full) --- 248 on = fl->ioc_flags & SMBV_PERMANENT; 249 if ((vcp = sdp->sd_vc) == NULL) 250 return ENOTCONN; 251 error = smb_vc_get(vcp, LK_EXCLUSIVE, &scred); 252 if (error) 253 break; 254 if (on && (vcp->obj.co_flags & SMBV_PERMANENT) == 0) { 255 vcp->obj.co_flags |= SMBV_PERMANENT; |
255 smb_vc_ref(vcp, p); | 256 smb_vc_ref(vcp); |
256 } else if (!on && (vcp->obj.co_flags & SMBV_PERMANENT)) { 257 vcp->obj.co_flags &= ~SMBV_PERMANENT; 258 smb_vc_rele(vcp, &scred); 259 } 260 smb_vc_put(vcp, &scred); 261 } else 262 error = EINVAL; 263 } else if (fl->ioc_level == SMBL_SHARE) { 264 if (fl->ioc_mask & SMBS_PERMANENT) { 265 on = fl->ioc_flags & SMBS_PERMANENT; 266 if ((ssp = sdp->sd_share) == NULL) 267 return ENOTCONN; 268 error = smb_share_get(ssp, LK_EXCLUSIVE, &scred); 269 if (error) 270 break; 271 if (on && (ssp->obj.co_flags & SMBS_PERMANENT) == 0) { 272 ssp->obj.co_flags |= SMBS_PERMANENT; | 257 } else if (!on && (vcp->obj.co_flags & SMBV_PERMANENT)) { 258 vcp->obj.co_flags &= ~SMBV_PERMANENT; 259 smb_vc_rele(vcp, &scred); 260 } 261 smb_vc_put(vcp, &scred); 262 } else 263 error = EINVAL; 264 } else if (fl->ioc_level == SMBL_SHARE) { 265 if (fl->ioc_mask & SMBS_PERMANENT) { 266 on = fl->ioc_flags & SMBS_PERMANENT; 267 if ((ssp = sdp->sd_share) == NULL) 268 return ENOTCONN; 269 error = smb_share_get(ssp, LK_EXCLUSIVE, &scred); 270 if (error) 271 break; 272 if (on && (ssp->obj.co_flags & SMBS_PERMANENT) == 0) { 273 ssp->obj.co_flags |= SMBS_PERMANENT; |
273 smb_share_ref(ssp, p); | 274 smb_share_ref(ssp); |
274 } else if (!on && (ssp->obj.co_flags & SMBS_PERMANENT)) { 275 ssp->obj.co_flags &= ~SMBS_PERMANENT; 276 smb_share_rele(ssp, &scred); 277 } 278 smb_share_put(ssp, &scred); 279 } else 280 error = EINVAL; 281 break; --- 6 unchanged lines hidden (view full) --- 288 return EISCONN; 289 vcp = NULL; 290 ssp = NULL; 291 error = smb_usr_lookup((struct smbioc_lookup*)data, &scred, &vcp, &ssp); 292 if (error) 293 break; 294 if (vcp) { 295 sdp->sd_vc = vcp; | 275 } else if (!on && (ssp->obj.co_flags & SMBS_PERMANENT)) { 276 ssp->obj.co_flags &= ~SMBS_PERMANENT; 277 smb_share_rele(ssp, &scred); 278 } 279 smb_share_put(ssp, &scred); 280 } else 281 error = EINVAL; 282 break; --- 6 unchanged lines hidden (view full) --- 289 return EISCONN; 290 vcp = NULL; 291 ssp = NULL; 292 error = smb_usr_lookup((struct smbioc_lookup*)data, &scred, &vcp, &ssp); 293 if (error) 294 break; 295 if (vcp) { 296 sdp->sd_vc = vcp; |
296 smb_vc_unlock(vcp, 0, p); | 297 smb_vc_unlock(vcp, 0, td); |
297 sdp->sd_level = SMBL_VC; 298 } 299 if (ssp) { 300 sdp->sd_share = ssp; | 298 sdp->sd_level = SMBL_VC; 299 } 300 if (ssp) { 301 sdp->sd_share = ssp; |
301 smb_share_unlock(ssp, 0, p); | 302 smb_share_unlock(ssp, 0, td); |
302 sdp->sd_level = SMBL_SHARE; 303 } 304 break; 305 case SMBIOC_READ: case SMBIOC_WRITE: { 306 struct smbioc_rw *rwrq = (struct smbioc_rw*)data; 307 struct uio auio; 308 struct iovec iov; 309 310 if ((ssp = sdp->sd_share) == NULL) 311 return ENOTCONN; 312 iov.iov_base = rwrq->ioc_base; 313 iov.iov_len = rwrq->ioc_cnt; 314 auio.uio_iov = &iov; 315 auio.uio_iovcnt = 1; 316 auio.uio_offset = rwrq->ioc_offset; 317 auio.uio_resid = rwrq->ioc_cnt; 318 auio.uio_segflg = UIO_USERSPACE; 319 auio.uio_rw = (cmd == SMBIOC_READ) ? UIO_READ : UIO_WRITE; | 303 sdp->sd_level = SMBL_SHARE; 304 } 305 break; 306 case SMBIOC_READ: case SMBIOC_WRITE: { 307 struct smbioc_rw *rwrq = (struct smbioc_rw*)data; 308 struct uio auio; 309 struct iovec iov; 310 311 if ((ssp = sdp->sd_share) == NULL) 312 return ENOTCONN; 313 iov.iov_base = rwrq->ioc_base; 314 iov.iov_len = rwrq->ioc_cnt; 315 auio.uio_iov = &iov; 316 auio.uio_iovcnt = 1; 317 auio.uio_offset = rwrq->ioc_offset; 318 auio.uio_resid = rwrq->ioc_cnt; 319 auio.uio_segflg = UIO_USERSPACE; 320 auio.uio_rw = (cmd == SMBIOC_READ) ? UIO_READ : UIO_WRITE; |
320 auio.uio_procp = p; | 321 auio.uio_td = td; |
321 if (cmd == SMBIOC_READ) 322 error = smb_read(ssp, rwrq->ioc_fh, &auio, &scred); 323 else 324 error = smb_write(ssp, rwrq->ioc_fh, &auio, &scred); 325 rwrq->ioc_cnt -= auio.uio_resid; 326 break; 327 } 328 default: --- 10 unchanged lines hidden (view full) --- 339 340static int 341nsmb_dev_write(dev_t dev, struct uio *uio, int flag) 342{ 343 return EACCES; 344} 345 346static int | 322 if (cmd == SMBIOC_READ) 323 error = smb_read(ssp, rwrq->ioc_fh, &auio, &scred); 324 else 325 error = smb_write(ssp, rwrq->ioc_fh, &auio, &scred); 326 rwrq->ioc_cnt -= auio.uio_resid; 327 break; 328 } 329 default: --- 10 unchanged lines hidden (view full) --- 340 341static int 342nsmb_dev_write(dev_t dev, struct uio *uio, int flag) 343{ 344 return EACCES; 345} 346 347static int |
347nsmb_dev_poll(dev_t dev, int events, struct proc *p) | 348nsmb_dev_poll(dev_t dev, int events, struct thread *td) |
348{ 349 return ENODEV; 350} 351 352static int 353nsmb_dev_load(module_t mod, int cmd, void *arg) 354{ 355 int error = 0; --- 50 unchanged lines hidden (view full) --- 406{ 407 struct file *fp; 408 struct vnode *vp; 409 struct smb_dev *sdp; 410 struct smb_share *ssp; 411 dev_t dev; 412 int error; 413 | 349{ 350 return ENODEV; 351} 352 353static int 354nsmb_dev_load(module_t mod, int cmd, void *arg) 355{ 356 int error = 0; --- 50 unchanged lines hidden (view full) --- 407{ 408 struct file *fp; 409 struct vnode *vp; 410 struct smb_dev *sdp; 411 struct smb_share *ssp; 412 dev_t dev; 413 int error; 414 |
414 if ((fp = nsmb_getfp(scred->scr_p->p_fd, fd, FREAD | FWRITE)) == NULL) | 415 fp = nsmb_getfp(scred->scr_td->td_proc->p_fd, fd, FREAD | FWRITE); 416 if (fp == NULL) |
415 return EBADF; 416 vp = (struct vnode*)fp->f_data; 417 if (vp == NULL) 418 return EBADF; 419 dev = vn_todev(vp); 420 if (dev == NODEV) 421 return EBADF; 422 SMB_CHECKMINOR(dev); 423 ssp = sdp->sd_share; 424 if (ssp == NULL) 425 return ENOTCONN; 426 error = smb_share_get(ssp, LK_EXCLUSIVE, scred); 427 if (error) 428 return error; 429 *sspp = ssp; 430 return 0; 431} 432 | 417 return EBADF; 418 vp = (struct vnode*)fp->f_data; 419 if (vp == NULL) 420 return EBADF; 421 dev = vn_todev(vp); 422 if (dev == NODEV) 423 return EBADF; 424 SMB_CHECKMINOR(dev); 425 ssp = sdp->sd_share; 426 if (ssp == NULL) 427 return ENOTCONN; 428 error = smb_share_get(ssp, LK_EXCLUSIVE, scred); 429 if (error) 430 return error; 431 *sspp = ssp; 432 return 0; 433} 434 |