Ticket #8573: amigaos4-fs.patch

File amigaos4-fs.patch, 2.9 KB (added by SF/capehill, 14 years ago)

patch for AmigaOS 4 filesystem backend

  • backends/fs/amigaos4/amigaos4-fs.cpp

     
    103103
    104104        int len = 0, offset = p.size();
    105105
    106         assert(offset > 0);
     106        //assert(offset > 0);
    107107
     108        if (offset <= 0) {
     109                debug(6, "Bad offset");
     110                return;
     111        }
     112
    108113        _sPath = p;
    109114
    110115        // Extract last component from path
     
    148153                                _bIsValid = true;
    149154                        }                       
    150155                }
     156
     157                IDOS->UnLock(pLock);
    151158        }
    152159
    153160        IDOS->FreeDosObject(DOS_FIB, fib);
     
    329336}
    330337
    331338AbstractFilesystemNode *AmigaOSFilesystemNode::child(const String &n) const {
    332         assert(_bIsDirectory);
     339       
     340        if (!_bIsDirectory) {
     341                debug(6, "Not a directory");
     342                return 0;
     343        }
     344
    333345        String newPath(_sPath);
     346
    334347        if (_sPath.lastChar() != '/')
    335348                newPath += '/';
     349
    336350        newPath += n;
     351
     352        BPTR lock = IDOS->Lock(newPath.c_str(), SHARED_LOCK);
     353
     354        if (!lock) {
     355                debug(6, "Bad path");
     356                return 0;
     357        }
     358
     359        IDOS->UnLock(lock);
     360
    337361        return new AmigaOSFilesystemNode(newPath);
    338362}
    339363
     
    343367        AbstractFSList myList;
    344368
    345369        const uint32 kLockFlags = LDF_READ | LDF_VOLUMES;
    346         char n[MAXPATHLEN];
     370        char buffer[MAXPATHLEN];
    347371
    348372        struct DosList *dosList = IDOS->LockDosList(kLockFlags);
    349373        if (!dosList) {
     
    352376                return myList;
    353377        }
    354378
    355 
    356379        dosList = IDOS->NextDosEntry(dosList, LDF_VOLUMES);
    357380        while (dosList) {
    358381                if (dosList->dol_Type == DLT_VOLUME &&
    359382                        dosList->dol_Name &&
    360383                        dosList->dol_Task) {
    361                         const char *volName = (const char *)BADDR(dosList->dol_Name)+1;
    362                         const char *devName = (const char *)((struct Task *)dosList->dol_Task->mp_SigTask)->tc_Node.ln_Name;
     384                        //const char *volName = (const char *)BADDR(dosList->dol_Name)+1;
     385                       
     386                        // Copy name to buffer
     387                        IDOS->CopyStringBSTRToC(dosList->dol_Name, buffer, MAXPATHLEN);
    363388
    364                         strcpy(n, volName);
    365                         strcat(n, ":");
     389                        //const char *devName = (const char *)((struct Task *)dosList->dol_Task->mp_SigTask)->tc_Node.ln_Name;
    366390
    367                         BPTR volumeLock = IDOS->Lock((STRPTR)n, SHARED_LOCK);
     391                        // Volume name + '\0'
     392                        char *volName = new char [strlen(buffer) + 1];
     393
     394                        strcpy(volName, buffer);
     395
     396                        strcat(buffer, ":");
     397
     398                        BPTR volumeLock = IDOS->Lock((STRPTR)buffer, SHARED_LOCK);
    368399                        if (volumeLock) {
    369                                 sprintf(n, "%s (%s)", volName, devName);
    370                                 AmigaOSFilesystemNode *entry = new AmigaOSFilesystemNode(volumeLock, n);
     400
     401                                char *devName = new char [MAXPATHLEN];
     402
     403                                // Find device name
     404                                IDOS->DevNameFromLock(volumeLock, devName, MAXPATHLEN, DN_DEVICEONLY);
     405                               
     406                                sprintf(buffer, "%s (%s)", volName, devName);
     407
     408                                delete [] devName;
     409
     410                                AmigaOSFilesystemNode *entry = new AmigaOSFilesystemNode(volumeLock, buffer);
    371411                                if (entry) {
    372412                                        if (entry->isValid())
    373413                                                myList.push_back(entry);
    374414                                        else
    375415                                                delete entry;
    376416                                }
     417
    377418                                IDOS->UnLock(volumeLock);
    378419                        }
     420
     421                        delete [] volName;
    379422                }
    380423                dosList = IDOS->NextDosEntry(dosList, LDF_VOLUMES);
    381424        }