xref: /aosp_15_r20/external/trace-cmd/lib/trace-cmd/include/trace-write-local.h (revision 58e6ee5f017f6a8912852c892d18457e4bafb554)
1*58e6ee5fSAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1 */
2*58e6ee5fSAndroid Build Coastguard Worker /*
3*58e6ee5fSAndroid Build Coastguard Worker  * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <[email protected]>
4*58e6ee5fSAndroid Build Coastguard Worker  *
5*58e6ee5fSAndroid Build Coastguard Worker  */
6*58e6ee5fSAndroid Build Coastguard Worker #ifndef _TRACE_WRITE_LOCAL_H
7*58e6ee5fSAndroid Build Coastguard Worker #define _TRACE_WRITE_LOCAL_H
8*58e6ee5fSAndroid Build Coastguard Worker 
9*58e6ee5fSAndroid Build Coastguard Worker /* Local for trace-input.c, trace-output.c and trace-msg.c */
10*58e6ee5fSAndroid Build Coastguard Worker 
__do_write(int fd,const void * data,size_t size)11*58e6ee5fSAndroid Build Coastguard Worker static inline ssize_t __do_write(int fd, const void *data, size_t size)
12*58e6ee5fSAndroid Build Coastguard Worker {
13*58e6ee5fSAndroid Build Coastguard Worker 	ssize_t tot = 0;
14*58e6ee5fSAndroid Build Coastguard Worker 	ssize_t w;
15*58e6ee5fSAndroid Build Coastguard Worker 
16*58e6ee5fSAndroid Build Coastguard Worker 	do {
17*58e6ee5fSAndroid Build Coastguard Worker 		w = write(fd, data + tot, size - tot);
18*58e6ee5fSAndroid Build Coastguard Worker 		tot += w;
19*58e6ee5fSAndroid Build Coastguard Worker 
20*58e6ee5fSAndroid Build Coastguard Worker 		if (!w)
21*58e6ee5fSAndroid Build Coastguard Worker 			break;
22*58e6ee5fSAndroid Build Coastguard Worker 		if (w < 0)
23*58e6ee5fSAndroid Build Coastguard Worker 			return w;
24*58e6ee5fSAndroid Build Coastguard Worker 	} while (tot != size);
25*58e6ee5fSAndroid Build Coastguard Worker 
26*58e6ee5fSAndroid Build Coastguard Worker 	return tot;
27*58e6ee5fSAndroid Build Coastguard Worker }
28*58e6ee5fSAndroid Build Coastguard Worker 
29*58e6ee5fSAndroid Build Coastguard Worker static inline ssize_t
__do_write_check(int fd,const void * data,size_t size)30*58e6ee5fSAndroid Build Coastguard Worker __do_write_check(int fd, const void *data, size_t size)
31*58e6ee5fSAndroid Build Coastguard Worker {
32*58e6ee5fSAndroid Build Coastguard Worker 	ssize_t ret;
33*58e6ee5fSAndroid Build Coastguard Worker 
34*58e6ee5fSAndroid Build Coastguard Worker 	ret = __do_write(fd, data, size);
35*58e6ee5fSAndroid Build Coastguard Worker 	if (ret < 0)
36*58e6ee5fSAndroid Build Coastguard Worker 		return ret;
37*58e6ee5fSAndroid Build Coastguard Worker 	if (ret != size)
38*58e6ee5fSAndroid Build Coastguard Worker 		return -1;
39*58e6ee5fSAndroid Build Coastguard Worker 
40*58e6ee5fSAndroid Build Coastguard Worker 	return 0;
41*58e6ee5fSAndroid Build Coastguard Worker }
42*58e6ee5fSAndroid Build Coastguard Worker 
43*58e6ee5fSAndroid Build Coastguard Worker #endif /* _TRACE_WRITE_LOCAL_H */
44