OpenVMS Source Code Demos
calcclient.c
//=====================================================================================
// calcclient.c (a sample program provided with gSOAP for OpenVMS)
//
// who when what
// --- ------ -------------------------------------------------------------------------
// NSR 100726 1. changed URLs to test against server running under Apache via MOD_GSOAP
// NSR 120131 1. added a couple of lines to enable crude SSL support
// NSR 120731 1. added more details to the SSL support
//=====================================================================================
// caveat: OpenVMS gSOAP 0.11 (based upon gSOAP 2.8.3) does not allow you to enable
// macros "WITH_OPENSSL" and "SOAP_DEBUG" at the same time. Hopefully this
// (reported) problem will be fixed in the next release.
//=====================================================================================
#include "soapH.h" //
#include "calc.nsmap" //
//
#ifdef WITH_OPENSSL // --- if ssl is enabled ---
char server[] = "https://142.180.39.16/gsoap_calc_server"; // works with MOD_GSOAP (Apache)
//
// Note: logical definition on all my VMS systems:
// define/system VMS_PROD_CERT_DIR SYS$SYSDEVICE:[CERTIFICATES]
//
char certificate[] = "VMS_PROD_CERT_DIR/client.pem"; // client certificate
char cacert[] = "VMS_PROD_CERT_DIR/client_ca.pem"; // trusted client chain file
char capath[] = "VMS_PROD_CERT_DIR"; // directory
char ssl_level[] = "0"; // 0=very relaxed
#else // --- if ssl is NOT enabled ---
const char server[] = "http://142.180.39.16/gsoap_calc_server"; // works with MOD_GSOAP (Apache)
#endif // -----------------------------
//
//
//
int main(int argc, char **argv) {
struct soap soap;
double a, b, result;
if (argc < 4)
{ fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n");
exit(0);
}
soap_init(&soap); //
#ifdef WITH_OPENSSL
printf("-i-calling: soap_ssl_init()\n");
soap_ssl_init();
printf("-i-calling: soap_client_context()\n");
//
// set ssl client context
//
switch (ssl_level[0]) {
case '0': // very relaxed (testing)
printf("-i-starting SSL level 0 (VERY RELAXED) soap_ssl_client_context\n");
if (soap_ssl_client_context( //
&soap, //
SOAP_SSL_NO_AUTHENTICATION, //
NULL, // key file : "client.pem"
NULL, // key password : "password"
NULL, // trusted certifcates : "cacerts.pem"
NULL, // path to cacerts :
NULL // random data seed :
))
{
soap_print_fault(&soap, stderr);
exit(1);
}
break;
case '1': // a little harder (needs work)
printf("-i-starting SSL level 1 (RELAXED) soap_ssl_client_context\n");
printf("-i-capath: %s\n",capath); //
if (soap_ssl_client_context( //
&soap, //
SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION |
SOAP_SSL_SKIP_HOST_CHECK |
SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE, //
NULL, // key file : "client.pem"
NULL, // key password : "password"
NULL, // trusted certifcates : "cacerts.pem"
capath, // path to cacerts : "vms_prod_cert_dir"
NULL // random data seed :
))
{
soap_print_fault(&soap, stderr);
exit(1);
}
break;
case '2': // a little harder (needs work)
printf("-i-starting DEFAULT (2) soap_ssl_client_context\n"); //
printf("-i-cert : %s\n",certificate); // incase they have Validate-Client enabled
printf("-i-cacert: %s\n",cacert); //
printf("-i-capath: %s\n",capath); //
//
// caveat: don't just guess at these params. Do some preliminary hacking with the openssl tool like so:
//
// 1) openssl verify "-CApath" vms_prod_cert_dir -purpose any vms_prod_cert_dir/example.crt
// or
// 2) openssl s_client -connect 142.180.221.226:443 "-CApath" vms_prod_cert_dir -cert vms_prod_cert_dir/kawc09.pem
//
if (soap_ssl_client_context( //
&soap, //
SOAP_SSL_DEFAULT, //
certificate, // key file : "client.pem"
NULL, // key password : "password"
cacert, // trusted certifcates : "cacerts.pem"
capath, // path to cacerts : "vms_prod_cert_dir"
NULL // random data seed :
))
{
soap_print_fault(&soap, stderr);
exit(1);
}
break;
default: //
printf("-e-oops, %c is not a valid selection\n",ssl_level[0]); //
} //
#endif
#ifdef SOAP_DEBUG
soap_set_recv_logfile(&soap, "recv.log");
soap_set_sent_logfile(&soap, "sent.log");
soap_set_test_logfile(&soap, "test.log");
#endif
a = strtod(argv[2], NULL);
b = strtod(argv[3], NULL);
switch (*argv[1]) {
case 'a':
soap_call_ns__add(&soap, server, "", a, b, &result);
break;
case 's':
soap_call_ns__sub(&soap, server, "", a, b, &result);
break;
case 'm':
soap_call_ns__mul(&soap, server, "", a, b, &result);
break;
case 'd':
soap_call_ns__div(&soap, server, "", a, b, &result);
break;
case 'p':
soap_call_ns__pow(&soap, server, "", a, b, &result);
break;
default:
fprintf(stderr, "Unknown command\n");
exit(0);
}
if (soap.error)
{ soap_print_fault(&soap, stderr);
exit(1);
}else{
printf("result = %g\n", result);
}
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);
return 0;
}