AUTOS.C

/**************************************************************************** 
Microsoft RPC Version 2.0
Copyright Microsoft Corp. 1992, 1993, 1994- 1996
Auto Example

FILE: autos.c

USAGE: autos -p protocol_sequence
-e endpoint
-m maxcalls
-n mincalls
-f flag for RpcServerListen wait
-a auto_sample_nsi_entry_name
-t name_syntax_type

PURPOSE: Server side of RPC distributed application Auto

FUNCTIONS: main() - registers server as RPC server

COMMENTS: This distributed application (time stamp) is implemented
using an auto handle. The server side of the application
must export its binding information and make it available
to the clients. The auto handle requires a location
service running on a server that is accessible to the client.

****************************************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include "auto.h" // header file generated by MIDL compiler

void Usage(char * pszProgramName)
{
fprintf(stderr, "Usage: %s\n", pszProgramName);
fprintf(stderr, " -p protocol_sequence\n");
fprintf(stderr, " -e endpoint\n");
fprintf(stderr, " -m maxcalls\n");
fprintf(stderr, " -n mincalls\n");
fprintf(stderr, " -f flag for RpcServerListen wait\n");
fprintf(stderr, " -a auto_sample_nsi_entry_name\n");
fprintf(stderr, " -t name_syntax_type\n");
exit(1);
}

void _CRTAPI1 main(int argc, char * argv[])
{
RPC_STATUS status;
RPC_BINDING_VECTOR * pBindingVector;

unsigned char * pszAutoEntryName = "/.:/Autohandle_sample";
unsigned char * pszEndpoint = "\\pipe\\auto";
unsigned char * pszProtocolSequence = "ncacn_np";
unsigned char * pszSecurity = NULL;
unsigned int cMinCalls = 1;
unsigned int cMaxCalls = 20;
unsigned int fDontWait = FALSE;
unsigned int fNameSyntaxType = RPC_C_NS_SYNTAX_DEFAULT;
int i;

/* allow the user to override settings with command line switches */
for (i = 1; i < argc; i++) {
if ((*argv[i] == '-') || (*argv[i] == '/')) {
switch (tolower(*(argv[i]+1))) {
case 'p': // protocol sequence
pszProtocolSequence = argv[++i];
break;
case 'e':
pszEndpoint = argv[++i];
break;
case 'm':
cMaxCalls = (unsigned int) atoi(argv[++i]);
break;
case 'n':
cMinCalls = (unsigned int) atoi(argv[++i]);
break;
case 'f':
fDontWait = (unsigned int) atoi(argv[++i]);
break;
case 'a':
pszAutoEntryName = argv[++i];
break;
case 't':
fNameSyntaxType = (unsigned int) atoi(argv[++i]);
break;
case 'h':
case '?':
default:
Usage(argv[0]);
}
}
else
Usage(argv[0]);
}

status = RpcServerUseProtseqEp(pszProtocolSequence,
cMaxCalls,
pszEndpoint,
pszSecurity); // Security descriptor
printf("RpcServerUseProtseqEp returned 0x%x\n", status);
if (status) {
exit(status);
}

status = RpcServerRegisterIf(autoh_ServerIfHandle, // interface to register
NULL, // MgrTypeUuid
NULL); // MgrEpv; null means use default
printf("RpcServerRegisterIf returned 0x%x\n", status);
if (status) {
exit(status);
}

status = RpcServerInqBindings(&pBindingVector);
printf("RpcServerInqBindings returned 0x%x\n", status);
if (status) {
exit(status);
}

status = RpcNsBindingExport(fNameSyntaxType, // name syntax type
pszAutoEntryName, // nsi entry name
autoh_ServerIfHandle,
pBindingVector, // set in previous call
NULL); // UUID vector
printf("RpcNsBindingExport returned 0x%x\n", status);
if (status) {
exit(status);
}

printf("Calling RpcServerListen\n");
status = RpcServerListen(cMinCalls,
cMaxCalls,
fDontWait); // wait flag
printf("RpcServerListen returned: 0x%x\n", status);
if (status) {
exit(status);
}

if (fDontWait) {
printf("Calling RpcMgmtWaitServerListen\n");
status = RpcMgmtWaitServerListen(); // wait operation
printf("RpcMgmtWaitServerListen returned: 0x%x\n", status);
if (status) {
exit(status);
}
}

} // end main()


/*********************************************************************/
/* MIDL allocate and free */
/*********************************************************************/

void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
{
return(malloc(len));
}

void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
{
free(ptr);
}

/* end file autos.c */