VirtualBox

Changeset 31566 in vbox for trunk/src/VBox/Additions/solaris


Ignore:
Timestamp:
Aug 11, 2010 1:30:44 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
64670
Message:

Additions/solaris/SharedFolders: fixed a panic, correct errors for EACCES and better error propagation.

Location:
trunk/src/VBox/Additions/solaris/SharedFolders
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/solaris/SharedFolders/vboxfs_prov.c

    r31537 r31566  
    4141static VBSFCLIENT vbox_client;
    4242
     43static int sfprov_vbox2errno(int rc)
     44{
     45        if (rc == VERR_ACCESS_DENIED)
     46                return (EACCES);
     47        return (RTErrConvertToErrno(rc));
     48}
     49
    4350/*
    4451 * utility to create strings
     
    7380        if (RT_SUCCESS(rc))
    7481        {
    75             rc = vboxConnect(&vbox_client);
    76         if (RT_SUCCESS(rc))
    77         {
    78             rc = vboxCallSetUtf8(&vbox_client);
    79             if (RT_SUCCESS(rc))
    80             {
    81                 return ((sfp_connection_t *)&vbox_client);
    82             }
    83             else
    84                         cmn_err(CE_WARN, "sfprov_connect: vboxCallSetUtf8() failed");
    85 
    86                     vboxDisconnect(&vbox_client);
    87         }
    88         else
    89                 cmn_err(CE_WARN, "sfprov_connect: vboxConnect() failed rc=%d", rc);
     82                rc = vboxConnect(&vbox_client);
     83                if (RT_SUCCESS(rc))
     84                {
     85                        rc = vboxCallSetUtf8(&vbox_client);
     86                        if (RT_SUCCESS(rc))
     87                        {
     88                                return ((sfp_connection_t *)&vbox_client);
     89                        }
     90                        else
     91                                cmn_err(CE_WARN, "sfprov_connect: vboxCallSetUtf8() failed");
     92
     93                        vboxDisconnect(&vbox_client);
     94                }
     95                else
     96                        cmn_err(CE_WARN, "sfprov_connect: vboxConnect() failed rc=%d", rc);
    9097                vboxUninit();
    9198        }
     
    245252sfprov_create(sfp_mount_t *mnt, char *path, sfp_file_t **fp)
    246253{
     254
    247255        int rc;
    248256        SHFLCREATEPARMS parms;
     
    261269        if (RT_FAILURE(rc))
    262270        {
    263                 cmn_err(CE_NOTE, "sfprov_create: vboxCallCreate failed. path=%s rc=%d\n", path, rc);
    264                 return (EINVAL);
     271                if (rc != VERR_ACCESS_DENIED && rc != VERR_WRITE_PROTECT)
     272                        cmn_err(CE_WARN, "sfprov_create: vboxCallCreate failed! path=%s rc=%d\n", path, rc);
     273                rc = sfprov_vbox2errno(rc);
     274                return (rc);
    265275        }
    266276        if (parms.Handle == SHFL_HANDLE_NIL) {
     
    297307        if (RT_FAILURE(rc) && rc != VERR_ACCESS_DENIED) {
    298308                kmem_free(str, size);
    299                 return RTErrConvertToErrno(rc);
     309                return sfprov_vbox2errno(rc);
    300310        }
    301311        if (parms.Handle == SHFL_HANDLE_NIL) {
     
    310320                if (RT_FAILURE(rc)) {
    311321                        kmem_free(str, size);
    312                         return RTErrConvertToErrno(rc);
     322                        return sfprov_vbox2errno(rc);
    313323                }
    314324                if (parms.Handle == SHFL_HANDLE_NIL) {
     
    666676            (SHFL_INFO_SET | SHFL_INFO_FILE), &bytes, (SHFLDIRINFO *)&info);
    667677        if (RT_FAILURE(rc)) {
    668                 cmn_err(CE_WARN, "sfprov_set_attr: vboxCallFSInfo(%s, FILE) failed rc=%d",
     678                if (rc != VERR_ACCESS_DENIED && rc != VERR_WRITE_PROTECT)
     679                {
     680                        cmn_err(CE_WARN, "sfprov_set_attr: vboxCallFSInfo(%s, FILE) failed rc=%d",
    669681                    path, rc);
    670                 err = RTErrConvertToErrno(rc);
     682                }
     683                err = sfprov_vbox2errno(rc);
    671684                goto fail1;
    672685        }
     
    723736                cmn_err(CE_WARN, "sfprov_set_size: vboxCallFSInfo(%s, SIZE) failed rc=%d",
    724737                    path, rc);
    725                 err = RTErrConvertToErrno(rc);
     738                err = sfprov_vbox2errno(rc);
    726739                goto fail1;
    727740        }
     
    761774
    762775        if (RT_FAILURE(rc))
    763                 return (EINVAL);
     776                return (sfprov_vbox2errno(rc));
    764777        if (parms.Handle == SHFL_HANDLE_NIL) {
    765778                if (parms.Result == SHFL_FILE_EXISTS)
     
    785798        kmem_free(str, size);
    786799        if (RT_FAILURE(rc))
    787                 return (EINVAL);
     800                return (sfprov_vbox2errno(rc));
    788801        return (0);
    789802}
     
    800813        kmem_free(str, size);
    801814        if (RT_FAILURE(rc))
    802                 return (RTErrConvertToErrno(rc));
     815                return (sfprov_vbox2errno(rc));
    803816        return (0);
    804817}
     
    819832        kmem_free(new, new_size);
    820833        if (RT_FAILURE(rc))
    821                 return (RTErrConvertToErrno(rc));
     834                return (sfprov_vbox2errno(rc));
    822835        return (0);
    823836}
     
    929942
    930943                default:
    931                         error = RTErrConvertToErrno(error);
     944                        error = sfprov_vbox2errno(error);
    932945                        goto done;
    933946                }
  • trunk/src/VBox/Additions/solaris/SharedFolders/vboxfs_vfs.c

    r30527 r31566  
    341341        }
    342342
    343         /*
    344         * find an available minor device number for this mount
    345         */
    346         mutex_enter(&sffs_minor_lock);
    347         do {
    348                 sffs_minor = (sffs_minor + 1) & L_MAXMIN32;
    349                 dev = makedevice(sffs_major, sffs_minor);
     343        /*
     344        * find an available minor device number for this mount
     345        */
     346        mutex_enter(&sffs_minor_lock);
     347        do {
     348                sffs_minor = (sffs_minor + 1) & L_MAXMIN32;
     349                dev = makedevice(sffs_major, sffs_minor);
    350350        } while (vfs_devismounted(dev));
    351351        mutex_exit(&sffs_minor_lock);
  • trunk/src/VBox/Additions/solaris/SharedFolders/vboxfs_vnode.c

    r31537 r31566  
    534534        vtype_t create,
    535535        sffs_stat_t *stat,
    536         uint64_t stat_time)
     536        uint64_t stat_time,
     537        int *err)
    537538{
    538539        avl_index_t     where;
    539540        sfnode_t        template;
    540541        sfnode_t        *node;
    541         int             error;
     542        int             error = 0;
    542543        int             type;
    543544        char            *fullpath;
     
    546547
    547548        ASSERT(MUTEX_HELD(&sffs_lock));
     549
     550        if (err)
     551                *err = error;
    548552
    549553        /*
     
    606610        }
    607611
     612        if (err)
     613                *err = error;
     614
    608615        /*
    609616         * If no errors, make a new node and return it.
     
    750757                        node = sfnode_lookup(dir, dirent->d_name, VNON,
    751758                            &cur_stats->sf_stats[cur_snum],
    752                             sfnode_cur_time_usec());
     759                            sfnode_cur_time_usec(), NULL);
    753760                        if (node == NULL)
    754761                                panic("sffs_readdir() lookup failed");
     
    11571164         * Lookup the node.
    11581165         */
    1159         node = sfnode_lookup(VN2SFN(dvp), name, VNON, NULL, 0);
     1166        node = sfnode_lookup(VN2SFN(dvp), name, VNON, NULL, 0, NULL);
    11601167        if (node != NULL)
    11611168                *vpp = sfnode_get_vnode(node);
     
    12521259         */
    12531260        mutex_enter(&sffs_lock);
    1254         node = sfnode_lookup(VN2SFN(dvp), name, VNON, NULL, 0);
     1261        node = sfnode_lookup(VN2SFN(dvp), name, VNON, NULL, 0, NULL);
    12551262        if (node != NULL) {
    12561263                mutex_exit(&sffs_lock);
     
    12621269         */
    12631270        sfnode_invalidate_stat_cache(VN2SFN(dvp));
    1264         node = sfnode_lookup(VN2SFN(dvp), name, VREG, NULL, 0);
     1271        int lookuperr;
     1272        node = sfnode_lookup(VN2SFN(dvp), name, VREG, NULL, 0, &lookuperr);
    12651273        if (node && (vap->va_mask & AT_MODE)) {
    12661274                timestruc_t dummy;
     
    12771285        mutex_exit(&sffs_lock);
    12781286        if (node == NULL)
    1279         {
    1280                 cmn_err(CE_NOTE, "sffs_create: sfnode_lookup() failed.\n");
    1281                 return (EINVAL);
    1282         }
     1287                return (lookuperr);
    12831288        *vpp = sfnode_get_vnode(node);
    12841289        return (0);
     
    13311336
    13321337        sfnode_invalidate_stat_cache(VN2SFN(dvp));
    1333 
    1334         node = sfnode_lookup(VN2SFN(dvp), nm, VDIR, NULL, 0);
     1338        int lookuperr = EACCES;
     1339        node = sfnode_lookup(VN2SFN(dvp), nm, VDIR, NULL, 0, &lookuperr);
    13351340        if (node && (va->va_mask & AT_MODE)) {
    13361341                timestruc_t dummy;
     
    13421347        }
    13431348
    1344         if (node->sf_parent)
     1349        if (node && node->sf_parent)
    13451350                sfnode_clear_dir_list(node->sf_parent);
    13461351
    13471352        mutex_exit(&sffs_lock);
    13481353        if (node == NULL)
    1349                 return (EACCES);
     1354                return (lookuperr);
    13501355        *vpp = sfnode_get_vnode(node);
    13511356        return (0);
     
    15301535                goto done;
    15311536
    1532         node = sfnode_lookup(VN2SFN(old_dir), old_nm, VNON, NULL, 0);
     1537        node = sfnode_lookup(VN2SFN(old_dir), old_nm, VNON, NULL, 0, NULL);
    15331538        if (node == NULL) {
    15341539                error = ENOENT;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette