static void qmgr_scan_start(QMGR_SCAN *scan_info) { char *myname = "qmgr_scan_start"; /* * Sanity check. */ if (scan_info->handle) msg_panic("%s: %s queue scan in progress", myname, scan_info->queue); /* * Give the poor tester a clue. */ if (msg_verbose) msg_info("%s: %sstart %s queue scan", myname, scan_info->nflags & QMGR_SCAN_START ? "re" : "", scan_info->queue); /* * Optionally forget all dead host information. */ if (scan_info->nflags & QMGR_FLUSH_DEAD) qmgr_enable_all(); /* * Start or restart the scan. */ scan_info->flags = scan_info->nflags; scan_info->nflags = 0; scan_info->handle = scan_dir_open(scan_info->queue); }
void qmgr_scan_request(QMGR_SCAN *scan_info, int flags) { /* * Apply "forget all dead destinations" requests immediately. Throttle * dead transports and queues at the earliest opportunity: preferably * during an already ongoing queue scan, otherwise the throttling will * have to wait until a "start scan" trigger arrives. * * The QMGR_FLUSH_ONCE request always comes with QMGR_FLUSH_DFXP, and * sometimes it also comes with QMGR_SCAN_ALL. It becomes a completely * different story when a flush request is encoded in file permissions. */ if (flags & QMGR_FLUSH_ONCE) qmgr_enable_all(); /* * Apply "ignore time stamp" requests also towards the scan that is * already in progress. */ if (scan_info->handle != 0 && (flags & QMGR_SCAN_ALL)) scan_info->flags |= QMGR_SCAN_ALL; /* * Apply "override defer_transports" requests also towards the scan that * is already in progress. */ if (scan_info->handle != 0 && (flags & QMGR_FLUSH_DFXP)) scan_info->flags |= QMGR_FLUSH_DFXP; /* * If a scan is in progress, just record the request. */ scan_info->nflags |= flags; if (scan_info->handle == 0 && (flags & QMGR_SCAN_START) != 0) { scan_info->nflags &= ~QMGR_SCAN_START; qmgr_scan_start(scan_info); } }