+int pffs_open_write(t_pffs_fd *fd) {
+
+ int ret;
+
+ ret=pffs_find_file(fd->pffs,fd->file,
+ &(fd->iaddr),&(fd->daddr),&(fd->len));
+
+ switch(ret) {
+ case PFFS_FILE_NOT_FOUND:
+ ret=pffs_write_index_init();
+ if(ret!=PFFS_INDEX_WROTE_INIT)
+ break;
+ fd->dptr=fd->daddr;
+ fd->len=0;
+ fd->mode=PFFS_WRITE;
+ break;
+ case PFFS_FILE_FOUND:
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+int pffs_open(t_pffs *pffs,t_pffs_fd *fd,char *file,u8 mode) {
+
+ int ret;
+
+ /* the pffs struct */
+ fd->pffs=pffs;
+
+ /* filename */
+ fd->fn_size=strlen(file);
+ if(fd->fn_size&1)
+ fd->file[fd->fn_size++]='\0';
+ fd->fn_size>>1;
+ if(fd->fn_size>PFFS_MAX_FILENAME_SIZE)
+ return PFFS_FILENAME_TOO_LONG;
+ strncpy(fd->file,file,fd->fn_size+fd->fn_size);
+
+ /* clear fd mode */
+ fd->mode=0;
+
+ /* action */
+ switch(mode) {
+ case PFFS_READ:
+ ret=pffs_open_read(fd);
+ break;
+ case PFFS_WRITE:
+ ret=pffs_open_write(fd);
+ break;
+ case PFFS_RDWR:
+ default:
+ return PFFS_MODE_UNSUPPORTED;
+ }
+
+ return ret;
+}
+
+int pffs_read(t_pffs_fd *fd,u8 *buf,int len) {
+
+ int missing;
+ int sec_end;
+
+ /* check whether valid */
+ if(!(fd->mode&PFFS_READ))
+ return PFFS_EINVAL;
+
+ /* check len */
+ if(len&1)
+ return PFFS_INVALID_LEN;
+
+ /* check how much we read */
+ missing=fd->len-(fd->dptr-fd->daddr);
+ if(len>missing)
+ len=missing;
+
+ if((fd->dptr+len)>=pffs->sec_addr[pffs->sec_num_data[1]+1])
+ sec_end=pffs->sec_addr[pffs->sec_num_data[1]+1]-fd->dptr;
+
+
+ /* read */
+ fd->pffs->fr(fd->dptr,(u16 *)buf,len);
+ fd->dptr+=len;;
+
+ return len;
+}
+
+int pffs_write(t_pffs_fd *fd,u8 buf,int len) {
+
+ /* check whether valid */
+ if(!(fd->mode&PFFS_WRITE))
+ return PFFS_EINVAL;
+
+ /* check len */
+ if(len&1)
+ return PFFS_INVALID_LEN;
+
+ missing=PFFS_MAX_FILE_SIZE-fd->len;
+ if(len>missing)
+ len=missing;
+
+ /* check for */
+ if(fd->dptr+len>=pffs->)
+}
+