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