Rewritten notify() to write the message in bulk.

This was meant to avoid some 32 EPIPE from sendmail,
but it's still happening.
This commit is contained in:
default 2022-10-21 10:26:45 +02:00
parent 7cd67e7835
commit 6e470440f9

View file

@ -650,30 +650,33 @@ void notify(snac *snac, char *type, char *utype, char *actor, char *msg)
snac_debug(snac, 1, xs_fmt("notify(%s, %s, %s)", type, utype, actor)); snac_debug(snac, 1, xs_fmt("notify(%s, %s, %s)", type, utype, actor));
/* now write */ /* prepare message */
FILE *f;
if ((f = popen("/usr/sbin/sendmail -t", "w")) == NULL) {
snac_log(snac, xs_fmt("cannot pipe to sendmail (errno: %d)", errno));
return;
}
xs *subject = xs_fmt("snac notify for @%s@%s", xs *subject = xs_fmt("snac notify for @%s@%s",
xs_dict_get(snac->config, "uid"), xs_dict_get(srv_config, "host")); xs_dict_get(snac->config, "uid"), xs_dict_get(srv_config, "host"));
xs *from = xs_fmt("snac-daemon@%s (snac daemon)", xs_dict_get(srv_config, "host")); xs *from = xs_fmt("snac-daemon@%s (snac daemon)", xs_dict_get(srv_config, "host"));
xs *header = xs_fmt(
"From: %s\n"
"To: %s\n"
"Subject: %s\n"
"\n",
from, email, subject);
fprintf(f, "From: %s\n", from); xs *body = xs_str_new(header);
fprintf(f, "To: %s\n", email);
fprintf(f, "Subject: %s\n", subject);
fprintf(f, "\n");
fprintf(f, "Type : %s", type); if (strcmp(utype, "(null)") != 0) {
xs *s1 = xs_fmt("Type : %s + %s\n", type, utype);
body = xs_str_cat(body, s1);
}
else {
xs *s1 = xs_fmt("Type : %s\n", type);
body = xs_str_cat(body, s1);
}
if (strcmp(utype, "(null)") != 0) {
fprintf(f, " + %s", utype); xs *s1 = xs_fmt("Actor : %s\n", actor);
fprintf(f, "\n"); body = xs_str_cat(body, s1);
}
fprintf(f, "Actor : %s\n", actor);
if (strcmp(type, "Like") == 0 || strcmp(type, "Announce") == 0) { if (strcmp(type, "Like") == 0 || strcmp(type, "Announce") == 0) {
/* there is a related object: add it */ /* there is a related object: add it */
@ -683,13 +686,30 @@ void notify(snac *snac, char *type, char *utype, char *actor, char *msg)
if (xs_type(object) == XSTYPE_DICT) if (xs_type(object) == XSTYPE_DICT)
object = xs_dict_get(object, "id"); object = xs_dict_get(object, "id");
if (!xs_is_null(object)) if (!xs_is_null(object)) {
fprintf(f, "Object: %s\n", object); xs *s1 = xs_fmt("Object: %s\n", object);
body = xs_str_cat(body, s1);
}
} }
} }
if (fclose(f) == EOF) /* now write */
FILE *f;
if ((f = popen("/usr/sbin/sendmail -t", "w")) != NULL) {
fprintf(f, "%s\n", body);
if (fclose(f) == EOF) {
snac_log(snac, xs_fmt("fclose error in pipe to sendmail (errno: %d)", errno)); snac_log(snac, xs_fmt("fclose error in pipe to sendmail (errno: %d)", errno));
if ((f = fopen("/tmp/dead-letter", "w")) != NULL) {
fprintf(f, "%s\n", body);
fclose(f);
}
}
}
else
snac_log(snac, xs_fmt("cannot pipe to sendmail (errno: %d)", errno));
} }