Программа VOLINFO
Приведем исходный текст программы, которая выводит список смонтированных томов для текущего сервера. Если текущий диск локальный, программа выходит информацию о первичном сервере.
Программа в цикле с помощью функции GetVolumeName() получает имена смонтированных томов. Если первый байт имени тома содержит двоичный ноль, программа выходит из цикла.
Для каждого тома программа получает информацию о томе, вызывая функцию GetVolumeInfoWithNumber().
// =================================================== // Листинг 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); } } }
Вот что программа VOLINFO вывела на экран, когда мы запустили ее на нашем сервере SYSPRG:
*VOLINFO* (C) Frolov A., 1993
Смонтированные тома: ---------------------------------------------- Имя тома Всего Кбайт Свободно Кбайт ---------------------------------------------- SYS 140000 8084 VOL1 178864 13768 VOL2 160000 13372 VOL3 169024 924