From: SMTP%"DSJ@WKUVX1.WKU.EDU" 9-APR-1994 15:57:11.20 To: EVERHART CC: Subj: DECEMBER93.RPC X-FileServer: Digital Systems Journal File Server Date: Sat, 09 Apr 1994 14:21:55 CDT Sender: DSJ-Mgr@WKUVX1.WKU.EDU Errors-To: DSJ-Mgr@WKUVX1.WKU.EDU Warnings-To: <> From: DSJ-Mgr@WKUVX1.WKU.EDU Reply-To: DSJ@WKUVX1.WKU.EDU Subject: DECEMBER93.RPC To: EVERHART@arisia.gce.com $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created: $! Name : RPC $! By : Hunter Goatley $! Date : 4-FEB-1994 11:45:05.67 $! Using: VMS_SHARE 8.4, (C) 1993 Andy Harper, Kings College London UK $! $! Credit is due to these people for their original ideas: $! James Gray, Michael Bednarek $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. RPC.DSJ;1 $! $ set="set" $ set symbol/scope=(nolocal,noglobal) $ f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID")) $ e="write sys$error ""%UNPACK"", " $ w="write sys$output ""%UNPACK"", " $ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!" $ if f$getsyi("CPU") .gt. 127 then $ goto start $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $unpack: subroutine ! P1=filename, P2=checksum, P3=attributes,P4=size $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'" $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped" $ delete 'f'* $ exit $dirok: $ x=f$search(P1) $ if x .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped" $ delete 'f'* $ exit $file_absent: $ w "-I-UNPACK, Unpacking ", P5, " of ", P6, " - ", P1, " - ", P4, " Blocks" $ n=P1 $ if P3 .nes. "" then $ n=f $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT/NOJOURNAL 'f'/OUT='n' PROCEDURE GetHex(s,p)LOCAL x1,x2;x1:=INDEX(t,SUBSTR(s,p,1))-1;x2:=INDEX(t, SUBSTR(s,p+1,1))-1;RETURN 16*x1+x2;ENDPROCEDURE;PROCEDURE SkipPartsep LOCAL m; LOOP m:=MARK(NONE);EXITIF m=END_OF(b);DELETE(m);EXITIF INDEX(ERASE_LINE, "-+-+-+-+-+-+-+-+")=1;ENDLOOP;ENDPROCEDURE;PROCEDURE ProcessLine LOCAL c,s,l,b, n,p;c := ERASE_CHARACTER(1);s := ERASE_LINE;IF c = "X" THEN SPLIT_LINE; ENDIF; MOVE_HORIZONTAL(-1);l := LENGTH(s);p := 1;LOOP EXITIF p > l;c := SUBSTR(s,p,1); p := p+1;CASE c FROM ' ' TO '`' ['`']: COPY_TEXT(ASCII(GetHex(s,p))); p:=p+2;[ ' ']: p:=p+1;[INRANGE,OUTRANGE]: COPY_TEXT(c);ENDCASE;ENDLOOP;ENDPROCEDURE; PROCEDURE Decode LOCAL m;POSITION(BEGINNING_OF(b));LOOP m:=MARK(NONE);EXITIF m= END_OF(b);DELETE(m);IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")= 1 THEN SkipPartSep;ELSE ProcessLine;MOVE_HORIZONTAL(1);ENDIF;ENDLOOP; ENDPROCEDURE;SET(FACILITY_NAME,"UNPACK");SET(SUCCESS,OFF);SET(INFORMATIONAL, OFF);t:="0123456789ABCDEF";f:=GET_INFO(COMMAND_LINE,"file_name");b:= CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,GET_INFO(COMMAND_LINE,"output_file")); QUIT; $ if p3 .eqs. "" then $ goto dl $ open/write fdl &f $ write fdl "RECORD" $ write fdl P3 $ close fdl $ w "-I-CONVRFM, Converting record format to ", P3 $ convert/fdl=&f &f-1 &P1 $dl: delete 'f'* $ checksum 'P1' $ if checksum$checksum .nes. P2 then $ - e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ exit $ endsubroutine $start: $! $ create 'f' X========================================================================`20 XFigure`203`20-`20client-server`20interface`20routine`20(pat_rdb.x) X X/*`20RPCL`20protocol`20definition`20for`20a`20remote`20database`20*/ X X%#define`20DATABASE`20"patient_db.dat"`20`20`20`20/*`20'%'`20passes`20the`20de Vfinition`20*/`20 Xconst`20MAX_STR`20=`20256;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20/*`20through`20the`20header`20file`20`20`20*/ X X/*`20Enumerations`20are`20not`20needed`20for`20the`20following`20structure`20* V/`20`20 Xstruct`20record`7B X`20`20`20`20`20string`20firstName;`20`20`20`20`20`20/*`20`20 Vdefine`20the`20maximum`20*/ X`20`20`20`20`20string`20middleInitial;`20`20/*`20possible`20length`20 V*/ X`20`20`20`20`20string`20lastName; X`20`20`20`20`20int`20patient_id; X`20`20`20`20`20string`20location;`20`20`7D; X X/*`20No`20union`20or`20typdef`20are`20necessary`20for`20the`20following`20prog Vram`20definition`20*/`20program XRDBPROG`20 X`7B`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20/*`20Can`20manage`20multiple`20servers`20*/ X`20`20`20`20`20version`20RDBVERS`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20record`20FIRSTNAME_KEY(string)`20 V=`201; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20record`20LASTNAME_KEY(string)`20= V`202; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20record`20PATIENT_ID_KEY(int)`20= V`203; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20record`20LOCATION_KEY(string)`20= V`204; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20int`20ADD_RECORD(record)`20=`205; V X`20`20`20`20`20`7D`20=`201;`20 X`7D`20=`200x20000001;`20`20`20`20/*`20Program`20number`20ranges`20established V`20by`20ONC`20*/ X X X`0C X X========================================================================`20 XFigure`204a`20-`20client`20code`20produced`20by`20RPCGEN`20(pat_rdb_clnt.c) X X#ifdef`20VMS`20 X#include`20"sys$common:`5Bmultinet.include.rpc`5Drpc.h"`20 X#include`20"sys$common:`5Bmultinet.include.SYS`5Dtime.h"`20 X#else`20 X#include`20`20 X#include`20`20 X#endif`20VMS`20 X#include`20"pat_rdb.h"`20 X#define`20DATABASE`20"patient_db.dat"`20`20`20`20/*`20'%'`20passes`20the`20def Vinition`20*/ X Xstatic`20struct`20timeval`20TIMEOUT`20=`20`7B`2025,`200`20`7D; X Xrecord`20*firstname_key_1(argp,`20clnt) X`20`20`20`20`20`20`20`20char`20**argp; X`20`20`20`20`20`20`20`20CLIENT`20*clnt;`20`7B X`20`20`20`20`20`20`20`20static`20record`20res; X X`20`20`20`20`20`20`20`20bzero(`26res,`20sizeof(res)); X`20`20`20`20`20`20`20`20if`20(clnt_call(clnt,`20FIRSTNAME_KEY,`20xdr_wrapstrin Vg,`20argp,`20xdr_record,`20`26res, XTIMEOUT)`20!=`20RPC_SUCCESS)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20(NULL); X X X X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20return`20(`26res);`20`7D X Xrecord`20*lastname_key_1(argp,`20clnt) X`20`20`20`20`20`20`20`20char`20**argp; X`20`20`20`20`20`20`20`20CLIENT`20*clnt;`20`7B X`20`20`20`20`20`20`20`20static`20record`20res; X X`20`20`20`20`20`20`20`20bzero(`26res,`20sizeof(res)); X`20`20`20`20`20`20`20`20if`20(clnt_call(clnt,`20LASTNAME_KEY,`20xdr_wrapstring V,`20argp,`20xdr_record,`20`26res, XTIMEOUT)`20!=`20RPC_SUCCESS)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20(NULL); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20return`20(`26res);`20 X`7D X Xrecord`20*patient_id_key_1(argp,`20clnt) X`20`20`20`20`20`20`20`20int`20*argp; X`20`20`20`20`20`20`20`20CLIENT`20*clnt;`20`7B X`20`20`20`20`20`20`20`20static`20record`20res; X X`20`20`20`20`20`20`20`20bzero(`26res,`20sizeof(res)); X`20`20`20`20`20`20`20`20if`20(clnt_call(clnt,`20PATIENT_ID_KEY,`20xdr_int,`20a Vrgp,`20xdr_record,`20`26res,`20TIMEOUT) X!=`20RPC_SUCCESS)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20(NULL); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20return`20(`26res);`20 X`7D X Xrecord`20*location_key_1(argp,`20clnt) X`20`20`20`20`20`20`20`20char`20**argp; X`20`20`20`20`20`20`20`20CLIENT`20*clnt;`20`7B X`20`20`20`20`20`20`20`20static`20record`20res; X X`20`20`20`20`20`20`20`20bzero(`26res,`20sizeof(res)); X`20`20`20`20`20`20`20`20if`20(clnt_call(clnt,`20LOCATION_KEY,`20xdr_wrapstring V,`20argp,`20xdr_record,`20`26res, XTIMEOUT)`20!=`20RPC_SUCCESS)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20(NULL); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20return`20(`26res);`20 X`7D X Xint`20*add_record_1(argp,`20clnt) X`20`20`20`20`20`20`20`20record`20*argp; X`20`20`20`20`20`20`20`20CLIENT`20*clnt;`20`7B X`20`20`20`20`20`20`20`20static`20int`20res; X X`20`20`20`20`20`20`20`20bzero(`26res,`20sizeof(res)); X`20`20`20`20`20`20`20`20if`20(clnt_call(clnt,`20ADD_RECORD,`20xdr_record,`20ar Vgp,`20xdr_int,`20`26res,`20TIMEOUT)`20!= XRPC_SUCCESS)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20(NULL); X X X X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20return`20(`26res);`20 X`7D`20 X X X`0C X X========================================================================`20 XFigure`204b`20-`20server`20code`20produced`20by`20RPCGEN`20(pat_rdb_svc.c) X X#include`20`20 X#ifdef`20VMS`20 X#include`20"sys$common:`5Bmultinet.include.rpc`5Drpc.h"`20 X#else`20 X#include`20`20 X#endif`20VMS`20 X#include`20"pat_rdb.h"`20 X#define`20DATABASE`20"patient_db.dat"`20`20`20`20/*`20'%'`20passes`20the`20def Vinition`20*/ X Xstatic`20void`20rdbprog_1(); X Xmain()`20 X`7B X`20`20`20`20`20`20`20`20SVCXPRT`20*transp; X X`20`20`20`20`20`20`20`20pmap_unset(RDBPROG,`20RDBVERS); X X`20`20`20`20`20`20`20`20transp`20=`20svcudp_create(RPC_ANYSOCK); X`20`20`20`20`20`20`20`20if`20(transp`20==`20NULL)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,`20"cannot`20cr Veate`20udp`20service.`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(1); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20if`20(!svc_register(transp,`20RDBPROG,`20RDBVERS,`20rd Vbprog_1,`20IPPROTO_UDP))`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,`20"unable`20to V`20register`20(RDBPROG,`20RDBVERS,`20udp).`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(1); X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20transp`20=`20svctcp_create(RPC_ANYSOCK,`200,`200); X`20`20`20`20`20`20`20`20if`20(transp`20==`20NULL)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,`20"cannot`20cr Veate`20tcp`20service.`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(1); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20if`20(!svc_register(transp,`20RDBPROG,`20RDBVERS,`20rd Vbprog_1,`20IPPROTO_TCP))`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,`20"unable`20to V`20register`20(RDBPROG,`20RDBVERS,`20tcp).`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(1); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20svc_run(); X`20`20`20`20`20`20`20`20fprintf(stderr,`20"svc_run`20returned`5Cn"); X`20`20`20`20`20`20`20`20exit(1);`20 X`7D X Xstatic`20void`20rdbprog_1(rqstp,`20transp) X`20`20`20`20`20`20`20`20struct`20svc_req`20*rqstp; X`20`20`20`20`20`20`20`20SVCXPRT`20*transp;`20`7B X`20`20`20`20`20`20`20`20union`20`7B X X X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20char`20*firstname_key_1_arg; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20char`20*lastname_key_1_arg; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20int`20patient_id_key_1_arg; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20char`20*location_key_1_arg; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20record`20add_record_1_arg; X`20`20`20`20`20`20`20`20`7D`20argument; X`20`20`20`20`20`20`20`20char`20*result; X`20`20`20`20`20`20`20`20bool_t`20(*xdr_argument)(),`20(*xdr_result)(); X`20`20`20`20`20`20`20`20char`20*(*local)(); X X`20`20`20`20`20`20`20`20switch`20(rqstp->rq_proc)`20`7B X`20`20`20`20`20`20`20`20case`20NULLPROC: X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20svc_sendreply(transp,`20xdr_vo Vid,`20NULL); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return; X X`20`20`20`20`20`20`20`20case`20FIRSTNAME_KEY: X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_argument`20=`20xdr_wrapstr Ving; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_result`20=`20xdr_record; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20local`20=`20(char`20*(*)())`20 Vfirstname_key_1; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20case`20LASTNAME_KEY: X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_argument`20=`20xdr_wrapstr Ving; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_result`20=`20xdr_record; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20local`20=`20(char`20*(*)())`20 Vlastname_key_1; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20case`20PATIENT_ID_KEY: X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_argument`20=`20xdr_int; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_result`20=`20xdr_record; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20local`20=`20(char`20*(*)())`20 Vpatient_id_key_1; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20case`20LOCATION_KEY: X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_argument`20=`20xdr_wrapstr Ving; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_result`20=`20xdr_record; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20local`20=`20(char`20*(*)())`20 Vlocation_key_1; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20case`20ADD_RECORD: X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_argument`20=`20xdr_record; V X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_result`20=`20xdr_int; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20local`20=`20(char`20*(*)())`20 Vadd_record_1; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20default: X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20svcerr_noproc(transp); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return; X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20bzero(`26argument,`20sizeof(argument)); X`20`20`20`20`20`20`20`20if`20(!svc_getargs(transp,`20xdr_argument,`20`26argume Vnt))`20`7B X X X X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20svcerr_decode(transp); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return; X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20result`20=`20(*local)(`26argument,`20rqstp); X`20`20`20`20`20`20`20`20if`20(result`20!=`20NULL`20`26`26`20!svc_sendreply(tra Vnsp,`20xdr_result,`20result))`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20svcerr_systemerr(transp); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20if`20(!svc_freeargs(transp,`20xdr_argument,`20`26argum Vent))`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,`20"unable`20to V`20free`20arguments`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(1); X`20`20`20`20`20`20`20`20`7D`20 X`7D`20 X X X`0C X X========================================================================`20 XFigure`204c`20-`20filter`20code`20produced`20by`20RPCGEN`20(pat_rdb_xdr.c) X X#ifdef`20VMS`20 X#include`20"sys$common:`5Bmultinet.include.rpc`5Drpc.h"`20 X#else`20 X#include`20`20 X#endif`20VMS`20 X#include`20"pat_rdb.h"`20 X#define`20DATABASE`20"patient_db.dat"`20`20`20`20/*`20'%'`20passes`20the`20def Vinition`20*/ X Xbool_t`20xdr_record(xdrs,`20objp) X`20`20`20`20`20`20`20`20XDR`20*xdrs; X`20`20`20`20`20`20`20`20record`20*objp;`20`7B X`20`20`20`20`20`20`20`20if`20(!xdr_string(xdrs,`20`26objp->firstName,`20MAX_ST VR))`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20(FALSE); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20if`20(!xdr_string(xdrs,`20`26objp->middleInitial,`20MA VX_STR))`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20(FALSE); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20if`20(!xdr_string(xdrs,`20`26objp->lastName,`20MAX_STR V))`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20(FALSE); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20if`20(!xdr_int(xdrs,`20`26objp->patient_id))`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20(FALSE); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20if`20(!xdr_string(xdrs,`20`26objp->location,`20MAX_STR V))`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return`20(FALSE); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20return`20(TRUE);`20 X`7D X X`0C X X`20 X========================================================================`20 XFigure`204d`20-`20server`20code`20produced`20by`20RPCGEN`20(pat_rdb_svc.c) X X#include`20`20 X#ifdef`20VMS`20 X#include`20"sys$common:`5Bmultinet.include.rpc`5Drpc.h"`20 X#else`20 X#include`20`20 X X X X#endif`20VMS`20#include`20"pat_rdb.h"`20 X#define`20DATABASE`20"patient_db.dat"`20`20`20`20/*`20'%'`20passes`20the`20def Vinition`20*/ X Xstatic`20void`20rdbprog_1();`20 Xmain()`20 X`7B X`20`20`20`20`20`20`20`20SVCXPRT`20*transp; X X`20`20`20`20`20`20`20`20pmap_unset(RDBPROG,`20RDBVERS); X X`20`20`20`20`20`20`20`20transp`20=`20svcudp_create(RPC_ANYSOCK); X`20`20`20`20`20`20`20`20if`20(transp`20==`20NULL)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,`20"cannot`20cr Veate`20udp`20service.`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(1); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20if`20(!svc_register(transp,`20RDBPROG,`20RDBVERS,`20rd Vbprog_1,`20IPPROTO_UDP))`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,`20"unable`20to V`20register`20(RDBPROG,`20RDBVERS,`20udp).`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(1); X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20transp`20=`20svctcp_create(RPC_ANYSOCK,`200,`200); X`20`20`20`20`20`20`20`20if`20(transp`20==`20NULL)`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,`20"cannot`20cr Veate`20tcp`20service.`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(1); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20if`20(!svc_register(transp,`20RDBPROG,`20RDBVERS,`20rd Vbprog_1,`20IPPROTO_TCP))`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,`20"unable`20to V`20register`20(RDBPROG,`20RDBVERS,`20tcp).`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(1); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20svc_run(); X`20`20`20`20`20`20`20`20fprintf(stderr,`20"svc_run`20returned`5Cn"); X`20`20`20`20`20`20`20`20exit(1);`20`7D X Xstatic`20void`20rdbprog_1(rqstp,`20transp) X`20`20`20`20`20`20`20`20struct`20svc_req`20*rqstp; X`20`20`20`20`20`20`20`20SVCXPRT`20*transp;`20`7B X`20`20`20`20`20`20`20`20union`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20char`20*firstname_key_1_arg; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20char`20*lastname_key_1_arg; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20int`20patient_id_key_1_arg; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20char`20*location_key_1_arg; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20record`20add_record_1_arg; X`20`20`20`20`20`20`20`20`7D`20argument; X`20`20`20`20`20`20`20`20char`20*result; X`20`20`20`20`20`20`20`20bool_t`20(*xdr_argument)(),`20(*xdr_result)(); X`20`20`20`20`20`20`20`20char`20*(*local)(); X X`20`20`20`20`20`20`20`20switch`20(rqstp->rq_proc)`20`7B X`20`20`20`20`20`20`20`20case`20NULLPROC: X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20svc_sendreply(transp,`20xdr_vo Vid,`20NULL); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return; X X X X`20`20`20`20`20`20`20`20case`20FIRSTNAME_KEY: X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_argument`20=`20xdr_wrapstr Ving; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_result`20=`20xdr_record; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20local`20=`20(char`20*(*)())`20 Vfirstname_key_1; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20case`20LASTNAME_KEY: X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_argument`20=`20xdr_wrapstr Ving; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_result`20=`20xdr_record; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20local`20=`20(char`20*(*)())`20 Vlastname_key_1; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20case`20PATIENT_ID_KEY: X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_argument`20=`20xdr_int; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_result`20=`20xdr_record; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20local`20=`20(char`20*(*)())`20 Vpatient_id_key_1; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20case`20LOCATION_KEY: X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_argument`20=`20xdr_wrapstr Ving; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_result`20=`20xdr_record; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20local`20=`20(char`20*(*)())`20 Vlocation_key_1; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20case`20ADD_RECORD: X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_argument`20=`20xdr_record; V X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20xdr_result`20=`20xdr_int; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20local`20=`20(char`20*(*)())`20 Vadd_record_1; X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20default: X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20svcerr_noproc(transp); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return; X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20bzero(`26argument,`20sizeof(argument)); X`20`20`20`20`20`20`20`20if`20(!svc_getargs(transp,`20xdr_argument,`20`26argume Vnt))`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20svcerr_decode(transp); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return; X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20result`20=`20(*local)(`26argument,`20rqstp); X`20`20`20`20`20`20`20`20if`20(result`20!=`20NULL`20`26`26`20!svc_sendreply(tra Vnsp,`20xdr_result,`20result))`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20svcerr_systemerr(transp); X`20`20`20`20`20`20`20`20`7D X`20`20`20`20`20`20`20`20if`20(!svc_freeargs(transp,`20xdr_argument,`20`26argum Vent))`20`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,`20"unable`20to V`20free`20arguments`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(1); X`20`20`20`20`20`20`20`20`7D`20 X`7D`20 X X X`0C X X========================================================================`20 XFigure`204e`20-`20include`20file`20produced`20by`20RPCGEN`20(pat_rdb.h) X X X X X#define`20DATABASE`20"patient_db.dat"`20`20`20`20/*`20'%'`20passes`20the`20def Vinition`20*/`20 X#define`20MAX_STR`20256 X Xstruct`20record`20`7B X`20`20`20`20`20`20`20`20char`20*firstName; X`20`20`20`20`20`20`20`20char`20*middleInitial; X`20`20`20`20`20`20`20`20char`20*lastName; X`20`20`20`20`20`20`20`20int`20patient_id; X`20`20`20`20`20`20`20`20char`20*location;`20`7D;`20typedef`20struct`20record V`20record;`20bool_t`20xdr_record(); X X X#define`20RDBPROG`20((u_long)0x20000001)`20 X#define`20RDBVERS`20((u_long)1)`20 X#define`20FIRSTNAME_KEY`20((u_long)1)`20extern`20record`20*firstname_key_1(); V`20 X#define`20LASTNAME_KEY`20((u_long)2)`20extern`20record`20*lastname_key_1();`20 V X#define`20PATIENT_ID_KEY`20((u_long)3)`20extern`20record`20*patient_id_key_1() V;`20 X#define`20LOCATION_KEY`20((u_long)4)`20extern`20record`20*location_key_1();`20 V X#define`20ADD_RECORD`20((u_long)5)`20extern`20int`20*add_record_1(); X X`0C X X========================================================================`20 XFigure`205`20-`20user-written`20server`20code`20(pat_rdb_svc_proc.c) X X/*`20Remote`20database`20service`20procedures.`20No`20errors`20are`20given`20i Vf`20the`20database`20file`20is Xnot`20found`20or`20the`20searched`20record`20is`20not`20found.`20Currently,`20 Vthe`20add`20record`20function`20is Xdisabled.`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ V X X#include`20`20 X#include`20`20 X#ifdef`20VMS`20 X#include`20"sys$common:`5Bmultinet.include.rpc`5Drpc.h"`20 X#else`20 X#include`20`20 X#endif`20VMS`20 X#include`20"pat_rdb.h"`20FILE`20*fp`20=`20NULL;`20 Xstatic`20record`20*patient_Rec`20=`20NULL;`20 Xint`20readRecord()`20`20`20`20`20`20`20`20`20`20`20`20/*`20utility`20reads`20o Vne`20record`20*/`20 X`7B`20`20`20`20 X`20`20`20`20`20`20`20`20char`20buf`5BMAX_STR`5D;`20`20`20`20 X`20`20`20`20`20`20`20`20if(!patient_Rec)`7B`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20`20patient_Rec`20=`20(record`20*)malloc(sizeo Vf(record));`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20`20patient_Rec->firstName`20=`20(char`20*)mal Vloc(MAX_STR);`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20`20patient_Rec->middleInitial`20`20=`20(char V`20*)malloc(MAX_STR);`20 X`20`20`20`20`20`20`20`20`20`20`20`20patient_Rec->lastName`20=`20(char`20*)mall Voc(MAX_STR);`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20`20patient_Rec->location`20=`20(char`20*)mall Voc(MAX_STR);`20`20`20`20 X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20if(!fgets(buf,`20MAX_STR`20-`201,`20fp))`20return(0); V`20`20`20`20 X`20`20`20`20`20`20`20`20if(sscanf(buf,"%s%s%s%d%s",`20patient_Rec->firstName, V`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20`20patient_Rec->middleInitial,`20patient_Rec- V>lastName,`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20`20`26(patient_Rec->patient_id),`20patient_Re Vc->location)`20!=`205)`20return(0); X`20`20`20`20`20`20`20`20return(1);`20 X X X X`7D X Xrecord`20*lastname_key_1(name)`20 Xchar`20**name;`20 X`7B`20`20`20 X`20`20`20`20`20`20`20`20if(!(fp`20=`20fopen(DATABASE,"r")))return((record`20*) V`20NULL);`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20`20while(readRecord())`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20`20if(!strcmp(patient_Rec->lastName,`20*name) V)`20break;`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20`20if`20feof(fp)`7B`20`20`20`20`20`20`20`20 V`20 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fclose(fp);`20`20`20`20`20`20 V`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return((record`20*)NULL);`20 V`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20`20`7D`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20`20fclose(fp);`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20`20return((record`20*)patient_Rec);`20 X`7D X Xrecord`20*firstname_key_1(name)`20 Xchar`20**name;`20 X`7B`20`20`20 X`20if(!(fp`20=`20fopen(DATABASE,"r")))return((record`20*)`20NULL);`20`20`20`20 V`20`20`20 X`20`20`20`20`20`20`20`20while(readRecord())`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20if(!strcmp(patient_Rec->firstName,`20*name))`20break; V`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20if`20feof(fp)`7B`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20fclose(fp);`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20return((record`20*)NULL);`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`7D`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20fclose(fp);`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20return((`20record`20*)`20patient_Rec);`20 X`7D X Xrecord`20*patient_id_key_1(id)`20 Xint`20*id;`20 X`7B`20`20`20 X`20`20if(!(fp`20=`20fopen(DATABASE,"r")))return((record`20*)`20NULL);`20`20`20 V`20`20`20`20 X`20`20`20`20`20`20`20`20while(readRecord())`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20if(patient_Rec->patient_id`20==`20*id)`20break;`20`20 V`20`20`20`20`20 X`20`20`20`20`20`20`20`20if`20feof(fp)`7B`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20fclose(fp);`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20return((record`20*)NULL);`20`20`20`20`20`20`20 X`7D`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20fclose(fp);`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20return((`20record`20*)`20patient_Rec);`20 X`7D X Xrecord`20*location_key_1(name)`20 Xchar`20**name;`20 X`7B`20`20`20 X`20`20if(!(fp`20=`20fopen(DATABASE,"r")))return((record`20*)`20NULL);`20`20`20 V`20`20`20`20 X`20`20`20`20`20`20`20`20while(readRecord())`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20if(!strcmp(patient_Rec->location,`20*name))`20break; V`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20if`20feof(fp)`7B`20`20`20`20`20`20`20`20`20 X X X X`20`20`20`20`20`20`20`20`20`20fclose(fp);`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20return((record`20*)NULL);`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`7D`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20fclose(fp);`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20return((`20record`20*)`20patient_Rec);`20 X`7D X Xint`20*add_record_1(r)`20 Xrecord`20*r;`20 X`7B`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20static`20int`20status;`20`20`20`20`20`20/*`20Note:`20t Vhis`20doesn't`20do`20anything`20useful`20*/ X`20`20`20`20`20`20`20`20return((int`20*)`20`26status);`20 X`7D X X`0C X X========================================================================`20 XFigure`206`20-`20user-written`20client`20code`20(pat_rdb.c) X X/*`20Client`20application`20for`20rdb.`20When`20matching`20strings,`20use`20th Ve`20exact`20case.`20Thus, Xwhen`20using`20VMS,`20quote`20the`20search`20string`20so`20prevent`20alteratio Vns`20by`20the`20CLI!`20*/ X X#include`20`20 X#include`20`20 X#ifdef`20VMS`20 X#include`20"sys$common:`5Bmultinet.include.rpc`5Drpc.h"`20 X#include`20`20 X#else`20 X#include`20`20 X#endif`20VMS`20 X#include`20"pat_rdb.h"`20 X#define`20PRINTRECORD(patient_Rec)`7B`20`5C`20`20`20`20`20 X`20`20`20`20`20`20`20`20printf("first`5Ctmiddle`5Ctlast`5Ctpat`20ID`5Ctlocatio Vn`5Cn");`20`5C X`20`20`20`20`20`20`20`20printf("%s`5Ct%s`5Ct%s`5Ct%d`5Ct%s`5Cn",`20`5C`20`20 V`20`20`20 X`20`20`20`20`20`20`20`20patient_Rec->firstName,`20patient_Rec->middleInitial, V`20`5C`20`20`20`20`20 X`20`20`20`20`20`20`20`20patient_Rec->lastName,`20patient_Rec->patient_id,`20 V`5C`20`20`20`20`20 X`20`20`20`20`20`20`20`20patient_Rec->location);`20`7D X Xmain(argc,`20argv)`20 Xint`20argc;`20 Xchar`20*argv`5B`5D;`20 X`7B`20`20`20`20`20 X`20`20`20`20`20`20`20`20CLIENT`20*cl;`20`20`20`20`20`20`20`20/*`20client`20han Vdle`20*/`20`20`20`20`20 X`20`20`20`20`20`20`20`20char`20*value;`20`20`20`20`20 X`20`20`20`20`20`20`20`20int`20key;`20`20`20`20`20 X`20`20`20`20`20`20`20`20if((argc`20!=`204)`20`7C`7C`20(!isdigit(argv`5B2`5D`5B V0`5D)))`7B`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20fprintf(stderr,`20"Usage:`20%s`20server`20key`20 Vvalue`5Cn",`20argv`5B0`5D);`20`20`20`20`20`20`20 X`20`20exit(1);`20`20`20`20`20 X`7D`20`20`20`20`20 Xif(!(cl`20=`20clnt_create(argv`5B1`5D,`20RDBPROG,`20RDBVERS,`20"tcp")))`7B`20 V`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20clnt_pcreateerror(argv`5B1`5D);`20`20/*`20CLIENT`20 Vhandle`20not`20created`20*/`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20exit(1);`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20/*`20missing`20server`20*/`20`20`20`20`20 X`7D`20`20`20`20`20 X X X Xvalue`20=`20argv`5B3`5D;`20`20`20`20`20 Xswitch(key`20=`20atol(argv`5B2`5D))`7B X X`20`20`20`20`20`20case`20FIRSTNAME_KEY:`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20PRINTRECORD(firstname_key_1(`26value,`20cl));`20`20`20 V`20`20`20`20`20 X`20`20`20`20`20`20break; X X`20`20`20`20`20`20case`20LASTNAME_KEY:`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20PRINTRECORD(lastname_key_1(`26value,`20cl));`20`20`20 V`20`20`20`20`20 X`20`20`20`20`20`20break; X X`20`20`20`20`20`20case`20PATIENT_ID_KEY:`7B`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20int`20p;`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20if`20((sscanf(argv`5B3`5D,`20"%d",`20`26p))`20!=`201) V`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,"`5C"PATIENT_ID V_KEY`5C"`20requires`20integer`20value`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(1);`20`20`20`20`20`20`20 V`20`20`20 X`20`20`20`20`20`20`20`20`7D`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20PRINTRECORD(patient_id_key_1(`26p,`20cl));`20 V`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20break;`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20case`20LOCATION_KEY:`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20PRINTRECORD(location_key_1(`26value,`20cl));`20 V`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20break; X X`20`20`20`20`20`20`20`20case`20ADD_RECORD:`7B`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20record`20*patient_Rec`20=`20(record`20*)malloc(s Vizeof(record));`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20patient_Rec->firstName`20=`20(char`20*)malloc(MA VX_STR);`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20patient_Rec->middleInitial`20`20=`20(char`20*)ma Vlloc(MAX_STR);`20`20 X`20`20`20`20`20`20`20`20`20`20patient_Rec->lastName`20=`20(char`20*)malloc(MAX V_STR);`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20patient_Rec->location`20=`20(char`20*)malloc(MAX V_STR);`20 X`20`20`20`20`20`20`20`20`20`20if(sscanf(argv`5B3`5D,"%s%s%s%d%s",`20patient_Re Vc->firstName,`20 X`20`20`20`20`20`20`20`20`20`20`20`20`20patient_Rec->middleInitial,patient_Rec- V>lastName, X`20`20`20`20`20`20`20`20`20`20`20`20`20`26(patient_Rec->patient_id),`20patient V_Rec->location)`20!=`205)`7B X`20`20`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,`20`20`20`20`20`20`20`20 V`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20`20`20"`5C"ADD_RECORD`5C"`20requires`20a`20co Vmplete`20quoted`20record`5Cn"); X`20`20`20`20`20`20`20`20`20`20`20`20`20exit(1);`20`20`20`20`20`20`20`20`20`20 V X`20`20`20`20`20`20`20`20`7D`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20if(!(*add_record_1(patient_Rec,`20cl)))`7B`20`20`20`20 V`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,`20"couldn't`20add`20the`20rec Vord`5Cn");`20`20`20`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`20exit(1);`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`20`20`7D`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20break;`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20`7D X X`20`20`20`20`20`20`20`20default:`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20fprintf(stderr,`20"%s:`20unknown`20key`5Cn",`20argv`5B V0`5D);`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20exit(1);`20`20`20`20 X`20`20`20`7D`20 X`7D`20 $ call unpack RPC.DSJ;1 1428545902 "" 36 1 1 $ v=f$verify(v) $ exit