diff --git a/apps/codecs.c b/apps/codecs.c index b072c65f40..25cc659e42 100644 --- a/apps/codecs.c +++ b/apps/codecs.c @@ -55,20 +55,16 @@ #define LOGF_ENABLE #include "logf.h" -#if (CONFIG_PLATFORM & PLATFORM_HOSTED) - +#if (CONFIG_PLATFORM & PLATFORM_SDL) #define PREFIX(_x_) sim_ ## _x_ +#else +#define PREFIX(_x_) _x_ +#endif + +#if (CONFIG_PLATFORM & PLATFORM_HOSTED) #if CONFIG_CODEC == SWCODEC unsigned char codecbuf[CODEC_SIZE]; #endif -void *sim_codec_load_ram(char* codecptr, int size, void **pd); -void sim_codec_close(void *pd); - -#else /* !PLATFORM_HOSTED */ - -#define PREFIX -#define sim_codec_close(x) - #endif size_t codec_size; @@ -110,7 +106,7 @@ struct codec_api ci = { #if defined(CPU_ARM) && CONFIG_PLATFORM & PLATFORM_NATIVE __div0, #endif - PREFIX(sleep), + sleep, yield, #if NUM_CORES > 1 diff --git a/apps/codecs.h b/apps/codecs.h index 97b33ec9ad..520aaeebc7 100644 --- a/apps/codecs.h +++ b/apps/codecs.h @@ -159,7 +159,7 @@ struct codec_api { #if defined(CPU_ARM) && CONFIG_PLATFORM & PLATFORM_NATIVE void (*__div0)(void); #endif - void (*sleep)(int ticks); + unsigned (*sleep)(unsigned ticks); void (*yield)(void); #if NUM_CORES > 1 diff --git a/apps/codecs/sid.c b/apps/codecs/sid.c index 318cd1b4c8..455bdbc28a 100644 --- a/apps/codecs/sid.c +++ b/apps/codecs/sid.c @@ -101,7 +101,7 @@ void sidPoke(int reg, unsigned char val) ICODE_ATTR; #define rel 13 enum { - adc, _and, asl, bcc, bcs, beq, bit, bmi, bne, bpl, brk, bvc, bvs, clc, + adc, _and, asl, bcc, bcs, beq, bit, bmi, bne, bpl, _brk, bvc, bvs, clc, cld, cli, clv, cmp, cpx, cpy, dec, dex, dey, eor, inc, inx, iny, jmp, jsr, lda, ldx, ldy, lsr, _nop, ora, pha, php, pla, plp, rol, ror, rti, rts, sbc, sec, sed, sei, sta, stx, sty, tax, tay, tsx, txa, txs, tya, @@ -204,7 +204,7 @@ static const float decayReleaseTimes[16] ICONST_ATTR = }; static const int opcodes[256] ICONST_ATTR = { - brk,ora,xxx,xxx,xxx,ora,asl,xxx,php,ora,asl,xxx,xxx,ora,asl,xxx, + _brk,ora,xxx,xxx,xxx,ora,asl,xxx,php,ora,asl,xxx,xxx,ora,asl,xxx, bpl,ora,xxx,xxx,xxx,ora,asl,xxx,clc,ora,xxx,xxx,xxx,ora,asl,xxx, jsr,_and,xxx,xxx,bit,_and,rol,xxx,plp,_and,rol,xxx,bit,_and,rol,xxx, bmi,_and,xxx,xxx,xxx,_and,rol,xxx,sec,_and,xxx,xxx,xxx,_and,rol,xxx, @@ -908,7 +908,7 @@ static inline void cpuParse(void) setflags(FLAG_N,bval&0x80); setflags(FLAG_V,bval&0x40); break; - case brk: + case _brk: pc=0; /* Just quit the emulation */ break; case clc: diff --git a/apps/filetree.c b/apps/filetree.c index 0a1b49d1fe..1dc510f8c7 100644 --- a/apps/filetree.c +++ b/apps/filetree.c @@ -153,10 +153,10 @@ static void check_file_thumbnails(struct tree_context* c) while((entry = readdir(dir)) != 0) /* walk directory */ { int ext_pos; - + struct dirinfo info = dir_get_info(dir, entry); ext_pos = strlen((char *)entry->d_name) - strlen(file_thumbnail_ext); if (ext_pos <= 0 /* too short to carry ".talk" */ - || (entry->attribute & ATTR_DIRECTORY) /* no file */ + || (info.attribute & ATTR_DIRECTORY) /* no file */ || strcasecmp((char *)&entry->d_name[ext_pos], file_thumbnail_ext)) { /* or doesn't end with ".talk", no candidate */ continue; @@ -284,15 +284,17 @@ int ft_load(struct tree_context* c, const char* tempdir) for ( i=0; i < global_settings.max_files_in_dir; i++ ) { int len; struct dirent *entry = readdir(dir); + struct dirinfo info; struct entry* dptr = (struct entry*)(c->dircache + i * sizeof(struct entry)); if (!entry) break; + info = dir_get_info(dir, entry); len = strlen((char *)entry->d_name); /* skip directories . and .. */ - if ((entry->attribute & ATTR_DIRECTORY) && + if ((info.attribute & ATTR_DIRECTORY) && (((len == 1) && (!strncmp((char *)entry->d_name, ".", 1))) || ((len == 2) && (!strncmp((char *)entry->d_name, "..", 2))))) { i--; @@ -300,7 +302,7 @@ int ft_load(struct tree_context* c, const char* tempdir) } /* Skip FAT volume ID */ - if (entry->attribute & ATTR_VOLUME_ID) { + if (info.attribute & ATTR_VOLUME_ID) { i--; continue; } @@ -308,12 +310,12 @@ int ft_load(struct tree_context* c, const char* tempdir) /* filter out dotfiles and hidden files */ if (*c->dirfilter != SHOW_ALL && ((entry->d_name[0]=='.') || - (entry->attribute & ATTR_HIDDEN))) { + (info.attribute & ATTR_HIDDEN))) { i--; continue; } - dptr->attr = entry->attribute; + dptr->attr = info.attribute; /* check for known file types */ if ( !(dptr->attr & ATTR_DIRECTORY) ) @@ -362,8 +364,8 @@ int ft_load(struct tree_context* c, const char* tempdir) } dptr->name = &c->name_buffer[name_buffer_used]; dptr->time_write = - (long)entry->wrtdate<<16 | - (long)entry->wrttime; /* in one # */ + (long)info.wrtdate<<16 | + (long)info.wrttime; /* in one # */ strcpy(dptr->name, (char *)entry->d_name); name_buffer_used += len + 1; diff --git a/apps/misc.c b/apps/misc.c index c35e2c5001..4b89a5d4a3 100644 --- a/apps/misc.c +++ b/apps/misc.c @@ -28,6 +28,7 @@ #include "misc.h" #include "lcd.h" #include "file.h" +#include "filefuncs.h" #ifndef __PCTOOL__ #include "lang.h" #include "dir.h" @@ -708,11 +709,12 @@ void check_bootfile(bool do_rolo) { if(!strcasecmp(entry->d_name, BOOTFILE)) { + struct dirinfo info = dir_get_info(dir, entry); /* found the bootfile */ if(wrtdate && do_rolo) { - if((entry->wrtdate != wrtdate) || - (entry->wrttime != wrttime)) + if((info.wrtdate != wrtdate) || + (info.wrttime != wrttime)) { static const char *lines[] = { ID2P(LANG_BOOT_CHANGED), ID2P(LANG_REBOOT_NOW) }; @@ -722,8 +724,8 @@ void check_bootfile(bool do_rolo) rolo_load(BOOTDIR "/" BOOTFILE); } } - wrtdate = entry->wrtdate; - wrttime = entry->wrttime; + wrtdate = info.wrtdate; + wrttime = info.wrttime; } } closedir(dir); diff --git a/apps/onplay.c b/apps/onplay.c index 72912579f9..f5b8476492 100644 --- a/apps/onplay.c +++ b/apps/onplay.c @@ -26,7 +26,6 @@ #include "debug.h" #include "lcd.h" -#include "dir.h" #include "file.h" #include "audio.h" #include "menu.h" @@ -63,6 +62,7 @@ #include "statusbar-skinned.h" #include "pitchscreen.h" #include "viewport.h" +#include "filefuncs.h" static int context; static char* selected_file = NULL; @@ -484,14 +484,14 @@ static int remove_dir(char* dirname, int len) entry = readdir(dir); if (!entry) break; - + struct dirinfo info = dir_get_info(dir, entry); dirname[dirlen] ='\0'; /* inform the user which dir we're deleting */ splash(0, dirname); /* append name to current directory */ snprintf(dirname+dirlen, len-dirlen, "/%s", entry->d_name); - if (entry->attribute & ATTR_DIRECTORY) + if (info.attribute & ATTR_DIRECTORY) { /* remove a subdirectory */ if (!strcmp((char *)entry->d_name, ".") || !strcmp((char *)entry->d_name, "..")) @@ -783,6 +783,7 @@ static bool clipboard_pastedirectory(char *src, int srclen, char *target, if (!entry) break; + struct dirinfo info = dir_get_info(srcdir, entry); /* append name to current directory */ snprintf(src+srcdirlen, srclen-srcdirlen, "/%s", entry->d_name); snprintf(target+targetdirlen, targetlen-targetdirlen, "/%s", @@ -790,7 +791,7 @@ static bool clipboard_pastedirectory(char *src, int srclen, char *target, DEBUGF("Copy %s to %s\n", src, target); - if (entry->attribute & ATTR_DIRECTORY) + if (info.attribute & ATTR_DIRECTORY) { /* copy/move a subdirectory */ if (!strcmp((char *)entry->d_name, ".") || !strcmp((char *)entry->d_name, "..")) diff --git a/apps/plugin.c b/apps/plugin.c index e0455c51a2..9e08951828 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -59,7 +59,7 @@ #include "usbstack/usb_hid.h" #endif -#if (CONFIG_PLATFORM & PLATFORM_HOSTED) +#if (CONFIG_PLATFORM & PLATFORM_SDL) #define PREFIX(_x_) sim_ ## _x_ #else #define PREFIX @@ -349,7 +349,7 @@ static const struct plugin_api rockbox_api = { #if defined(CPU_ARM) && CONFIG_PLATFORM & PLATFORM_NATIVE __div0, #endif - PREFIX(sleep), + sleep, yield, ¤t_tick, default_event_handler, @@ -529,7 +529,7 @@ static const struct plugin_api rockbox_api = { playlist_insert_track, playlist_insert_directory, playlist_shuffle, - PREFIX(audio_play), + audio_play, audio_stop, audio_pause, audio_resume, @@ -722,6 +722,7 @@ static const struct plugin_api rockbox_api = { /* new stuff at the end, sort into place next time the API gets incompatible */ + dir_get_info, }; int plugin_load(const char* plugin, const void* parameter) @@ -940,11 +941,11 @@ static int open_wrapper(const char* pathname, int flags, ...) { va_list ap; va_start(ap, flags); - fd = sim_open(pathname, flags, va_arg(ap, unsigned int)); + fd = open(pathname, flags, va_arg(ap, unsigned int)); va_end(ap); } else - fd = sim_open(pathname, flags); + fd = open(pathname, flags); #else fd = file_open(pathname,flags); #endif diff --git a/apps/plugin.h b/apps/plugin.h index 422f58fc8a..ddd913088f 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -459,7 +459,7 @@ struct plugin_api { #if defined(CPU_ARM) && CONFIG_PLATFORM & PLATFORM_NATIVE void (*__div0)(void); #endif - void (*sleep)(int ticks); + unsigned (*sleep)(unsigned ticks); void (*yield)(void); volatile long* current_tick; long (*default_event_handler)(long event); @@ -894,6 +894,7 @@ struct plugin_api { /* new stuff at the end, sort into place next time the API gets incompatible */ + struct dirinfo (*dir_get_info)(struct DIR* parent, struct dirent *entry); }; /* plugin header */ diff --git a/apps/plugins/disktidy.c b/apps/plugins/disktidy.c index c5f0f4a7bd..1e6c1536e2 100644 --- a/apps/plugins/disktidy.c +++ b/apps/plugins/disktidy.c @@ -244,7 +244,9 @@ enum tidy_return tidy_removedir(char *path, int *path_length) /* silent error */ continue; - if (entry->attribute & ATTR_DIRECTORY) + + struct dirinfo info = rb->dir_get_info(dir, entry); + if (info.attribute & ATTR_DIRECTORY) { /* dir ignore "." and ".." */ if ((rb->strcmp(entry->d_name, ".") != 0) && \ @@ -297,6 +299,7 @@ enum tidy_return tidy_clean(char *path, int *path_length) while((status == TIDY_RETURN_OK) && ((entry = rb->readdir(dir)) != 0)) /* walk directory */ { + struct dirinfo info = rb->dir_get_info(dir, entry); /* check for user input and usb connect */ button = rb->get_action(CONTEXT_STD, TIMEOUT_NOBLOCK); if (button == ACTION_STD_CANCEL) @@ -312,7 +315,7 @@ enum tidy_return tidy_clean(char *path, int *path_length) rb->yield(); - if (entry->attribute & ATTR_DIRECTORY) + if (info.attribute & ATTR_DIRECTORY) { /* directory ignore "." and ".." */ if ((rb->strcmp(entry->d_name, ".") != 0) && \ @@ -326,7 +329,7 @@ enum tidy_return tidy_clean(char *path, int *path_length) /* silent error */ continue; - if (tidy_remove_item(entry->d_name, entry->attribute)) + if (tidy_remove_item(entry->d_name, info.attribute)) { /* delete dir */ tidy_removedir(path, path_length); @@ -347,7 +350,7 @@ enum tidy_return tidy_clean(char *path, int *path_length) { /* file */ del = 0; - if (tidy_remove_item(entry->d_name, entry->attribute)) + if (tidy_remove_item(entry->d_name, info.attribute)) { /* get absolute path */ /* returns an error if path is too long */ diff --git a/apps/plugins/lua/luadir.c b/apps/plugins/lua/luadir.c index 730c40ce22..c8c21d2c65 100644 --- a/apps/plugins/lua/luadir.c +++ b/apps/plugins/lua/luadir.c @@ -56,8 +56,9 @@ static int dir_iter (lua_State *L) { luaL_argcheck (L, !d->closed, 1, "closed directory"); if ((entry = rb->readdir (d->dir)) != NULL) { + struct dirinfo info = rb->dir_get_info(d->dir, entry); lua_pushstring (L, entry->d_name); - lua_pushboolean (L, entry->attribute & ATTR_DIRECTORY); + lua_pushboolean (L, info.attribute & ATTR_DIRECTORY); return 2; } else { /* no more entries => close directory */ diff --git a/apps/plugins/md5sum.c b/apps/plugins/md5sum.c index fe1c65efb0..c993018852 100644 --- a/apps/plugins/md5sum.c +++ b/apps/plugins/md5sum.c @@ -95,7 +95,9 @@ static void hash_dir( int out, const char *path ) char childpath[MAX_PATH]; rb->snprintf( childpath, MAX_PATH, "%s/%s", rb->strcmp( path, "/" ) ? path : "", entry->d_name ); - if( entry->attribute & ATTR_DIRECTORY ) + + struct dirinfo info = rb->dir_get_info(dir, entry); + if (info.attribute & ATTR_DIRECTORY) { if( rb->strcmp( entry->d_name, "." ) && rb->strcmp( entry->d_name, ".." ) ) diff --git a/apps/plugins/properties.c b/apps/plugins/properties.c index d6692bc893..e127a2908e 100644 --- a/apps/plugins/properties.c +++ b/apps/plugins/properties.c @@ -69,22 +69,23 @@ static bool file_properties(char* selected_file) { while(0 != (entry = rb->readdir(dir))) { + struct dirinfo info = rb->dir_get_info(dir, entry); if(!rb->strcmp(entry->d_name, selected_file+dirlen)) { unsigned log; rb->snprintf(str_dirname, sizeof str_dirname, "Path: %s", tstr); rb->snprintf(str_filename, sizeof str_filename, "Name: %s", selected_file+dirlen); - log = human_size_log(entry->size); + log = human_size_log(info.size); rb->snprintf(str_size, sizeof str_size, "Size: %ld %cB", - entry->size >> (log*10), human_size_prefix[log]); + info.size >> (log*10), human_size_prefix[log]); rb->snprintf(str_date, sizeof str_date, "Date: %04d/%02d/%02d", - ((entry->wrtdate >> 9 ) & 0x7F) + 1980, /* year */ - ((entry->wrtdate >> 5 ) & 0x0F), /* month */ - ((entry->wrtdate ) & 0x1F)); /* day */ + ((info.wrtdate >> 9 ) & 0x7F) + 1980, /* year */ + ((info.wrtdate >> 5 ) & 0x0F), /* month */ + ((info.wrtdate ) & 0x1F)); /* day */ rb->snprintf(str_time, sizeof str_time, "Time: %02d:%02d", - ((entry->wrttime >> 11) & 0x1F), /* hour */ - ((entry->wrttime >> 5 ) & 0x3F)); /* minutes */ + ((info.wrttime >> 11) & 0x1F), /* hour */ + ((info.wrttime >> 5 ) & 0x3F)); /* minutes */ num_properties = 5; @@ -158,11 +159,12 @@ static bool _dir_properties(DPS* dps) /* walk through the directory content */ while(result && (0 != (entry = rb->readdir(dir)))) { + struct dirinfo info = rb->dir_get_info(dir, entry); /* append name to current directory */ rb->snprintf(dps->dirname+dirlen, dps->len-dirlen, "/%s", entry->d_name); - if (entry->attribute & ATTR_DIRECTORY) + if (info.attribute & ATTR_DIRECTORY) { unsigned log; @@ -188,7 +190,7 @@ static bool _dir_properties(DPS* dps) else { dps->fc++; /* new file */ - dps->bc += entry->size; + dps->bc += info.size; } if(ACTION_STD_CANCEL == rb->get_action(CONTEXT_STD,TIMEOUT_NOBLOCK)) result = false; @@ -290,7 +292,8 @@ enum plugin_status plugin_start(const void* parameter) { if(!rb->strcmp(entry->d_name, file+dirlen)) { - its_a_dir = entry->attribute & ATTR_DIRECTORY ? true : false; + struct dirinfo info = rb->dir_get_info(dir, entry); + its_a_dir = info.attribute & ATTR_DIRECTORY ? true : false; found = true; break; } diff --git a/apps/plugins/random_folder_advance_config.c b/apps/plugins/random_folder_advance_config.c index 55d9bf99ab..eca33dc08a 100644 --- a/apps/plugins/random_folder_advance_config.c +++ b/apps/plugins/random_folder_advance_config.c @@ -98,7 +98,8 @@ void traversedir(char* location, char* name) if (check) { - if (entry->attribute & ATTR_DIRECTORY) { + struct dirinfo info = rb->dir_get_info(dir, entry); + if (info.attribute & ATTR_DIRECTORY) { char *start; dirs_count++; rb->snprintf(path,MAX_PATH,"%s/%s",fullpath,entry->d_name); diff --git a/apps/plugins/stats.c b/apps/plugins/stats.c index ecf335d3f0..6a70a47ec4 100644 --- a/apps/plugins/stats.c +++ b/apps/plugins/stats.c @@ -178,7 +178,8 @@ void traversedir(char* location, char* name) /* Skip .. and . */ if (rb->strcmp(entry->d_name, ".") && rb->strcmp(entry->d_name, "..")) { - if (entry->attribute & ATTR_DIRECTORY) { + struct dirinfo info = rb->dir_get_info(dir, entry); + if (info.attribute & ATTR_DIRECTORY) { traversedir(fullpath, entry->d_name); dirs++; } diff --git a/apps/plugins/theme_remove.c b/apps/plugins/theme_remove.c index d679338ff8..674342a920 100644 --- a/apps/plugins/theme_remove.c +++ b/apps/plugins/theme_remove.c @@ -236,7 +236,8 @@ static int remove_dir(char* dirname, int len) /* append name to current directory */ rb->snprintf(dirname+dirlen, len-dirlen, "/%s", entry->d_name); - if (entry->attribute & ATTR_DIRECTORY) + struct dirinfo info = rb->dir_get_info(dir, entry); + if (info.attribute & ATTR_DIRECTORY) { /* remove a subdirectory */ if (!rb->strcmp((char *)entry->d_name, ".") || diff --git a/apps/tagcache.c b/apps/tagcache.c index 6e416dd7f8..a6cfb4c590 100644 --- a/apps/tagcache.c +++ b/apps/tagcache.c @@ -4222,6 +4222,8 @@ static bool check_dir(const char *dirname, int add_files) success = true; break ; } + + struct dirinfo info = dir_get_info(dir, entry); if (!strcmp((char *)entry->d_name, ".") || !strcmp((char *)entry->d_name, "..")) @@ -4234,14 +4236,14 @@ static bool check_dir(const char *dirname, int add_files) entry->d_name); processed_dir_count++; - if (entry->attribute & ATTR_DIRECTORY) + if (info.attribute & ATTR_DIRECTORY) check_dir(curpath, add_files); else if (add_files) { tc_stat.curentry = curpath; /* Add a new entry to the temporary db file. */ - add_tagcache(curpath, (entry->wrtdate << 16) | entry->wrttime + add_tagcache(curpath, (info.wrtdate << 16) | info.wrttime #if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE) , dir->internal_entry #endif diff --git a/apps/tagtree.c b/apps/tagtree.c index 8c7f7a2e5d..78c48b4d13 100644 --- a/apps/tagtree.c +++ b/apps/tagtree.c @@ -51,7 +51,7 @@ #include "audio.h" #include "appevents.h" #include "storage.h" -#include "dir_uncached.h" +#include "dir.h" #define FILE_SEARCH_INSTRUCTIONS ROCKBOX_DIR "/tagnavi.config" diff --git a/firmware/SOURCES b/firmware/SOURCES index f83b78970e..8b71674b36 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -1703,7 +1703,9 @@ target/coldfire/mpio/fmradio_i2c-mpio.c #if (CONFIG_PLATFORM & PLATFORM_ANDROID) +target/hosted/android/fs-android.c target/hosted/android/lcd-android.c +target/hosted/android/lc-android.c target/hosted/android/button-android.c target/hosted/android/kernel-android.c target/hosted/android/pcm-android.c diff --git a/firmware/common/dir_uncached.c b/firmware/common/dir_uncached.c index e3e33a4c11..2ce23e8b8e 100644 --- a/firmware/common/dir_uncached.c +++ b/firmware/common/dir_uncached.c @@ -171,7 +171,7 @@ struct dirent_uncached* readdir_uncached(DIR_UNCACHED* dir) if (fat_ismounted(dir->volumecounter)) { memset(theent, 0, sizeof(*theent)); - theent->attribute = FAT_ATTR_DIRECTORY | FAT_ATTR_VOLUME; + theent->info.attribute = FAT_ATTR_DIRECTORY | FAT_ATTR_VOLUME; snprintf(theent->d_name, sizeof(theent->d_name), VOL_NAMES, dir->volumecounter); return theent; @@ -187,11 +187,11 @@ struct dirent_uncached* readdir_uncached(DIR_UNCACHED* dir) return NULL; strlcpy(theent->d_name, entry.name, sizeof(theent->d_name)); - theent->attribute = entry.attr; - theent->size = entry.filesize; + theent->info.attribute = entry.attr; + theent->info.wrtdate = entry.wrtdate; + theent->info.wrttime = entry.wrttime; + theent->info.size = entry.filesize; theent->startcluster = entry.firstcluster; - theent->wrtdate = entry.wrtdate; - theent->wrttime = entry.wrttime; return theent; } diff --git a/firmware/common/dircache.c b/firmware/common/dircache.c index 4ae8d805dd..509743bdbb 100644 --- a/firmware/common/dircache.c +++ b/firmware/common/dircache.c @@ -237,19 +237,19 @@ static int sab_process_dir(unsigned long startcluster, struct dircache_entry *ce !strcmp("..", sab.direntry->name)) continue; - ce->attribute = sab.direntry->attr; ce->name_len = strlen(sab.direntry->name) + 1; ce->d_name = ((char *)dircache_root + dircache_size); ce->startcluster = sab.direntry->firstcluster; - ce->size = sab.direntry->filesize; - ce->wrtdate = sab.direntry->wrtdate; - ce->wrttime = sab.direntry->wrttime; + ce->info.size = sab.direntry->filesize; + ce->info.attribute = sab.direntry->attr; + ce->info.wrtdate = sab.direntry->wrtdate; + ce->info.wrttime = sab.direntry->wrttime; memcpy(ce->d_name, sab.direntry->name, ce->name_len); dircache_size += ce->name_len; entry_count++; - if(ce->attribute & FAT_ATTR_DIRECTORY) + if(ce->info.attribute & FAT_ATTR_DIRECTORY) dircache_gen_down(ce); ce = dircache_gen_next(ce); @@ -269,18 +269,18 @@ static int sab_process_dir(unsigned long startcluster, struct dircache_entry *ce /* add "." and ".." */ ce->d_name = "."; ce->name_len = 2; - ce->attribute = FAT_ATTR_DIRECTORY; + ce->info.attribute = FAT_ATTR_DIRECTORY; ce->startcluster = startcluster; - ce->size = 0; + ce->info.size = 0; ce->down = first_ce; ce = dircache_gen_next(ce); ce->d_name = ".."; ce->name_len = 3; - ce->attribute = FAT_ATTR_DIRECTORY; + ce->info.attribute = FAT_ATTR_DIRECTORY; ce->startcluster = (first_ce->up ? first_ce->up->startcluster : 0); - ce->size = 0; + ce->info.size = 0; ce->down = first_ce->up; /* second pass: recurse ! */ @@ -311,8 +311,8 @@ static int dircache_scan_and_build(IF_MV2(int volume,) struct dircache_entry *ce snprintf(ce->d_name, VOL_ENUM_POS + 3, VOL_NAMES, volume); ce->name_len = VOL_ENUM_POS + 3; dircache_size += ce->name_len; - ce->attribute = FAT_ATTR_DIRECTORY | FAT_ATTR_VOLUME; - ce->size = 0; + ce->info.attribute = FAT_ATTR_DIRECTORY | FAT_ATTR_VOLUME; + ce->info.size = 0; append_position = dircache_gen_next(ce); ce = dircache_gen_down(ce); } @@ -347,18 +347,15 @@ static int sab_process_dir(struct dircache_entry *ce) !strcmp("..", entry->d_name)) continue; - ce->attribute = entry->attribute; ce->name_len = strlen(entry->d_name) + 1; ce->d_name = ((char *)dircache_root + dircache_size); - ce->size = entry->size; - ce->wrtdate = entry->wrtdate; - ce->wrttime = entry->wrttime; + ce->info = entry->info; memcpy(ce->d_name, entry->d_name, ce->name_len); dircache_size += ce->name_len; entry_count++; - if(entry->attribute & ATTR_DIRECTORY) + if(entry->info.attribute & ATTR_DIRECTORY) { dircache_gen_down(ce); if(ce->down == NULL) @@ -400,16 +397,16 @@ static int sab_process_dir(struct dircache_entry *ce) /* add "." and ".." */ ce->d_name = "."; ce->name_len = 2; - ce->attribute = ATTR_DIRECTORY; - ce->size = 0; + ce->info.attribute = ATTR_DIRECTORY; + ce->info.size = 0; ce->down = first_ce; ce = dircache_gen_next(ce); ce->d_name = ".."; ce->name_len = 3; - ce->attribute = ATTR_DIRECTORY; - ce->size = 0; + ce->info.attribute = ATTR_DIRECTORY; + ce->info.size = 0; ce->down = first_ce->up; closedir_uncached(dir); @@ -1022,13 +1019,11 @@ static struct dircache_entry* dircache_new_entry(const char *path, int attribute return NULL; } - entry->attribute = attribute; entry->name_len = MIN(254, strlen(new)) + 1; entry->d_name = ((char *)dircache_root+dircache_size); entry->startcluster = 0; - entry->wrtdate = 0; - entry->wrttime = 0; - entry->size = 0; + memset(&entry->info, 0, sizeof(entry->info)); + entry->info.attribute = attribute; memcpy(entry->d_name, new, entry->name_len); dircache_size += entry->name_len; @@ -1086,7 +1081,7 @@ void dircache_update_filesize(int fd, long newsize, long startcluster) return ; } - fd_bindings[fd]->size = newsize; + fd_bindings[fd]->info.size = newsize; fd_bindings[fd]->startcluster = startcluster; } void dircache_update_filetime(int fd) @@ -1106,12 +1101,12 @@ void dircache_update_filetime(int fd) return ; } year = now->tm_year+1900-1980; - fd_bindings[fd]->wrtdate = (((year)&0x7f)<<9) | - (((now->tm_mon+1)&0xf)<<5) | - (((now->tm_mday)&0x1f)); - fd_bindings[fd]->wrttime = (((now->tm_hour)&0x1f)<<11) | - (((now->tm_min)&0x3f)<<5) | - (((now->tm_sec/2)&0x1f)); + fd_bindings[fd]->info.wrtdate = (((year)&0x7f)<<9) | + (((now->tm_mon+1)&0xf)<<5) | + (((now->tm_mday)&0x1f)); + fd_bindings[fd]->info.wrttime = (((now->tm_hour)&0x1f)<<11) | + (((now->tm_min)&0x3f)<<5) | + (((now->tm_sec/2)&0x1f)); #endif } @@ -1211,7 +1206,7 @@ void dircache_rename(const char *oldpath, const char *newpath) newpath = absolute_path; } - newentry = dircache_new_entry(newpath, entry->attribute); + newentry = dircache_new_entry(newpath, entry->info.attribute); if (newentry == NULL) { dircache_initialized = false; @@ -1219,10 +1214,10 @@ void dircache_rename(const char *oldpath, const char *newpath) } newentry->down = oldentry.down; - newentry->size = oldentry.size; newentry->startcluster = oldentry.startcluster; - newentry->wrttime = oldentry.wrttime; - newentry->wrtdate = oldentry.wrtdate; + newentry->info.size = oldentry.info.size; + newentry->info.wrtdate = oldentry.info.wrtdate; + newentry->info.wrttime = oldentry.info.wrttime; } void dircache_add_file(const char *path, long startcluster) @@ -1279,7 +1274,7 @@ DIR_CACHED* opendir_cached(const char* name) { pdir->regulardir = NULL; pdir->internal_entry = dircache_get_entry(name, true); - pdir->theent.attribute = -1; /* used to make readdir_cached aware of the first call */ + pdir->theent.info.attribute = -1; /* used to make readdir_cached aware of the first call */ } if (pdir->internal_entry == NULL && pdir->regulardir == NULL) @@ -1306,11 +1301,8 @@ struct dirent_cached* readdir_cached(DIR_CACHED* dir) return NULL; strlcpy(dir->theent.d_name, regentry->d_name, MAX_PATH); - dir->theent.size = regentry->size; dir->theent.startcluster = regentry->startcluster; - dir->theent.attribute = regentry->attribute; - dir->theent.wrttime = regentry->wrttime; - dir->theent.wrtdate = regentry->wrtdate; + dir->theent.info = regentry->info; return &dir->theent; } @@ -1318,7 +1310,7 @@ struct dirent_cached* readdir_cached(DIR_CACHED* dir) /* if theent.attribute=-1 then this is the first call */ /* otherwise, this is is not so we first take the entry's ->next */ /* NOTE: normal file can't have attribute=-1 */ - if(dir->theent.attribute != -1) + if(dir->theent.info.attribute != -1) ce = ce->next; /* skip unused entries */ while(ce != NULL && ce->name_len == 0) @@ -1330,11 +1322,8 @@ struct dirent_cached* readdir_cached(DIR_CACHED* dir) strlcpy(dir->theent.d_name, ce->d_name, MAX_PATH); /* Can't do `dir->theent = *ce` because that modifies the d_name pointer. */ - dir->theent.size = ce->size; dir->theent.startcluster = ce->startcluster; - dir->theent.attribute = ce->attribute; - dir->theent.wrttime = ce->wrttime; - dir->theent.wrtdate = ce->wrtdate; + dir->theent.info = ce->info; dir->internal_entry = ce; //logf("-> %s", ce->name); diff --git a/firmware/common/file.c b/firmware/common/file.c index 6beec9f606..53a1a35b31 100644 --- a/firmware/common/file.c +++ b/firmware/common/file.c @@ -124,8 +124,8 @@ static int open_internal(const char* pathname, int flags, bool use_cache) ce->startcluster, &(file->fatfile), NULL); - file->size = ce->size; - file->attr = ce->attribute; + file->size = ce->info.size; + file->attr = ce->info.attribute; file->cacheoffset = -1; file->fileoffset = 0; @@ -169,8 +169,8 @@ static int open_internal(const char* pathname, int flags, bool use_cache) entry->startcluster, &(file->fatfile), &(dir->fatdir)); - file->size = file->trunc ? 0 : entry->size; - file->attr = entry->attribute; + file->size = file->trunc ? 0 : entry->info.size; + file->attr = entry->info.attribute; break; } } diff --git a/firmware/common/filefuncs.c b/firmware/common/filefuncs.c index 9fe07d69bb..c8ab468bcb 100644 --- a/firmware/common/filefuncs.c +++ b/firmware/common/filefuncs.c @@ -23,6 +23,7 @@ #include "stdlib.h" #include "string.h" #include "debug.h" +#include "file.h" #include "filefuncs.h" #ifdef HAVE_MULTIVOLUME @@ -87,4 +88,12 @@ bool dir_exists(const char *path) closedir(d); return true; } + +#if !(CONFIG_PLATFORM & PLATFORM_ANDROID) +struct dirinfo dir_get_info(struct DIR* parent, struct dirent *entry) +{ + (void)parent; + return entry->info; +} +#endif #endif /* __PCTOOL__ */ diff --git a/firmware/export/audio.h b/firmware/export/audio.h index b81597a892..34bcfb6b8f 100644 --- a/firmware/export/audio.h +++ b/firmware/export/audio.h @@ -35,11 +35,6 @@ #endif /* HAVE_RECORDING */ #endif /* CONFIG_CODEC == SWCODEC */ - -#if (CONFIG_PLATFORM & PLATFORM_HOSTED) -#define audio_play(x) sim_audio_play(x) -#endif - #define AUDIO_STATUS_PLAY 0x0001 #define AUDIO_STATUS_PAUSE 0x0002 #define AUDIO_STATUS_RECORD 0x0004 diff --git a/firmware/export/config.h b/firmware/export/config.h index 83a9ea4feb..b81c684526 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h @@ -664,7 +664,7 @@ Lyre prototype 1 */ /* Enable the directory cache and tagcache in RAM if we have * plenty of RAM. Both features can be enabled independently. */ #if ((defined(MEMORYSIZE) && (MEMORYSIZE >= 8)) || MEM >= 8) && \ - !defined(BOOTLOADER) && !defined(__PCTOOL__) + !defined(BOOTLOADER) && !defined(__PCTOOL__) && !defined(APPLICATION) #define HAVE_DIRCACHE #ifdef HAVE_TAGCACHE #define HAVE_TC_RAMCACHE diff --git a/firmware/export/filefuncs.h b/firmware/export/filefuncs.h index 3745c6bee3..f69c6da29c 100644 --- a/firmware/export/filefuncs.h +++ b/firmware/export/filefuncs.h @@ -22,7 +22,9 @@ #ifndef __INCLUDE_FILEFUNCS_H_ #define __INCLUDE_FILEFUNCS_H_ +#include #include "config.h" +#include "dir.h" #ifdef HAVE_MULTIVOLUME int strip_volume(const char* name, char* namecopy); @@ -32,5 +34,6 @@ int strip_volume(const char* name, char* namecopy); bool file_exists(const char *file); bool dir_exists(const char *path); #endif +extern struct dirinfo dir_get_info(struct DIR* parent, struct dirent *entry); #endif /* __INCLUDE_FILEFUNCS_H_ */ diff --git a/firmware/export/kernel.h b/firmware/export/kernel.h index d256f31ab5..405f6b6838 100644 --- a/firmware/export/kernel.h +++ b/firmware/export/kernel.h @@ -203,14 +203,10 @@ static inline void call_tick_tasks(void) } #endif -#if (CONFIG_PLATFORM & PLATFORM_HOSTED) && !defined(PLUGIN) && !defined(CODEC) -#define sleep(x) sim_sleep(x) -#endif - /* kernel functions */ extern void kernel_init(void) INIT_ATTR; extern void yield(void); -extern void sleep(int ticks); +extern unsigned sleep(unsigned ticks); int tick_add_task(void (*f)(void)); int tick_remove_task(void (*f)(void)); extern void tick_start(unsigned int interval_in_ms) INIT_ATTR; diff --git a/firmware/general.c b/firmware/general.c index 20b0277c09..3daf2f0a78 100644 --- a/firmware/general.c +++ b/firmware/general.c @@ -22,7 +22,7 @@ #include "config.h" #include #include "general.h" - +#include "file.h" #include "dir.h" #include "limits.h" #include "stdlib.h" diff --git a/firmware/include/dir.h b/firmware/include/dir.h index 9ff96e3419..d143ed2664 100644 --- a/firmware/include/dir.h +++ b/firmware/include/dir.h @@ -41,6 +41,15 @@ #endif +#define ATTR_READ_ONLY 0x01 +#define ATTR_HIDDEN 0x02 +#define ATTR_SYSTEM 0x04 +#define ATTR_VOLUME_ID 0x08 +#define ATTR_DIRECTORY 0x10 +#define ATTR_ARCHIVE 0x20 +#define ATTR_VOLUME 0x40 /* this is a volume, not a real directory */ + +#if (CONFIG_PLATFORM & (PLATFORM_NATIVE|PLATFORM_SDL)) #ifdef HAVE_DIRCACHE # include "dircache.h" # define DIR DIR_CACHED @@ -62,5 +71,9 @@ # define mkdir mkdir_uncached # define rmdir rmdir_uncached #endif +#else +#include "dir_uncached.h" +#include "dir-target.h" +#endif #endif diff --git a/firmware/include/dir_uncached.h b/firmware/include/dir_uncached.h index f225cf8e39..5c7ed14658 100644 --- a/firmware/include/dir_uncached.h +++ b/firmware/include/dir_uncached.h @@ -21,18 +21,20 @@ #ifndef _DIR_UNCACHED_H_ #define _DIR_UNCACHED_H_ +#include "config.h" + +struct dirinfo { + int attribute; + long size; + unsigned short wrtdate; + unsigned short wrttime; +}; + +#ifndef APPLICATION #include #include "file.h" -#define ATTR_READ_ONLY 0x01 -#define ATTR_HIDDEN 0x02 -#define ATTR_SYSTEM 0x04 -#define ATTR_VOLUME_ID 0x08 -#define ATTR_DIRECTORY 0x10 -#define ATTR_ARCHIVE 0x20 -#define ATTR_VOLUME 0x40 /* this is a volume, not a real directory */ - -#if (CONFIG_PLATFORM & PLATFORM_HOSTED) +#if (CONFIG_PLATFORM & PLATFORM_SDL) #define dirent_uncached sim_dirent #define DIR_UNCACHED SIM_DIR #define opendir_uncached sim_opendir @@ -46,11 +48,8 @@ struct dirent_uncached { unsigned char d_name[MAX_PATH]; - int attribute; - long size; + struct dirinfo info; long startcluster; - unsigned short wrtdate; /* Last write date */ - unsigned short wrttime; /* Last write time */ }; #endif @@ -92,5 +91,6 @@ extern struct dirent_uncached* readdir_uncached(DIR_UNCACHED* dir); extern int release_dirs(int volume); #endif /* DIRFUNCTIONS_DEFINED */ +#endif #endif diff --git a/firmware/include/dircache.h b/firmware/include/dircache.h index 650b92632d..37a803c63c 100644 --- a/firmware/include/dircache.h +++ b/firmware/include/dircache.h @@ -63,25 +63,19 @@ struct fdbind_queue { /* Exported structures. */ struct dircache_entry { + struct dirinfo info; struct dircache_entry *next; struct dircache_entry *up; struct dircache_entry *down; - int attribute; - long size; long startcluster; - unsigned short wrtdate; - unsigned short wrttime; unsigned long name_len; char *d_name; }; struct dirent_cached { + struct dirinfo info; char *d_name; - int attribute; - long size; long startcluster; - unsigned short wrtdate; /* Last write date */ - unsigned short wrttime; /* Last write time */ }; typedef struct { diff --git a/firmware/include/file.h b/firmware/include/file.h index 8a084d6f39..8711124391 100644 --- a/firmware/include/file.h +++ b/firmware/include/file.h @@ -37,7 +37,7 @@ #define MAX_OPEN_FILES 11 #if !defined(PLUGIN) && !defined(CODEC) -#if (CONFIG_PLATFORM & PLATFORM_HOSTED) +#if (CONFIG_PLATFORM & PLATFORM_SDL) #define open(x, ...) sim_open(x, __VA_ARGS__) #define creat(x,m) sim_creat(x,m) #define remove(x) sim_remove(x) diff --git a/firmware/kernel.c b/firmware/kernel.c index 1499402f40..9d72a7eeda 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c @@ -213,7 +213,7 @@ void timeout_register(struct timeout *tmo, timeout_cb_type callback, /**************************************************************************** * Thread stuff ****************************************************************************/ -void sleep(int ticks) +unsigned sleep(unsigned ticks) { #if defined(CPU_PP) && defined(BOOTLOADER) unsigned stop = USEC_TIMER + ticks * (1000000/HZ); @@ -229,6 +229,7 @@ void sleep(int ticks) sleep_thread(ticks); switch_thread(); #endif + return 0; } void yield(void) diff --git a/firmware/target/hosted/android/dir-target.h b/firmware/target/hosted/android/dir-target.h new file mode 100644 index 0000000000..4516215d62 --- /dev/null +++ b/firmware/target/hosted/android/dir-target.h @@ -0,0 +1,37 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2010 by Thomas Martitz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#ifndef __DIR_TARGET_H__ +#define __DIR_TARGET_H__ + +#include + +#define opendir _opendir +#define mkdir _mkdir +#define closedir _closedir +#define readdir _readdir + +extern DIR* _opendir(const char* name); +extern int _mkdir(const char* name); +extern int _closedir(DIR* dir); +extern struct dirent *_readdir(DIR* dir); + +#endif /* __DIR_TARGET_H__ */ diff --git a/firmware/target/hosted/android/fs-android.c b/firmware/target/hosted/android/fs-android.c new file mode 100644 index 0000000000..5209458e54 --- /dev/null +++ b/firmware/target/hosted/android/fs-android.c @@ -0,0 +1,129 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2010 by Thomas Martitz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include +#include /* stat() */ +#include /* snprintf */ +#include /* size_t */ +#include +#include /* localtime() */ +#include "system-target.h" +#include "dir-target.h" +#include "file.h" +#include "dir.h" + + +long filesize(int fd) +{ + struct stat buf; + + if (!fstat(fd, &buf)) + return buf.st_size; + else + return -1; +} + +/* do we really need this in the app? */ +void fat_size(unsigned long* size, unsigned long* free) +{ + *size = *free = 0; +} + +#undef opendir +#undef closedir +#undef mkdir +#undef readdir + +/* need to wrap around DIR* because we need to save the parent's + * directory path in order to determine dirinfo */ +struct __dir { + DIR *dir; + char *path; +}; + +DIR* _opendir(const char *name) +{ + char *buf = malloc(sizeof(struct __dir) + strlen(name)+1); + if (!buf) + return NULL; + + struct __dir *this = (struct __dir*)buf; + + this->path = buf+sizeof(struct __dir); + /* definitely fits due to strlen() */ + strcpy(this->path, name); + + this->dir = opendir(name); + + if (!this->dir) + { + free(buf); + return NULL; + } + return (DIR*)this; +} + +int _mkdir(const char *name) +{ + return mkdir(name, 0777); +} + +int _closedir(DIR *dir) +{ + struct __dir *this = (struct __dir*)dir; + int ret = closedir(this->dir); + free(this); + return ret; +} + +struct dirent* _readdir(DIR* dir) +{ + struct __dir *d = (struct __dir*)dir; + return readdir(d->dir); +} + +struct dirinfo dir_get_info(struct DIR* _parent, struct dirent *dir) +{ + struct __dir *parent = (struct __dir*)_parent; + struct stat s; + struct tm *tm; + struct dirinfo ret; + char path[MAX_PATH]; + + snprintf(path, sizeof(path), "%s/%s", parent->path, dir->d_name); + stat(path, &s); + memset(&ret, 0, sizeof(ret)); + + if (S_ISDIR(s.st_mode)) + { + ret.attribute = ATTR_DIRECTORY; + } + + ret.size = s.st_size; + tm = localtime(&(s.st_mtime)); + ret.wrtdate = ((tm->tm_year - 80) << 9) | + ((tm->tm_mon + 1) << 5) | + tm->tm_mday; + ret.wrttime = (tm->tm_hour << 11) | + (tm->tm_min << 5) | + (tm->tm_sec >> 1); + return ret; +} diff --git a/firmware/target/hosted/android/lc-android.c b/firmware/target/hosted/android/lc-android.c new file mode 100644 index 0000000000..52ab08badb --- /dev/null +++ b/firmware/target/hosted/android/lc-android.c @@ -0,0 +1,40 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2010 by Thomas Martitz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include /* size_t */ +#include "load_code.h" + +/* the load_code wrappers simply wrap, nothing to do */ +void *lc_open(const char *filename, char *buf, size_t buf_size) +{ + return _lc_open(filename, buf, buf_size); +} + +void *lc_get_header(void *handle) +{ + return _lc_get_header(handle); +} + +void lc_close(void *handle) +{ + _lc_close(handle); +} + diff --git a/uisimulator/common/SOURCES b/uisimulator/common/SOURCES index a30b5abeb2..39f008b9dd 100644 --- a/uisimulator/common/SOURCES +++ b/uisimulator/common/SOURCES @@ -9,8 +9,10 @@ fmradio.c backlight-sim.c #endif +#if !(CONFIG_PLATFORM & PLATFORM_ANDROID) +io.c +#endif /* this is still needed for application since it has some stubs */ powermgmt-sim.c -io.c sim_tasks.c stubs.c diff --git a/uisimulator/common/io.c b/uisimulator/common/io.c index 6547421668..f630ae49c8 100644 --- a/uisimulator/common/io.c +++ b/uisimulator/common/io.c @@ -158,13 +158,18 @@ extern const char *sim_root_dir; static int num_openfiles = 0; -struct sim_dirent { - unsigned char d_name[MAX_PATH]; +/* from dir.h */ +struct dirinfo { int attribute; long size; + unsigned short wrtdate; + unsigned short wrttime; +}; + +struct sim_dirent { + unsigned char d_name[MAX_PATH]; + struct dirinfo info; long startcluster; - unsigned short wrtdate; /* Last write date */ - unsigned short wrttime; /* Last write time */ }; struct dirstruct { @@ -329,14 +334,14 @@ struct sim_dirent *sim_readdir(MYDIR *dir) #define ATTR_DIRECTORY 0x10 - secret.attribute = S_ISDIR(s.st_mode)?ATTR_DIRECTORY:0; - secret.size = s.st_size; + secret.info.attribute = S_ISDIR(s.st_mode)?ATTR_DIRECTORY:0; + secret.info.size = s.st_size; tm = localtime(&(s.st_mtime)); - secret.wrtdate = ((tm->tm_year - 80) << 9) | + secret.info.wrtdate = ((tm->tm_year - 80) << 9) | ((tm->tm_mon + 1) << 5) | tm->tm_mday; - secret.wrttime = (tm->tm_hour << 11) | + secret.info.wrttime = (tm->tm_hour << 11) | (tm->tm_min << 5) | (tm->tm_sec >> 1); return &secret;