Commit 981631c39e8892578ca3ae874795c11dab4fbeff
1 parent
30919320
Exists in
master
and in
5 other branches
Corrigindo segfaults em chamadas HLLAPI.
Showing
8 changed files
with
86 additions
and
23 deletions
Show diff stats
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 |