#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 <compat/dcerpc.h>
#include "echon.h"
#include "misc.h"
#ifndef _WIN32
static void wait_for_signals(void);
#endif
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(echon_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(echon_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<RPC_FIELD_COUNT(server_binding); i++)
{
rpc_binding_to_string_binding(RPC_FIELD_BINDING_H(server_binding)[i],
(unsigned char **)&string_binding,
&status
);
if (string_binding)
printf("\t%s\n",string_binding);
}
#ifndef _WIN32
wait_for_signals();
#endif
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
#ifndef _WIN32
#endif
printf ("Unregistering server from the endpoint mapper.... \n");
rpc_ep_unregister(echon_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(echon_v1_0_s_ifspec,
NULL,
&status);
chk_dce_err(status, "rpc_server_unregister_if()", "", 0);
exit(0);
}
idl_boolean
ReplyBack(h, in_num, out_num, status)
rpc_binding_handle_t h;
unsigned32 in_num;
unsigned32* out_num;
error_status_t * status;
{
char * binding_info;
error_status_t e;
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");
printf("\tin_num = %ld\n", (long)in_num);
printf ("\n=========================================\n");
*out_num = in_num;
*status = error_status_ok;
return 1;
}
#ifndef _WIN32
void
wait_for_signals(void)
{
sigset_t signals;
sigemptyset(&signals);
sigaddset(&signals, SIGINT);
dcethread_signal_to_interrupt(&signals, dcethread_self());
}
#endif