int hddDread(iop_file_t *f, iox_dirent_t *dirent) { int rv; hdd_file_slot_t *fileSlot=f->privdata; apa_cache_t *clink; if(!(f->mode & O_DIROPEN)) return -ENOTDIR; if(fileSlot->parts[0].start==-1) return 0;// end :) WaitSema(fioSema); if((clink=apaCacheGetHeader(f->unit, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv)) && clink->header->length) { if(clink->header->flags & APA_FLAG_SUB) { // if sub get id from main header... apa_cache_t *cmain=apaCacheGetHeader(f->unit, clink->header->main, APA_IO_MODE_READ, &rv); if(cmain!=NULL){ /* This was the SONY original, which didn't do bounds-checking: rv=strlen(cmain->header->id); strcpy(dirent->name, cmain->header->id); */ strncpy(dirent->name, cmain->header->id, APA_IDMAX); dirent->name[APA_IDMAX] = '\0'; rv=strlen(dirent->name); apaCacheFree(cmain); } } else { /* This was the SONY original, which didn't do bounds-checking: rv=strlen(clink->header->id); strcpy(dirent->name, clink->header->id); */ strncpy(dirent->name, clink->header->id, APA_IDMAX); dirent->name[APA_IDMAX] = '\0'; rv=strlen(dirent->name); } fioGetStatFiller(clink, &dirent->stat); if(clink->header->next==0) fileSlot->parts[0].start=-1; // mark end else fileSlot->parts[0].start=clink->header->next;// set next apaCacheFree(clink); } SignalSema(fioSema); return rv; }
int hddGetStat(iop_file_t *f, const char *name, iox_stat_t *stat) { apa_cache_t *clink; apa_params_t params; int rv; if((rv=fioGetInput(name, ¶ms))<0) return rv; WaitSema(fioSema); if((clink=apaFindPartition(f->unit, params.id, &rv))){ if((rv=apaPassCmp(clink->header->fpwd, params.fpwd))==0 || (rv=apaPassCmp(clink->header->rpwd, params.rpwd))==0) fioGetStatFiller(clink, stat); apaCacheFree(clink); } SignalSema(fioSema); return rv; }
int hddGetStat(iop_file_t *f, const char *name, iox_stat_t *stat) { apa_cache *clink; input_param params; int rv; if((rv=fioGetInput(name, ¶ms))<0) return rv; WaitSema(fioSema); if((clink=apaFindPartition(f->unit, params.id, &rv))){ if((rv=passcmp(clink->header->rpwd, NULL))==0) fioGetStatFiller(clink, stat); cacheAdd(clink); } SignalSema(fioSema); return rv; }
int hddDread(iop_file_t *f, iox_dirent_t *dirent) { int rv; hdd_file_slot_t *fileSlot=f->privdata; apa_cache *clink; if(!(f->mode & O_DIROPEN)) return -ENOTDIR; if(fileSlot->start==-1) return 0;// end :) WaitSema(fioSema); if((clink=cacheGetHeader(f->unit, fileSlot->start, 0, &rv)) && clink->header->length) { if(clink->header->flags & APA_FLAG_SUB) { // if sub get id from main header... apa_cache *cmain=cacheGetHeader(f->unit, clink->header->main, 0, &rv); if(cmain!=NULL){ rv=strlen(cmain->header->id); strcpy(dirent->name, cmain->header->id); cacheAdd(cmain); } } else { rv=strlen(clink->header->id); strcpy(dirent->name, clink->header->id); } fioGetStatFiller(clink, &dirent->stat); if(clink->header->next==0) fileSlot->start=-1; // mark end else fileSlot->start=clink->header->next;// set next cacheAdd(clink); } SignalSema(fioSema); return rv; }