|
|
1.1 ! root 1: /*************************************************************/ ! 2: /** **/ ! 3: /** Microsoft RPC Examples **/ ! 4: /** Dictionary Application **/ ! 5: /** Copyright(c) Microsoft Corp. 1991 **/ ! 6: /** **/ ! 7: /*************************************************************/ ! 8: ! 9: /* ! 10: ************************************************************************* ! 11: * Remote dictionary example: server side * ! 12: * * ! 13: * Created: Dov Harel 12/??/1990 * ! 14: * Modified to use context_handle Donna Liu 3/??/1991 * ! 15: * Further modifications / documentation Dov Harel 5/1/1991 * ! 16: * * ! 17: * Description: * ! 18: * This is the driver for the server side remote dictionary * ! 19: * (splay trees based) demo. This is a standard server driver, * ! 20: * and it works as follows: * ! 21: * * ! 22: * o Call RpcCreateServer to initialize all data structures * ! 23: * * ! 24: * o Initialize an appropriate protocol stack * ! 25: * * ! 26: * o Call RpcAddAddress to start listening on a transport address * ! 27: * (a named pipe in our case). * ! 28: * * ! 29: * o Call RpcAddInterface to initialize interface specific structures * ! 30: * (such as dispatch table, etc.) * ! 31: * * ! 32: * o Optionally advertise by calling RpcExport (not in this version) * ! 33: * * ! 34: * o Loop forever... * ! 35: * * ! 36: ************************************************************************* ! 37: */ ! 38: ! 39: #include <stdio.h> ! 40: #include <malloc.h> ! 41: #include <stdlib.h> ! 42: #include <string.h> ! 43: #include <ctype.h> ! 44: #include <windows.h> ! 45: ! 46: #include <rpc.h> ! 47: #include "dict0.h" ! 48: #include "replay.h" ! 49: #include "util0.h" ! 50: ! 51: // char *server = "\\pipe\\rpc\\replay"; ! 52: void exit(int); ! 53: ! 54: void Usage() ! 55: { ! 56: printf("Usage : server -a<address>\n"); ! 57: exit(1); ! 58: } ! 59: ! 60: void ! 61: main(int argc, char *argv[]) ! 62: { ! 63: int argscan; ! 64: char * InterfaceAddress = NULL; ! 65: RPC_HANDLE Server, Address, Interface; ! 66: RPC_STATUS status; ! 67: ! 68: ! 69: for (argscan = 1; argscan < argc; argscan++) ! 70: { ! 71: if (argv[argscan][0] == '-') ! 72: { ! 73: switch (argv[argscan][1]) ! 74: { ! 75: case 'a': ! 76: case 'A': ! 77: InterfaceAddress = &(argv[argscan][2]); ! 78: break; ! 79: default: ! 80: Usage(); ! 81: } ! 82: } ! 83: else ! 84: Usage(); ! 85: } ! 86: if (InterfaceAddress == NULL) ! 87: #ifndef OLDOS ! 88: InterfaceAddress = "\\device\\namedpipe\\dict"; ! 89: #else // OLDOS ! 90: InterfaceAddress = "\\pipe\\dict"; ! 91: #endif // OLDOS ! 92: ! 93: status = RpcCreateServer((RPC_EVENT_HANDLERS *) 0, &Server); ! 94: printf ("server created\n"); ! 95: if (status) ! 96: { ! 97: printf("RpcCreateServer = %lu\n",status); ! 98: exit(2); ! 99: } ! 100: ! 101: /* Initialize required protocol stack fields */ ! 102: dict_ProtocolStack.StackType = RPC_STACK_TYPE_V1; ! 103: dict_ProtocolStack.TransportType = RPC_TRANSPORT_NAMEPIPE; ! 104: dict_ProtocolStack.TransportInfo = InterfaceAddress; ! 105: dict_ProtocolStack.TransportInfoLength = strlen(InterfaceAddress)+1; ! 106: ! 107: status = RpcAddAddress( ! 108: Server, ! 109: &dict_ProtocolStack, ! 110: 0, // Do not prevent deadlock... ! 111: &Address, ! 112: (void *)0, // Reserved for security information... ! 113: RpcNormalResourceUsage, ! 114: 0L // No timeout... ! 115: ); ! 116: ! 117: printf ("server address added\n"); ! 118: ! 119: if (status) ! 120: { ! 121: printf("RpcAddAddress = %lu\n",status); ! 122: exit(2); ! 123: } ! 124: status = RpcAddInterface( ! 125: Server, ! 126: &dict_ProtocolStack, ! 127: &Interface, ! 128: (void *)0, // Reserved for security information... ! 129: &dict_DispatchTable ! 130: ); ! 131: ! 132: printf ("server interface added\n"); ! 133: ! 134: if (status) ! 135: { ! 136: printf("RpcAddInterface = %lu\n",status); ! 137: exit(2); ! 138: } ! 139: ! 140: /* ! 141: status = RpcExport(Server, 1, &dict_ProtocolStack); ! 142: printf ("server exported\n"); ! 143: ! 144: * The above is required for advertising that the server is serving ! 145: * a particular interface (using a locator or alternatively a ! 146: * directory service / name service). Strictly equired for clients ! 147: * using auto_handle. ! 148: ! 149: */ ! 150: ! 151: if (status) ! 152: { ! 153: printf("RpcExport = %lu\n",status); ! 154: exit(2); ! 155: } ! 156: ! 157: while (1) ! 158: { ! 159: #ifndef OLDOS ! 160: Sleep(5000L); ! 161: #else // OLDOS ! 162: DosSleep(5000L); ! 163: #endif // OLDOS ! 164: ! 165: } ! 166: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.