From 52be99d8c0862ff87db9a4f9ccec1ac4b5f7caed Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Fri, 2 Sep 2022 09:18:52 +0200 Subject: added a quite unsorted first version of a floppy boot loader --- floppy/lstar.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 floppy/lstar.c (limited to 'floppy/lstar.c') diff --git a/floppy/lstar.c b/floppy/lstar.c new file mode 100644 index 0000000..2a7d541 --- /dev/null +++ b/floppy/lstar.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include + +static int octal_to_int( char *s, int size ) +{ + int n = 0; + char *c = s; + while( size > 0 ) { + n *= 8; + n += *c - '0'; + c++; + size--; + } + + return n; +} + +int main( int argc, char *argv[] ) +{ + FILE *f = NULL; + char buf[512]; + char filename[100]; + char size_octal[12]; + char cksum_octal[8]; + int size; + unsigned int cksum; + unsigned int computed_cksum; + int i, n; + int terminate = 0; + + if( argc != 2 ) { + fprintf( stderr, "usage: %s \n", argv[0] ); + exit( EXIT_FAILURE ); + } + + f = fopen( argv[1], "r" ); + if( f == NULL ) { + fprintf( stderr, "ERROR: failed to open file '%s'\n", argv[1] ); + exit( EXIT_FAILURE ); + } + + do { + clearerr( f ); + n = fread( buf, 512, 1, f ); + if( n == 0 ) { + if( ferror( f ) ) { + fprintf( stderr, "ERR: read error\n" ); + terminate = 1; + } else if( feof( f ) ) { + terminate = 1; + break; + } + } + + if( memcmp( &buf[257], "ustar", 5 ) == 0 ) { + strlcpy( filename, buf, 100 ); + + if( strcmp( filename, "" ) != 0 ) { + + printf( "file: %s\n", filename ); + + strlcpy( size_octal, &buf[124], 12 ); + printf( "size (octal): %s\n", size_octal ); + + size = octal_to_int( size_octal, 11 ); + printf( "size (decimal): %d\n", size ); + + strlcpy( cksum_octal, &buf[148], 8 ); + printf( "cksum (octal): %s\n", cksum_octal ); + cksum = octal_to_int( cksum_octal, 6 ); + printf( "cksum (decimal): %d\n", cksum ); + + for( i = 148; i < 148+8; i++ ) { + buf[i] = ' '; + } + computed_cksum = 0; + for( i = 0; i < 512; i++ ) { + computed_cksum += (unsigned char)buf[i]; + } + printf( "cksum (computed): %d\n", computed_cksum ); + if( cksum != computed_cksum ) { + fprintf( stderr, "ERR: checksum mismatch in header!\n" ); + } + + while( size > 0 ) { + fread( buf, 512, 1, f ); + size -= 512; + } + } else { + fprintf( stderr, "INFO: the end\n" ); + } + } else { + fprintf( stderr, "WARN: skipping non TAR header\n" ); + } + } while( !terminate ); + + fclose( f ); + + exit( EXIT_SUCCESS ); +} -- cgit v1.2.3-54-g00ecf