Commit 981631c39e8892578ca3ae874795c11dab4fbeff

Authored by Perry Werneck
1 parent 30919320

Corrigindo segfaults em chamadas HLLAPI.

src/classlib/remote.cc
@@ -417,6 +417,8 @@ @@ -417,6 +417,8 @@
417 HKEY hKey = 0; 417 HKEY hKey = 0;
418 unsigned long datalen = sizeof(buffer); 418 unsigned long datalen = sizeof(buffer);
419 419
  420 + debug("%s(%s)",__FUNCTION__,name);
  421 +
420 *buffer = 0; 422 *buffer = 0;
421 if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\pw3270",0,KEY_QUERY_VALUE,&hKey) != ERROR_SUCCESS) 423 if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\pw3270",0,KEY_QUERY_VALUE,&hKey) != ERROR_SUCCESS)
422 { 424 {
@@ -448,6 +450,8 @@ @@ -448,6 +450,8 @@
448 450
449 hPipe = INVALID_HANDLE_VALUE; 451 hPipe = INVALID_HANDLE_VALUE;
450 452
  453 + trace("%s(%s)",__FUNCTION__,session);
  454 +
451 if(strcasecmp(session,"start") == 0 || strcasecmp(session,"new") == 0) 455 if(strcasecmp(session,"start") == 0 || strcasecmp(session,"new") == 0)
452 { 456 {
453 // Start a new session 457 // Start a new session
@@ -509,7 +513,16 @@ @@ -509,7 +513,16 @@
509 } 513 }
510 514
511 // Wait? 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 if(delay) { 527 if(delay) {
515 timer = time(0) + delay; 528 timer = time(0) + delay;
src/classlib/session.cc
@@ -38,20 +38,25 @@ @@ -38,20 +38,25 @@
38 #include <unistd.h> 38 #include <unistd.h>
39 #endif // !WIN32 39 #endif // !WIN32
40 40
41 - #ifdef HAVE_SYSLOG 41 +#ifdef HAVE_SYSLOG
42 #include <syslog.h> 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 /*--[ Implement ]--------------------------------------------------------------------------------------------------*/ 49 /*--[ Implement ]--------------------------------------------------------------------------------------------------*/
46 50
47 namespace PW3270_NAMESPACE 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 session::session() 57 session::session()
54 { 58 {
  59 +
55 #ifdef HAVE_ICONV 60 #ifdef HAVE_ICONV
56 this->conv2Local = (iconv_t) (-1); 61 this->conv2Local = (iconv_t) (-1);
57 this->conv2Host = (iconv_t) (-1); 62 this->conv2Host = (iconv_t) (-1);
@@ -98,6 +103,8 @@ @@ -98,6 +103,8 @@
98 // Factory methods and settings 103 // Factory methods and settings
99 session * session::create(const char *name) throw (std::exception) 104 session * session::create(const char *name) throw (std::exception)
100 { 105 {
  106 + trace("%s(%s)",__FUNCTION__,name);
  107 +
101 if(factory) 108 if(factory)
102 return factory(name); 109 return factory(name);
103 110
@@ -112,6 +119,11 @@ @@ -112,6 +119,11 @@
112 return create(name); 119 return create(name);
113 } 120 }
114 121
  122 + bool session::has_default(void)
  123 + {
  124 + return first != nullptr;
  125 + }
  126 +
115 session * session::get_default(void) 127 session * session::get_default(void)
116 { 128 {
117 if(first) 129 if(first)
src/include/pw3270/class.h
@@ -132,6 +132,7 @@ @@ -132,6 +132,7 @@
132 static session * start(const char *name = 0); 132 static session * start(const char *name = 0);
133 static session * create(const char *name = 0) throw (std::exception); 133 static session * create(const char *name = 0) throw (std::exception);
134 static session * get_default(void); 134 static session * get_default(void);
  135 + static bool has_default(void);
135 static void set_plugin(session * (*factory)(const char *name)); 136 static void set_plugin(session * (*factory)(const char *name));
136 137
137 // Log management 138 // Log management
src/plugins/hllapi/Makefile.in
@@ -44,11 +44,12 @@ include $(CLASSLIBDIR)/class.mak @@ -44,11 +44,12 @@ include $(CLASSLIBDIR)/class.mak
44 #---[ Release Targets ]-------------------------------------------------------- 44 #---[ Release Targets ]--------------------------------------------------------
45 45
46 $(BINRLS)/$(PLUGIN_NAME): \ 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 @echo " CCLD `basename $@`" 50 @echo " CCLD `basename $@`"
50 @$(MKDIR) `dirname $@` 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 $(BINRLS)$(DLL_NAME).$(VERSION): \ 54 $(BINRLS)$(DLL_NAME).$(VERSION): \
54 $(foreach SRC, $(basename $(EXTAPI_SRC)), $(OBJRLS)/$(SRC).o) $(CLASS_RELEASE_OBJECTS) 55 $(foreach SRC, $(basename $(EXTAPI_SRC)), $(OBJRLS)/$(SRC).o) $(CLASS_RELEASE_OBJECTS)
@@ -62,11 +63,12 @@ install: @@ -62,11 +63,12 @@ install:
62 #---[ Debug Targets ]---------------------------------------------------------- 63 #---[ Debug Targets ]----------------------------------------------------------
63 64
64 $(BINDBG)/$(PLUGIN_NAME): \ 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 @echo " CCLD `basename $@`" 69 @echo " CCLD `basename $@`"
68 @$(MKDIR) `dirname $@` 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 $(BINDBG)$(DLL_NAME).$(VERSION): \ 73 $(BINDBG)$(DLL_NAME).$(VERSION): \
72 $(foreach SRC, $(basename $(EXTAPI_SRC)), $(OBJDBG)/$(SRC)@OBJEXT@) $(CLASS_DEBUG_OBJECTS) 74 $(foreach SRC, $(basename $(EXTAPI_SRC)), $(OBJDBG)/$(SRC)@OBJEXT@) $(CLASS_DEBUG_OBJECTS)
src/plugins/hllapi/calls.cc
@@ -114,6 +114,11 @@ @@ -114,6 +114,11 @@
114 114
115 HLLAPI_API_CALL hllapi_is_connected(void) 115 HLLAPI_API_CALL hllapi_is_connected(void)
116 { 116 {
  117 + if(!session::has_default())
  118 + {
  119 + return 0;
  120 + }
  121 +
117 return session::get_default()->is_connected(); 122 return session::get_default()->is_connected();
118 } 123 }
119 124
@@ -255,7 +260,13 @@ @@ -255,7 +260,13 @@
255 260
256 HLLAPI_API_CALL hllapi_setcursor(WORD pos) 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 HLLAPI_API_CALL hllapi_getcursor() 272 HLLAPI_API_CALL hllapi_getcursor()
@@ -267,15 +278,28 @@ @@ -267,15 +278,28 @@
267 { 278 {
268 int rc = HLLAPI_STATUS_SYSTEM_ERROR; 279 int rc = HLLAPI_STATUS_SYSTEM_ERROR;
269 280
  281 + if(!session::has_default())
  282 + {
  283 + return HLLAPI_STATUS_DISCONNECTED;
  284 + }
  285 +
270 if(!(buffer && *buffer)) 286 if(!(buffer && *buffer))
271 return rc; 287 return rc;
272 288
273 try 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 string str = session::get_default()->get_string(offset,szBuffer); 304 string str = session::get_default()->get_string(offset,szBuffer);
281 strncpy(buffer,str.c_str(),szBuffer); 305 strncpy(buffer,str.c_str(),szBuffer);
src/plugins/hllapi/hllapi.c
@@ -37,10 +37,7 @@ @@ -37,10 +37,7 @@
37 #include <lib3270/log.h> 37 #include <lib3270/log.h>
38 #include "client.h" 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 static int connect_ps(char *buffer, unsigned short *length, unsigned short *rc); 42 static int connect_ps(char *buffer, unsigned short *length, unsigned short *rc);
46 static int disconnect_ps(char *buffer, unsigned short *length, unsigned short *rc); 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,9 +174,12 @@ static int set_cursor_position(char *buffer, unsigned short *length, unsigned sh
177 174
178 static int copy_ps_to_str(char *buffer, unsigned short *length, unsigned short *rc) 175 static int copy_ps_to_str(char *buffer, unsigned short *length, unsigned short *rc)
179 { 176 {
  177 +
180 // Length Length of the target data string. 178 // Length Length of the target data string.
181 // PS Position Position within the host presentation space of the first byte in your target data string. 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 static int input_string(char *input, unsigned short *length, unsigned short *rc) 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,6 +187,11 @@ static int input_string(char *input, unsigned short *length, unsigned short *rc)
187 size_t szText; 187 size_t szText;
188 char * text; 188 char * text;
189 189
  190 + if(!hllapi_is_connected()) {
  191 + *rc = HLLAPI_STATUS_DISCONNECTED;
  192 + return HLLAPI_STATUS_DISCONNECTED;
  193 + }
  194 +
190 if(!input) 195 if(!input)
191 { 196 {
192 *rc = HLLAPI_STATUS_BAD_PARAMETER; 197 *rc = HLLAPI_STATUS_BAD_PARAMETER;
src/plugins/hllapi/hllapi.cbp
@@ -68,6 +68,7 @@ @@ -68,6 +68,7 @@
68 <Unit filename="../../classlib/remote.cc" /> 68 <Unit filename="../../classlib/remote.cc" />
69 <Unit filename="../../classlib/session.cc" /> 69 <Unit filename="../../classlib/session.cc" />
70 <Unit filename="../../include/lib3270.h" /> 70 <Unit filename="../../include/lib3270.h" />
  71 + <Unit filename="../../include/pw3270/class.h" />
71 <Unit filename="../../include/pw3270/hllapi.h" /> 72 <Unit filename="../../include/pw3270/hllapi.h" />
72 <Unit filename="Makefile.in" /> 73 <Unit filename="Makefile.in" />
73 <Unit filename="calls.cc" /> 74 <Unit filename="calls.cc" />
src/plugins/hllapi/testprogram.c
@@ -32,13 +32,18 @@ @@ -32,13 +32,18 @@
32 #include <time.h> 32 #include <time.h>
33 #include <pw3270/hllapi.h> 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 #define MAX_DATA_SIZE 8000 //< Maximum data size for this application. 40 #define MAX_DATA_SIZE 8000 //< Maximum data size for this application.
36 41
37 static CHAR hllapi_data[MAX_DATA_SIZE]; 42 static CHAR hllapi_data[MAX_DATA_SIZE];
38 43
39 /*---[ Implement ]--------------------------------------------------------------------------------*/ 44 /*---[ Implement ]--------------------------------------------------------------------------------*/
40 45
41 - static void connect(const char *session) 46 + static void connect_ps(const char *session)
42 { 47 {
43 WORD len; 48 WORD len;
44 WORD fn = HLLAPI_CMD_CONNECTPS; 49 WORD fn = HLLAPI_CMD_CONNECTPS;
@@ -51,16 +56,16 @@ @@ -51,16 +56,16 @@
51 56
52 if(rc) 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 int main(int numpar, char *param[]) 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