#ifndef lint static char sccsid[] = "@(#)rpc←svcout.c 1.1 90/10/29 (C) 1987 SMI"; #endif /* * rpc←svcout.c, Server-skeleton outputter for the RPC protocol compiler * Copyright (C) 1987, Sun Microsytsems, Inc. */ #include <stdio.h> #include <strings.h> #include "rpc←parse.h" #include "rpc←util.h" static char RQSTP[] = "rqstp"; static char TRANSP[] = "transp"; static char ARG[] = "argument"; static char RESULT[] = "result"; static char ROUTINE[] = "local"; char ←errbuf[256]; /* For all messages */ /* * Write the objects and procedures for a particular version of a particular * program. */ void write←server←prog(svcName, progName, vers) char *svcName; char *progName; version←list *vers; { char pvName[256]; proc←list *proc; char *firstFlag = "|"; char *srcMethod; char *inParm, *outParm; definition *defStruct; decl←list *dl; int expandFlag; extern definition *FindStructDefn(); char *h, *c, *o, *out; char buf[128]; char *mName; char *sp; CurrentProgNameFlag++; sprintf(pvName, "%s%s", progName, vers->vers←num); if (PCedar) { if (PCedarUDP) { f←print(fout, "Export%s: PUBLIC PROC[p: %s.%s] = {\n", pvName, svcName, pvName); f←print(fout, " o: %s.%s ← NEW[%s.%sObject];\n", svcName, pvName, svcName, pvName); f←print(fout, " %sServer: %s.Server ← %s.CreateServer[\n", pvName, SunRPC, SunRPC); f←print(fout, "\t\t%s.%s, %s, %sHandler, \n", svcName, progName, vers->vers←num, pvName); f←print(fout, "\t\t%s.nullPort, 3, o];\n", SunRPC); f←print(fout, " [] ← SunPMapLocal.UnsetLocal[%s.%s, %s];\n", svcName, progName, vers->vers←num); f←print(fout, " [] ← SunPMapLocal.SetLocal[%s.%s, %s, SunPMap.ipProtocolUDP,\n", svcName, progName, vers->vers←num); f←print(fout, "\t\tBasics.Card16FromH[%s.GetServerPort[%sServer]]];\n", SunRPC, pvName); for (proc = vers->procs; proc != NULL; proc = proc->next) { f←print(fout, " o.%s ← p.%s;\n", locase(proc->proc←name), locase(proc->proc←name)); } f←print(fout, " };\n\n"); } else { /* PCedarTCP */ f←print(fout, "ExportStream%s: PUBLIC PROC[p: %s.%s] = {\n", pvName, svcName, pvName); f←print(fout, " o: %s.%s ← NEW[%s.%sObject];\n", svcName, pvName, svcName, pvName); f←print(fout, " %sServer: %s.Server ← %s.CreateServer[\n", pvName, SunRPC, SunRPC); f←print(fout, "\t\t%s.%s, %s, %sHandler, \n", svcName, progName, vers->vers←num, pvName); f←print(fout, "\t\t$ARPA, NIL, o];\n"); f←print(fout, " local: ROPE;\n"); f←print(fout, " port: CARD32;\n"); f←print(fout, " [] ← SunPMapLocal.UnsetLocal[%s.%s, %s];\n", svcName, progName, vers->vers←num); f←print(fout, " [,local] ← %s.GetServerInfo[%sServer];\n", SunRPC, pvName); f←print(fout, " port ← Convert.CardFromRope[Rope.Substr[local, Rope.FindBackward[local, \":\"]+1]];\n"); f←print(fout, " [] ← SunPMapLocal.SetLocal[%s.%s, %s, SunPMap.ipProtocolTCP, port];\n", svcName, progName, vers->vers←num); for (proc = vers->procs; proc != NULL; proc = proc->next) { f←print(fout, " o.%s ← p.%s;\n", locase(proc->proc←name), locase(proc->proc←name)); } f←print(fout, " };\n\n"); } } else { if (BadProgNameFlag[CurrentProgNameFlag]) { f←print(fout, "Make%s%sServer: PUBLIC PROC[\n", svcName, pvName); } else { f←print(fout, "Make%sServer: PUBLIC PROC[\n", pvName); } f←print(fout, " data: REF,\n"); for (proc = vers->procs; proc != NULL; proc = proc->next) { f←print(fout, " %s: %s.%sProc", locase(proc->proc←name), svcName, locase(proc->proc←name)); if (proc->next != NULL) f←print(fout, ",\n"); else f←print(fout, "\n"); } f←print(fout, " ] RETURNS [%s.Server] ~ {\n\n", SunRPC); if (BadProgNameFlag[CurrentProgNameFlag]) { f←print(fout, " pseudoClient: %s.%s%s ~\n", svcName, svcName, pvName); f←print(fout, "\tNEW[%s.%s%sObject ← [\n", svcName, svcName, pvName); } else { f←print(fout, " pseudoClient: %s.%s ~\n", svcName, pvName); f←print(fout, "\tNEW[%s.%sObject ← [\n", svcName, pvName); } f←print(fout, "\t\trpcHandle ~ NIL, rpcConversation ~ NIL, data ~ data,\n"); for (proc = vers->procs; proc != NULL; proc = proc->next) { f←print(fout, "\t\t%s ~ %s", locase(proc->proc←name), locase(proc->proc←name)); if (proc->next != NULL) f←print(fout, ",\n"); else f←print(fout, "\n"); } f←print(fout, "\t]];\n\n"); f←print(fout, "unbound: %s.Server ~ NEW[SunRPC.ServerObject ← [\n", SunRPC); if (BadProgNameFlag[CurrentProgNameFlag]) { f←print(fout, "\tpgm ~ %s.%sPrognum,\n", svcName, svcName); } else { f←print(fout, "\tpgm ~ %s.%s,\n", svcName, progName); } f←print(fout, "\tversion ~ %s.%s,\n", svcName, vers->vers←name); f←print(fout, "\tclientData ~ pseudoClient,\n"); if (BadProgNameFlag[CurrentProgNameFlag]) { f←print(fout, "\tserverProc ~ %s%sHandler\n", svcName, pvName); } else { f←print(fout, "\tserverProc ~ %sHandler\n", pvName); } f←print(fout, "\t]];\n\n"); f←print(fout, "RETURN [unbound];\n"); f←print(fout, " };\n\n"); } if (BadProgNameFlag[CurrentProgNameFlag]) { f←print(fout, "%s%sHandler: %s.ServerProc -- [h: Handle, c: Conversation, proc: CARD, clientData: REFANY\n", svcName, pvName, SunRPC); } else { f←print(fout, "%sHandler: %s.ServerProc -- [h: Handle, c: Conversation, proc: CARD, clientData: REFANY\n", pvName, SunRPC); } if (PCedarTCP) { f←print(fout, "\t\t-- RETURNS [doReply: BOOLEAN] -- = {\n"); } else { /* PCedarUDP or Cedar10 */ f←print(fout, "\t\t-- RETURNS [doReply: BOOLEAN, replyTimeToLive: CARDINAL] -- = {\n"); } if (BadProgNameFlag[CurrentProgNameFlag]) { f←print(fout, " o: %s.%s%s ← NARROW[clientData];\n", svcName, svcName, pvName); } else { f←print(fout, " o: %s.%s ← NARROW[clientData];\n", svcName, pvName); } f←print(fout, " doReply ← TRUE;\n"); if (!PCedarTCP) /* PCedarUDP or Cedar10 */ f←print(fout, " replyTimeToLive ← defaultReplyTTL;\n"); f←print(fout, " SELECT proc FROM\n"); for (proc = vers->procs; proc != NULL; proc = proc->next) { f←print(fout, " %s => %s%s[h, c, o];\n", proc->proc←num, locase(proc->proc←name), vers->vers←num); } f←print(fout, " ENDCASE => ERROR %s.Error[$wrongProc];\n", SunRPC); f←print(fout, " };\n\n"); for (proc = vers->procs; proc != NULL; proc = proc->next) { expandFlag = FALSE; h = "h"; c = "c"; o = "o"; out = "out"; if (ExpandProcArgs) { defStruct = FindStructDefn(proc->arg←type); if (defStruct != NULL) { h = FindUniqueName("h", defStruct->def.st.decls); c = FindUniqueName("c", defStruct->def.st.decls); o = FindUniqueName("o", defStruct->def.st.decls); out = FindUniqueName("out", defStruct->def.st.decls); } } if (BadProgNameFlag[CurrentProgNameFlag]) { f←print(fout, "%s%s: PROC[%s: Handle, %s: Conversation, %s: %s.%s%s] = {\n", locase(proc->proc←name), vers->vers←num, h, c, o, svcName, svcName, pvName); } else { f←print(fout, "%s%s: PROC[%s: Handle, %s: Conversation, %s: %s.%s] = {\n", locase(proc->proc←name), vers->vers←num, h, c, o, svcName, pvName); } if (ExpandProcArgs && defStruct != NULL && defStruct->def←kind == DEF←STRUCT) { expandFlag = TRUE; for (dl = defStruct->def.st.decls; dl != NULL; dl = dl->next) { pdeclaration(defStruct->def←name, &(dl->decl), 4, FALSE); f←print(fout, ";\n"); } } else if (!streq(proc->arg←type, "void")) { f←print(fout, " in: %s;\n", MapToCedarType(proc->arg←type, FALSE)); } if (!streq(proc->res←type, "void")) f←print(fout, " %s: %s;\n", out, MapToCedarType(proc->res←type, FALSE)); if (expandFlag) { for (dl = defStruct->def.st.decls; dl != NULL; dl = dl->next) { emit←get←stat(&(dl->decl), "", "", FALSE, h, defStruct->def←name); } } else { if (!streq(proc->arg←type, "void")) { srcMethod = rpcgenBaseType(proc->arg←type); if (srcMethod != NULL) f←print(fout, " in ← %s.Get%s[%s];\n", SunRPC, srcMethod, h); else { mName = ModuleName(proc->arg←type); f←print(fout, " in ← %sGetPut.Get%s[%s];\n", mName, StripPrefix(mName, proc->arg←type), h); } inParm = ", in"; } else inParm = ""; } if (streq(proc->res←type, "void")) outParm = ""; else { sprintf(buf, "%s ← ", out); outParm = buf; } if (expandFlag) { f←print(fout, " %so.%s[%s,\n", outParm, locase(proc->proc←name), o); for (dl = defStruct->def.st.decls; dl != NULL; dl = dl->next) { f←print(fout, "\t\t\t%s", dl->decl.name); if (dl->next != NULL) f←print(fout, ",\n"); else f←print(fout, "];\n"); } } else { f←print(fout, " %so.%s[%s%s];\n", outParm, locase(proc->proc←name), o, inParm); } f←print(fout, " %s.StartReply[%s];\n", SunRPC, h); if (!streq(proc->res←type, "void")) { srcMethod = rpcgenBaseType(proc->res←type); if (srcMethod != NULL) f←print(fout, " %s.Put%s[%s, %s];\n", SunRPC, srcMethod, h, out); else { mName = ModuleName(proc->res←type); if (streq(mName, svcName)) sp = proc->res←type; else sp = StripPrefix(mName, proc->res←type); f←print(fout, " %sGetPut.Put%s[%s, %s];\n", mName, sp, h, out); } } f←print(fout, "};\n\n"); } f←print(fout, "\n"); }