1/* $NetBSD$ */ 2 3/*++ 4/* NAME 5/* mail_scan_dir 3 6/* SUMMARY 7/* mail queue directory scanning support 8/* SYNOPSIS 9/* #include <mail_scan_dir.h> 10/* 11/* char *mail_scan_dir_next(scan) 12/* SCAN_DIR *scan; 13/* DESCRIPTION 14/* The \fBmail_scan_dir_next\fR() routine is a wrapper around 15/* scan_dir_next() that understands the structure of a Postfix 16/* mail queue. The result is a queue ID or a null pointer. 17/* SEE ALSO 18/* scan_dir(3) directory scanner 19/* LICENSE 20/* .ad 21/* .fi 22/* The Secure Mailer license must be distributed with this software. 23/* AUTHOR(S) 24/* Wietse Venema 25/* IBM T.J. Watson Research 26/* P.O. Box 704 27/* Yorktown Heights, NY 10598, USA 28/*--*/ 29 30/* System library. */ 31 32#include <sys_defs.h> 33#include <string.h> 34 35/* Utility library. */ 36 37#include <scan_dir.h> 38 39/* Global library. */ 40 41#include <mail_scan_dir.h> 42 43/* mail_scan_dir_next - return next queue file */ 44 45char *mail_scan_dir_next(SCAN_DIR *scan) 46{ 47 char *name; 48 49 /* 50 * Exploit the fact that mail queue subdirectories have one-letter names, 51 * so we don't have to stat() every file in sight. This is a win because 52 * many dirent implementations do not return file type information. 53 */ 54 for (;;) { 55 if ((name = scan_dir_next(scan)) == 0) { 56 if (scan_dir_pop(scan) == 0) 57 return (0); 58 } else if (strlen(name) == 1) { 59 scan_dir_push(scan, name); 60 } else { 61 return (name); 62 } 63 } 64} 65