// ===================================================
// Листинг 6. Подключение к серверу
//
// Файл log\log.c
//
// (C) A. Frolov, 1993
// ===================================================

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "nit.h"         // include-файлы из библиоткеи
#include "niterror.h"    //  NetWare C Interface

// Эта функция не описана в include-файлах
// библиотеки NetWare C Interface, поэтому опишем ее
// сами.

void GetServerInformation(int, FILE_SERV_INFO*);

void main(void) {

  int ccode;
  char ServerName[48];
  char UserName[48];
  char Password[128];
  WORD ConnID, ConnNumber;

  char companyName[80],	revision[80];
  char revisionDate[24], copyrightNotice[80];

  FILE_SERV_INFO serverInfo;
  BYTE newDirectoryHandle, effectiveRightsMask;
  char driveLetter;

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

  printf("NetWare Login, (C) Фролов А.В., 1993\n");

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

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

// Получаем номер канала, используемого сервером
// по умолчанию (default) для связи с рабочей станцией, на
// которой была запущена эта программа

  ConnNumber = GetConnectionNumber();

// Получаем имя файл-сервера, используемого
// по умолчанию (default)

  GetFileServerName(0, ServerName);

// Выводим имя и номер канала для
// сервера, используемого по умолчанию

  if(ConnNumber)
		printf("Сервер по умолчанию '%s', ConnNumber=%04.4X\n",
			ServerName, ConnNumber);

// Вводим имя сервера, имя пользователя и пароль.
// Преобразуем все введенные буквы в заглавные.

  printf("\nВведите имя сервера: ");
  gets(ServerName);
  strupr(ServerName);

  printf("\nВведите ваше имя: ");
  gets(UserName);
  strupr(UserName);

  printf("\nВведите пароль: ");
  gets(Password);
  strupr(Password);

// Создаем канал с сервером

  ccode = AttachToFileServer(ServerName, &ConnID);

// Если канал удалось создать или он уже был создан раньше,
// выводим имя сервера и номер канала, используемого
// на рабочей станции для идентификации сервера.

  if(ccode == 0 || ccode == ALREADY_ATTACHED_TO_SERVER) {
		printf("\nServerName='%s', ServerID=%04.4X",
			ServerName, ConnID);

// Делаем данный сервер предпочтительным для того,
// чтобы все запросы направлялись к нему в первую очередь

		SetPreferredConnectionID(ConnID);

// Подключаем пользователя к файл-серверу

		ccode = LoginToFileServer(UserName,OT_USER,Password);
		if(!ccode) {

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

			if(!CheckConsolePrivileges())
				printf("Вы оператор консоли\n");

// Получаем строки описания сервера и выводим их
// в стандартный поток

			GetFileServerDescriptionStrings(companyName,
				revision, revisionDate, copyrightNotice);

			printf("Описание сервера:\n%s\n%s\n\n%s\n%s\n",
				companyName,revision, revisionDate,
				copyrightNotice);

// Получаем информацию о сервере, выводим максимальное
// количество пользователей, которые могут подключиться
// к данному файл-серверу.

			GetServerInformation(sizeof(serverInfo), &serverInfo);
			printf("Версия на %d пользователей\n",
				serverInfo.maxConnectionsSupported);

// Делаем данный сервер первичным.

			SetPrimaryConnectionID(ConnID);

// Отображаем диск S: рабочей станции на
// корневой каталог тома SYS: сервера

			driveLetter = 'S';

			ccode = AllocPermanentDirectoryHandle(0,"SYS:\\",
							driveLetter,
							&newDirectoryHandle,&effectiveRightsMask);
			printf("Диск отображен, код CCode = %d\n",ccode);
		}
  }
  else {
	 printf("Ошибка при подключении: %04.4X\n",ccode);
	 return;
  }
}