static char *get_time(Namval_t* np, Namfun_t* nfp) { static char buff[256]; struct dctime *dp = (struct dctime*)nfp; time_t t = nv_getn(np,nfp); char *format = nv_getval(dp->format); tmfmt(buff,sizeof(buff),format,(time_t*)0); return(buff); }
char* fmttime(const char* format, time_t clock) { char* buf; int z; buf = fmtbuf(z = 80); tmfmt(buf, z, format, &clock); return buf; }
extern size_t strftime(char* buf, size_t len, const char* format, const struct tm* tm) { register char* s; time_t t; Tm_t tl; memset(&tl, 0, sizeof(tl)); /* * nl_langinfo() may call strftime() with bogus tm except for * one value -- what a way to go */ if (tm->tm_sec < 0 || tm->tm_sec > 60 || tm->tm_min < 0 || tm->tm_min > 59 || tm->tm_hour < 0 || tm->tm_hour > 23 || tm->tm_wday < 0 || tm->tm_wday > 6 || tm->tm_mday < 1 || tm->tm_mday > 31 || tm->tm_mon < 0 || tm->tm_mon > 11 || tm->tm_year < 0 || tm->tm_year > (2138 - 1900)) { if (tm->tm_sec >= 0 && tm->tm_sec <= 60) tl.tm_sec = tm->tm_sec; if (tm->tm_min >= 0 && tm->tm_min <= 59) tl.tm_min = tm->tm_min; if (tm->tm_hour >= 0 && tm->tm_hour <= 23) tl.tm_hour = tm->tm_hour; if (tm->tm_wday >= 0 && tm->tm_wday <= 6) tl.tm_wday = tm->tm_wday; if (tm->tm_mday >= 0 && tm->tm_mday <= 31) tl.tm_mday = tm->tm_mday; if (tm->tm_mon >= 0 && tm->tm_mon <= 11) tl.tm_mon = tm->tm_mon; if (tm->tm_year >= 0 && tm->tm_year <= (2138 - 1900)) tl.tm_year = tm->tm_year; } else { tl.tm_sec = tm->tm_sec; tl.tm_min = tm->tm_min; tl.tm_hour = tm->tm_hour; tl.tm_mday = tm->tm_mday; tl.tm_mon = tm->tm_mon; tl.tm_year = tm->tm_year; tl.tm_wday = tm->tm_wday; tl.tm_yday = tm->tm_yday; tl.tm_isdst = tm->tm_isdst; } t = tmtime(&tl, TM_LOCALZONE); if (!(s = tmfmt(buf, len, format, &t))) return 0; return s - buf; }
int sendsmtp(Sfio_t* fp, char* host, char** argv, off_t original) { register char* s; register char* t; char* e; int n; int fd; int r; off_t z; Sfio_t* sp; Sfio_t* rp; char buf[PATH_MAX]; char svc[PATH_MAX]; /* * connect to the service */ sfsprintf(svc, sizeof(svc), "/dev/tcp/%s/inet.smtp", host); if ((fd = csopen(&cs, svc, 0)) < 0) { note(SYSTEM, "smtp: %s: cannot connect to service", svc); return -1; } if (!(sp = sfnew(NiL, NiL, SF_UNBOUND, fd, SF_WRITE)) || !(rp = sfnew(NiL, NiL, SF_UNBOUND, fd, SF_READ))) { if (sp) sfclose(sp); else close(fd); note(SYSTEM, "smtp: %s: cannot buffer service", svc); return -1; } /* * verify */ do { if (!(s = sfgetr(rp, '\n', 1))) goto bad_recv; if (strtol(s, &e, 10) != SMTP_READY) goto bad_prot; } while (*e == '-'); /* * identify */ if (!(s = state.var.domain) || !*s) s = state.var.hostname; if (sfprintf(sp, "HELO %s\r\n", s) < 0) goto bad_send; do { if (!(s = sfgetr(rp, '\n', 1))) goto bad_recv; if (strtol(s, &e, 10) != SMTP_OK) goto bad_prot; } while (*(unsigned char*)e == SMTP_OK); /* * from */ if (original) { if (!(s = sfgetr(fp, '\n', 1)) || !strneq(s, "From ", 5)) goto bad_mesg; for (s += 5; isspace(*s); s++); for (t = s; *t && !isspace(*t); t++); if (!(n = t - s)) goto bad_mesg; z = sfvalue(fp); if (sfprintf(sp, "MAIL FROM:<%*.*s>\r\n", n, n, s) < 0) goto bad_send; } else { z = 0; if ((state.var.domain ? sfprintf(sp, "MAIL FROM:<%s@%s>\r\n", state.var.user, state.var.domain) : sfprintf(sp, "MAIL FROM:<%s>\r\n", state.var.user)) < 0) goto bad_send; } do { if (!(s = sfgetr(rp, '\n', 1))) goto bad_recv; if (strtol(s, &e, 10) != SMTP_OK) goto bad_prot; } while (*e == '-'); /* * to */ while (s = *argv++) { if ((state.var.domain && !strchr(s, '@') ? sfprintf(sp, "RCPT TO:<%s@%s>\r\n", s, state.var.domain) : sfprintf(sp, "RCPT TO:<%s>\r\n", s)) < 0) goto bad_send; do { if (!(s = sfgetr(rp, '\n', 1))) goto bad_recv; if (strtol(s, &e, 10) != SMTP_OK) goto bad_prot; } while (*e == '-'); } /* * body */ if (sfprintf(sp, "DATA\r\n") < 0) goto bad_send; do { if (!(s = sfgetr(rp, '\n', 1))) goto bad_recv; if (strtol(s, &e, 10) != SMTP_START) goto bad_prot; } while (*e == '-'); tmfmt(buf, sizeof(buf), "%+uDate: %a, %d %b %Y %H:%M:%S UT", NiL); if (sfputr(sp, buf, '\n') < 0) goto bad_send; if (sfprintf(sp, "From: <%s@%s>\n", state.var.user, host) < 0) goto bad_send; while (s = sfgetr(fp, '\n', 1)) { if (sfprintf(sp, "%s%s\r\n", *s == '.' ? "." : "", s) < 0) goto bad_send; if (original && (z += sfvalue(fp)) >= original) break; } if (sfprintf(sp, ".\r\n") < 0) goto bad_send; do { if (!(s = sfgetr(rp, '\n', 1))) goto bad_recv; if (strtol(s, &e, 10) != SMTP_OK) goto bad_prot; } while (*e == '-'); /* * quit */ if (sfprintf(sp, "QUIT\r\n") < 0) goto bad_send; do { if (!(s = sfgetr(rp, '\n', 1))) goto bad_recv; if (strtol(s, &e, 10) != SMTP_CLOSE) goto bad_prot; } while (*e == '-'); r = 0; goto done; bad_mesg: note(0, "smtp: bad message -- no From header"); goto bad; bad_prot: if ((n = strlen(e)) > 0 && e[n - 1] == '\r') e[n - 1] = 0; note(0, "smtp: %s: service error:%s", svc, e); goto bad; bad_send: note(SYSTEM, "smtp: %s: service write error", svc); goto bad; bad_recv: note(SYSTEM, "smtp: %s: service read error", svc); bad: r = -1; done: sfclose(sp); sfclose(rp); return r; }