xref: /reactos/base/system/diskpart/diskpart.c (revision c2c66aff)
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
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
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  */
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 
98     /* If there are no command arguments, then go straight to the interpreter */
99     if (argc < 2)
100     {
101         ShowHeader();
102         InterpretMain();
103     }
104     /* If there are command arguments, then process them */
105     else
106     {
107         for (index = 1; index < argc; index++)
108         {
109             /* checks for flags */
110             if ((argv[index][0] == '/')||
111                 (argv[index][0] == '-'))
112             {
113                 tmpBuffer = argv[index] + 1;
114             }
115             else
116             {
117                 /* If there is no flag, then return an error */
118                 ConResPrintf(StdErr, IDS_ERROR_MSG_BAD_ARG, argv[index]);
119                 result = EXIT_FAILURE;
120                 goto done;
121             }
122 
123             /* Checks for the /? flag first since the program
124             exits as soon as the usage list is shown. */
125             if (_wcsicmp(tmpBuffer, L"?") == 0)
126             {
127                 ConResPuts(StdOut, IDS_APP_USAGE);
128                 result = EXIT_SUCCESS;
129                 goto done;
130             }
131             /* Checks for the script flag */
132             else if (_wcsicmp(tmpBuffer, L"s") == 0)
133             {
134                 if ((index + 1) < argc)
135                 {
136                     index++;
137                     script = argv[index];
138                 }
139             }
140             /* Checks for the timeout flag */
141             else if (_wcsicmp(tmpBuffer, L"t") == 0)
142             {
143                 if ((index + 1) < argc)
144                 {
145                     index++;
146                     timeout = _wtoi(argv[index]);
147 
148                     /* If the number is a negative number, then
149                     change it so that the time is executed properly. */
150                     if (timeout < 0)
151                         timeout = 0;
152                 }
153             }
154             else
155             {
156                 /* Assume that the flag doesn't exist. */
157                 ConResPrintf(StdErr, IDS_ERROR_MSG_BAD_ARG, tmpBuffer);
158                 result = EXIT_FAILURE;
159                 goto done;
160             }
161         }
162 
163         /* Shows the program information */
164         ShowHeader();
165 
166         /* Now we process the filename if it exists */
167         if (script != NULL)
168         {
169             /* if the timeout is greater than 0, then assume
170             that the user specified a specific time. */
171             if (timeout > 0)
172                 Sleep(timeout * 1000);
173 
174             if (RunScript(script) == FALSE)
175             {
176                 result = EXIT_FAILURE;
177                 goto done;
178             }
179         }
180         else
181         {
182             /* Exit failure since the user wanted to run a script */
183             ConResPrintf(StdErr, IDS_ERROR_MSG_NO_SCRIPT, script);
184             result = EXIT_FAILURE;
185             goto done;
186         }
187     }
188 
189     /* Let the user know the program is exiting */
190     ConResPuts(StdOut, IDS_APP_LEAVING);
191 
192 done:
193     DestroyPartitionList();
194 
195     return result;
196 }
197