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