Commit 2bfb60d4a6d2489cdcb43431a8ea817c92750531
1 parent
e68a04bc
Exists in
master
and in
3 other branches
Fixing multi-thread issues
Showing
5 changed files
with
120 additions
and
102 deletions
Show diff stats
src/include/lib3270.h
| ... | ... | @@ -452,7 +452,7 @@ |
| 452 | 452 | * @brief Set host id for the connect/reconnect operations. |
| 453 | 453 | * |
| 454 | 454 | * @param h Session handle. |
| 455 | - * @param url URL of host to set in the format tn3270://hostname:service or tn3270s://hostname:service . | |
| 455 | + * @param url URL of host to set in the format tn3270://hostname:service or tn3270s://hostname:service | |
| 456 | 456 | * |
| 457 | 457 | * @return 0 |
| 458 | 458 | * |
| ... | ... | @@ -460,6 +460,15 @@ |
| 460 | 460 | LIB3270_EXPORT int lib3270_set_url(H3270 *h, const char *url); |
| 461 | 461 | |
| 462 | 462 | /** |
| 463 | + * @brief Get the URL of the predefined tn3270 host. | |
| 464 | + * | |
| 465 | + * @param hSession Session handle. | |
| 466 | + * | |
| 467 | + * @return URL of the predefined host in the format tn3270://hostname:service or tn3270s://hostname:service | |
| 468 | + */ | |
| 469 | + LIB3270_EXPORT const char * lib3270_get_default_host(H3270 *hSession); | |
| 470 | + | |
| 471 | + /** | |
| 463 | 472 | * @brief Set URL for the certificate revocation list. |
| 464 | 473 | * |
| 465 | 474 | * @param hSession Session handle. | ... | ... |
src/lib3270/host.c
| ... | ... | @@ -265,136 +265,134 @@ LIB3270_EXPORT const char * lib3270_get_url(H3270 *hSession) |
| 265 | 265 | |
| 266 | 266 | } |
| 267 | 267 | |
| 268 | +LIB3270_EXPORT const char * lib3270_get_default_host(H3270 *hSession unused) | |
| 269 | +{ | |
| 270 | +#ifdef LIB3270_DEFAULT_HOST | |
| 271 | + return LIB3270_DEFAULT_HOST; | |
| 272 | +#else | |
| 273 | + return getenv("LIB3270_DEFAULT_HOST"); | |
| 274 | +#endif // LIB3270_DEFAULT_HOST | |
| 275 | +} | |
| 276 | + | |
| 268 | 277 | LIB3270_EXPORT int lib3270_set_url(H3270 *h, const char *n) |
| 269 | 278 | { |
| 270 | 279 | FAIL_IF_ONLINE(h); |
| 271 | 280 | |
| 272 | 281 | if(!n) |
| 273 | - { | |
| 274 | -#ifdef LIB3270_DEFAULT_HOST | |
| 275 | - n = LIB3270_DEFAULT_HOST; | |
| 276 | -#else | |
| 277 | - n = getenv("LIB3270_DEFAULT_HOST"); | |
| 278 | - if(!n) | |
| 279 | - return errno = EINVAL; | |
| 280 | -#endif // LIB3270_DEFAULT_HOST | |
| 281 | - } | |
| 282 | + n = lib3270_get_default_host(h); | |
| 282 | 283 | |
| 283 | - if(!h->host.full || strcmp(n,h->host.full)) | |
| 284 | + if(!n) | |
| 285 | + return errno = ENOENT; | |
| 286 | + | |
| 287 | + static const struct _sch | |
| 288 | + { | |
| 289 | + char ssl; | |
| 290 | + const char * text; | |
| 291 | + const char * srvc; | |
| 292 | + } sch[] = | |
| 284 | 293 | { |
| 285 | - static const struct _sch | |
| 286 | - { | |
| 287 | - char ssl; | |
| 288 | - const char * text; | |
| 289 | - const char * srvc; | |
| 290 | - } sch[] = | |
| 291 | - { | |
| 292 | 294 | #ifdef HAVE_LIBSSL |
| 293 | - { 1, "tn3270s://", "telnets" }, | |
| 294 | - { 1, "telnets://", "telnets" }, | |
| 295 | - { 1, "L://", "telnets" }, | |
| 296 | - { 1, "L:", "telnets" }, | |
| 295 | + { 1, "tn3270s://", "telnets" }, | |
| 296 | + { 1, "telnets://", "telnets" }, | |
| 297 | + { 1, "L://", "telnets" }, | |
| 298 | + { 1, "L:", "telnets" }, | |
| 297 | 299 | #endif // HAVE_LIBSSL |
| 298 | 300 | |
| 299 | - { 0, "tn3270://", "telnet" }, | |
| 300 | - { 0, "telnet://", "telnet" } | |
| 301 | + { 0, "tn3270://", "telnet" }, | |
| 302 | + { 0, "telnet://", "telnet" } | |
| 301 | 303 | |
| 302 | - }; | |
| 304 | + }; | |
| 303 | 305 | |
| 304 | - char * str = strdup(n); | |
| 305 | - char * hostname = str; | |
| 306 | - const char * srvc = "telnet"; | |
| 307 | - char * ptr; | |
| 308 | - char * query = ""; | |
| 309 | - int f; | |
| 306 | + lib3270_autoptr(char) str = strdup(n); | |
| 307 | + char * hostname = str; | |
| 308 | + const char * srvc = "telnet"; | |
| 309 | + char * ptr; | |
| 310 | + char * query = ""; | |
| 311 | + int f; | |
| 310 | 312 | |
| 311 | - trace("%s(%s)",__FUNCTION__,str); | |
| 313 | + trace("%s(%s)",__FUNCTION__,str); | |
| 312 | 314 | |
| 313 | 315 | #ifdef HAVE_LIBSSL |
| 314 | - h->ssl.enabled = 0; | |
| 316 | + h->ssl.enabled = 0; | |
| 315 | 317 | #endif // HAVE_LIBSSL |
| 316 | 318 | |
| 317 | - for(f=0;f < sizeof(sch)/sizeof(sch[0]);f++) | |
| 319 | + for(f=0;f < sizeof(sch)/sizeof(sch[0]);f++) | |
| 320 | + { | |
| 321 | + size_t sz = strlen(sch[f].text); | |
| 322 | + if(!strncasecmp(hostname,sch[f].text,sz)) | |
| 318 | 323 | { |
| 319 | - size_t sz = strlen(sch[f].text); | |
| 320 | - if(!strncasecmp(hostname,sch[f].text,sz)) | |
| 321 | - { | |
| 322 | 324 | #ifdef HAVE_LIBSSL |
| 323 | - h->ssl.enabled = sch[f].ssl; | |
| 325 | + h->ssl.enabled = sch[f].ssl; | |
| 324 | 326 | #endif // HAVE_LIBSSL |
| 325 | - srvc = sch[f].srvc; | |
| 326 | - hostname += sz; | |
| 327 | - break; | |
| 328 | - } | |
| 327 | + srvc = sch[f].srvc; | |
| 328 | + hostname += sz; | |
| 329 | + break; | |
| 329 | 330 | } |
| 331 | + } | |
| 330 | 332 | |
| 331 | - if(!*hostname) | |
| 332 | - return 0; | |
| 333 | + if(!*hostname) | |
| 334 | + return 0; | |
| 333 | 335 | |
| 334 | - ptr = strchr(hostname,':'); | |
| 335 | - if(ptr) | |
| 336 | - { | |
| 337 | - *(ptr++) = 0; | |
| 338 | - srvc = ptr; | |
| 339 | - query = strchr(ptr,'?'); | |
| 336 | + ptr = strchr(hostname,':'); | |
| 337 | + if(ptr) | |
| 338 | + { | |
| 339 | + *(ptr++) = 0; | |
| 340 | + srvc = ptr; | |
| 341 | + query = strchr(ptr,'?'); | |
| 340 | 342 | |
| 341 | - trace("QUERY=[%s]",query); | |
| 343 | + trace("QUERY=[%s]",query); | |
| 342 | 344 | |
| 343 | - if(query) | |
| 344 | - *(query++) = 0; | |
| 345 | - else | |
| 346 | - query = ""; | |
| 347 | - } | |
| 345 | + if(query) | |
| 346 | + *(query++) = 0; | |
| 347 | + else | |
| 348 | + query = ""; | |
| 349 | + } | |
| 348 | 350 | |
| 349 | - trace("SRVC=[%s]",srvc); | |
| 351 | + trace("SRVC=[%s]",srvc); | |
| 350 | 352 | |
| 351 | - Replace(h->host.current,strdup(hostname)); | |
| 352 | - Replace(h->host.srvc,strdup(srvc)); | |
| 353 | + Replace(h->host.current,strdup(hostname)); | |
| 354 | + Replace(h->host.srvc,strdup(srvc)); | |
| 353 | 355 | |
| 354 | - // Verifica parâmetros | |
| 355 | - if(query && *query) | |
| 356 | - { | |
| 357 | - char *str = strdup(query); | |
| 358 | - char *ptr; | |
| 356 | + // Verifica parâmetros | |
| 357 | + if(query && *query) | |
| 358 | + { | |
| 359 | + lib3270_autoptr(char) str = strdup(query); | |
| 360 | + char *ptr; | |
| 359 | 361 | |
| 360 | 362 | #ifdef HAVE_STRTOK_R |
| 361 | - char *saveptr = NULL; | |
| 362 | - for(ptr = strtok_r(str,"&",&saveptr);ptr;ptr=strtok_r(NULL,"&",&saveptr)) | |
| 363 | + char *saveptr = NULL; | |
| 364 | + for(ptr = strtok_r(str,"&",&saveptr);ptr;ptr=strtok_r(NULL,"&",&saveptr)) | |
| 363 | 365 | #else |
| 364 | - for(ptr = strtok(str,"&");ptr;ptr=strtok(NULL,"&")) | |
| 366 | + for(ptr = strtok(str,"&");ptr;ptr=strtok(NULL,"&")) | |
| 365 | 367 | #endif |
| 368 | + { | |
| 369 | + char *var = ptr; | |
| 370 | + char *val = strchr(ptr,'='); | |
| 371 | + if(val) | |
| 366 | 372 | { |
| 367 | - char *var = ptr; | |
| 368 | - char *val = strchr(ptr,'='); | |
| 369 | - if(val) | |
| 370 | - { | |
| 371 | - *(val++) = 0; | |
| 373 | + *(val++) = 0; | |
| 372 | 374 | |
| 373 | - if(lib3270_set_string_property(h, var, val, 0) == 0) | |
| 374 | - continue; | |
| 375 | + if(lib3270_set_string_property(h, var, val, 0) == 0) | |
| 376 | + continue; | |
| 375 | 377 | |
| 376 | - lib3270_write_log(h,"","Can't set attribute \"%s\": %s",var,strerror(errno)); | |
| 378 | + lib3270_write_log(h,"","Can't set attribute \"%s\": %s",var,strerror(errno)); | |
| 377 | 379 | |
| 378 | - } | |
| 379 | - else | |
| 380 | - { | |
| 381 | - if(lib3270_set_int_property(h,var,1,0)) | |
| 382 | - continue; | |
| 383 | - | |
| 384 | - lib3270_write_log(h,"","Can't set attribute \"%s\": %s",var,strerror(errno)); | |
| 385 | - } | |
| 380 | + } | |
| 381 | + else | |
| 382 | + { | |
| 383 | + if(lib3270_set_int_property(h,var,1,0)) | |
| 384 | + continue; | |
| 386 | 385 | |
| 386 | + lib3270_write_log(h,"","Can't set attribute \"%s\": %s",var,strerror(errno)); | |
| 387 | 387 | } |
| 388 | 388 | |
| 389 | - free(str); | |
| 390 | 389 | } |
| 391 | 390 | |
| 392 | - // Notifica atualização | |
| 393 | - update_host(h); | |
| 394 | - | |
| 395 | - free(str); | |
| 396 | 391 | } |
| 397 | 392 | |
| 393 | + // Notifica atualização | |
| 394 | + update_host(h); | |
| 395 | + | |
| 398 | 396 | return 0; |
| 399 | 397 | } |
| 400 | 398 | ... | ... |
src/lib3270/iocalls.c
| ... | ... | @@ -449,6 +449,9 @@ LIB3270_EXPORT int lib3270_register_io_controller(const LIB3270_IO_CONTROLLER *c |
| 449 | 449 | if(cbk->run_task) |
| 450 | 450 | run_task = cbk->run_task; |
| 451 | 451 | |
| 452 | + if(cbk->set_poll_state) | |
| 453 | + set_poll_state = cbk->set_poll_state; | |
| 454 | + | |
| 452 | 455 | return 0; |
| 453 | 456 | |
| 454 | 457 | } | ... | ... |
src/lib3270/properties.c
| ... | ... | @@ -350,42 +350,42 @@ |
| 350 | 350 | |
| 351 | 351 | { |
| 352 | 352 | "luname", // Property name. |
| 353 | - N_( "" ), // Property description. | |
| 353 | + N_( "The name of the active LU" ), // Property description. | |
| 354 | 354 | lib3270_get_luname, // Get value. |
| 355 | 355 | lib3270_set_luname // Set value. |
| 356 | 356 | }, |
| 357 | 357 | |
| 358 | 358 | { |
| 359 | 359 | "url", // Property name. |
| 360 | - N_( "" ), // Property description. | |
| 360 | + N_( "URL of the current host" ), // Property description. | |
| 361 | 361 | lib3270_get_url, // Get value. |
| 362 | 362 | lib3270_set_url // Set value. |
| 363 | 363 | }, |
| 364 | 364 | |
| 365 | 365 | { |
| 366 | 366 | "model", // Property name. |
| 367 | - N_( "" ), // Property description. | |
| 367 | + N_( "Model name" ), // Property description. | |
| 368 | 368 | lib3270_get_model, // Get value. |
| 369 | 369 | lib3270_set_model // Set value. |
| 370 | 370 | }, |
| 371 | 371 | |
| 372 | 372 | { |
| 373 | 373 | "host_type", // Property name. |
| 374 | - N_( "" ), // Property description. | |
| 374 | + N_( "Host type name" ), // Property description. | |
| 375 | 375 | lib3270_get_host_type_name, // Get value. |
| 376 | 376 | lib3270_set_host_type_by_name // Set value. |
| 377 | 377 | }, |
| 378 | 378 | |
| 379 | 379 | { |
| 380 | 380 | "host_charset", // Property name. |
| 381 | - N_( "" ), // Property description. | |
| 381 | + N_( "Host charset" ), // Property description. | |
| 382 | 382 | lib3270_get_host_charset, // Get value. |
| 383 | 383 | lib3270_set_host_charset // Set value. |
| 384 | 384 | }, |
| 385 | 385 | |
| 386 | 386 | { |
| 387 | 387 | "display_charset", // Property name. |
| 388 | - N_( "" ), // Property description. | |
| 388 | + N_( "Display charset" ), // Property description. | |
| 389 | 389 | lib3270_get_display_charset, // Get value. |
| 390 | 390 | NULL // Set value. |
| 391 | 391 | }, |
| ... | ... | @@ -405,10 +405,17 @@ |
| 405 | 405 | }, |
| 406 | 406 | |
| 407 | 407 | { |
| 408 | - "crlpath", // Property name. | |
| 409 | - N_( "URL for the CRL file" ), // Property description. | |
| 410 | - lib3270_get_crl_url, // Get value. | |
| 411 | - lib3270_set_crl_url, // Set value. | |
| 408 | + "crlpath", // Property name. | |
| 409 | + N_( "URL for the certificate revocation list" ), // Property description. | |
| 410 | + lib3270_get_crl_url, // Get value. | |
| 411 | + lib3270_set_crl_url, // Set value. | |
| 412 | + }, | |
| 413 | + | |
| 414 | + { | |
| 415 | + "default_host", // Property name. | |
| 416 | + N_( "Default host URL" ), // Property description. | |
| 417 | + lib3270_get_default_host, // Get value. | |
| 418 | + NULL // Set value. | |
| 412 | 419 | }, |
| 413 | 420 | |
| 414 | 421 | ... | ... |
src/lib3270/ssl/negotiate.c
| ... | ... | @@ -270,10 +270,6 @@ static int background_ssl_negotiation(H3270 *hSession, void *message) |
| 270 | 270 | X509_free(peer); |
| 271 | 271 | } |
| 272 | 272 | |
| 273 | - | |
| 274 | - /* Tell the world that we are (still) connected, now in secure mode. */ | |
| 275 | - lib3270_set_connected_initial(hSession); | |
| 276 | - | |
| 277 | 273 | return 0; |
| 278 | 274 | } |
| 279 | 275 | |
| ... | ... | @@ -300,6 +296,11 @@ int ssl_negotiate(H3270 *hSession) |
| 300 | 296 | |
| 301 | 297 | |
| 302 | 298 | } |
| 299 | + else | |
| 300 | + { | |
| 301 | + /* Tell the world that we are (still) connected, now in secure mode. */ | |
| 302 | + lib3270_set_connected_initial(hSession); | |
| 303 | + } | |
| 303 | 304 | |
| 304 | 305 | non_blocking(hSession,True); |
| 305 | 306 | ... | ... |