-struct err_list {
- struct err_list *next;
- char *buf;
- int len;
- int written; /* how many bytes we have written so far */
-};
-
-static struct err_list *err_list_head;
-static struct err_list *err_list_tail;
-
-/* add an error message to the pending error list */
-static void err_list_add(int code, char *buf, int len)
-{
- struct err_list *el;
- el = new(struct err_list);
- if (!el) exit_cleanup(RERR_MALLOC);
- el->next = NULL;
- el->buf = new_array(char, len+4);
- if (!el->buf) exit_cleanup(RERR_MALLOC);
- memcpy(el->buf+4, buf, len);
- SIVAL(el->buf, 0, ((code+MPLEX_BASE)<<24) | len);
- el->len = len+4;
- el->written = 0;
- if (err_list_tail) {
- err_list_tail->next = el;
- } else {
- err_list_head = el;
- }
- err_list_tail = el;
-}
-
-
-/* try to push errors off the error list onto the wire */
-void err_list_push(void)
-{
- if (log_error_fd == -1) return;
-
- while (err_list_head) {
- struct err_list *el = err_list_head;
- int n = write(log_error_fd, el->buf+el->written, el->len - el->written);
- /* don't check for an error if the best way of handling the error is
- * to ignore it */
- if (n == -1) break;
- if (n > 0) {
- el->written += n;
- }
- if (el->written == el->len) {
- free(el->buf);
- err_list_head = el->next;
- if (!err_list_head) err_list_tail = NULL;
- free(el);
- }
- }
-}
-