191d6742f731f05f627473cb64513988bdcff618cZeng Linggang#define _GNU_SOURCE
2dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <sys/types.h>
3ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper#include <sys/mman.h>
4817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang#include <sys/resource.h>
5dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <sys/stat.h>
6f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis#include <sys/wait.h>
78e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka#include <sys/mount.h>
810552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic#include <sys/xattr.h>
99af0bd7b9415ded75fd3f23e727b6115c12aee23Vinson Lee#include <errno.h>
10dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <fcntl.h>
11dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <libgen.h>
12d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang#include <limits.h>
13ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper#include <pwd.h>
14dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <stdarg.h>
15ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper#include <stdlib.h>
16dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <unistd.h>
175ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang#include <malloc.h>
18dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include "test.h"
19ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper#include "safe_macros.h"
20dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
21354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *safe_basename(const char *file, const int lineno,
22354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    void (*cleanup_fn) (void), char *path)
23dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
24dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	char *rval;
25dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
26dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = basename(path);
2749e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == NULL) {
2849e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
2949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: basename(%s) failed",
3049e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, path);
3149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
32dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
3349e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
34dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
35dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
36dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooperint
37354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_chdir(const char *file, const int lineno, void (*cleanup_fn) (void),
38354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	   const char *path)
394a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper{
404a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper	int rval;
414a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper
424a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper	rval = chdir(path);
4349e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
4449e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
4549e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: chdir(%s) failed",
4649e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, path);
4749e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
484a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper
4949e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
504a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper}
514a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper
524a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooperint
53354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_close(const char *file, const int lineno, void (*cleanup_fn) (void),
54354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	   int fildes)
55dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
56dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	int rval;
57dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
58dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = close(fildes);
5949e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
6049e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
6149e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: close(%d) failed",
6249e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, fildes);
6349e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
64dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
6549e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
66dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
67dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
68dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooperint
69354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_creat(const char *file, const int lineno, void (*cleanup_fn) (void),
705071db5f55b5558bde144a25f2703c9045ebf13bAlexey Kodanev	   const char *pathname, mode_t mode)
71dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
72dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	int rval;
73dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
74dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = creat(pathname, mode);
7549e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
7649e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
7749e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: creat(%s,0%o) failed",
7849e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, pathname, mode);
7949e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
80dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
8149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
82dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
83dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
84354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *safe_dirname(const char *file, const int lineno,
85354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		   void (*cleanup_fn) (void), char *path)
86dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
87dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	char *rval;
88dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
89dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = dirname(path);
9049e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == NULL) {
9149e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
9249e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: dirname(%s) failed",
9349e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, path);
9449e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
95dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
9649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
97dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
98dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
99354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *safe_getcwd(const char *file, const int lineno, void (*cleanup_fn) (void),
100354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		  char *buf, size_t size)
101ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{
102ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	char *rval;
103ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
104ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	rval = getcwd(buf, size);
10549e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == NULL) {
10649e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
10749e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: getcwd(%p,%zu) failed",
10849e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, buf, size);
10949e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
110ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
11149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
112ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper}
113ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostruct passwd *safe_getpwnam(const char *file, const int lineno,
115354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     void (*cleanup_fn) (void), const char *name)
116ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{
117ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	struct passwd *rval;
118ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
119ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	rval = getpwnam(name);
12049e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == NULL) {
12149e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
12249e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: getpwnam(%s) failed",
12349e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, name);
12449e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
125ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
12649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
127ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper}
128ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
129817c7822c72e4601021f612ef1a47849077c6980Caspar Zhangint
130354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_getrusage(const char *file, const int lineno, void (*cleanup_fn) (void),
131354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	       int who, struct rusage *usage)
132817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang{
133817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang	int rval;
134817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang
135817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang	rval = getrusage(who, usage);
13649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup_fn,
13849e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: getrusage(%d,%p) failed",
13949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, who, usage);
14049e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
141817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang
142817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang	return rval;
143817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang}
144817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang
145354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid *safe_malloc(const char *file, const int lineno, void (*cleanup_fn) (void),
146354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		  size_t size)
147ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{
148ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	void *rval;
149ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
150ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	rval = malloc(size);
15149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == NULL) {
15249e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
15349e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: malloc(%zu) failed",
15449e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, size);
15549e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
156ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
15749e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
158ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper}
159ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
16049e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_mkdir(const char *file, const int lineno, void (*cleanup_fn) (void),
16149e8615fd07b150891182e202d356384c8c98416Mats Liljegren               const char *pathname, mode_t mode)
1624a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper{
1634a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper	int rval;
1644a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper
1654a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper	rval = mkdir(pathname, mode);
16649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
16749e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
16849e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: mkdir(%s,0%o) failed",
16949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, pathname, mode);
17049e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
1714a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper
1724a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper	return (rval);
1734a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper}
1744a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper
17597499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubisint safe_rmdir(const char *file, const int lineno, void (*cleanup_fn) (void),
17697499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis               const char *pathname)
17797499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis{
17897499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis	int rval;
17997499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis
18097499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis	rval = rmdir(pathname);
18197499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis	if (rval == -1) {
18297499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
18397499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis			 "%s:%d: rmdir(%s) failed",
18497499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis			 file, lineno, pathname);
18597499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis	}
18697499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis
18797499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis	return (rval);
18897499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis}
18997499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis
19049e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_munmap(const char *file, const int lineno, void (*cleanup_fn) (void),
19149e8615fd07b150891182e202d356384c8c98416Mats Liljegren                void *addr, size_t length)
192ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{
193ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	int rval;
194ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
195ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	rval = munmap(addr, length);
19649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
19749e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
19849e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: munmap(%p,%zu) failed",
19949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, addr, length);
20049e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
201ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
20249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
203ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper}
204ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
20549e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_open(const char *file, const int lineno, void (*cleanup_fn) (void),
20649e8615fd07b150891182e202d356384c8c98416Mats Liljegren              const char *pathname, int oflags, ...)
207dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
208dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	va_list ap;
209dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	int rval;
210dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	mode_t mode;
211dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
212dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	va_start(ap, oflags);
2131750b47f22a10582e3cee26b14f6be11ad1d85c7Steven Jackson
2141750b47f22a10582e3cee26b14f6be11ad1d85c7Steven Jackson	/* Android's NDK's mode_t is smaller than an int, which results in
2151750b47f22a10582e3cee26b14f6be11ad1d85c7Steven Jackson	 * SIGILL here when passing the mode_t type.
2161750b47f22a10582e3cee26b14f6be11ad1d85c7Steven Jackson	 */
2171750b47f22a10582e3cee26b14f6be11ad1d85c7Steven Jackson	mode = va_arg(ap, int);
2181750b47f22a10582e3cee26b14f6be11ad1d85c7Steven Jackson
219dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	va_end(ap);
220dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
221dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = open(pathname, oflags, mode);
22249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
22349e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
22449e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: open(%s,%d,0%o) failed",
22549e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, pathname, oflags, mode);
22649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
227dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
22849e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
229dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
230dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
23149e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_pipe(const char *file, const int lineno, void (*cleanup_fn) (void),
23249e8615fd07b150891182e202d356384c8c98416Mats Liljegren              int fildes[2])
233dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
234dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	int rval;
235dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
236dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = pipe(fildes);
23749e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
23849e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
23949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: pipe({%d,%d}) failed",
24049e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, fildes[0], fildes[1]);
24149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
242dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
24349e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
244dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
245dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
24649e8615fd07b150891182e202d356384c8c98416Mats Liljegrenssize_t safe_read(const char *file, const int lineno, void (*cleanup_fn) (void),
24749e8615fd07b150891182e202d356384c8c98416Mats Liljegren                  char len_strict, int fildes, void *buf, size_t nbyte)
248dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
249dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	ssize_t rval;
250dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
251dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = read(fildes, buf, nbyte);
25249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1 || (len_strict && (size_t)rval != nbyte)) {
25349e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
25449e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: read(%d,%p,%zu) failed, returned %zd",
25549e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, fildes, buf, nbyte, rval);
25649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
257dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
25849e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
259dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
260dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
26149e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_setegid(const char *file, const int lineno, void (*cleanup_fn) (void),
26249e8615fd07b150891182e202d356384c8c98416Mats Liljegren                 gid_t egid)
263400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper{
264400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper	int rval;
265400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper
266400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper	rval = setegid(egid);
26749e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
26849e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
26949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: setegid(%u) failed",
27049e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, (unsigned) egid);
27149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
272400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper
27349e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
274400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper}
275400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper
27649e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_seteuid(const char *file, const int lineno, void (*cleanup_fn) (void),
27749e8615fd07b150891182e202d356384c8c98416Mats Liljegren                 uid_t euid)
278400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper{
279400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper	int rval;
280400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper
281400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper	rval = seteuid(euid);
28249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
28349e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
28449e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: seteuid(%u) failed",
28549e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, (unsigned) euid);
28649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
287400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper
28849e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
289400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper}
290400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper
29149e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_setgid(const char *file, const int lineno, void (*cleanup_fn) (void),
29249e8615fd07b150891182e202d356384c8c98416Mats Liljegren                gid_t gid)
293ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{
294ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	int rval;
295ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
296ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	rval = setgid(gid);
29749e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
29849e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
29949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: setgid(%u) failed",
30049e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, (unsigned) gid);
30149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
302ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
30349e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
304ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper}
305ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
30649e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_setuid(const char *file, const int lineno, void (*cleanup_fn) (void),
30749e8615fd07b150891182e202d356384c8c98416Mats Liljegren                uid_t uid)
308ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{
309ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	int rval;
310ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
311ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	rval = setuid(uid);
31249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
31349e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
31449e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: setuid(%u) failed",
31549e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, (unsigned) uid);
31649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
317ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
31849e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
319ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper}
320ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
32191d6742f731f05f627473cb64513988bdcff618cZeng Linggangint safe_getresuid(const char *file, const int lineno, void (*cleanup_fn)(void),
32291d6742f731f05f627473cb64513988bdcff618cZeng Linggang		   uid_t *ruid, uid_t *euid, uid_t *suid)
32391d6742f731f05f627473cb64513988bdcff618cZeng Linggang{
32491d6742f731f05f627473cb64513988bdcff618cZeng Linggang	int rval;
32591d6742f731f05f627473cb64513988bdcff618cZeng Linggang
32691d6742f731f05f627473cb64513988bdcff618cZeng Linggang	rval = getresuid(ruid, euid, suid);
32791d6742f731f05f627473cb64513988bdcff618cZeng Linggang	if (rval == -1) {
32891d6742f731f05f627473cb64513988bdcff618cZeng Linggang		tst_brkm(TBROK | TERRNO, cleanup_fn,
32991d6742f731f05f627473cb64513988bdcff618cZeng Linggang			 "%s:%d: getresuid(%p, %p, %p) failed",
33091d6742f731f05f627473cb64513988bdcff618cZeng Linggang			 file, lineno, ruid, euid, suid);
33191d6742f731f05f627473cb64513988bdcff618cZeng Linggang	}
33291d6742f731f05f627473cb64513988bdcff618cZeng Linggang
33391d6742f731f05f627473cb64513988bdcff618cZeng Linggang	return rval;
33491d6742f731f05f627473cb64513988bdcff618cZeng Linggang}
33591d6742f731f05f627473cb64513988bdcff618cZeng Linggang
33691d6742f731f05f627473cb64513988bdcff618cZeng Linggangint safe_getresgid(const char *file, const int lineno, void (*cleanup_fn)(void),
33791d6742f731f05f627473cb64513988bdcff618cZeng Linggang		   gid_t *rgid, gid_t *egid, gid_t *sgid)
33891d6742f731f05f627473cb64513988bdcff618cZeng Linggang{
33991d6742f731f05f627473cb64513988bdcff618cZeng Linggang	int rval;
34091d6742f731f05f627473cb64513988bdcff618cZeng Linggang
34191d6742f731f05f627473cb64513988bdcff618cZeng Linggang	rval = getresgid(rgid, egid, sgid);
34291d6742f731f05f627473cb64513988bdcff618cZeng Linggang	if (rval == -1) {
34391d6742f731f05f627473cb64513988bdcff618cZeng Linggang		tst_brkm(TBROK | TERRNO, cleanup_fn,
34491d6742f731f05f627473cb64513988bdcff618cZeng Linggang			 "%s:%d: getresgid(%p, %p, %p) failed",
34591d6742f731f05f627473cb64513988bdcff618cZeng Linggang			 file, lineno, rgid, egid, sgid);
34691d6742f731f05f627473cb64513988bdcff618cZeng Linggang	}
34791d6742f731f05f627473cb64513988bdcff618cZeng Linggang
34891d6742f731f05f627473cb64513988bdcff618cZeng Linggang	return rval;
34991d6742f731f05f627473cb64513988bdcff618cZeng Linggang}
35091d6742f731f05f627473cb64513988bdcff618cZeng Linggang
35149e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_unlink(const char *file, const int lineno, void (*cleanup_fn) (void),
35249e8615fd07b150891182e202d356384c8c98416Mats Liljegren                const char *pathname)
353dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
354dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	int rval;
355dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
356dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = unlink(pathname);
35749e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
35849e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
35949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: unlink(%s) failed",
36049e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, pathname);
36149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
362dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
36349e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
364dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
365dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
366aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
367aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubisint safe_link(const char *file, const int lineno,
368aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis              void (cleanup_fn)(void), const char *oldpath,
369aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis              const char *newpath)
370aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis{
371aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	int rval;
372aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
373aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	rval = link(oldpath, newpath);
374aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
375aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	if (rval == -1) {
376aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
37749e8615fd07b150891182e202d356384c8c98416Mats Liljegren		         "%s:%d: link(%s,%s) failed",
37849e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, oldpath, newpath);
379aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	}
380aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
381aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	return rval;
382aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis}
383aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
384f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanevint safe_linkat(const char *file, const int lineno,
385f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev		void (cleanup_fn)(void), int olddirfd, const char *oldpath,
386f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev		int newdirfd, const char *newpath, int flags)
387f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev{
388f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev	int rval;
389f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev
390f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev	rval = linkat(olddirfd, oldpath, newdirfd, newpath, flags);
391f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev
392f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev	if (rval == -1) {
393f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev		tst_brkm(TBROK | TERRNO, cleanup_fn,
394f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev			 "%s:%d: linkat(%d,%s,%d,%s,%d) failed",
395f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev			 file, lineno, olddirfd, oldpath, newdirfd,
396f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev			 newpath, flags);
397f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev	}
398f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev
399f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev	return rval;
400f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev}
401f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev
4028bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanevssize_t safe_readlink(const char *file, const int lineno,
4038bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev		  void (cleanup_fn)(void), const char *path,
4048bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev		  char *buf, size_t bufsize)
4058bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev{
4068bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev	ssize_t rval;
4078bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev
4088bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev	rval = readlink(path, buf, bufsize);
4098bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev
4108bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev	if (rval == -1) {
4118bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev		tst_brkm(TBROK | TERRNO, cleanup_fn,
4128bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev			 "%s:%d: readlink(%s,%p,%zu) failed",
4138bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev			 file, lineno, path, buf, bufsize);
414bb1477f0d9cd0afc90ded3cb2e721004565d618eHelge Deller	} else {
415bb1477f0d9cd0afc90ded3cb2e721004565d618eHelge Deller		/* readlink does not append a NUL byte to the buffer.
416bb1477f0d9cd0afc90ded3cb2e721004565d618eHelge Deller		 * Add it now. */
417bb1477f0d9cd0afc90ded3cb2e721004565d618eHelge Deller		if ((size_t) rval < bufsize)
418bb1477f0d9cd0afc90ded3cb2e721004565d618eHelge Deller			buf[rval] = '\0';
419bb1477f0d9cd0afc90ded3cb2e721004565d618eHelge Deller		else
420bb1477f0d9cd0afc90ded3cb2e721004565d618eHelge Deller			buf[bufsize-1] = '\0';
4218bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev	}
4228bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev
4238bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev	return rval;
4248bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev}
4258bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev
426aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubisint safe_symlink(const char *file, const int lineno,
427aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis                 void (cleanup_fn)(void), const char *oldpath,
428aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis                 const char *newpath)
429aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis{
430aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	int rval;
431aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
432aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	rval = symlink(oldpath, newpath);
433aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
434aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	if (rval == -1) {
435aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
43649e8615fd07b150891182e202d356384c8c98416Mats Liljegren		         "%s:%d: symlink(%s,%s) failed",
43749e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, oldpath, newpath);
438aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	}
439aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
440aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	return rval;
441aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis}
442aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
44349e8615fd07b150891182e202d356384c8c98416Mats Liljegrenssize_t safe_write(const char *file, const int lineno, void (cleanup_fn) (void),
44449e8615fd07b150891182e202d356384c8c98416Mats Liljegren                   char len_strict, int fildes, const void *buf, size_t nbyte)
445dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
446dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	ssize_t rval;
447dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
448dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = write(fildes, buf, nbyte);
449f3f10e027a28a941575802980faacd31aa8edf86Guangwen Feng	if (rval == -1 || (len_strict && (size_t)rval != nbyte)) {
45049e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
45149e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: write(%d,%p,%zu) failed",
45249e8615fd07b150891182e202d356384c8c98416Mats Liljegren		         file, lineno, fildes, buf, rval);
45349e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
454dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
45549e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
456dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
4573f75fe43de08028ae130bce108103e888ade839bCyril Hrubis
458d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhanglong safe_strtol(const char *file, const int lineno,
459354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 void (cleanup_fn) (void), char *str, long min, long max)
460d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang{
461d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang	long rval;
462d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang	char *endptr;
463d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang
464d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang	errno = 0;
465d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang	rval = strtol(str, &endptr, 10);
46649e8615fd07b150891182e202d356384c8c98416Mats Liljegren
467d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang	if ((errno == ERANGE && (rval == LONG_MAX || rval == LONG_MIN))
46849e8615fd07b150891182e202d356384c8c98416Mats Liljegren	    || (errno != 0 && rval == 0)) {
469354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup_fn,
47049e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: strtol(%s) failed", file, lineno, str);
471d101cabf6356d7a3fb027b20ef709d235d708c2bCyril Hrubis		return rval;
47249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
47349e8615fd07b150891182e202d356384c8c98416Mats Liljegren
47449e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (endptr == str || (*endptr != '\0' && *endptr != '\n')) {
475d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang		tst_brkm(TBROK, cleanup_fn,
47649e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: strtol(%s): Invalid value", file, lineno, str);
477d101cabf6356d7a3fb027b20ef709d235d708c2bCyril Hrubis		return 0;
47849e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
47949e8615fd07b150891182e202d356384c8c98416Mats Liljegren
48049e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval > max || rval < min) {
481d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang		tst_brkm(TBROK, cleanup_fn,
48249e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: strtol(%s): %ld is out of range %ld - %ld",
48349e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, str, rval, min, max);
484d101cabf6356d7a3fb027b20ef709d235d708c2bCyril Hrubis		return 0;
48549e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
486d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang
487d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang	return rval;
488d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang}
4892b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu
490354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaounsigned long safe_strtoul(const char *file, const int lineno,
491354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			   void (cleanup_fn) (void), char *str,
492354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			   unsigned long min, unsigned long max)
4932b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu{
4942b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu	unsigned long rval;
4952b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu	char *endptr;
4962b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu
4972b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu	errno = 0;
4982b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu	rval = strtoul(str, &endptr, 10);
49949e8615fd07b150891182e202d356384c8c98416Mats Liljegren
5002b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu	if ((errno == ERANGE && rval == ULONG_MAX)
50149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	    || (errno != 0 && rval == 0)) {
502354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup_fn,
50349e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: strtoul(%s) failed", file, lineno, str);
504d101cabf6356d7a3fb027b20ef709d235d708c2bCyril Hrubis		return rval;
50549e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
50649e8615fd07b150891182e202d356384c8c98416Mats Liljegren
50749e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval > max || rval < min) {
5082b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu		tst_brkm(TBROK, cleanup_fn,
50949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: strtoul(%s): %lu is out of range %lu - %lu",
51049e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, str, rval, min, max);
511d101cabf6356d7a3fb027b20ef709d235d708c2bCyril Hrubis		return 0;
51249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
51349e8615fd07b150891182e202d356384c8c98416Mats Liljegren
51449e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (endptr == str || (*endptr != '\0' && *endptr != '\n')) {
5152b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu		tst_brkm(TBROK, cleanup_fn,
516354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "Invalid value: '%s' at %s:%d", str, file, lineno);
517d101cabf6356d7a3fb027b20ef709d235d708c2bCyril Hrubis		return 0;
51849e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
5192b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu
5202b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu	return rval;
5212b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu}
5223b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao
5233b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gaolong safe_sysconf(const char *file, const int lineno,
524354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		  void (cleanup_fn) (void), int name)
5253b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao{
5263b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao	long rval;
5273b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao	errno = 0;
5283b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao
5293b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao	rval = sysconf(name);
5303b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao
5313b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao	if (rval == -1) {
53249e8615fd07b150891182e202d356384c8c98416Mats Liljegren		if (errno) {
533354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			tst_brkm(TBROK | TERRNO, cleanup_fn,
53449e8615fd07b150891182e202d356384c8c98416Mats Liljegren				 "%s:%d: sysconf(%d) failed",
53549e8615fd07b150891182e202d356384c8c98416Mats Liljegren				 file, lineno, name);
53649e8615fd07b150891182e202d356384c8c98416Mats Liljegren		} else {
53749e8615fd07b150891182e202d356384c8c98416Mats Liljegren			tst_resm(TINFO, "%s:%d: sysconf(%d): "
53849e8615fd07b150891182e202d356384c8c98416Mats Liljegren				 "queried option is not available"
53949e8615fd07b150891182e202d356384c8c98416Mats Liljegren				 " or there is no definite limit",
54049e8615fd07b150891182e202d356384c8c98416Mats Liljegren				 file, lineno, name);
54149e8615fd07b150891182e202d356384c8c98416Mats Liljegren		}
5423b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao	}
5433b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao
5443b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao	return rval;
5453b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao}
5461030c9d2c5264e6b1422e8c58ed92f89c66dc51aZeng Linggang
547c45923544542e125a89e420c5ed40388bb20751eCyril Hrubisint safe_chmod(const char *file, const int lineno,
548c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis               void (cleanup_fn)(void), const char *path, mode_t mode)
549c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis{
550c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	int rval;
551c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis
552c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	rval = chmod(path, mode);
553c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis
554c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	if (rval == -1) {
555c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
55649e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: chmod(%s,0%o) failed",
55749e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, path, mode);
558c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	}
559c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis
560c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	return rval;
561c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis}
562c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis
563c45923544542e125a89e420c5ed40388bb20751eCyril Hrubisint safe_fchmod(const char *file, const int lineno,
564c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis                void (cleanup_fn)(void), int fd, mode_t mode)
565c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis{
566c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	int rval;
567c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis
568c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	rval = fchmod(fd, mode);
569c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis
570c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	if (rval == -1) {
571c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
57249e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: fchmod(%d,0%o) failed",
57349e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, fd, mode);
574c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	}
575c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis
576c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	return rval;
577c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis}
578f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis
57992a14596c5e157dfbcb610393d4abba4757d9f90Xing Guint safe_chown(const char *file, const int lineno, void (cleanup_fn)(void),
58092a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu			const char *path, uid_t owner, gid_t group)
58192a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu{
58292a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu	int rval;
58392a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu
58492a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu	rval = chown(path, owner, group);
58592a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu
58692a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu	if (rval == -1) {
58792a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu		tst_brkm(TBROK | TERRNO, cleanup_fn,
58892a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu			"%s:%d: chown(%s,%d,%d) failed",
58992a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu			file, lineno, path, owner, group);
59092a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu	}
59192a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu
59292a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu	return rval;
59392a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu}
59434ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis
59534ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubisint safe_fchown(const char *file, const int lineno, void (cleanup_fn)(void),
59634ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis                int fd, uid_t owner, gid_t group)
59734ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis{
59834ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis	int rval;
59934ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis
60034ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis	rval = fchown(fd, owner, group);
60134ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis
60234ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis	if (rval == -1) {
60334ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
60434ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis		         "%s:%d: fchown(%d,%d,%d) failed",
60534ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis			 file, lineno, fd, owner, group);
60634ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis	}
60734ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis
60834ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis	return rval;
60934ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis}
61034ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis
611f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubispid_t safe_wait(const char *file, const int lineno, void (cleanup_fn)(void),
612f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis                int *status)
613f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis{
614f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	pid_t rval;
615f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis
616f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	rval = wait(status);
617f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	if (rval == -1) {
618f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
619f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis			 "%s:%d: wait(%p) failed",
620f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis			 file, lineno, status);
621f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	}
622f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis
623f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	return rval;
624f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis}
625f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis
626f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubispid_t safe_waitpid(const char *file, const int lineno, void (cleanup_fn)(void),
627f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis                   pid_t pid, int *status, int opts)
628f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis{
629f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	pid_t rval;
630f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis
631f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	rval = waitpid(pid, status, opts);
632f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	if (rval == -1) {
633f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
634f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis			 "%s:%d: waitpid(%d,%p,%d) failed",
635f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis			 file, lineno, pid, status, opts);
636f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	}
637f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis
638f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	return rval;
639f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis}
6405ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang
6415ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggangvoid *safe_memalign(const char *file, const int lineno,
6425ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang		    void (*cleanup_fn) (void), size_t alignment, size_t size)
6435ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang{
6445ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang	void *rval;
6455ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang
6465ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang	rval = memalign(alignment, size);
6475ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang	if (rval == NULL)
6485ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang		tst_brkm(TBROK | TERRNO, cleanup_fn, "memalign failed at %s:%d",
6495ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang			 file, lineno);
6505ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang
6515ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang	return rval;
6525ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang}
6536deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang
6546deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wangint safe_kill(const char *file, const int lineno, void (cleanup_fn)(void),
6556deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang	      pid_t pid, int sig)
6566deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang{
6576deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang	int rval;
6586deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang
6596deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang	rval = kill(pid, sig);
6606deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang
6616deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang	if (rval == -1) {
6626deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang		tst_brkm(TBROK | TERRNO, cleanup_fn,
6636deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang			 "%s:%d: kill(%d,%s) failed",
6646deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang			 file, lineno, pid, tst_strsig(sig));
6656deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang	}
6666deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang
6676deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang	return rval;
6686deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang}
6693a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis
6703a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubisint safe_mkfifo(const char *file, const int lineno,
6713a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis                void (*cleanup_fn)(void), const char *pathname, mode_t mode)
6723a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis{
6733a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis	int rval;
6743a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis
6753a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis	rval = mkfifo(pathname, mode);
6763a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis
6773a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis	if (rval == -1) {
6783a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
6793a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis		         "%s:%d: mkfifo(%s, 0%o) failed",
6803a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis			 file, lineno, pathname, mode);
6813a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis	}
6823a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis
6833a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis	return rval;
6843a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis}
685f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang
686f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wangint safe_rename(const char *file, const int lineno, void (*cleanup_fn)(void),
687f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang		const char *oldpath, const char *newpath)
688f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang{
689f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang	int rval;
690f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang
691f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang	rval = rename(oldpath, newpath);
692f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang
693f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang	if (rval == -1) {
694f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang		tst_brkm(TBROK | TERRNO, cleanup_fn,
695f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang			 "%s:%d: rename(%s, %s) failed",
696f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang			 file, lineno, oldpath, newpath);
697f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang	}
698f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang
699f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang	return rval;
700f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang}
7018e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7028e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefkaint safe_mount(const char *file, const int lineno, void (*cleanup_fn)(void),
7038e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	       const char *source, const char *target,
7048e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	       const char *filesystemtype, unsigned long mountflags,
7058e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	       const void *data)
7068e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka{
7078e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	int rval;
7088e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7098e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	rval = mount(source, target, filesystemtype, mountflags, data);
7108e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7118e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	if (rval == -1) {
7128e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka		tst_brkm(TBROK | TERRNO, cleanup_fn,
7138e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka			 "%s:%d: mount(%s, %s, %s, %lu, %p) failed",
7148e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka			 file, lineno, source, target, filesystemtype,
7158e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka			 mountflags, data);
7168e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	}
7178e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7188e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	return rval;
7198e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka}
7208e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7218e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefkaint safe_umount(const char *file, const int lineno, void (*cleanup_fn)(void),
7228e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka		const char *target)
7238e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka{
7248e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	int rval;
7258e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7268e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	rval = umount(target);
7278e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7288e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	if (rval == -1) {
7298e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka		tst_brkm(TBROK | TERRNO, cleanup_fn,
7308e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka			 "%s:%d: umount(%s) failed",
7318e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka			 file, lineno, target);
7328e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	}
7338e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7348e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	return rval;
7358e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka}
7369138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7379138a0184105389aad4aeae89dc1331829d7d2cbCyril HrubisDIR* safe_opendir(const char *file, const int lineno, void (cleanup_fn)(void),
7389138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis                  const char *name)
7399138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis{
7409138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	DIR *rval;
7419138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7429138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	rval = opendir(name);
7439138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7449138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	if (!rval) {
7459138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
7469138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis		         "%s:%d: opendir(%s) failed", file, lineno, name);
7479138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	}
7489138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7499138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	return rval;
7509138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis}
7519138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7529138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubisint safe_closedir(const char *file, const int lineno, void (cleanup_fn)(void),
7539138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis                  DIR *dirp)
7549138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis{
7559138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	int rval;
7569138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7579138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	rval = closedir(dirp);
7589138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7599138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	if (rval) {
7609138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
7619138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis		         "%s:%d: closedir(%p) failed", file, lineno, dirp);
7629138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	}
7639138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7649138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	return rval;
7659138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis}
7669138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7679138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubisstruct dirent *safe_readdir(const char *file, const int lineno, void (cleanup_fn)(void),
7689138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis                            DIR *dirp)
7699138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis{
7709138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	struct dirent *rval;
7719138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	int err = errno;
7729138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7739138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	errno = 0;
7749138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	rval = readdir(dirp);
7759138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7769138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	if (!rval && errno) {
7779138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
7789138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis		         "%s:%d: readdir(%p) failed", file, lineno, dirp);
7799138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	}
7809138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7819138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	errno = err;
7829138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	return rval;
7839138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis}
784af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis
785af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubisint safe_getpriority(const char *file, const int lineno, int which, id_t who)
786af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis{
787af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis	int rval, err = errno;
788af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis
789af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis	errno = 0;
790af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis	rval = getpriority(which, who);
791af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis	if (errno) {
792af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis		tst_brkm(TBROK | TERRNO, NULL,
793af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis		         "%s:%d getpriority(%i, %i) failed",
794af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis			 file, lineno, which, who);
795af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis	}
796af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis
797af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis	errno = err;
798af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis	return rval;
799af5a4b1f388dd317b55b4fc86a602868b4fe6e0cCyril Hrubis}
80010552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic
80110552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevicint safe_setxattr(const char *file, const int lineno, const char *path,
80210552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic		  const char *name, const void *value, size_t size, int flags)
80310552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic{
80410552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic	int rval;
80510552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic
80610552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic	rval = setxattr(path, name, value, size, flags);
80710552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic
80810552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic	if (rval) {
80910552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic		if (errno == ENOTSUP) {
81010552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic			tst_brkm(TCONF, NULL,
81110552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic				 "%s:%d: no xattr support in fs or mounted "
81210552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic				 "without user_xattr option", file, lineno);
81310552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic		}
81410552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic
81510552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic		tst_brkm(TBROK | TERRNO, NULL, "%s:%d: setxattr() failed",
81610552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic			     file, lineno);
81710552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic	}
81810552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic
81910552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic	return rval;
82010552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic}
82110552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic
82210552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevicint safe_lsetxattr(const char *file, const int lineno, const char *path,
82310552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic		   const char *name, const void *value, size_t size, int flags)
82410552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic{
82510552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic	int rval;
82610552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic
82710552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic	rval = lsetxattr(path, name, value, size, flags);
82810552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic
82910552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic	if (rval) {
83010552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic		if (errno == ENOTSUP) {
83110552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic			tst_brkm(TCONF, NULL,
83210552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic				 "%s:%d: no xattr support in fs or mounted "
83310552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic				 "without user_xattr option", file, lineno);
83410552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic		}
83510552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic
83610552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic		tst_brkm(TBROK | TERRNO, NULL, "%s:%d: lsetxattr() failed",
83710552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic			     file, lineno);
83810552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic	}
83910552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic
84010552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic	return rval;
84110552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic}
84210552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic
84310552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevicint safe_fsetxattr(const char *file, const int lineno, int fd, const char *name,
84410552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic		   const void *value, size_t size, int flags)
84510552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic{
84610552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic	int rval;
84710552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic
84810552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic	rval = fsetxattr(fd, name, value, size, flags);
84910552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic
85010552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic	if (rval) {
85110552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic		if (errno == ENOTSUP) {
85210552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic			tst_brkm(TCONF, NULL,
85310552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic				 "%s:%d: no xattr support in fs or mounted "
85410552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic				 "without user_xattr option", file, lineno);
85510552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic		}
85610552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic
85710552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic		tst_brkm(TBROK | TERRNO, NULL, "%s:%d: fsetxattr() failed",
85810552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic			     file, lineno);
85910552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic	}
86010552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic
86110552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic	return rval;
86210552812faadc45daa0a3cf560ed50c674992fd3Dejan Jovicevic}
863c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang
864c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yangint safe_removexattr(const char *file, const int lineno, const char *path,
865c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang		const char *name)
866c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang{
867c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang	int rval;
868c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang
869c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang	rval = removexattr(path, name);
870c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang
871c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang	if (rval) {
872c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang		if (errno == ENOTSUP) {
873c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang			tst_brkm(TCONF, NULL,
874c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang				"%s:%d: no xattr support in fs or mounted "
875c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang				"without user_xattr option", file, lineno);
876c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang		}
877c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang
878c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang		tst_brkm(TBROK | TERRNO, NULL, "%s:%d: removexattr() failed",
879c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang			file, lineno);
880c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang	}
881c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang
882c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang	return rval;
883c46e27706a46ef0aa479f6661fa1918d7f1683f8Xiao Yang}
88415d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang
88515d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yangint safe_fsync(const char *file, const int lineno, int fd)
88615d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang{
88715d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang	int rval;
88815d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang
88915d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang	rval = fsync(fd);
89015d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang
89115d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang	if (rval) {
89215d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang		tst_brkm(TBROK | TERRNO, NULL,
89315d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang			"%s:%d: fsync(%i) failed", file, lineno, fd);
89415d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang	}
89515d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang
89615d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang	return rval;
89715d413ef2f438ee48876e3a3e1cca91c144cb2cbXiao Yang}
898