JavaScript is required to for searching.
Skip Navigation Links
Exit Print View
ONC+ Developer's Guide     Oracle Solaris 11 Information Library
search filter icon
search icon

Document Information

Preface

1.  Introduction to ONC+ Technologies

2.  Introduction to TI-RPC

3.  rpcgen Programming Guide

4.  Programmer's Interface to RPC

5.  Advanced RPC Programming Techniques

6.  Porting From TS-RPC to TI-RPC

7.  Multithreaded RPC Programming

8.  Extensions to the Oracle Solaris RPC Library

A.  XDR Technical Note

B.  RPC Protocol and Language Specification

C.  XDR Protocol Specification

XDR Protocol Introduction

Graphic Box Notation

Basic Block Size

XDR Data Type Declarations

Signed Integer

Declaration

Signed Integer Encoding

Unsigned Integer

Declaration

Unsigned Integer Encoding

Enumerations

Booleans

Hyper Integer and Unsigned Hyper Integer

Declaration

Hyper Integer Encoding

Floating Point

Declaration

Double-Precision Floating Point Encoding

Quadruple-Precision Floating Point

Declaration

Quadruple-Precision Floating Point Encoding

Fixed-Length Opaque Data

Declaration

Fixed-Length Opaque Encoding

Variable-Length Opaque Data

Declaration

Variable-Length Opaque Encoding

Counted Byte Strings

Declaration

String Encoding

Fixed-Length Array

Declaration

Fixed-Length Array Encoding

Variable-Length Array

Declaration

Counted Array Encoding

Structure

Declaration

Structure Encoding

Discriminated Union

Declaration

Discriminated Union Encoding

Void

Declaration

Constant

Declaration

Typedef

Optional-Data

XDR Language Specification

Notational Conventions

Lexical Notes

Syntax Notes

XDR Data Description

RPC Language Reference

D.  RPC Code Examples

E.  portmap Utility

Glossary

Index

XDR Language Specification

This section contains the XDR language specification.

Notational Conventions

This specification uses a modified Backus-Naur Form notation for describing the XDR language. Here is a brief description of the notation:

Lexical Notes

The following conventions are used in the specification.

Example C-1 XDR Specification

Syntax Information
declaration:
    type-specifier identifier
    | type-specifier identifier "[" value "]"
    | type-specifier identifier "<" [ value ] ">"
    | "opaque" identifier "[" value "]"
    | "opaque" identifier "<" [ value ] ">"
    | "string" identifier "<" [ value ] ">"
    | type-specifier "*" identifier
    | "void"

value:
    constant
    | identifier

type-specifier:
     [ "unsigned" ] "int"
    | [ "unsigned" ] "hyper"
    | "float"
    | "double"
    | "quadruple"
    | "bool"
    | enum-type-spec
    | struct-type-spec
    | union-type-spec
    | identifier

enum-type-spec:
    "enum" enum-body

enum-body:
    "{"
    ( identifier "=" value )
    ( "," identifier "=" value )*
    "}"

struct-type-spec:
    "struct" struct-body

struct-body:
    "{"
    ( declaration ";" )
    ( declaration ";" )*
    "}"

 union-type-spec:
    "union" union-body

union-body:
    "switch" "(" declaration ")" "{"
    ( "case" value ":" declaration ";" )
    ( "case" value ":" declaration ";" )*
    [ "default" ":" declaration ";" ]
    "}"

constant-def:
    "const" identifier "=" constant ";"

type-def:
    "typedef" declaration ";"
    | "enum" identifier enum-body ";"
    | "struct" identifier struct-body ";"
    | "union" identifier union-body ";"

definition:
    type-def
    | constant-def

specification:
    definition *

Syntax Notes

The following are keywords and cannot be used as identifiers:

bool
float
switch
cas
hyper
typedef
chas
int
union
const
opaque
unassigned
default
quadruple
void
double
string
enum
struct

Only unsigned constants can be used as size specifications for arrays. If an identifier is used, it must have been declared previously as an unsigned constant in a const definition.

Constant and type identifiers within the scope of a specification are in the same namespace and must be declared uniquely within this scope.

Similarly, variable names must be unique within the scope of struct and union declarations. Nested struct and union declarations create new scopes.

The discriminant of a union must be of a type that evaluates to an integer. That is, it must be an int, an unsigned int, a bool, an enum type, or any typedef that evaluates to one of these. Also, the case values must be legal discriminant values. Finally, a case value cannot be specified more than once within the scope of a union declaration.

XDR Data Description

The following example is a short XDR data description of a file data structure that might be used to transfer files from one machine to another.

Example C-2 XDR File Data Structure

const MAXUSERNAME = 32;/* max length of a user name */
const MAXFILELEN = 65535;  /* max length of a file */
const MAXNAMELEN = 255;    /* max length of a file name */

/* Types of files: */
enum filekind {
     TEXT = 0, /* ascii data */
     DATA = 1, /* raw data */
     EXEC = 2  /* executable */
 };

/* File information, per kind of file: */
union filetype switch (filekind kind) {
     case TEXT:
         void;                           /* no extra information */
     case DATA:
         string creator<MAXNAMELEN>;     /* data creator */
     case EXEC:
         string interpreter<MAXNAMELEN>; /*proginterptr*/
};

/* A complete file: */
struct file {
     string filename<MAXNAMELEN>;        /* name of file */
     filetype type;                      /* info about file */
     string owner<MAXUSERNAME>;          /* owner of file */
     opaque data<MAXFILELEN>;            /* file data */
};

Suppose now that a user named linda wants to store her LISP program sillyprog that contains just the data "quit." Her file would be encoded as listed in the following table.

Table C-1 XDR Data Description Example

Offset
Hex Bytes
ASCII
Description
0
00 00 00 09
Length of file name = 9
4
73 69 6c 6c
sill
File name characters
8
79 70 72 6f
ypro
More characters
12
67 00 00 00
g
3 zero-bytes of fill
16
00 00 00 02
Filekind is EXEC = 2
20
00 00 00 04
Length of interpreter = 4
24
6c 69 73 70
lisp
Interpreter characters
28
00 00 00 04
Length of owner = 4
32
6a 6f 68 6e
linda
Owner characters
36
00 00 00 06
Length of file data = 6
40
28 71 75 69
(qu
File data bytes
44
74 29 00 00
t)
2 zero-bytes of fill