1 /*****************************************************************************/
2 /* Software Testing Automation Framework (STAF) */
3 /* (C) Copyright IBM Corp. 2001 */
4 /* */
5 /* This software is licensed under the Eclipse Public License (EPL) V1.0. */
6 /*****************************************************************************/
7
8 #include <cstdio>
9 #include <string.h>
10 #include "STAF_rexx.h"
11 #include "RexxVar.h"
12 #include "STAF.h"
13
14 extern "C"
15 {
16
17 #if defined(STAF_OS_NAME_HPUX) && !defined(__ia64)
18 void _main();
19 #endif
20
21 // These cause problems with REXX headers on AIX
22 //
23 // RexxFunctionHandler STAFLoadFuncs;
24 // RexxFunctionHandler RXSTAFRegister;
25 // RexxFunctionHandler RXSTAFUnRegister;
26 // RexxFunctionHandler RXSTAFSubmit;
27 // RexxFunctionHandler RXSTAFDropFuncs;
28
29 static char *NameTable[] =
30 {
31 "STAFRegister",
32 "STAFUnRegister",
33 "STAFSubmit",
34 "STAFDropFuncs"
35 };
36
37 static char *FunctionTable[] =
38 {
39 "RXSTAFRegister",
40 "RXSTAFUnRegister",
41 "RXSTAFSubmit",
42 "RXSTAFDropFuncs"
43 };
44
45
STAFLoadFuncs(UCHAR *,ULONG argc,RXSTRING *,PSZ,RXSTRING * retstring)46 ULONG APIENTRY STAFLoadFuncs(UCHAR *, ULONG argc, RXSTRING *, PSZ,
47 RXSTRING *retstring)
48 {
49 #if defined(STAF_OS_NAME_HPUX) && !defined(__ia64)
50 _main();
51 #endif
52
53 if (argc != 0)
54 return 40;
55
56 for(int i = 0; i < (sizeof(FunctionTable) / sizeof(char *)); ++i)
57 {
58 RexxRegisterFunctionDll(NameTable[i], "RXSTAF", FunctionTable[i]);
59 }
60
61 retstring->strptr[0] = 0;
62 retstring->strlength = 0;
63
64 return 0;
65 }
66
67
68 // STAFRegister <Name> [, <Handle Var Name>]
69
RXSTAFRegister(UCHAR *,ULONG argc,RXSTRING * argv,PSZ,RXSTRING * retstring)70 ULONG APIENTRY RXSTAFRegister(UCHAR *, ULONG argc, RXSTRING *argv, PSZ,
71 RXSTRING *retstring)
72 {
73 if ((argc < 1) || (argc > 2))
74 return 40;
75
76 STAFHandle_t handle = 0;
77 unsigned int rc = 0;
78
79 rc = STAFRegister(argv[0].strptr, &handle);
80
81 if (rc == 0)
82 {
83 char *name = "STAFHandle";
84
85 if (argc == 2) name = argv[1].strptr;
86
87 RexxVar handleName(name);
88 char handleVal[20];
89 sprintf(handleVal, "%lu", handle);
90 handleName = handleVal;
91 }
92
93 sprintf(retstring->strptr, "%lu", rc);
94 retstring->strlength = strlen(retstring->strptr);
95
96 return 0;
97 }
98
99
100 // STAFUnRegister [Handle]
101
RXSTAFUnRegister(UCHAR *,ULONG argc,RXSTRING * argv,PSZ,RXSTRING * retstring)102 ULONG APIENTRY RXSTAFUnRegister(UCHAR *, ULONG argc, RXSTRING *argv, PSZ,
103 RXSTRING *retstring)
104 {
105 if (argc > 1)
106 return 40;
107
108 unsigned int rc = 0;
109 STAFHandle_t handle = 0;
110
111 if (argc == 1)
112 sscanf(argv[0].strptr, "%lu", &handle);
113 else
114 {
115 RexxVar theHandle("STAFHandle");
116 sscanf(theHandle.Value(), "%lu", &handle);
117 }
118
119 rc = STAFUnRegister(handle);
120
121 sprintf(retstring->strptr, "%lu", rc);
122 retstring->strlength = strlen(retstring->strptr);
123
124 return 0;
125 }
126
127
128 // STAFSubmit [Handle,] <Where>, <Service>, <Request> [, <Result Var Name>]
129
RXSTAFSubmit(UCHAR *,ULONG argc,RXSTRING * argv,PSZ,RXSTRING * retstring)130 ULONG APIENTRY RXSTAFSubmit(UCHAR *, ULONG argc, RXSTRING *argv, PSZ,
131 RXSTRING *retstring)
132 {
133 if ((argc < 3) || (argc > 5))
134 return 40;
135
136 unsigned int rc = 0;
137 STAFHandle_t handle = 0;
138 STAFSyncOption_t syncOption = kSTAFReqSync;
139 char *result = 0;
140 unsigned int resultLength = 0;
141
142 if (argc > 3)
143 sscanf(argv[0].strptr, "%lu", &handle);
144 else
145 {
146 RexxVar theHandle("STAFHandle");
147 sscanf(theHandle.Value(), "%lu", &handle);
148 }
149
150 RexxVar theSyncOption("STAFSyncOption");
151 sscanf(theSyncOption.Value(), "%lu", &syncOption);
152
153 char *where = (argc == 3) ? argv[0].strptr : argv[1].strptr;
154 char *service = (argc == 3) ? argv[1].strptr : argv[2].strptr;
155 char *request = (argc == 3) ? argv[2].strptr : argv[3].strptr;
156 unsigned int requestLength = (unsigned int)((argc == 3) ?
157 argv[2].strlength : argv[3].strlength);
158
159 rc = STAFSubmit2(handle, syncOption, where, service, request,
160 requestLength, &result, &resultLength);
161
162 RexxVar stafResultName("STAFRESULT");
163 RXSTRING rxResult = { 0 };
164
165 if (result != 0)
166 {
167 rxResult.strptr = result;
168 rxResult.strlength = resultLength;
169 }
170
171 stafResultName = rxResult;
172
173 if (argc == 5)
174 {
175 RexxVar resultName(argv[4].strptr);
176 resultName = rxResult;
177 }
178
179 if (result != 0) STAFFree(handle, result);
180
181 sprintf(retstring->strptr, "%lu", rc);
182 retstring->strlength = strlen(retstring->strptr);
183
184 return 0;
185 }
186
187
RXSTAFDropFuncs(UCHAR *,ULONG argc,RXSTRING *,PSZ,RXSTRING * retstring)188 ULONG APIENTRY RXSTAFDropFuncs(UCHAR *, ULONG argc, RXSTRING *, PSZ,
189 RXSTRING *retstring)
190 {
191 if (argc != 0)
192 return 40;
193
194 for(int i = 0; i < (sizeof(FunctionTable) / sizeof(char *)); ++i)
195 {
196 RexxDeregisterFunction(NameTable[i]);
197 }
198
199 retstring->strptr[0] = 0;
200 retstring->strlength = 0;
201
202 return 0;
203 }
204
205
206 } // End of extern "C"
207