Объявления typedef спецификации NFS

Опубликовано в Технологии > Серверные технологии Продолжение

В целях упрощения структуры объявлений в стандарте протокола NFS определены имена для типов, которые затем используются во многих структурах. Например, тип filename3 определен как массив символов, достаточно большой для размещения составного имени файла. В синтаксисе RPC для объявления массива символов служит ключевое слово string. Поэтому для указания на то, что dirpath представляет собой имя типа, которое может использоваться для объявления переменных, содержащих полное имя файла, в программе должно быть предусмотрено следующее определение:

typedef string dirpath; 

Аналогичным образом, стандарт определяет тип fhandle3 как 64-байтовый массив, содержащий дескриптор файла. Этот тип объявлен как непрозрачный, поскольку в клиентской программе его внутренняя структура не анализируется:

typedef opaque fhandle3; 

Структуры данных NFS

После определения констант и типов в процессе проектирования протокола можно перейти к определению типов всех применяемых структур данных. В спецификации протокола NFS соблюдается соглашение, в соответствии с которым все параметры дистанционного вызова процедуры должны быть объединены в одну структуру. Поэтому стандарт определяет структуру, применяемую в качестве параметра, для каждой удаленной процедуры, а также отдельную структуру для каждого результата выполнения процедуры. Кроме того, в стандарте определено несколько структур, совместно используемых в нескольких процедурах. Например, в главе 24 описана структура fattr3, которая в спецификации NFS служит для определения атрибутов файла. Состав структуры fattr3 определен с учетом данных, представленных структурой stat. Что только не найдешь интересного тут обувь лето 2012

В некоторых полях структуры fattr3 регистрируется время последнего изменения файла или доступа к файлу. Такие поля объявлены как принадлежащие к типу nf stime3, который представляет следующую структуру:

struct nfstime3 {    /* Значения даты и времени, используемые в NFS */ uint32 seconds;   /* Число секунд, прошедших с начала эпохи */
/* (1 января 1970 года) */ uint32 nseconds; /* Число дополнительных наносекунд */
}?
 

Согласно этому объявлению, спецификация NFS предусматривает хранение значений времени в виде двух 32-битовых целых чисел. Первое целое число представляет число секунд, прошедших с начала эпохи, а второе целое число содержит дополнительное значение, выраженное в наносекундах (что позволяет повысить точность представления времени). В системе NFS для измерений значений времени в качестве даты начала эпохи используется 1 января 1970 года.

Остальные объявления в основном служат для определения типов параметров, передаваемых удаленной процедуре, или результатов, возвращаемых процедурой. Например, при вызове процедуры, которая выполняет операцию в каталоге (например, удаление файла), клиент должен передать имя файла. В спецификации NFS соответствующий тип параметра определен как структура diropargs3 (сокращение от directory operation arguments — параметры операции с каталогом, версия 3.

Эта структура показывает, что параметр включает в себя дескриптор файла для данного каталога и имя файла в каталоге. Чтобы понять, с чем связана необходимость в применении структуры diropargs3, напомним, что клиент NFS раскладывает все составные имена на компоненты. Поэтому в клиентской программе для обозначения файла не может применяться полное составное имя. Вместо этого спецификация NES требует, чтобы все операции с файлами были определены с указанием дескриптора каталога, в котором находится файл, и имени файла в этом каталоге.

Кроме объявлений типов параметров, стандарт определяет типы, возвращаемые удаленными процедурами. Объявление операции, выполняющей чтение из каталога, принадлежит к числу наиболее сложных, поскольку такая операция возвращает список записей, каждая из которых обозначает файл. Любая запись в этом списке имеет следующую форму:

Ниже приведено объявление, в котором указано, что dirlist3 представляет собой заголовок списка записей. Логическое значение ео£ служит для указания того, содержит ли список последние элементы в каталоге (т.е. позволяет определить, имеются ли еще элементы каталога, предназначенные для чтения):

struct dirlist3 {    /* Список записей каталога */
entry3 *entries; /* Указатель на следующую запись */
bool eof;	/* Принимает истинное значение, если список содержит */
/* последнюю запись в каталоге */
}?
 

Кроме объявлений, позволяющих представить результаты выполнения всех процедур, стандарт включает объявления параметров. Например, для процедуры чтения требуется три параметра: дескриптор файла, смещение в файле, с которого начинается чтение, и число считываемых октетов:

struct READ3args { /* Параметры процедуры чтения READ */
nfs_fh3 file;    /* Дескриптор файла, предназначенного для чтения */
offset3 offset; /* Смещение в файле */
count3 count;    /* Число считываемых символов */
};
 
Похожие статьи