217 lines
6.4 KiB
C
217 lines
6.4 KiB
C
|
|
||
|
#include "tftpd.h"
|
||
|
|
||
|
char StartDirectory[500] = "";
|
||
|
int StartDirectoryLen = 0;
|
||
|
|
||
|
// shell patterns.
|
||
|
|
||
|
char ValidClients[ 50] = "*"; // eg. 157.*.55?.0*
|
||
|
char ValidMasters[ 50] = "*"; // eg. 157.*.55?.0*
|
||
|
char ValidReadFiles[ 50] = "*"; // eg. r*.txt
|
||
|
char ValidWriteFiles[50] = "*"; // eg. w*.txt
|
||
|
|
||
|
// ========================================================================
|
||
|
// Read constants from TFTPD_REGKEY in registry.
|
||
|
// returns number of keys read.
|
||
|
//
|
||
|
|
||
|
int
|
||
|
ReadRegistryValues( void )
|
||
|
{
|
||
|
int dwErrcode;
|
||
|
int ok = 0;
|
||
|
|
||
|
HKEY tkey;
|
||
|
DWORD dwType, dwValueSize;
|
||
|
|
||
|
dwErrcode = RegOpenKeyEx( HKEY_LOCAL_MACHINE, TFTPD_REGKEY,
|
||
|
0, KEY_ALL_ACCESS, &tkey );
|
||
|
|
||
|
if ( dwErrcode != ERROR_SUCCESS )
|
||
|
{
|
||
|
DbgPrint("RegOpenKeyEx %s failed, err=%d\n", TFTPD_REGKEY,
|
||
|
GetLastError() );
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// =====================================================================
|
||
|
|
||
|
if( StartDirectory[0] == '\0' ){
|
||
|
|
||
|
dwValueSize = sizeof( StartDirectory );
|
||
|
|
||
|
dwErrcode = RegQueryValueEx( tkey,
|
||
|
TFTPD_REGKEY_DIR,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)&StartDirectory[0],
|
||
|
&dwValueSize );
|
||
|
|
||
|
if( dwErrcode != ERROR_SUCCESS ){
|
||
|
DbgPrint("RegQueryValueEx %s failed, err=%d\n", TFTPD_REGKEY_DIR,
|
||
|
GetLastError() );
|
||
|
}else if( dwType == REG_SZ ){
|
||
|
DbgPrint("ReadRegistryValues: %s=%s\n",
|
||
|
TFTPD_REGKEY_DIR, StartDirectory );
|
||
|
ok++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// =====================================================================
|
||
|
|
||
|
dwValueSize = sizeof( ValidClients );
|
||
|
|
||
|
dwErrcode = RegQueryValueEx( tkey,
|
||
|
TFTPD_REGKEY_CLIENTS,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)&ValidClients[0],
|
||
|
&dwValueSize );
|
||
|
|
||
|
if( dwErrcode != ERROR_SUCCESS ){
|
||
|
DbgPrint("RegQueryValueEx %s failed, err=%d\n",
|
||
|
TFTPD_REGKEY_CLIENTS,
|
||
|
GetLastError() );
|
||
|
}else if( dwType == REG_SZ ){
|
||
|
DbgPrint("ReadRegistryValues: %s=%s\n",
|
||
|
TFTPD_REGKEY_CLIENTS, ValidClients );
|
||
|
ok++;
|
||
|
}
|
||
|
|
||
|
// =====================================================================
|
||
|
|
||
|
dwValueSize = sizeof( ValidMasters );
|
||
|
|
||
|
dwErrcode = RegQueryValueEx( tkey,
|
||
|
TFTPD_REGKEY_MASTERS,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)&ValidMasters[0],
|
||
|
&dwValueSize );
|
||
|
|
||
|
if( dwErrcode != ERROR_SUCCESS ){
|
||
|
DbgPrint("RegQueryValueEx %s failed, err=%d\n",
|
||
|
TFTPD_REGKEY_MASTERS,
|
||
|
GetLastError() );
|
||
|
}else if( dwType == REG_SZ ){
|
||
|
DbgPrint("ReadRegistryValues: %s=%s\n",
|
||
|
TFTPD_REGKEY_MASTERS, ValidMasters );
|
||
|
ok++;
|
||
|
}
|
||
|
|
||
|
// =====================================================================
|
||
|
|
||
|
dwValueSize = sizeof( ValidReadFiles );
|
||
|
|
||
|
dwErrcode = RegQueryValueEx( tkey,
|
||
|
TFTPD_REGKEY_READABLE,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)&ValidReadFiles[0],
|
||
|
&dwValueSize );
|
||
|
|
||
|
if( dwErrcode != ERROR_SUCCESS ){
|
||
|
DbgPrint("RegQueryValueEx %s failed, err=%d\n",
|
||
|
TFTPD_REGKEY_READABLE,
|
||
|
GetLastError() );
|
||
|
}else if( dwType == REG_SZ ){
|
||
|
DbgPrint("ReadRegistryValues: %s=%s\n",
|
||
|
TFTPD_REGKEY_READABLE, ValidReadFiles );
|
||
|
ok++;
|
||
|
}
|
||
|
|
||
|
// =====================================================================
|
||
|
|
||
|
dwValueSize = sizeof( ValidWriteFiles );
|
||
|
|
||
|
dwErrcode = RegQueryValueEx( tkey,
|
||
|
TFTPD_REGKEY_WRITEABLE,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)&ValidWriteFiles[0],
|
||
|
&dwValueSize );
|
||
|
|
||
|
if( dwErrcode != ERROR_SUCCESS ){
|
||
|
DbgPrint("RegQueryValueEx %s failed, err=%d\n",
|
||
|
TFTPD_REGKEY_WRITEABLE,
|
||
|
GetLastError() );
|
||
|
}else if( dwType == REG_SZ ){
|
||
|
DbgPrint("ReadRegistryValues: %s=%s\n",
|
||
|
TFTPD_REGKEY_WRITEABLE, ValidWriteFiles );
|
||
|
ok++;
|
||
|
}
|
||
|
|
||
|
// =====================================================================
|
||
|
|
||
|
RegCloseKey( tkey );
|
||
|
|
||
|
return ok;
|
||
|
}
|
||
|
|
||
|
// ========================================================================
|
||
|
//
|
||
|
//
|
||
|
|
||
|
int
|
||
|
Set_StartDirectory( void )
|
||
|
{
|
||
|
char ExpandedDir[500];
|
||
|
DWORD ExpandedDirLen=0;
|
||
|
|
||
|
if( StartDirectory[0] == '\0' ){
|
||
|
strncpy( StartDirectory, TFTPD_DEFAULT_DIR,
|
||
|
sizeof( StartDirectory ));
|
||
|
}
|
||
|
|
||
|
ExpandedDirLen=ExpandEnvironmentStrings( StartDirectory,ExpandedDir,500);
|
||
|
|
||
|
if (ExpandedDirLen == 0) {
|
||
|
return ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
|
||
|
memcpy(StartDirectory,ExpandedDir,ExpandedDirLen);
|
||
|
|
||
|
//
|
||
|
// Set the (one time) length and trailing slash.
|
||
|
//
|
||
|
|
||
|
StartDirectoryLen = strlen( StartDirectory );
|
||
|
|
||
|
|
||
|
if( StartDirectory[ StartDirectoryLen-1 ] == '/' )
|
||
|
StartDirectory[ StartDirectoryLen-1 ] = '\\';
|
||
|
|
||
|
if( StartDirectory[ StartDirectoryLen-1 ] != '\\' &&
|
||
|
StartDirectoryLen < sizeof( StartDirectory )
|
||
|
){
|
||
|
strcat( StartDirectory, "\\" );
|
||
|
}
|
||
|
|
||
|
StartDirectoryLen = strlen( StartDirectory );
|
||
|
|
||
|
assert( 0 < StartDirectoryLen );
|
||
|
assert( StartDirectoryLen < sizeof( StartDirectory ) );
|
||
|
assert( StartDirectory[ StartDirectoryLen - 1 ] == '\\' );
|
||
|
assert( StartDirectory[ StartDirectoryLen ] == '\0' );
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
// ========================================================================
|
||
|
// From C FAQ.
|
||
|
// * matches one or more chars, eg. match( "a*b", "a..b" ).
|
||
|
// ? matches exactly one char, eg. match( "a?b", "a.b" ).
|
||
|
|
||
|
int match( const char * p, const char * s )
|
||
|
{
|
||
|
switch( *p ){
|
||
|
case '\0' : return ! *s ;
|
||
|
case '*' : return match( p+1, s ) || *s && match( p, s+1 );
|
||
|
case '?' : return *s && match( p+1, s+1 );
|
||
|
default : return *p == *s && match( p+1, s+1 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ========================================================================
|