void setproctitle_impl(const char *fmt, ...) { /* Use buffer in case argv[0] is passed. */ char buf[SPT_MAXTITLE + 1]; va_list ap; char *nul; int len; if (SPT.base == NULL) { if (!SPT.warned) { warnx("setproctitle not initialized, please either call " "setproctitle_init() or link against libbsd-ctor."); SPT.warned = true; } return; } if (fmt) { if (fmt[0] == '-') { /* Skip program name prefix. */ fmt++; len = 0; } else { /* Print program name heading for grep. */ snprintf(buf, sizeof(buf), "%s: ", getprogname()); len = strlen(buf); } va_start(ap, fmt); len += vsnprintf(buf + len, sizeof(buf) - len, fmt, ap); va_end(ap); } else { len = snprintf(buf, sizeof(buf), "%s", SPT.arg0); } if (len <= 0) { SPT.error = errno; return; } if (!SPT.reset) { memset(SPT.base, 0, SPT.end - SPT.base); SPT.reset = true; } else { memset(SPT.base, 0, spt_min(sizeof(buf), SPT.end - SPT.base)); } len = spt_min(len, spt_min(sizeof(buf), SPT.end - SPT.base) - 1); memcpy(SPT.base, buf, len); nul = &SPT.base[len]; if (nul < SPT.nul) { *SPT.nul = '.'; } else if (nul == SPT.nul && &nul[1] < SPT.end) { *SPT.nul = ' '; *++nul = '\0'; } }
void setproctitle(const char *fmt, ...) { char buf[SPT_MAXTITLE + 1]; /* use buffer in case argv[0] is passed */ va_list ap; char *nul; int len, error; if (!SPT.base) return; if (fmt) { va_start(ap, fmt); len = vsnprintf(buf, sizeof buf, fmt, ap); va_end(ap); } else { len = snprintf(buf, sizeof buf, "%s", SPT.arg0); } if (len <= 0) { error = errno; goto error; } if (!SPT.reset) { memset(SPT.base, 0, SPT.end - SPT.base); SPT.reset = 1; } else { memset(SPT.base, 0, spt_min(sizeof buf, SPT.end - SPT.base)); } len = spt_min(len, spt_min(sizeof buf, SPT.end - SPT.base) - 1); memcpy(SPT.base, buf, len); nul = &SPT.base[len]; if (nul < SPT.nul) { *SPT.nul = '.'; } else if (nul == SPT.nul && &nul[1] < SPT.end) { *SPT.nul = ' '; *++nul = '\0'; } return; error: SPT.error = error; } /* setproctitle() */