#include #include #include #include #define INVALID_FILE 0 #define PACKFILENAME "rott.sav" #include "vmuheader.h" char *get_savepath(void) { static char savedir[]="/vmu/a1"; int port,unit; uint8 addr; addr = maple_first_vmu(); if (addr==0) return NULL; maple_raddr(addr,&port,&unit); savedir[5] = 'a' + port; savedir[6] = '0' + unit; // return "/pc/prog/cd/rott"; return savedir; } int pack_files(void) { file_t dir; dirent_t *ent; file_t fd; gzFile f; char path[256]; char packfile[256]; char *p = get_savepath(); if (p==NULL) return -1; sprintf(packfile,"%s/%s",p,PACKFILENAME); dir = fs_open("/ram",O_DIR|O_RDONLY); if (dir==0) { return -1; } fd = fs_open(packfile,O_WRONLY); if (fd==INVALID_FILE) { fs_close(dir); return -1; } fs_write(fd,&vmuheader,sizeof(vmuheader)); f = gzdopen(fd,"wb"); strcpy(path,"/ram/"); while((ent = fs_readdir(dir))!=0) { file_t fd; size_t size; void *buf; printf("%s:%d\n",ent->name,ent->size); if (stricmp(ent->name,"tmpsong.mid")==0) continue; strcpy(path+5,ent->name); fd = fs_open(path,O_RDONLY); buf = fs_mmap(fd); gzwrite(f,ent->name,strlen(ent->name)+1); gzwrite(f,&ent->size,sizeof(size_t)); gzwrite(f,buf,ent->size); fs_close(fd); } gzputc(f,0); gzclose(f); fs_close(dir); return 0; } int unpack_files(void) { file_t fd; gzFile f; char path[256]; char packfile[256]; char *p = get_savepath(); if (p==NULL) return -1; sprintf(packfile,"%s/%s",p,PACKFILENAME); fd = fs_open(packfile,O_RDONLY); if (fd==INVALID_FILE) { return -1; } fs_seek(fd,sizeof(vmuheader),SEEK_SET); f = gzdopen(fd,"rb"); strcpy(path,"/ram/"); while(1) { void *buf; char *filename = path+5; int i; size_t size; int fd; for(i=0;(filename[i]=gzgetc(f))!=0;i++) ; if (i==0) break; gzread(f,&size,sizeof(size)); printf("%s:%d\n",filename,size); buf = malloc(size); gzread(f,buf,size); fd = fs_open(path,O_WRONLY); fs_write(fd,buf,size); fs_close(fd); free(buf); } gzclose(f); return 0; }