advertise (const char *what, char *tail, const char *fmt, va_list ap)
{
int eindex = errno;
advertise (const char *what, char *tail, const char *fmt, va_list ap)
{
int eindex = errno;
- char buffer[BUFSIZ], err[BUFSIZ];
- struct iovec iob[20], *iov;
+ char buffer[BUFSIZ], errbuf[BUFSIZ], *err;
+ struct iovec iob[10], *iov;
+ size_t niov;
+#define APPEND_IOV(p, len) \
+ iov->iov_base = (p); \
+ iov->iov_len = (len); \
+ iov++
+
+#define ADD_LITERAL(s) APPEND_IOV((s), LEN(s))
+#define ADD_VAR(s) APPEND_IOV((s), strlen(s))
+
}
vsnprintf (buffer, sizeof(buffer), fmt, ap);
}
vsnprintf (buffer, sizeof(buffer), fmt, ap);
- snprintf (err, sizeof(err), "Error %d", eindex);
- iov->iov_base = err;
+ snprintf(errbuf, sizeof(errbuf), "Error %d", eindex);
+ err = errbuf;
- iov->iov_len = strlen (iov->iov_base = "\n");
- iov++;
- if (writev (fileno (stderr), iob, iov - iob) < 0) {
+ ADD_LITERAL("\n");
+
+#undef ADD_LITERAL
+#undef ADD_VAR
+
+ niov = iov - iob;
+ assert(niov <= DIM(iob));
+
+ fflush (stdout);
+ fflush (stderr);
+ if (writev(fileno(stderr), iob, niov) == -1) {
snprintf(buffer, sizeof buffer, "%s: write stderr failed: %d\n",
invo_name && *invo_name ? invo_name : "nmh", errno);
if (write(2, buffer, strlen(buffer)) == -1) {
snprintf(buffer, sizeof buffer, "%s: write stderr failed: %d\n",
invo_name && *invo_name ? invo_name : "nmh", errno);
if (write(2, buffer, strlen(buffer)) == -1) {