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