/*++ | |
Copyright (c) 1999-2006 Intel Corporation. All rights reserved | |
This program and the accompanying materials are licensed and made available | |
under the terms and conditions of the BSD License which accompanies this | |
distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
Module Name: | |
CreateMtFile.c | |
Abstract: | |
Simple utility to create a pad file containing fixed data. | |
--*/ | |
#include <stdio.h> | |
#include <string.h> | |
#include <stdlib.h> | |
#include <Common/UefiBaseTypes.h> | |
#define UTILITY_NAME "CreateMtFile" | |
#define UTILITY_MAJOR_VERSION 1 | |
#define UTILITY_MINOR_VERSION 1 | |
typedef struct { | |
INT8 *OutFileName; | |
INT8 ByteValue; | |
UINT32 FileSize; | |
} OPTIONS; | |
static | |
EFI_STATUS | |
ProcessArgs ( | |
IN INT32 Argc, | |
IN INT8 *Argv[], | |
IN OUT OPTIONS *Options | |
); | |
static | |
void | |
Usage ( | |
VOID | |
); | |
static | |
void | |
Version ( | |
VOID | |
); | |
int | |
main ( | |
IN INT32 Argc, | |
IN INT8 *Argv[] | |
) | |
/*++ | |
Routine Description: | |
Main entry point for this utility. | |
Arguments: | |
Standard C entry point args Argc and Argv | |
Returns: | |
EFI_SUCCESS if good to go | |
--*/ | |
// GC_TODO: ] - add argument and description to function comment | |
// GC_TODO: EFI_INVALID_PARAMETER - add return value to function comment | |
// GC_TODO: EFI_DEVICE_ERROR - add return value to function comment | |
// GC_TODO: EFI_DEVICE_ERROR - add return value to function comment | |
{ | |
FILE *OutFptr; | |
OPTIONS Options; | |
// | |
// Process the command-line arguments. | |
// | |
if (ProcessArgs (Argc, Argv, &Options) != EFI_SUCCESS) { | |
return EFI_INVALID_PARAMETER; | |
} | |
// | |
// Open the output file | |
// | |
if ((OutFptr = fopen (Options.OutFileName, "wb")) == NULL) { | |
printf (" ERROR: Could not open output file '%s' for writing\n", Options.OutFileName); | |
return EFI_DEVICE_ERROR; | |
} | |
// | |
// Write the pad bytes. Do it the slow way (one at a time) for now. | |
// | |
while (Options.FileSize > 0) { | |
if (fwrite (&Options.ByteValue, 1, 1, OutFptr) != 1) { | |
fclose (OutFptr); | |
printf (" ERROR: Failed to write to output file\n"); | |
return EFI_DEVICE_ERROR; | |
} | |
Options.FileSize--; | |
} | |
// | |
// Close the file | |
// | |
fclose (OutFptr); | |
return EFI_SUCCESS; | |
} | |
static | |
EFI_STATUS | |
ProcessArgs ( | |
IN INT32 Argc, | |
IN INT8 *Argv[], | |
IN OUT OPTIONS *Options | |
) | |
/*++ | |
Routine Description: | |
Process the command line arguments. | |
Arguments: | |
Argc - argument count as passed in to the entry point function | |
Argv - array of arguments as passed in to the entry point function | |
Options - stucture of where to put the values of the parsed arguments | |
Returns: | |
EFI_SUCCESS if everything looks good | |
EFI_INVALID_PARAMETER otherwise | |
--*/ | |
// GC_TODO: ] - add argument and description to function comment | |
{ | |
UINT32 Multiplier; | |
// | |
// Clear the options | |
// | |
memset ((char *) Options, 0, sizeof (OPTIONS)); | |
// | |
// Skip program name | |
// | |
Argv++; | |
Argc--; | |
if (Argc < 1) { | |
Usage(); | |
return EFI_INVALID_PARAMETER; | |
} | |
if ((strcmp(Argv[0], "-h") == 0) || (strcmp(Argv[0], "--help") == 0) || | |
(strcmp(Argv[0], "-?") == 0) || (strcmp(Argv[0], "/?") == 0)) { | |
Usage(); | |
return EFI_INVALID_PARAMETER; | |
} | |
if ((strcmp(Argv[0], "-V") == 0) || (strcmp(Argv[0], "--version") == 0)) { | |
Version(); | |
return EFI_INVALID_PARAMETER; | |
} | |
if (Argc < 2) { | |
Usage (); | |
return EFI_INVALID_PARAMETER; | |
} | |
// | |
// If first arg is dash-option, then print usage. | |
// | |
if (Argv[0][0] == '-') { | |
Usage (); | |
return EFI_INVALID_PARAMETER; | |
} | |
// | |
// First arg is file name | |
// | |
Options->OutFileName = Argv[0]; | |
Argc--; | |
Argv++; | |
// | |
// Second arg is file size. Allow 0x1000, 0x100K, 1024, 1K | |
// | |
Multiplier = 1; | |
if ((Argv[0][strlen (Argv[0]) - 1] == 'k') || (Argv[0][strlen (Argv[0]) - 1] == 'K')) { | |
Multiplier = 1024; | |
} | |
// | |
// Check for negtive size | |
// | |
if (Argv[0][0] == '-') { | |
printf("ERROR: File size should be non-negtive.\n"); | |
return EFI_INVALID_PARAMETER; | |
} | |
// | |
// Look for 0x prefix on file size | |
// | |
if ((Argv[0][0] == '0') && ((Argv[0][1] == 'x') || (Argv[0][1] == 'X'))) { | |
if (sscanf (Argv[0], "%x", &Options->FileSize) != 1) { | |
printf ("ERROR: Invalid file size '%s'\n", Argv[0]); | |
Usage (); | |
return EFI_INVALID_PARAMETER; | |
} | |
// | |
// Otherwise must be a decimal number | |
// | |
} else { | |
if (sscanf (Argv[0], "%d", &Options->FileSize) != 1) { | |
printf ("ERROR: Invalid file size '%s'\n", Argv[0]); | |
Usage (); | |
return EFI_INVALID_PARAMETER; | |
} | |
} | |
Options->FileSize *= Multiplier; | |
// | |
// Assume byte value of 0xff | |
// | |
Options->ByteValue = (INT8) (UINT8) 0xFF; | |
return EFI_SUCCESS; | |
} | |
static | |
void | |
Version( | |
void | |
) | |
/*++ | |
Routine Description: | |
Print out version information for this utility. | |
Arguments: | |
None | |
Returns: | |
None | |
--*/ | |
{ | |
printf ("%s v%d.%d -EDK utility to create a pad file containing fixed data\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION); | |
printf ("Copyright (c) 1999-2006 Intel Corporation. All rights reserved.\n"); | |
} | |
// | |
// Print utility usage info | |
// | |
static | |
void | |
Usage ( | |
VOID | |
) | |
/*++ | |
Routine Description: | |
GC_TODO: Add function description | |
Arguments: | |
None | |
Returns: | |
GC_TODO: add return values | |
--*/ | |
{ | |
Version(); | |
printf ("\nUsage: %s OutFileName FileSize \n\ | |
where: \n\ | |
OutFileName is the name of the output file to generate \n\ | |
FileSize is the size of the file to create \n\ | |
Examples: \n\ | |
%s OutFile.bin 32K \n\ | |
%s OutFile.bin 0x1000 \n",UTILITY_NAME, UTILITY_NAME, UTILITY_NAME); | |
} | |