=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cfg.c,v retrieving revision 1.8 retrieving revision 1.9 diff -c -r1.8 -r1.9 *** src/usr.bin/tmux/cfg.c 2009/11/26 21:37:13 1.8 --- src/usr.bin/tmux/cfg.c 2010/02/06 17:15:33 1.9 *************** *** 1,4 **** ! /* $OpenBSD: cfg.c,v 1.8 2009/11/26 21:37:13 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cfg.c,v 1.9 2010/02/06 17:15:33 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott *************** *** 34,39 **** --- 34,42 ---- void printflike2 cfg_error(struct cmd_ctx *, const char *, ...); char *cfg_cause; + int cfg_finished; + char **cfg_causes; + u_int cfg_ncauses; /* ARGSUSED */ void printflike2 *************** *** 52,70 **** va_end(ap); } int ! load_cfg(const char *path, struct cmd_ctx *ctxin, char **cause) { FILE *f; u_int n; ! char *buf, *line, *ptr; size_t len; struct cmd_list *cmdlist; struct cmd_ctx ctx; if ((f = fopen(path, "rb")) == NULL) { ! xasprintf(cause, "%s: %s", path, strerror(errno)); ! return (1); } n = 0; --- 55,92 ---- va_end(ap); } + void printflike3 + cfg_add_cause(u_int *ncauses, char ***causes, const char *fmt, ...) + { + char *cause; + va_list ap; + + va_start(ap, fmt); + xvasprintf(&cause, fmt, ap); + va_end(ap); + + *causes = xrealloc(*causes, *ncauses + 1, sizeof **causes); + (*causes)[(*ncauses)++] = cause; + } + + /* + * Load configuration file. Returns -1 for an error with a list of messages in + * causes. Note that causes and ncauses must be initialised by the caller! + */ int ! load_cfg( ! const char *path, struct cmd_ctx *ctxin, u_int *ncauses, char ***causes) { FILE *f; u_int n; ! char *buf, *line, *cause; size_t len; struct cmd_list *cmdlist; struct cmd_ctx ctx; if ((f = fopen(path, "rb")) == NULL) { ! cfg_add_cause(ncauses, causes, "%s: %s", path, strerror(errno)); ! return (-1); } n = 0; *************** *** 80,89 **** } n++; ! if (cmd_string_parse(buf, &cmdlist, cause) != 0) { ! if (*cause == NULL) continue; ! goto error; } if (cmdlist == NULL) continue; --- 102,114 ---- } n++; ! if (cmd_string_parse(buf, &cmdlist, &cause) != 0) { ! if (cause == NULL) continue; ! cfg_add_cause( ! ncauses, causes, "%s: %u: %s", path, n, cause); ! xfree(cause); ! continue; } if (cmdlist == NULL) continue; *************** *** 107,129 **** cmd_list_exec(cmdlist, &ctx); cmd_list_free(cmdlist); if (cfg_cause != NULL) { ! *cause = cfg_cause; ! goto error; } } if (line != NULL) xfree(line); fclose(f); return (0); - - error: - if (line != NULL) - xfree(line); - fclose(f); - - xasprintf(&ptr, "%s: %s at line %u", path, *cause, n); - xfree(*cause); - *cause = ptr; - return (1); } --- 132,148 ---- cmd_list_exec(cmdlist, &ctx); cmd_list_free(cmdlist); if (cfg_cause != NULL) { ! cfg_add_cause( ! ncauses, causes, "%s: %d: %s", path, n, cfg_cause); ! xfree(cfg_cause); ! continue; } } if (line != NULL) xfree(line); fclose(f); + if (*ncauses != 0) + return (-1); return (0); }