Index: libconfig.c ================================================================== --- libconfig.c +++ libconfig.c @@ -44,10 +44,11 @@ lc_err_t lc_errno = LC_ERR_NONE; const char *lc_err_usererrmsg = NULL; const char *lc_errfile = NULL; int lc_optind = 0; int lc_errline = 0; +char *lc_erroptname = NULL; extern char **environ; static int lc_process_var_string(void *data, const char *value, const char **endptr) { char **dataval; @@ -84,10 +85,12 @@ return(0); } static int lc_process_var_hostname6(void *data, const char *value, const char **endptr) { + lc_errno = LC_ERR_BADFORMAT; + return(-1); } static int lc_process_var_ip4(uint32_t *data, const char *value, const char **endptr) { uint32_t ipval = 0, curr_ipval = 0; @@ -134,15 +137,21 @@ if (retval == 0) { ipval |= curr_ipval << 24; *data = ipval; } + + if (retval < 0) { + lc_errno = LC_ERR_BADFORMAT; + } return(retval); } static int lc_process_var_ip6(void *data, const char *value, const char **endptr) { + lc_errno = LC_ERR_BADFORMAT; + return(-1); } static int lc_process_var_addr4(uint32_t *data, const char *value, const char **endptr) { int lc_pv_ret; @@ -154,10 +163,12 @@ lc_pv_ret = lc_process_var_hostname4(data, value, endptr); if (lc_pv_ret == 0) { return(lc_pv_ret); } + + lc_errno = LC_ERR_BADFORMAT; return(-1); } static int lc_process_var_addr6(void *data, const char *value, const char **endptr) { @@ -723,10 +734,11 @@ if (cmdargidx >= argc) { fprintf(stderr, "Argument required.\n"); lc_errfile = local_lc_errfile; lc_errline = local_lc_errline; lc_errno = LC_ERR_BADFORMAT; + lc_erroptname = strdup(cmdarg); free(usedargv); free(newargv); return(-1); } cmdoptarg = argv[cmdargidx]; @@ -734,10 +746,13 @@ usedargv[cmdargidx] = 1; } chkretval = lc_handle(handler, handler->var, NULL, cmdoptarg, LC_FLAGS_CMDLINE); if (chkretval < 0) { + lc_errfile = local_lc_errfile; + lc_errline = local_lc_errline; + lc_erroptname = strdup(cmdarg); retval = -1; } break; } @@ -1096,10 +1111,11 @@ } char *lc_geterrstr(void) { static char retval[512]; const char *errmsg = NULL; + const char *local_lc_errfile; switch (lc_errno) { case LC_ERR_NONE: errmsg = "Success"; break; @@ -1137,14 +1153,20 @@ if (errmsg == NULL) { errmsg = "Unknown error"; } if (lc_errfile == NULL) { - snprintf(retval, sizeof(retval), "%s:%i: %s", "", lc_errline, errmsg); + local_lc_errfile = ""; + } else { + local_lc_errfile = lc_errfile; + } + + if (lc_erroptname != NULL) { + snprintf(retval, sizeof(retval), "%s:%i: \"%s\": %s", local_lc_errfile, lc_errline, lc_erroptname, errmsg); } else { - snprintf(retval, sizeof(retval), "%s:%i: %s", lc_errfile, lc_errline, errmsg); + snprintf(retval, sizeof(retval), "%s:%i: %s", local_lc_errfile, lc_errline, errmsg); } retval[sizeof(retval) - 1] = '\0'; return(retval); }