1
0
Files
irix-657m-src/stand/x86/ffsc/cdi/vxaddsig.cpp
2022-09-29 17:59:04 +03:00

92 lines
2.1 KiB
C++

//
// vxaddsig.cpp - Add CDI signature to vxworks header
//
// usage: vxaddsig <filename>
//
// signature: 5Ah A5h A5h 5Ah at offset 0x18-0x1A in file
//
// Bill Lovegrove
//
// V1.0.0 June 10, 1996
//
#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
FILE *fp;
int result;
unsigned char sigbuf[4];
size_t size;
printf("vxaddsig V1.0.0 - Add signature to bootable VxWorks file\n");
printf("(C) Copyright 1996, Lines Unlimited\n\n");
// Check for filename argument
if ( argc != 2 )
{
printf("usage: vxaddsig <filename>\n");
exit(1);
}
// Open the file
fp = fopen( argv[1], "r+b" );
if ( fp == NULL )
{
printf("error: Can't open file %s.\n", argv[1]);
exit(2);
}
// Locate and check existing signature
result = fseek( fp, 0x18, SEEK_SET );
if ( result != 0 )
{
printf("error: Can't locate signature position in file.\n");
exit(3);
}
size = fread( sigbuf, sizeof(unsigned char), 4, fp);
if ( size != 4 )
{
printf("error: Unable to read signature field (file may not be VxWorks).\n");
exit(4);
}
if ( (sigbuf[0] == 0x5A) && (sigbuf[1] == 0xA5) && (sigbuf[2] == 0xA5)
&& (sigbuf[3] == 0x5A) )
{
printf("warning: Signature already present.\n");
exit(0);
}
if ( (sigbuf[0] != 0) || (sigbuf[1] != 0) || (sigbuf[2] != 0)
|| (sigbuf[3] != 0) )
{
printf("error: Signature not blank.\n");
exit(5);
}
// Write the signature
sigbuf[0] = 0x5A;
sigbuf[1] = 0xA5;
sigbuf[2] = 0xA5;
sigbuf[3] = 0x5A;
result = fseek( fp, 0x18, SEEK_SET );
size = fwrite( sigbuf, sizeof(char), 4, fp);
if ( size != 4 )
{
printf("error: Unable to write signature field.\n");
exit(6);
}
// Close file
result = fclose( fp );
if ( result != 0 )
{
printf("error: Can't close the file.\n");
exit(7);
}
// Exit normally
return 0;
}