cleanup_final.c revision 1.1
1/*	$NetBSD: cleanup_final.c,v 1.1 2009/06/23 10:08:43 tron Exp $	*/
2
3/*++
4/* NAME
5/*	cleanup_final 3
6/* SUMMARY
7/*	finalize queue file
8/* SYNOPSIS
9/*	#include "cleanup.h"
10/*
11/*	void	cleanup_final(state)
12/*	CLEANUP_STATE *state;
13/* DESCRIPTION
14/*	cleanup_final() performs final queue file content (not
15/*	attribute) updates so that the file is ready to be closed.
16/* LICENSE
17/* .ad
18/* .fi
19/*	The Secure Mailer license must be distributed with this software.
20/* AUTHOR(S)
21/*	Wietse Venema
22/*	IBM T.J. Watson Research
23/*	P.O. Box 704
24/*	Yorktown Heights, NY 10598, USA
25/*--*/
26
27/* System library. */
28
29#include <sys_defs.h>
30#include <errno.h>
31
32/* Utility library. */
33
34#include <msg.h>
35
36/* Global library. */
37
38#include <cleanup_user.h>
39#include <rec_type.h>
40
41/* Application-specific. */
42
43#include "cleanup.h"
44
45/* cleanup_final - final queue file content updates */
46
47void    cleanup_final(CLEANUP_STATE *state)
48{
49    const char *myname = "cleanup_final";
50
51    /*
52     * vstream_fseek() would flush the buffer anyway, but the code just reads
53     * better if we flush first, because it makes seek error handling more
54     * straightforward.
55     */
56    if (vstream_fflush(state->dst)) {
57	if (errno == EFBIG) {
58	    msg_warn("%s: queue file size limit exceeded", state->queue_id);
59	    state->errs |= CLEANUP_STAT_SIZE;
60	} else {
61	    msg_warn("%s: write queue file: %m", state->queue_id);
62	    state->errs |= CLEANUP_STAT_WRITE;
63	}
64	return;
65    }
66
67    /*
68     * Update the preliminary message size and count fields with the actual
69     * values.
70     */
71    if (vstream_fseek(state->dst, 0L, SEEK_SET) < 0)
72	msg_fatal("%s: vstream_fseek %s: %m", myname, cleanup_path);
73    cleanup_out_format(state, REC_TYPE_SIZE, REC_TYPE_SIZE_FORMAT,
74	    (REC_TYPE_SIZE_CAST1) (state->xtra_offset - state->data_offset),
75		       (REC_TYPE_SIZE_CAST2) state->data_offset,
76		       (REC_TYPE_SIZE_CAST3) state->rcpt_count,
77		       (REC_TYPE_SIZE_CAST4) state->qmgr_opts,
78		       (REC_TYPE_SIZE_CAST5) state->cont_length);
79}
80