simpler.
}
/*
- * Append strings to the buffer, expanding it as needed.
+ * Parse the format and append strings, only %s and %% escapes are supported.
+ * Any characters in set are quoted with a backslash.
*/
void
-lbuf_append_quoted(struct lbuf *lbuf, const char *set, ...)
+lbuf_append_quoted(struct lbuf *lbuf, const char *set, const char *fmt, ...)
{
va_list ap;
- int len = 0;
- char *cp, *s;
-
- va_start(ap, set);
- while ((s = va_arg(ap, char *)) != NULL) {
- len += strlen(s);
- for (cp = s; (cp = strpbrk(cp, set)) != NULL; cp++)
- len++;
- }
- va_end(ap);
-
- /* Expand buffer as needed. */
- if (lbuf->len + len >= lbuf->size) {
- do {
- lbuf->size += 256;
- } while (lbuf->len + len >= lbuf->size);
- lbuf->buf = erealloc(lbuf->buf, lbuf->size);
- }
+ int len;
+ char *cp, *s = NULL;
- va_start(ap, set);
- /* Append each string. */
- while ((s = va_arg(ap, char *)) != NULL) {
- while ((cp = strpbrk(s, set)) != NULL) {
- len = (int)(cp - s);
- memcpy(lbuf->buf + lbuf->len, s, len);
- lbuf->len += len;
- lbuf->buf[lbuf->len++] = '\\';
- lbuf->buf[lbuf->len++] = *cp;
- s = cp + 1;
- }
- if (*s != '\0') {
+ va_start(ap, fmt);
+ while (*fmt != '\0') {
+ len = 1;
+ if (fmt[0] == '%' && fmt[1] == 's') {
+ s = va_arg(ap, char *);
len = strlen(s);
- memcpy(lbuf->buf + lbuf->len, s, len);
- lbuf->len += len;
}
+ /* Assume worst case that all chars must be escaped. */
+ if (lbuf->len + (len * 2) + 1 >= lbuf->size) {
+ do {
+ lbuf->size += 256;
+ } while (lbuf->len + len + 1 >= lbuf->size);
+ lbuf->buf = erealloc(lbuf->buf, lbuf->size);
+ }
+ if (*fmt == '%') {
+ if (*(++fmt) == 's') {
+ while ((cp = strpbrk(s, set)) != NULL) {
+ len = (int)(cp - s);
+ memcpy(lbuf->buf + lbuf->len, s, len);
+ lbuf->len += len;
+ lbuf->buf[lbuf->len++] = '\\';
+ lbuf->buf[lbuf->len++] = *cp;
+ s = cp + 1;
+ }
+ if (*s != '\0') {
+ len = strlen(s);
+ memcpy(lbuf->buf + lbuf->len, s, len);
+ lbuf->len += len;
+ }
+ fmt++;
+ continue;
+ }
+ }
+ if (strchr(set, *fmt) != NULL)
+ lbuf->buf[lbuf->len++] = '\\';
+ lbuf->buf[lbuf->len++] = *fmt++;
}
lbuf->buf[lbuf->len] = '\0';
va_end(ap);
}
/*
- * Append strings to the buffer, expanding it as needed.
+ * Parse the format and append strings, only %s and %% escapes are supported.
*/
void
-lbuf_append(struct lbuf *lbuf, ...)
+lbuf_append(struct lbuf *lbuf, const char *fmt, ...)
{
va_list ap;
- int len = 0;
- char *s;
-
- va_start(ap, lbuf);
- while ((s = va_arg(ap, char *)) != NULL)
- len += strlen(s);
- va_end(ap);
-
- /* Expand buffer as needed. */
- if (lbuf->len + len >= lbuf->size) {
- do {
- lbuf->size += 256;
- } while (lbuf->len + len >= lbuf->size);
- lbuf->buf = erealloc(lbuf->buf, lbuf->size);
- }
+ int len;
+ char *s = NULL;
- va_start(ap, lbuf);
- /* Append each string. */
- while ((s = va_arg(ap, char *)) != NULL) {
- len = strlen(s);
- memcpy(lbuf->buf + lbuf->len, s, len);
- lbuf->len += len;
+ va_start(ap, fmt);
+ while (*fmt != '\0') {
+ len = 1;
+ if (fmt[0] == '%' && fmt[1] == 's') {
+ s = va_arg(ap, char *);
+ len = strlen(s);
+ }
+ if (lbuf->len + len + 1 >= lbuf->size) {
+ do {
+ lbuf->size += 256;
+ } while (lbuf->len + len + 1 >= lbuf->size);
+ lbuf->buf = erealloc(lbuf->buf, lbuf->size);
+ }
+ if (*fmt == '%') {
+ if (*(++fmt) == 's') {
+ memcpy(lbuf->buf + lbuf->len, s, len);
+ lbuf->len += len;
+ fmt++;
+ continue;
+ }
+ }
+ lbuf->buf[lbuf->len++] = *fmt++;
}
lbuf->buf[lbuf->len] = '\0';
va_end(ap);
void lbuf_init(struct lbuf *, int (*)(const char *), int, const char *, int);
void lbuf_destroy(struct lbuf *);
-void lbuf_append(struct lbuf *, ...);
-void lbuf_append_quoted(struct lbuf *, const char *, ...);
+void lbuf_append(struct lbuf *, const char *, ...) __printflike(2, 3);
+void lbuf_append_quoted(struct lbuf *, const char *, const char *, ...) __printflike(3, 4);
void lbuf_print(struct lbuf *);
#endif /* _SUDO_LBUF_H */
else
prefix = ", ";
for (p = bv; *p != NULL; p++) {
- lbuf_append(lbuf, prefix, (*p)->bv_val, NULL);
+ lbuf_append(lbuf, "%s%s", prefix, (*p)->bv_val);
prefix = ", ";
count++;
}
struct berval **bv, **p;
int count = 0;
- lbuf_append(lbuf, " (", NULL);
+ lbuf_append(lbuf, " (");
/* get the RunAsUser Values from the entry */
bv = ldap_get_values_len(ld, entry, "sudoRunAsUser");
bv = ldap_get_values_len(ld, entry, "sudoRunAs");
if (bv != NULL) {
for (p = bv; *p != NULL; p++) {
- if (p != bv)
- lbuf_append(lbuf, ", ", NULL);
- lbuf_append(lbuf, (*p)->bv_val, NULL);
+ lbuf_append(lbuf, "%s%s", p != bv ? ", " : "", (*p)->bv_val);
}
ldap_value_free_len(bv);
} else
- lbuf_append(lbuf, def_runas_default, NULL);
+ lbuf_append(lbuf, "%s", def_runas_default);
/* get the RunAsGroup Values from the entry */
bv = ldap_get_values_len(ld, entry, "sudoRunAsGroup");
if (bv != NULL) {
- lbuf_append(lbuf, " : ", NULL);
+ lbuf_append(lbuf, " : ");
for (p = bv; *p != NULL; p++) {
- if (p != bv)
- lbuf_append(lbuf, ", ", NULL);
- lbuf_append(lbuf, (*p)->bv_val, NULL);
+ lbuf_append(lbuf, "%s%s", p != bv ? ", " : "", (*p)->bv_val);
}
ldap_value_free_len(bv);
}
- lbuf_append(lbuf, ") ", NULL);
+ lbuf_append(lbuf, ") ");
/* get the Option Values from the entry */
bv = ldap_get_values_len(ld, entry, "sudoOption");
tag = (*p)->bv_val[0] == '!' ?
"NOSETENV: " : "SETENV: ";
if (tag != NULL)
- lbuf_append(lbuf, tag, NULL);
+ lbuf_append(lbuf, tag);
}
ldap_value_free_len(bv);
}
bv = ldap_get_values_len(ld, entry, "sudoCommand");
if (bv != NULL) {
for (p = bv; *p != NULL; p++) {
- if (p != bv)
- lbuf_append(lbuf, ", ", NULL);
- lbuf_append(lbuf, (*p)->bv_val, NULL);
+ lbuf_append(lbuf, "%s%s", p != bv ? ", " : "", (*p)->bv_val);
count++;
}
ldap_value_free_len(bv);
}
- lbuf_append(lbuf, "\n", NULL);
+ lbuf_append(lbuf, "\n");
return count;
}
/* extract the dn, only show the first rdn */
rdn = sudo_ldap_get_first_rdn(ld, entry);
if (rdn != NULL)
- lbuf_append(lbuf, _("\nLDAP Role: "), rdn, "\n", NULL);
+ lbuf_append(lbuf, _("\nLDAP Role: %s\n"), rdn);
else
- lbuf_append(lbuf, _("\nLDAP Role: UNKNOWN\n"), NULL);
+ lbuf_append(lbuf, _("\nLDAP Role: UNKNOWN\n"));
if (rdn)
ldap_memfree(rdn);
/* get the RunAsUser Values from the entry */
- lbuf_append(lbuf, " RunAsUsers: ", NULL);
+ lbuf_append(lbuf, " RunAsUsers: ");
bv = ldap_get_values_len(ld, entry, "sudoRunAsUser");
if (bv == NULL)
bv = ldap_get_values_len(ld, entry, "sudoRunAs");
if (bv != NULL) {
for (p = bv; *p != NULL; p++) {
- if (p != bv)
- lbuf_append(lbuf, ", ", NULL);
- lbuf_append(lbuf, (*p)->bv_val, NULL);
+ lbuf_append(lbuf, "%s%s", p != bv ? ", " : "", (*p)->bv_val);
}
ldap_value_free_len(bv);
} else
- lbuf_append(lbuf, def_runas_default, NULL);
- lbuf_append(lbuf, "\n", NULL);
+ lbuf_append(lbuf, "%s", def_runas_default);
+ lbuf_append(lbuf, "\n");
/* get the RunAsGroup Values from the entry */
bv = ldap_get_values_len(ld, entry, "sudoRunAsGroup");
if (bv != NULL) {
- lbuf_append(lbuf, " RunAsGroups: ", NULL);
+ lbuf_append(lbuf, " RunAsGroups: ");
for (p = bv; *p != NULL; p++) {
- if (p != bv)
- lbuf_append(lbuf, ", ", NULL);
- lbuf_append(lbuf, (*p)->bv_val, NULL);
+ lbuf_append(lbuf, "%s%s", p != bv ? ", " : "", (*p)->bv_val);
}
ldap_value_free_len(bv);
- lbuf_append(lbuf, "\n", NULL);
+ lbuf_append(lbuf, "\n");
}
/* get the Option Values from the entry */
bv = ldap_get_values_len(ld, entry, "sudoOption");
if (bv != NULL) {
- lbuf_append(lbuf, " Options: ", NULL);
+ lbuf_append(lbuf, " Options: ");
for (p = bv; *p != NULL; p++) {
- if (p != bv)
- lbuf_append(lbuf, ", ", NULL);
- lbuf_append(lbuf, (*p)->bv_val, NULL);
+ lbuf_append(lbuf, "%s%s", p != bv ? ", " : "", (*p)->bv_val);
}
ldap_value_free_len(bv);
- lbuf_append(lbuf, "\n", NULL);
+ lbuf_append(lbuf, "\n");
}
/*
bv = ldap_get_values_len(ld, entry, "sudoOrder");
if (bv != NULL) {
if (*bv != NULL) {
- lbuf_append(lbuf, " Order: ", (*bv)->bv_val, "\n", NULL);
+ lbuf_append(lbuf, _(" Order: %s\n"), (*bv)->bv_val);
}
ldap_value_free_len(bv);
}
/* Get the command values from the entry. */
bv = ldap_get_values_len(ld, entry, "sudoCommand");
if (bv != NULL) {
- lbuf_append(lbuf, " Commands:\n", NULL);
+ lbuf_append(lbuf, _(" Commands:\n"));
for (p = bv; *p != NULL; p++) {
- lbuf_append(lbuf, "\t", (*p)->bv_val, "\n", NULL);
+ lbuf_append(lbuf, "\t%s\n", (*p)->bv_val);
count++;
}
ldap_value_free_len(bv);
#ifdef HAVE_SELINUX
if (cs->role)
- lbuf_append(lbuf, "ROLE=", cs->role, " ", NULL);
+ lbuf_append(lbuf, "ROLE=%s ", cs->role);
if (cs->type)
- lbuf_append(lbuf, "TYPE=", cs->type, " ", NULL);
+ lbuf_append(lbuf, "TYPE=%s ", cs->type);
#endif /* HAVE_SELINUX */
if (TAG_CHANGED(setenv)) {
- lbuf_append(lbuf, cs->tags.setenv ? "SETENV: " :
- "NOSETENV: ", NULL);
+ lbuf_append(lbuf, cs->tags.setenv ? "SETENV: " : "NOSETENV: ");
tags->setenv = cs->tags.setenv;
}
if (TAG_CHANGED(noexec)) {
- lbuf_append(lbuf, cs->tags.noexec ? "NOEXEC: " :
- "EXEC: ", NULL);
+ lbuf_append(lbuf, cs->tags.noexec ? "NOEXEC: " : "EXEC: ");
tags->noexec = cs->tags.noexec;
}
if (TAG_CHANGED(nopasswd)) {
- lbuf_append(lbuf, cs->tags.nopasswd ? "NOPASSWD: " :
- "PASSWD: ", NULL);
+ lbuf_append(lbuf, cs->tags.nopasswd ? "NOPASSWD: " : "PASSWD: ");
tags->nopasswd = cs->tags.nopasswd;
}
if (TAG_CHANGED(log_input)) {
- lbuf_append(lbuf, cs->tags.log_input ? "LOG_INPUT: " :
- "NOLOG_INPUT: ", NULL);
+ lbuf_append(lbuf, cs->tags.log_input ? "LOG_INPUT: " : "NOLOG_INPUT: ");
tags->log_input = cs->tags.log_input;
}
if (TAG_CHANGED(log_output)) {
- lbuf_append(lbuf, cs->tags.log_output ? "LOG_OUTPUT: " :
- "NOLOG_OUTPUT: ", NULL);
+ lbuf_append(lbuf, cs->tags.log_output ? "LOG_OUTPUT: " : "NOLOG_OUTPUT: ");
tags->log_output = cs->tags.log_output;
}
m = cs->cmnd;
tags.nopasswd = UNSPEC;
tags.log_input = UNSPEC;
tags.log_output = UNSPEC;
- lbuf_append(lbuf, " ", NULL);
+ lbuf_append(lbuf, " ");
tq_foreach_fwd(&priv->cmndlist, cs) {
if (cs != tq_first(&priv->cmndlist))
- lbuf_append(lbuf, ", ", NULL);
- lbuf_append(lbuf, "(", NULL);
+ lbuf_append(lbuf, ", ");
+ lbuf_append(lbuf, "(");
if (!tq_empty(&cs->runasuserlist)) {
tq_foreach_fwd(&cs->runasuserlist, m) {
if (m != tq_first(&cs->runasuserlist))
- lbuf_append(lbuf, ", ", NULL);
+ lbuf_append(lbuf, ", ");
print_member(lbuf, m->name, m->type, m->negated,
RUNASALIAS);
}
} else if (tq_empty(&cs->runasgrouplist)) {
- lbuf_append(lbuf, def_runas_default, NULL);
+ lbuf_append(lbuf, "%s", def_runas_default);
} else {
- lbuf_append(lbuf, pw->pw_name, NULL);
+ lbuf_append(lbuf, "%s", pw->pw_name);
}
if (!tq_empty(&cs->runasgrouplist)) {
- lbuf_append(lbuf, " : ", NULL);
+ lbuf_append(lbuf, " : ");
tq_foreach_fwd(&cs->runasgrouplist, m) {
if (m != tq_first(&cs->runasgrouplist))
- lbuf_append(lbuf, ", ", NULL);
+ lbuf_append(lbuf, ", ");
print_member(lbuf, m->name, m->type, m->negated,
RUNASALIAS);
}
}
- lbuf_append(lbuf, ") ", NULL);
+ lbuf_append(lbuf, ") ");
sudo_file_append_cmnd(cs, &tags, lbuf);
nfound++;
}
- lbuf_append(lbuf, "\n", NULL);
+ lbuf_append(lbuf, "\n");
}
return nfound;
}
tags.nopasswd = UNSPEC;
tags.log_input = UNSPEC;
tags.log_output = UNSPEC;
- lbuf_append(lbuf, _("\nSudoers entry:\n"), NULL);
+ lbuf_append(lbuf, _("\nSudoers entry:\n"));
tq_foreach_fwd(&priv->cmndlist, cs) {
- lbuf_append(lbuf, " ", _("RunAsUsers: "), NULL);
+ lbuf_append(lbuf, _(" RunAsUsers: "));
if (!tq_empty(&cs->runasuserlist)) {
tq_foreach_fwd(&cs->runasuserlist, m) {
if (m != tq_first(&cs->runasuserlist))
- lbuf_append(lbuf, ", ", NULL);
+ lbuf_append(lbuf, ", ");
print_member(lbuf, m->name, m->type, m->negated,
RUNASALIAS);
}
} else if (tq_empty(&cs->runasgrouplist)) {
- lbuf_append(lbuf, def_runas_default, NULL);
+ lbuf_append(lbuf, "%s", def_runas_default);
} else {
- lbuf_append(lbuf, pw->pw_name, NULL);
+ lbuf_append(lbuf, "%s", pw->pw_name);
}
- lbuf_append(lbuf, "\n", NULL);
+ lbuf_append(lbuf, "\n");
if (!tq_empty(&cs->runasgrouplist)) {
- lbuf_append(lbuf, " ", _("RunAsGroups: "), NULL);
+ lbuf_append(lbuf, _(" RunAsGroups: "));
tq_foreach_fwd(&cs->runasgrouplist, m) {
if (m != tq_first(&cs->runasgrouplist))
- lbuf_append(lbuf, ", ", NULL);
+ lbuf_append(lbuf, ", ");
print_member(lbuf, m->name, m->type, m->negated,
RUNASALIAS);
}
- lbuf_append(lbuf, "\n", NULL);
+ lbuf_append(lbuf, "\n");
}
- lbuf_append(lbuf, " ", _("Commands:\n\t"), NULL);
+ lbuf_append(lbuf, _(" Commands:\n\t"));
sudo_file_append_cmnd(cs, &tags, lbuf);
- lbuf_append(lbuf, "\n", NULL);
+ lbuf_append(lbuf, "\n");
nfound++;
}
}
case DEFAULTS_CMND:
continue;
}
- lbuf_append(lbuf, prefix, NULL);
+ lbuf_append(lbuf, prefix);
if (d->val != NULL) {
- lbuf_append(lbuf, d->var, d->op == '+' ? "+=" :
- d->op == '-' ? "-=" : "=", NULL);
+ lbuf_append(lbuf, "%s%s", d->var, d->op == '+' ? "+=" :
+ d->op == '-' ? "-=" : "=");
if (strpbrk(d->val, " \t") != NULL) {
- lbuf_append(lbuf, "\"", NULL);
- lbuf_append_quoted(lbuf, "\"", d->val, NULL);
- lbuf_append(lbuf, "\"", NULL);
+ lbuf_append(lbuf, "\"");
+ lbuf_append_quoted(lbuf, "\"", "%s", d->val);
+ lbuf_append(lbuf, "\"");
} else
- lbuf_append_quoted(lbuf, SUDOERS_QUOTED, d->val, NULL);
+ lbuf_append_quoted(lbuf, SUDOERS_QUOTED, "%s", d->val);
} else
- lbuf_append(lbuf, d->op == FALSE ? "!" : "", d->var, NULL);
+ lbuf_append(lbuf, "%s%s", d->op == FALSE ? "!" : "", d->var);
prefix = ", ";
nfound++;
}
if (binding != tq_first(&d->binding)) {
binding = tq_first(&d->binding);
if (nfound != 1)
- lbuf_append(lbuf, "\n", NULL);
- lbuf_append(lbuf, " Defaults", dsep, NULL);
+ lbuf_append(lbuf, "\n");
+ lbuf_append(lbuf, " Defaults%s", dsep);
for (m = binding; m != NULL; m = m->next) {
if (m != binding)
- lbuf_append(lbuf, ",", NULL);
+ lbuf_append(lbuf, ",");
print_member(lbuf, m->name, m->type, m->negated, atype);
- lbuf_append(lbuf, " ", NULL);
+ lbuf_append(lbuf, " ");
}
} else
- lbuf_append(lbuf, ", ", NULL);
+ lbuf_append(lbuf, ", ");
if (d->val != NULL) {
- lbuf_append(lbuf, d->var, d->op == '+' ? "+=" :
- d->op == '-' ? "-=" : "=", d->val, NULL);
+ lbuf_append(lbuf, "%s%s%s", d->var, d->op == '+' ? "+=" :
+ d->op == '-' ? "-=" : "=", d->val);
} else
- lbuf_append(lbuf, d->op == FALSE ? "!" : "", d->var, NULL);
+ lbuf_append(lbuf, "%s%s", d->op == FALSE ? "!" : "", d->var);
}
return nfound;
switch (type) {
case ALL:
- lbuf_append(lbuf, negated ? "!ALL" : "ALL", NULL);
+ lbuf_append(lbuf, "%sALL", negated ? "!" : "");
break;
case COMMAND:
c = (struct sudo_command *) name;
if (negated)
- lbuf_append(lbuf, "!", NULL);
- lbuf_append_quoted(lbuf, SUDOERS_QUOTED, c->cmnd, NULL);
+ lbuf_append(lbuf, "!");
+ lbuf_append_quoted(lbuf, SUDOERS_QUOTED, "%s", c->cmnd);
if (c->args) {
- lbuf_append(lbuf, " ", NULL);
- lbuf_append_quoted(lbuf, SUDOERS_QUOTED, c->args, NULL);
+ lbuf_append(lbuf, " ");
+ lbuf_append_quoted(lbuf, SUDOERS_QUOTED, "%s", c->args);
}
break;
case ALIAS:
if ((a = alias_find(name, alias_type)) != NULL) {
tq_foreach_fwd(&a->members, m) {
if (m != tq_first(&a->members))
- lbuf_append(lbuf, ", ", NULL);
+ lbuf_append(lbuf, ", ");
_print_member(lbuf, m->name, m->type,
negated ? !m->negated : m->negated, alias_type);
}
}
/* FALLTHROUGH */
default:
- lbuf_append(lbuf, negated ? "!" : "", name, NULL);
+ lbuf_append(lbuf, "%s%s", negated ? "!" : "", name);
break;
}
}
lbuf_init(&privs, output, 4, NULL, sudo_user.cols);
/* Display defaults from all sources. */
- lbuf_append(&defs, _("Matching Defaults entries for "), pw->pw_name,
- _(" on this host:\n"), NULL);
+ lbuf_append(&defs, _("Matching Defaults entries for %s on this host:\n"),
+ pw->pw_name);
count = 0;
tq_foreach_fwd(snl, nss) {
count += nss->display_defaults(nss, pw, &defs);
}
if (count)
- lbuf_append(&defs, "\n\n", NULL);
+ lbuf_append(&defs, "\n\n");
else
defs.len = 0;
/* Display Runas and Cmnd-specific defaults from all sources. */
olen = defs.len;
- lbuf_append(&defs, _("Runas and Command-specific defaults for "),
- pw->pw_name, ":\n", NULL);
+ lbuf_append(&defs, _("Runas and Command-specific defaults for %s:\n"),
+ pw->pw_name);
count = 0;
tq_foreach_fwd(snl, nss) {
count += nss->display_bound_defaults(nss, pw, &defs);
}
if (count)
- lbuf_append(&defs, "\n\n", NULL);
+ lbuf_append(&defs, "\n\n");
else
defs.len = olen;
/* Display privileges from all sources. */
- lbuf_append(&privs, _("User "), pw->pw_name,
- _(" may run the following commands on this host:\n"), NULL);
+ lbuf_append(&privs,
+ _("User %s may run the following commands on this host:\n"),
+ pw->pw_name);
count = 0;
tq_foreach_fwd(snl, nss) {
count += nss->display_privs(nss, pw, &privs);
lbuf_init(&lbuf, fatal ? usage_err : usage_out, ulen, NULL,
user_details.ts_cols);
for (i = 0; uvec[i] != NULL; i++) {
- lbuf_append(&lbuf, "usage: ", getprogname(), uvec[i], NULL);
+ lbuf_append(&lbuf, "usage: %s%s", getprogname(), uvec[i]);
lbuf_print(&lbuf);
}
lbuf_destroy(&lbuf);
lbuf_init(&lbuf, usage_out, indent, NULL, user_details.ts_cols);
if (strcmp(pname, "sudoedit") == 0)
- lbuf_append(&lbuf, pname, _(" - edit files as another user\n\n"), NULL);
+ lbuf_append(&lbuf, _("%s - edit files as another user\n\n"), pname);
else
- lbuf_append(&lbuf, pname, _(" - execute a command as another user\n\n"), NULL);
+ lbuf_append(&lbuf, _("%s - execute a command as another user\n\n"), pname);
lbuf_print(&lbuf);
usage(0);
- lbuf_append(&lbuf, _("\nOptions:\n"), NULL);
+ lbuf_append(&lbuf, _("\nOptions:\n"));
#ifdef HAVE_BSD_AUTH_H
- lbuf_append(&lbuf,
- " -A ",
- _("use helper program for password prompting\n"), NULL);
+ lbuf_append(&lbuf, " -A %s",
+ _("use helper program for password prompting\n"));
#endif
- lbuf_append(&lbuf,
- " -a type ",
- _("use specified BSD authentication type\n"), NULL);
- lbuf_append(&lbuf,
- " -b ",
- _("run command in the background\n"), NULL);
- lbuf_append(&lbuf,
- " -C fd ",
- _("close all file descriptors >= fd\n"), NULL);
+ lbuf_append(&lbuf, " -a type %s",
+ _("use specified BSD authentication type\n"));
+ lbuf_append(&lbuf, " -b %s",
+ _("run command in the background\n"));
+ lbuf_append(&lbuf, " -C fd %s",
+ _("close all file descriptors >= fd\n"));
#ifdef HAVE_LOGIN_CAP_H
- lbuf_append(&lbuf,
- " -c class ",
- _("run command with specified login class\n"), NULL);
+ lbuf_append(&lbuf, " -c class %s",
+ _("run command with specified login class\n"));
#endif
- lbuf_append(&lbuf,
- " -E ",
- _("preserve user environment when executing command\n"), NULL);
- lbuf_append(&lbuf,
- " -e ",
- _("edit files instead of running a command\n"), NULL);
- lbuf_append(&lbuf,
- " -g group ",
- _("execute command as the specified group\n"), NULL);
- lbuf_append(&lbuf,
- " -H ",
- _("set HOME variable to target user's home dir.\n"), NULL);
- lbuf_append(&lbuf,
- " -h ",
- _("display help message and exit\n"), NULL);
- lbuf_append(&lbuf,
- " -i [command] ",
- _("run a login shell as target user\n"), NULL);
- lbuf_append(&lbuf,
- " -K ",
- _("remove timestamp file completely\n"), NULL);
- lbuf_append(&lbuf,
- " -k ",
- _("invalidate timestamp file\n"), NULL);
- lbuf_append(&lbuf,
- " -l[l] command ",
- _("list user's available commands\n"), NULL);
- lbuf_append(&lbuf,
- " -n ",
- _("non-interactive mode, will not prompt user\n"), NULL);
- lbuf_append(&lbuf,
- " -P ",
- _("preserve group vector instead of setting to target's\n"), NULL);
- lbuf_append(&lbuf,
- " -p prompt ",
- _("use specified password prompt\n"), NULL);
+ lbuf_append(&lbuf, " -E %s",
+ _("preserve user environment when executing command\n"));
+ lbuf_append(&lbuf, " -e %s",
+ _("edit files instead of running a command\n"));
+ lbuf_append(&lbuf, " -g group %s",
+ _("execute command as the specified group\n"));
+ lbuf_append(&lbuf, " -H %s",
+ _("set HOME variable to target user's home dir.\n"));
+ lbuf_append(&lbuf, " -h %s",
+ _("display help message and exit\n"));
+ lbuf_append(&lbuf, " -i [command] %s",
+ _("run a login shell as target user\n"));
+ lbuf_append(&lbuf, " -K %s",
+ _("remove timestamp file completely\n"));
+ lbuf_append(&lbuf, " -k %s",
+ _("invalidate timestamp file\n"));
+ lbuf_append(&lbuf, " -l[l] command %s",
+ _("list user's available commands\n"));
+ lbuf_append(&lbuf, " -n %s",
+ _("non-interactive mode, will not prompt user\n"));
+ lbuf_append(&lbuf, " -P %s",
+ _("preserve group vector instead of setting to target's\n"));
+ lbuf_append(&lbuf, " -p prompt %s",
+ _("use specified password prompt\n"));
#ifdef HAVE_SELINUX
- lbuf_append(&lbuf,
- " -r role ",
- _("create SELinux security context with specified role\n"), NULL);
+ lbuf_append(&lbuf, " -r role %s",
+ _("create SELinux security context with specified role\n"));
#endif
+ lbuf_append(&lbuf, " -S %s",
+ _("read password from standard input\n"));
lbuf_append(&lbuf,
- " -S ",
- _("read password from standard input\n"), NULL);
- lbuf_append(&lbuf,
- " -s [command] ",
- _("run a shell as target user\n"), NULL);
+ " -s [command] %s", _("run a shell as target user\n"));
#ifdef HAVE_SELINUX
- lbuf_append(&lbuf,
- " -t type ",
- _("create SELinux security context with specified role\n"), NULL);
+ lbuf_append(&lbuf, " -t type %s",
+ _("create SELinux security context with specified role\n"));
#endif
- lbuf_append(&lbuf,
- " -U user ",
- _("when listing, list specified user's privileges\n"), NULL);
- lbuf_append(&lbuf,
- " -u user ",
- _("run command (or edit file) as specified user\n"), NULL);
- lbuf_append(&lbuf,
- " -V ",
- _("display version information and exit\n"), NULL);
- lbuf_append(&lbuf,
- " -v ",
- _("update user's timestamp without running a command\n"), NULL);
- lbuf_append(&lbuf,
- " -- ",
- _("stop processing command line arguments\n"), NULL);
+ lbuf_append(&lbuf, " -U user %s",
+ _("when listing, list specified user's privileges\n"));
+ lbuf_append(&lbuf, " -u user %s",
+ _("run command (or edit file) as specified user\n"));
+ lbuf_append(&lbuf, " -V %s",
+ _("display version information and exit\n"));
+ lbuf_append(&lbuf, " -v %s",
+ _("update user's timestamp without running a command\n"));
+ lbuf_append(&lbuf, " -- %s",
+ _("stop processing command line arguments\n"));
lbuf_print(&lbuf);
lbuf_destroy(&lbuf);
exit(0);