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 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