4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
\r
8 * Jaewon Lim <jaewon81.lim@samsung.com>
\r
9 * Woojin Jung <woojin2.jung@samsung.com>
\r
10 * Juyoung Kim <j0.kim@samsung.com>
\r
12 * This library is free software; you can redistribute it and/or modify it under
\r
13 * the terms of the GNU Lesser General Public License as published by the
\r
14 * Free Software Foundation; either version 2.1 of the License, or (at your option)
\r
15 * any later version.
\r
17 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
\r
18 * WARRANTY; without even the implied warranty of MERCHANTABILITY or
\r
19 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
\r
20 * License for more details.
\r
22 * You should have received a copy of the GNU Lesser General Public License
\r
23 * along with this library; if not, write to the Free Software Foundation, Inc., 51
\r
24 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
\r
35 #include <sys/types.h>
\r
36 #include <sys/stat.h>
\r
39 #include "daprobe.h"
\r
41 /********************************************************************
\r
42 * RESOURCE PROBE MACRO
\r
45 * SeqNumber`,ApiName`,Time`,Pid`,Tid`,InputParm`,Return`,PCAddr`,Error`,
\r
46 * Size`,FDValue`,FDType`,FDApiType`,\n
\r
47 * callstack_start`,callstack`,callstack_end
\r
50 * FD_TYPE_FILE, FD_TYPE_SOCKET
\r
53 * FD_API_TYPE_OPEN, FD_API_TYPE_CLOSE, FD_API_TYPE_READ, FD_API_TYPE_WRITE,
\r
54 * FD_API_TYPE_DIRECTORY, FD_API_TYPE_PERMISSION, FD_API_TYPE_OTHER,
\r
55 * FD_API_TYPE_SEND, FD_API_TYPE_RECEIVE, FD_API_TYPE_OPTION, FD_API_TYPE_MANAGE
\r
57 ************************************************************************/
\r
59 // ===================================================================
\r
60 // macro for file probe
\r
61 // ===================================================================
\r
63 #define GET_FD_FROM_FILEP(FILEP) \
\r
64 _fd = (FILEP != NULL) ? fileno(FILEP) : -1
\r
66 #define DECLARE_VARIABLE_FD \
\r
67 DECLARE_VARIABLE_STANDARD; \
\r
68 char* _filepath = ""; \
\r
69 int __attribute((unused)) _fd; \
\r
70 int __attribute((unused)) _fstatret = -1; \
\r
71 struct stat __attribute((unused)) _statbuf
\r
73 // =================================================================
\r
74 // POST_PROBEBLOCK_MIDDLE for file
\r
75 // =================================================================
\r
77 #define POST_PROBEBLOCK_MIDDLE_FD(SIZE, FD, APITYPE) \
\r
78 log.length += sprintf(log.data + log.length, "`,%u`,%d`,%d`,%d`,%ld`,%s", \
\r
79 SIZE, FD, FD_FILE, APITYPE, (_fstatret == 0 ? _statbuf.st_size : 0), _filepath)
\r
81 #define POST_PROBEBLOCK_MIDDLE_NOFD(SIZE, APITYPE) \
\r
82 log.length += sprintf(log.data + log.length, "`,%u`,`,%d`,%d`,0`,%s", \
\r
83 SIZE, FD_FILE, APITYPE, _filepath)
\r
85 #define POST_PROBEBLOCK_CALLSTACK_RESOURCE(APITYPE) \
\r
87 if(APITYPE == FD_API_OPEN) { \
\r
88 APPEND_LOG_CALLSTACK(); \
\r
89 } else if(unlikely(newerrno != 0 || blockresult == 2)) { \
\r
90 APPEND_LOG_CALLSTACK(); \
\r
92 APPEND_LOG_NULL_CALLSTACK(); \
\r
96 // ==================================================================
\r
97 // BEFORE_ORIGINAL macro for file
\r
98 // ==================================================================
\r
100 #define BEFORE_ORIGINAL_FILE(FUNCNAME, LIBNAME) \
\r
101 DECLARE_VARIABLE_FD; \
\r
102 GET_REAL_FUNC(FUNCNAME, LIBNAME); \
\r
105 #define BEFORE_ORIGINAL_FILE_NOFILTER(FUNCNAME, LIBNAME) \
\r
106 DECLARE_VARIABLE_FD; \
\r
107 GET_REAL_FUNC(FUNCNAME, LIBNAME); \
\r
108 bfiltering = false; \
\r
111 // ==================================================================
\r
112 // AFTER_ORIGINAL macro for file
\r
113 // ==================================================================
\r
115 #define AFTER_ORIGINAL_FD_RET(RTYPE, RVAL, SIZE, FD, APITYPE, INPUTFORMAT, ...) \
\r
116 POST_PROBEBLOCK_BEGIN(LC_RESOURCE, RTYPE, RVAL, INPUTFORMAT, __VA_ARGS__); \
\r
117 _fstatret = fstat(FD, &_statbuf); \
\r
118 POST_PROBEBLOCK_MIDDLE_FD(SIZE, FD, APITYPE); \
\r
119 POST_PROBEBLOCK_CALLSTACK_RESOURCE(APITYPE); \
\r
120 POST_PROBEBLOCK_END()
\r
122 #define AFTER_ORIGINAL_NOFD_RET(RTYPE, RVAL, SIZE, APITYPE, INPUTFORMAT, ...) \
\r
123 POST_PROBEBLOCK_BEGIN(LC_RESOURCE, RTYPE, RVAL, INPUTFORMAT, __VA_ARGS__); \
\r
124 POST_PROBEBLOCK_MIDDLE_NOFD(SIZE, APITYPE); \
\r
125 POST_PROBEBLOCK_CALLSTACK_RESOURCE(APITYPE); \
\r
126 POST_PROBEBLOCK_END()
\r
128 #define AFTER_ORIGINAL_FILEP_RET(RTYPE, RVAL, SIZE, FILEP, APITYPE, INPUTFORMAT, ...) \
\r
129 POST_PROBEBLOCK_BEGIN(LC_RESOURCE, RTYPE, RVAL, INPUTFORMAT, __VA_ARGS__); \
\r
130 GET_FD_FROM_FILEP(FILEP); \
\r
132 _fstatret = fstat(_fd, &_statbuf); \
\r
134 if(_fstatret != 0) PRINTMSG("ERROR : fstat error\n"); \
\r
135 POST_PROBEBLOCK_MIDDLE_FD(SIZE, _fd, APITYPE); \
\r
136 POST_PROBEBLOCK_CALLSTACK_RESOURCE(APITYPE); \
\r
137 POST_PROBEBLOCK_END()
\r
140 #define AFTER_ORIGINAL_FD(SIZE, FD, APITYPE, INPUTFORMAT, ...) \
\r
141 AFTER_ORIGINAL_FD_RET(VT_INT, ret, SIZE, FD, APITYPE, INPUTFORMAT, __VA_ARGS__)
\r
143 #define AFTER_ORIGINAL_NOFD(SIZE, APITYPE, INPUTFORMAT, ...) \
\r
144 AFTER_ORIGINAL_NOFD_RET(VT_INT, ret, SIZE, APITYPE, INPUTFORMAT, __VA_ARGS__)
\r
146 #define AFTER_ORIGINAL_FILEP(SIZE, FILEP, APITYPE, INPUTFORMAT, ...) \
\r
147 AFTER_ORIGINAL_FILEP_RET(VT_INT, ret, SIZE, FILEP, APITYPE, INPUTFORMAT, __VA_ARGS__)
\r
149 #endif // __DA_IO_H__
\r