Files
reactos/base/system/diskpart/select.c
Eric Kohl d2ae286c6b [DISKPART] Command function return EXIT_CODE instead of BOOL
This simplifies the implementation of the NOERR option.
2026-01-01 13:46:34 +01:00

292 lines
7.3 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 ******************************************************************/
EXIT_CODE
SelectDisk(
_In_ INT argc,
_In_ PWSTR *argv)
{
PLIST_ENTRY Entry;
PDISKENTRY DiskEntry;
ULONG ulValue;
DPRINT("Select Disk()\n");
if (argc > 3)
{
ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
return EXIT_SUCCESS;
}
if (argc == 2)
{
if (CurrentDisk == NULL)
ConResPuts(StdOut, IDS_SELECT_NO_DISK);
else
ConResPrintf(StdOut, IDS_SELECT_DISK, CurrentDisk->DiskNumber);
return EXIT_SUCCESS;
}
if (!_wcsicmp(argv[2], L"system"))
{
CurrentDisk = NULL;
Entry = DiskListHead.Flink;
DiskEntry = CONTAINING_RECORD(Entry, DISKENTRY, ListEntry);
CurrentDisk = DiskEntry;
CurrentPartition = NULL;
ConResPrintf(StdOut, IDS_SELECT_DISK, CurrentDisk->DiskNumber);
return EXIT_SUCCESS;
}
else if (!_wcsicmp(argv[2], L"next"))
{
if (CurrentDisk == NULL)
{
CurrentPartition = NULL;
ConResPuts(StdErr, IDS_SELECT_DISK_ENUM_NO_START);
return EXIT_SUCCESS;
}
if (CurrentDisk->ListEntry.Flink == &DiskListHead)
{
CurrentDisk = NULL;
CurrentPartition = NULL;
ConResPuts(StdErr, IDS_SELECT_DISK_ENUM_FINISHED);
return EXIT_SUCCESS;
}
Entry = CurrentDisk->ListEntry.Flink;
DiskEntry = CONTAINING_RECORD(Entry, DISKENTRY, ListEntry);
CurrentDisk = DiskEntry;
CurrentPartition = NULL;
ConResPrintf(StdOut, IDS_SELECT_DISK, CurrentDisk->DiskNumber);
return EXIT_SUCCESS;
}
else if (IsDecString(argv[2]))
{
ulValue = wcstoul(argv[2], NULL, 10);
if ((ulValue == 0) && (errno == ERANGE))
{
ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
return EXIT_SUCCESS;
}
CurrentDisk = NULL;
Entry = DiskListHead.Flink;
while (Entry != &DiskListHead)
{
DiskEntry = CONTAINING_RECORD(Entry, DISKENTRY, ListEntry);
if (DiskEntry->DiskNumber == ulValue)
{
CurrentDisk = DiskEntry;
CurrentPartition = NULL;
ConResPrintf(StdOut, IDS_SELECT_DISK, CurrentDisk->DiskNumber);
return EXIT_SUCCESS;
}
Entry = Entry->Flink;
}
}
else
{
ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
return EXIT_SUCCESS;
}
ConResPuts(StdErr, IDS_SELECT_DISK_INVALID);
return EXIT_SUCCESS;
}
EXIT_CODE
SelectPartition(
_In_ INT argc,
_In_ PWSTR *argv)
{
PLIST_ENTRY Entry;
PPARTENTRY PartEntry;
ULONG ulValue;
ULONG PartNumber = 1;
DPRINT("Select Partition()\n");
if (argc > 3)
{
ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
return EXIT_SUCCESS;
}
if (CurrentDisk == NULL)
{
ConResPuts(StdOut, IDS_SELECT_PARTITION_NO_DISK);
return EXIT_SUCCESS;
}
if (argc == 2)
{
if (CurrentPartition == NULL)
ConResPuts(StdOut, IDS_SELECT_NO_PARTITION);
else
ConResPrintf(StdOut, IDS_SELECT_PARTITION, CurrentPartition);
return EXIT_SUCCESS;
}
if (!IsDecString(argv[2]))
{
ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
return EXIT_SUCCESS;
}
ulValue = wcstoul(argv[2], NULL, 10);
if ((ulValue == 0) && (errno == ERANGE))
{
ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
return EXIT_SUCCESS;
}
if (CurrentDisk->PartitionStyle == PARTITION_STYLE_MBR)
{
Entry = CurrentDisk->PrimaryPartListHead.Flink;
while (Entry != &CurrentDisk->PrimaryPartListHead)
{
PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry);
if (PartEntry->Mbr.PartitionType != PARTITION_ENTRY_UNUSED)
{
if (PartNumber == ulValue)
{
CurrentPartition = PartEntry;
ConResPrintf(StdOut, IDS_SELECT_PARTITION, PartNumber);
return EXIT_SUCCESS;
}
PartNumber++;
}
Entry = Entry->Flink;
}
Entry = CurrentDisk->LogicalPartListHead.Flink;
while (Entry != &CurrentDisk->LogicalPartListHead)
{
PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry);
if (PartEntry->Mbr.PartitionType != PARTITION_ENTRY_UNUSED)
{
if (PartNumber == ulValue)
{
CurrentPartition = PartEntry;
ConResPrintf(StdOut, IDS_SELECT_PARTITION, PartNumber);
return EXIT_SUCCESS;
}
PartNumber++;
}
Entry = Entry->Flink;
}
}
else if (CurrentDisk->PartitionStyle == PARTITION_STYLE_GPT)
{
Entry = CurrentDisk->PrimaryPartListHead.Flink;
while (Entry != &CurrentDisk->PrimaryPartListHead)
{
PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry);
if (!IsEqualGUID(&PartEntry->Gpt.PartitionType, &PARTITION_ENTRY_UNUSED_GUID))
{
if (PartNumber == ulValue)
{
CurrentPartition = PartEntry;
ConResPrintf(StdOut, IDS_SELECT_PARTITION, PartNumber);
return EXIT_SUCCESS;
}
PartNumber++;
}
Entry = Entry->Flink;
}
}
ConResPuts(StdErr, IDS_SELECT_PARTITION_INVALID);
return EXIT_SUCCESS;
}
EXIT_CODE
SelectVolume(
_In_ INT argc,
_In_ PWSTR *argv)
{
PLIST_ENTRY Entry;
PVOLENTRY VolumeEntry;
ULONG ulValue;
DPRINT("SelectVolume()\n");
if (argc > 3)
{
ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
return EXIT_SUCCESS;
}
if (argc == 2)
{
if (CurrentDisk == NULL)
ConResPuts(StdOut, IDS_SELECT_NO_VOLUME);
else
ConResPrintf(StdOut, IDS_SELECT_VOLUME, CurrentVolume->VolumeNumber);
return EXIT_SUCCESS;
}
if (!IsDecString(argv[2]))
{
ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
return EXIT_SUCCESS;
}
ulValue = wcstoul(argv[2], NULL, 10);
if ((ulValue == 0) && (errno == ERANGE))
{
ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS);
return EXIT_SUCCESS;
}
CurrentVolume = NULL;
Entry = VolumeListHead.Flink;
while (Entry != &VolumeListHead)
{
VolumeEntry = CONTAINING_RECORD(Entry, VOLENTRY, ListEntry);
if (VolumeEntry->VolumeNumber == ulValue)
{
CurrentVolume = VolumeEntry;
ConResPrintf(StdOut, IDS_SELECT_VOLUME, CurrentVolume->VolumeNumber);
return TRUE;
}
Entry = Entry->Flink;
}
ConResPuts(StdErr, IDS_SELECT_VOLUME_INVALID);
return EXIT_SUCCESS;
}