// ===================================================
// Листинг 7. Программа для просмотра имен
//            томов текущего или первичного файл-сервера
//
// Файл volinfo\volinfo.cpp
//
// (C) A. Frolov, 1993
// ===================================================

#include <stdlib.h>
#include <stdio.h>

#define WORD unsigned int
#define BYTE unsigned char

extern "C" int GetNetWareShellVersion(char *,char *, char *);
extern "C" int GetVolumeName(int, char*);
extern "C" int GetVolumeInfoWithNumber(BYTE, char*,
						WORD*, WORD*, WORD*, WORD*, WORD*, WORD*);

void main(void) {

	char MajorVersion=0;
	char MinorVersion=0;
	char Revision=0;
	char VolumeName[64][16];
	int ccode, i;

	WORD TotalBlocks, SectorsPerBlock, AvailableBlocks;
	WORD TotalDirectorySlots, AvailableDirectorySlots, Removable;
	long TotalSectors, AvailableSectors;


	printf("\n*VOLINFO* (C) Frolov A., 1993\n");

	asm push si
	GetNetWareShellVersion(&MajorVersion,
			&MinorVersion, &Revision);
	asm pop si

	if(MajorVersion == 0) {
		printf("\nОболочка NetWare не загружена\n");
		return;
	}

	printf("\nСмонтированные тома:\n"
			 "----------------------------------------------\n");
	printf("Имя тома\tВсего Кбайт\tСвободно Кбайт\n");
	printf("----------------------------------------------");

// Цикл по томам файл-сервера.

	for(i=0; i<64; i++) {

// Получаем и выводим имя тома

		ccode = GetVolumeName(i, VolumeName[i]);
		printf("\n%s\t", VolumeName[i]);

// Если ошибка или тома нет, выходим из цикла

		if(ccode) break;
		if(!*(VolumeName[i])) break;

// Получаем информацию о томе

		ccode = GetVolumeInfoWithNumber(i, VolumeName[i],
			&TotalBlocks, &SectorsPerBlock, &AvailableBlocks,
			&TotalDirectorySlots, &AvailableDirectorySlots, &Removable);

		if(!ccode) {

// Подсчитываем общее количество секторов на томе
// и количество свободных серкторов

			TotalSectors = (long)TotalBlocks * SectorsPerBlock;
			AvailableSectors = (long)AvailableBlocks * SectorsPerBlock;

// Выводим размер томов и размер свободного пространства
// в килобайтах. Учитываем, что размер сектора
// составляет 512 байт.

			printf("\t%ld\t\t%ld",
				((long)TotalSectors * 512L) / 1024L,
				((long)AvailableSectors * 512L) / 1024L);
		}
	}
}