MAIN.CPP
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:4k
源码类别:

操作系统开发

开发平台:

C/C++

  1. /*
  2. FIPS - the First nondestructive Interactive Partition Splitting program
  3. Module main.cpp
  4. RCS - Header:
  5. $Header: c:/daten/fips/source/main/RCS/main.cpp 1.4 1995/01/19 00:00:55 schaefer Exp schaefer $
  6. Copyright (C) 1993 Arno Schaefer
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or
  10. (at your option) any later version.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. Report problems and direct all questions to:
  19. schaefer@rbg.informatik.th-darmstadt.de
  20. */
  21. #include <stdlib.h>
  22. #include "logdr_st.h"
  23. #include "global.h"
  24. #include "input.h"
  25. #include "fat.h"
  26. #include "fipsspec.h"
  27. #include "host_os.h"
  28. #define FIRST_CHECK false
  29. #define FINAL_CHECK true
  30. extern unsigned _stklen = 20000U;
  31. int main (int argc, char *argv[])
  32. {
  33. // *********************************************************
  34. // Initialize Program
  35. // *********************************************************
  36. evaluate_argument_vector (argc, argv);
  37. atexit (exit_function);
  38. if (global.debug_mode)
  39. global.open_debugfile (argc,argv);
  40. notice ();
  41. host_os os;
  42. char infostring[256];
  43. if (os.ok () != OK)
  44. {
  45. printx ("nWARNING: FIPS has detected that it is running under %sn"
  46. "FIPS should not be used under a multitasking OS. If possible, boot from a DOSn"
  47. "disk and then run FIPS. Read FIPS.DOC for more information.nn",
  48. os.information (infostring));
  49. ask_if_proceed ();
  50. }
  51. // *********************************************************
  52. // Select Drive
  53. // *********************************************************
  54. int drive_number;
  55. if (global.drive_number_cmdline != 0)
  56. drive_number = global.drive_number_cmdline;
  57. else
  58. drive_number = ask_for_drive_number ();
  59. fips_harddrive harddrive (drive_number); // reads geometry
  60. if (harddrive.errorcode)
  61. error
  62. (
  63. "Error reading drive geometry: Errorcode %u",
  64. harddrive.errorcode
  65. );
  66. harddrive.reset ();
  67. if (harddrive.errorcode)
  68. {
  69. warning
  70. (
  71. false,
  72. "Drive initialization failure: Errorcode %u",
  73. harddrive.errorcode
  74. );
  75. ask_if_proceed ();
  76. }
  77. // *********************************************************
  78. // Select partition
  79. // *********************************************************
  80. if (harddrive.read_root_sector () != 0)
  81. error ("Error reading root sector");
  82. if (global.debug_mode)
  83. {
  84. fprintf
  85. (
  86. global.debugfile,
  87. "nRoot sector drive %02Xh:nn",
  88. drive_number
  89. );
  90. hexwrite (harddrive.root_sector->data, 512, global.debugfile);
  91. }
  92. while (true)
  93. {
  94. fips_harddrive hd = harddrive;
  95. hd.get_partition_table();
  96. printx ("nPartition table:nn");
  97. hd.print_partition_table ();
  98. hd.check (FIRST_CHECK);
  99. int partition_number =
  100. ask_for_partition_number
  101. (
  102. hd.partition_table().partition_info
  103. );
  104. int system = hd.partition_table()
  105. .partition_info[partition_number].system;
  106. switch (system)
  107. {
  108. case 5:
  109. error ("Can't split extended partitions");
  110. break;
  111. case 1: case 4: case 6:
  112. {
  113. fips_partition* partition =
  114. new fips_partition (&hd, partition_number);
  115. if (partition->split (hd) == true)
  116. return (0);
  117. delete partition;
  118. }
  119. break;
  120. default:
  121. error ("Unknown file system: %02Xh", system);
  122. break;
  123. }
  124. }
  125. }