From 310529321e9b39dc183b929871a09b6d8e5764d7 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Wed, 7 Mar 2012 12:07:56 +0000 Subject: [PATCH] Atualizando tratamento de logs e popups de erro --- src/gtk/Makefile.in | 2 +- src/gtk/v3270/widget.c | 7 +++++++ src/include/rules.mak.in | 4 ++-- src/lib3270/XtGlue.c | 8 ++++---- src/lib3270/api.h | 41 ++++++++++++++++++++++------------------- src/lib3270/charset.c | 10 ++++------ src/lib3270/glue.c | 9 ++++----- src/lib3270/host.c | 34 +++++++++++++--------------------- src/lib3270/kybd.c | 2 +- src/lib3270/log.c | 122 ++++++++++++++++++++++++++++---------------------------------------------------------------------------------------------- src/lib3270/printer.c | 14 +++++++------- src/lib3270/proxy.c | 82 +++++++++++++++++++++++++++++++++++++++++----------------------------------------- src/lib3270/rpq.c | 4 ++-- src/lib3270/screen.c | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------- src/lib3270/telnet.c | 23 +++++++++++------------ src/lib3270/utf8.c | 4 ++-- src/lib3270/util.c | 8 ++++---- 17 files changed, 206 insertions(+), 297 deletions(-) diff --git a/src/gtk/Makefile.in b/src/gtk/Makefile.in index 577159e..2e5f08c 100644 --- a/src/gtk/Makefile.in +++ b/src/gtk/Makefile.in @@ -56,7 +56,7 @@ SOURCES=main.c mainwindow.c actions.c fonts.c \ $(foreach SRC, $(COMMON_SRC), common/$(SRC)) \ $(foreach SRC, $(UI_PARSER_SRC), uiparser/$(SRC)) -DEPENDS=*.h common/*.h uiparser/*.h v3270/*.h Makefile +DEPENDS=*.h common/*.h uiparser/*.h v3270/*.h VALGRIND=@VALGRIND@ diff --git a/src/gtk/v3270/widget.c b/src/gtk/v3270/widget.c index e8950e7..dd8fe3f 100644 --- a/src/gtk/v3270/widget.c +++ b/src/gtk/v3270/widget.c @@ -392,6 +392,13 @@ static void v3270_init(v3270 *widget) { trace("%s",__FUNCTION__); widget->host = lib3270_session_new(""); + + if(widget->host->sz != sizeof(H3270)) + { + g_critical(N_( "Unexpected signature in H3270 object, possible version mismatch in lib3270") ); + return; + } + widget->host->widget = widget; widget->host->update = v3270_update_char; diff --git a/src/include/rules.mak.in b/src/include/rules.mak.in index 27522c0..f525d5e 100644 --- a/src/include/rules.mak.in +++ b/src/include/rules.mak.in @@ -52,14 +52,14 @@ OBJEXT=.o #---[ Paths ]------------------------------------------------------------------ -ROOTDIR ?= "." +ROOTDIR ?= . OBJDIR ?= $(ROOTDIR)/.obj BINDIR ?= $(ROOTDIR)/.bin #---[ Rules ]------------------------------------------------------------------ $(OBJDIR)/Debug/%.o: %.c $(DEPENDS) - @echo $< ... + @echo `basename $@` ... @$(MKDIR) `dirname $@` @$(CC) $(DEBUG_CFLAGS) $(CFLAGS) $(LIB3270_CFLAGS) -o $@ -c $< diff --git a/src/lib3270/XtGlue.c b/src/lib3270/XtGlue.c index e0abcc2..53413c6 100644 --- a/src/lib3270/XtGlue.c +++ b/src/lib3270/XtGlue.c @@ -461,7 +461,7 @@ static int DefaultProcessEvents(int block) if (ns < 0) { if (errno != EINTR) - Warning( "process_events: select() failed" ); + Warning(NULL, "process_events: select() failed" ); #endif return processed_any; } @@ -555,7 +555,7 @@ Malloc(size_t len) r = malloc(len); if (r == (char *)NULL) - Error("Out of memory"); + Error(NULL,"Out of memory"); return r; } @@ -566,7 +566,7 @@ Calloc(size_t nelem, size_t elsize) char *r = malloc(sz); if(!r) - Error("Out of memory"); + Error(NULL,"Out of memory"); memset(r, 0, sz); return r; @@ -577,7 +577,7 @@ Realloc(void *p, size_t len) { p = realloc(p, len); if (p == NULL) - Error("Out of memory"); + Error(NULL,"Out of memory"); return p; } diff --git a/src/lib3270/api.h b/src/lib3270/api.h index c0848b5..f07590b 100644 --- a/src/lib3270/api.h +++ b/src/lib3270/api.h @@ -98,14 +98,14 @@ #endif - LOCAL_EXTERN int Set3270Log(const char *filename); - LOCAL_EXTERN int WriteLog(const char *module, const char *fmt, ...); - LOCAL_EXTERN int WriteRCLog(const char *module, int rc, const char *fmt, ...); + #include + #define WriteLog(module,fmt, ...) lib3270_write_log(NULL,module,fmt,__VA_ARGS__) + #define WriteRCLog(module,rc,fmt, ...) lib3270_write_rc(NULL,module,fmt,__VA_ARGS__) #ifdef LIB3270_MODULE_NAME - #define Log(fmt, ...) WriteLog(LIB3270_MODULE_NAME,fmt,__VA_ARGS__) + #define Log(fmt, ...) lib3270_write_log(NULL,LIB3270_MODULE_NAME,fmt,__VA_ARGS__) #else - #define Log(fmt, ...) WriteLog("MSG",fmt,__VA_ARGS__) + #define Log(fmt, ...) lib3270_write_log(NULL,"MSG",fmt,__VA_ARGS__) #endif /** 3270 connection handle */ @@ -179,13 +179,19 @@ /** Type of dialog boxes */ - typedef enum _PW3270_DIALOG + typedef enum _LIB3270_NOTIFY { - PW3270_DIALOG_INFO, /**< Simple information dialog */ - PW3270_DIALOG_CRITICAL, /**< Critical error, user can abort application */ + LIB3270_NOTIFY_INFO, /**< Simple information dialog */ + LIB3270_NOTIFY_WARNING, + LIB3270_NOTIFY_ERROR, + LIB3270_NOTIFY_CRITICAL, /**< Critical error, user can abort application */ - PW3270_DIALOG_USER - } PW3270_DIALOG; + LIB3270_NOTIFY_USER /**< Reserver, always the last one */ + } LIB3270_NOTIFY; + + #define PW3270_DIALOG_INFO LIB3270_NOTIFY_INFO + #define PW3270_DIALOG_CRITICAL LIB3270_NOTIFY_CRITICAL + #define PW3270_DIALOG LIB3270_NOTIFY /** extended attributes */ struct ea @@ -336,10 +342,7 @@ unsigned short sz; int (*init)(void); - int (*popup_dialog)(H3270 *session, PW3270_DIALOG type, const char *title, const char *msg, const char *fmt, va_list arg); - void (*Error)(const char *fmt, va_list arg); - void (*Warning)(const char *fmt, va_list arg); - void (*SysError)(const char *title, const char *message, const char *system); + int (*notify)(H3270 *session, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list arg); void (*model_changed)(H3270 *session, const char *name, int model, int rows, int cols); int (*addch)(int row, int col, unsigned char c, unsigned short attr); void (*charset)(char *dcs); @@ -397,8 +400,8 @@ LOCAL_EXTERN const struct lib3270_option * get_3270_option_table(int sz); /* Popups */ - LOCAL_EXTERN void Error(const char *fmt, ...); - LOCAL_EXTERN void Warning(const char *fmt, ...); + LOCAL_EXTERN void Error(H3270 *session, const char *fmt, ...); + LOCAL_EXTERN void Warning(H3270 *session, const char *fmt, ...); LOCAL_EXTERN void show_3270_popup_dialog(H3270 *session, PW3270_DIALOG type, const char *title, const char *msg, const char *fmt, ...); /* Set/Get screen contents */ @@ -420,9 +423,9 @@ LOCAL_EXTERN int Get3270Socket(void); /* Misc calls */ - LOCAL_EXTERN void popup_an_error(const char *fmt, ...); - LOCAL_EXTERN void popup_system_error(const char *title, const char *message, const char *system); - LOCAL_EXTERN void popup_a_sockerr(char *fmt, ...); + LOCAL_EXTERN void popup_an_error(H3270 *session, const char *fmt, ...); + LOCAL_EXTERN void popup_system_error(H3270 *session, const char *title, const char *message, const char *fmt, ...); + LOCAL_EXTERN void popup_a_sockerr(H3270 *session, char *fmt, ...); #define query_3270_terminal_status(void) lib3270_get_program_message(NULL) diff --git a/src/lib3270/charset.c b/src/lib3270/charset.c index 8b25cfc..04f7a61 100644 --- a/src/lib3270/charset.c +++ b/src/lib3270/charset.c @@ -333,14 +333,13 @@ set_cgcsgids(char *spec) break; #endif /*]*/ default: - popup_an_error("Extra CGCSGID(s), ignoring"); + popup_an_error(NULL,"Extra CGCSGID(s), ignoring"); break; } if (idp == NULL) break; if (set_cgcsgid(token, idp) < 0) { - popup_an_error("Invalid CGCSGID '%s', ignoring", - token); + popup_an_error(NULL,"Invalid CGCSGID '%s', ignoring",token); n_ids = -1; break; } @@ -620,8 +619,7 @@ remap_chars(char *csname, char *spec, remap_scope scope, int *ne) while ((tok = strtok(s, " \t\n")) != CN) { if (ebc >= 256) { - popup_an_error("Charset has more than 256 " - "entries"); + popup_an_error(NULL,"Charset has more than 256 entries"); rc = CS_BAD; break; } @@ -635,7 +633,7 @@ remap_chars(char *csname, char *spec, remap_scope scope, int *ne) if (strlen(tok) == 1) iso = tok[0] & 0xff; else { - popup_an_error("Invalid charset " + popup_an_error(NULL,"Invalid charset " "entry '%s' (#%d)", tok, ebc); rc = CS_BAD; diff --git a/src/lib3270/glue.c b/src/lib3270/glue.c index 6db47d7..f6c6782 100644 --- a/src/lib3270/glue.c +++ b/src/lib3270/glue.c @@ -988,7 +988,7 @@ read_resource_file(const char *filename, Boolean fatal) if (*s == '#') { (void) sprintf(where, "%s:%d: Invalid profile " "syntax ('#' ignored)", filename, lno); - Warning(where); + Warning(NULL,where); ilen = 0; continue; } @@ -999,7 +999,7 @@ read_resource_file(const char *filename, Boolean fatal) if (ilen >= sizeof(buf) - 1) { (void) sprintf(where, "%s:%d: Line too long\n", filename, lno); - Warning(where); + Warning(NULL,where); break; } continue; @@ -1045,8 +1045,7 @@ Boolean error_popup_visible = False; /* Pop up an error dialog, based on an error number. */ -void -popup_an_errno(int errn, const char *fmt, ...) +void popup_an_errno(int errn, const char *fmt, ...) { char vmsgbuf[4096]; va_list args; @@ -1057,7 +1056,7 @@ popup_an_errno(int errn, const char *fmt, ...) WriteLog("3270", "Error Popup:\n%s\nrc=%d (%s)",vmsgbuf,errn,strerror(errn)); - Error(vmsgbuf); + Error(NULL,vmsgbuf); } #ifdef DEBUG diff --git a/src/lib3270/host.c b/src/lib3270/host.c index afdb4b8..350f897 100644 --- a/src/lib3270/host.c +++ b/src/lib3270/host.c @@ -225,7 +225,7 @@ parse_localprocess(const char *s) * Returns NULL if there is a syntax error. */ static char * -split_host(char *s, char *ansi, char *std_ds, char *passthru, +split_host(H3270 *hSession, char *s, char *ansi, char *std_ds, char *passthru, char *non_e, char *secure, char *no_login, char *xluname, char **port, char *needed) { @@ -259,7 +259,7 @@ split_host(char *s, char *ansi, char *std_ds, char *passthru, while (*s && isspace(*s)) s++; if (!*s) { - popup_an_error("Empty hostname"); + popup_an_error(NULL,_( "Empty hostname" )); goto split_fail; } @@ -297,8 +297,7 @@ split_host(char *s, char *ansi, char *std_ds, char *passthru, *no_login = True; break; default: - popup_an_error("Hostname syntax error:\n" - "Option '%c:' not supported", *s); + popup_system_error(hSession,NULL,_("Hostname syntax error"),_("Option '%c:' not supported"),*s); goto split_fail; } *needed = True; @@ -319,8 +318,7 @@ split_host(char *s, char *ansi, char *std_ds, char *passthru, char *lu_last = at - 1; if (at == s) { - popup_an_error("Hostname syntax error:\n" - "Empty LU name"); + popup_system_error(hSession,NULL,_("Hostname syntax error"),"%s",_("Empty LU name")); goto split_fail; } while (lu_last < s && isspace(*lu_last)) @@ -332,9 +330,7 @@ split_host(char *s, char *ansi, char *std_ds, char *passthru, while (isspace(*u)) u++; if (*u != '@') { - popup_an_error("Hostname syntax " - "error:\n" - "Space in LU name"); + popup_system_error(hSession,NULL,_("Hostname syntax error"),"%s",_("Space in LU name")); goto split_fail; } break; @@ -360,8 +356,7 @@ split_host(char *s, char *ansi, char *std_ds, char *passthru, /* Check for junk before the '['. */ if (lbracket != s) { - popup_an_error("Hostname syntax error:\n" - "Text before '['"); + popup_system_error(hSession,NULL,_("Hostname syntax error"),"%s",_("Text before '['")); goto split_fail; } @@ -373,12 +368,11 @@ split_host(char *s, char *ansi, char *std_ds, char *passthru, */ rbracket = strchr(s, ']'); if (rbracket == CN) { - popup_an_error("Hostname syntax error:\n" - "Missing ']'"); + popup_system_error(hSession,NULL,_("Hostname syntax error"),"%s",_("Missing ']'")); goto split_fail; } if (rbracket == s) { - popup_an_error("Empty hostname"); + popup_system_error(hSession,NULL,_("Hostname syntax error"),"%s",_("Empty hostname")); goto split_fail; } *rbracket = '\0'; @@ -395,7 +389,7 @@ split_host(char *s, char *ansi, char *std_ds, char *passthru, /* Check for an empty string. */ if (!*s || *s == ':') { - popup_an_error("Empty hostname"); + popup_an_error(hSession,"Empty hostname"); goto split_fail; } @@ -431,8 +425,7 @@ split_host(char *s, char *ansi, char *std_ds, char *passthru, while (*s && isspace(*s)) s++; if (!*s) { - popup_an_error("Hostname syntax error:\n" - "Empty port name"); + popup_system_error(hSession,NULL,_("Hostname syntax error"),"%s",_("Empty port name")); goto split_fail; } } @@ -447,8 +440,7 @@ split_host(char *s, char *ansi, char *std_ds, char *passthru, while (*s && !isspace(*s) && *s != ':') s++; if (*s != '\0') { - popup_an_error("Hostname syntax error:\n" - "Multiple port names"); + popup_system_error(hSession,NULL,_("Hostname syntax error"),"%s",_("Multiple port names")); goto split_fail; } goto split_success; @@ -482,7 +474,7 @@ static int do_connect(H3270 *hSession, const char *n) while (*n == ' ') n++; if (!*n) { - popup_an_error("Invalid (empty) hostname"); + popup_an_error(hSession,_( "Invalid (empty) hostname" )); return -1; } @@ -512,7 +504,7 @@ static int do_connect(H3270 *hSession, const char *n) Boolean needed; /* Strip off and remember leading qualifiers. */ - if ((s = split_host(nb, &ansi_host, &hSession->std_ds_host, + if ((s = split_host(hSession, nb, &ansi_host, &hSession->std_ds_host, &hSession->passthru_host, &hSession->non_tn3270e_host, &hSession->ssl_host, &hSession->no_login_host, hSession->luname, &port, &needed)) == CN) diff --git a/src/lib3270/kybd.c b/src/lib3270/kybd.c index 7234732..2ee6500 100644 --- a/src/lib3270/kybd.c +++ b/src/lib3270/kybd.c @@ -313,7 +313,7 @@ Boolean run_ta(void) */ default: - popup_an_error( _( "Unexpected type %d in typeahead queue" ), ta->type); + popup_an_error(NULL, _( "Unexpected type %d in typeahead queue" ), ta->type); } diff --git a/src/lib3270/log.c b/src/lib3270/log.c index 491db28..7541b02 100644 --- a/src/lib3270/log.c +++ b/src/lib3270/log.c @@ -30,122 +30,56 @@ * */ - -#include #include #include -#include -#include -#include #include #include +#include +#include "api.h" + +/*---[ Prototipes ]-----------------------------------------------------------------------------------------*/ + + static void defaultlog(H3270 *session, const char *module, int rc, const char *fmt, va_list arg_ptr); /*---[ Constants ]------------------------------------------------------------------------------------------*/ - static char logfile[FILENAME_MAX] = PACKAGE_NAME ".log"; + static void (*loghandler)(H3270 *session, const char *module, int rc, const char *fmt, va_list arg_ptr) = defaultlog; /*---[ Implementacao ]--------------------------------------------------------------------------------------*/ - int Set3270Log(const char *filename) + LIB3270_EXPORT void lib3270_set_log_handler(void (*handler)(H3270 *, const char *, int, const char *, va_list)) { - FILE *out; - - if(strlen(filename) >= FILENAME_MAX) - return EINVAL; - - out = fopen(filename,"a"); - - if(out) - { - strcpy(logfile,filename); - fclose(out); -#if defined(linux) - printf("Logfile set to %s\n",logfile); -#endif - return 0; - } - - return errno; + loghandler = handler ? handler : defaultlog; } - static void writetime(FILE *out, const char *module) + LIB3270_EXPORT int lib3270_write_log(H3270 *session, const char *module, const char *fmt, ...) { - time_t ltime; - char wrk[40]; - - time(<ime); - strftime(wrk, 39, "%d/%m/%Y %H:%M:%S", localtime(<ime)); - fprintf(out,"%s %-8s\t",wrk,module); + va_list arg_ptr; + va_start(arg_ptr, fmt); + loghandler(session,module,0,fmt,arg_ptr); + va_end(arg_ptr); + return 0; } - static FILE *prefix(const char *module) + LIB3270_EXPORT int lib3270_write_rc(H3270 *session, const char *module, int rc, const char *fmt, ...) { - FILE *out = fopen(logfile,"a"); - if(out) - writetime(out,module); - return out; + va_list arg_ptr; + va_start(arg_ptr, fmt); + loghandler(session,module,rc,fmt,arg_ptr); + va_end(arg_ptr); + return rc; } - /** - * Grava uma entrada no arquivo de log. - * - * @param module Identificador do modulo para gravacao no arquivo - * @param fmt String de formatacao para a mensagem no mesmo formato da funcao printf() - * @param ... Argumentos de acordo com a string de formatacao - */ - int WriteLog(const char *module, const char *fmt, ...) + LIB3270_EXPORT void lib3270_write_va_log(H3270 *session, const char *module, const char *fmt, va_list arg) { - va_list arg_ptr; - FILE *out; - - out = prefix(module); - if(!out) - return -1; - - va_start(arg_ptr, fmt); - vfprintf(out, fmt, arg_ptr); - va_end(arg_ptr); - fprintf(out,"\n"); - - fclose(out); - - return 0; + loghandler(session,module,0,fmt,arg); } - /** - * Grava mensagem de erro. - * - * Grava uma mensagem de erro no arquivo de log. - * - * @param module Identificador do modulo para gravacao no arquivo - * @param rc Codigo de erro ou -1 para usar o valor de errno - * @param fmt String de formatacao para a mensagem no mesmo formato da funcao printf() - * @param ... Argumentos de acordo com a string de formatacao - */ - int WriteRCLog(const char *module, int rc, const char *fmt, ...) + static void defaultlog(H3270 *session, const char *module, int rc, const char *fmt, va_list arg_ptr) { - FILE *out; - va_list arg_ptr; - - if(rc == -1) - rc = errno; - - if(!rc) - return 0; - - out = prefix(module); - if(!out) - return -1; - - va_start(arg_ptr, fmt); - vfprintf(out, fmt, arg_ptr); - va_end(arg_ptr); - - fprintf(out,": %s (rc=%d)\n",strerror(rc),rc); - - fclose(out); - - return rc; + fprintf(stderr,"%s:\t",module); + vfprintf(stderr,fmt,arg_ptr); + fprintf(stderr,"\n"); + fflush(stderr); } - diff --git a/src/lib3270/printer.c b/src/lib3270/printer.c index 65c6820..9b0bc1d 100644 --- a/src/lib3270/printer.c +++ b/src/lib3270/printer.c @@ -157,13 +157,13 @@ printer_start(const char *lu) /* Can't start two. */ if (printer_pid != -1) { - popup_an_error("printer is already running"); + popup_an_error(NULL,"printer is already running"); return; } /* Gotta be in 3270 mode. */ if (!IN_3270) { - popup_an_error("Not in 3270 mode"); + popup_an_error(NULL,"Not in 3270 mode"); return; } @@ -173,13 +173,13 @@ printer_start(const char *lu) /* Gotta be in TN3270E mode. */ if (!IN_TN3270E) { - popup_an_error("Not in TN3270E mode"); + popup_an_error(NULL,"Not in TN3270E mode"); return; } /* Gotta be connected to an LU. */ if (h3270.connected_lu == CN) { - popup_an_error("Not connected to a specific LU"); + popup_an_error(NULL,"Not connected to a specific LU"); return; } lu = h3270.connected_lu; @@ -192,13 +192,13 @@ printer_start(const char *lu) /* Fetch the command line and command resources. */ cmdline = get_resource(cmdlineName); if (cmdline == CN) { - popup_an_error("%s resource not defined", cmdlineName); + popup_an_error(NULL,"%s resource not defined", cmdlineName); return; } #if !defined(_WIN32) /*[*/ cmd = get_resource(ResPrinterCommand); if (cmd == CN) { - popup_an_error("printer.command resource not defined"); + popup_an_error(NULL,"printer.command resource not defined"); return; } #else /*][*/ @@ -496,7 +496,7 @@ printer_data(struct pr3o *p, Boolean is_err) p->count = PRINTER_BUF - 1; printer_dump(p, True, True); } else { - popup_an_error(exitmsg); + popup_an_error(NULL,exitmsg); } printer_stop(); return; diff --git a/src/lib3270/proxy.c b/src/lib3270/proxy.c index 1caf971..d140f22 100644 --- a/src/lib3270/proxy.c +++ b/src/lib3270/proxy.c @@ -158,7 +158,7 @@ proxy_setup(char **phost, char **pport) return PT_NONE; if ((colon = strchr(proxy, ':')) == CN || (colon == proxy)) { - popup_an_error("Invalid proxy syntax"); + popup_an_error(NULL,"Invalid proxy syntax"); return -1; } @@ -187,7 +187,7 @@ proxy_setup(char **phost, char **pport) if (parse_host_port(colon + 1, phost, pport) < 0) return -1; if (*pport == CN) { - popup_an_error("Must specify port for telnet proxy"); + popup_an_error(NULL,"Must specify port for telnet proxy"); return -1; } return PT_TELNET; @@ -255,7 +255,7 @@ parse_host_port(char *s, char **phost, char **pport) rbrack == s + 1 || (*(rbrack + 1) != '\0' && *(rbrack + 1) != ':')) { - popup_an_error("Invalid proxy hostname syntax"); + popup_an_error(NULL,"Invalid proxy hostname syntax"); return -1; } if (*(rbrack + 1) == ':') @@ -267,7 +267,7 @@ parse_host_port(char *s, char **phost, char **pport) hstart = s; colon = strchr(s, ':'); if (colon == s) { - popup_an_error("Invalid proxy hostname syntax"); + popup_an_error(NULL,"Invalid proxy hostname syntax"); return -1; } if (colon == NULL) @@ -333,7 +333,7 @@ proxy_passthru(int fd, char *host, unsigned short port) #endif /*]*/ if (send(fd, buf, strlen(buf), 0) < 0) { - popup_a_sockerr("Passthru Proxy: send error"); + popup_a_sockerr(NULL,"Passthru Proxy: send error"); Free(buf); return -1; } @@ -368,7 +368,7 @@ proxy_http(int fd, char *host, unsigned short port) #endif /*]*/ if (send(fd, buf, strlen(buf), 0) < 0) { - popup_a_sockerr("HTTP Proxy: send error"); + popup_a_sockerr(NULL,"HTTP Proxy: send error"); Free(buf); return -1; } @@ -385,7 +385,7 @@ proxy_http(int fd, char *host, unsigned short port) #endif /*]*/ if (send(fd, buf, strlen(buf), 0) < 0) { - popup_a_sockerr("HTTP Proxy: send error"); + popup_a_sockerr(NULL,"HTTP Proxy: send error"); Free(buf); return -1; } @@ -397,7 +397,7 @@ proxy_http(int fd, char *host, unsigned short port) #endif /*]*/ if (send(fd, buf, strlen(buf), 0) < 0) { - popup_a_sockerr("HTTP Proxy: send error"); + popup_a_sockerr(NULL,"HTTP Proxy: send error"); Free(buf); return -1; } @@ -416,7 +416,7 @@ proxy_http(int fd, char *host, unsigned short port) tv.tv_sec = 15; tv.tv_usec = 0; if (select(fd + 1, &rfds, NULL, NULL, &tv) < 0) { - popup_an_error("HTTP Proxy: server timeout"); + popup_an_error(NULL,"HTTP Proxy: server timeout"); #if defined(X3270_TRACE) /*[*/ if (nread) trace_netdata('<', (unsigned char *)rbuf, nread); @@ -426,7 +426,7 @@ proxy_http(int fd, char *host, unsigned short port) nr = recv(fd, &rbuf[nread], 1, 0); if (nr < 0) { - popup_a_sockerr("HTTP Proxy: receive error"); + popup_a_sockerr(NULL,"HTTP Proxy: receive error"); #if defined(X3270_TRACE) /*[*/ if (nread) trace_netdata('<', (unsigned char *)rbuf, nread); @@ -438,7 +438,7 @@ proxy_http(int fd, char *host, unsigned short port) if (nread) trace_netdata('<', (unsigned char *)rbuf, nread); #endif /*]*/ - popup_an_error("HTTP Proxy: unexpected EOF"); + popup_an_error(NULL,"HTTP Proxy: unexpected EOF"); return -1; } if (rbuf[nread] == '\r') @@ -458,11 +458,11 @@ proxy_http(int fd, char *host, unsigned short port) #endif /*]*/ if (strncmp(rbuf, "HTTP/", 5) || (space = strchr(rbuf, ' ')) == CN) { - popup_an_error("HTTP Proxy: unrecognized reply"); + popup_an_error(NULL,"HTTP Proxy: unrecognized reply"); return -1; } if (*(space + 1) != '2') { - popup_an_error("HTTP Proxy: CONNECT failed:\n%s", rbuf); + popup_an_error(NULL,"HTTP Proxy: CONNECT failed:\n%s", rbuf); return -1; } @@ -484,7 +484,7 @@ proxy_telnet(int fd, char *host, unsigned short port) #endif /*]*/ if (send(fd, buf, strlen(buf), 0) < 0) { - popup_a_sockerr("TELNET Proxy: send error"); + popup_a_sockerr(NULL,"TELNET Proxy: send error"); Free(buf); return -1; } @@ -550,7 +550,7 @@ proxy_socks4(int fd, char *host, unsigned short port, int force_a) #endif /*]*/ if (send(fd, buf, s - buf, 0) < 0) { - popup_a_sockerr("SOCKS4 Proxy: send error"); + popup_a_sockerr(NULL,"SOCKS4 Proxy: send error"); Free(buf); return -1; } @@ -577,7 +577,7 @@ proxy_socks4(int fd, char *host, unsigned short port, int force_a) if (send(fd, buf, s - buf, 0) < 0) { Free(buf); - popup_a_sockerr("SOCKS4 Proxy: send error"); + popup_a_sockerr(NULL,"SOCKS4 Proxy: send error"); return -1; } Free(buf); @@ -596,13 +596,13 @@ proxy_socks4(int fd, char *host, unsigned short port, int force_a) tv.tv_sec = 15; tv.tv_usec = 0; if (select(fd + 1, &rfds, NULL, NULL, &tv) < 0) { - popup_an_error("SOCKS4 Proxy: server timeout"); + popup_an_error(NULL,"SOCKS4 Proxy: server timeout"); return -1; } nr = recv(fd, &rbuf[nread], 1, 0); if (nr < 0) { - popup_a_sockerr("SOCKS4 Proxy: receive error"); + popup_a_sockerr(NULL,"SOCKS4 Proxy: receive error"); return -1; } if (nr == 0) @@ -631,16 +631,16 @@ proxy_socks4(int fd, char *host, unsigned short port, int force_a) case 0x5a: break; case 0x5b: - popup_an_error("SOCKS4 Proxy: request rejected or failed"); + popup_an_error(NULL,"SOCKS4 Proxy: request rejected or failed"); return -1; case 0x5c: - popup_an_error("SOCKS4 Proxy: client is not reachable"); + popup_an_error(NULL,"SOCKS4 Proxy: client is not reachable"); return -1; case 0x5d: - popup_an_error("SOCKS4 Proxy: userid error"); + popup_an_error(NULL,"SOCKS4 Proxy: userid error"); return -1; default: - popup_an_error("SOCKS4 Proxy: unknown status 0x%02x", + popup_an_error(NULL,"SOCKS4 Proxy: unknown status 0x%02x", rbuf[1]); return -1; } @@ -708,7 +708,7 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d) trace_netdata('>', rbuf, 3); #endif /*]*/ if (send(fd, (const char *) rbuf, 3, 0) < 0) { - popup_a_sockerr("SOCKS5 Proxy: send error"); + popup_a_sockerr(NULL,"SOCKS5 Proxy: send error"); return -1; } @@ -726,7 +726,7 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d) tv.tv_sec = 15; tv.tv_usec = 0; if (select(fd + 1, &rfds, NULL, NULL, &tv) < 0) { - popup_an_error("SOCKS5 Proxy: server timeout"); + popup_an_error(NULL,"SOCKS5 Proxy: server timeout"); #if defined(X3270_TRACE) /*[*/ if (nread) trace_netdata('<', rbuf, nread); @@ -736,7 +736,7 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d) nr = recv(fd, (char *) &rbuf[nread], 1, 0); if (nr < 0) { - popup_a_sockerr("SOCKS5 Proxy: receive error"); + popup_a_sockerr(NULL,"SOCKS5 Proxy: receive error"); #if defined(X3270_TRACE) /*[*/ if (nread) trace_netdata('<', rbuf, nread); @@ -744,7 +744,7 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d) return -1; } if (nr == 0) { - popup_a_sockerr("SOCKS5 Proxy: unexpected EOF"); + popup_a_sockerr(NULL,"SOCKS5 Proxy: unexpected EOF"); #if defined(X3270_TRACE) /*[*/ if (nread) trace_netdata('<', rbuf, nread); @@ -760,7 +760,7 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d) #endif /*]*/ if (rbuf[0] != 0x05 || (rbuf[1] != 0 && rbuf[1] != 0xff)) { - popup_an_error("SOCKS5 Proxy: bad authentication response"); + popup_an_error(NULL,"SOCKS5 Proxy: bad authentication response"); return -1; } @@ -770,7 +770,7 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d) #endif /*]*/ if (rbuf[1] == 0xff) { - popup_an_error("SOCKS5 Proxy: authentication failure"); + popup_an_error(NULL,"SOCKS5 Proxy: authentication failure"); return -1; } @@ -811,7 +811,7 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d) #endif /*]*/ if (send(fd, buf, s - buf, 0) < 0) { - popup_a_sockerr("SOCKS5 Proxy: send error"); + popup_a_sockerr(NULL,"SOCKS5 Proxy: send error"); Free(buf); return -1; } @@ -835,13 +835,13 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d) tv.tv_sec = 15; tv.tv_usec = 0; if (select(fd + 1, &rfds, NULL, NULL, &tv) < 0) { - popup_an_error("SOCKS5 Proxy: server timeout"); + popup_an_error(NULL,"SOCKS5 Proxy: server timeout"); return -1; } nr = recv(fd, (char *) &r, 1, 0); if (nr < 0) { - popup_a_sockerr("SOCKS5 Proxy: receive error"); + popup_a_sockerr(NULL,"SOCKS5 Proxy: receive error"); #if defined(X3270_TRACE) /*[*/ if (nread) trace_netdata('<', (unsigned char *)buf, nread); @@ -849,7 +849,7 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d) return -1; } if (nr == 0) { - popup_an_error("SOCKS5 Proxy: unexpected EOF"); + popup_an_error(NULL,"SOCKS5 Proxy: unexpected EOF"); #if defined(X3270_TRACE) /*[*/ if (nread) trace_netdata('<', (unsigned char *)buf, nread); @@ -881,37 +881,37 @@ proxy_socks5(int fd, char *host, unsigned short port, int force_d) case 0x00: break; case 0x01: - popup_an_error("SOCKS5 Proxy: server failure"); + popup_an_error(NULL,"SOCKS5 Proxy: server failure"); return -1; case 0x02: - popup_an_error("SOCKS5 Proxy: connection not " + popup_an_error(NULL,"SOCKS5 Proxy: connection not " "allowed"); return -1; case 0x03: - popup_an_error("SOCKS5 Proxy: network " + popup_an_error(NULL,"SOCKS5 Proxy: network " "unreachable"); return -1; case 0x04: - popup_an_error("SOCKS5 Proxy: host " + popup_an_error(NULL,"SOCKS5 Proxy: host " "unreachable"); return -1; case 0x05: - popup_an_error("SOCKS5 Proxy: connection " + popup_an_error(NULL,"SOCKS5 Proxy: connection " "refused"); return -1; case 0x06: - popup_an_error("SOCKS5 Proxy: ttl expired"); + popup_an_error(NULL,"SOCKS5 Proxy: ttl expired"); return -1; case 0x07: - popup_an_error("SOCKS5 Proxy: command not " + popup_an_error(NULL,"SOCKS5 Proxy: command not " "supported"); return -1; case 0x08: - popup_an_error("SOCKS5 Proxy: address type " + popup_an_error(NULL,"SOCKS5 Proxy: address type " "not supported"); return -1; default: - popup_an_error("SOCKS5 Proxy: unknown server " + popup_an_error(NULL,"SOCKS5 Proxy: unknown server " "error 0x%02x", r); return -1; } diff --git a/src/lib3270/rpq.c b/src/lib3270/rpq.c index 9d10709..640cfe3 100644 --- a/src/lib3270/rpq.c +++ b/src/lib3270/rpq.c @@ -213,7 +213,7 @@ do_qr_rpqnames(void) break; default: /* unsupported ID, (can't happen) */ - Error("Unsupported RPQ term"); + Error(NULL,"Unsupported RPQ term"); break; } @@ -752,7 +752,7 @@ rpq_dump_warnings(void) { /* If there's something to complain about, only complain once. */ if (!rpq_complained && rpq_wbcnt) { - popup_an_error(rpq_warnbuf); + popup_an_error(NULL,rpq_warnbuf); rpq_wbcnt = 0; rpq_complained = True; diff --git a/src/lib3270/screen.c b/src/lib3270/screen.c index 63c689b..7af38a9 100644 --- a/src/lib3270/screen.c +++ b/src/lib3270/screen.c @@ -159,7 +159,7 @@ int screen_init(H3270 *session) if(callbacks->init()) { - popup_an_error("Can't initialize terminal."); + popup_an_error(session,"Can't initialize terminal."); return -1; } } @@ -784,137 +784,114 @@ int Register3270ScreenCallbacks(const struct lib3270_screen_callbacks *cbk) return 0; } -void show_3270_popup_dialog(H3270 *session, PW3270_DIALOG type, const char *title, const char *msg, const char *fmt, ...) +void show_3270_popup_dialog(H3270 *session, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, ...) { + CHECK_SESSION_HANDLE(session); + if(!fmt) fmt = ""; va_list arg_ptr; va_start(arg_ptr, fmt); - if(callbacks && callbacks->popup_dialog) - callbacks->popup_dialog(session,type,title,msg,fmt,arg_ptr); + if(callbacks && callbacks->notify) + callbacks->notify(session,type,title,msg,fmt,arg_ptr); + else + lib3270_write_va_log(session,"lib3270",fmt,arg_ptr); va_end(arg_ptr); } -void Error(const char *fmt, ...) + +void Error(H3270 *session, const char *fmt, ...) { va_list arg_ptr; + CHECK_SESSION_HANDLE(session); + va_start(arg_ptr, fmt); - if(callbacks && callbacks->Warning) - callbacks->Warning(fmt,arg_ptr); + if(callbacks && callbacks->notify) + callbacks->notify(session,LIB3270_NOTIFY_ERROR, _( "3270 Error" ),NULL,fmt,arg_ptr); + else + lib3270_write_va_log(&h3270,"lib3270",fmt,arg_ptr); va_end(arg_ptr); } -/* -void notify_toggle_changed(H3270 *session, LIB3270_TOGGLE ix, unsigned char value, LIB3270_TOGGLE_TYPE reason) -{ - if(callbacks && callbacks->toggle_changed) - callbacks->toggle_changed(session,ix,value,reason,toggle_names[ix]); -} -*/ - -LIB3270_EXPORT void update_toggle_actions(void) -{ - int f; - - if(callbacks && callbacks->toggle_changed) - { - for(f=0;f< N_TOGGLES;f++) - callbacks->toggle_changed(&h3270,f,appres.toggle[f].value,TT_UPDATE,toggle_names[f]); - } -} - -void Warning(const char *fmt, ...) +void Warning(H3270 *session, const char *fmt, ...) { va_list arg_ptr; + CHECK_SESSION_HANDLE(session); + va_start(arg_ptr, fmt); - if(callbacks && callbacks->Warning) - callbacks->Warning(fmt,arg_ptr); + if(callbacks && callbacks->notify) + callbacks->notify(session,LIB3270_NOTIFY_WARNING, _( "3270 Warning" ),NULL,fmt,arg_ptr); + else + lib3270_write_va_log(&h3270,"lib3270",fmt,arg_ptr); va_end(arg_ptr); } -void mcursor_set(H3270 *session,LIB3270_CURSOR m) +/* Pop up an error dialog. */ +extern void popup_an_error(H3270 *session, const char *fmt, ...) { - CHECK_SESSION_HANDLE(session); - - if(session->cursor) - session->cursor(session,m); -} + va_list args; -/* -void mcursor_locked(H3270 *session) -{ CHECK_SESSION_HANDLE(session); - if(callbacks && callbacks->cursor) - callbacks->cursor(CURSOR_MODE_LOCKED); -} - -extern void mcursor_normal(H3270 *session) -{ - CHECK_SESSION_HANDLE(session); + va_start(args, fmt); - if(callbacks && callbacks->cursor) - callbacks->cursor(CURSOR_MODE_NORMAL); -} + if(callbacks && callbacks->notify) + callbacks->notify(session,LIB3270_NOTIFY_ERROR,_( "3270 Error" ),NULL,fmt,args); + else + lib3270_write_va_log(&h3270,"lib3270",fmt,args); -extern void mcursor_waiting(H3270 *session) -{ - CHECK_SESSION_HANDLE(session); + va_end(args); - if(callbacks && callbacks->cursor) - callbacks->cursor(CURSOR_MODE_WAITING); } -*/ -/* Pop up an error dialog. */ -extern void popup_an_error(const char *fmt, ...) +void popup_system_error(H3270 *session, const char *title, const char *message, const char *fmt, ...) { va_list args; + CHECK_SESSION_HANDLE(session); + va_start(args, fmt); - if(callbacks && callbacks->Error) - callbacks->Error(fmt,args); - va_end(args); + if(callbacks && callbacks->notify) + callbacks->notify(session,LIB3270_NOTIFY_ERROR,title ? title : _( "3270 Error" ), message,fmt,args); + else + lib3270_write_va_log(&h3270,"lib3270",fmt,args); + + va_end(args); } -void popup_system_error(const char *title, const char *message, const char *system) + + +LIB3270_EXPORT void update_toggle_actions(void) { - if(callbacks && callbacks->SysError) + int f; + + if(callbacks && callbacks->toggle_changed) { - callbacks->SysError(title,message,system); - return; + for(f=0;f< N_TOGGLES;f++) + callbacks->toggle_changed(&h3270,f,appres.toggle[f].value,TT_UPDATE,toggle_names[f]); } - - popup_an_error("%s\n%s\n%s",title,message,system); } -/* -int set_device_buffer(struct ea *src, int el) +void mcursor_set(H3270 *session,LIB3270_CURSOR m) { + CHECK_SESSION_HANDLE(session); - if(el > (h3270.maxROWS * h3270.maxCOLS)) - return EINVAL; - - memcpy(ea_buf,src,sizeof(struct ea) * el); - - screen_disp(&h3270); - - return 0; + if(session->cursor) + session->cursor(session,m); } -*/ LIB3270_ACTION( testpattern ) { diff --git a/src/lib3270/telnet.c b/src/lib3270/telnet.c index fcc4fbc..7ac176c 100644 --- a/src/lib3270/telnet.c +++ b/src/lib3270/telnet.c @@ -404,7 +404,7 @@ void popup_a_sockerr(char *fmt, ...) } #else -void popup_a_sockerr(char *fmt, ...) +void popup_a_sockerr(H3270 *session, char *fmt, ...) { va_list args; char buffer[4096]; @@ -413,7 +413,7 @@ void popup_a_sockerr(char *fmt, ...) vsprintf(buffer, fmt, args); va_end(args); - popup_system_error( N_( "Network error" ), buffer, strerror(errno)); + popup_system_error(session, N_( "Network error" ), buffer, strerror(errno)); } #endif @@ -522,7 +522,7 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving if (resolve_host_and_port(proxy_host, proxy_portname, &proxy_port, &haddr.sa, &ha_len, errmsg, sizeof(errmsg)) < 0) { - popup_an_error(errmsg); + popup_an_error(NULL,errmsg); status_resolving(&h3270,0); return -1; status_resolving(&h3270,0); @@ -542,7 +542,7 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving if (resolve_host_and_port(host, portname, &h3270.current_port, &haddr.sa, &ha_len, errmsg, sizeof(errmsg)) < 0) { - popup_an_error(errmsg); + popup_an_error(NULL,errmsg); status_resolving(&h3270,0); return -1; status_resolving(&h3270,0); @@ -600,19 +600,19 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving */ /* create the socket */ if ((h3270.sock = socket(haddr.sa.sa_family, SOCK_STREAM, 0)) == -1) { - popup_a_sockerr( N_( "socket" ) ); + popup_a_sockerr(NULL, N_( "socket" ) ); return -1; } /* set options for inline out-of-band data and keepalives */ if (setsockopt(h3270.sock, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on)) < 0) { - popup_a_sockerr( N_( "setsockopt(%s)" ), "SO_OOBINLINE"); + popup_a_sockerr(NULL, N_( "setsockopt(%s)" ), "SO_OOBINLINE"); close_fail; } if (setsockopt(h3270.sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof(on)) < 0) { - popup_a_sockerr( N_( "setsockopt(%s)" ), "SO_KEEPALIVE"); + popup_a_sockerr(NULL, N_( "setsockopt(%s)" ), "SO_KEEPALIVE"); close_fail; } #if defined(OMTU) /*[*/ @@ -1031,7 +1031,7 @@ void net_input(H3270 *session) if (HALF_CONNECTED) { popup_a_sockerr( N_( "%s:%d" ),h3270.hostname, h3270.current_port); } else if (socket_errno() != SE_ECONNRESET) { - popup_a_sockerr( N_( "Socket read error" ) ); + popup_a_sockerr(NULL, N_( "Socket read error" ) ); } host_disconnect(session,True); return; @@ -1249,7 +1249,7 @@ telnet_fsm(unsigned char c) if (process_eor()) return -1; } else - Warning( _( "EOR received when not in 3270 mode, ignored." )); + Warning(NULL, _( "EOR received when not in 3270 mode, ignored." )); trace_dsn("RCVD EOR\n"); ibptr = ibuf; telnet_state = TNS_DATA; @@ -1441,8 +1441,7 @@ telnet_fsm(unsigned char c) telquals[sbbuf[1]]); if (lus != (char **)NULL && try_lu == CN) { /* None of the LUs worked. */ - popup_an_error("Cannot connect to " - "specified LU"); + popup_an_error(NULL,"Cannot connect to specified LU"); return -1; } @@ -2032,7 +2031,7 @@ net_rawout(unsigned const char *buf, int len) } else if (socket_errno() == SE_EINTR) { goto bot; } else { - popup_a_sockerr( N_( "Socket write error" ) ); + popup_a_sockerr(NULL, N_( "Socket write error" ) ); host_disconnect(&h3270,True); return; } diff --git a/src/lib3270/utf8.c b/src/lib3270/utf8.c index a93fe37..9faa767 100644 --- a/src/lib3270/utf8.c +++ b/src/lib3270/utf8.c @@ -428,7 +428,7 @@ utf8_set_display_charsets(char *cslist, char *csname) break; } if (tok == CN) { - popup_an_error("Invalid displayCharset specification"); + popup_an_error(NULL,"Invalid displayCharset specification"); Free(dup); return False; } @@ -439,7 +439,7 @@ utf8_set_display_charsets(char *cslist, char *csname) break; } if (dcs[i] == CN) { - popup_an_error("Unknown displayCharset specification '%s'", + popup_an_error(NULL,"Unknown displayCharset specification '%s'", csname); Free(dup); return False; diff --git a/src/lib3270/util.c b/src/lib3270/util.c index bf3a0e6..4728d45 100644 --- a/src/lib3270/util.c +++ b/src/lib3270/util.c @@ -172,7 +172,7 @@ xs_vsprintf(const char *fmt, va_list args) nc = vsprintf(buf, fmt, args); if (nc > sizeof(buf)) - Error("Internal buffer overflow"); + Error(NULL,"Internal buffer overflow"); r = Malloc(nc + 1); return strcpy(r, buf); #endif /*]*/ @@ -205,7 +205,7 @@ xs_warning(const char *fmt, ...) va_start(args, fmt); r = xs_vsprintf(fmt, args); va_end(args); - Warning(r); + Warning(NULL,r); Free(r); } @@ -218,7 +218,7 @@ xs_error(const char *fmt, ...) va_start(args, fmt); r = xs_vsprintf(fmt, args); va_end(args); - Error(r); + Error(NULL,r); Free(r); } @@ -856,7 +856,7 @@ rpf(rpf_t *r, char *fmt, ...) ns = vsprintf(tbuf, fmt, a); /* XXX: dangerous, but so is vsnprintf */ va_end(a); if (ns >= SP_TMP_LEN) - Error("rpf overrun"); + Error(NULL,"rpf overrun"); /* Make sure we have that. */ while (r->alloc_len - r->cur_len < ns + 1) { -- libgit2 0.21.2