//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; }
//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); }
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 ); } } } } } } }