Commit 839cc2a94cc3665bafe32203c2f095f4dd470a80
Committed by
Linus Torvalds
1 parent
57f4257eae
Exists in
master
and in
16 other branches
seq_file: introduce seq_setwidth() and seq_pad()
There are several users who want to know bytes written by seq_*() for alignment purpose. Currently they are using %n format for knowing it because seq_*() returns 0 on success. This patch introduces seq_setwidth() and seq_pad() for allowing them to align without using %n format. Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Signed-off-by: Kees Cook <keescook@chromium.org> Cc: Joe Perches <joe@perches.com> Cc: David Miller <davem@davemloft.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 2 changed files with 30 additions and 0 deletions Side-by-side Diff
fs/seq_file.c
... | ... | @@ -766,6 +766,21 @@ |
766 | 766 | } |
767 | 767 | EXPORT_SYMBOL(seq_write); |
768 | 768 | |
769 | +/** | |
770 | + * seq_pad - write padding spaces to buffer | |
771 | + * @m: seq_file identifying the buffer to which data should be written | |
772 | + * @c: the byte to append after padding if non-zero | |
773 | + */ | |
774 | +void seq_pad(struct seq_file *m, char c) | |
775 | +{ | |
776 | + int size = m->pad_until - m->count; | |
777 | + if (size > 0) | |
778 | + seq_printf(m, "%*s", size, ""); | |
779 | + if (c) | |
780 | + seq_putc(m, c); | |
781 | +} | |
782 | +EXPORT_SYMBOL(seq_pad); | |
783 | + | |
769 | 784 | struct list_head *seq_list_start(struct list_head *head, loff_t pos) |
770 | 785 | { |
771 | 786 | struct list_head *lh; |
include/linux/seq_file.h
... | ... | @@ -20,6 +20,7 @@ |
20 | 20 | size_t size; |
21 | 21 | size_t from; |
22 | 22 | size_t count; |
23 | + size_t pad_until; | |
23 | 24 | loff_t index; |
24 | 25 | loff_t read_pos; |
25 | 26 | u64 version; |
... | ... | @@ -78,6 +79,20 @@ |
78 | 79 | m->count += num; |
79 | 80 | } |
80 | 81 | } |
82 | + | |
83 | +/** | |
84 | + * seq_setwidth - set padding width | |
85 | + * @m: the seq_file handle | |
86 | + * @size: the max number of bytes to pad. | |
87 | + * | |
88 | + * Call seq_setwidth() for setting max width, then call seq_printf() etc. and | |
89 | + * finally call seq_pad() to pad the remaining bytes. | |
90 | + */ | |
91 | +static inline void seq_setwidth(struct seq_file *m, size_t size) | |
92 | +{ | |
93 | + m->pad_until = m->count + size; | |
94 | +} | |
95 | +void seq_pad(struct seq_file *m, char c); | |
81 | 96 | |
82 | 97 | char *mangle_path(char *s, const char *p, const char *esc); |
83 | 98 | int seq_open(struct file *, const struct seq_operations *); |