rpc(3N) rpc(3N)
NAME
rpc - Bibliotheksroutinen für RPC (Remote Procedure Calls)
BESCHREIBUNG
RPC-Routinen erlauben C-Programmen, Prozeduraufrufe auf anderen
Maschinen über ein Netzwerk durchzuführen. Zuerst ruft der Client eine
Prozedur auf, um ein Datenpaket an den Server zu schicken. Bei Empfang
des Pakets ruft der Server eine Verteilerfunktion auf, um den gefor-
derten Dienst durchzuführen. Danach sendet er eine Antwort zurück.
Die nun folgenden Abschnitte beschreiben Datenobjekte, die von RPC-
Paketen verwendet werden.
NETZTYP
Einige der auf höheren Ebenen angesiedelten RPC-Schnittstellenroutinen
erwarten einen String nettype als Parameter [z. B. clntcreate,
svccreate, rpcreg, rpccall]. Dieser String definiert eine Klasse
von Transporten, die für eine bestimmte Anwendung verwendet werden
können. Die Transporte werden in der Reihenfolge von links nach rechts
in der Variable NETPATH, oder von oben nach unten in der Datei
/etc/netconfig ausprobiert.
nettype kann sein:
netpath Wählt aus den Transporten aus, die durch ihre Namen in
der Variable NETPATH angegeben sind. Falls NETPATH
nicht gesetzt oder NULL ist, wird zu visible übergegan-
gen. netpath ist der Standard für nettype.
visible Wählt die Transporte aus, die die visible-Option (v) in
der Datei /etc/netconfig gesetzt haben.
circuitv Entspricht visible, bis auf den Unterschied, daß nur
verbindungsorientierte Transporte aus den Einträgen der
Datei /etc/netconfig ausgewählt werden.
datagramv Entspricht ebenfalls visible, bis auf den Unterschied,
daß nur verbindungslose Datagramm-Transporte aus den
Einträgen in der Datei /etc/netconfig ausgewählt wer-
den.
circuitn Entspricht netpath, bis auf den Unterschied, daß nur
verbindungsorientierte Transporte ausgewählt werden.
datagramn Entspricht netpath, bis auf den Unterschied, daß nur
verbindungslose Datagramm-Transporte ausgewählt werden.
udp Wählt Internet UDP aus.
tcp Wählt Internet TCP aus.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
rpc(3N) rpc(3N)
raw Nur für Leistungsmeldungen über Pseudo-RPC.
Falls nettype NULL ist, wird netpath als Standard verwendet.
DATENSTRUKTUREN
Einige der Datenstrukturen, die von RPC-Paketen verwendet werden, wer-
den unten beschrieben.
Die Struktur AUTH
union desblock {
struct {
uint32 high;
uint32 low;
} key;
char c[8];
};
typedef union desblock desblock;
extern boolt xdrdesblock();
/*
* Berechtigungsinformation. Opak für einen Client.
*/
struct opaqueauth {
enumt oaflavor; /* Typ von auth */
caddrt oabase; /* Adresse weiterer auth-Daten */
uint oalength; /* nicht MAXAUTHBYTES überschreiten */
};
/*
* Auth Objekt, Schnittstelle zu clientseitigen Identifikationen.
*/
typedef struct {
struct opaqueauth ahcred;
struct opaqueauth ahverf;
union desblock ahkey;
struct authops {
void (*ahnextverf)();
int (*ahmarshal)(); /* nextverf & serialisieren */
int (*ahvalidate)(); /* Identifikation */
int (*ahrefresh)(); /* frische Berechtigung auf */
void (*ahdestroy)(); /* lösche diese Struktur */
} *ahops;
caddrt ahprivate;
} AUTH;
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
rpc(3N) rpc(3N)
Die Struktur CLIENT
/*
* rpc-Objekt der Clients (Client-Handle).
* Client ist für die Initialisierung verantwortlich,
* siehe z. B. authnone.c.
*/
typedef struct {
AUTH *clauth; /* Identifikation */
struct clntops {
enum clntstat (*clcall)(); /* rufe ferne Prozedur auf */
void (*clabort)(); /* breche einen Aufruf ab */
void (*clgeterr)(); /* hole spezifischen Fehlercode */
boolt (*clfreeres)(); /* gibt Ergebnisse frei */
void (*cldestroy)(); /* lösche diese Struktur */
boolt (*clcontrol)(); /* das ioctl() von rpc */
} *clops;
caddrt clprivate; /* private transportspez. Daten */
char *clnetid; /* Transportname */
char *cltp; /* Gerätename */
} CLIENT;
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
rpc(3N) rpc(3N)
Die Struktur SVCXPRT
enum xprtstat {
XPRTDIED,
XPRTMOREREQS,
XPRTIDLE
};
/*
* Transportobjekt auf Serverseite (Server-Handle)
*/
typedef struct {
int xpfd;
#define xpsock xpfd
#endif
ushort xpport; /* entsprechende Portnummer.
* Veraltet, aber noch immer
* verwendet, um anzugeben, ob
* Listener oder normale Verbindung
*/
struct xpops {
boolt (*xprecv)(); /* empfange hereinkomm. Auftrag */
enum xprtstat (*xpstat)(); /* hole Status */
boolt (*xpgetargs)(); /* hole Argumente */
boolt (*xpreply)(); /* sende Antwort */
boolt (*xpfreeargs)(); /* gib Speicher frei, der für */
/* Argumente angelegt wurde */
void (*xpdestroy)(); /* lösche diese Struktur */
} *xpops;
int xpaddrlen; /* Länge d. entf. Adr. (Veraltet) */
char *xptp; /* Transportanbieter-Gerätedatei */
char *xpnetid; /* Transportname */
struct netbuf xpltaddr; /* lokale Transportadresse */
struct netbuf xprtaddr; /* entf. Transportadresse */
char xpraddr[16]; /* entf. Adr. (Veraltet) */
struct opaqueauth xpverf; /* orig. Antwort-Verifikation */
caddrt xpp1; /* privat: für Verwend. durch svc ops */
caddrt xpp2; /* privat: für Verwend. durch svc ops */
caddrt xpp3; /* privat: für Verwend. durch svc lib */
} SVCXPRT;
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
rpc(3N) rpc(3N)
Die Struktur XDR
/*
* Xdr-Operationen. XDRENCODE bewirkt, daß die Daten kodiert werden.
* XDRDECODE bewirkt, daß die Daten dekodiert werden.
* XDRFREE kann verwendet werden, den Speicher, der durch ein
* XDRDECODE angelegt wurde, freizugeben.
*/
enum xdrop {
XDRENCODE=0,
XDRDECODE=1,
XDRFREE=2
};
/*
* Dies ist die Anzahl der Bytes pro XDR-Basiseinheit
*/
#define BYTESPERXDRUNIT (4)
#define RNDUP(x) ((((x) + BYTESPERXDRUNIT - 1) / BYTESPERXDRUNIT) \
* BYTESPERXDRUNIT)
/*
* Es existiert ein xdrproct für jeden Datentyp, der dekodiert oder
* kodiert werden muß. Das zweite Argument für xdrproct ist ein Zeiger auf
* einen opaque-Zeiger. Der opaque-Zeiger zeigt im allgemeinen auf eine
* Struktur des Datentyps, der dekodiert werden soll.
* Falls dieser Zeiger 0 ist, sollten die Routinen dynamisch
* Speicherplatz der entsprechenden Größe anlegen und zurückliefern.
* boolt (*xdrproct)(XDR *, caddrt *);
*/
typedef boolt (*xdrproct)();
/*
* Das XDR-Handle enthält die aktuelle Operation aus xdrop,
* einen Operationsvektor für die darunterliegende
* Implementierung (siehe z. B. xdrmem.c) und zwei private Felder
* zur Verwendung für diese Implementierung.
*/
typedef struct {
enum xdrop xop; /* Operation; zusätzlicher Param */
struct xdrops {
boolt (*xgetlong)(); /* hole long-Zahl von darunterl. Stream */
boolt (*xputlong)(); /* lege eine long-Zahl ab in " */
boolt (*xgetbytes)(); /* hole einige Bytes von " */
boolt (*xputbytes)(); /* lege einige Bytes ab in " */
uint (*xgetpostn)(); /* liefert Bytes vom Anfang zurück */
boolt (*xsetpostn)(); /* läßt den Stream neu positionieren */
long * (*xinline)(); /* Zeiger auf gepufferte Daten */
void (*xdestroy)(); /* gibt Privates dieses xdrstream frei */
} *xops;
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
rpc(3N) rpc(3N)
caddrt xpublic; /* Daten des Benutzers */
caddrt xprivate; /* Zeiger auf Private Daten */
caddrt xbase; /* privat verw. f. Info-positionierung */
int xhandy; /* zusätzliches privates Wort */
} XDR;
Index auf Routinen
Die folgende Tabelle listet die RPC-Routinen auf sowie die Handbuch-
seiten, auf denen sie beschrieben werden:
_____________________________________________
RPC-Routine Handbuchseite
_____________________________________________
authdestroy rpc_clnt_auth(3N)
authnonecreate rpc_clnt_auth(3N)
authsyscreate rpc_clnt_auth(3N)
authsyscreatedefault rpc_clnt_auth(3N)
clntcall rpc_clnt_calls(3N)
clntcontrol rpc_clnt_create(3N)
clntcreate rpc_clnt_create(3N)
clntdestroy rpc_clnt_create(3N)
clntdgcreate rpc_clnt_create(3N)
clntfreeres rpc_clnt_calls(3N)
clntgeterr rpc_clnt_calls(3N)
clntpcreateerror rpc_clnt_create(3N)
clntperrno rpc_clnt_calls(3N)
clntperror rpc_clnt_calls(3N)
clntrawcreate rpc_clnt_create(3N)
clntspcreateerror rpc_clnt_create(3N)
clntsperrno rpc_clnt_calls(3N)
clntsperror rpc_clnt_calls(3N)
clnttlicreate rpc_clnt_create(3N)
clnttpcreate rpc_clnt_create(3N)
clntvccreate rpc_clnt_create(3N)
rpcbroadcast rpc_clnt_calls(3N)
rpccall rpc_clnt_calls(3N)
rpcreg rpc_svc_calls(3N)
svccreate rpc_svc_create(3N)
svcdestroy rpc_svc_create(3N)
svcdgcreate rpc_svc_create(3N)
svcfdcreate rpc_svc_create(3N)
svcfreeargs rpc_svc_reg(3N)
svcgetargs rpc_svc_reg(3N)
svcgetreqset rpc_svc_reg(3N)
svcgetrpccaller rpc_svc_reg(3N)
svcrawcreate rpc_svc_create(3N)
svcreg rpc_svc_calls(3N)
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98
rpc(3N) rpc(3N)
svcrun rpc_svc_reg(3N)
svcsendreply rpc_svc_reg(3N)
svctlicreate rpc_svc_create(3N)
svctpcreate rpc_svc_create(3N)
svcunreg rpc_svc_calls(3N)
svcvccreate rpc_svc_create(3N)
svcerrauth rpc_svc_err(3N)
svcerrdecode rpc_svc_err(3N)
svcerrnoproc rpc_svc_err(3N)
svcerrnoprog rpc_svc_err(3N)
svcerrprogvers rpc_svc_err(3N)
svcerrsystemerr rpc_svc_err(3N)
svcerrweakauth rpc_svc_err(3N)
xdracceptedreply rpc_xdr(3N)
xdrauthsysparms rpc_xdr(3N)
xdrcallhdr rpc_xdr(3N)
xdrcallmsg rpc_xdr(3N)
xdropaqueauth rpc_xdr(3N)
xdrrejectedreply rpc_xdr(3N)
xdrreplymsg rpc_xdr(3N)
xprtregister rpc_svc_calls(3N)
xprtunregister rpc_svc_calls(3N)
HINWEISE
Wenn Sie eine der RPC-Funktionen verwenden, müssen Sie bei der Über-
setzung die Bibliothek libnsl dazubinden (cc -lnsl).
DATEIEN
/etc/netconfig
SIEHE AUCH
getnetconfig(3N), getnetpath(3N), rpcclntauth(3N),
rpcclntcalls(3N), rpcclntcreate(3N), rpcsvccalls(3N),
rpcsvccreate(3N), rpcsvcerr(3N), rpcsvcreg(3N), rpcxdr(3N),
rpcbind(3N), xdr(3N), netconfig(4), environ(5).
Seite 7 Reliant UNIX 5.44 Gedruckt 11/98