16 opaque fopaque_arg[3]; /* скрытые данные фиксированной длины */
17 opaque vopaque_arg<>; /* скрытые данные переменной длины */
18 short fshort_arg[4]; /* массив фиксированной длины */
19 long vlong_arg<>; /* массив переменной длины */
20 union_arg uarg;
21 };
Объявление перечисления и размеченного объединения
1-11 Мы объявляем перечислимый тип с двумя значениями и размеченное объединение, использующее это перечисление в качестве дискриминанта. Если дискриминант имеет значение RESULT_INT, после значения дискриминанта передается целое число. Если дискриминант имеет значение RESULT_DOUBLE, за ним передается число с плавающей точкой двойной точности. В противном случае после дискриминанта не передается ничего.
Объявление структуры
12-21 Мы объявляем структуру, состоящую из различных типов, поддерживаемых XDR.
Поскольку мы не объявляем процедур RPC, программа rpcgen не создаст заглушку клиента и заглушку сервера. Однако она создаст заголовочный файл data.h и файл data_xdr.с, содержащий функции XDR, обеспечивающие кодирование и декодирование данных, объявленных в файле data.х.
В листинге 16.12 приведен получающийся в результате работы rpcgen заголовочный файл data.h. Содержимое этого файла выглядит так, как мы и предполагали (табл. 16.2).
Листинг 16.12. Заголовочный файл data.h, созданный rpcgen из файла data.x
//sunrpc/xdr1/data.h
1 /*
2 * Please do not edit this file. It was generated using rpcgen.
файле data_xdr.с объявляется функция xdr_data, вызываемая для кодирования и декодирования структуры data, которую мы определили. Суффикс имени функции _data соответствует имени нашей структуры из листинга 16.11. Первая программа, которую мы напишем, будет называться write.с. Она будет присваивать значения полям структуры data, вызывать xdr_data для кодирования всех полей в формат XDR и записывать результат в стандартный поток вывода.
Эта программа приведена в листинге 16.13.
Листинг 16.13. Инициализация структуры и кодирование ее в XDR
//sunrpc/xdr1/write.c
1 #include "unpipc.h"
2 #include "data.h"
3 int
4 main(int argc, char **argv)
5 {
6 XDR xhandle;
7 data out; /* структура, с которой мы работаем */
8 char *buff; /* результат кодирования в XOR */
9 char vop[2];
10 long vlong[3];
11 u_int size;
12 out.short_arg = 1;
13 out.long_arg = 2;
14 out.vstring_arg = "hello, world"; /* присваиваем значение указателю */
15 out.fopaque_arg[0] = 99; /* скрытые данные фиксированной длины */
16 out.fopaque_arg[1] = 88;
17 out.fopaque_arg[2] = 77;
18 vop[0] = 33; /* скрытые данные переменной длины */
19 vop[1] = 44;
20 out.vopaque_arg.vopaque_arg_len = 2;
21 out.vopaque_arg.vopaque_arg_val = vop;
22 out.fshort_arg[0] = 9999; /* массив фиксированной длины */
23 out.fshort_arg[1] = 8888;
24 out.fshort_arg[2] = 7777;
25 out.fshort_arg[3] = 6666;
26 vlong[0] = 123456; /* массив переменной длины */