Server for Information Technologies ������ ��������������
������� �������������� ����������
(095) 932-9212, 932-9213, 939-0783
E-mail: [email protected]
������ �������� ����(!) ������������� ���������� CIT Forum CD-ROM

rpcgen

��������
rpcgen ���������� ��������� RPC

���������

	rpcgen ��_����
	rpcgen -h [-o ���_����] [��_����]
	rpcgen -c [-o ���_����] [��_����]
	rpcgen -m [-o ���_����] [��_����]
	rpcgen -l [-o ���_����] [��_����]
	rpcgen [-s ���������]* [-o ���_����] [��_����]

��������
Rpcgen �������� ��������� �������� ��-���������, ����������� �������� RPC. �� ���� ����������� ��������� ���� �� ����� RPCL (���� ��������� ����������� �������). ��� �������, ���������� �� ������ ����� �� ����� (������ �������) ���������� ������ �������� �����. ���� ������� ���� ����� ��� proto.x, ������������ ����� ��������� ��������� �������: proto.h - ���� ����������, proto_xdr.c - ��������� XDR, proto_svc.c - �������, ������� ��������� � �������, � proto_clnt.c - � ��������.

��� ��������� �������� ������ ����������� ������� � ��������� ������ ������ ��������� �����. � ������������ ������� �� ��������� �� �������� ����.

��� �������� ����� ����� �������������� rpcgen �������� ��������� ��-�������������� cpp(CP), ������� ��������� cpp �� ������� ����� rpcgen ���������. ������� ���� ��������� ����� ������������� ����������� ������ cpp: RPC_HDR, RPC_XDR, RPC_SVC � RPC_CLNT.

Rpcgen, ����� ����, ��� ��������� ��������� ��������������� ��������� ������� ������. ����� ������, ������������� �������� "%", ���������� ����� � �������� ����, ��� �������������.

��������� XDR-��������� ����� �����������, �� ��������� �� ���. ��� ���� rpcgen ����� ������������ ������������� ��������� � ������, ��������� �� ����� �������������� ��������� � ��������� xdr_. ������������ ����������� ���, ������ ��� ���������� � ������������� ������� rpcgen, ��������� �����, ����������� RPC � XDR, � "����������� ������������ SCO NFS". �����
-c ���������� �������� XDR.
-h ���������� ����������� ������ �� �� (���� ����������).
-o ���_���� �������� ����� ��������� �����. �� ��������� ������������ ���� ������������ ������ (������ ��� ������� -c, -h, -s).
-l ��������� ��������, ������� ��������� � �������.
-s ��������� ��������� ��������, ������� ��������� � �������, � �������������� ���������� ������������� ���������. �������������� ���� ������������� ���������: udp � tcp. ��� ������������� ���������� ���������� ����� ���������� ��������� ���.
-m ��������� ��������, ������� ��������� � �������, ��� �������� ��������� main(). ������������ � ��� ������, ���� ������������ ������� ���� ����������� ��������� main().

�������������
������� �������� ���������� RPCL ������������ ���� ������

 
	    [unsigned] char
	    [unsigned] short
	    [unsigned] int
	    [unsigned] long
	    unsigned
	    float
	    double
	    void
	    bool
���� �� ������� ���� bool (������ ������), �� ���� ��������� RPCL ������� ��.

� �������� ����� ���������� rpcgen ����������� ����������� bool � ����������� int (������ ������, � ����������� bool_t, ������� ��������� #define ������� ��� int). ����� ����, ��� void ����� ��������� ������ � ������������ union � program. ��� ����� � ���������� unsigned ��������� ������������� ������������ uchar, ushort, uint � ulong. �����������
� RPCL ��������� ������ ��� ���� �����������:

�������� �����
Rpcgen ������������ ��� ��������� ��������� XDR �/��� ����� ����������, ������������ ���� ������ �� �������� �����. ��� ������� ������������ zetype ������� rpcgen ������� ��������������� ��������� XDR, ��������� xdr_zetype � ������������ ��� �������� RPC-��������.

���������� ����� �������� �������� ����:

    ��������_����:
	typedef
	������������_���-def
	���������-def
	������_����������_�����-def
	�����������_�����������-def
	���������-def

������ ��� ����� ������ �� ����� ����� � ��. ������ � ��� � �� ����������� ���������� �������� �������� �������� ���������� �����, � XDR-����������� ���������� �� ������ �� ��������������� ������� � ��.

����������� �������� ����� � XDR �� �����������. ��������, ��������� ������ ��� rpcgen ����� ���������:

	    struct dontdoit {
		 struct ididit {
		  int oops;
		 } sorry;
		 enum ididitagain { OOPS, WHOOPS } iapologize;
	    };

�������� typedef � XDR �������� ��������� �������: typedef:

	    typedef ���_���� �������������_������� ;
"������������� �������" �������� ������ ������ ����, � �� ����� ��� "���_����" ��������� � ��������� ����. ��������:
	    typedef longa;

��������� �������� ������������� ����:

������������_���-def:
	    enum �������������_���� {
		   ������_�����
	    };
������_�����:
	    ����������_������������� [=������������]
	    ����������_������������� [=������������], ������_�����
	    (� ������ ����� ���������, ����� ����� ��������� ����� �����-
	    �������� ����� ��� ���������� ���������)
���� ������ ������������ ���, ������ ����� ��������� �������� ����������� �������� ������������, ����������� �� 1. ������ ������� �� ��������� ����� ������� ��������. ���������:
���������-def:
	    struct �������������_��������� {
		 ������_��������
	    };
������_��������:
	    ��������;
	    ��������; ������_��������
������� ���������� �����:
������_����������_�����-def:
	    array �������������_������� {
		 unsigned �������������_����� ;
		 ���������_����������� ;
	    };
�������� ������� ���������� ����� ������ �� �������� ���������. ������:
	    array mp_int {
		 unsigned len;
		 short val[MAX_MP_LENGTH];
	    };
��� ������ ������������� ������������ �:
	    struct mp_int {
		 unsigned len;
		 short *val;
	    };
	    typedef struct mp_int mp_int;
����������� �����������:
�����������_�����������-def:
	    union �������������_����������� switch (��������_�������������) {
		������_�������
		[default: ��������;]
	    };
������_�������:
	    case �������������_������ : ��������;
	    case �������������_������ : ��������; ������_�������
��������_�������������:
	    ��������

�������� ����������� ������ �� ����������� ��-����������� � ��-��������������. ������:

	    union net_object switch (net_kind kind) {
	    case MACHINE:
		 struct sockaddr_in sin;
	    case USER:
		 int uid;
		    default:
		 string whatisit;
	    };
��� ������ ������������� ������������ �:
	    struct net_object {
		 net_kind kind;
		 union {
		  struct sockaddr_in sin;
		  int uid;
		  char *whatisit;
		 } net_object;
	    };
	    typedef struct net_object net_object;

�������� �������� �� ��, ��� ��� ������������ ���������� � �������� ��������� ��������� � ������ ������ ����. �������� ��������:

���������-def:
	    program �������������_��������� {
		  ������_������
		    }=�����_���������;
������_������:
	    ������
	    ������ ������_������
������:
	    version �������������_������ {
		  ������_��������
		    }=�����_������;
������_��������:
	    ��������_���������
	    ��������_��������� ������_��������
��������_���������:
	    ���_���� �������������_���������(���_����)=�����_���������;

�������� �������� �� ������ �� �� ��� �� ����� ��������� ����, ������� ��� ������ ������ �� ��������, ��� ���������� � �������. �����������, ��� ��� ����� ������� �������� (���������) ��������� ��� ��������� ����. ��� �������� ����� ��������� ��������� �������:

	    program DATE_PROG {
		  version DATE_VERS {
		  date DATE_GET(timezone) = 1;
		  void DATE_SET(date) = 2;  /* ����� �� �������� */
		  } = 1;
	    } = 100;
� ����� ���������� ��� ������ ����� ����� ��������� ���:
	    #define DATE_PROG 100
	    #define DATE_VERS 1
	    #define DATE_GET 1
	    #define DATE_SET 2

���� �� ����������� rpcgen ��� ���������� ��������� ��������, ��� ���������� ������������ � ���������� ������� ���������. ������ ��������������� � ������ ���������� ����������� ����� ��-�������, ��� ������� ��������� � ������ � �������� ���������, �� ������������ ��������� ������� � ������������ ������� ������.

���������� ��������� ��������� ���������� DATE_GET:

	    date *  /* ������ ���������� ��������� �� ���������� */
	    date_get_l(tz)
		 timezone *tz; /* ������ �������� ��������� �� ��������� */
		    {
		 static date d;  /* ������ ���� �����������! */
		 /*
		  * ��������� ����
		  * � ���������� �� � d
		  */
		 return(&d);
	    }

��� ��������� ��������� � ������, ����������� � #define, �� ������������ ��������� ������� � ������������ ������� ������. XDR ���������� ����������� �������� ����� ��������� ����������� �� ��������� ���������, ������� ��� ����������� ��� ���������� �� ��������� ������� ����������� ����� �����������. ��� ���� XDR �� ������������ ������ ������������. ��� ������� ������������ �� �� ���������� �����. ����� ������ ���������� ����������
������� �������������� ��������� � make(1) ��� ���������� �������� XDR � ���������� (�� ������� ����� ���������� RPCL ����� ���������� .x):

	    .SUFFIXES:.x
	    .x.c:
		 rpcgen -c $< -o $@
	    .x.h:
		 rpcgen -h $< -o $@
������: ���������� ��������� example, � ������� ����������� ������ ���� �����:
	    const NFS_PORT       = 2059;
	    enum nfsstat {
		 NFS_OK=0
		    };
		    struct gnumbers {
		 long g_assets;
		 long g_liabilities;
	    };
������� rpcgen, ��������� ��� ����������, ������� ���� ���������� example.h � ���� XDR � ������ example_xdr.c.
	example.h
	    #define NFS_PORT 2059
	    enum nfsstat {
	 NFS_OK = 0,
	    };
	    typedef enum nfsstat nfsstat;
	    bool_t xdr_nfsstat();
	    struct gnumbers {
	 long g_assets;
	 long g_liabilities;
	    };
	    typedef struct gnumbers gnumbers;
	    bool_t xdr_gnumbers(); 
	 
	example_xdr.c
	    #include <rpc/rpc.h>
	    #include "infile.h" 
	  
	    bool_t
	    xdr_nfsstat (xdrs, objp)
	 XDR *xdrs;
	 nfsstat *objp;
	    {
	 if (!xdr_enum(xdrs, (enum_t *)objp)) {
	   return (FALSE);
	 }
	 return (TRUE);
	    } 
	  
	    bool_t
	    xdr_numbers (xdrs, objp)
	 XDR *xdrs;
	 gnumbers *objp;
	    {
	 if (!xdr_long(xdrs, &objp->g_assets)) {
	   return (FALSE);
	 }
	 if (!xdr_long(xdrs, &objp->g_liabilities)) {
	   return (FALSE);
	 }
	 return (TRUE);
	    }

��. �����
"����������� ������������ SCO NFS"

���������
� ����������� ������������ ����� ����������� ����������� �����, ��� ���� ����� �������� ���� ����� �� ����������������. �������� �������� �������� ������� ������������� ���������� ��������������� ��� ��������, ������, �������� � �����.

����������� ����� �� ��������������. ����� ������������ ������ �����������, ���������� �������� ����� ����������� �� ������� ������ � ���, ����� ������������ �� ����� ������ ������ ��������.
Comments: [email protected]
Designed by Andrey Novikov
Copyright © CIT