static void print_uidl(unsigned i) { const char *p; if (enomem_1msg) /* Error recovery - out of disk space, see comments ** at the beginning of this file. */ { char dev_buf[NUMBUFSIZE]; char ino_buf[NUMBUFSIZE]; char mtime_buf[NUMBUFSIZE]; printed(printf("ENOMEM-%s-%s-%s\r\n", libmail_strh_time_t(enomem_stat.st_mtime, mtime_buf), libmail_strh_dev_t(enomem_stat.st_dev, dev_buf), libmail_strh_ino_t(enomem_stat.st_ino, ino_buf)) ); return; } if (msglist_a[i]->uid.n != 0) { /* VERSION 1 and VERSION 2 UIDL */ printed(printf((msglist_a[i]->uid.uidv ? "UID%lu-%lu\r\n":"UID%lu\r\n"), msglist_a[i]->uid.n, msglist_a[i]->uid.uidv)); return; } /* VERSION 0 UIDL */ p=strchr(msglist_a[i]->filename, '/')+1; while (*p && *p != MDIRSEP[0]) { if (*p < 0x21 || *p > 0x7E || *p == '\'' || *p == '"' || *p == '+') printed(printf("+%02X", (int)(unsigned char)*p)); else printchar(*p); ++p; } printed(printf("\r\n")); }
static char *mktoken(const char *hash, const char *t, time_t now) { char now_s[NUMBUFSIZE]; char *p; unsigned char *q; int i; char *r; libmail_strh_time_t(now, now_s); p=malloc(strlen(hash)+strlen(now_s)+3+hmac_sha1.hh_L*2); if (!p) return (NULL); strcat(strcpy(p, hash), now_s); q=malloc(hmac_sha1.hh_L*3); if (!q) { free(p); return (NULL); } hmac_hashkey(&hmac_sha1, t, sizeof(cur_token), q, q + hmac_sha1.hh_L); hmac_hashtext(&hmac_sha1, p, strlen(p), q, q + hmac_sha1.hh_L, q + hmac_sha1.hh_L*2); strcpy(p, now_s); r=p + strlen(p); *r++='-'; for (i=0; i<hmac_sha1.hh_L; i++) { int c=(unsigned char)q[hmac_sha1.hh_L*2+i]; *r++ = xdigit[c / 16]; *r++ = xdigit[c % 16]; } *r=0; free(q); return (p); }
void SubmitFile::openctl() { std::string filename; ctlfile.close(); if (num_control_files_created == 0) // First recipient { for (;;) { const char *timeptr, *pidptr, *hostnameptr; getnewtmpfilenameargs(&timeptr, &pidptr, &hostnameptr); filename=name1stctlfile(); current_submit_file=this; int nfd=open(filename.c_str(), O_WRONLY | O_TRUNC | O_CREAT | O_EXCL | O_APPEND, PERMISSION); if (nfd >= 0) ctlfile.fd(nfd); if (nfd >= 0 || errno != EEXIST) break; current_submit_file=0; sleep(3); } ++num_control_files_created; if (ctlfile.fd() < 0) { // // One reason why we may not be able to create it // would be if the subdirectory, based on current time, // does not exist, so fork a tiny program to create it, // with the right permissions // pid_t p=fork(); pid_t w; int wait_stat; if (p == -1) { clog_msg_start_err(); clog_msg_str("fork: "); clog_msg_errno(); } if (p == 0) { filename=std::string(filename.begin(), std::find(filename.begin() , filename.end() , '/')); execl(LIBEXECDIR "/courier/submitmkdir", "submitmkdir", filename.c_str(), (char *)0); exit(0); } while ((w=wait(&wait_stat)) != p) if (w == -1 && errno == ECHILD) break; int nfd=open(filename.c_str(), O_WRONLY | O_TRUNC | O_CREAT | O_EXCL | O_APPEND, PERMISSION); if (nfd >= 0) ctlfile.fd(nfd); } } else { ++num_control_files_created; filename=namefile("C", num_control_files_created); int nfd=open(filename.c_str(), O_WRONLY | O_TRUNC | O_CREAT | O_EXCL | O_APPEND, PERMISSION); if (nfd >= 0) ctlfile.fd(nfd); } if (ctlfile.fd() < 0) clog_msg_errno(); struct stat stat_buf; char ino_buf[sizeof(ino_t)*2+1]; if (fstat(ctlfile.fd(), &stat_buf) != 0) clog_msg_errno(); rcptcount=0; if (num_control_files_created == 1) { char time_buf[sizeof(time_t)*2+1]; char pid_buf[sizeof(time_t)*2+1]; char msgidbuf[sizeof(time_buf)+sizeof(pid_buf)]; ctltimestamp=stat_buf.st_mtime; ctlpid=getpid(); strcat(strcat(strcpy(msgidbuf, libmail_strh_time_t(ctltimestamp, time_buf)), "."), libmail_strh_pid_t(getpid(), pid_buf)); basemsgid=msgidbuf; ctlinodenum=stat_buf.st_ino; } libmail_strh_ino_t( stat_buf.st_ino, ino_buf ); ctlfile << COMCTLFILE_SENDER << sender << std::endl << COMCTLFILE_FROMMTA << frommta << std::endl << COMCTLFILE_ENVID << envid << std::endl << COMCTLFILE_DSNFORMAT << dsnformat << std::endl << COMCTLFILE_MSGID << ino_buf << '.' << basemsgid << std::endl; if (submitdelay) ctlfile << COMCTLFILE_SUBMITDELAY << submitdelay << std::endl; ctlfile << std::flush; }