#if HAVE_CONFIG_H
#include <config.h>
#endif
#ifndef _POSIX_PTHREAD_SEMANTICS
#define _POSIX_PTHREAD_SEMANTICS 1
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <ctype.h>
#include <dce/rpc.h>
#define DCETHREAD_CHECKED
#define DCETHREAD_USE_THROW
#include <dce/dcethread.h>
#include "echou.h"
#include "misc.h"
static void wait_for_signals(void);
int main(int ac ATTRIBUTE_UNUSED, char *av[] ATTRIBUTE_UNUSED)
{
unsigned32 status;
rpc_binding_vector_p_t server_binding;
char * string_binding;
unsigned32 i;
printf ("Registering server.... \n");
rpc_server_register_if(echou_v1_0_s_ifspec,
NULL,
NULL,
&status);
chk_dce_err(status, "rpc_server_register_if()", "", 1);
printf("registered.\nPreparing binding handle...\n");
rpc_server_use_protseq((unsigned_char_p_t)"ncacn_ip_tcp",
rpc_c_protseq_max_calls_default, &status);
chk_dce_err(status, "rpc_server_use_all_protseqs()", "", 1);
rpc_server_inq_bindings(&server_binding, &status);
chk_dce_err(status, "rpc_server_inq_bindings()", "", 1);
printf("registering bindings with endpoint mapper\n");
rpc_ep_register(echou_v1_0_s_ifspec,
server_binding,
NULL,
(unsigned char *)"QDA application server",
&status);
chk_dce_err(status, "rpc_ep_register()", "", 1);
printf("registered.\n");
printf ("Server's communications endpoints are:\n");
for (i=0; i<server_binding->count; i++)
{
rpc_binding_to_string_binding(server_binding->binding_h[i],
(unsigned char **)&string_binding,
&status
);
if (string_binding)
printf("\t%s\n",string_binding);
}
wait_for_signals();
printf ("listening for calls.... \n");
DCETHREAD_TRY
{
rpc_server_listen(rpc_c_listen_max_calls_default, &status);
}
DCETHREAD_CATCH_ALL(THIS_CATCH)
{
printf ("Server stoppped listening\n");
}
DCETHREAD_ENDTRY
printf ("Unregistering server from the endpoint mapper.... \n");
rpc_ep_unregister(echou_v1_0_s_ifspec,
server_binding,
NULL,
&status);
chk_dce_err(status, "rpc_ep_unregister()", "", 0);
printf("Cleaning up communications endpoints... \n");
rpc_server_unregister_if(echou_v1_0_s_ifspec,
NULL,
&status);
chk_dce_err(status, "rpc_server_unregister_if()", "", 0);
exit(0);
}
idl_boolean
ReplyBack(h, in_type, in_value, out_value, status)
rpc_binding_handle_t h;
idl_long_int in_type;
EchoUnion *in_value;
EchoUnion **out_value;
error_status_t * status;
{
char * binding_info;
error_status_t e;
*out_value = (EchoUnion*) rpc_ss_allocate(sizeof(EchoUnion));
rpc_binding_to_string_binding(h, (unsigned char **)&binding_info, &e);
if (e == rpc_s_ok)
{
printf ("ReplyBack() called by client: %s\n", binding_info);
}
printf("\n\nFunction ReplyBack() -- input argments\n");
if (in_value == NULL)
{
printf("in_value = [null]\n");
*out_value = NULL;
}
else if (in_type == 1)
{
printf("in_value = [int] %li\n", (long int) in_value->integer);
(*out_value)->integer = -in_value->integer;
}
else if (in_type == 2)
{
printf("in_value = [float] %f\n", (double) in_value->fp);
(*out_value)->fp = -in_value->fp;
}
else if (in_type == 3)
{
int i, len;
printf("in_value = [string] %s\n", (char*) in_value->str);
len = strlen((const char *)in_value->str);
(*out_value)->str = rpc_ss_allocate(sizeof(*in_value->str) * (len+1));
for (i = 0; i < len; i++)
{
(*out_value)->str[i] = in_value->str[len-1-i];
}
(*out_value)->str[len] = 0;
}
printf ("\n=========================================\n");
*status = error_status_ok;
return 1;
}
void
wait_for_signals(void)
{
sigset_t signals;
sigemptyset(&signals);
sigaddset(&signals, SIGINT);
dcethread_signal_to_interrupt(&signals, dcethread_self());
}