/* $Id: ONC.xs,v 1.1 1997/05/01 22:08:11 jake Exp $ */ /* Copyright 1997 Jake Donham You may distribute under the terms of either the GNU General Public License or the Artistic License, as specified in the README file. */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include #include typedef SVCXPRT *RPC__ONC__Svcxprt; typedef CLIENT *RPC__ONC__Client; typedef AUTH *RPC__ONC__Auth; typedef struct svc_req *RPC__ONC__svc_req; typedef struct opaque_auth *RPC__ONC__opaque_auth; typedef struct authsys_parms *RPC__ONC__authsys_parms; typedef struct authdes_cred *RPC__ONC__authdes_cred; static int not_here(s) char *s; { croak("%s not implemented on this architecture", s); return -1; } static int constant(name, arg) char *name; int arg; { errno = 0; switch (*name) { case 'A': if (strEQ(name, "AUTH_NONE")) return AUTH_NONE; if (strEQ(name, "AUTH_NULL")) return AUTH_NULL; if (strEQ(name, "AUTH_SYS")) return AUTH_SYS; if (strEQ(name, "AUTH_UNIX")) return AUTH_UNIX; if (strEQ(name, "AUTH_SHORT")) return AUTH_SHORT; if (strEQ(name, "AUTH_DES")) return AUTH_DES; if (strEQ(name, "AUTH_KERB")) return AUTH_KERB; break; case 'C': if (strEQ(name, "CLSET_TIMEOUT")) return CLSET_TIMEOUT; if (strEQ(name, "CLGET_TIMEOUT")) return CLGET_TIMEOUT; if (strEQ(name, "CLGET_FD")) return CLGET_FD; if (strEQ(name, "CLGET_SVC_ADDR")) return CLGET_SVC_ADDR; if (strEQ(name, "CLSET_FD_CLOSE")) return CLSET_FD_CLOSE; if (strEQ(name, "CLSET_FD_NCLOSE")) return CLSET_FD_NCLOSE; if (strEQ(name, "CLGET_VERS")) return CLGET_VERS; if (strEQ(name, "CLSET_VERS")) return CLSET_VERS; if (strEQ(name, "CLGET_XID")) return CLGET_XID; if (strEQ(name, "CLSET_XID")) return CLSET_XID; if (strEQ(name, "CLSET_RETRY_TIMEOUT")) return CLSET_RETRY_TIMEOUT; if (strEQ(name, "CLGET_RETRY_TIMEOUT")) return CLGET_RETRY_TIMEOUT; break; case 'R': if (strEQ(name, "RPC_SUCCESS")) return RPC_SUCCESS; if (strEQ(name, "RPC_CANTENCODEARGS")) return RPC_CANTENCODEARGS; if (strEQ(name, "RPC_CANTDECODEARGS")) return RPC_CANTDECODEARGS; if (strEQ(name, "RPC_CANTSEND")) return RPC_CANTSEND; if (strEQ(name, "RPC_CANTRECV")) return RPC_CANTRECV; if (strEQ(name, "RPC_TIMEDOUT")) return RPC_TIMEDOUT; if (strEQ(name, "RPC_INTR")) return RPC_INTR; if (strEQ(name, "RPC_UDERROR")) return RPC_UDERROR; if (strEQ(name, "RPC_VERSMISMATCH")) return RPC_VERSMISMATCH; if (strEQ(name, "RPC_AUTHERROR")) return RPC_AUTHERROR; if (strEQ(name, "RPC_PROGUNAVAIL")) return RPC_PROGUNAVAIL; if (strEQ(name, "RPC_PROGVERSMISMATCH")) return RPC_PROGVERSMISMATCH; if (strEQ(name, "RPC_PROCUNAVAIL")) return RPC_PROCUNAVAIL; if (strEQ(name, "RPC_CANTDECODEARGS")) return RPC_CANTDECODEARGS; if (strEQ(name, "RPC_SYSTEMERROR")) return RPC_SYSTEMERROR; if (strEQ(name, "RPC_UNKNOWNHOST")) return RPC_UNKNOWNHOST; if (strEQ(name, "RPC_UNKNOWNPROTO")) return RPC_UNKNOWNPROTO; if (strEQ(name, "RPC_UNKNOWNADDR")) return RPC_UNKNOWNADDR; if (strEQ(name, "RPC_NOBROADCAST")) return RPC_NOBROADCAST; if (strEQ(name, "RPC_RPCBFAILURE")) return RPC_RPCBFAILURE; if (strEQ(name, "RPC_PMAPFAILURE")) return RPC_PMAPFAILURE; if (strEQ(name, "RPC_PROGNOTREGISTERED")) return RPC_PROGNOTREGISTERED; if (strEQ(name, "RPC_N2AXLATEFAILURE")) return RPC_N2AXLATEFAILURE; if (strEQ(name, "RPC_TLIERROR")) return RPC_TLIERROR; if (strEQ(name, "RPC_FAILED")) return RPC_FAILED; if (strEQ(name, "RPC_INPROGRESS")) return RPC_INPROGRESS; if (strEQ(name, "RPC_STALERACHANDLE")) return RPC_STALERACHANDLE; if (strEQ(name, "RPC_CANTCONNECT")) return RPC_CANTCONNECT; if (strEQ(name, "RPC_XPRTFAILED")) return RPC_XPRTFAILED; if (strEQ(name, "RPC_CANCREATESTREAM")) return RPC_CANTCREATESTREAM; break; } errno = EINVAL; return 0; } void set_perl_error(int errno, char *errstr) { static SV *sv_errno = 0; static SV *sv_errstr = 0; if (!sv_errno) sv_errno = perl_get_sv("RPC::ONC::errno", TRUE); if (!sv_errstr) sv_errstr = perl_get_sv("RPC::ONC::errstr", TRUE); sv_setiv(sv_errno, (IV) errno); sv_setpv(sv_errstr, errstr); } MODULE = RPC::ONC PACKAGE = RPC::ONC PROTOTYPES: DISABLE int constant(name,arg) char * name int arg MODULE = RPC::ONC PACKAGE = RPC::ONC::Client RPC::ONC::Client clnt_create(host,prognum,versnum,nettype) char *host long prognum long versnum char *nettype CODE: char *msg; if ((RETVAL = clnt_create(host, prognum, versnum, nettype)) == 0) { char *msg = clnt_spcreateerror("RPC::ONC::clnt_create"); set_perl_error(rpc_createerr.cf_stat, msg); croak(msg); } OUTPUT: RETVAL int clnt_control(clnt,req,info) RPC::ONC::Client clnt int req char *info CODE: RETVAL = clnt_control(clnt, req, info); OUTPUT: RETVAL void clnt_destroy(clnt) RPC::ONC::Client clnt CODE: clnt_destroy(clnt); void DESTROY(clnt) RPC::ONC::Client clnt CODE: clnt_destroy(clnt); void set_cl_auth(clnt,auth) RPC::ONC::Client clnt RPC::ONC::Auth auth CODE: clnt->cl_auth = auth; MODULE = RPC::ONC PACKAGE = RPC::ONC::Auth RPC::ONC::Auth authnone_create() CODE: RETVAL = authnone_create(); EXTEND(sp, 1); OUTPUT: RETVAL RPC::ONC::Auth authsys_create_default() CODE: RETVAL = authsys_create_default(); EXTEND(sp, 1); OUTPUT: RETVAL void auth_destroy(auth) RPC::ONC::Auth auth CODE: auth_destroy(auth); MODULE = RPC::ONC PACKAGE = RPC::ONC::svc_req u_long rq_prog(svc_req) RPC::ONC::svc_req svc_req CODE: RETVAL = svc_req->rq_prog; OUTPUT: RETVAL u_long rq_vers(svc_req) RPC::ONC::svc_req svc_req CODE: RETVAL = svc_req->rq_vers; OUTPUT: RETVAL u_long rq_proc(svc_req) RPC::ONC::svc_req svc_req CODE: RETVAL = svc_req->rq_proc; OUTPUT: RETVAL RPC::ONC::opaque_auth rq_cred(svc_req) RPC::ONC::svc_req svc_req CODE: RETVAL = &(svc_req->rq_cred); OUTPUT: RETVAL RPC::ONC::authsys_parms authsys_parms(svc_req) RPC::ONC::svc_req svc_req CODE: if (svc_req->rq_cred.oa_flavor == AUTH_SYS) RETVAL = (struct authsys_parms *)svc_req->rq_clntcred; else croak("auth flavor is not AUTH_SYS"); OUTPUT: RETVAL RPC::ONC::authdes_cred authdes_cred(svc_req) RPC::ONC::svc_req svc_req CODE: if (svc_req->rq_cred.oa_flavor == AUTH_DES) RETVAL = (struct authdes_cred *)svc_req->rq_clntcred; else croak("auth flavor is not AUTH_DES"); OUTPUT: RETVAL MODULE = RPC::ONC PACKAGE = RPC::ONC::opaque_auth int oa_flavor(opaque_auth) RPC::ONC::opaque_auth opaque_auth CODE: RETVAL = opaque_auth->oa_flavor; OUTPUT: RETVAL MODULE = RPC::ONC PACKAGE = RPC::ONC::authsys_parms u_long aup_time(authsys_parms) RPC::ONC::authsys_parms authsys_parms CODE: RETVAL = authsys_parms->aup_time; OUTPUT: RETVAL char * aup_machname(authsys_parms) RPC::ONC::authsys_parms authsys_parms CODE: RETVAL = authsys_parms->aup_machname; OUTPUT: RETVAL uid_t aup_uid(authsys_parms) RPC::ONC::authsys_parms authsys_parms CODE: RETVAL = authsys_parms->aup_uid; OUTPUT: RETVAL gid_t aup_gid(authsys_parms) RPC::ONC::authsys_parms authsys_parms CODE: RETVAL = authsys_parms->aup_gid; OUTPUT: RETVAL AV * aup_gids(authsys_parms) RPC::ONC::authsys_parms authsys_parms CODE: { int i; RETVAL = newAV(); av_extend(RETVAL, authsys_parms->aup_len); for (i=0; i < authsys_parms->aup_len; i++) { av_store(RETVAL, i, sv_2mortal(newSViv(authsys_parms->aup_gids[i]))); } } OUTPUT: RETVAL MODULE = RPC::ONC PACKAGE = RPC::ONC::Svcxprt struct sockaddr_in * svc_getcaller(transp) RPC::ONC::Svcxprt transp CODE: RETVAL = svc_getcaller(transp); OUTPUT: RETVAL