|
|
1.1 root 1: #include <stdio.h>
2: #include "generic.h" /* defines OPERATIONS and ERRORS */
3: #include <isode/rosap.h>
4:
5: #define error printf
6:
7: /* e.g., "directory" */
8: static char *myservice = "ROSPTEST";
9:
10: /* e.g., "directory services" */
11: static char *mycontext = "isode chic read";
12: static char *mypci = "isode chic read pci";
13:
14:
15: #define INVOKE 1 /* do a RoInvokeRequest */
16: #define INTREQ 2 /* do a RoIntrRequest */
17: #define INVERR 3 /* request an error */
18: #define INVURJ 4 /* request a user reject */
19: #define INVPRJ 5 /* request a provider reject */
20:
21: main (argc, argv, envp)
22: int argc;
23: char **argv,
24: **envp;
25: {
26: int sd;
27: struct SSAPref sfs;
28: register struct SSAPref *sf;
29: register struct PSAPaddr *pa;
30: struct AcSAPconnect accs;
31: register struct AcSAPconnect *acc = &accs;
32: struct AcSAPrelease acrs;
33: register struct AcSAPrelease *acr = &acrs;
34: struct AcSAPindication acis;
35: register struct AcSAPindication *aci = &acis;
36: register struct AcSAPabort *aca = &aci -> aci_abort;
37: struct RoSAPindication rois;
38: register struct RoSAPpreject *rop = &rois.roi_preject;
39: register AEI aei;
40: register OID ctx, pci;
41: struct PSAPctxlist pcs;
42: register struct PSAPctxlist *pc = &pcs;
43: int servicetype = RoP;
44:
45: if ((aei = str2aei (argv[1], myservice)) == NULLAEI)
46: error ("%s-%s: unknown application-entity", argv[1], myservice);
47: if ((pa = aei2addr (aei)) == NULLPA)
48: error ("address translation failed");
49: if ((ctx = ode2oid (mycontext)) == NULLOID)
50: error ("%s: unknown object descriptor", mycontext);
51: if ((ctx = oid_cpy (ctx)) == NULLOID)
52: error ("oid_cpy");
53: if ((pci = ode2oid (mypci)) == NULLOID)
54: error ("%s: unknown object descriptor", mypci);
55: if ((pci = oid_cpy (pci)) == NULLOID)
56: error ("oid_cpy");
57: pc -> pc_nctx = 1;
58: pc -> pc_ctx[0].pc_id = 1;
59: pc -> pc_ctx[0].pc_asn = pci;
60: pc -> pc_ctx[0].pc_atn = NULLOID;
61:
62:
63: if ((sf = addr2ref (PLocalHostName ())) == NULL) {
64: sf = &sfs;
65: (void) bzero ((char *) sf, sizeof *sf);
66: }
67:
68: if (AcAssocRequest (ctx, NULLAEI, NULLAEI, NULLPA, pa, pc, NULLOID,
69: 0, ROS_MYREQUIRE, SERIAL_NONE, 0, sf, NULLPEP, 0, NULLQOS,
70: acc, aci)
71: == NOTOK)
72: error ("A-ASSOCIATE.REQUEST: %s", AcErrString (aca -> aca_reason));
73:
74: if (acc -> acc_result != ACS_ACCEPT)
75: error ("association rejected: %s", AcErrString (aca -> aca_reason));
76:
77: sd = acc -> acc_sd;
78:
79: if (RoSetService (sd, RoPService, &rois) == NOTOK)
80: error ("RoSetService: %s", RoErrString (rop -> rop_reason));
81:
82: invoke (sd, INVOKE); /* invoke the operations, etc. */
83:
84: invoke (sd, INTREQ); /* invoke the operations, etc. */
85:
86: invoke (sd, INVERR); /* invoke the operations, etc. */
87:
88: invoke (sd, INVURJ); /* invoke the operations, etc. */
89:
90: invoke (sd, INVPRJ); /* invoke the operations, etc. */
91:
92: if (AcRelRequest (sd, ACF_NORMAL, NULLPEP, 0, NOTOK, acr, aci) == NOTOK)
93: error ("A-RELEASE.REQUEST: %s", AcErrString (aca -> aca_reason));
94:
95: if (!acr -> acr_affirmative) {
96: (void) AcUAbortRequest (sd, NULLPEP, 0, aci);
97: error ("release rejected by peer: %d", acr -> acr_reason);
98: }
99:
100: ACRFREE (acr);
101:
102: exit (0);
103: }
104:
105: /*
106: * Test example
107: */
108: invoke(sd, type)
109: int sd;
110: int type; /* of invocation */
111: {
112: int invoke;
113: struct RoSAPindication rind;
114: int res;
115:
116: invoke = 1;
117:
118: switch (type) {
119: case INVOKE:
120: res = RoInvokeRequest(sd, APDU_OP1, ROS_SYNC, NULLPE, invoke, NULLIP,
121: ROS_NOPRIO, &rind);
122: break;
123:
124: case INTREQ:
125: res = RoIntrRequest(sd, APDU_OP1, NULLPE, invoke, NULLIP, ROS_NOPRIO,
126: &rind);
127: break;
128:
129: case INVERR:
130: res = RoInvokeRequest(sd, APDU_ERR, ROS_SYNC, NULLPE, invoke, NULLIP,
131: ROS_NOPRIO, &rind);
132: break;
133:
134: case INVURJ:
135: res = RoInvokeRequest(sd, APDU_URJ, ROS_SYNC, NULLPE, invoke, NULLIP,
136: ROS_NOPRIO, &rind);
137: break;
138:
139: case INVPRJ:
140: res = RoInvokeRequest(sd, APDU_PRJ, ROS_SYNC, NULLPE, invoke, NULLIP,
141: ROS_NOPRIO, &rind);
142: break;
143:
144: default:
145: fprintf(stderr, "invoke called with illegal type %d\n", type);
146: exit(1);
147:
148: }
149:
150: switch (res) {
151: case NOTOK:
152: if (rind.roi_type == ROI_PREJECT)
153: error("RO-INVOKE.REQUEST: %s\n",
154: RoErrString(rind.roi_preject.rop_reason));
155: else
156: error("RO-INVOKE.REQUEST:failed: unexpected returned type %d\n",
157: rind.roi_type);
158: exit(1);
159:
160: case OK:
161: break;
162:
163: default:
164: error("RO-INVOKE.REQUEST:failed(%d): unexpected returned type %d\n",
165: res, rind.roi_type);
166: exit(2);
167:
168: }
169:
170: switch (rind.roi_type) {
171: case ROI_RESULT:
172: if (rind.roi_result.ror_id == invoke)
173: printf("Result received\n");
174: else
175: printf("Result for wrong request %d\n", rind.roi_result.ror_id);
176: break;
177:
178: case ROI_ERROR:
179: if (rind.roi_error.roe_id == invoke)
180: printf("Error received\n");
181: else
182: printf("Error for wrong request %d\n", rind.roi_error.roe_id);
183: break;
184:
185: case ROI_UREJECT:
186: if (rind.roi_ureject.rou_id == invoke)
187: printf("User Reject received reason %d\n",
188: rind.roi_ureject.rou_reason);
189: else
190: printf("User Reject for wrong request %d\n",
191: rind.roi_ureject.rou_id);
192: break;
193:
194: case ROI_PREJECT:
195: if (rind.roi_preject.rop_id == invoke)
196: printf("Provider Reject received %s\n",
197: RoErrString(rind.roi_preject.rop_reason));
198: else
199: printf("Provider Reject for wrong request %d\n",
200: rind.roi_preject.rop_id);
201: break;
202:
203: default:
204: printf("Unexpected reply received %d\n", rind.roi_type);
205: break;
206: }
207:
208: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.