xref: /reactos/base/system/diskpart/diskpart.c (revision 2ba6b097)
1 /*
2  * PROJECT:         ReactOS DiskPart
3  * LICENSE:         GPL - See COPYING in the top level directory
4  * FILE:            base/system/diskpart/diskpart.c
5  * PURPOSE:         Manages all the partitions of the OS in an interactive way.
6  * PROGRAMMERS:     Lee Schroeder
7  */
8 
9 /* INCLUDES ******************************************************************/
10 
11 #include "diskpart.h"
12 
13 /* FUNCTIONS ******************************************************************/
14 
15 VOID
ShowHeader(VOID)16 ShowHeader(VOID)
17 {
18     WCHAR szComputerName[MAX_STRING_SIZE];
19     DWORD comp_size = MAX_STRING_SIZE;
20 
21     /* Get the name of the computer for us and change the value of comp_name */
22     GetComputerNameW(szComputerName, &comp_size);
23 
24     /* TODO: Remove this section of code when program becomes stable enough for production use. */
25     ConPuts(StdOut, L"\n*WARNING*: This program is incomplete and may not work properly.\n");
26 
27     /* Print the header information */
28     ConPuts(StdOut, L"\n");
29     ConResPuts(StdOut, IDS_APP_HEADER);
30     ConPuts(StdOut, L"\n");
31     ConResPuts(StdOut, IDS_APP_LICENSE);
32     ConResPrintf(StdOut, IDS_APP_CURR_COMPUTER, szComputerName);
33 }
34 
35 /*
36  * RunScript(const char *filename):
37  * opens the file, reads the contents, convert the text into readable
38  * code for the computer, and then execute commands in order.
39  */
40 BOOL
RunScript(LPCWSTR filename)41 RunScript(LPCWSTR filename)
42 {
43     FILE *script;
44     WCHAR tmp_string[MAX_STRING_SIZE];
45 
46     /* Open the file for processing */
47     script = _wfopen(filename, L"r");
48     if (script == NULL)
49     {
50         /* if there was problems opening the file */
51         ConResPrintf(StdErr, IDS_ERROR_MSG_NO_SCRIPT, filename);
52         return FALSE; /* if there is no script, exit the program */
53     }
54 
55     /* Read and process the script */
56     while (fgetws(tmp_string, MAX_STRING_SIZE, script) != NULL)
57     {
58         if (InterpretScript(tmp_string) == FALSE)
59         {
60             fclose(script);
61             return FALSE;
62         }
63     }
64 
65     /* Close the file */
66     fclose(script);
67 
68     return TRUE;
69 }
70 
71 /*
72  * wmain():
73  * Main entry point of the application.
74  */
wmain(int argc,const LPWSTR argv[])75 int wmain(int argc, const LPWSTR argv[])
76 {
77     LPCWSTR script = NULL;
78     LPCWSTR tmpBuffer = NULL;
79     WCHAR appTitle[50];
80     int index, timeout;
81     int result = EXIT_SUCCESS;
82 
83     /* Initialize the Console Standard Streams */
84     ConInitStdStreams();
85 
86     /* Sets the title of the program so the user will have an easier time
87     determining the current program, especially if diskpart is running a
88     script */
89     K32LoadStringW(GetModuleHandle(NULL), IDS_APP_HEADER, appTitle, ARRAYSIZE(appTitle));
90     SetConsoleTitleW(appTitle);
91 
92     /* Sets the timeout value to 0 just in case the user doesn't
93     specify a value */
94     timeout = 0;
95 
96     CreatePartitionList();
97     CreateVolumeList();
98 
99     /* If there are no command arguments, then go straight to the interpreter */
100     if (argc < 2)
101     {
102         ShowHeader();
103         InterpretMain();
104     }
105     /* If there are command arguments, then process them */
106     else
107     {
108         for (index = 1; index < argc; index++)
109         {
110             /* checks for flags */
111             if ((argv[index][0] == '/')||
112                 (argv[index][0] == '-'))
113             {
114                 tmpBuffer = argv[index] + 1;
115             }
116             else
117             {
118                 /* If there is no flag, then return an error */
119                 ConResPrintf(StdErr, IDS_ERROR_MSG_BAD_ARG, argv[index]);
120                 result = EXIT_FAILURE;
121                 goto done;
122             }
123 
124             /* Checks for the /? flag first since the program
125             exits as soon as the usage list is shown. */
126             if (_wcsicmp(tmpBuffer, L"?") == 0)
127             {
128                 ConResPuts(StdOut, IDS_APP_USAGE);
129                 result = EXIT_SUCCESS;
130                 goto done;
131             }
132             /* Checks for the script flag */
133             else if (_wcsicmp(tmpBuffer, L"s") == 0)
134             {
135                 if ((index + 1) < argc)
136                 {
137                     index++;
138                     script = argv[index];
139                 }
140             }
141             /* Checks for the timeout flag */
142             else if (_wcsicmp(tmpBuffer, L"t") == 0)
143             {
144                 if ((index + 1) < argc)
145                 {
146                     index++;
147                     timeout = _wtoi(argv[index]);
148 
149                     /* If the number is a negative number, then
150                     change it so that the time is executed properly. */
151                     if (timeout < 0)
152                         timeout = 0;
153                 }
154             }
155             else
156             {
157                 /* Assume that the flag doesn't exist. */
158                 ConResPrintf(StdErr, IDS_ERROR_MSG_BAD_ARG, tmpBuffer);
159                 result = EXIT_FAILURE;
160                 goto done;
161             }
162         }
163 
164         /* Shows the program information */
165         ShowHeader();
166 
167         /* Now we process the filename if it exists */
168         if (script != NULL)
169         {
170             /* if the timeout is greater than 0, then assume
171             that the user specified a specific time. */
172             if (timeout > 0)
173                 Sleep(timeout * 1000);
174 
175             if (RunScript(script) == FALSE)
176             {
177                 result = EXIT_FAILURE;
178                 goto done;
179             }
180         }
181         else
182         {
183             /* Exit failure since the user wanted to run a script */
184             ConResPrintf(StdErr, IDS_ERROR_MSG_NO_SCRIPT, script);
185             result = EXIT_FAILURE;
186             goto done;
187         }
188     }
189 
190     /* Let the user know the program is exiting */
191     ConResPuts(StdOut, IDS_APP_LEAVING);
192 
193 done:
194     DestroyVolumeList();
195     DestroyPartitionList();
196 
197     return result;
198 }
199