Sun RPC (Remote Procedure Call) je Sun a nyní RFC 1831 middleware pro komunikaci pomocí vzdáleného volání, původně navržený pro podporu NFS. Definuje jazyk pro popis rozhraní a formát kódování dat, dohromady označovaný jako XDR (External Data Representation). XDR je založený na C syntaxi, příklady lze zpravidla najít v /usr/include/rpcsvc/*.x.
const MNTPATHLEN = 1024; /* maximum bytes in a pathname argument */
const MNTNAMLEN = 255; /* maximum bytes in a name argument */
const FHSIZE = 32; /* size in bytes of a file handle */
typedef opaque fhandle [FHSIZE];
typedef string name <MNTNAMLEN>;
typedef string dirpath <MNTPATHLEN>;
union fhstatus switch (unsigned fhs_status) {
case 0:
fhandle fhs_fhandle;
default:
void;
};
typedef struct mountbody *mountlist;
struct mountbody {
name ml_hostname;
dirpath ml_directory;
mountlist ml_next;
};
typedef struct groupnode *groups;
struct groupnode {
name gr_name;
groups gr_next;
};
typedef struct exportnode *exports;
struct exportnode {
dirpath ex_dir;
groups ex_groups;
exports ex_next;
};
program MOUNTPROG {
version MOUNTVERS {
void MOUNTPROC_NULL (void) = 0;
fhstatus MOUNTPROC_MNT (dirpath) = 1;
mountlist MOUNTPROC_DUMP (void) = 2;
void MOUNTPROC_UMNT (dirpath) = 3;
void MOUNTPROC_UMNTALL (void) = 4;
exports MOUNTPROC_EXPORT (void) = 5;
exports MOUNTPROC_EXPORTALL (void) = 6;
} = 1;
} = 100005;
Každá RPC procedura je identifikována jednoznačným číslem služby, číslem verze a číslem procedury. Jejich právě nainstalovaný seznam lze vypsat.
> rpcinfo -p
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100011 1 udp 892 rquotad
100011 2 udp 892 rquotad
100011 1 tcp 895 rquotad
100011 2 tcp 895 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100021 1 udp 39968 nlockmgr
100021 3 udp 39968 nlockmgr
100021 4 udp 39968 nlockmgr
100005 1 udp 39969 mountd
100005 1 tcp 45529 mountd
100005 2 udp 39969 mountd
100005 2 tcp 45529 mountd
100005 3 udp 39969 mountd
100005 3 tcp 45529 mountd
100024 1 udp 39970 status
100024 1 tcp 45530 status
391002 2 tcp 45533 sgi_fam
Z XDR popisu se vygenerují stuby a skeletony zpravidla pomocí utility nazývané rpcgen, ze souboru foo tak vznikne foo.h s definicemi typů a funkcí, foo_svc.c jako server side stub, foo_clnt.c jako client side stub, foo_xdr.c jako marshalling code, s parametrem -a také foo_server.c jako sample server code a foo_client.c jako sample client code a Makefile.foo jako sample makefile.
Co se runtime týče, klient se dotáže portmapperu, default na localhost, na port, na kterém běží požadované číslo služby a číslo verze. Servery se u portmapperu registrují při spuštění, pohoda.