Support virtual floppy image disk.
authorklu2 <klu2@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 3 Apr 2008 06:20:50 +0000 (06:20 +0000)
committerklu2 <klu2@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 3 Apr 2008 06:20:50 +0000 (06:20 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1116 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/GenBootSector/GenBootSector.c

index 68dcc93..f783da9 100644 (file)
@@ -540,7 +540,44 @@ PrintUsage (
      [-h, --help]\n");\r
 \r
 }\r
\r
+\r
+/**\r
+  Judget the type of file path and valid it.\r
+  \r
+  @param  FilePath  the string of file path, maybe a disk volume or file\r
+  \r
+  @retval -1  Invalid Path\r
+  @retval  0  Path is valid and is disk volume.\r
+  @retval  1  Path is valid and is file path.\r
+  \r
+**/\r
+INT\r
+ValidFilePath (\r
+  CHAR *FilePath\r
+  )\r
+{\r
+  INT   retval;\r
+  FILE  *f;\r
+  \r
+  if (FilePath == NULL) {\r
+    return -1;\r
+  }\r
+  \r
+  if (IsLetter(FilePath[0]) && (FilePath[1] == ':') && (FilePath[2] == '\0')) {\r
+    fprintf (stderr, "error E2003: File was not provided!\n");\r
+    return 0;\r
+  } \r
+  \r
+  f = fopen (FilePath, "r");\r
+  if (f == NULL) {\r
+    fprintf (stderr, "error E2003: File was not provided!\n");\r
+    return -1;\r
+  }\r
+  \r
+  fclose(f);\r
+  return 1;\r
+}\r
+\r
 INT\r
 main (\r
   INT  argc,\r
@@ -551,7 +588,8 @@ main (
   INT           Index;\r
   BOOL          ProcessMbr;\r
   CHAR          VolumeLetter;\r
-  CHAR          *FilePath;\r
+  CHAR          *OutputFilePath;\r
+  CHAR          *InputFilePath;\r
   BOOL          WriteToDisk;\r
   DRIVE_INFO    DriveInfo;\r
   PATCH_TYPE    PatchType;\r
@@ -567,13 +605,15 @@ main (
   \r
   ProcessMbr    = FALSE;\r
   WriteToDisk   = TRUE;\r
-  FilePath      = NULL;\r
   VolumeLetter  = 0;\r
 \r
   if (argc == 0) {\r
     PrintUsage();\r
+    return 0;\r
   }\r
-  \r
+\r
+  InputFilePath = NULL;\r
+    \r
   //\r
   // Parse command line\r
   //\r
@@ -585,20 +625,14 @@ main (
     else if ((stricmp (argv[0], "-m") == 0) || (stricmp (argv[Index], "--mbr") == 0)) {\r
       ProcessMbr = TRUE;\r
     }\r
-    else if ((stricmp (argv[Index], "-i") == 0) || (stricmp (argv[Index], "--input") == 0)\r
-             || (stricmp (argv[Index], "-o") == 0) || (stricmp (argv[Index], "--output") == 0)\r
-             ) {\r
-      if (argv[Index + 1][2] == '\0' && argv[Index + 1][1] == ':' && IsLetter (argv[Index + 1][0])) {\r
-        VolumeLetter = argv[Index + 1][0];\r
-        if ((stricmp (argv[Index], "-i") == 0) || (stricmp (argv[Index], "--input") == 0)) {\r
-          WriteToDisk = FALSE;\r
-        }\r
-        ++Index;\r
-      }\r
-      else {\r
-        FilePath = argv[Index+1];\r
-        ++Index;\r
-      }\r
+    else if ((stricmp (argv[Index], "-i") == 0) || (stricmp (argv[Index], "--input") == 0)) {\r
+      InputFilePath = argv[Index + 1];\r
+         WriteToDisk = FALSE;\r
+      ++Index;\r
+    }\r
+    else if ((stricmp (argv[Index], "-o") == 0) || (stricmp (argv[Index], "--output") == 0)) {\r
+      OutputFilePath = argv[Index + 1];\r
+      ++Index;\r
     }\r
     else {\r
       PrintUsage ();\r
@@ -606,23 +640,30 @@ main (
     }\r
   }\r
 \r
-  //\r
-  // Check parameter\r
-  //\r
-  if (VolumeLetter == 0) {\r
-    fprintf (stderr, "error E2003: Volume was not provided!\n");\r
-    return 1;\r
-  }\r
+  PatchType = PatchTypeUnknown;\r
   \r
-  if (FilePath == NULL) {\r
-    fprintf (stderr, "error E2003: File was not provided!\n");\r
-    return 1;\r
+  if (ValidFilePath (InputFilePath) == 0) {\r
+    VolumeLetter = InputFilePath[0];\r
+    \r
+    if (VolumeLetter == 0) {\r
+      fprintf (stderr, "error E2003: Volume was not provided!\n");\r
+      return 1;\r
+    }    \r
+  } else if (ValidFilePath(InputFilePath) == 1) {\r
+    strcpy (DiskPath, InputFilePath);\r
+    // \r
+    // file simulated floppy\r
+    //\r
+    PatchType = PatchTypeFloppy;\r
   }\r
+  \r
+  //if (ValidFilePath(OutputFilePath) != 1) {\r
+  //  fprintf (stderr, "error E2003: File was not provided!\n");\r
+  //  return 1;\r
+  //}\r
     \r
-  PatchType = PatchTypeUnknown;\r
-\r
   if ((VolumeLetter == 'A') || (VolumeLetter == 'a') || \r
-      (VolumeLetter == 'B') || (VolumeLetter == 'b') \r
+      (VolumeLetter == 'B') || (VolumeLetter == 'b')\r
       ) {\r
     //\r
     // Floppy\r
@@ -630,7 +671,7 @@ main (
     sprintf (DiskPath, FloppyPathTemplate, VolumeLetter);\r
     PatchType = PatchTypeFloppy;\r
   }\r
-  else {\r
+  else if (PatchType != PatchTypeFloppy) {\r
     //\r
     // Hard/USB disk\r
     //\r
@@ -665,7 +706,7 @@ main (
   //\r
   // Process DBR (Patch or Read)\r
   //\r
-  Status = ProcessBsOrMbr (DiskPath, FilePath, WriteToDisk, PatchType, ProcessMbr);\r
+  Status = ProcessBsOrMbr (DiskPath, OutputFilePath, WriteToDisk, PatchType, ProcessMbr);\r
   if (Status == ErrorSuccess) {\r
     fprintf (\r
       stdout, \r