static void do_get(const char *action) { unsigned long u; struct stat st; char ch; int r; unsigned int pos; int fd; if (!flagget) strerr_die2x(100,FATAL,MSG(ERR_NOT_AVAILABLE)); hdr_subject(MSG(SUB_GET_MSG)); hdr_ctboundary(); copy(&qq,"text/top",flagcd); pos = str_len(ACTION_GET); if (!case_starts(action,ACTION_GET)) pos = str_len(ALT_GET); if (action[pos] == '.' || action [pos] == '_') pos++; scan_ulong(action + pos,&u); stralloc_copys(&line,"archive/"); stralloc_catb(&line,strnum,fmt_ulong(strnum,u / 100)); stralloc_cats(&line,"/"); stralloc_catb(&line,strnum,fmt_uint0(strnum,(unsigned int) (u % 100),2)); stralloc_0(&line); fd = open_read(line.s); if (fd == -1) if (errno != error_noent) strerr_die2sys(111,FATAL,MSG1(ERR_OPEN,line.s)); else copy_act("text/get-bad"); else { if (fstat(fd,&st) == -1) copy_act("text/get-bad"); else if (!(st.st_mode & 0100)) copy_act("text/get-bad"); else { showsend("get"); substdio_fdbuf(&sstext,read,fd,textbuf,sizeof(textbuf)); qmail_puts(&qq,"> "); for (;;) { r = substdio_get(&sstext,&ch,1); if (r == -1) strerr_die2sys(111,FATAL,MSG1(ERR_READ,line.s)); if (r == 0) break; qmail_put(&qq,&ch,1); if (ch == '\n') qmail_puts(&qq,"> "); } qmail_puts(&qq,"\n"); } close(fd); } copybottom(0); qmail_to(&qq,target.s); }
int fmt_accustamp(char s[TIMESTAMP]) { struct taia now; int len; taia_now(&now); len = fmt_ulong(s,(unsigned long)tai_tounix(&now.sec)); s[len++] = '.'; len += fmt_uint0(s+len,now.nano / 1000,6); return len; }
static int openone(unsigned long outnum) { static stralloc fnadir = {0}; char strnum[FMT_ULONG]; int fd; stralloc_copys(&fnadir,"archive/"); stralloc_catb(&fnadir,strnum,fmt_ulong(strnum,outnum / 100)); stralloc_copy(&fnaf,&fnadir); stralloc_cats(&fnaf,"/"); stralloc_catb(&fnaf,strnum,fmt_uint0(strnum,(unsigned int)(outnum % 100),2)); stralloc_0(&fnadir); stralloc_0(&fnaf); if (mkdir(fnadir.s,0755) == -1) if (errno != error_exist) strerr_die2sys(111,FATAL,MSG1(ERR_CREATE,fnadir.s)); if ((fd = open_trunc(fnaf.s)) == -1) strerr_die2sys(111,FATAL,MSG1(ERR_WRITE,fnaf.s)); substdio_fdbuf(&ssarchive,write,fd,archivebuf,sizeof archivebuf); return fd; }
int openone(unsigned long outnum) { int fd; if (!stralloc_copys(&fnadir,"archive/")) die_nomem(); if (!stralloc_catb(&fnadir,strnum, fmt_ulong(strnum,outnum / 100))) die_nomem(); if (!stralloc_copy(&fnaf,&fnadir)) die_nomem(); if (!stralloc_cats(&fnaf,"/")) die_nomem(); if (!stralloc_catb(&fnaf,strnum, fmt_uint0(strnum,(unsigned int)(outnum % 100),2))) die_nomem(); if (!stralloc_0(&fnadir)) die_nomem(); if (!stralloc_0(&fnaf)) die_nomem(); if (mkdir(fnadir.s,0755) == -1) if (errno != error_exist) strerr_die4sys(111,FATAL,ERR_CREATE,fnadir.s,": "); if ((fd = open_trunc(fnaf.s)) == -1) strerr_die4sys(111,FATAL,ERR_WRITE,fnaf.s,": "); substdio_fdbuf(&ssarchive,write,fd,archivebuf,sizeof archivebuf); return fd; }
int main() { char ch; for (;;) { get(&ch); if (ch == '@') { secs = 0; nanosecs = 0; for (;;) { get(&ch); u = ch - '0'; if (u >= 10) { u = ch - 'a'; if (u >= 6) break; u += 10; } secs <<= 4; secs += nanosecs >> 28; nanosecs &= 0xfffffff; nanosecs <<= 4; nanosecs += u; } secs -= 4611686018427387914ULL; t = localtime(&secs); out(num,fmt_ulong(num,1900 + t->tm_year)); out("-",1); out(num,fmt_uint0(num,1 + t->tm_mon,2)); out("-",1); out(num,fmt_uint0(num,t->tm_mday,2)); out(" ",1); out(num,fmt_uint0(num,t->tm_hour,2)); out(":",1); out(num,fmt_uint0(num,t->tm_min,2)); out(":",1); out(num,fmt_uint0(num,t->tm_sec,2)); out(".",1); out(num,fmt_uint0(num,nanosecs,9)); } for (;;) { out(&ch,1); if (ch == '\n') break; get(&ch); } }
void msgout(unsigned long msg,char format) /* Outputs message (everything that's needed per message) */ { int fd; unsigned int len; if (!stralloc_copys(&fn,"archive/")) die_nomem(); len = fmt_ulong(strnum, msg / 100); if (!stralloc_catb(&fn,strnum,len)) die_nomem(); if (!stralloc_cats(&fn,"/")) die_nomem(); len = fmt_uint0(strnum, (unsigned int) (msg % 100),2); if (!stralloc_catb(&fn,strnum,len)) die_nomem(); if (!stralloc_0(&fn)) die_nomem(); switch(format) { case MIME: case VIRGIN: case NATIVE: case MIXED: fd = open_read(fn.s); if (fd == -1) { if (errno != error_noent) strerr_die2sys(111,FATAL,MSG1(ERR_OPEN,fn.s)); else mime_getbad(msg); } else if (fstat(fd,&st) == -1 || (!(st.st_mode & 0100))) { close(fd); mime_getbad(msg); } else { hdr_boundary(0); hdr_ctype(CTYPE_MESSAGE); qmail_puts(&qq,"Content-Disposition: inline; filename=\""); qmail_put(&qq,listname.s,listname.len); qmail_puts(&qq,"_"); qmail_put(&qq,strnum,fmt_ulong(strnum,msg)); qmail_puts(&qq,".ezm\"\n\n"); copymsg(fd,format); close(fd); } break; case RFC1153: fd = open_read(fn.s); if (fd == -1) { if (errno != error_noent) strerr_die2sys(111,FATAL,MSG1(ERR_OPEN,fn.s)); else { qmail_puts(&qq,"\n== "); qmail_put(&qq,strnum,fmt_ulong(strnum,msg)); qmail_puts(&qq," ==\n\n"); copy(&qq,"text/get-bad",flagcd); } } else { if (fstat(fd,&st) == -1 || (!(st.st_mode & 0100))) { close(fd); qmail_puts(&qq,"\n== "); qmail_put(&qq,strnum,fmt_ulong(strnum,msg)); qmail_puts(&qq," ==\n\n"); copy(&qq,"text/get-bad",flagcd); } else { copymsg(fd,format); close(fd); } } qmail_puts(&qq,"\n------------------------------\n\n"); break; default: strerr_die2x(100,FATAL,"Program error: Unrecognized format in msgout"); break; } }