32 #define DATE_RE_1 "[0-9]+ " \ 33 "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)+ " \ 34 "[0-9]+ [0-9]+:[0-9]+:[0-9]+" 36 #define DATE_RE_2 "[0-9]+ " \ 37 "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)+ " \ 38 "[0-9]+ [0-9]+:[0-9]+" 49 char *strptime(
const char *s,
const char *format,
struct tm *tm);
61 memset(buf, 0,
sizeof (buf));
62 sz = strlen(date) - pi;
63 sz =
MIN(
sizeof (buf) - 1, sz);
65 strncpy(buf, date + pi, sz);
67 format =
"%d %b %Y %H:%M:%S";
68 if ((p = strptime(buf, format, &tm)) != NULL)
71 if (tm.tm_year >= 138) {
73 tm.tm_year =
MIN(135, tm.tm_year);
76 secs = mktime(&tm) + hour * 3600;
79 tm.tm_mday, tm.tm_mon,
80 tm.tm_year, tm.tm_hour, tm.tm_min, tm.tm_sec, secs);
92 memset(buf, 0,
sizeof (buf));
93 sz = strlen(date) - pi;
94 sz =
MIN(
sizeof (buf) - 1, sz);
96 strncpy(buf, date + pi, sz);
98 format =
"%d %b %Y %H:%M";
99 if ((p = strptime(buf, format, &tm)) != NULL)
102 if (tm.tm_year >= 138) {
104 tm.tm_year =
MIN(135, tm.tm_year);
107 secs = mktime(&tm) + hour * 3600;
110 tm.tm_mday, tm.tm_mon,
111 tm.tm_year, tm.tm_hour, tm.tm_min, tm.tm_sec, secs);
133 char *expr =
"<.*@.*>";
138 if (dst != NULL && sz > 0)
141 if ((dst == NULL) || (org == NULL) || (sz == 0))
148 if (pf - pi - 1 <= sz)
151 strlcpy(dst, org + pi + 1, sz);
161 strncpy(dst, org, l);
186 if (dst == NULL || sz == 0)
200 n = strcspn(org + pi,
"@");
203 if (pf - pi - 1 <= sz)
206 strlcpy(dst, org + pi + 1, sz);
210 char *p =
strchr(org,
'@');
227 #ifndef SMFIS_CONTINUE 228 # define SMFIS_CONTINUE 0 229 # define SMFIS_REJECT 1 230 # define SMFIS_DISCARD 2 231 # define SMFIS_ACCEPT 3 232 # define SMFIS_TEMPFAIL 4 240 if (s == NULL || r == NULL)
243 memset(r, 0,
sizeof (*r));
249 if (
zeStrRegex(s,
"^ERROR:[0-9]{3}:[0-9]\\.[0-9]\\.[0-9]:", NULL, NULL,
TRUE))
254 p += strcspn(p,
":") + 1;
256 if (n >=
sizeof (r->
rcode))
257 n =
sizeof (r->
rcode) - 1;
258 strncpy(r->
rcode, p, n);
260 p += strcspn(p,
":") + 1;
262 if (n >=
sizeof (r->
xcode))
263 n =
sizeof (r->
xcode) - 1;
264 strncpy(r->
xcode, p, n);
266 p += strcspn(p,
":") + 1;
284 snprintf(r->
xcode, sizeof (r->
xcode),
"5.7.0");
285 snprintf(r->
msg, sizeof (r->
msg),
"Access denied");
301 snprintf(r->
xcode, sizeof (r->
xcode),
"5.7.0");
302 snprintf(r->
msg, sizeof (r->
msg),
"Access denied");
311 snprintf(r->
xcode, sizeof (r->
xcode),
"4.5.1");
312 snprintf(r->
msg, sizeof (r->
msg),
313 "For some reason I can't serve you now. Try again later.");
319 if (
zeStrRegex(s,
"^[0-9]{3}:[0-9]\\.[0-9]\\.[0-9]:.+", NULL, NULL,
TRUE))
324 memset(argv, 0,
sizeof (argv));
329 if (argv[0] == NULL || strlen(argv[0]) == 0)
331 if (argv[1] == NULL || strlen(argv[1]) == 0)
333 if (argv[2] == NULL || strlen(argv[2]) == 0)
334 argv[2] =
"Unknown reason...";
380 if (*xcode != *rcode)
382 ZE_LogMsgError(0,
"rcode=(%s) and xcode=(%s) don't match", rcode, xcode);
385 if (strlen(rcode) == 0)
387 if (strlen(xcode) == 0)
390 if (strlen(
msg) == 0)
391 msg =
"Unknown why... ";
412 memset(r, 0,
sizeof (*r));
#define ZE_LogMsgError(level,...)
bool zeStrRegex(char *, char *, long *, long *, bool)
char * extract_email_address(char *dst, char *org, size_t sz)
int zeStr2Tokens(char *, int, char **, char *)
long zeStr2long(char *s, int *error, long dval)
#define ZE_MessageNotice(level,...)
bool jc_fill_reply(smtp_reply_T *r, char *rcode, char *xcode, char *msg, int result)
#define ZE_MessageInfo(level,...)
time_t header_date2secs(char *date)
void jc_reply_free(smtp_reply_T *r)
char * extract_host_from_email_address(char *dst, char *org, size_t sz)
int jc_string2reply(smtp_reply_T *r, char *s)
char * zeStr2Lower(char *)