7.12. Sun RPC

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.