mirror of
https://github.com/reactos/reactos.git
synced 2025-06-26 21:09:47 +00:00
[FATTEN]
- Do not always print the usage when an error occurs. Print it only when a syntactic error happens. - FAT volume labels are constituted of 11 chars (not 8!) which should be printable ASCII (in particular, >= 0x20) and in uppercase. svn path=/trunk/; revision=69732
This commit is contained in:
parent
4af490caec
commit
c92ab8d4e0
1 changed files with 59 additions and 55 deletions
|
@ -54,6 +54,44 @@ DWORD get_fattime(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void print_help(const char* name)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
printf("Syntax: %s image_file [list of commands]\n\n", name);
|
||||||
|
#if _WIN32
|
||||||
|
printf("Commands: [Note: both '/' and '-' are accepted as command prefixes.]\n");
|
||||||
|
#else
|
||||||
|
printf("Commands:\n");
|
||||||
|
#endif
|
||||||
|
// printf(" -format <sectors> [<filesystem>] [<custom header label>]\n"
|
||||||
|
printf(" -format <sectors> [<custom header label>]\n"
|
||||||
|
" Formats the disk image.\n");
|
||||||
|
printf(" -boot <sector file>\n"
|
||||||
|
" Writes a new boot sector.\n");
|
||||||
|
printf(" -add <src path> <dst path>\n"
|
||||||
|
" Copies an external file or directory into the image.\n");
|
||||||
|
printf(" -extract <src path> <dst path>\n"
|
||||||
|
" Copies a file or directory from the image into an external file\n"
|
||||||
|
" or directory.\n");
|
||||||
|
printf(" -move <src path> <new path>\n"
|
||||||
|
" Moves/renames a file or directory.\n");
|
||||||
|
printf(" -copy <src path> <new path>\n"
|
||||||
|
" Copies a file or directory.\n");
|
||||||
|
printf(" -mkdir <src path> <new path>\n"
|
||||||
|
" Creates a directory.\n");
|
||||||
|
printf(" -rmdir <src path> <new path>\n"
|
||||||
|
" Creates a directory.\n");
|
||||||
|
printf(" -list [<pattern>]\n"
|
||||||
|
" Lists files a directory (defaults to root).\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
#define PRINT_HELP_AND_QUIT() \
|
||||||
|
do { \
|
||||||
|
ret = 1; \
|
||||||
|
print_help(oargv[0]); \
|
||||||
|
goto exit; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
int is_command(const char* parg)
|
int is_command(const char* parg)
|
||||||
{
|
{
|
||||||
#if _WIN32
|
#if _WIN32
|
||||||
|
@ -88,44 +126,8 @@ int need_mount(void)
|
||||||
do { ret = need_mount(); if(ret) \
|
do { ret = need_mount(); if(ret) \
|
||||||
{\
|
{\
|
||||||
printf("Error: could not mount disk (%d).\n", ret); \
|
printf("Error: could not mount disk (%d).\n", ret); \
|
||||||
PRINT_HELP_AND_QUIT(); \
|
|
||||||
} } while(0)
|
|
||||||
|
|
||||||
void print_help(char const * const name)
|
|
||||||
{
|
|
||||||
printf("Syntax: %s image_file [list of commands]\n\n", name);
|
|
||||||
#if _WIN32
|
|
||||||
printf("Commands: [Note: both '/' and '-' are accepted as command prefixes.]\n");
|
|
||||||
#else
|
|
||||||
printf("Commands:\n");
|
|
||||||
#endif
|
|
||||||
printf(" -format <sectors> [<filesystem>] [<custom header label>]\n"
|
|
||||||
" Formats the disk image.\n");
|
|
||||||
printf(" -boot <sector file>\n"
|
|
||||||
" Writes a new boot sector.\n");
|
|
||||||
printf(" -add <src path> <dst path>\n"
|
|
||||||
" Copies an external file or directory into the image.\n");
|
|
||||||
printf(" -extract <src path> <dst path>\n"
|
|
||||||
" Copies a file or directory from the image into an external file\n"
|
|
||||||
" or directory.\n");
|
|
||||||
printf(" -move <src path> <new path>\n"
|
|
||||||
" Moves/renames a file or directory.\n");
|
|
||||||
printf(" -copy <src path> <new path>\n"
|
|
||||||
" Copies a file or directory.\n");
|
|
||||||
printf(" -mkdir <src path> <new path>\n"
|
|
||||||
" Creates a directory.\n");
|
|
||||||
printf(" -rmdir <src path> <new path>\n"
|
|
||||||
" Creates a directory.\n");
|
|
||||||
printf(" -list [<pattern>]\n"
|
|
||||||
" Lists files a directory (defaults to root).\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
#define PRINT_HELP_AND_QUIT() \
|
|
||||||
do { \
|
|
||||||
ret = 1; \
|
|
||||||
print_help(oargv[0]); \
|
|
||||||
goto exit; \
|
goto exit; \
|
||||||
} while (0)
|
} } while(0)
|
||||||
|
|
||||||
int main(int oargc, char* oargv[])
|
int main(int oargc, char* oargv[])
|
||||||
{
|
{
|
||||||
|
@ -141,14 +143,15 @@ int main(int oargc, char* oargv[])
|
||||||
|
|
||||||
if (is_command(argv[0]))
|
if (is_command(argv[0]))
|
||||||
{
|
{
|
||||||
printf("Error: first parameter must be a filename, found '%s' instead. \n", argv[0]);
|
printf("Error: first parameter must be a filename, found '%s' instead.\n", argv[0]);
|
||||||
PRINT_HELP_AND_QUIT();
|
PRINT_HELP_AND_QUIT();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (disk_openimage(0, argv[0]))
|
if (disk_openimage(0, argv[0]))
|
||||||
{
|
{
|
||||||
printf("Error: could not open image file '%s'. \n", argv[0]);
|
printf("Error: could not open image file '%s'.\n", argv[0]);
|
||||||
PRINT_HELP_AND_QUIT();
|
ret = 1;
|
||||||
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
argc--;
|
argc--;
|
||||||
|
@ -156,13 +159,13 @@ int main(int oargc, char* oargv[])
|
||||||
|
|
||||||
while (argc > 0)
|
while (argc > 0)
|
||||||
{
|
{
|
||||||
char *parg = *argv;
|
char* parg = *argv;
|
||||||
int nargs = 0;
|
int nargs = 0;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
if (!is_command(parg))
|
if (!is_command(parg))
|
||||||
{
|
{
|
||||||
printf("Error: Expected a command, found '%s' instead. \n", parg);
|
printf("Error: Expected a command, found '%s' instead.\n", parg);
|
||||||
PRINT_HELP_AND_QUIT();
|
PRINT_HELP_AND_QUIT();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,36 +202,38 @@ int main(int oargc, char* oargv[])
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
printf("ERROR: Formatting drive: %d.\n", ret);
|
printf("ERROR: Formatting drive: %d.\n", ret);
|
||||||
PRINT_HELP_AND_QUIT();
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Arg 2: custom header label (optional)
|
// Arg 2: custom header label (optional)
|
||||||
if (nargs > 1)
|
if (nargs > 1)
|
||||||
{
|
{
|
||||||
char label[8];
|
char label[11];
|
||||||
|
char ch;
|
||||||
|
|
||||||
int i, invalid = 0;
|
int i, invalid = 0;
|
||||||
int len = strlen(argv[1]);
|
int len = strlen(argv[1]);
|
||||||
|
|
||||||
if (len <= 8)
|
if (len <= sizeof(label))
|
||||||
{
|
{
|
||||||
// Copy and verify each character
|
// Verify each character (should be printable ASCII)
|
||||||
|
// and copy it in uppercase.
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
{
|
{
|
||||||
char ch = argv[1][i];
|
ch = toupper(argv[1][i]);
|
||||||
label[i] = ch;
|
if ((ch < 0x20) || !isprint(ch))
|
||||||
|
|
||||||
if (!isupper(ch) && !isspace(ch))
|
|
||||||
{
|
{
|
||||||
invalid = 1;
|
invalid = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
label[i] = ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!invalid)
|
if (!invalid)
|
||||||
{
|
{
|
||||||
// Pad the label with spaces
|
// Pad the label with spaces
|
||||||
while (len < 8)
|
while (len < sizeof(label))
|
||||||
{
|
{
|
||||||
label[len++] = ' ';
|
label[len++] = ' ';
|
||||||
}
|
}
|
||||||
|
@ -241,7 +246,7 @@ int main(int oargc, char* oargv[])
|
||||||
|
|
||||||
if (invalid)
|
if (invalid)
|
||||||
{
|
{
|
||||||
printf("Error: header label is limited to 8 uppercase letters and spaces.");
|
printf("Error: header label is limited to 11 printable uppercase ASCII symbols.");
|
||||||
ret = 1;
|
ret = 1;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
@ -253,14 +258,13 @@ int main(int oargc, char* oargv[])
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (g_Filesystem.fs_type == FS_FAT32)
|
if (g_Filesystem.fs_type == FS_FAT32)
|
||||||
{
|
{
|
||||||
memcpy(buff + 71, label, 8);
|
memcpy(buff + 71, label, sizeof(label));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
memcpy(buff + 43, label, 8);
|
memcpy(buff + 43, label, sizeof(label));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (disk_write(0, buff, 0, 1))
|
if (disk_write(0, buff, 0, 1))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue