mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-11-05 02:55:07 +01:00
9e79c9d99b
* code cleanup
197 lines
4.9 KiB
C
197 lines
4.9 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <gccore.h>
|
|
#include <sys/dir.h>
|
|
#include <dirent.h>
|
|
#include <unistd.h>
|
|
|
|
#include "listfiles.h"
|
|
#include "libfat/fat.h"
|
|
|
|
|
|
static char alldirfiles[300][70];
|
|
char filenames[80];
|
|
|
|
bool findfile( const char * filename, const char * path )
|
|
{
|
|
DIR *dir;
|
|
struct dirent *file;
|
|
|
|
dir = opendir( path );
|
|
|
|
char temp[11];
|
|
while ( ( file = readdir( dir ) ) )
|
|
{
|
|
snprintf( temp, sizeof( temp ), "%s", file->d_name );
|
|
if ( !strncmpi( temp, filename, 11 ) )
|
|
{
|
|
closedir( dir );
|
|
return true;
|
|
}
|
|
}
|
|
closedir( dir );
|
|
return false;
|
|
}
|
|
|
|
bool subfoldercreate( const char * fullpath )
|
|
{
|
|
//check forsubfolders
|
|
char dir[300];
|
|
char * pch = NULL;
|
|
u32 len;
|
|
struct stat st;
|
|
|
|
strlcpy( dir, fullpath, sizeof( dir ) );
|
|
len = strlen( dir );
|
|
if ( len && len < sizeof( dir ) - 2 && dir[len-1] != '/' )
|
|
{
|
|
dir[len++] = '/';
|
|
dir[len] = '\0';
|
|
}
|
|
if ( stat( dir, &st ) != 0 ) // fullpath not exist?
|
|
{
|
|
while ( len && dir[len-1] == '/' )
|
|
dir[--len] = '\0'; // remove all trailing /
|
|
pch = strrchr( dir, '/' );
|
|
if ( pch == NULL ) return false;
|
|
*pch = '\0';
|
|
if ( subfoldercreate( dir ) )
|
|
{
|
|
*pch = '/';
|
|
if ( mkdir( dir, 0777 ) == -1 )
|
|
return false;
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
bool subfolderremove( const char * fullpath, const char*fp )
|
|
{
|
|
struct stat st;
|
|
if ( stat( fullpath, &st ) != 0 ) // fullpath not exist?
|
|
return false;
|
|
if ( S_ISDIR( st.st_mode ) )
|
|
{
|
|
DIR_ITER *dir = NULL;
|
|
char filename[256];
|
|
bool cont = true;
|
|
while ( cont )
|
|
{
|
|
cont = false;
|
|
dir = diropen( fullpath );
|
|
if ( dir )
|
|
{
|
|
char* bind = fullpath[strlen( fullpath )-1] == '/' ? "" : "/";
|
|
while ( dirnext( dir, filename, &st ) == 0 )
|
|
{
|
|
if ( strcmp( filename, "." ) != 0 && strcmp( filename, ".." ) != 0 )
|
|
{
|
|
char currentname[256];
|
|
if ( S_ISDIR( st.st_mode ) )
|
|
snprintf( currentname, sizeof( currentname ), "%s%s%s/", fullpath, bind, filename );
|
|
else
|
|
snprintf( currentname, sizeof( currentname ), "%s%s%s", fullpath, bind, filename );
|
|
subfolderremove( currentname, fp );
|
|
cont = true;
|
|
break;
|
|
}
|
|
}
|
|
dirclose( dir );
|
|
}
|
|
}
|
|
}
|
|
return unlink( fullpath ) == 0;
|
|
}
|
|
char * GetFileName( int i )
|
|
{
|
|
return alldirfiles[i];
|
|
}
|
|
|
|
s32 filenamescmp( const void *a, const void *b )
|
|
{
|
|
/* Compare strings */
|
|
return stricmp( ( char * )a, ( char * )b );
|
|
}
|
|
|
|
int GetAllDirFiles( char * filespath )
|
|
{
|
|
int countfiles = 0;
|
|
|
|
struct stat st;
|
|
DIR_ITER* dir;
|
|
dir = diropen ( filespath );
|
|
|
|
if ( dir == NULL ) //If empty
|
|
return 0;
|
|
while ( dirnext( dir, filenames, &st ) == 0 )
|
|
{
|
|
if ( ( st.st_mode & S_IFDIR ) == 0 )
|
|
{
|
|
// st.st_mode & S_IFDIR indicates a directory
|
|
snprintf( alldirfiles[countfiles], 70, "%s", filenames );
|
|
countfiles++;
|
|
}
|
|
}
|
|
dirclose( dir );
|
|
qsort( alldirfiles, countfiles, sizeof( char[70] ), filenamescmp );
|
|
return countfiles;
|
|
}
|
|
|
|
bool checkfile( char * path )
|
|
{
|
|
FILE * f;
|
|
f = fopen( path, "r" );
|
|
if ( f )
|
|
{
|
|
fclose( f );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool SearchFile( const char * searchpath, const char * searched_filename, char * outfilepath )
|
|
{
|
|
struct stat st;
|
|
DIR_ITER *dir = NULL;
|
|
bool result = false;
|
|
|
|
char filename[1024];
|
|
char pathptr[strlen( searchpath )+1];
|
|
snprintf( pathptr, sizeof( pathptr ), "%s", searchpath );
|
|
|
|
if ( pathptr[strlen( pathptr )-1] == '/' )
|
|
{
|
|
pathptr[strlen( pathptr )-1] = '\0';
|
|
}
|
|
|
|
dir = diropen( pathptr );
|
|
if ( !dir )
|
|
return false;
|
|
|
|
while ( dirnext( dir, filename, &st ) == 0 && result == false )
|
|
{
|
|
if ( strcasecmp( filename, searched_filename ) == 0 )
|
|
{
|
|
if ( outfilepath )
|
|
{
|
|
sprintf( outfilepath, "%s/%s", pathptr, filename );
|
|
}
|
|
result = true;
|
|
}
|
|
else if ( ( st.st_mode & S_IFDIR ) != 0 )
|
|
{
|
|
if ( strcmp( filename, "." ) != 0 && strcmp( filename, ".." ) != 0 )
|
|
{
|
|
char newpath[1024];
|
|
snprintf( newpath, sizeof( newpath ), "%s/%s", pathptr, filename );
|
|
result = SearchFile( newpath, searched_filename, outfilepath );
|
|
}
|
|
}
|
|
}
|
|
dirclose( dir );
|
|
|
|
return result;
|
|
}
|