Commit 556416a7f5b787e2681d64fe367debf76b9a4828

Authored by perry.werneck@gmail.com
1 parent 0c837bc7

HLLAPI - Tentando identificar porque o VB esta dando segfault

src/include/pw3270/hllapi.h
@@ -63,7 +63,7 @@ extern "C" { @@ -63,7 +63,7 @@ extern "C" {
63 63
64 #ifdef _WIN32 64 #ifdef _WIN32
65 // http://www.mingw.org/wiki/Visual_Basic_DLL 65 // http://www.mingw.org/wiki/Visual_Basic_DLL
66 - __declspec (dllexport) int __stdcall hllapi(LPWORD func, LPSTR str, LPWORD length, LPWORD rc); 66 + __declspec (dllexport) int __stdcall hllapi(const LPWORD func, LPSTR str, LPWORD length, LPWORD rc);
67 #else 67 #else
68 LIB3270_EXPORT int hllapi(const unsigned long *func, char *str, unsigned short *length, unsigned short *rc); 68 LIB3270_EXPORT int hllapi(const unsigned long *func, char *str, unsigned short *length, unsigned short *rc);
69 #endif // _WIN32 69 #endif // _WIN32
src/plugins/remotectl/hllapi.c
@@ -79,18 +79,16 @@ @@ -79,18 +79,16 @@
79 } 79 }
80 80
81 81
82 - static int run_query(unsigned long func, const char *arg, char *string, unsigned short length, unsigned short *rc) 82 + static char * run_query(unsigned long func, const char *arg, size_t length, unsigned short *rc)
83 { 83 {
84 - int result = -1; 84 + char *outBuffer = NULL;
85 85
86 #ifdef WIN32 86 #ifdef WIN32
87 87
88 - if(length < 0 && string)  
89 - length = strlen(string);  
90 -  
91 if(hPipe == INVALID_HANDLE_VALUE) 88 if(hPipe == INVALID_HANDLE_VALUE)
92 { 89 {
93 - *rc = result = EPERM; 90 + trace("%s: Invalid pipe handle",__FUNCTION__);
  91 + *rc = EPERM;
94 } 92 }
95 else 93 else
96 { 94 {
@@ -105,28 +103,28 @@ @@ -105,28 +103,28 @@
105 data->rc = *rc; 103 data->rc = *rc;
106 data->len = length; 104 data->len = length;
107 105
108 - if(length > 0)  
109 - {  
110 - memset(data->string,0,length);  
111 - if(arg)  
112 - strncpy(data->string,arg,length);  
113 - }  
114 - 106 + memcpy(data->string,arg,length);
115 memset(buffer,0,HLLAPI_MAXLENGTH); 107 memset(buffer,0,HLLAPI_MAXLENGTH);
  108 +
116 if(!TransactNamedPipe(hPipe,(LPVOID) data,cbSize,buffer,HLLAPI_MAXLENGTH,&cbSize,NULL)) 109 if(!TransactNamedPipe(hPipe,(LPVOID) data,cbSize,buffer,HLLAPI_MAXLENGTH,&cbSize,NULL))
117 { 110 {
118 - *rc = result = GetLastError(); 111 + trace("Error %d in TransactNamedPipe",(int) GetLastError());
  112 + *rc = GetLastError();
119 } 113 }
120 else 114 else
121 { 115 {
122 - int sz = length < buffer->len ? length : buffer->len;  
123 -  
124 *rc = buffer->rc; 116 *rc = buffer->rc;
125 117
126 - if(string && sz > 0)  
127 - memcpy(string,buffer->string,sz); 118 + trace("buffer->len=%d rc=%d",buffer->len,buffer->rc);
  119 +
  120 + if(buffer->len > 0)
  121 + {
  122 + outBuffer = malloc(buffer->len+1);
  123 + memcpy(outBuffer,buffer->string,buffer->len);
  124 + outBuffer[buffer->len] = 0;
128 125
129 - result = 0; 126 + trace("outBuffer=[%s]",outBuffer);
  127 + }
130 } 128 }
131 129
132 free(data); 130 free(data);
@@ -139,62 +137,70 @@ @@ -139,62 +137,70 @@
139 137
140 #endif // WIN32 138 #endif // WIN32
141 139
142 - return result; 140 + return outBuffer;
  141 + }
  142 +
  143 + static void copyString(char *str, unsigned short *length, const char *msg)
  144 + {
  145 + size_t len = strlen(msg);
  146 +
  147 + if(len > *length)
  148 + len = *length;
  149 + else
  150 + *length = len;
  151 +
  152 + memcpy(str,msg,*length);
143 } 153 }
144 154
145 #ifdef _WIN32 155 #ifdef _WIN32
146 - __declspec (dllexport) int __stdcall hllapi(LPWORD func, LPSTR str, LPWORD length, LPWORD rc) 156 + __declspec (dllexport) int __stdcall hllapi(LPWORD func, LPSTR buffer, LPWORD length, LPWORD rc)
147 #else 157 #else
148 - LIB3270_EXPORT int hllapi(const unsigned long *func, char *str, unsigned short *length, unsigned short *rc) 158 + LIB3270_EXPORT int hllapi(const unsigned long *func, char *buffer, unsigned short *length, unsigned short *rc)
149 #endif // _WIN32 159 #endif // _WIN32
150 { 160 {
151 - int result = 1;  
152 - char * arg;  
153 -  
154 - if(!length || *length > HLLAPI_MAXLENGTH)  
155 - return *rc = EINVAL; 161 + char * inBuffer = NULL;
  162 + char * outBuffer = NULL;
156 163
157 - if(length > 0) 164 + if(*length <= 0 || *length > HLLAPI_MAXLENGTH)
158 { 165 {
159 - arg = malloc(*length+1);  
160 - strncpy(arg,str,(int) *length);  
161 - arg[(size_t) *length] = 0;  
162 - }  
163 - else  
164 - {  
165 - arg = malloc(1);  
166 - *arg = 0; 166 + *rc = EINVAL;
  167 + return 0;
167 } 168 }
168 169
  170 + // Copy input argument
  171 + inBuffer = malloc(*length+1);
  172 + memcpy(inBuffer,buffer,*length);
  173 + inBuffer[*length] = 0;
  174 +
  175 + // Clear output buffer
  176 + memset(buffer,' ',*length);
  177 + buffer[*length] = 0;
  178 +
169 switch(*func) 179 switch(*func)
170 { 180 {
171 case HLLAPI_CMD_CONNECTPS: 181 case HLLAPI_CMD_CONNECTPS:
172 - *rc = result = cmd_connect_ps(arg);  
173 - if(!result) 182 + *rc = cmd_connect_ps(inBuffer);
  183 + if(!*rc)
174 { 184 {
175 - result = run_query(*func, arg, str, *length, rc);  
176 - if(result || *rc) 185 + outBuffer = run_query(*func, inBuffer, *length, rc);
  186 + if(*rc)
177 { 187 {
178 - trace("Closing pipe rc=%d result=%d ",*rc,result); 188 + trace("Closing pipe rc=%d",*rc);
179 CloseHandle(hPipe); 189 CloseHandle(hPipe);
180 hPipe = INVALID_HANDLE_VALUE; 190 hPipe = INVALID_HANDLE_VALUE;
181 } 191 }
182 } 192 }
183 - else  
184 - {  
185 - *rc = result;  
186 - }  
187 break; 193 break;
188 194
189 case HLLAPI_CMD_DISCONNECTPS: 195 case HLLAPI_CMD_DISCONNECTPS:
190 #ifdef WIN32 196 #ifdef WIN32
191 if(hPipe == INVALID_HANDLE_VALUE) 197 if(hPipe == INVALID_HANDLE_VALUE)
192 { 198 {
193 - *rc = result = EINVAL; 199 + *rc = EINVAL;
194 } 200 }
195 else 201 else
196 { 202 {
197 - result = run_query(*func, arg, str, *length, rc); 203 + outBuffer = run_query(*func, inBuffer, *length, rc);
198 CloseHandle(hPipe); 204 CloseHandle(hPipe);
199 hPipe = INVALID_HANDLE_VALUE; 205 hPipe = INVALID_HANDLE_VALUE;
200 } 206 }
@@ -202,32 +208,20 @@ @@ -202,32 +208,20 @@
202 break; 208 break;
203 209
204 default: 210 default:
205 - result = run_query(*func, arg, str, *length, rc); 211 + trace("Calling function %d",(int) *func);
  212 + outBuffer = run_query(*func, inBuffer, *length, rc);
206 } 213 }
207 214
208 - if(result && length && *length && str)  
209 - strncpy(str,strerror(result),*length); 215 + if(*rc)
  216 + copyString(buffer,length,strerror(*rc));
  217 + else if(outBuffer)
  218 + copyString(buffer,length,outBuffer);
210 219
211 - str[*length] = 0;  
212 -  
213 -#ifdef DEBUG  
214 - {  
215 - FILE *arq = fopen("hllapi.dbg","a");  
216 - char *ptr;  
217 -  
218 - for(ptr=str;*ptr;ptr++)  
219 - {  
220 - if(*ptr == ' ')  
221 - *ptr = '.';  
222 - }  
223 -  
224 - fprintf(arq,"func: %d\nresult: %d\nrc: %d\nLength: %d\nstring: [%s]\n",*func,result,*rc, *length, str);  
225 - fclose(arq);  
226 - }  
227 -#endif // DEBUG 220 + if(outBuffer)
  221 + free(outBuffer);
228 222
229 - free(arg);  
230 - return result; 223 + free(inBuffer);
  224 + return 0;
231 } 225 }
232 226
233 227
src/plugins/remotectl/testprogram.c
@@ -40,18 +40,17 @@ @@ -40,18 +40,17 @@
40 char buffer[BUFFER_LENGTH]; 40 char buffer[BUFFER_LENGTH];
41 unsigned short rc; 41 unsigned short rc;
42 unsigned short len; 42 unsigned short len;
43 - int result;  
44 unsigned long fn; 43 unsigned long fn;
45 44
46 static const struct _cmd 45 static const struct _cmd
47 { 46 {
48 const char * name; 47 const char * name;
49 - unsigned long fn; 48 + unsigned short fn;
50 const char * arg; 49 const char * arg;
51 } cmd[] = 50 } cmd[] =
52 { 51 {
53 { "ConnectPS", HLLAPI_CMD_CONNECTPS, "pw3270A" }, 52 { "ConnectPS", HLLAPI_CMD_CONNECTPS, "pw3270A" },
54 - { "GetRevision", HLLAPI_CMD_GETREVISION, "" }, 53 + { "GetRevision", HLLAPI_CMD_GETREVISION, " " },
55 { "InputString", HLLAPI_CMD_INPUTSTRING, "test" }, 54 { "InputString", HLLAPI_CMD_INPUTSTRING, "test" },
56 55
57 }; 56 };
@@ -61,26 +60,25 @@ @@ -61,26 +60,25 @@
61 60
62 for(f=0;f< (sizeof(cmd)/sizeof(struct _cmd)); f++) 61 for(f=0;f< (sizeof(cmd)/sizeof(struct _cmd)); f++)
63 { 62 {
64 - len = BUFFER_LENGTH;  
65 - strcpy(buffer,cmd[f].arg);  
66 - result = hllapi(&cmd[f].fn,buffer,&len,&rc);  
67 - printf("%s exits with result=%d rc=%d\n[%s]\n",cmd[f].name,result,rc,buffer);  
68 - 63 + len = strlen(cmd[f].arg);
  64 + memcpy(buffer,cmd[f].arg,len);
  65 + hllapi((LPWORD) &cmd[f].fn,buffer,&len,&rc);
  66 + printf("%s exits with rc=%d\n[%s]\n",cmd[f].name,rc,buffer);
69 } 67 }
70 68
71 len = 80; 69 len = 80;
72 rc = 1040; 70 rc = 1040;
73 fn = HLLAPI_CMD_COPYPSTOSTR; 71 fn = HLLAPI_CMD_COPYPSTOSTR;
74 - result = hllapi(&fn,buffer,&len,&rc);  
75 - printf("%s exits with result=%d rc=%d\n%s\n","HLLAPI_CMD_COPYPSTOSTR",result,rc,buffer); 72 + hllapi((LPWORD) &fn,buffer,&len,&rc);
  73 + printf("%s exits with rc=%d\n%s\n","HLLAPI_CMD_COPYPSTOSTR",rc,buffer);
76 74
77 // Disconnect 75 // Disconnect
78 - len = BUFFER_LENGTH; 76 + len = 10;
79 rc = 1; 77 rc = 1;
80 fn = HLLAPI_CMD_DISCONNECTPS; 78 fn = HLLAPI_CMD_DISCONNECTPS;
81 *buffer = 0; 79 *buffer = 0;
82 - result = hllapi(&fn,buffer,&len,&rc);  
83 - printf("%s exits with %d [%s]\n","HLLAPI_CMD_DISCONNECTPS",result,buffer); 80 + hllapi((LPWORD) &fn,buffer,&len,&rc);
  81 + printf("%s exits with rc=%d\n[%s]\n","HLLAPI_CMD_DISCONNECTPS",rc,buffer);
84 82
85 return 0; 83 return 0;
86 } 84 }