static int _dos_loop(Stream_t *Dir, MainParam_t *mp, const char *filename) { Stream_t *MyFile=0; direntry_t entry; int ret; int r; ret = 0; r=0; initializeDirentry(&entry, Dir); while(!got_signal && (r=vfat_lookup(&entry, filename, -1, mp->lookupflags, mp->shortname, mp->longname)) == 0 ){ mp->File = NULL; if(!checkForDot(mp->lookupflags,entry.name)) { MyFile = 0; if((mp->lookupflags & DO_OPEN) || (IS_DIR(&entry) && (mp->lookupflags & DO_OPEN_DIRS))) { MyFile = mp->File = OpenFileByDirentry(&entry); } if(got_signal) break; mp->direntry = &entry; if(IS_DIR(&entry)) ret |= mp->dirCallback(&entry,mp); else ret |= mp->callback(&entry, mp); FREE(&MyFile); } if (fat_error(Dir)) ret |= ERROR_ONE; if(mp->fast_quit && (ret & ERROR_ONE)) break; } if (r == -2) return ERROR_ONE; if(got_signal) ret |= ERROR_ONE; return ret; }
static __inline__ int write_slots(Stream_t *Dir, dos_name_t *dosname, char *longname, struct scan_state *ssp, write_data_callback *cb, void *arg, int Case) { direntry_t entry; /* write the file */ if (fat_error(Dir)) return 0; entry.Dir = Dir; entry.entry = ssp->slot; native_to_wchar(longname, entry.name, MAX_VNAMELEN, 0, 0); entry.name[MAX_VNAMELEN]='\0'; entry.dir.Case = Case & (EXTCASE | BASECASE); if (cb(dosname, longname, arg, &entry) >= 0) { if ((ssp->size_needed > 1) && (ssp->free_end - ssp->free_start >= ssp->size_needed)) { ssp->slot = write_vfat(Dir, dosname, longname, ssp->free_start, &entry); } else { ssp->size_needed = 1; write_vfat(Dir, dosname, 0, ssp->free_start, &entry); } /* clear_vses(Dir, ssp->free_start + ssp->size_needed, ssp->free_end); */ } else return 0; return 1; /* Successfully wrote the file */ }