a72b09490f7c666d4cf8d4b9825d03aa8e03118a
[reactos.git] / reactos / base / system / diskpart / select.c
1 /*
2 * PROJECT: ReactOS DiskPart
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/system/diskpart/select.c
5 * PURPOSE: Manages all the partitions of the OS in an interactive way
6 * PROGRAMMERS: Lee Schroeder
7 */
8
9 #include "diskpart.h"
10
11 #define NDEBUG
12 #include <debug.h>
13
14 /* FUNCTIONS ******************************************************************/
15
16 static
17 VOID
18 SelectDisk(
19 INT argc,
20 LPWSTR *argv)
21 {
22 PLIST_ENTRY Entry;
23 PDISKENTRY DiskEntry;
24 LONG lValue;
25 LPWSTR endptr = NULL;
26
27 DPRINT("Select Disk()\n");
28
29 if (argc > 3)
30 {
31 PrintResourceString(IDS_ERROR_INVALID_ARGS);
32 return;
33 }
34
35 if (argc == 2)
36 {
37 if (CurrentDisk == NULL)
38 PrintResourceString(IDS_SELECT_NO_DISK);
39 else
40 PrintResourceString(IDS_SELECT_DISK, CurrentDisk->DiskNumber);
41 return;
42 }
43
44 lValue = wcstol(argv[2], &endptr, 10);
45 if (((lValue == 0) && (endptr == argv[2])) ||
46 (lValue < 0))
47 {
48 PrintResourceString(IDS_ERROR_INVALID_ARGS);
49 return;
50 }
51
52 CurrentDisk = NULL;
53
54 Entry = DiskListHead.Flink;
55 while (Entry != &DiskListHead)
56 {
57 DiskEntry = CONTAINING_RECORD(Entry, DISKENTRY, ListEntry);
58
59 if (DiskEntry->DiskNumber == (ULONG)lValue)
60 {
61 CurrentDisk = DiskEntry;
62 CurrentPartition = NULL;
63 PrintResourceString(IDS_SELECT_DISK, CurrentDisk->DiskNumber);
64 return;
65 }
66
67 Entry = Entry->Flink;
68 }
69
70 PrintResourceString(IDS_SELECT_DISK_INVALID);
71 }
72
73
74 static
75 VOID
76 SelectPartition(
77 INT argc,
78 LPWSTR *argv)
79 {
80 PLIST_ENTRY Entry;
81 PPARTENTRY PartEntry;
82 LONG lValue;
83 LPWSTR endptr = NULL;
84 ULONG PartNumber = 1;
85
86 DPRINT("Select Partition()\n");
87
88 if (argc > 3)
89 {
90 PrintResourceString(IDS_ERROR_INVALID_ARGS);
91 return;
92 }
93
94 if (CurrentDisk == NULL)
95 {
96 PrintResourceString(IDS_SELECT_PARTITION_NO_DISK);
97 return;
98 }
99
100 if (argc == 2)
101 {
102 if (CurrentPartition == NULL)
103 PrintResourceString(IDS_SELECT_NO_PARTITION);
104 else
105 PrintResourceString(IDS_SELECT_PARTITION, CurrentPartition);
106 return;
107 }
108
109 lValue = wcstol(argv[2], &endptr, 10);
110 if (((lValue == 0) && (endptr == argv[2])) ||
111 (lValue < 0))
112 {
113 PrintResourceString(IDS_ERROR_INVALID_ARGS);
114 return;
115 }
116
117 Entry = CurrentDisk->PrimaryPartListHead.Flink;
118 while (Entry != &CurrentDisk->PrimaryPartListHead)
119 {
120 PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry);
121
122 if (PartEntry->PartitionType != 0)
123 {
124 if (PartNumber == (ULONG)lValue)
125 {
126 CurrentPartition = PartEntry;
127 PrintResourceString(IDS_SELECT_PARTITION, PartNumber);
128 return;
129 }
130
131 PartNumber++;
132 }
133
134 Entry = Entry->Flink;
135 }
136
137 Entry = CurrentDisk->LogicalPartListHead.Flink;
138 while (Entry != &CurrentDisk->LogicalPartListHead)
139 {
140 PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry);
141
142 if (PartEntry->PartitionType != 0)
143 {
144 if (PartNumber == (ULONG)lValue)
145 {
146 CurrentPartition = PartEntry;
147 PrintResourceString(IDS_SELECT_PARTITION, PartNumber);
148 return;
149 }
150
151 PartNumber++;
152 }
153 Entry = Entry->Flink;
154 }
155
156 PrintResourceString(IDS_SELECT_PARTITION_INVALID);
157 }
158
159
160 BOOL
161 select_main(
162 INT argc,
163 LPWSTR *argv)
164 {
165 /* gets the first word from the string */
166 if (argc == 1)
167 {
168 PrintResourceString(IDS_HELP_CMD_SELECT);
169 return TRUE;
170 }
171
172 /* determines which to list (disk, partition, etc.) */
173 if (!wcsicmp(argv[1], L"disk"))
174 SelectDisk(argc, argv);
175 else if (!wcsicmp(argv[1], L"partition"))
176 SelectPartition(argc, argv);
177 else
178 PrintResourceString(IDS_HELP_CMD_SELECT);
179
180 return TRUE;
181 }