X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/38a0a95ff69327042421b9ee6982e386175f141b..99c1bb4ed9d99c7b0f615750c37884d7a7f9aa0d:/src/src/spool_out.c diff --git a/src/src/spool_out.c b/src/src/spool_out.c index 0a17b7a13..e8d202033 100644 --- a/src/src/spool_out.c +++ b/src/src/spool_out.c @@ -1,10 +1,8 @@ -/* $Cambridge: exim/src/src/spool_out.c,v 1.11 2006/09/19 11:28:45 ph10 Exp $ */ - /************************************************* * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2006 */ +/* Copyright (c) University of Cambridge 1995 - 2012 */ /* See the file NOTICE for conditions of use and distribution. */ /* Functions for writing spool files, and moving them about. */ @@ -95,10 +93,12 @@ double-check the mode because the group setting doesn't always get set automatically. */ if (fd >= 0) - { - (void)fchown(fd, exim_uid, exim_gid); - (void)fchmod(fd, SPOOL_MODE); - } + if (fchown(fd, exim_uid, exim_gid) || fchmod(fd, SPOOL_MODE)) + { + DEBUG(D_any) debug_printf("failed setting perms on %s\n", temp_name); + (void) close(fd); fd = -1; + Uunlink(temp_name); + } return fd; } @@ -198,6 +198,7 @@ tree_walk(acl_var_m, &acl_var_write, f); /* Now any other data that needs to be remembered. */ fprintf(f, "-body_linecount %d\n", body_linecount); +fprintf(f, "-max_received_linelength %d\n", max_received_linelength); if (body_zerocount > 0) fprintf(f, "-body_zerocount %d\n", body_zerocount); @@ -209,7 +210,7 @@ if (authenticated_sender != NULL) if (allow_unqualified_recipient) fprintf(f, "-allow_unqualified_recipient\n"); if (allow_unqualified_sender) fprintf(f, "-allow_unqualified_sender\n"); if (deliver_firsttime) fprintf(f, "-deliver_firsttime\n"); -if (deliver_freeze) fprintf(f, "-frozen %d\n", deliver_frozen_at); +if (deliver_freeze) fprintf(f, "-frozen " TIME_T_FMT "\n", deliver_frozen_at); if (dont_deliver) fprintf(f, "-N\n"); if (host_lookup_deferred) fprintf(f, "-host_lookup_deferred\n"); if (host_lookup_failed) fprintf(f, "-host_lookup_failed\n"); @@ -227,11 +228,38 @@ if (bmi_verdicts != NULL) fprintf(f, "-bmi_verdicts %s\n", bmi_verdicts); #endif #ifdef SUPPORT_TLS -if (tls_certificate_verified) fprintf(f, "-tls_certificate_verified\n"); -if (tls_cipher != NULL) fprintf(f, "-tls_cipher %s\n", tls_cipher); -if (tls_peerdn != NULL) fprintf(f, "-tls_peerdn %s\n", tls_peerdn); +if (tls_in.certificate_verified) fprintf(f, "-tls_certificate_verified\n"); +if (tls_in.cipher) fprintf(f, "-tls_cipher %s\n", tls_in.cipher); +if (tls_in.peercert) + { + (void) tls_export_cert(big_buffer, big_buffer_size, tls_in.peercert); + fprintf(f, "-tls_peercert %s\n", CS big_buffer); + } +if (tls_in.peerdn) fprintf(f, "-tls_peerdn %s\n", string_printing(tls_in.peerdn)); +if (tls_in.sni) fprintf(f, "-tls_sni %s\n", string_printing(tls_in.sni)); +if (tls_in.ourcert) + { + (void) tls_export_cert(big_buffer, big_buffer_size, tls_in.ourcert); + fprintf(f, "-tls_ourcert %s\n", CS big_buffer); + } +if (tls_in.ocsp) fprintf(f, "-tls_ocsp %d\n", tls_in.ocsp); #endif +#ifdef EXPERIMENTAL_INTERNATIONAL +if (message_smtputf8) + { + fprintf(f, "-smtputf8\n"); + if (message_utf8_downconvert) + fprintf(f, "-utf8_%sdowncvt\n", message_utf8_downconvert < 0 ? "opt" : ""); + } +#endif + +/* Write the dsn flags to the spool header file */ +DEBUG(D_deliver) debug_printf("DSN: Write SPOOL :-dsn_envid %s\n", dsn_envid); +if (dsn_envid != NULL) fprintf(f, "-dsn_envid %s\n", dsn_envid); +DEBUG(D_deliver) debug_printf("DSN: Write SPOOL :-dsn_ret %d\n", dsn_ret); +if (dsn_ret != 0) fprintf(f, "-dsn_ret %d\n", dsn_ret); + /* To complete the envelope, write out the tree of non-recipients, followed by the list of recipients. These won't be disjoint the first time, when no checking has been done. If a recipient is a "one-time" alias, it is followed by @@ -242,14 +270,21 @@ fprintf(f, "%d\n", recipients_count); for (i = 0; i < recipients_count; i++) { recipient_item *r = recipients_list + i; - if (r->pno < 0 && r->errors_to == NULL) +DEBUG(D_deliver) debug_printf("DSN: Flags :%d\n", r->dsn_flags); + if (r->pno < 0 && r->errors_to == NULL && r->dsn_flags == 0) fprintf(f, "%s\n", r->address); else { uschar *errors_to = (r->errors_to == NULL)? US"" : r->errors_to; - fprintf(f, "%s %s %d,%d#1\n", r->address, errors_to, - Ustrlen(errors_to), r->pno); + /* for DSN SUPPORT extend exim 4 spool in a compatible way by + adding new values upfront and add flag 0x02 */ + uschar *orcpt = (r->orcpt == NULL)? US"" : r->orcpt; + fprintf(f, "%s %s %d,%d %s %d,%d#3\n", r->address, orcpt, Ustrlen(orcpt), r->dsn_flags, + errors_to, Ustrlen(errors_to), r->pno); } + + DEBUG(D_deliver) debug_printf("DSN: **** SPOOL_OUT - address: |%s| errorsto: |%s| orcpt: |%s| dsn_flags: %d\n", + r->address, r->errors_to, r->orcpt, r->dsn_flags); } /* Put a blank line before the headers */ @@ -287,7 +322,7 @@ if (fflush(f) != 0 || ferror(f)) just pushes it out of C, and fclose() doesn't guarantee to do the write either. That's just the way Unix works... */ -if (fsync(fileno(f)) < 0) +if (EXIMfsync(fileno(f)) < 0) return spool_write_error(where, errmsg, US"sync", temp_name, f); /* Get the size of the file, and close it. */ @@ -325,7 +360,7 @@ sprintf(CS temp_name, "%s/input/%s/.", spool_directory, message_subdir); if ((fd = Uopen(temp_name, O_RDONLY|O_DIRECTORY, 0)) < 0) return spool_write_error(where, errmsg, US"directory open", name, NULL); -if (fsync(fd) < 0 && errno != EINVAL) +if (EXIMfsync(fd) < 0 && errno != EINVAL) return spool_write_error(where, errmsg, US"directory sync", name, NULL); if (close(fd) < 0) @@ -478,3 +513,5 @@ return TRUE; #endif /* End of spool_out.c */ +/* vi: aw ai sw=2 +*/