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