xref: /netbsd-src/external/ibm-public/postfix/dist/src/qmgr/qmgr_move.c (revision 41fbaed053f8fbfdf9d2a4ee0a7386a3c83f8505)
1 /*	$NetBSD: qmgr_move.c,v 1.1.1.1 2009/06/23 10:08:53 tron Exp $	*/
2 
3 /*++
4 /* NAME
5 /*	qmgr_move 3
6 /* SUMMARY
7 /*	move queue entries to another queue
8 /* SYNOPSIS
9 /*	#include "qmgr.h"
10 /*
11 /*	void	qmgr_move(from, to, time_stamp)
12 /*	const char *from;
13 /*	const char *to;
14 /*	time_t	time_stamp;
15 /* DESCRIPTION
16 /*	The \fBqmgr_move\fR routine scans the \fIfrom\fR queue for entries
17 /*	with valid queue names and moves them to the \fIto\fR queue.
18 /*	If \fItime_stamp\fR is non-zero, the queue file time stamps are
19 /*	set to the specified value.
20 /*	Entries with invalid names are left alone. No attempt is made to
21 /*	look for other badness such as multiple links or weird file types.
22 /*	These issues are dealt with when a queue file is actually opened.
23 /* LICENSE
24 /* .ad
25 /* .fi
26 /*	The Secure Mailer license must be distributed with this software.
27 /* AUTHOR(S)
28 /*	Wietse Venema
29 /*	IBM T.J. Watson Research
30 /*	P.O. Box 704
31 /*	Yorktown Heights, NY 10598, USA
32 /*--*/
33 
34 /* System library. */
35 
36 #include <sys_defs.h>
37 #include <sys/stat.h>
38 #include <string.h>
39 #include <utime.h>
40 #include <errno.h>
41 
42 /* Utility library. */
43 
44 #include <msg.h>
45 #include <scan_dir.h>
46 #include <recipient_list.h>
47 
48 /* Global library. */
49 
50 #include <mail_queue.h>
51 #include <mail_scan_dir.h>
52 
53 /* Application-specific. */
54 
55 #include "qmgr.h"
56 
57 /* qmgr_move - move queue entries to another queue, leave bad files alone */
58 
qmgr_move(const char * src_queue,const char * dst_queue,time_t time_stamp)59 void    qmgr_move(const char *src_queue, const char *dst_queue,
60 		          time_t time_stamp)
61 {
62     const char *myname = "qmgr_move";
63     SCAN_DIR *queue_dir;
64     char   *queue_id;
65     struct utimbuf tbuf;
66     const char *path;
67 
68     if (strcmp(src_queue, dst_queue) == 0)
69 	msg_panic("%s: source queue %s is destination", myname, src_queue);
70     if (msg_verbose)
71 	msg_info("start move queue %s -> %s", src_queue, dst_queue);
72 
73     queue_dir = scan_dir_open(src_queue);
74     while ((queue_id = mail_scan_dir_next(queue_dir)) != 0) {
75 	if (mail_queue_id_ok(queue_id)) {
76 	    if (time_stamp > 0) {
77 		tbuf.actime = tbuf.modtime = time_stamp;
78 		path = mail_queue_path((VSTRING *) 0, src_queue, queue_id);
79 		if (utime(path, &tbuf) < 0) {
80 		    if (errno != ENOENT)
81 			msg_fatal("%s: update %s time stamps: %m", myname, path);
82 		    msg_warn("%s: update %s time stamps: %m", myname, path);
83 		    continue;
84 		}
85 	    }
86 	    if (mail_queue_rename(queue_id, src_queue, dst_queue)) {
87 		if (errno != ENOENT)
88 		    msg_fatal("%s: rename %s from %s to %s: %m",
89 			      myname, queue_id, src_queue, dst_queue);
90 		msg_warn("%s: rename %s from %s to %s: %m",
91 			 myname, queue_id, src_queue, dst_queue);
92 		continue;
93 	    }
94 	    if (msg_verbose)
95 		msg_info("%s: moved %s from %s to %s",
96 			 myname, queue_id, src_queue, dst_queue);
97 	} else {
98 	    msg_warn("%s: ignored: queue %s id %s",
99 		     myname, src_queue, queue_id);
100 	}
101     }
102     scan_dir_close(queue_dir);
103 
104     if (msg_verbose)
105 	msg_info("end move queue %s -> %s", src_queue, dst_queue);
106 }
107