- 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);
+ if (logfname && !logfile) {
+ extern int orig_umask;
+ int old_umask = umask(022 | orig_umask);
+ logfile = fopen(logfname, "a");
+ umask(old_umask);
+ if (!logfile) {
+ am_daemon = 0; /* avoid trying to log again */
+ rsyserr(FERROR, errno, "fopen() of log-file failed");
+ exit_cleanup(RERR_FILESELECT);