static int try_mail_dotlock(const char *dotlock, char *idbuf) { char timebuf[NUMBUFSIZE]; char pidbuf[NUMBUFSIZE]; char *tmpname; int rc; libmail_str_time_t(time(NULL), timebuf); libmail_str_pid_t(getpid(), pidbuf); tmpname=malloc(strlen(dotlock) + strlen(timebuf) + strlen(pidbuf) + strlen(idbuf) + 10); if (!tmpname) return -1; strcpy(tmpname, dotlock); strcat(tmpname, "."); strcat(tmpname, timebuf); strcat(tmpname, "."); strcat(tmpname, pidbuf); strcat(tmpname, "."); strcat(tmpname, strchr(idbuf, ':')+1); rc=try_dotlock(tmpname, dotlock, idbuf); free(tmpname); return (rc); }
static void getid(char *idbuf) { libmail_str_pid_t(getpid(), idbuf); while (*idbuf) idbuf++; *idbuf++=':'; idbuf[IDBUFSIZE-NUMBUFSIZE-10]=0; if (gethostname(idbuf, IDBUFSIZE-NUMBUFSIZE-10) < 0) strcpy(idbuf, "localhost"); }
void ll_daemon_started(const char *pidfile, int fd) { char buf[NUMBUFSIZE+1]; char *p=strcat(libmail_str_pid_t(getpid(), buf), "\n"); size_t l=strlen(p); FILE *fp; if ((fp=fopen(pidfile, "w")) == NULL || fprintf(fp, "%s", p) < 0 || fflush(fp) < 0 || fclose(fp)) { perror(pidfile); exit(1); } write(fd, "", 1); /* Signal waiting parent */ close(fd); }
char *rfc2045_mk_boundary(struct rfc2045 *s, int fd) { char hostnamebuf[256]; pid_t mypid; char pidbuf[NUMBUFSIZE]; time_t mytime; char timebuf[NUMBUFSIZE]; static size_t cnt=0; char cntbuf[NUMBUFSIZE]; char *p; int rc; hostnamebuf[sizeof(hostnamebuf)-1]=0; if (gethostname(hostnamebuf, sizeof(hostnamebuf)-1)) hostnamebuf[0]=0; mypid=getpid(); time(&mytime); libmail_str_pid_t(mypid, pidbuf); libmail_str_time_t(mytime, timebuf); for (;;) { char tempbuf[NUMBUFSIZE]; libmail_str_size_t(++cnt, tempbuf); sprintf(cntbuf, "%4s", tempbuf); for (p=cntbuf; *p == ' '; *p++ = '0') ; p=malloc(strlen(hostnamebuf)+strlen(pidbuf) +strlen(timebuf)+strlen(cntbuf)+11); if (!p) { rfc2045_enomem(); return (NULL); } sprintf(p, "=_%s-%s-%s-%s", hostnamebuf, pidbuf, timebuf, cntbuf); if ((rc=rfc2045_try_boundary(s, fd, p)) == 0) break; free(p); if (rc < 0) return (NULL); } return (p); }
static int maildir_tmpcreate_fd_do(struct maildir_tmpcreate_info *info) { const char *maildir=info->maildir; const char *uniq=info->uniq; const char *hostname=info->hostname; char hostname_buf[256]; char time_buf[NUMBUFSIZE]; char usec_buf[NUMBUFSIZE]; char pid_buf[NUMBUFSIZE]; char len_buf[NUMBUFSIZE+3]; char dev_buf[NUMBUFSIZE]; char ino_buf[NUMBUFSIZE]; struct timeval tv; struct stat stat_buf; int fd; if (!maildir) maildir="."; if (!uniq) uniq=""; if (!hostname || !*hostname) { hostname_buf[sizeof(hostname_buf)-1]=0; if (gethostname(hostname_buf, sizeof(hostname_buf)-1) < 0) strcpy(hostname_buf, "localhost"); hostname=hostname_buf; } gettimeofday(&tv, NULL); libmail_str_time_t(tv.tv_sec, time_buf); libmail_str_time_t(tv.tv_usec, usec_buf); libmail_str_pid_t(getpid(), pid_buf); len_buf[0]=0; if (info->msgsize > 0) { strcpy(len_buf, ",S="); libmail_str_size_t(info->msgsize, len_buf+3); } if (info->tmpname) free(info->tmpname); info->tmpname=malloc(strlen(maildir)+strlen(uniq)+ strlen(hostname)+strlen(time_buf)+ strlen(usec_buf)+ strlen(pid_buf)+strlen(len_buf)+100); if (!info->tmpname) { maildir_tmpcreate_free(info); return -1; } strcpy(info->tmpname, maildir); strcat(info->tmpname, "/tmp/"); strcat(info->tmpname, time_buf); strcat(info->tmpname, ".M"); strcat(info->tmpname, usec_buf); strcat(info->tmpname, "P"); strcat(info->tmpname, pid_buf); if (*uniq) strcat(strcat(info->tmpname, "_"), uniq); strcat(info->tmpname, "."); strcat(info->tmpname, hostname); strcat(info->tmpname, len_buf); if (stat( info->tmpname, &stat_buf) == 0) { maildir_tmpcreate_free(info); errno=EAGAIN; return -1; } if (errno != ENOENT) { maildir_tmpcreate_free(info); if (errno == EAGAIN) errno=EIO; return -1; } if ((fd=maildir_safeopen_stat(info->tmpname, O_CREAT|O_RDWR|O_TRUNC, info->openmode, &stat_buf)) < 0) { maildir_tmpcreate_free(info); return -1; } libmail_strh_dev_t(stat_buf.st_dev, dev_buf); libmail_strh_ino_t(stat_buf.st_ino, ino_buf); if (info->newname) free(info->newname); info->newname=NULL; if (info->curname) free(info->curname); info->curname=NULL; info->newname=malloc(strlen(info->tmpname)+strlen(ino_buf)+ strlen(dev_buf)+3); if (info->newname) { info->curname=malloc(strlen(info->tmpname)+strlen(ino_buf)+ strlen(dev_buf)+3); if (!info->curname) { free(info->newname); info->newname=NULL; } } if (!info->newname) { maildir_tmpcreate_free(info); unlink(info->tmpname); close(fd); if (errno == EAGAIN) errno=EIO; return -1; } strcpy(info->newname, maildir); strcat(info->newname, "/new/"); strcat(info->newname, time_buf); strcat(info->newname, ".M"); strcat(info->newname, usec_buf); strcat(info->newname, "P"); strcat(info->newname, pid_buf); strcat(info->newname, "V"); strcat(info->newname, dev_buf); strcat(info->newname, "I"); strcat(info->newname, ino_buf); if (*uniq) strcat(strcat(info->newname, "_"), uniq); strcat(info->newname, "."); strcat(info->newname, hostname); strcat(info->newname, len_buf); strcpy(info->curname, info->newname); memcpy(info->curname + strlen(maildir)+1, "cur", 3); return fd; }