xref: /linux-6.15/include/linux/seq_buf.h (revision 8cd709ae)
13a161d99SSteven Rostedt (Red Hat) #ifndef _LINUX_SEQ_BUF_H
23a161d99SSteven Rostedt (Red Hat) #define _LINUX_SEQ_BUF_H
33a161d99SSteven Rostedt (Red Hat) 
43a161d99SSteven Rostedt (Red Hat) #include <linux/fs.h>
53a161d99SSteven Rostedt (Red Hat) 
63a161d99SSteven Rostedt (Red Hat) /*
73a161d99SSteven Rostedt (Red Hat)  * Trace sequences are used to allow a function to call several other functions
83a161d99SSteven Rostedt (Red Hat)  * to create a string of data to use.
93a161d99SSteven Rostedt (Red Hat)  */
103a161d99SSteven Rostedt (Red Hat) 
113a161d99SSteven Rostedt (Red Hat) /**
123a161d99SSteven Rostedt (Red Hat)  * seq_buf - seq buffer structure
133a161d99SSteven Rostedt (Red Hat)  * @buffer:	pointer to the buffer
143a161d99SSteven Rostedt (Red Hat)  * @size:	size of the buffer
153a161d99SSteven Rostedt (Red Hat)  * @len:	the amount of data inside the buffer
163a161d99SSteven Rostedt (Red Hat)  * @readpos:	The next position to read in the buffer.
173a161d99SSteven Rostedt (Red Hat)  */
183a161d99SSteven Rostedt (Red Hat) struct seq_buf {
199a777793SSteven Rostedt (Red Hat) 	char			*buffer;
209a777793SSteven Rostedt (Red Hat) 	size_t			size;
219a777793SSteven Rostedt (Red Hat) 	size_t			len;
229a777793SSteven Rostedt (Red Hat) 	loff_t			readpos;
233a161d99SSteven Rostedt (Red Hat) };
243a161d99SSteven Rostedt (Red Hat) 
250736c033SSteven Rostedt (Red Hat) static inline void seq_buf_clear(struct seq_buf *s)
260736c033SSteven Rostedt (Red Hat) {
270736c033SSteven Rostedt (Red Hat) 	s->len = 0;
280736c033SSteven Rostedt (Red Hat) 	s->readpos = 0;
290736c033SSteven Rostedt (Red Hat) }
300736c033SSteven Rostedt (Red Hat) 
313a161d99SSteven Rostedt (Red Hat) static inline void
323a161d99SSteven Rostedt (Red Hat) seq_buf_init(struct seq_buf *s, unsigned char *buf, unsigned int size)
333a161d99SSteven Rostedt (Red Hat) {
343a161d99SSteven Rostedt (Red Hat) 	s->buffer = buf;
353a161d99SSteven Rostedt (Red Hat) 	s->size = size;
360736c033SSteven Rostedt (Red Hat) 	seq_buf_clear(s);
373a161d99SSteven Rostedt (Red Hat) }
383a161d99SSteven Rostedt (Red Hat) 
393a161d99SSteven Rostedt (Red Hat) /*
403a161d99SSteven Rostedt (Red Hat)  * seq_buf have a buffer that might overflow. When this happens
413a161d99SSteven Rostedt (Red Hat)  * the len and size are set to be equal.
423a161d99SSteven Rostedt (Red Hat)  */
433a161d99SSteven Rostedt (Red Hat) static inline bool
443a161d99SSteven Rostedt (Red Hat) seq_buf_has_overflowed(struct seq_buf *s)
453a161d99SSteven Rostedt (Red Hat) {
46*8cd709aeSSteven Rostedt (Red Hat) 	return s->len > s->size;
473a161d99SSteven Rostedt (Red Hat) }
483a161d99SSteven Rostedt (Red Hat) 
493a161d99SSteven Rostedt (Red Hat) static inline void
503a161d99SSteven Rostedt (Red Hat) seq_buf_set_overflow(struct seq_buf *s)
513a161d99SSteven Rostedt (Red Hat) {
52*8cd709aeSSteven Rostedt (Red Hat) 	s->len = s->size + 1;
533a161d99SSteven Rostedt (Red Hat) }
543a161d99SSteven Rostedt (Red Hat) 
553a161d99SSteven Rostedt (Red Hat) /*
563a161d99SSteven Rostedt (Red Hat)  * How much buffer is left on the seq_buf?
573a161d99SSteven Rostedt (Red Hat)  */
583a161d99SSteven Rostedt (Red Hat) static inline unsigned int
593a161d99SSteven Rostedt (Red Hat) seq_buf_buffer_left(struct seq_buf *s)
603a161d99SSteven Rostedt (Red Hat) {
613a161d99SSteven Rostedt (Red Hat) 	if (seq_buf_has_overflowed(s))
623a161d99SSteven Rostedt (Red Hat) 		return 0;
633a161d99SSteven Rostedt (Red Hat) 
64*8cd709aeSSteven Rostedt (Red Hat) 	return s->size - s->len;
653a161d99SSteven Rostedt (Red Hat) }
663a161d99SSteven Rostedt (Red Hat) 
67eeab9815SSteven Rostedt (Red Hat) /* How much buffer was written? */
68eeab9815SSteven Rostedt (Red Hat) static inline unsigned int seq_buf_used(struct seq_buf *s)
69eeab9815SSteven Rostedt (Red Hat) {
70eeab9815SSteven Rostedt (Red Hat) 	return min(s->len, s->size);
71eeab9815SSteven Rostedt (Red Hat) }
72eeab9815SSteven Rostedt (Red Hat) 
733a161d99SSteven Rostedt (Red Hat) extern __printf(2, 3)
743a161d99SSteven Rostedt (Red Hat) int seq_buf_printf(struct seq_buf *s, const char *fmt, ...);
753a161d99SSteven Rostedt (Red Hat) extern __printf(2, 0)
763a161d99SSteven Rostedt (Red Hat) int seq_buf_vprintf(struct seq_buf *s, const char *fmt, va_list args);
773a161d99SSteven Rostedt (Red Hat) extern int
783a161d99SSteven Rostedt (Red Hat) seq_buf_bprintf(struct seq_buf *s, const char *fmt, const u32 *binary);
793a161d99SSteven Rostedt (Red Hat) extern int seq_buf_print_seq(struct seq_file *m, struct seq_buf *s);
803a161d99SSteven Rostedt (Red Hat) extern int seq_buf_to_user(struct seq_buf *s, char __user *ubuf,
813a161d99SSteven Rostedt (Red Hat) 			   int cnt);
823a161d99SSteven Rostedt (Red Hat) extern int seq_buf_puts(struct seq_buf *s, const char *str);
833a161d99SSteven Rostedt (Red Hat) extern int seq_buf_putc(struct seq_buf *s, unsigned char c);
843a161d99SSteven Rostedt (Red Hat) extern int seq_buf_putmem(struct seq_buf *s, const void *mem, unsigned int len);
853a161d99SSteven Rostedt (Red Hat) extern int seq_buf_putmem_hex(struct seq_buf *s, const void *mem,
863a161d99SSteven Rostedt (Red Hat) 			      unsigned int len);
87dd23180aSSteven Rostedt (Red Hat) extern int seq_buf_path(struct seq_buf *s, const struct path *path, const char *esc);
883a161d99SSteven Rostedt (Red Hat) 
893a161d99SSteven Rostedt (Red Hat) extern int seq_buf_bitmask(struct seq_buf *s, const unsigned long *maskp,
903a161d99SSteven Rostedt (Red Hat) 			   int nmaskbits);
913a161d99SSteven Rostedt (Red Hat) 
923a161d99SSteven Rostedt (Red Hat) #endif /* _LINUX_SEQ_BUF_H */
93