bool fs_getFPath( iu16 fid, S_FPATH *fp, S_FSTREAM *fs, S_FINFO *fi ) { S_FINFO fitmp; S_FSTREAM fstmp; if( fid==0xFFFF ) { sw_set( SW_WRONG_DATA ); return FALSE; } fp->df=selected.df; fp->ef=fid; if( !fs_getData( fp, &fstmp, &fitmp ) ) { fp->df=fid; fp->ef=0xFFFF; if( !fs_getData( fp, &fstmp, &fitmp ) ) { sw_set( SW_FILE_NOT_FOUND ); return FALSE; } } if( fp->df==0x3F00 ) fp->df=0xFFFF; if( fs!=NULL ) memcpy( fs, &fstmp, sizeof(fstmp) ); if( fi!=NULL ) memcpy( fi, &fitmp, sizeof(fitmp) ); return TRUE; }
void cmd_create( void ) { S_FSTREAM fs; S_FINFO fi; if( !t0_testP3( sizeof(S_FINFO) ) ) return; if( !t0_testP1P2( 0x0000 ) ) return; /* Get DF data */ if( !fs_getData( &selected, &fs, &fi ) ) return; /* Correct DF type? */ if( fi.type!=FS_TYPE_DF ) { sw_set( SW_NOT_ALLOWED ); return; } /* Correct permissions? */ if( !auth_checkAc( (fi.ac[0]>>4)&0x0F ) ) return; /* ACK */ t0_sendAck(); /* Receive */ t0_recBlock( (iu8 *)&fi, sizeof(S_FINFO) ); hton_us( &fi.size, 1 ); hton_us( &fi.fid, 1 ); if( !fs_create( &fi ) ) return; sw_set( SW_OK ); }
void fs_copy(int id, char* newName) { int* data; INode* node; if (FS_DEBUG) { lightLine(); printf("fs_copy(%id, %s)\n", id, newName); lightLine(); } node = list_peekNode(iNodes, (void*)id, inode_compareById); data = fs_getData(node->id); fs_addFile(newName, node->fileSize, node->processes, node->processStart, node->processSize, data); free(data); }
void cmd_updateBinary( void ) { S_FSTREAM fs; S_FINFO fi; iu16 i; iu8 b; if( t0_testP3( 0x00 ) ) { sw_set( SW_WRONG_LEN ); return; } /* Get file data */ if( !fs_getData( &selected, &fs, &fi ) ) return; /* Correct file type? */ if( fi.type!=FS_TYPE_EF ) { sw_set( SW_NOT_ALLOWED ); return; } /* Correct permissions? */ if( !auth_checkAc( (fi.ac[0]>>4)&0x0F ) ) return; /* Test file size */ fs.pos=((iu16)header[2]<<8)|header[3]; if(fs.pos>fs.size) { sw_set( SW_WRONG_REFERENCE ); return; } if( !fstream_test( &fs, header[4] ) ) return; /* Receive */ for( i=0; i<header[4]; i++ ) { /* ~ACK */ t0_sendCAck(); /* Data */ b = hal_io_recByteT0(); if( !fstream_write( &fs, &b, 1 ) ) return; } sw_set( SW_OK ); }
void cmd_readBinary( void ) { S_FSTREAM fs; S_FINFO fi; iu16 i, max=header[4]; iu8 b; /* Get file data */ if( !fs_getData( &selected, &fs, &fi ) ) return; /* Correct file type? */ if( fi.type!=FS_TYPE_EF ) { sw_set( SW_NOT_ALLOWED ); return; } /* Correct permissions? */ if( !auth_checkAc( fi.ac[0]&0x0F ) ) return; if( !max ) max=256; /* Test file size */ fs.pos=((iu16)header[2]<<8)|header[3]; if(fs.pos>fs.size) { sw_set( SW_WRONG_REFERENCE ); return; } if( !fstream_test( &fs, max ) ) return; /* ACK */ t0_sendAck(); for( i=0; i<max; i++ ) { if( !fstream_read( &fs, &b, 1 ) ) return; /* Data */ hal_io_sendByteT0( b ); } sw_set( SW_OK ); }
void cmd_delete( void ) { S_FSTREAM fs; S_FINFO fi; iu16 fid; iu8 b; if( !t0_testP3( sizeof(iu16) ) ) return; if( !t0_testP1P2( 0x0000 ) ) return; /* Get DF data */ if( !fs_getData( &selected, &fs, &fi ) ) return; /* Correct DF type? */ if( fi.type!=FS_TYPE_DF ) { sw_set( SW_NOT_ALLOWED ); return; } /* Correct permissions? */ if( !auth_checkAc( fi.ac[0]&0x0F ) ) return; /* ACK */ t0_sendAck(); /* Data */ b = hal_io_recByteT0(); fid=b<<8; b = hal_io_recByteT0(); fid+=b; if( !fs_delete( fid ) ) return; sw_set( SW_OK ); }
bool fs_create( S_FINFO *fi ) { S_FPATH fp; S_FSTREAM fs; S_FINFO fitmp; iu8 size, dfend; if( fi->fid==0x3F00 ) { sw_set( SW_FILE_EXISTS ); return FALSE; } if( (!fi->size) || (fi->size>0x7FFF) || (fi->fid==0xFFFF) || ((fi->type!=FS_TYPE_DF) && (fi->type!=FS_TYPE_EF)) ) { sw_set( SW_WRONG_DATA ); return FALSE; } if( selected.ef!=0xFFFF ) { selected.ef=0xFFFF; } if( (fi->type==FS_TYPE_DF) && (selected.df!=0xFFFF) ) { sw_set( SW_WRONG_DATA ); return FALSE; } /* Get end of DF */ memcpy( &fp, &selected, sizeof(selected) ); if( !fs_getData( &fp, &fs, &fitmp ) ) return FALSE; dfend = fs.start+fs.size; /* Look if file exists already */ if( fi->type==FS_TYPE_DF ) fp.df=fi->fid; else fp.ef=fi->fid; if( fs_getData( &fp, &fs, &fitmp ) ) { sw_set( SW_FILE_EXISTS ); return FALSE; } /* Begin with MF */ fs.start=fsstart+FS_HEADER_SIZE; fs.size=fssize; fs.pos=0; if( selected.df!=0xFFFF ) { if( !fs_seek( selected.df, &fs, &fitmp, FS_TYPE_DF ) ) return FALSE; } /* Seek to free data */ if( !fs_seekEnd( &fs ) ) return FALSE; if( (fs.pos+FS_HEADER_SIZE+fi->size+sizeof(iu16))>fs.size ) { sw_set( SW_FILE_TO_SHORT ); return FALSE; } /* Set fs to file dimensions. */ fs.start+=fs.pos; fs.size=FS_HEADER_SIZE+fi->size+sizeof(iu16); fs.pos=sizeof(iu16); /* Clear all */ memset( &fitmp, 0, sizeof(fitmp) ); while( fs.pos<fs.size ) { size=(fs.size-fs.pos)<sizeof(fitmp) ? fs.size-fs.pos : sizeof(fitmp); if( !fstream_write( &fs, (iu8*)&fitmp, size ) ) return FALSE; } /* Write file header */ #if CONF_WITH_TRANSACTIONS==1 if( !( ta_setdata( (iu8*)fi, sizeof(S_FINFO), fs.start ) && ta_commit() ) ) return FALSE; #else /* !CONF_WITH_TRANSACTIONS==1 */ fs.pos=0; if( !fstream_write( &fs, (iu8*)fi, sizeof(S_FINFO) ) ) return FALSE; #endif /* !CONF_WITH_TRANSACTIONS==1 */ return TRUE; }
bool fs_delete( iu16 fid ) { S_FPATH fp; S_FSTREAM fs; S_FINFO fi; iu16 size, dfend; if( (selected.ef!=0xFFFF) || (fid==0xFFFF) ) { sw_set( SW_NOT_ALLOWED ); return FALSE; } /* Get end of DF */ memcpy( &fp, &selected, sizeof(selected) ); if( !fs_getData( &fp, &fs, &fi ) ) return FALSE; dfend = fs.start+fs.size; fp.ef=fid; if( !fs_getData( &fp, &fs, &fi ) ) { /* Because we have only one DF layer, the file must be a EF, when we are already in a DF. */ if( fp.df!=0xFFFF ) return FALSE; /* Look for DF */ fp.df=fid; fp.ef=0xFFFF; if( !fs_getData( &fp, &fs, &fi ) ) return FALSE; } /* Less then 6 bytes empty after file? Then this must be the last file. */ if( fs.start+fs.size+FS_HEADER_SIZE<=dfend ) { fs.pos=fs.size; fs.size+=sizeof(iu16); if( !fstream_read( &fs, (iu8 *)&size, sizeof(iu16) ) ) return FALSE; fs.size-=sizeof(iu16); if( size ) { sw_set( SW_INCOMPATIBLE_FILE ); return FALSE; } } fs.pos=0; /* Clear content */ memset( &fi, 0xFF, sizeof(fi) ); while( fs.pos<fs.size ) { size=(fs.size-fs.pos)<sizeof(fi) ? fs.size-fs.pos : sizeof(fi); if( !fstream_write( &fs, (iu8*)&fi, size ) ) return FALSE; } /* file header */ #if CONF_WITH_TRANSACTIONS==1 fs.start-=FS_HEADER_SIZE; fi.size=0; if( !( ta_setdata( (iu8*)&fi, sizeof(S_FINFO), fs.start ) && ta_commit() ) ) return FALSE; #else /* !CONF_WITH_TRANSACTIONS==1 */ fs.start-=FS_HEADER_SIZE; fi.size=0; fs.pos=0; if( !fstream_write( &fs, (iu8 *)&fi, sizeof(S_FINFO) ) ) return FALSE; #endif /* !CONF_WITH_TRANSACTIONS==1 */ return TRUE; }