// ===================================================
// Листинг 17. Просмотр списка файлов в каталоге
//
// Файл fscan\fscan.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 _ScanFileInformation(BYTE, char *, BYTE, int *,
					  char *, BYTE *, BYTE *, long *,
					  char *, char *, char *, char *, long *);
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 FileName[16];
	BYTE FileAttributes;
	BYTE ExtendedFileAttributes;
	long FileSize;
	BYTE CreationDate[2];
	BYTE LastAccessDate[2];
	BYTE LastUpdateDateAndTime[4];
	BYTE LastArchiveDateAndTime[4];
	long FileOwnerID;

	int ccode;

	char ObjectName[48];
	WORD ObjectType;

	printf("\n*FSCAN* (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Размер\tАтрибуты\tВладелец\n");
	printf("--------------------------------------------"
			"-------------\n");

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

	strupr(argv[1]);

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

	for(SequenceNumber = 0xFFFF;;) {

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

		ccode = _ScanFileInformation(0, argv[1], 6, &SequenceNumber,
			  FileName, &FileAttributes, &ExtendedFileAttributes,
			  &FileSize, CreationDate, LastAccessDate,
			  LastUpdateDateAndTime, LastArchiveDateAndTime,
			  &FileOwnerID);

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

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

// Выводим имя файла

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

// Выводим размер файла

		printf("\t%ld", FileSize);

// Выводим байт атрибутов и байт расширенных атрибутов

		printf("\t%02.2X %02.2X\t", FileAttributes,
				ExtendedFileAttributes);
// Если для каталога определен владелец,
// получаем и выводим имя владельца

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

