62 ($data[0],$len[0]) = $users[0]->Certificate(); 63 if(!(defined $data[0]) && !(defined $len[0])) {print "ok 5\n";} else {print "not ok 5\n";}; #### void Certificate(pSelf,...) t_testapi_usrcreds * pSelf PPCODE: int certBinaryLen = 0; int ret = 0; char* certificate = NULL; // look for optional returnCode arg SV *rval = ST(3); InitError(items, 3, rval); if (items > 2){ certificate = SvPV_nolen(ST(1)); certBinaryLen = (int)SvIV(ST(2)); if(certificate) { /* Cert is to be set */ }else{ /* Couldn't properly read an argument */ HandleError("Certificate1", items, 3, rval, -1); XSRETURN_UNDEF; } } if(!pSelf->credStruct.lpszCertBinary){ /* The certificate data is not set. */ HandleError("Certificatefailed2", items, 3, rval, -2); XSRETURN_UNDEF; } /* Return certificate currently set */ EXTEND(SP,2); PUSHs(sv_2mortal(newSVpv(pSelf->credStruct.lpszCertBinary,0))); PUSHs(sv_2mortal(newSViv((IV)pSelf->credStruct.nCertBinaryLen ))); XSRETURN(2); #### void HandleError(char *func, int numArgs, int errorArg, SV *errorSV, int errorCode) { if (numArgs==errorArg+1 && !SvREADONLY(errorSV)) { // new interface: set return code sv_setiv(errorSV, errorCode); } else { // old interface: die with error code and deprecation notification croak("%s() failed with error %d. The interface now has an additional optional argument.", func, errorCode); } }