static void cmd_last(void) { long last; long i; for (last = i = 0; i < msg_count; i++) if (msgs[i].read) last = i + 1; if (!str_copys(&tmp, "+OK ") || !str_cati(&tmp, last)) respond(err_internal); respond(tmp.s); }
static void end_slot(int slot, int status) { struct stat st; slots[slot].pid = 0; --slots_used; if (slots[slot].sending_email) { slots[slot].sending_email = 0; if (status) report_slot(slot, "ZJob complete, sending email failed"); else report_slot(slot, "KJob complete, email sent"); } else { /* No header, no possible way to send email. */ if (slots[slot].headerlen == 0) report_slot(slot, "KJob complete, no MAILTO"); else { /* If the job crashed, make sure it is noted. */ if (WIFSIGNALED(status)) { debugf(DEBUG_EXEC, "{slot }d{ Job was killed by signal #}d", slot, WTERMSIG(status)); wrap_str(str_copys(&tmp, "\n\nJob was killed by signal #")); wrap_str(str_cati(&tmp, WTERMSIG(status))); wrap_str(str_catc(&tmp, '\n')); write(slots[slot].tmpfd, tmp.s, tmp.len); } if (fstat(slots[slot].tmpfd, &st) == -1) failsys_slot(slot, "ZCould not fstat"); else if (st.st_size > slots[slot].headerlen) send_email(slot); else report_slot(slot, "KJob complete, no mail sent"); } /* To simplify the procedure, close the temporary file early. * The email sender still has it open, and will effect the final * deletion of the file when it completes. */ if (slots[slot].tmpfd != devnull) close(slots[slot].tmpfd); slots[slot].tmpfd = -1; } }