Changeset 39297 in vbox
- Timestamp:
- Nov 14, 2011 4:46:52 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 74849
- Location:
- trunk/src/VBox/Additions/solaris/SharedFolders
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/solaris/SharedFolders/vboxfs_prov.c
r39295 r39297 189 189 fsinfo->maxnamesize = info.fsProperties.cbMaxComponent; 190 190 fsinfo->readonly = info.fsProperties.fReadOnly; 191 return (0);192 }193 194 /*195 * File operations: open/close/read/write/etc.196 *197 * open/create can return any relevant errno, however ENOENT198 * generally means that the host file didn't exist.199 */200 struct sfp_file {201 SHFLHANDLE handle;202 VBSFMAP map; /* need this again for the close operation */203 };204 205 int206 sfprov_create(sfp_mount_t *mnt, char *path, sfp_file_t **fp)207 {208 209 int rc;210 SHFLCREATEPARMS parms;211 SHFLSTRING *str;212 int size;213 sfp_file_t *newfp;214 215 str = sfprov_string(path, &size);216 parms.Handle = 0;217 parms.Info.cbObject = 0;218 parms.CreateFlags = SHFL_CF_ACT_CREATE_IF_NEW |219 SHFL_CF_ACT_REPLACE_IF_EXISTS | SHFL_CF_ACCESS_READWRITE;220 rc = vboxCallCreate(&vbox_client, &mnt->map, str, &parms);221 kmem_free(str, size);222 223 if (RT_FAILURE(rc))224 {225 if (rc != VERR_ACCESS_DENIED && rc != VERR_WRITE_PROTECT)226 cmn_err(CE_WARN, "sfprov_create: vboxCallCreate failed! path=%s rc=%d\n", path, rc);227 return (sfprov_vbox2errno(rc));228 }229 if (parms.Handle == SHFL_HANDLE_NIL) {230 if (parms.Result == SHFL_FILE_EXISTS)231 return (EEXIST);232 return (ENOENT);233 }234 newfp = kmem_alloc(sizeof(sfp_file_t), KM_SLEEP);235 newfp->handle = parms.Handle;236 newfp->map = mnt->map;237 *fp = newfp;238 return (0);239 }240 241 int242 sfprov_open(sfp_mount_t *mnt, char *path, sfp_file_t **fp)243 {244 int rc;245 SHFLCREATEPARMS parms;246 SHFLSTRING *str;247 int size;248 sfp_file_t *newfp;249 250 /*251 * First we attempt to open it read/write. If that fails we252 * try read only.253 */254 bzero(&parms, sizeof(parms));255 str = sfprov_string(path, &size);256 parms.Handle = SHFL_HANDLE_NIL;257 parms.Info.cbObject = 0;258 parms.CreateFlags = SHFL_CF_ACT_FAIL_IF_NEW | SHFL_CF_ACCESS_READWRITE;259 rc = vboxCallCreate(&vbox_client, &mnt->map, str, &parms);260 if (RT_FAILURE(rc) && rc != VERR_ACCESS_DENIED) {261 kmem_free(str, size);262 return (sfprov_vbox2errno(rc));263 }264 if (parms.Handle == SHFL_HANDLE_NIL) {265 if (parms.Result == SHFL_PATH_NOT_FOUND ||266 parms.Result == SHFL_FILE_NOT_FOUND) {267 kmem_free(str, size);268 return (ENOENT);269 }270 parms.CreateFlags =271 SHFL_CF_ACT_FAIL_IF_NEW | SHFL_CF_ACCESS_READ;272 rc = vboxCallCreate(&vbox_client, &mnt->map, str, &parms);273 if (RT_FAILURE(rc)) {274 kmem_free(str, size);275 return (sfprov_vbox2errno(rc));276 }277 if (parms.Handle == SHFL_HANDLE_NIL) {278 kmem_free(str, size);279 return (ENOENT);280 }281 }282 else283 kmem_free(str, size);284 newfp = kmem_alloc(sizeof(sfp_file_t), KM_SLEEP);285 newfp->handle = parms.Handle;286 newfp->map = mnt->map;287 *fp = newfp;288 return (0);289 }290 291 int292 sfprov_trunc(sfp_mount_t *mnt, char *path)293 {294 int rc;295 SHFLCREATEPARMS parms;296 SHFLSTRING *str;297 int size;298 299 /*300 * open it read/write.301 */302 str = sfprov_string(path, &size);303 parms.Handle = 0;304 parms.Info.cbObject = 0;305 parms.CreateFlags = SHFL_CF_ACT_FAIL_IF_NEW | SHFL_CF_ACCESS_READWRITE |306 SHFL_CF_ACT_OVERWRITE_IF_EXISTS;307 rc = vboxCallCreate(&vbox_client, &mnt->map, str, &parms);308 kmem_free(str, size);309 310 if (RT_FAILURE(rc)) {311 return (EINVAL);312 }313 (void)vboxCallClose(&vbox_client, &mnt->map, parms.Handle);314 return (0);315 }316 317 int318 sfprov_close(sfp_file_t *fp)319 {320 int rc;321 322 rc = vboxCallClose(&vbox_client, &fp->map, fp->handle);323 kmem_free(fp, sizeof(sfp_file_t));324 return (0);325 }326 327 int328 sfprov_read(sfp_file_t *fp, char *buffer, uint64_t offset, uint32_t *numbytes)329 {330 int rc;331 332 rc = vboxCallRead(&vbox_client, &fp->map, fp->handle, offset,333 numbytes, (uint8_t *)buffer, 0); /* what is that last arg? */334 if (RT_FAILURE(rc))335 return (EINVAL);336 return (0);337 }338 339 int340 sfprov_write(sfp_file_t *fp, char *buffer, uint64_t offset, uint32_t *numbytes)341 {342 int rc;343 344 rc = vboxCallWrite(&vbox_client, &fp->map, fp->handle, offset,345 numbytes, (uint8_t *)buffer, 0); /* what is that last arg? */346 if (RT_FAILURE(rc))347 return (EINVAL);348 return (0);349 }350 351 int352 sfprov_fsync(sfp_file_t *fp)353 {354 int rc;355 356 rc = vboxCallFlush(&vbox_client, &fp->map, fp->handle);357 if (RT_FAILURE(rc))358 return (EIO);359 return (0);360 }361 362 363 static int364 sfprov_getinfo(sfp_mount_t *mnt, char *path, PSHFLFSOBJINFO info)365 {366 int rc;367 SHFLCREATEPARMS parms;368 SHFLSTRING *str;369 int size;370 371 str = sfprov_string(path, &size);372 parms.Handle = 0;373 parms.Info.cbObject = 0;374 parms.CreateFlags = SHFL_CF_LOOKUP | SHFL_CF_ACT_FAIL_IF_NEW;375 rc = vboxCallCreate(&vbox_client, &mnt->map, str, &parms);376 kmem_free(str, size);377 378 if (RT_FAILURE(rc))379 return (EINVAL);380 if (parms.Result != SHFL_FILE_EXISTS)381 return (ENOENT);382 *info = parms.Info;383 191 return (0); 384 192 } … … 473 281 } 474 282 475 /*476 * get information about a file (or directory)477 */478 int479 sfprov_get_mode(sfp_mount_t *mnt, char *path, mode_t *mode)480 {481 int rc;482 SHFLFSOBJINFO info;483 484 rc = sfprov_getinfo(mnt, path, &info);485 if (rc)486 return (rc);487 sfprov_mode_from_fmode(mode, info.Attr.fMode);488 return (0);489 }490 491 int492 sfprov_get_size(sfp_mount_t *mnt, char *path, uint64_t *size)493 {494 int rc;495 SHFLFSOBJINFO info;496 497 rc = sfprov_getinfo(mnt, path, &info);498 if (rc)499 return (rc);500 *size = info.cbObject;501 return (0);502 }503 504 283 static void 505 284 sfprov_ftime_from_timespec(timestruc_t *time, RTTIMESPEC *ts) … … 520 299 sfprov_ftime_from_timespec(&stat->sf_ctime, &info->ChangeTime); 521 300 } 301 302 /* 303 * File operations: open/close/read/write/etc. 304 * 305 * open/create can return any relevant errno, however ENOENT 306 * generally means that the host file didn't exist. 307 */ 308 struct sfp_file { 309 SHFLHANDLE handle; 310 VBSFMAP map; /* need this again for the close operation */ 311 }; 312 313 int 314 sfprov_create( 315 sfp_mount_t *mnt, 316 char *path, 317 mode_t mode, 318 sfp_file_t **fp, 319 sffs_stat_t *stat) 320 { 321 322 int rc; 323 SHFLCREATEPARMS parms; 324 SHFLSTRING *str; 325 int size; 326 sfp_file_t *newfp; 327 328 str = sfprov_string(path, &size); 329 parms.Handle = SHFL_HANDLE_NIL; 330 parms.Info.cbObject = 0; 331 sfprov_fmode_from_mode(&parms.Info.Attr.fMode, mode); 332 parms.CreateFlags = SHFL_CF_ACT_CREATE_IF_NEW | 333 SHFL_CF_ACT_REPLACE_IF_EXISTS | SHFL_CF_ACCESS_READWRITE; 334 rc = vboxCallCreate(&vbox_client, &mnt->map, str, &parms); 335 kmem_free(str, size); 336 337 if (RT_FAILURE(rc)) 338 { 339 if (rc != VERR_ACCESS_DENIED && rc != VERR_WRITE_PROTECT) 340 cmn_err(CE_WARN, "sfprov_create: vboxCallCreate failed! path=%s rc=%d\n", path, rc); 341 return (sfprov_vbox2errno(rc)); 342 } 343 if (parms.Handle == SHFL_HANDLE_NIL) { 344 if (parms.Result == SHFL_FILE_EXISTS) 345 return (EEXIST); 346 return (ENOENT); 347 } 348 newfp = kmem_alloc(sizeof(sfp_file_t), KM_SLEEP); 349 newfp->handle = parms.Handle; 350 newfp->map = mnt->map; 351 *fp = newfp; 352 sfprov_stat_from_info(stat, &parms.Info); 353 return (0); 354 } 355 356 int 357 sfprov_open(sfp_mount_t *mnt, char *path, sfp_file_t **fp) 358 { 359 int rc; 360 SHFLCREATEPARMS parms; 361 SHFLSTRING *str; 362 int size; 363 sfp_file_t *newfp; 364 365 /* 366 * First we attempt to open it read/write. If that fails we 367 * try read only. 368 */ 369 bzero(&parms, sizeof(parms)); 370 str = sfprov_string(path, &size); 371 parms.Handle = SHFL_HANDLE_NIL; 372 parms.Info.cbObject = 0; 373 parms.CreateFlags = SHFL_CF_ACT_FAIL_IF_NEW | SHFL_CF_ACCESS_READWRITE; 374 rc = vboxCallCreate(&vbox_client, &mnt->map, str, &parms); 375 if (RT_FAILURE(rc) && rc != VERR_ACCESS_DENIED) { 376 kmem_free(str, size); 377 return (sfprov_vbox2errno(rc)); 378 } 379 if (parms.Handle == SHFL_HANDLE_NIL) { 380 if (parms.Result == SHFL_PATH_NOT_FOUND || 381 parms.Result == SHFL_FILE_NOT_FOUND) { 382 kmem_free(str, size); 383 return (ENOENT); 384 } 385 parms.CreateFlags = 386 SHFL_CF_ACT_FAIL_IF_NEW | SHFL_CF_ACCESS_READ; 387 rc = vboxCallCreate(&vbox_client, &mnt->map, str, &parms); 388 if (RT_FAILURE(rc)) { 389 kmem_free(str, size); 390 return (sfprov_vbox2errno(rc)); 391 } 392 if (parms.Handle == SHFL_HANDLE_NIL) { 393 kmem_free(str, size); 394 return (ENOENT); 395 } 396 } 397 else 398 kmem_free(str, size); 399 newfp = kmem_alloc(sizeof(sfp_file_t), KM_SLEEP); 400 newfp->handle = parms.Handle; 401 newfp->map = mnt->map; 402 *fp = newfp; 403 return (0); 404 } 405 406 int 407 sfprov_trunc(sfp_mount_t *mnt, char *path) 408 { 409 int rc; 410 SHFLCREATEPARMS parms; 411 SHFLSTRING *str; 412 int size; 413 414 /* 415 * open it read/write. 416 */ 417 str = sfprov_string(path, &size); 418 parms.Handle = 0; 419 parms.Info.cbObject = 0; 420 parms.CreateFlags = SHFL_CF_ACT_FAIL_IF_NEW | SHFL_CF_ACCESS_READWRITE | 421 SHFL_CF_ACT_OVERWRITE_IF_EXISTS; 422 rc = vboxCallCreate(&vbox_client, &mnt->map, str, &parms); 423 kmem_free(str, size); 424 425 if (RT_FAILURE(rc)) { 426 return (EINVAL); 427 } 428 (void)vboxCallClose(&vbox_client, &mnt->map, parms.Handle); 429 return (0); 430 } 431 432 int 433 sfprov_close(sfp_file_t *fp) 434 { 435 int rc; 436 437 rc = vboxCallClose(&vbox_client, &fp->map, fp->handle); 438 kmem_free(fp, sizeof(sfp_file_t)); 439 return (0); 440 } 441 442 int 443 sfprov_read(sfp_file_t *fp, char *buffer, uint64_t offset, uint32_t *numbytes) 444 { 445 int rc; 446 447 rc = vboxCallRead(&vbox_client, &fp->map, fp->handle, offset, 448 numbytes, (uint8_t *)buffer, 0); /* what is that last arg? */ 449 if (RT_FAILURE(rc)) 450 return (EINVAL); 451 return (0); 452 } 453 454 int 455 sfprov_write(sfp_file_t *fp, char *buffer, uint64_t offset, uint32_t *numbytes) 456 { 457 int rc; 458 459 rc = vboxCallWrite(&vbox_client, &fp->map, fp->handle, offset, 460 numbytes, (uint8_t *)buffer, 0); /* what is that last arg? */ 461 if (RT_FAILURE(rc)) 462 return (EINVAL); 463 return (0); 464 } 465 466 int 467 sfprov_fsync(sfp_file_t *fp) 468 { 469 int rc; 470 471 rc = vboxCallFlush(&vbox_client, &fp->map, fp->handle); 472 if (RT_FAILURE(rc)) 473 return (EIO); 474 return (0); 475 } 476 477 478 static int 479 sfprov_getinfo(sfp_mount_t *mnt, char *path, PSHFLFSOBJINFO info) 480 { 481 int rc; 482 SHFLCREATEPARMS parms; 483 SHFLSTRING *str; 484 int size; 485 486 str = sfprov_string(path, &size); 487 parms.Handle = 0; 488 parms.Info.cbObject = 0; 489 parms.CreateFlags = SHFL_CF_LOOKUP | SHFL_CF_ACT_FAIL_IF_NEW; 490 rc = vboxCallCreate(&vbox_client, &mnt->map, str, &parms); 491 kmem_free(str, size); 492 493 if (RT_FAILURE(rc)) 494 return (EINVAL); 495 if (parms.Result != SHFL_FILE_EXISTS) 496 return (ENOENT); 497 *info = parms.Info; 498 return (0); 499 } 500 501 /* 502 * get information about a file (or directory) 503 */ 504 int 505 sfprov_get_mode(sfp_mount_t *mnt, char *path, mode_t *mode) 506 { 507 int rc; 508 SHFLFSOBJINFO info; 509 510 rc = sfprov_getinfo(mnt, path, &info); 511 if (rc) 512 return (rc); 513 sfprov_mode_from_fmode(mode, info.Attr.fMode); 514 return (0); 515 } 516 517 int 518 sfprov_get_size(sfp_mount_t *mnt, char *path, uint64_t *size) 519 { 520 int rc; 521 SHFLFSOBJINFO info; 522 523 rc = sfprov_getinfo(mnt, path, &info); 524 if (rc) 525 return (rc); 526 *size = info.cbObject; 527 return (0); 528 } 529 522 530 523 531 int … … 712 720 */ 713 721 int 714 sfprov_mkdir(sfp_mount_t *mnt, char *path, sfp_file_t **fp) 722 sfprov_mkdir( 723 sfp_mount_t *mnt, 724 char *path, 725 mode_t mode, 726 sfp_file_t **fp, 727 sffs_stat_t *stat) 715 728 { 716 729 int rc; … … 721 734 722 735 str = sfprov_string(path, &size); 723 parms.Handle = 0;736 parms.Handle = SHFL_HANDLE_NIL; 724 737 parms.Info.cbObject = 0; 738 sfprov_fmode_from_mode(&parms.Info.Attr.fMode, mode); 725 739 parms.CreateFlags = SHFL_CF_DIRECTORY | SHFL_CF_ACT_CREATE_IF_NEW | 726 740 SHFL_CF_ACT_FAIL_IF_EXISTS | SHFL_CF_ACCESS_READ; … … 739 753 newfp->map = mnt->map; 740 754 *fp = newfp; 755 sfprov_stat_from_info(stat, &parms.Info); 741 756 return (0); 742 757 } -
trunk/src/VBox/Additions/solaris/SharedFolders/vboxfs_prov.h
r39278 r39297 88 88 * generally means that the host file didn't exist. 89 89 */ 90 typedef struct sffs_stat { 91 mode_t sf_mode; 92 off_t sf_size; 93 off_t sf_alloc; 94 timestruc_t sf_atime; 95 timestruc_t sf_mtime; 96 timestruc_t sf_ctime; 97 } sffs_stat_t; 98 90 99 typedef struct sfp_file sfp_file_t; 91 100 92 extern int sfprov_create(sfp_mount_t *, char *path, sfp_file_t **fp); 101 extern int sfprov_create(sfp_mount_t *, char *path, mode_t mode, 102 sfp_file_t **fp, sffs_stat_t *stat); 93 103 extern int sfprov_open(sfp_mount_t *, char *path, sfp_file_t **fp); 94 104 extern int sfprov_close(sfp_file_t *fp); … … 103 113 * get/set information about a file (or directory) using pathname 104 114 */ 105 typedef struct sffs_stat {106 mode_t sf_mode;107 off_t sf_size;108 off_t sf_alloc;109 timestruc_t sf_atime;110 timestruc_t sf_mtime;111 timestruc_t sf_ctime;112 } sffs_stat_t;113 114 115 extern int sfprov_get_mode(sfp_mount_t *, char *, mode_t *); 115 116 extern int sfprov_get_size(sfp_mount_t *, char *, uint64_t *); … … 128 129 extern int sfprov_trunc(sfp_mount_t *, char *); 129 130 extern int sfprov_remove(sfp_mount_t *, char *path, uint_t is_link); 130 extern int sfprov_mkdir(sfp_mount_t *, char *path, sfp_file_t **fp); 131 extern int sfprov_mkdir(sfp_mount_t *, char *path, mode_t mode, 132 sfp_file_t **fp, sffs_stat_t *stat); 131 133 extern int sfprov_rmdir(sfp_mount_t *, char *path); 132 134 extern int sfprov_rename(sfp_mount_t *, char *from, char *to, uint_t is_dir); -
trunk/src/VBox/Additions/solaris/SharedFolders/vboxfs_vnode.c
r39272 r39297 535 535 char *name, 536 536 vtype_t create, 537 mode_t c_mode, 537 538 sffs_stat_t *stat, 538 539 uint64_t stat_time, … … 587 588 if (create == VREG) { 588 589 type = VREG; 589 error = sfprov_create(dir->sf_sffs->sf_handle, fullpath, &fp); 590 error = sfprov_create(dir->sf_sffs->sf_handle, fullpath, c_mode, 591 &fp, stat); 592 stat_time = sfnode_cur_time_usec(); 590 593 } else if (create == VDIR) { 591 594 type = VDIR; 592 error = sfprov_mkdir(dir->sf_sffs->sf_handle, fullpath, &fp); 595 error = sfprov_mkdir(dir->sf_sffs->sf_handle, fullpath, c_mode, 596 &fp, stat); 597 stat_time = sfnode_cur_time_usec(); 593 598 } else { 594 599 mode_t m; … … 786 791 } else { 787 792 node = sfnode_lookup(dir, dirent->sf_entry.d_name, VNON, 788 793 0, &dirent->sf_stat, sfnode_cur_time_usec(), NULL); 789 794 if (node == NULL) 790 795 panic("sffs_readdir() lookup failed"); … … 1217 1222 * Lookup the node. 1218 1223 */ 1219 node = sfnode_lookup(VN2SFN(dvp), name, VNON, NULL, 0, NULL);1224 node = sfnode_lookup(VN2SFN(dvp), name, VNON, 0, NULL, 0, NULL); 1220 1225 if (node != NULL) 1221 1226 *vpp = sfnode_get_vnode(node); … … 1312 1317 */ 1313 1318 mutex_enter(&sffs_lock); 1314 node = sfnode_lookup(VN2SFN(dvp), name, VNON, NULL, 0, NULL);1319 node = sfnode_lookup(VN2SFN(dvp), name, VNON, 0, NULL, 0, NULL); 1315 1320 if (node != NULL) { 1316 1321 mutex_exit(&sffs_lock); … … 1323 1328 sfnode_invalidate_stat_cache(VN2SFN(dvp)); 1324 1329 int lookuperr; 1325 node = sfnode_lookup(VN2SFN(dvp), name, VREG, NULL, 0, &lookuperr); 1326 if (node && (vap->va_mask & AT_MODE)) { 1327 timestruc_t dummy; 1328 error = sfprov_set_attr(node->sf_sffs->sf_handle, node->sf_path, 1329 AT_MODE, vap->va_mode, dummy, dummy, dummy); 1330 if (error) 1331 cmn_err(CE_WARN, "sffs_create: set_mode(%s, %o) failed" 1332 " rc=%d", node->sf_path, vap->va_mode, error); 1333 } 1330 node = sfnode_lookup(VN2SFN(dvp), name, VREG, 1331 (vap->va_mask & AT_MODE) ? vap->va_mode : 0, NULL, 0, &lookuperr); 1334 1332 1335 1333 if (node && node->sf_parent) … … 1390 1388 sfnode_invalidate_stat_cache(VN2SFN(dvp)); 1391 1389 int lookuperr = EACCES; 1392 node = sfnode_lookup(VN2SFN(dvp), nm, VDIR, NULL, 0, &lookuperr); 1393 if (node && (va->va_mask & AT_MODE)) { 1394 timestruc_t dummy; 1395 error = sfprov_set_attr(node->sf_sffs->sf_handle, node->sf_path, 1396 AT_MODE, va->va_mode, dummy, dummy, dummy); 1397 if (error) 1398 cmn_err(CE_WARN, "sffs_mkdir: set_mode(%s, %o) failed" 1399 " rc=%d", node->sf_path, va->va_mode, error); 1400 } 1390 node = sfnode_lookup(VN2SFN(dvp), nm, VDIR, 1391 (va->va_mode & AT_MODE) ? va->va_mode : 0, NULL, 0, &lookuperr); 1401 1392 1402 1393 if (node && node->sf_parent) … … 1963 1954 mutex_enter(&sffs_lock); 1964 1955 1965 if (sfnode_lookup(VN2SFN(dvp), linkname, VNON, NULL, 0, NULL) != NULL) { 1956 if (sfnode_lookup(VN2SFN(dvp), linkname, VNON, 0, NULL, 0, NULL) != 1957 NULL) { 1966 1958 error = EEXIST; 1967 1959 goto done; … … 1984 1976 goto done; 1985 1977 1986 node = sfnode_lookup(dir, linkname, VLNK, &stat, sfnode_cur_time_usec(),1987 1978 node = sfnode_lookup(dir, linkname, VLNK, 0, &stat, 1979 sfnode_cur_time_usec(), NULL); 1988 1980 1989 1981 sfnode_invalidate_stat_cache(dir); … … 2093 2085 goto done; 2094 2086 2095 node = sfnode_lookup(VN2SFN(old_dir), old_nm, VNON, NULL, 0, NULL);2087 node = sfnode_lookup(VN2SFN(old_dir), old_nm, VNON, 0, NULL, 0, NULL); 2096 2088 if (node == NULL) { 2097 2089 error = ENOENT;
Note:
See TracChangeset
for help on using the changeset viewer.