Ejemplo n.º 1
0
//Returns 0 on succses.
//Returns size of file if non-empty
//If positive, populates mfi.
//Returns -1 if can't find file or reached end of file list.
int8_t MFSOpenFile( const char * fname, struct MFSFileInfo * mfi )
{
	if( mfs_at == 0 )
	{
		FindMPFS();
	}
	if( mfs_at == 0 )
	{
		return -1;
	}

	EnterCritical();
	flashchip->chip_size = 0x01000000;
	uint32 ptr = mfs_at;
	struct MFSFileEntry e;
	while(1)
	{
		spi_flash_read( ptr, (uint32*)&e, sizeof( e ) );		
		ptr += sizeof(e);
		if( e.name[0] == 0xff || ets_strlen( e.name ) == 0 ) break;

		if( ets_strcmp( e.name, fname ) == 0 )
		{
			mfi->offset = e.start;
			mfi->filelen = e.len;
			flashchip->chip_size = 0x00080000;
			ExitCritical();
			return 0;
		}
	}
	flashchip->chip_size = 0x00080000;
	ExitCritical();
	return -1;
}
Ejemplo n.º 2
0
//Returns 0 on succses.
//Returns size of file if non-empty
//If positive, populates mfi.
//Returns -1 if can't find file or reached end of file list.
int8_t MFSOpenFile( const char * fname, struct MFSFileInfo * mfi )
{
	flashchip->chip_size = 0x01000000;
	uint32 ptr = MFS_START;
	struct MFSFileEntry e;
	while(1)
	{
		spi_flash_read( ptr, (uint32*)&e, sizeof( e ) );		
		ptr += sizeof(e);
		if( e.name[0] == 0xff || ets_strlen( e.name ) == 0 ) break;

		if( ets_strcmp( e.name, fname ) == 0 )
		{
			mfi->offset = e.start;
			mfi->filelen = e.len;
			flashchip->chip_size = 0x00080000;
			return 0;
		}
	}
	flashchip->chip_size = 0x00080000;
	return -1;
}
int strcmp(const char *s1, const char *s2) {
    return ets_strcmp(s1, s2);
}
Ejemplo n.º 4
0
static void ICACHE_FLASH_ATTR got_mdns_packet(void *arg, char *pusrdata, unsigned short len)
{
	int i, j, stlen;
	char path[MAX_MDNS_PATH];

	uint16_t * psr = (uint16_t*)pusrdata;
	uint16_t xactionid = HTONS( psr[0] );
	uint16_t flags = HTONS( psr[1] );
	uint16_t questions = HTONS( psr[2] );
	uint16_t answers = HTONS( psr[3] );

	uint8_t * dataptr = (uint8_t*)pusrdata + 12;
	uint8_t * dataend = dataptr + len;

	if( flags & 0x8000 )
	{
		//Response

		//Unused; MDNS does not fit the browse model we want to use.
	}
	else
	{
		//Query
		for( i = 0; i < questions; i++ )
		{
			uint8_t * namestartptr = dataptr;
			//Work our way through.
			dataptr = ParseMDNSPath( dataptr, path, &stlen );

			if( dataend - dataptr < 10 ) return;

			if( !dataptr )
			{
				return;
			}

			int pathlen = ets_strlen( path );
			if( pathlen < 6 )
			{
				continue;
			}
			if( strcmp( path + pathlen - 6, ".local" ) != 0 )
			{
				continue;
			}
			uint16_t record_type = ( dataptr[0] << 8 ) | dataptr[1];
			uint16_t record_class = ( dataptr[2] << 8 ) | dataptr[3];

			const char * path_first_dot = path;
			const char * cpp = path;
			while( *cpp && *cpp != '.' ) cpp++;
			int dotlen = 0;
			if( *cpp == '.' )
			{
				path_first_dot = cpp+1;
				dotlen = path_first_dot - path - 1;
			}
			else 
				path_first_dot = 0;

			int found = 0;
			for( i = 0; i < MAX_MDNS_NAMES; i++ )
			{
				//Handle [hostname].local, or [hostname].[service].local
				if( MDNSNames[i] && dotlen && ets_strncmp( MDNSNames[i], path, dotlen ) == 0 && dotlen == ets_strlen( MDNSNames[i] )) 
				{
					found = 1;
					if( record_type == 0x0001 ) //A Name Lookup.
						SendOurARecord( namestartptr, xactionid, stlen );
					else
						SendSpecificService( i, namestartptr, xactionid, stlen, 1 );
				}
			}
	
			if( !found ) //Not a specific entry lookup...
			{
				//Is this a browse?
				if( ets_strcmp( path, "_services._dns-sd._udp.local" ) == 0 )
				{
					SendAvailableServices( namestartptr, xactionid, stlen );
				}
				else
				{
					//A specific service?
					for( i = 0; i < MAX_MDNS_SERVICES; i++ )
					{
						const char * srv = MDNSServices[i];
						if( !srv ) continue;
						int sl = ets_strlen( srv );
						if( strncmp( path, srv, sl ) == 0 )
						{
							SendSpecificService( i, namestartptr, xactionid, stlen, 0 );
						}
					}
				}
			}
		}
	}
}