sudo_lbuf_println(struct sudo_lbuf *lbuf, char *line, int len)
{
char *cp, save;
- int i, have, contlen;
+ int i, have, contlen = 0;
+ int indent = lbuf->indent;
+ bool is_comment = false;
debug_decl(sudo_lbuf_println, SUDO_DEBUG_UTIL)
- contlen = lbuf->continuation ? strlen(lbuf->continuation) : 0;
+ /* Comment lines don't use continuation and only indent is for "# " */
+ if (line[0] == '#' && isblank((unsigned char)line[1])) {
+ is_comment = true;
+ indent = 2;
+ }
+ if (lbuf->continuation != NULL && !is_comment)
+ contlen = strlen(lbuf->continuation);
/*
* Print the buffer, splitting the line as needed on a word
need = (int)(ep - cp);
}
if (cp != line) {
- /* indent continued lines */
- /* XXX - build up string instead? */
- for (i = 0; i < lbuf->indent; i++)
- lbuf->output(" ");
+ if (is_comment) {
+ lbuf->output("# ");
+ } else {
+ /* indent continued lines */
+ /* XXX - build up string instead? */
+ for (i = 0; i < indent; i++)
+ lbuf->output(" ");
+ }
}
/* NUL-terminate cp for the output function and restore afterwards */
save = cp[need];
* the whitespace, and print a line continuaton char if needed.
*/
if (cp != NULL) {
- have = lbuf->cols - lbuf->indent;
+ have = lbuf->cols - indent;
ep = line + len;
while (cp < ep && isblank((unsigned char)*cp)) {
cp++;
}
}
- /* Print User_Specs */
- if (!sudoers_format_userspecs(&lbuf, &userspecs, conf->expand_aliases, true))
+ /* Print User_Specs, separated by blank lines. */
+ if (!sudoers_format_userspecs(&lbuf, &userspecs, "\n", conf->expand_aliases, true))
goto done;
if (lbuf.len > 1) {
sudo_lbuf_print(&lbuf);
*/
bool
sudoers_format_userspecs(struct sudo_lbuf *lbuf, struct userspec_list *usl,
- bool expand_aliases, bool flush)
+ const char *sep, bool expand_aliases, bool flush)
{
struct userspec *us;
debug_decl(sudoers_format_userspecs, SUDOERS_DEBUG_UTIL)
TAILQ_FOREACH(us, usl, entries) {
if (!sudoers_format_userspec(lbuf, us, expand_aliases))
break;
+ sudo_lbuf_append(lbuf, sep);
sudo_lbuf_print(lbuf);
}
bool sudoers_format_member(struct sudo_lbuf *lbuf, struct member *m, const char *separator, int alias_type);
bool sudoers_format_privilege(struct sudo_lbuf *lbuf, struct privilege *priv, bool expand_aliases);
bool sudoers_format_userspec(struct sudo_lbuf *lbuf, struct userspec *us, bool expand_aliases);
-bool sudoers_format_userspecs(struct sudo_lbuf *lbuf, struct userspec_list *usl, bool expand_aliases, bool flush);
+bool sudoers_format_userspecs(struct sudo_lbuf *lbuf, struct userspec_list *usl, const char *sep, bool expand_aliases, bool flush);
#endif /* SUDOERS_PARSE_H */