#include #include #include #include #include #include #include #include "proboard.hpp" #include "fossil.hpp" void logentry( char *data ) { LOG("%s",data); } static void near dolog( int level, char *str ) { if ( ( ! io.baud && ! cfg.loglocal ) || user.logLevel < level ) { return; } Date date( TODAY ); Time time( NOW ); File fp( "PROBOARD.LOG", fmode_write | fmode_text | fmode_copen | fmode_append ); fp.seek( fp.len() ); fp.printf( "%02d-%s-%02d %02d:%02d:%02d %s\n", date[ 0 ], months_short[ date[ 1 ] ], date[ 2 ] % 100, // Y2K FIXED! // date[ 2 ], // Y2K BUG! time[ 0 ], time[ 1 ], time[ 2 ], str ); } void LOG( char *str ... ) { char s[ 200 ]; va_list va; va_start( va, str ); vsprintf( s, str, va ); dolog( 0, s ); } void LOG( int level, char *str ... ) { char s[ 200 ]; va_list va; va_start( va, str ); vsprintf( s, str, va ); dolog( level, s ); } void fatalerror( char *s ) { String str( "Fatal error: " ); str << s; LOG( "%s", (char *) str ); if ( io.baud > 0 ) { io << "\n\n" << S_FATAL_ERROR; } else { SCREEN << "\f\n\n" << str << '\n'; } fatal = TRUE; exit( ERRLVL_FATALERR ); } //---------------------- // reset=-1 -> increment //---------------------- int linecounter( int reset ) { static int linecount = 0; static bool continuous = FALSE; if ( reset >= 0 ) { linecount = reset; continuous = FALSE; return 0; } if ( ++linecount >= ( ( /* rip_mode ? rip_screenlines: */ user.screenLength ) - 1 ) && !continuous && pause_mode ) { char rep; if ( io.more_func ) { rep = char( ( *io.more_func ) () ); } else { byte oldcolor = SCREEN.attrib(); // if ( rip_mode ) // { // rip_show_more(); // // io.show_remote = FALSE; // } io << S_MORE; int prompt_len = strlen( S_MORE ); rep = wait_language_hotkeys( K_MORE ); io << '\r' << String( ' ', prompt_len ) << '\r'; io.fullcolor( oldcolor ); io.show_remote = TRUE; // if ( rip_mode ) // { // rip_clear_status(); // rip_show_enter(); // } } if ( rep == '\r' ) { rep = 0; } if ( rep == 2 ) { continuous = TRUE; rep = 0; } linecount = 0; return rep; } return 0; } int check_access( unsigned level, AccessFlags flags ) { if ( user.level < level ) { return 0; } for ( int i = 1; i <= 32; i++ ) { if ( flags.getflag( i ) ) { if ( ! user.aFlags.getflag( i ) ) { return 0; } } } return 1; } int check_access( unsigned level, AccessFlags flags, AccessFlags notflags ) { if ( user.level < level ) { return 0; } for ( int i = 1; i <= 32; i++ ) { if ( flags.getflag( i ) ) { if ( ! user.aFlags.getflag( i ) ) { return 0; } } } for ( i = 1; i <= 32; i++ ) { if ( notflags.getflag( i ) ) { if ( user.aFlags.getflag( i ) ) { return 0; } } } return 1; } char *strstrl( char *s, char *f ) { int lf = strlen( f ); int l = strlen( s ) - lf + 1; for ( int i = 0; i < l; i++ ) { if ( ! memicmp( & s[ i ], f, lf ) ) { return & s[ i ]; } } return NULL; } int matchstring( char *s, char *d ) { for ( ; *s && *d; s++, d++ ) { switch ( *s ) { case '?': continue; case '*': return 1; default: if ( toupper( *s ) != toupper( *d ) ) { return 0; } } } if ( toupper( *s ) != toupper( *d ) && *s!='*') { return 0; } else { return 1; } } int matchfile( char *search, char *file ) { String sbody; String sext; String fbody; String fext; while ( *search != '.' && *search ) { sbody << *search++; } if ( ! *search++ ) { return 0; } while ( *search ) { sext << *search++; } while ( *file != '.' && *file ) { fbody << *file++; } if ( ! *file++ ) { return 0; } while ( *file ) { fext << *file++; } if ( matchstring( sbody, fbody ) && matchstring( sext, fext ) ) { return 1; } return 0; } void strip_path( char *s ) { int l = strlen( s ); for ( int i = l - 1; i >= 0; i-- ) { if ( s[ i ] == '\\' || s[ i ] == '/' ) { break; } } if ( i >= 0 ) { memmove( s, & s[ i + 1 ], l - i ); } } void strip_fname( char *s ) { int l = strlen( s ); for ( int i = l - 1; i >= 0; i-- ) { if ( s[ i ] == '\\' || s[ i ] == '/' ) { s[ i + 1 ] = '\0'; break; } } } int parse_data( char *s, String *param ) { for ( int i = 0; ; i++ ) { int inquote = 0; while ( *s == ' ' && *s ) { s++; } if ( *s == '\0' ) { break; } param[ i ].clear(); while ( *s ) { if ( *s == ' ' && ! inquote ) { break; } if ( *s == '\"' ) { inquote = ! inquote; s++; continue; } param[ i ] << ( *s++ ); } } return i; } void adjust_limits() { long kbgranted; int i; int j; for ( i = 0; i < num_limits - 1; i++ ) { for ( j = i + 1; j < num_limits; j++ ) { if ( limit[ i ].level < limit[ j ].level ) { limits temp; temp = limit[ i ]; limit[ i ] = limit[ j ]; limit[ j ] = temp; } } } for ( int n = -1; ; ) { for ( i = num_limits - 1; i >= 0; i-- ) { if ( user.level >= limit[ i ].level ) { n = i; } } if ( n < 0 ) { return; } if ( limit[ n ].max_download && user.kbDownloaded > limit[ n ].max_download ) { if ( user.level != limit[ n ].fallto ) { user.level = limit[ n ].fallto; continue; } } if ( limit[ n ].factor ) { kbgranted = long( user.kbUploaded ) * 100L / limit[ n ].factor + long( user.msgsPosted ) * limit[ n ].msgfactor + limit[ n ].free; } else { kbgranted = 0x7FFFFFFFL; } if ( user.kbDownloaded > kbgranted ) { if ( ! limit[ n ].factor ) { upload_needed = 0x7FFF; } else { upload_needed = int( ( long( user.kbDownloaded ) - kbgranted ) * limit[ n ].factor / 100 ); } free_download = 0; } else { free_download = int( kbgranted - user.kbDownloaded ); upload_needed = 0; if ( free_download > limit[ n ].daily_klimit ) { free_download = limit[ n ].daily_klimit; } } break; } time_limit = limit[ n ].timelimit; download_limit = limit[ n ].daily_klimit; download_delay = limit[ n ].pre_download; timer.changeleft( time_limit - timer.used() - user.timeUsed - time_removed); updatemenu = TRUE; } void change_access(char *data) { String param[ 40 ]; int n = parse_data( data, param ); for ( int i = 0; i < n; i++ ) { param[ i ].upperCase(); if ( isalpha( param[ i ][ 0 ] ) || ( param[ i ][ 0 ] >= '1' && param[ i ][ 0 ] <= '6' && strchr( "+-", param[ i ][ 1 ] ) ) ) { int flag; if ( isalpha( param[ i ][ 0 ] ) ) { flag = param[ i ][ 0 ] - 64; } else { flag = param[ i ][ 0 ] - '1' + 27; } if ( param[ i ][ 1 ] == '-' ) { user.aFlags.clearflag( flag ); } else { user.aFlags.setflag( flag ); } } else { user.level = word( atol( param[ i ] ) ); } } adjust_limits(); timer.check(); updatemenu = TRUE; } void file_error( int fn, int errno ) { String s( "Error accessing file " ); switch ( abs( fn ) ) { case ERR_BINLOG_PB: s << FN_BINLOG_PB; break; case ERR_TIMELOG_PRO: s << FN_TIMELOG_PRO; break; case ERR_ONLINE_PRO: s << FN_ONLINE_PRO; break; case ERR_AKA_PRO: s << "AKA.PRO"; break; } if ( errno ) { s << form( " (%d - %s)", errno, dos_error_message( errno ) ); } if ( fn < 0 ) { LOG( "%s", (char *) s ); } else { fatalerror( s ); } } void file_error( char *fn, int errno ) { String s( "Error accessing file " ); s << fn; if ( errno ) { s << form( " (%d - %s)", errno, dos_error_message( errno ) ); } fatalerror( s ); } void file_warning( char *fn, int errno ) { String s( "Error accessing file " ); s << fn; if ( errno ) { s << form( " (%d - %s)", errno, dos_error_message( errno ) ); } LOG( s ); } int intimewindow( Time t1, Time t2 ) { Time now( NOW ); if ( t2 <= t1 ) { t2[ 0 ] += 24; } if ( now < t1 ) { now[ 0 ] += 24; } if ( now < t1 || now > t2 ) { return 0; } else { return 1; } } char *dos_error_message( int errno ) { static struct { int no; char *msg; } errmsg[] = { { 1, "Invalid DOS call (SHARE not loaded?)" }, { 2, "File not found" }, { 3, "Directory not found" }, { 4, "Too many open files" }, { 5, "Access denied" }, { 6, "Invalid handle" }, { 7, "MCB destroyed" }, { 8, "Not enough memory" }, { 0, "" } }; for ( int i = 0; errmsg[ i ].no; i++ ) { if ( errno == errmsg[ i ].no ) { break; } } return errmsg[ i ].msg; } //************************************************************************** // // Parse a date string for the current locale // // Prototype: void parse_date( Date &d, char *s, int format ); // // Parameters: d ... Date value to fill-in // s ... String containing date data to parse // format ... Desired date locale // // Returns: None // // Remarks: // // This routine parses a date string, and returns the appropriate values in // the date value . // // Remember: // // d[0] ... day // d[1] ... month // d[2] ... year (-1900) // // Year value are between 0 to 127. This means that a ProBoard Date object // can store a year value from 1900 to 2027. // // ------------------------------------------------------------------------- // // Created on: ??/??/?? (Philippe Leybaert) // Last modified: 06/17/99 (Jeff Reeder) // Modified to handle dates in 10-byte formats for Y2K // compliance. Fixed a MAJOR bug in this routine where the // original code didn't check for a proper sequence of // three delimited numeric values. Also modified this code // to properly handle two-byte years. // //************************************************************************** void parse_date( Date &d, char *s, int format ) { char str[ 11 ]; strncpy( str, s, 10 ); str[ 10 ] = '\0'; char *fmt = date_formats[ format ]; int fmt_ar[ 3 ]; fmt_ar[ 0 ] = 0; fmt_ar[ 1 ] = 0; fmt_ar[ 2 ] = 0; //------------------------------------------------------- // Figure out what sequence the M/D/Y values should be in //------------------------------------------------------- if ( toupper( fmt[ 0 ] == 'D' ) ) fmt_ar[ 0 ] = DATE_DAY; if ( toupper( fmt[ 0 ] == 'M' ) ) fmt_ar[ 0 ] = DATE_MONTH; if ( toupper( fmt[ 0 ] == 'Y' ) ) fmt_ar[ 0 ] = DATE_YEAR; if ( toupper( fmt[ 3 ] == 'D' ) ) fmt_ar[ 1 ] = DATE_DAY; if ( toupper( fmt[ 3 ] == 'M' ) ) fmt_ar[ 1 ] = DATE_MONTH; if ( toupper( fmt[ 3 ] == 'Y' ) ) fmt_ar[ 1 ] = DATE_YEAR; if ( toupper( fmt[ 6 ] == 'D' ) ) fmt_ar[ 2 ] = DATE_DAY; if ( toupper( fmt[ 6 ] == 'M' ) ) fmt_ar[ 2 ] = DATE_MONTH; if ( toupper( fmt[ 6 ] == 'Y' ) ) fmt_ar[ 2 ] = DATE_YEAR; //-------------------------- // Initialize our date value //-------------------------- d.set( 0, 0, 0 ); //------------------------- // Find our first delimiter //------------------------- s = strtok( str, "-/." ); if ( s ) { int val; val = atoi( s ); if ( fmt_ar[ 0 ] == DATE_YEAR ) { d[ fmt_ar[ 0 ] ] = NormalizeYear( val ); } else { d[ fmt_ar[ 0 ] ] = val; } s = strtok( NULL, "-/." ); if ( s ) { val = atoi( s ); if ( fmt_ar[ 1 ] == DATE_YEAR ) { d[ fmt_ar[ 1 ] ] = NormalizeYear( val ); } else { d[ fmt_ar[ 1 ] ] = val; } s = strtok( NULL, "-/." ); if ( s ) { val = atoi( s ); if ( fmt_ar[ 2 ] == DATE_YEAR ) { d[ fmt_ar[ 2 ] ] = NormalizeYear( val ); } else { d[ fmt_ar[ 2 ] ] = val; } } } } }