107 #include <sys/stat.h>
156 #define STR(x) vstring_str(x)
160 static void showq_report(
VSTREAM *client,
char *queue,
char *
id,
161 VSTREAM *qfile,
long size, time_t mtime)
166 time_t arrival_time = 0;
168 long msg_size = size;
179 #define SHOWQ_CLEANUP_AND_RETURN { \
180 if (sender_seen > 0) \
181 attr_print(client, ATTR_FLAG_NONE, ATTR_TYPE_END); \
183 vstring_free(printable_quoted_addr); \
185 rcpb_free(rcpt_buf); \
189 htable_free(dup_filter, (void (*) (void *)) 0); \
209 if (arrival_time == 0)
210 arrival_time = atol(start);
213 if (msg_size_ok == 0) {
214 msg_size_ok = (start[strspn(start,
"0123456789 ")] == 0
215 && (msg_size = atol(start)) >= 0);
216 if (msg_size_ok == 0) {
217 msg_warn(
"%s: malformed size record: %.100s "
218 "-- using file size instead",
229 if (sender_seen++ > 0) {
230 msg_warn(
"%s: duplicate sender address: %s "
231 "-- skipping remainder of this file",
232 id,
STR(printable_quoted_addr));
239 arrival_time : mtime),
242 STR(printable_quoted_addr)),
246 if (sender_seen == 0) {
247 msg_warn(
"%s: missing sender address: %s "
248 "-- skipping remainder of this file",
249 id,
STR(printable_quoted_addr));
260 STR(printable_quoted_addr)),
265 if (msg_size_ok &&
vstream_fseek(qfile, msg_size, SEEK_CUR) < 0)
288 msg_panic(
"showq_report: attempt to reuse duplicate filter");
294 showq_reasons(client, logfile, rcpt_buf, dsn_buf, dup_filter);
330 static void showq_service(
VSTREAM *client,
char *unused_service,
char **argv)
356 msg_fatal(
"unexpected command-line argument: %s", argv[0]);
363 for (qp = queue_info; qp->
name != 0; qp++) {
367 while ((
id = qp->scan_next(scan)) != 0) {
375 if (strcmp(saved_id,
id) == 0) {
376 msg_warn(
"readdir loop on queue %s id %s", qp->
name,
id);
385 showq_report(client, qp->
name,
id, qfile, (
long) st.st_size,
389 }
else if (errno != ENOENT) {
406 int main(
int argc,
char **argv)
HTABLE_INFO * htable_locate(HTABLE *table, const char *key)
DSN_BUF * dsb_create(void)
char * mystrdup(const char *str)
NORETURN msg_panic(const char *fmt,...)
#define CA_MAIL_SERVER_STR_TABLE(v)
#define MAIL_QUEUE_ACTIVE
#define VAR_DUP_FILTER_LIMIT
SCAN_DIR * scan_dir_open(const char *path)
HTABLE * htable_create(ssize_t size)
#define CA_MAIL_SERVER_INT_TABLE(v)
RCPT_BUF * rcpb_create(void)
int vstream_fclose(VSTREAM *stream)
SCAN_DIR * scan_dir_close(SCAN_DIR *scan)
VSTREAM * mail_queue_open(const char *queue_name, const char *queue_id, int flags, mode_t mode)
int bounce_log_close(BOUNCE_LOG *bp)
#define MAIL_QUEUE_INCOMING
int mail_open_ok(const char *queue_name, const char *queue_id, struct stat *statp, const char **path)
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
#define MAIL_VERSION_STAMP_ALLOCATE
MAIL_VERSION_STAMP_DECLARE
#define SHOWQ_CLEANUP_AND_RETURN
#define MAIL_QUEUE_MAILDROP
#define SEND_ATTR_LONG(name, val)
NORETURN msg_fatal(const char *fmt,...)
off_t vstream_fseek(VSTREAM *stream, off_t offset, int whence)
int vstream_fflush(VSTREAM *stream)
#define MAIL_QUEUE_DEFERRED
#define quote_822_local(dst, src)
NORETURN single_server_main(int, char **, SINGLE_SERVER_FN,...)
int main(int argc, char **argv)
BOUNCE_LOG * bounce_log_open(const char *queue_name, const char *queue_id, int flags, mode_t mode)
#define MAIL_ATTR_QUEUEID
char * printable(char *string, int replacement)
#define rec_get(fp, buf, limit)
#define vstream_ferror(vp)
#define SEND_ATTR_STR(name, val)
BOUNCE_LOG * bounce_log_read(BOUNCE_LOG *bp, RCPT_BUF *rcpt_buf, DSN_BUF *dsn_buf)
char * mail_scan_dir_next(SCAN_DIR *scan)
#define DEF_DUP_FILTER_LIMIT
char * scan_dir_next(SCAN_DIR *scan)
HTABLE_INFO * htable_enter(HTABLE *table, const char *key, void *value)
void msg_info(const char *fmt,...)