* Watch out when reusing it somewhere else
*/
#define AFTER_PACK_ORIGINAL_FD(API_ID, RTYPE, RVAL, SIZE, FD, APITYPE, INPUTFORMAT, ...) \
+do { \
POST_PACK_PROBEBLOCK_BEGIN(); \
_fstatret = fstat(FD, &_statbuf); \
if (stat_regular_or_socket_p(&_statbuf)) { \
PACK_COMMON_END(RTYPE, RVAL, newerrno, blockresult); \
POST_PACK_PROBEBLOCK_MIDDLE_FD(SIZE, FD, APITYPE); \
} \
- POST_PACK_PROBEBLOCK_END()
+ POST_PACK_PROBEBLOCK_END(); \
+} while(0)
+
+#define AFTER_PACK_ORIGINAL_FD_MIDDLE(API_ID, RTYPE, RVAL, SIZE, FD, APITYPE, INPUTFORMAT, ...) \
+do { \
+ POST_PACK_PROBEBLOCK_BEGIN(); \
+ _fstatret = fstat(FD, &_statbuf); \
+ if (stat_regular_or_socket_p(&_statbuf)) { \
+ PREPARE_LOCAL_BUF(); \
+ PACK_COMMON_BEGIN(MSG_PROBE_RESOURCE, API_ID, INPUTFORMAT, __VA_ARGS__); \
+ PACK_COMMON_END(RTYPE, RVAL, newerrno, blockresult); \
+ POST_PACK_PROBEBLOCK_MIDDLE_FD(SIZE, FD, APITYPE); \
+ } \
+ POST_PACK_PROBEBLOCK_ADD_END(); \
+} while(0)
#define AFTER_PACK_ORIGINAL_NOFD(API_ID, RTYPE, RVAL, SIZE, APITYPE, INPUTFORMAT, ...) \
+do { \
POST_PACK_PROBEBLOCK_BEGIN(); \
PREPARE_LOCAL_BUF(); \
PACK_COMMON_BEGIN(MSG_PROBE_RESOURCE, API_ID, INPUTFORMAT, __VA_ARGS__); \
PACK_COMMON_END(RTYPE, RVAL, newerrno, blockresult); \
POST_PACK_PROBEBLOCK_MIDDLE_NOFD(SIZE, APITYPE); \
- POST_PACK_PROBEBLOCK_END()
+ POST_PACK_PROBEBLOCK_END(); \
+} while(0)
#define AFTER_PACK_ORIGINAL_FILEP(API_ID, RTYPE, RVAL, SIZE, FILEP, APITYPE, INPUTFORMAT, ...) \
+do { \
POST_PACK_PROBEBLOCK_BEGIN(); \
GET_FD_FROM_FILEP(FILEP); \
if(_fd != -1) { \
PACK_COMMON_BEGIN(MSG_PROBE_RESOURCE, API_ID, INPUTFORMAT, __VA_ARGS__); \
PACK_COMMON_END(RTYPE, RVAL, newerrno, blockresult); \
POST_PACK_PROBEBLOCK_MIDDLE_FD(SIZE, _fd, APITYPE); \
- POST_PACK_PROBEBLOCK_END()
+ POST_PACK_PROBEBLOCK_END(); \
+} while(0)
/*!
* Macros {BEFORE,AFTER}_ORIGINAL_START_END_FD only used in {p,v,}{read,write}
PACK_RESOURCE(0, FD, APITYPE, _filesize, _filepath); \
FLUSH_LOCAL_BUF(); \
} \
- PRE_PROBEBLOCK_END();
-
+ PRE_PROBEBLOCK_END(); \
#define AFTER_ORIGINAL_START_END_FD(API_ID, RTYPE, RVAL, SIZE, FD, APITYPE, INPUTFORMAT, ...) \
+do { \
POST_PACK_PROBEBLOCK_BEGIN(); \
setProbePoint(&probeInfo); \
_fstatret = fstat(FD, &_statbuf); \
PACK_RESOURCE(SIZE, FD, APITYPE, _filesize, _filepath); \
FLUSH_LOCAL_BUF(); \
} \
- POST_PACK_PROBEBLOCK_END();
+ POST_PACK_PROBEBLOCK_END(); \
+} while(0)
PRE_PROBEBLOCK_END()
#define AFTER_ORIGINAL_START_END_NOFD(API_ID, RTYPE, RVAL, SIZE, APITYPE, INPUTFORMAT, ...) \
+do { \
POST_PACK_PROBEBLOCK_BEGIN(); \
setProbePoint(&probeInfo); \
PREPARE_LOCAL_BUF(); \
PACK_COMMON_BEGIN(MSG_PROBE_RESOURCE, API_ID, INPUTFORMAT, __VA_ARGS__); \
PACK_COMMON_END(RTYPE, RVAL, newerrno, blockresult); \
POST_PACK_PROBEBLOCK_MIDDLE_NOFD(SIZE, APITYPE); \
- POST_PACK_PROBEBLOCK_END()
+ POST_PACK_PROBEBLOCK_END(); \
+} while(0)
#define AFTER_ORIGINAL_START_END_FILEP(API_ID, RTYPE, RVAL, SIZE, FILEP, APITYPE, INPUTFORMAT, ...) \
+do { \
POST_PACK_PROBEBLOCK_BEGIN(); \
setProbePoint(&probeInfo); \
GET_FD_FROM_FILEP(FILEP); \
PACK_COMMON_BEGIN(MSG_PROBE_RESOURCE, API_ID, INPUTFORMAT, __VA_ARGS__); \
PACK_COMMON_END(RTYPE, RVAL, newerrno, blockresult); \
POST_PACK_PROBEBLOCK_MIDDLE_FD(SIZE, _fd, APITYPE); \
- POST_PACK_PROBEBLOCK_END()
+ POST_PACK_PROBEBLOCK_END(); \
+} while(0)
static inline ssize_t get_fd_filesize(int fd)
// *****************************************************************
// File Attributes APIs
// *****************************************************************
-
int fcntl(int fd, int cmd, ...)
{
static int (*fcntlp)(int fd, int cmd, ...);
int arg = 0, api_type = FD_API_OTHER;
+ int64_t start = 0;
+ int64_t len = 0;
+ int type = 0;
+ int whence = 0;
BEFORE_ORIGINAL_FILE(fcntl, LIBC);
arg = va_arg(argl, int);
va_end(argl);
- ret = fcntlp(fd, cmd, arg);
-
if (cmd == F_SETLK || cmd == F_SETLKW) {
struct flock *flock = (struct flock *)arg;
- int type = flock->l_type;
- int whence = flock->l_whence;
- int64_t /*off_t*/ start = flock->l_start;
- int64_t /*off_t*/ len = flock->l_len;
+ type = flock->l_type;
+ whence = flock->l_whence;
+ start = flock->l_start;
+ len = flock->l_len;
switch (type) {
case F_RDLCK:
api_type = FD_API_LOCK_START;
break;
case F_UNLCK:
- api_type = FD_API_LOCK_END;
+ api_type = FD_API_LOCK_RELEASE;
break;
}
+ }
+ /* before lock event */
+ if (api_type == FD_API_LOCK_START)
+ AFTER_PACK_ORIGINAL_FD_MIDDLE(API_ID_fcntl,
+ 'd', ret, 0, fd, api_type,
+ "ddddxx", fd, cmd, type,
+ whence, start, len);
+
+ /* call original lock function */
+ ret = fcntlp(fd, cmd, arg);
+
+ /* after lock event */
+ if (api_type != FD_API_OTHER) {
+ if (api_type == FD_API_LOCK_START)
+ api_type = FD_API_LOCK_END;
+ /* pack FD_API_LOCK_END or FD_API_UNLOCK events */
AFTER_PACK_ORIGINAL_FD(API_ID_fcntl,
'd', ret, 0, fd, api_type,
"ddddxx", fd, cmd, type,
whence, start, len);
} else {
+ /* pack FD_API_OTHER */
AFTER_PACK_ORIGINAL_FD(API_ID_fcntl,
'd', ret, 0, fd, api_type,
"ddd", fd, cmd, arg);