Blame view

include/linux/seq_buf.h 3.16 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  #ifndef _LINUX_SEQ_BUF_H
  #define _LINUX_SEQ_BUF_H
  
  #include <linux/fs.h>
  
  /*
   * Trace sequences are used to allow a function to call several other functions
   * to create a string of data to use.
   */
  
  /**
   * seq_buf - seq buffer structure
   * @buffer:	pointer to the buffer
   * @size:	size of the buffer
   * @len:	the amount of data inside the buffer
   * @readpos:	The next position to read in the buffer.
   */
  struct seq_buf {
9a7777935   Steven Rostedt (Red Hat)   tracing: Convert ...
20
21
22
23
  	char			*buffer;
  	size_t			size;
  	size_t			len;
  	loff_t			readpos;
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
24
  };
0736c033a   Steven Rostedt (Red Hat)   tracing: Add a se...
25
26
27
28
29
  static inline void seq_buf_clear(struct seq_buf *s)
  {
  	s->len = 0;
  	s->readpos = 0;
  }
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
30
31
32
33
34
  static inline void
  seq_buf_init(struct seq_buf *s, unsigned char *buf, unsigned int size)
  {
  	s->buffer = buf;
  	s->size = size;
0736c033a   Steven Rostedt (Red Hat)   tracing: Add a se...
35
  	seq_buf_clear(s);
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
36
37
38
39
40
41
42
43
44
  }
  
  /*
   * seq_buf have a buffer that might overflow. When this happens
   * the len and size are set to be equal.
   */
  static inline bool
  seq_buf_has_overflowed(struct seq_buf *s)
  {
8cd709ae7   Steven Rostedt (Red Hat)   tracing: Have seq...
45
  	return s->len > s->size;
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
46
47
48
49
50
  }
  
  static inline void
  seq_buf_set_overflow(struct seq_buf *s)
  {
8cd709ae7   Steven Rostedt (Red Hat)   tracing: Have seq...
51
  	s->len = s->size + 1;
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
52
53
54
55
56
57
58
59
60
61
  }
  
  /*
   * How much buffer is left on the seq_buf?
   */
  static inline unsigned int
  seq_buf_buffer_left(struct seq_buf *s)
  {
  	if (seq_buf_has_overflowed(s))
  		return 0;
8cd709ae7   Steven Rostedt (Red Hat)   tracing: Have seq...
62
  	return s->size - s->len;
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
63
  }
eeab98154   Steven Rostedt (Red Hat)   seq_buf: Create s...
64
65
66
67
68
  /* How much buffer was written? */
  static inline unsigned int seq_buf_used(struct seq_buf *s)
  {
  	return min(s->len, s->size);
  }
01cb06a4c   Steven Rostedt (Red Hat)   tracing: Add seq_...
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
  /**
   * seq_buf_get_buf - get buffer to write arbitrary data to
   * @s: the seq_buf handle
   * @bufp: the beginning of the buffer is stored here
   *
   * Return the number of bytes available in the buffer, or zero if
   * there's no space.
   */
  static inline size_t seq_buf_get_buf(struct seq_buf *s, char **bufp)
  {
  	WARN_ON(s->len > s->size + 1);
  
  	if (s->len < s->size) {
  		*bufp = s->buffer + s->len;
  		return s->size - s->len;
  	}
  
  	*bufp = NULL;
  	return 0;
  }
  
  /**
   * seq_buf_commit - commit data to the buffer
   * @s: the seq_buf handle
   * @num: the number of bytes to commit
   *
   * Commit @num bytes of data written to a buffer previously acquired
   * by seq_buf_get.  To signal an error condition, or that the data
   * didn't fit in the available space, pass a negative @num value.
   */
  static inline void seq_buf_commit(struct seq_buf *s, int num)
  {
  	if (num < 0) {
  		seq_buf_set_overflow(s);
  	} else {
  		/* num must be negative on overflow */
  		BUG_ON(s->len + num > s->size);
  		s->len += num;
  	}
  }
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
109
110
111
112
  extern __printf(2, 3)
  int seq_buf_printf(struct seq_buf *s, const char *fmt, ...);
  extern __printf(2, 0)
  int seq_buf_vprintf(struct seq_buf *s, const char *fmt, va_list args);
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
113
114
115
116
117
118
119
120
  extern int seq_buf_print_seq(struct seq_file *m, struct seq_buf *s);
  extern int seq_buf_to_user(struct seq_buf *s, char __user *ubuf,
  			   int cnt);
  extern int seq_buf_puts(struct seq_buf *s, const char *str);
  extern int seq_buf_putc(struct seq_buf *s, unsigned char c);
  extern int seq_buf_putmem(struct seq_buf *s, const void *mem, unsigned int len);
  extern int seq_buf_putmem_hex(struct seq_buf *s, const void *mem,
  			      unsigned int len);
dd23180aa   Steven Rostedt (Red Hat)   tracing: Convert ...
121
  extern int seq_buf_path(struct seq_buf *s, const struct path *path, const char *esc);
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
122

2448913ed   Steven Rostedt (Red Hat)   seq-buf: Make seq...
123
124
125
126
  #ifdef CONFIG_BINARY_PRINTF
  extern int
  seq_buf_bprintf(struct seq_buf *s, const char *fmt, const u32 *binary);
  #endif
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
127
  #endif /* _LINUX_SEQ_BUF_H */