diff options
Diffstat (limited to 'include/linux/seq_buf.h')
-rw-r--r-- | include/linux/seq_buf.h | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/include/linux/seq_buf.h b/include/linux/seq_buf.h new file mode 100644 index 000000000000..4f7a96a9d71a --- /dev/null +++ b/include/linux/seq_buf.h | |||
@@ -0,0 +1,81 @@ | |||
1 | #ifndef _LINUX_SEQ_BUF_H | ||
2 | #define _LINUX_SEQ_BUF_H | ||
3 | |||
4 | #include <linux/fs.h> | ||
5 | |||
6 | /* | ||
7 | * Trace sequences are used to allow a function to call several other functions | ||
8 | * to create a string of data to use. | ||
9 | */ | ||
10 | |||
11 | /** | ||
12 | * seq_buf - seq buffer structure | ||
13 | * @buffer: pointer to the buffer | ||
14 | * @size: size of the buffer | ||
15 | * @len: the amount of data inside the buffer | ||
16 | * @readpos: The next position to read in the buffer. | ||
17 | */ | ||
18 | struct seq_buf { | ||
19 | unsigned char *buffer; | ||
20 | unsigned int size; | ||
21 | unsigned int len; | ||
22 | unsigned int readpos; | ||
23 | }; | ||
24 | |||
25 | static inline void | ||
26 | seq_buf_init(struct seq_buf *s, unsigned char *buf, unsigned int size) | ||
27 | { | ||
28 | s->buffer = buf; | ||
29 | s->size = size; | ||
30 | s->len = 0; | ||
31 | s->readpos = 0; | ||
32 | } | ||
33 | |||
34 | /* | ||
35 | * seq_buf have a buffer that might overflow. When this happens | ||
36 | * the len and size are set to be equal. | ||
37 | */ | ||
38 | static inline bool | ||
39 | seq_buf_has_overflowed(struct seq_buf *s) | ||
40 | { | ||
41 | return s->len == s->size; | ||
42 | } | ||
43 | |||
44 | static inline void | ||
45 | seq_buf_set_overflow(struct seq_buf *s) | ||
46 | { | ||
47 | s->len = s->size; | ||
48 | } | ||
49 | |||
50 | /* | ||
51 | * How much buffer is left on the seq_buf? | ||
52 | */ | ||
53 | static inline unsigned int | ||
54 | seq_buf_buffer_left(struct seq_buf *s) | ||
55 | { | ||
56 | if (seq_buf_has_overflowed(s)) | ||
57 | return 0; | ||
58 | |||
59 | return (s->size - 1) - s->len; | ||
60 | } | ||
61 | |||
62 | extern __printf(2, 3) | ||
63 | int seq_buf_printf(struct seq_buf *s, const char *fmt, ...); | ||
64 | extern __printf(2, 0) | ||
65 | int seq_buf_vprintf(struct seq_buf *s, const char *fmt, va_list args); | ||
66 | extern int | ||
67 | seq_buf_bprintf(struct seq_buf *s, const char *fmt, const u32 *binary); | ||
68 | extern int seq_buf_print_seq(struct seq_file *m, struct seq_buf *s); | ||
69 | extern int seq_buf_to_user(struct seq_buf *s, char __user *ubuf, | ||
70 | int cnt); | ||
71 | extern int seq_buf_puts(struct seq_buf *s, const char *str); | ||
72 | extern int seq_buf_putc(struct seq_buf *s, unsigned char c); | ||
73 | extern int seq_buf_putmem(struct seq_buf *s, const void *mem, unsigned int len); | ||
74 | extern int seq_buf_putmem_hex(struct seq_buf *s, const void *mem, | ||
75 | unsigned int len); | ||
76 | extern int seq_buf_path(struct seq_buf *s, const struct path *path); | ||
77 | |||
78 | extern int seq_buf_bitmask(struct seq_buf *s, const unsigned long *maskp, | ||
79 | int nmaskbits); | ||
80 | |||
81 | #endif /* _LINUX_SEQ_BUF_H */ | ||