+struct _config_error_frame {
+ int line_num;
+ int num_errors;
+ boolean origline_shown;
+ boolean fromfile;
+ boolean secure;
+ char origline[4 * BUFSZ];
+ char source[BUFSZ];
+ struct _config_error_frame *next;
+};
+
+struct _config_error_frame *config_error_data = (struct _config_error_frame *)0;
+
+void
+config_error_init(from_file, sourcename, secure)
+boolean from_file;
+const char *sourcename;
+boolean secure;
+{
+ struct _config_error_frame *tmp = (struct _config_error_frame *)
+ alloc(sizeof(struct _config_error_frame));
+
+ tmp->line_num = 0;
+ tmp->num_errors = 0;
+ tmp->origline_shown = FALSE;
+ tmp->fromfile = from_file;
+ tmp->secure = secure;
+ tmp->origline[0] = '\0';
+ if (sourcename && sourcename[0]) {
+ (void) strncpy(tmp->source, sourcename, sizeof(tmp->source)-1);
+ tmp->source[sizeof(tmp->source)-1] = '\0';
+ } else
+ tmp->source[0] = '\0';
+
+ tmp->next = config_error_data;
+ config_error_data = tmp;
+}
+
+STATIC_OVL boolean
+config_error_nextline(line)
+const char *line;
+{
+ struct _config_error_frame *ced = config_error_data;
+
+ if (!ced)
+ return FALSE;
+
+ if (ced->num_errors && ced->secure)
+ return FALSE;
+
+ ced->line_num++;
+ ced->origline_shown = FALSE;
+ if (line && line[0]) {
+ (void) strncpy(ced->origline, line, sizeof(ced->origline)-1);
+ ced->origline[sizeof(ced->origline)-1] = '\0';
+ } else
+ ced->origline[0] = '\0';
+
+ return TRUE;
+}
+
+/*VARARGS1*/
+void config_error_add
+VA_DECL(const char *, str)
+{
+ char buf[BUFSZ];
+ char lineno[QBUFSZ];
+
+ VA_START(str);
+ VA_INIT(str, char *);
+
+ Vsprintf(buf, str, VA_ARGS);
+
+ if (!config_error_data) {
+ pline("%s.", *buf ? buf : "Unknown error");
+ wait_synch();
+ return;
+ }
+
+ config_error_data->num_errors++;
+ if (!config_error_data->origline_shown
+ && !config_error_data->secure) {
+ pline("\n%s", config_error_data->origline);
+ config_error_data->origline_shown = TRUE;
+ }
+ if (config_error_data->line_num > 0
+ && !config_error_data->secure) {
+ Sprintf(lineno, "Line %i: ", config_error_data->line_num);
+ } else
+ lineno[0] = '\0';
+ pline("%s %s%s.",
+ config_error_data->secure ? "Error:" : " *",
+ lineno,
+ *buf ? buf : "Unknown error");
+
+ VA_END();
+}
+
+int
+config_error_done()
+{
+ int n;
+ struct _config_error_frame *tmp = config_error_data;
+
+ if (!config_error_data)
+ return 0;
+ n = config_error_data->num_errors;
+ if (n) {
+ pline("\n%i error%s in %s.\n", n,
+ (n > 1) ? "s" : "",
+ *config_error_data->source
+ ? config_error_data->source : configfile);
+ wait_synch();
+ }
+
+ config_error_data = tmp->next;
+
+ free(tmp);
+
+ return n;
+}
+