Commit 981631c39e8892578ca3ae874795c11dab4fbeff

Authored by Perry Werneck
1 parent 30919320

Corrigindo segfaults em chamadas HLLAPI.

src/classlib/remote.cc
... ... @@ -417,6 +417,8 @@
417 417 HKEY hKey = 0;
418 418 unsigned long datalen = sizeof(buffer);
419 419  
  420 + debug("%s(%s)",__FUNCTION__,name);
  421 +
420 422 *buffer = 0;
421 423 if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\pw3270",0,KEY_QUERY_VALUE,&hKey) != ERROR_SUCCESS)
422 424 {
... ... @@ -448,6 +450,8 @@
448 450  
449 451 hPipe = INVALID_HANDLE_VALUE;
450 452  
  453 + trace("%s(%s)",__FUNCTION__,session);
  454 +
451 455 if(strcasecmp(session,"start") == 0 || strcasecmp(session,"new") == 0)
452 456 {
453 457 // Start a new session
... ... @@ -509,7 +513,16 @@
509 513 }
510 514  
511 515 // Wait?
512   - int delay = atoi(getRegistryKey("hllapiWait").c_str());
  516 + int delay;
  517 +
  518 + try
  519 + {
  520 + delay = atoi(getRegistryKey("hllapiWait").c_str());
  521 + }
  522 + catch(std::exception &e)
  523 + {
  524 + delay = 0;
  525 + }
513 526  
514 527 if(delay) {
515 528 timer = time(0) + delay;
... ...
src/classlib/session.cc
... ... @@ -38,20 +38,25 @@
38 38 #include <unistd.h>
39 39 #endif // !WIN32
40 40  
41   - #ifdef HAVE_SYSLOG
  41 +#ifdef HAVE_SYSLOG
42 42 #include <syslog.h>
43   - #endif // HAVE_SYSLOG
  43 +#endif // HAVE_SYSLOG
  44 +
  45 +#if __cplusplus < 201103L
  46 + #define nullptr NULL
  47 +#endif // !c11
44 48  
45 49 /*--[ Implement ]--------------------------------------------------------------------------------------------------*/
46 50  
47 51 namespace PW3270_NAMESPACE
48 52 {
49   - session * session::first = 0;
50   - session * session::last = 0;
51   - session * (*session::factory)(const char *name) = 0;
  53 + session * session::first = nullptr;
  54 + session * session::last = nullptr;
  55 + session * (*session::factory)(const char *name) = nullptr;
52 56  
53 57 session::session()
54 58 {
  59 +
55 60 #ifdef HAVE_ICONV
56 61 this->conv2Local = (iconv_t) (-1);
57 62 this->conv2Host = (iconv_t) (-1);
... ... @@ -98,6 +103,8 @@
98 103 // Factory methods and settings
99 104 session * session::create(const char *name) throw (std::exception)
100 105 {
  106 + trace("%s(%s)",__FUNCTION__,name);
  107 +
101 108 if(factory)
102 109 return factory(name);
103 110  
... ... @@ -112,6 +119,11 @@
112 119 return create(name);
113 120 }
114 121  
  122 + bool session::has_default(void)
  123 + {
  124 + return first != nullptr;
  125 + }
  126 +
115 127 session * session::get_default(void)
116 128 {
117 129 if(first)
... ...
src/include/pw3270/class.h
... ... @@ -132,6 +132,7 @@
132 132 static session * start(const char *name = 0);
133 133 static session * create(const char *name = 0) throw (std::exception);
134 134 static session * get_default(void);
  135 + static bool has_default(void);
135 136 static void set_plugin(session * (*factory)(const char *name));
136 137  
137 138 // Log management
... ...
src/plugins/hllapi/Makefile.in
... ... @@ -44,11 +44,12 @@ include $(CLASSLIBDIR)/class.mak
44 44 #---[ Release Targets ]--------------------------------------------------------
45 45  
46 46 $(BINRLS)/$(PLUGIN_NAME): \
47   - $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJRLS)/$(SRC).o) $(BINRLS)$(DLL_NAME)
  47 + $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJRLS)/$(SRC).o) \
  48 + $(BINRLS)$(DLL_NAME)
48 49  
49 50 @echo " CCLD `basename $@`"
50 51 @$(MKDIR) `dirname $@`
51   - @$(CXX) $(DLL_FLAGS) @LDSOFLAGS@ $(LDFLAGS) @RLS_LDFLAGS@ -o $@ $^ $(LIBS) $(LIB3270_LIBS) $(CLASS_LIBS)
  52 + @$(CXX) $(DLL_FLAGS) @LDSOFLAGS@ $(LDFLAGS) @RLS_LDFLAGS@ -o $@ $^ $(LIBS) $(LIB3270_LIBS) $(GTK_LIBS) $(GLIB_LIBS) $(PW3270_LIBS)
52 53  
53 54 $(BINRLS)$(DLL_NAME).$(VERSION): \
54 55 $(foreach SRC, $(basename $(EXTAPI_SRC)), $(OBJRLS)/$(SRC).o) $(CLASS_RELEASE_OBJECTS)
... ... @@ -62,11 +63,12 @@ install:
62 63 #---[ Debug Targets ]----------------------------------------------------------
63 64  
64 65 $(BINDBG)/$(PLUGIN_NAME): \
65   - $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJDBG)/$(SRC).o) $(BINDBG)$(DLL_NAME)
  66 + $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJDBG)/$(SRC).o) \
  67 + $(BINDBG)$(DLL_NAME)
66 68  
67 69 @echo " CCLD `basename $@`"
68 70 @$(MKDIR) `dirname $@`
69   - @$(CXX) $(DLL_FLAGS) @LDSOFLAGS@ @DBGRPATH@ $(LDFLAGS) -o $@ $^ $(LIBS) $(LIB3270_LIBS) $(CLASS_LIBS)
  71 + @$(CXX) $(DLL_FLAGS) @LDSOFLAGS@ @DBGRPATH@ $(LDFLAGS) -o $@ $^ $(LIBS) $(LIB3270_LIBS) $(GTK_LIBS) $(GLIB_LIBS) $(PW3270_LIBS)
70 72  
71 73 $(BINDBG)$(DLL_NAME).$(VERSION): \
72 74 $(foreach SRC, $(basename $(EXTAPI_SRC)), $(OBJDBG)/$(SRC)@OBJEXT@) $(CLASS_DEBUG_OBJECTS)
... ...
src/plugins/hllapi/calls.cc
... ... @@ -114,6 +114,11 @@
114 114  
115 115 HLLAPI_API_CALL hllapi_is_connected(void)
116 116 {
  117 + if(!session::has_default())
  118 + {
  119 + return 0;
  120 + }
  121 +
117 122 return session::get_default()->is_connected();
118 123 }
119 124  
... ... @@ -255,7 +260,13 @@
255 260  
256 261 HLLAPI_API_CALL hllapi_setcursor(WORD pos)
257 262 {
258   - return session::get_default()->set_cursor_addr(pos-1);
  263 + if(!hllapi_is_connected())
  264 + return HLLAPI_STATUS_DISCONNECTED;
  265 +
  266 + session::get_default()->set_cursor_addr(pos-1);
  267 +
  268 + return HLLAPI_STATUS_SUCCESS;
  269 +
259 270 }
260 271  
261 272 HLLAPI_API_CALL hllapi_getcursor()
... ... @@ -267,15 +278,28 @@
267 278 {
268 279 int rc = HLLAPI_STATUS_SYSTEM_ERROR;
269 280  
  281 + if(!session::has_default())
  282 + {
  283 + return HLLAPI_STATUS_DISCONNECTED;
  284 + }
  285 +
270 286 if(!(buffer && *buffer))
271 287 return rc;
272 288  
273 289 try
274 290 {
275   - size_t szBuffer = strlen(buffer);
  291 + size_t szBuffer;
  292 +
  293 + if(len > 0)
  294 + {
  295 + szBuffer = (size_t) len;
  296 + }
  297 + else
  298 + {
  299 + return HLLAPI_STATUS_BAD_PARAMETER;
  300 + }
276 301  
277   - if(len < szBuffer && len > 0)
278   - szBuffer = len;
  302 + memset(buffer,' ',szBuffer);
279 303  
280 304 string str = session::get_default()->get_string(offset,szBuffer);
281 305 strncpy(buffer,str.c_str(),szBuffer);
... ...
src/plugins/hllapi/hllapi.c
... ... @@ -37,10 +37,7 @@
37 37 #include <lib3270/log.h>
38 38 #include "client.h"
39 39  
40   - #undef trace
41   - #define trace( fmt, ... ) { FILE *out = fopen("c:\\Users\\Perry\\hllapi.log","a"); if(out) { fprintf(out, "%s(%d) " fmt "\n", __FILE__, __LINE__, __VA_ARGS__ ); fclose(out); } }
42   -
43   -/*--[ Prototipes ]-----------------------------------------------------------------------------------*/
  40 + /*--[ Prototipes ]-----------------------------------------------------------------------------------*/
44 41  
45 42 static int connect_ps(char *buffer, unsigned short *length, unsigned short *rc);
46 43 static int disconnect_ps(char *buffer, unsigned short *length, unsigned short *rc);
... ... @@ -177,9 +174,12 @@ static int set_cursor_position(char *buffer, unsigned short *length, unsigned sh
177 174  
178 175 static int copy_ps_to_str(char *buffer, unsigned short *length, unsigned short *rc)
179 176 {
  177 +
180 178 // Length Length of the target data string.
181 179 // PS Position Position within the host presentation space of the first byte in your target data string.
182   - return hllapi_get_screen(*rc,buffer,*length);
  180 + *rc = hllapi_get_screen(*rc,buffer,*length);
  181 +
  182 + return 0;
183 183 }
184 184  
185 185 static int input_string(char *input, unsigned short *length, unsigned short *rc)
... ... @@ -187,6 +187,11 @@ static int input_string(char *input, unsigned short *length, unsigned short *rc)
187 187 size_t szText;
188 188 char * text;
189 189  
  190 + if(!hllapi_is_connected()) {
  191 + *rc = HLLAPI_STATUS_DISCONNECTED;
  192 + return HLLAPI_STATUS_DISCONNECTED;
  193 + }
  194 +
190 195 if(!input)
191 196 {
192 197 *rc = HLLAPI_STATUS_BAD_PARAMETER;
... ...
src/plugins/hllapi/hllapi.cbp
... ... @@ -68,6 +68,7 @@
68 68 <Unit filename="../../classlib/remote.cc" />
69 69 <Unit filename="../../classlib/session.cc" />
70 70 <Unit filename="../../include/lib3270.h" />
  71 + <Unit filename="../../include/pw3270/class.h" />
71 72 <Unit filename="../../include/pw3270/hllapi.h" />
72 73 <Unit filename="Makefile.in" />
73 74 <Unit filename="calls.cc" />
... ...
src/plugins/hllapi/testprogram.c
... ... @@ -32,13 +32,18 @@
32 32 #include <time.h>
33 33 #include <pw3270/hllapi.h>
34 34  
  35 + #if defined(DEBUG) && defined(_WIN32)
  36 + #undef trace
  37 + #define trace( fmt, ... ) { FILE *out = fopen("c:\\Users\\Perry\\hllapi.log","a"); if(out) { fprintf(out, "%s(%d) " fmt "\n", __FILE__, __LINE__, __VA_ARGS__ ); fclose(out); } }
  38 + #endif // DEBUG
  39 +
35 40 #define MAX_DATA_SIZE 8000 //< Maximum data size for this application.
36 41  
37 42 static CHAR hllapi_data[MAX_DATA_SIZE];
38 43  
39 44 /*---[ Implement ]--------------------------------------------------------------------------------*/
40 45  
41   - static void connect(const char *session)
  46 + static void connect_ps(const char *session)
42 47 {
43 48 WORD len;
44 49 WORD fn = HLLAPI_CMD_CONNECTPS;
... ... @@ -51,16 +56,16 @@
51 56  
52 57 if(rc)
53 58 {
54   - fprintf(stderr,"HLLAPI_CMD_CONNECTPS exits with rc=%d",(int) rc);
  59 + trace("HLLAPI_CMD_CONNECTPS(%s) exits with rc=%d", session, (int) rc);
55 60 }
56 61  
57 62 }
58 63  
59 64 int main(int numpar, char *param[])
60 65 {
61   - const char *session = "pw3270:a";
  66 + const char *session = "pw3270:A";
62 67  
63   - connect(session);
  68 + connect_ps(session);
64 69  
65 70 /*
66 71  
... ...