1/*	$NetBSD$	*/
2
3/*++
4/* NAME
5/*	mark_corrupt 3
6/* SUMMARY
7/*	mark queue file as corrupt
8/* SYNOPSIS
9/*	#include <mark_corrupt.h>
10/*
11/*	char	*mark_corrupt(src)
12/*	VSTREAM *src;
13/* DESCRIPTION
14/*	The \fBmark_corrupt\fR() routine marks the specified open
15/*	queue file as corrupt, and returns a suitable delivery status
16/*	so that the queue manager will do the right thing.
17/* LICENSE
18/* .ad
19/* .fi
20/*	The Secure Mailer license must be distributed with this software.
21/* AUTHOR(S)
22/*	Wietse Venema
23/*	IBM T.J. Watson Research
24/*	P.O. Box 704
25/*	Yorktown Heights, NY 10598, USA
26/*--*/
27
28/* System library. */
29
30#include <sys_defs.h>
31#include <sys/stat.h>
32#include <unistd.h>
33
34/* Utility library. */
35
36#include <msg.h>
37#include <vstream.h>
38#include <set_eugid.h>
39
40/* Global library. */
41
42#include <mail_queue.h>
43#include <mail_params.h>
44#include <deliver_request.h>
45#include <mark_corrupt.h>
46
47/* mark_corrupt - mark queue file as corrupt */
48
49int     mark_corrupt(VSTREAM *src)
50{
51    const char *myname = "mark_corrupt";
52    uid_t   saved_uid;
53    gid_t   saved_gid;
54
55    /*
56     * If not running as the mail system, change privileges first.
57     */
58    if ((saved_uid = geteuid()) != var_owner_uid) {
59	saved_gid = getegid();
60	set_eugid(var_owner_uid, var_owner_gid);
61    }
62
63    /*
64     * For now, the result value is -1; this may become a bit mask, or
65     * something even more advanced than that, when the delivery status
66     * becomes more than just done/deferred.
67     */
68    msg_warn("corrupted queue file: %s", VSTREAM_PATH(src));
69    if (fchmod(vstream_fileno(src), MAIL_QUEUE_STAT_CORRUPT))
70	msg_fatal("%s: fchmod %s: %m", myname, VSTREAM_PATH(src));
71
72    /*
73     * Restore privileges.
74     */
75    if (saved_uid != var_owner_uid)
76	set_eugid(saved_uid, saved_gid);
77
78    return (DEL_STAT_DEFER);
79}
80