Commit 111d240274a655c1edb1f986b5ee9394deb2c7ec
1 parent
c395d1f9
Exists in
master
and in
3 other branches
Redesigning type-ahead queue.
Showing
8 changed files
with
137 additions
and
122 deletions
Show diff stats
src/include/lib3270.h
| @@ -733,7 +733,6 @@ | @@ -733,7 +733,6 @@ | ||
| 733 | */ | 733 | */ |
| 734 | LIB3270_EXPORT int lib3270_move_cursor(H3270 *h, LIB3270_DIRECTION dir, unsigned char sel); | 734 | LIB3270_EXPORT int lib3270_move_cursor(H3270 *h, LIB3270_DIRECTION dir, unsigned char sel); |
| 735 | 735 | ||
| 736 | - | ||
| 737 | /** | 736 | /** |
| 738 | * @brief Print page | 737 | * @brief Print page |
| 739 | * | 738 | * |
src/lib3270/Makefile.in
| @@ -354,6 +354,14 @@ else | @@ -354,6 +354,14 @@ else | ||
| 354 | $(BINDBG)/$(LIBNAME)@EXEEXT@ | 354 | $(BINDBG)/$(LIBNAME)@EXEEXT@ |
| 355 | endif | 355 | endif |
| 356 | 356 | ||
| 357 | +publish-debug: \ | ||
| 358 | + $(BINDBG)/$(LIBNAME)@EXEEXT@ | ||
| 359 | + | ||
| 360 | + @rm -f ~/public-html/debug-$(LIBNAME)-@host_cpu@.zip | ||
| 361 | + @zip \ | ||
| 362 | + -9 -D \ | ||
| 363 | + ~/public_html/debug-$(LIBNAME)-@host_cpu@.zip \ | ||
| 364 | + $(BINDBG)/* | ||
| 357 | 365 | ||
| 358 | $(BINDBG)/$(LIBNAME)@DLLEXT@: \ | 366 | $(BINDBG)/$(LIBNAME)@DLLEXT@: \ |
| 359 | $(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@ | 367 | $(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@ |
src/lib3270/kybd.c
| @@ -141,6 +141,7 @@ struct ta | @@ -141,6 +141,7 @@ struct ta | ||
| 141 | TA_TYPE_DEFAULT, | 141 | TA_TYPE_DEFAULT, |
| 142 | TA_TYPE_KEY_AID, | 142 | TA_TYPE_KEY_AID, |
| 143 | TA_TYPE_ACTION, | 143 | TA_TYPE_ACTION, |
| 144 | + TA_TYPE_CURSOR_MOVE, | ||
| 144 | TA_TYPE_USER | 145 | TA_TYPE_USER |
| 145 | } type; | 146 | } type; |
| 146 | 147 | ||
| @@ -155,6 +156,13 @@ struct ta | @@ -155,6 +156,13 @@ struct ta | ||
| 155 | 156 | ||
| 156 | int (*action)(H3270 *); | 157 | int (*action)(H3270 *); |
| 157 | 158 | ||
| 159 | + struct | ||
| 160 | + { | ||
| 161 | + LIB3270_DIRECTION direction; | ||
| 162 | + unsigned char sel; | ||
| 163 | + int (*fn)(H3270 *, LIB3270_DIRECTION, unsigned char); | ||
| 164 | + } move; | ||
| 165 | + | ||
| 158 | } args; | 166 | } args; |
| 159 | 167 | ||
| 160 | }; | 168 | }; |
| @@ -165,17 +173,17 @@ static const char dxl[] = "0123456789abcdef"; | @@ -165,17 +173,17 @@ static const char dxl[] = "0123456789abcdef"; | ||
| 165 | 173 | ||
| 166 | /* | 174 | /* |
| 167 | * Check if the typeahead queue is available | 175 | * Check if the typeahead queue is available |
| 168 | - */ | 176 | + */ /* |
| 169 | static int enq_chk(H3270 *hSession) | 177 | static int enq_chk(H3270 *hSession) |
| 170 | { | 178 | { |
| 171 | - /* If no connection, forget it. */ | 179 | + // If no connection, forget it. |
| 172 | if (!lib3270_connected(hSession)) | 180 | if (!lib3270_connected(hSession)) |
| 173 | { | 181 | { |
| 174 | lib3270_trace_event(hSession," dropped (not connected)\n"); | 182 | lib3270_trace_event(hSession," dropped (not connected)\n"); |
| 175 | return -1; | 183 | return -1; |
| 176 | } | 184 | } |
| 177 | 185 | ||
| 178 | - /* If operator error, complain and drop it. */ | 186 | + // If operator error, complain and drop it. |
| 179 | if (hSession->kybdlock & KL_OERR_MASK) | 187 | if (hSession->kybdlock & KL_OERR_MASK) |
| 180 | { | 188 | { |
| 181 | lib3270_ring_bell(hSession); | 189 | lib3270_ring_bell(hSession); |
| @@ -183,7 +191,7 @@ static int enq_chk(H3270 *hSession) | @@ -183,7 +191,7 @@ static int enq_chk(H3270 *hSession) | ||
| 183 | return -1; | 191 | return -1; |
| 184 | } | 192 | } |
| 185 | 193 | ||
| 186 | - /* If scroll lock, complain and drop it. */ | 194 | + // If scroll lock, complain and drop it. |
| 187 | if (hSession->kybdlock & KL_SCROLLED) | 195 | if (hSession->kybdlock & KL_SCROLLED) |
| 188 | { | 196 | { |
| 189 | lib3270_ring_bell(hSession); | 197 | lib3270_ring_bell(hSession); |
| @@ -191,7 +199,7 @@ static int enq_chk(H3270 *hSession) | @@ -191,7 +199,7 @@ static int enq_chk(H3270 *hSession) | ||
| 191 | return -1; | 199 | return -1; |
| 192 | } | 200 | } |
| 193 | 201 | ||
| 194 | - /* If typeahead disabled, complain and drop it. */ | 202 | + // If typeahead disabled, complain and drop it. |
| 195 | if (!hSession->typeahead) | 203 | if (!hSession->typeahead) |
| 196 | { | 204 | { |
| 197 | lib3270_trace_event(hSession," dropped (no typeahead)\n"); | 205 | lib3270_trace_event(hSession," dropped (no typeahead)\n"); |
| @@ -200,38 +208,87 @@ static int enq_chk(H3270 *hSession) | @@ -200,38 +208,87 @@ static int enq_chk(H3270 *hSession) | ||
| 200 | 208 | ||
| 201 | return 0; | 209 | return 0; |
| 202 | } | 210 | } |
| 211 | +*/ | ||
| 203 | 212 | ||
| 204 | /** | 213 | /** |
| 205 | - * @brief Put a "Key-aid" on the typeahead queue | 214 | + * @brief Create a new typeahead action. |
| 215 | + * | ||
| 216 | + * Check for typeahead availability and create a new TA structure. | ||
| 217 | + * | ||
| 218 | + * @return new typeahead struct or NULL if it's not available. | ||
| 206 | */ | 219 | */ |
| 207 | - static void enq_key(H3270 *session, unsigned char aid_code) | ||
| 208 | - { | 220 | +static struct ta * new_ta(H3270 *hSession, enum _ta_type type) |
| 221 | +{ | ||
| 209 | struct ta *ta; | 222 | struct ta *ta; |
| 210 | 223 | ||
| 211 | - if(enq_chk(session)) | ||
| 212 | - return; | 224 | + // If no connection, forget it. |
| 225 | + if (!lib3270_connected(hSession)) | ||
| 226 | + { | ||
| 227 | + lib3270_ring_bell(hSession); | ||
| 228 | + lib3270_trace_event(hSession,"typeahead action dropped (not connected)\n"); | ||
| 229 | + return NULL; | ||
| 230 | + } | ||
| 213 | 231 | ||
| 214 | - ta = (struct ta *) lib3270_malloc(sizeof(*ta)); | ||
| 215 | - ta->next = (struct ta *) NULL; | ||
| 216 | - ta->type = TA_TYPE_KEY_AID; | ||
| 217 | - ta->args.aid_code = aid_code; | 232 | + // If operator error, complain and drop it. |
| 233 | + if (hSession->kybdlock & KL_OERR_MASK) | ||
| 234 | + { | ||
| 235 | + lib3270_ring_bell(hSession); | ||
| 236 | + lib3270_trace_event(hSession,"typeahead action dropped (operator error)\n"); | ||
| 237 | + return NULL; | ||
| 238 | + } | ||
| 239 | + | ||
| 240 | + // If scroll lock, complain and drop it. | ||
| 241 | + if (hSession->kybdlock & KL_SCROLLED) | ||
| 242 | + { | ||
| 243 | + lib3270_ring_bell(hSession); | ||
| 244 | + lib3270_trace_event(hSession,"typeahead action dropped (scrolled)\n"); | ||
| 245 | + return NULL; | ||
| 246 | + } | ||
| 247 | + | ||
| 248 | + // If typeahead disabled, complain and drop it. | ||
| 249 | + if (!hSession->typeahead) | ||
| 250 | + { | ||
| 251 | + lib3270_trace_event(hSession,"typeahead action dropped (no typeahead)\n"); | ||
| 252 | + return NULL; | ||
| 253 | + } | ||
| 218 | 254 | ||
| 219 | - trace("Adding key %02x on queue",(int) aid_code); | 255 | + ta = (struct ta *) lib3270_malloc(sizeof(*ta)); |
| 256 | + ta->next = (struct ta *) NULL; | ||
| 257 | + ta->type = type; | ||
| 220 | 258 | ||
| 221 | - if (session->ta_head) | 259 | + if(hSession->ta_head) |
| 222 | { | 260 | { |
| 223 | - session->ta_tail->next = ta; | 261 | + hSession->ta_tail->next = ta; |
| 224 | } | 262 | } |
| 225 | else | 263 | else |
| 226 | { | 264 | { |
| 227 | - session->ta_head = ta; | ||
| 228 | - status_typeahead(session,True); | 265 | + hSession->ta_head = ta; |
| 266 | + status_typeahead(hSession,True); | ||
| 229 | } | 267 | } |
| 230 | - session->ta_tail = ta; | ||
| 231 | 268 | ||
| 232 | - lib3270_trace_event(session," Key-aid queued (kybdlock 0x%x)\n", session->kybdlock); | ||
| 233 | - } | 269 | + hSession->ta_tail = ta; |
| 234 | 270 | ||
| 271 | + return ta; | ||
| 272 | +} | ||
| 273 | + | ||
| 274 | + | ||
| 275 | +/** | ||
| 276 | + * @brief Put a "Key-aid" on the typeahead queue | ||
| 277 | + * | ||
| 278 | + * @param hSession TN3270 Session handle. | ||
| 279 | + * @param aid_code Key-ad code to put on typeahead. | ||
| 280 | + */ | ||
| 281 | + static void enq_key(H3270 *hSession, unsigned char aid_code) | ||
| 282 | + { | ||
| 283 | + struct ta *ta = new_ta(hSession, TA_TYPE_KEY_AID); | ||
| 284 | + | ||
| 285 | + if(!ta) | ||
| 286 | + return; | ||
| 287 | + | ||
| 288 | + ta->args.aid_code = aid_code; | ||
| 289 | + | ||
| 290 | + lib3270_trace_event(hSession,"typeahead action Key-aid queued (kybdlock 0x%x)\n", hSession->kybdlock); | ||
| 291 | + } | ||
| 235 | 292 | ||
| 236 | 293 | ||
| 237 | /** | 294 | /** |
| @@ -239,15 +296,12 @@ static int enq_chk(H3270 *hSession) | @@ -239,15 +296,12 @@ static int enq_chk(H3270 *hSession) | ||
| 239 | */ | 296 | */ |
| 240 | static void enq_ta(H3270 *hSession, void (*fn)(H3270 *, const char *, const char *), const char *parm1, const char *parm2) | 297 | static void enq_ta(H3270 *hSession, void (*fn)(H3270 *, const char *, const char *), const char *parm1, const char *parm2) |
| 241 | { | 298 | { |
| 242 | - struct ta *ta; | 299 | + struct ta *ta = new_ta(hSession, TA_TYPE_DEFAULT); |
| 243 | 300 | ||
| 244 | - if(enq_chk(hSession)) | 301 | + if(!ta) |
| 245 | return; | 302 | return; |
| 246 | 303 | ||
| 247 | - ta = (struct ta *) lib3270_malloc(sizeof(*ta)); | ||
| 248 | - ta->next = (struct ta *) NULL; | ||
| 249 | - ta->type = TA_TYPE_DEFAULT; | ||
| 250 | - ta->args.def.fn = fn; | 304 | + ta->args.def.fn = fn; |
| 251 | 305 | ||
| 252 | if (parm1) | 306 | if (parm1) |
| 253 | ta->args.def.parm[0] = NewString(parm1); | 307 | ta->args.def.parm[0] = NewString(parm1); |
| @@ -255,44 +309,17 @@ static void enq_ta(H3270 *hSession, void (*fn)(H3270 *, const char *, const char | @@ -255,44 +309,17 @@ static void enq_ta(H3270 *hSession, void (*fn)(H3270 *, const char *, const char | ||
| 255 | if (parm2) | 309 | if (parm2) |
| 256 | ta->args.def.parm[1] = NewString(parm2); | 310 | ta->args.def.parm[1] = NewString(parm2); |
| 257 | 311 | ||
| 258 | - if(hSession->ta_head) | ||
| 259 | - { | ||
| 260 | - hSession->ta_tail->next = ta; | ||
| 261 | - } | ||
| 262 | - else | ||
| 263 | - { | ||
| 264 | - hSession->ta_head = ta; | ||
| 265 | - status_typeahead(hSession,True); | ||
| 266 | - } | ||
| 267 | - hSession->ta_tail = ta; | ||
| 268 | 312 | ||
| 269 | - lib3270_trace_event(hSession," action queued (kybdlock 0x%x)\n", hSession->kybdlock); | 313 | + lib3270_trace_event(hSession,"typeahead action queued (kybdlock 0x%x)\n", hSession->kybdlock); |
| 270 | } | 314 | } |
| 271 | 315 | ||
| 272 | static void enq_action(H3270 *hSession, int (*fn)(H3270 *)) | 316 | static void enq_action(H3270 *hSession, int (*fn)(H3270 *)) |
| 273 | { | 317 | { |
| 274 | - struct ta *ta; | 318 | + struct ta *ta = new_ta(hSession, TA_TYPE_ACTION); |
| 275 | 319 | ||
| 276 | - if(enq_chk(hSession)) | ||
| 277 | - return; | ||
| 278 | - | ||
| 279 | - ta = (struct ta *) lib3270_malloc(sizeof(*ta)); | ||
| 280 | - ta->next = (struct ta *) NULL; | ||
| 281 | - ta->type = TA_TYPE_ACTION; | ||
| 282 | ta->args.action = fn; | 320 | ta->args.action = fn; |
| 283 | 321 | ||
| 284 | - if(hSession->ta_head) | ||
| 285 | - { | ||
| 286 | - hSession->ta_tail->next = ta; | ||
| 287 | - } | ||
| 288 | - else | ||
| 289 | - { | ||
| 290 | - hSession->ta_head = ta; | ||
| 291 | - status_typeahead(hSession,True); | ||
| 292 | - } | ||
| 293 | - hSession->ta_tail = ta; | ||
| 294 | - | ||
| 295 | - lib3270_trace_event(hSession," action queued (kybdlock 0x%x)\n", hSession->kybdlock); | 322 | + lib3270_trace_event(hSession,"single action queued (kybdlock 0x%x)\n", hSession->kybdlock); |
| 296 | } | 323 | } |
| 297 | 324 | ||
| 298 | 325 | ||
| @@ -320,6 +347,10 @@ int run_ta(H3270 *hSession) | @@ -320,6 +347,10 @@ int run_ta(H3270 *hSession) | ||
| 320 | lib3270_free(ta->args.def.parm[1]); | 347 | lib3270_free(ta->args.def.parm[1]); |
| 321 | break; | 348 | break; |
| 322 | 349 | ||
| 350 | + case TA_TYPE_CURSOR_MOVE: | ||
| 351 | + ta->args.move.fn(hSession,ta->args.move.direction,ta->args.move.sel); | ||
| 352 | + break; | ||
| 353 | + | ||
| 323 | case TA_TYPE_ACTION: | 354 | case TA_TYPE_ACTION: |
| 324 | ta->args.action(hSession); | 355 | ta->args.action(hSession); |
| 325 | break; | 356 | break; |
| @@ -753,9 +784,11 @@ static void key_Character_wrapper(H3270 *hSession, const char *param1, const cha | @@ -753,9 +784,11 @@ static void key_Character_wrapper(H3270 *hSession, const char *param1, const cha | ||
| 753 | (void) key_Character(hSession, code, with_ge, pasting, NULL); | 784 | (void) key_Character(hSession, code, with_ge, pasting, NULL); |
| 754 | } | 785 | } |
| 755 | 786 | ||
| 756 | -/* | ||
| 757 | - * Handle an ordinary displayable character key. Lots of stuff to handle | ||
| 758 | - * insert-mode, protected fields and etc. | 787 | +/** |
| 788 | + * @brief Handle an ordinary displayable character key. | ||
| 789 | + * | ||
| 790 | + * Lots of stuff to handle insert-mode, protected fields and etc. | ||
| 791 | + * | ||
| 759 | */ | 792 | */ |
| 760 | static Boolean key_Character(H3270 *hSession, int code, Boolean with_ge, Boolean pasting, Boolean *skipped) | 793 | static Boolean key_Character(H3270 *hSession, int code, Boolean with_ge, Boolean pasting, Boolean *skipped) |
| 761 | { | 794 | { |
| @@ -1732,9 +1765,9 @@ LIB3270_EXPORT int lib3270_nextword(H3270 *hSession) | @@ -1732,9 +1765,9 @@ LIB3270_EXPORT int lib3270_nextword(H3270 *hSession) | ||
| 1732 | 1765 | ||
| 1733 | if (hSession->kybdlock) { | 1766 | if (hSession->kybdlock) { |
| 1734 | enq_action(hSession, lib3270_nextword ); | 1767 | enq_action(hSession, lib3270_nextword ); |
| 1735 | -// enq_ta(NextWord_action, CN, CN); | ||
| 1736 | return 0; | 1768 | return 0; |
| 1737 | } | 1769 | } |
| 1770 | + | ||
| 1738 | #if defined(X3270_ANSI) /*[*/ | 1771 | #if defined(X3270_ANSI) /*[*/ |
| 1739 | if (IN_ANSI) | 1772 | if (IN_ANSI) |
| 1740 | return 0; | 1773 | return 0; |
| @@ -1798,48 +1831,37 @@ LIB3270_EXPORT int lib3270_move_cursor(H3270 *hSession, LIB3270_DIRECTION dir, u | @@ -1798,48 +1831,37 @@ LIB3270_EXPORT int lib3270_move_cursor(H3270 *hSession, LIB3270_DIRECTION dir, u | ||
| 1798 | { | 1831 | { |
| 1799 | FAIL_IF_NOT_ONLINE(hSession); | 1832 | FAIL_IF_NOT_ONLINE(hSession); |
| 1800 | 1833 | ||
| 1801 | - int cursor_addr = hSession->cursor_addr; | ||
| 1802 | - int maxlen = hSession->cols * hSession->rows; | 1834 | + if (hSession->kybdlock) { |
| 1835 | + | ||
| 1836 | + struct ta *ta = new_ta(hSession, TA_TYPE_CURSOR_MOVE); | ||
| 1837 | + | ||
| 1838 | + ta->args.move.direction = dir; | ||
| 1839 | + ta->args.move.fn = lib3270_move_cursor; | ||
| 1840 | + ta->args.move.sel = sel; | ||
| 1841 | + | ||
| 1842 | + return 0; | ||
| 1843 | + } | ||
| 1803 | 1844 | ||
| 1804 | switch(dir) | 1845 | switch(dir) |
| 1805 | { | 1846 | { |
| 1806 | case LIB3270_DIR_UP: | 1847 | case LIB3270_DIR_UP: |
| 1807 | - | ||
| 1808 | - if(sel && cursor_addr <= hSession->cols) | ||
| 1809 | - return errno = EINVAL; | ||
| 1810 | - | ||
| 1811 | - cursor_addr -= hSession->cols; | 1848 | + lib3270_cursor_up(hSession); |
| 1812 | break; | 1849 | break; |
| 1813 | 1850 | ||
| 1814 | case LIB3270_DIR_DOWN: | 1851 | case LIB3270_DIR_DOWN: |
| 1815 | - | ||
| 1816 | - if(sel && cursor_addr >= (hSession->cols * (hSession->rows-1))) | ||
| 1817 | - return errno = EINVAL; | ||
| 1818 | - | ||
| 1819 | - cursor_addr += hSession->cols; | 1852 | + lib3270_cursor_down(hSession); |
| 1820 | break; | 1853 | break; |
| 1821 | 1854 | ||
| 1822 | case LIB3270_DIR_LEFT: | 1855 | case LIB3270_DIR_LEFT: |
| 1823 | - | ||
| 1824 | - if(sel && (cursor_addr % hSession->cols) < 1) | ||
| 1825 | - return errno = EINVAL; | ||
| 1826 | - | ||
| 1827 | - cursor_addr--; | 1856 | + lib3270_cursor_left(hSession); |
| 1828 | break; | 1857 | break; |
| 1829 | 1858 | ||
| 1830 | case LIB3270_DIR_RIGHT: | 1859 | case LIB3270_DIR_RIGHT: |
| 1831 | - | ||
| 1832 | - if(sel && (cursor_addr % hSession->cols) >= (hSession->cols-1)) | ||
| 1833 | - return errno = EINVAL; | ||
| 1834 | - | ||
| 1835 | - cursor_addr++; | 1860 | + lib3270_cursor_right(hSession); |
| 1836 | break; | 1861 | break; |
| 1837 | 1862 | ||
| 1838 | case LIB3270_DIR_END: | 1863 | case LIB3270_DIR_END: |
| 1839 | - | ||
| 1840 | - cursor_addr = lib3270_get_field_end(hSession,cursor_addr); | ||
| 1841 | - if(cursor_addr == -1) | ||
| 1842 | - return errno = EINVAL; | 1864 | + cursor_move(hSession,lib3270_get_field_end(hSession,hSession->cursor_addr)); |
| 1843 | break; | 1865 | break; |
| 1844 | 1866 | ||
| 1845 | default: | 1867 | default: |
| @@ -1848,31 +1870,7 @@ LIB3270_EXPORT int lib3270_move_cursor(H3270 *hSession, LIB3270_DIRECTION dir, u | @@ -1848,31 +1870,7 @@ LIB3270_EXPORT int lib3270_move_cursor(H3270 *hSession, LIB3270_DIRECTION dir, u | ||
| 1848 | } | 1870 | } |
| 1849 | 1871 | ||
| 1850 | if(sel) | 1872 | if(sel) |
| 1851 | - { | ||
| 1852 | - lib3270_select_to(hSession,cursor_addr); | ||
| 1853 | - } | ||
| 1854 | - else | ||
| 1855 | - { | ||
| 1856 | - | ||
| 1857 | - if(cursor_addr >= maxlen) | ||
| 1858 | - { | ||
| 1859 | - cursor_move(hSession,cursor_addr % maxlen); | ||
| 1860 | - } | ||
| 1861 | - else if(cursor_addr < 0) | ||
| 1862 | - { | ||
| 1863 | - cursor_move(hSession,cursor_addr + maxlen); | ||
| 1864 | - } | ||
| 1865 | - else | ||
| 1866 | - { | ||
| 1867 | - cursor_move(hSession,cursor_addr); | ||
| 1868 | - } | ||
| 1869 | - | ||
| 1870 | - if(hSession->kybdlock && (KYBDLOCK_IS_OERR(hSession))) | ||
| 1871 | - { | ||
| 1872 | - status_reset(hSession); | ||
| 1873 | - } | ||
| 1874 | - | ||
| 1875 | - } | 1873 | + lib3270_select_to(hSession,hSession->cursor_addr); |
| 1876 | 1874 | ||
| 1877 | return 0; | 1875 | return 0; |
| 1878 | } | 1876 | } |
src/lib3270/linux/connect.c
| @@ -87,7 +87,8 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | @@ -87,7 +87,8 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | ||
| 87 | else if(err) | 87 | else if(err) |
| 88 | { | 88 | { |
| 89 | char buffer[4096]; | 89 | char buffer[4096]; |
| 90 | - snprintf(buffer,4095,_( "Can't connect to %s" ), hSession->host.current ); | 90 | + |
| 91 | + snprintf(buffer,4095,_( "Can't connect to %s" ), lib3270_get_url(hSession) ); | ||
| 91 | 92 | ||
| 92 | lib3270_disconnect(hSession); | 93 | lib3270_disconnect(hSession); |
| 93 | lib3270_popup_dialog( | 94 | lib3270_popup_dialog( |
src/lib3270/ssl/linux/getcrl.c
| @@ -170,7 +170,7 @@ X509_CRL * lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | @@ -170,7 +170,7 @@ X509_CRL * lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | ||
| 170 | return NULL; | 170 | return NULL; |
| 171 | } | 171 | } |
| 172 | 172 | ||
| 173 | - trace_ssl(hSession, "crl=%s",consturl); | 173 | + trace_ssl(hSession, "crl=%s\n",consturl); |
| 174 | 174 | ||
| 175 | if(strncasecmp(consturl,"file://",7) == 0) | 175 | if(strncasecmp(consturl,"file://",7) == 0) |
| 176 | { | 176 | { |
src/lib3270/ssl/windows/getcrl.c
| @@ -130,7 +130,7 @@ X509_CRL * lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | @@ -130,7 +130,7 @@ X509_CRL * lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | ||
| 130 | return NULL; | 130 | return NULL; |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | - trace_ssl(hSession, "crl=%s",consturl); | 133 | + trace_ssl(hSession, "crl=%s\n",consturl); |
| 134 | 134 | ||
| 135 | if(strncasecmp(consturl,"file://",7) == 0) | 135 | if(strncasecmp(consturl,"file://",7) == 0) |
| 136 | { | 136 | { |
| @@ -185,6 +185,9 @@ X509_CRL * lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | @@ -185,6 +185,9 @@ X509_CRL * lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | ||
| 185 | return NULL; | 185 | return NULL; |
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | + debug("Tamanho da resposta: %u", (unsigned int) crl_data->length); | ||
| 189 | + debug("Resposta:\n-------------------------------------------\n%s\n-------------------------------------------\n",crl_data->contents); | ||
| 190 | + | ||
| 188 | char *ct = NULL; | 191 | char *ct = NULL; |
| 189 | res = curl_easy_getinfo(hCurl, CURLINFO_CONTENT_TYPE, &ct); | 192 | res = curl_easy_getinfo(hCurl, CURLINFO_CONTENT_TYPE, &ct); |
| 190 | if(res != CURLE_OK) | 193 | if(res != CURLE_OK) |
| @@ -192,12 +195,12 @@ X509_CRL * lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | @@ -192,12 +195,12 @@ X509_CRL * lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | ||
| 192 | message->error = hSession->ssl.error = 0; | 195 | message->error = hSession->ssl.error = 0; |
| 193 | message->title = N_( "Security error" ); | 196 | message->title = N_( "Security error" ); |
| 194 | message->text = N_( "Error loading CRL" ); | 197 | message->text = N_( "Error loading CRL" ); |
| 195 | - message->description = curl_easy_strerror(res); | 198 | + message->description = curl_easy_strerror(res); |
| 196 | lib3270_write_log(hSession,"ssl","%s: %s",consturl, message->description); | 199 | lib3270_write_log(hSession,"ssl","%s: %s",consturl, message->description); |
| 197 | return NULL; | 200 | return NULL; |
| 198 | } | 201 | } |
| 199 | 202 | ||
| 200 | - debug("content-type: %s",ct); | 203 | + // debug("content-type: %s",ct); |
| 201 | 204 | ||
| 202 | if(ct) | 205 | if(ct) |
| 203 | { | 206 | { |
| @@ -233,7 +236,6 @@ X509_CRL * lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | @@ -233,7 +236,6 @@ X509_CRL * lib3270_get_X509_CRL(H3270 *hSession, SSL_ERROR_MESSAGE * message) | ||
| 233 | message->error = hSession->ssl.error = ERR_get_error(); | 236 | message->error = hSession->ssl.error = ERR_get_error(); |
| 234 | message->title = N_( "Security error" ); | 237 | message->title = N_( "Security error" ); |
| 235 | message->text = N_( "Got an invalid CRL from LDAP server" ); | 238 | message->text = N_( "Got an invalid CRL from LDAP server" ); |
| 236 | - lib3270_write_log(hSession,"ssl","%s: invalid format:\n%s\n",consturl, crl_data->contents); | ||
| 237 | return NULL; | 239 | return NULL; |
| 238 | } | 240 | } |
| 239 | data += 3; | 241 | data += 3; |
src/lib3270/testprogram/testprogram.c
| @@ -28,6 +28,8 @@ int main(int argc, char *argv[]) | @@ -28,6 +28,8 @@ int main(int argc, char *argv[]) | ||
| 28 | h = lib3270_session_new(""); | 28 | h = lib3270_session_new(""); |
| 29 | printf("3270 session %p created\n]",h); | 29 | printf("3270 session %p created\n]",h); |
| 30 | 30 | ||
| 31 | + lib3270_set_url(h,NULL); | ||
| 32 | + | ||
| 31 | int long_index =0; | 33 | int long_index =0; |
| 32 | int opt; | 34 | int opt; |
| 33 | while((opt = getopt_long(argc, argv, "C:U:", options, &long_index )) != -1) { | 35 | while((opt = getopt_long(argc, argv, "C:U:", options, &long_index )) != -1) { |
src/lib3270/windows/connect.c
| @@ -86,7 +86,7 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | @@ -86,7 +86,7 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | ||
| 86 | else if(err) | 86 | else if(err) |
| 87 | { | 87 | { |
| 88 | char buffer[4096]; | 88 | char buffer[4096]; |
| 89 | - snprintf(buffer,4095,_( "Can't connect to %s" ), hSession->host.current ); | 89 | + snprintf(buffer,4095,_( "Can't connect to %s" ), lib3270_get_url(hSession) ); |
| 90 | 90 | ||
| 91 | lib3270_disconnect(hSession); | 91 | lib3270_disconnect(hSession); |
| 92 | lib3270_popup_dialog( hSession, | 92 | lib3270_popup_dialog( hSession, |
| @@ -175,12 +175,17 @@ LIB3270_EXPORT int lib3270_connect_url(H3270 *hSession, const char *url, int wai | @@ -175,12 +175,17 @@ LIB3270_EXPORT int lib3270_connect_url(H3270 *hSession, const char *url, int wai | ||
| 175 | struct addrinfo * result = NULL; | 175 | struct addrinfo * result = NULL; |
| 176 | struct addrinfo * rp = NULL; | 176 | struct addrinfo * rp = NULL; |
| 177 | 177 | ||
| 178 | + if(!(hSession->host.current && hSession->host.srvc)) | ||
| 179 | + return errno = ENOENT; | ||
| 180 | + | ||
| 178 | memset(&hints,0,sizeof(hints)); | 181 | memset(&hints,0,sizeof(hints)); |
| 179 | hints.ai_family = AF_UNSPEC; // Allow IPv4 or IPv6 | 182 | hints.ai_family = AF_UNSPEC; // Allow IPv4 or IPv6 |
| 180 | hints.ai_socktype = SOCK_STREAM; // Stream socket | 183 | hints.ai_socktype = SOCK_STREAM; // Stream socket |
| 181 | hints.ai_flags = AI_PASSIVE; // For wildcard IP address | 184 | hints.ai_flags = AI_PASSIVE; // For wildcard IP address |
| 182 | hints.ai_protocol = 0; // Any protocol | 185 | hints.ai_protocol = 0; // Any protocol |
| 183 | 186 | ||
| 187 | + debug("%s(%s,%s)",__FUNCTION__,hSession->host.current, hSession->host.srvc); | ||
| 188 | + | ||
| 184 | int rc = getaddrinfo(hSession->host.current, hSession->host.srvc, &hints, &result); | 189 | int rc = getaddrinfo(hSession->host.current, hSession->host.srvc, &hints, &result); |
| 185 | if(rc != 0) | 190 | if(rc != 0) |
| 186 | { | 191 | { |
| @@ -250,7 +255,7 @@ int lib3270_reconnect(H3270 *hSession, int seconds) | @@ -250,7 +255,7 @@ int lib3270_reconnect(H3270 *hSession, int seconds) | ||
| 250 | char buffer[4096]; | 255 | char buffer[4096]; |
| 251 | char msg[4096]; | 256 | char msg[4096]; |
| 252 | 257 | ||
| 253 | - snprintf(buffer,4095,_( "Can't connect to %s:%s"), hSession->host.current, hSession->host.srvc); | 258 | + snprintf(buffer,4095,_( "Can't connect to %s"), lib3270_get_url(hSession)); |
| 254 | 259 | ||
| 255 | strncpy(msg,host.message,4095); | 260 | strncpy(msg,host.message,4095); |
| 256 | 261 |