/* SPDX-License-Identifier: GPL-2.0-or-later * Copyright (c) 2010-2024 Linux Test Project * Copyright (c) 2011-2015 Cyril Hrubis */ #ifndef TST_SAFE_MACROS_INLINE_H__ #define TST_SAFE_MACROS_INLINE_H__ /* * Following functions are inline because the behaviour may depend on * -D_FILE_OFFSET_BITS=64 compile flag (type off_t or structures containing * off_t fields), see man off_t(3type). * * Do not add other functions here. */ static inline int safe_ftruncate(const char *file, const int lineno, int fd, off_t length) { int rval; rval = ftruncate(fd, length); if (rval == -1) { tst_brk_(file, lineno, TBROK | TERRNO, "ftruncate(%d,%ld) failed", fd, (long)length); } else if (rval) { tst_brk_(file, lineno, TBROK | TERRNO, "Invalid ftruncate(%d,%ld) return value %d", fd, (long)length, rval); } return rval; } #define SAFE_FTRUNCATE(fd, length) \ safe_ftruncate(__FILE__, __LINE__, (fd), (length)) static inline int safe_posix_fadvise(const char *file, const int lineno, int fd, off_t offset, off_t len, int advice) { int rval; rval = posix_fadvise(fd, offset, len, advice); if (rval) tst_brk_(file, lineno, TBROK, "posix_fadvise(%d,%ld,%ld,%d) failed: %s", fd, (long)offset, (long)len, advice, tst_strerrno(rval)); return rval; } #define SAFE_POSIX_FADVISE(fd, offset, len, advice) \ safe_posix_fadvise(__FILE__, __LINE__, (fd), (offset), (len), (advice)) static inline int safe_truncate(const char *file, const int lineno, const char *path, off_t length) { int rval; rval = truncate(path, length); if (rval == -1) { tst_brk_(file, lineno, TBROK | TERRNO, "truncate(%s,%ld) failed", path, (long)length); } else if (rval) { tst_brk_(file, lineno, TBROK | TERRNO, "Invalid truncate(%s,%ld) return value %d", path, (long)length, rval); } return rval; } #define SAFE_TRUNCATE(path, length) \ safe_truncate(__FILE__, __LINE__, (path), (length)) static inline int safe_stat(const char *file, const int lineno, const char *path, struct stat *buf) { int rval; rval = stat(path, buf); if (rval == -1) { tst_brk_(file, lineno, TBROK | TERRNO, "stat(%s,%p) failed", path, buf); } else if (rval) { tst_brk_(file, lineno, TBROK | TERRNO, "Invalid stat(%s,%p) return value %d", path, buf, rval); } return rval; } #define SAFE_STAT(path, buf) \ safe_stat(__FILE__, __LINE__, (path), (buf)) static inline int safe_fstat(const char *file, const int lineno, int fd, struct stat *buf) { int rval; rval = fstat(fd, buf); if (rval == -1) { tst_brk_(file, lineno, TBROK | TERRNO, "fstat(%d,%p) failed", fd, buf); } else if (rval) { tst_brk_(file, lineno, TBROK | TERRNO, "Invalid fstat(%d,%p) return value %d", fd, buf, rval); } return rval; } #define SAFE_FSTAT(fd, buf) \ safe_fstat(__FILE__, __LINE__, (fd), (buf)) static inline int safe_lstat(const char *file, const int lineno, const char *path, struct stat *buf) { int rval; rval = lstat(path, buf); if (rval == -1) { tst_brk_(file, lineno, TBROK | TERRNO, "lstat(%s,%p) failed", path, buf); } else if (rval) { tst_brk_(file, lineno, TBROK | TERRNO, "Invalid lstat(%s,%p) return value %d", path, buf, rval); } return rval; } #define SAFE_LSTAT(path, buf) \ safe_lstat(__FILE__, __LINE__, (path), (buf)) static inline int safe_statfs(const char *file, const int lineno, const char *path, struct statfs *buf) { int rval; rval = statfs(path, buf); if (rval == -1) { tst_brk_(file, lineno, TBROK | TERRNO, "statfs(%s,%p) failed", path, buf); } else if (rval) { tst_brk_(file, lineno, TBROK | TERRNO, "Invalid statfs(%s,%p) return value %d", path, buf, rval); } return rval; } #define SAFE_STATFS(path, buf) \ safe_statfs(__FILE__, __LINE__, (path), (buf)) static inline off_t safe_lseek(const char *file, const int lineno, int fd, off_t offset, int whence) { off_t rval; rval = lseek(fd, offset, whence); if (rval == (off_t) -1) { tst_brk_(file, lineno, TBROK | TERRNO, "lseek(%d,%ld,%d) failed", fd, (long)offset, whence); } else if (rval < 0) { tst_brk_(file, lineno, TBROK | TERRNO, "Invalid lseek(%d,%ld,%d) return value %ld", fd, (long)offset, whence, (long)rval); } return rval; } #define SAFE_LSEEK(fd, offset, whence) \ safe_lseek(__FILE__, __LINE__, (fd), (offset), (whence)) static inline int safe_getrlimit(const char *file, const int lineno, int resource, struct rlimit *rlim) { int rval; rval = getrlimit(resource, rlim); if (rval == -1) { tst_brk_(file, lineno, TBROK | TERRNO, "getrlimit(%d,%p) failed", resource, rlim); } else if (rval) { tst_brk_(file, lineno, TBROK | TERRNO, "Invalid getrlimit(%d,%p) return value %d", resource, rlim, rval); } return rval; } #define SAFE_GETRLIMIT(resource, rlim) \ safe_getrlimit(__FILE__, __LINE__, (resource), (rlim)) static inline int safe_setrlimit(const char *file, const int lineno, int resource, const struct rlimit *rlim) { int rval; rval = setrlimit(resource, rlim); if (rval == -1) { tst_brk_(file, lineno, TBROK | TERRNO, "setrlimit(%d,%p) failed", resource, rlim); } else if (rval) { tst_brk_(file, lineno, TBROK | TERRNO, "Invalid setrlimit(%d,%p) return value %d", resource, rlim, rval); } return rval; } #define SAFE_SETRLIMIT(resource, rlim) \ safe_setrlimit(__FILE__, __LINE__, (resource), (rlim)) #endif /* TST_SAFE_MACROS_INLINE_H__ */