// ===================================================
// Листинг 11. Просмотр списка подкаталогов
//             сетевого каталога
//
// Файл dirscan\dirscan.cpp
//
// (C) A. Frolov, 1993
// ===================================================

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

#define BYTE unsigned char
#define WORD unsigned int

extern "C" int GetNetWareShellVersion(char *,char *, char *);
extern "C" int ScanDirectoryInformation(BYTE, char *, int *,
					  char *, BYTE *, long *, BYTE *);
extern "C" int GetBinderyObjectName(long, char *, WORD *);


void main(int argc, char *argv[]) {

	char MajorVersion=0;
	char MinorVersion=0;
	char Revision=0;

	int SequenceNumber;
	char DirectoryName[16];
	BYTE CreationDataAndTime[4];
	long OwnerObjectID;
	BYTE RightsMask;
	int ccode;

	char ObjectName[48];
	WORD ObjectType;

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

// Проверяем наличие сетевой оболочки

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

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

// В качестве аргумента необходимо задать
// путь к просматриваемому каталогу в виде
//    SYS:USERS\*

	if(argc < 2) {
		printf("Укажите путь к каталогу, "
			"например: dirscan sys:users\\*\n");
		return;
	}
	printf("Содержимое каталога %s\n", argv[1]);
	printf("--------------------------------------------\n");
	printf("Имя     \tКто владелец каталога\n");
	printf("--------------------------------------------\n");

// Путь должен быть задан заглавными буквами

	strupr(argv[1]);

// Цикл просмотра каталога

	for(SequenceNumber = 0;;) {

// Получаем информацию о содержимом каталога

		ccode = ScanDirectoryInformation(0, argv[1], &SequenceNumber,
			DirectoryName, CreationDataAndTime,
			&OwnerObjectID, &RightsMask);

// Если были ошибки или каталог пуст, завершаем цикл

		if(ccode) break;
		if(DirectoryName[0] == '\0') break;

// Выводим имя каталога

		printf("%-12s", DirectoryName);

// Если для каталога определен владелец,
// получаем и выводим имя владельца

		if(OwnerObjectID) {
			GetBinderyObjectName(OwnerObjectID, ObjectName, &ObjectType);
			printf("\t%-12s \n", ObjectName);
		}
		else
			printf("\t <Нет сведений о владельце> \n");
	}
}

