reactos/base/system/diskpart/select.c

181 lines
4 KiB
C

/*
* PROJECT: ReactOS DiskPart
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/system/diskpart/select.c
* PURPOSE: Manages all the partitions of the OS in an interactive way.
* PROGRAMMERS: Lee Schroeder
*/
#include "diskpart.h"
#define NDEBUG
#include <debug.h>
/* FUNCTIONS ******************************************************************/
static
VOID
SelectDisk(
INT argc,
LPWSTR *argv)
{
PLIST_ENTRY Entry;
PDISKENTRY DiskEntry;
LONG lValue;
LPWSTR endptr = NULL;
DPRINT("Select Disk()\n");
if (argc > 3)
{
ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
return;
}
if (argc == 2)
{
if (CurrentDisk == NULL)
ConResPuts(StdOut, IDS_SELECT_NO_DISK);
else
ConResPrintf(StdOut, IDS_SELECT_DISK, CurrentDisk->DiskNumber);
return;
}
lValue = wcstol(argv[2], &endptr, 10);
if (((lValue == 0) && (endptr == argv[2])) ||
(lValue < 0))
{
ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
return;
}
CurrentDisk = NULL;
Entry = DiskListHead.Flink;
while (Entry != &DiskListHead)
{
DiskEntry = CONTAINING_RECORD(Entry, DISKENTRY, ListEntry);
if (DiskEntry->DiskNumber == (ULONG)lValue)
{
CurrentDisk = DiskEntry;
CurrentPartition = NULL;
ConResPrintf(StdOut, IDS_SELECT_DISK, CurrentDisk->DiskNumber);
return;
}
Entry = Entry->Flink;
}
ConResPuts(StdErr, IDS_SELECT_DISK_INVALID);
}
static
VOID
SelectPartition(
INT argc,
LPWSTR *argv)
{
PLIST_ENTRY Entry;
PPARTENTRY PartEntry;
LONG lValue;
LPWSTR endptr = NULL;
ULONG PartNumber = 1;
DPRINT("Select Partition()\n");
if (argc > 3)
{
ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
return;
}
if (CurrentDisk == NULL)
{
ConResPuts(StdOut, IDS_SELECT_PARTITION_NO_DISK);
return;
}
if (argc == 2)
{
if (CurrentPartition == NULL)
ConResPuts(StdOut, IDS_SELECT_NO_PARTITION);
else
ConResPrintf(StdOut, IDS_SELECT_PARTITION, CurrentPartition);
return;
}
lValue = wcstol(argv[2], &endptr, 10);
if (((lValue == 0) && (endptr == argv[2])) ||
(lValue < 0))
{
ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
return;
}
Entry = CurrentDisk->PrimaryPartListHead.Flink;
while (Entry != &CurrentDisk->PrimaryPartListHead)
{
PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry);
if (PartEntry->PartitionType != 0)
{
if (PartNumber == (ULONG)lValue)
{
CurrentPartition = PartEntry;
ConResPrintf(StdOut, IDS_SELECT_PARTITION, PartNumber);
return;
}
PartNumber++;
}
Entry = Entry->Flink;
}
Entry = CurrentDisk->LogicalPartListHead.Flink;
while (Entry != &CurrentDisk->LogicalPartListHead)
{
PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry);
if (PartEntry->PartitionType != 0)
{
if (PartNumber == (ULONG)lValue)
{
CurrentPartition = PartEntry;
ConResPrintf(StdOut, IDS_SELECT_PARTITION, PartNumber);
return;
}
PartNumber++;
}
Entry = Entry->Flink;
}
ConResPuts(StdErr, IDS_SELECT_PARTITION_INVALID);
}
BOOL
select_main(
INT argc,
LPWSTR *argv)
{
/* gets the first word from the string */
if (argc == 1)
{
ConResPuts(StdOut, IDS_HELP_CMD_SELECT);
return TRUE;
}
/* determines which to list (disk, partition, etc.) */
if (!wcsicmp(argv[1], L"disk"))
SelectDisk(argc, argv);
else if (!wcsicmp(argv[1], L"partition"))
SelectPartition(argc, argv);
else
ConResPuts(StdOut, IDS_HELP_CMD_SELECT);
return TRUE;
}