static void md_attr_write(void *opaque, uint32_t at, uint8_t value) { MicroDriveState *s = opaque; at -= s->attr_base; switch (at) { case 0x00: /* Configuration Option Register */ s->opt = value & 0xcf; if (value & OPT_SRESET) md_reset(s); md_interrupt_update(s); break; case 0x02: /* Card Configuration Status Register */ if ((s->stat ^ value) & STAT_PWRDWN) s->pins |= PINS_CRDY; s->stat &= 0x82; s->stat |= value & 0x74; md_interrupt_update(s); /* Word 170 in Identify Device must be equal to STAT_XE */ break; case 0x04: /* Pin Replacement Register */ s->pins &= PINS_CRDY; s->pins |= value & PINS_MRDY; break; case 0x06: /* Socket and Copy Register */ break; default: printf("%s: Bad attribute space register %02x\n", __FUNCTION__, at); } }
int main( int argc, char *argv[]) { int fd; SNET *snet; char *line; u_int line_len; struct message_digest md; if ( argc != 3 ) { fprintf( stderr, "Usage: %s <checksum_algorithm> <file>\n", argv[ 0 ]); return( 1 ); } /* OpenSSL 1.1.0 added auto-init */ #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) OpenSSL_add_all_digests(); #endif /* OpenSSL < 1.1.0 */ simta_checksum_md = EVP_get_digestbyname((const char*)(argv[ 1 ])); if ( simta_checksum_md == NULL ) { fprintf( stderr, "%s: unknown checksum algorithm\n", argv[ 1 ]); return( 1 ); } md_init( &md ); md_reset( &md ); if (( fd = open( argv[ 2 ], O_RDONLY, 0 )) < 0 ) { perror( "open" ); exit( 1 ); } if (( snet = snet_attach( fd, 1024 * 1024 )) == NULL ) { perror( "snet_attach" ); exit( 1 ); } while (( line = snet_getline( snet, NULL )) != NULL ) { line_len = strlen( line ); md_update( &md, line, line_len ); } md_finalize( &md ); md_cleanup( &md ); if ( snet_close( snet ) != 0 ) { perror( "snet_close" ); return( 1 ); } printf( "\nChecksum: %s\n", md.md_b16 ); return( 0 ); }