Ejemplo n.º 1
0
Archivo: fs.c Proyecto: 12019/SOSSE
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;
}
Ejemplo n.º 2
0
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 );
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
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 );
}
Ejemplo n.º 5
0
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 );
}
Ejemplo n.º 6
0
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 );
}
Ejemplo n.º 7
0
Archivo: fs.c Proyecto: 12019/SOSSE
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;
}
Ejemplo n.º 8
0
Archivo: fs.c Proyecto: 12019/SOSSE
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;
}