// ===================================================
// Листинг 16. Изменение маски прав доступа
//
// Файл setmask\setmask.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 ModifyMaximumRightsMask(BYTE, char*, BYTE,BYTE);

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

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

	BYTE RevokeRightsMask;
	BYTE GrantRightsMask;

	int ccode;

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

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

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

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

// Необходимо задать путь к каталогу, удаляемые
// и добавляемые права доступа

	if(argc < 4) {
		printf("Укажите путь к каталогу, "
			"удаляемые и добавляемые права доступа, "
			"\nнапример: setmask sys:users W RO");
		return;
	}

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

	strupr(argv[1]);
	strupr(argv[2]);
	strupr(argv[3]);

// Определяем маску удаляемых прав, разбирая второй
// параметр, заданный при запуске программы

	RevokeRightsMask = 0x00;

	for(int i = 0; argv[2][i] != '\0' ; i++) {
		switch(argv[2][i]) {
		case 'R':
			RevokeRightsMask |= 1; break;
		case 'W':
			RevokeRightsMask |= 2; break;
		case 'O':
			RevokeRightsMask |= 4; break;
		case 'C':
			RevokeRightsMask |= 8; break;
		case 'D':
			RevokeRightsMask |= 0x10; break;
		case 'P':
			RevokeRightsMask |= 0x20; break;
		case 'S':
			RevokeRightsMask |= 0x40; break;
		case 'M':
			RevokeRightsMask |= 0x80; break;
		case '-':
			break;
		default:
			printf("Ошибка в параметрах\n");
			return;
		}
	}

// Определяем маску добавляемых прав, разбирая
// третий параметр, заданный при запуске программы

	GrantRightsMask = 0x00;

	for(i = 0; argv[3][i] != '\0' ; i++) {
		switch(argv[3][i]) {
		case 'R':
			GrantRightsMask |= 1; break;
		case 'W':
			GrantRightsMask |= 2; break;
		case 'O':
			GrantRightsMask |= 4; break;
		case 'C':
			GrantRightsMask |= 8; break;
		case 'D':
			GrantRightsMask |= 0x10; break;
		case 'P':
			GrantRightsMask |= 0x20; break;
		case 'S':
			GrantRightsMask |= 0x40; break;
		case 'M':
			GrantRightsMask |= 0x80; break;
		case '-':
			break;
		default:
			printf("Ошибка в параметрах\n");
			return;
		}
	}

// Изменяем маску доступа каталога

	ccode = ModifyMaximumRightsMask(0, argv[1],
		RevokeRightsMask, GrantRightsMask);

	if(!ccode)
		printf("Маска прав изменена\n");
	else
		printf("Ошибка %02.2X\n", ccode);
}

