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>
89af0bd7b9415ded75fd3f23e727b6115c12aee23Vinson Lee#include <errno.h>
9dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <fcntl.h>
10dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <libgen.h>
11d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang#include <limits.h>
12ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper#include <pwd.h>
13dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <stdarg.h>
14ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper#include <stdlib.h>
15dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include <unistd.h>
165ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang#include <malloc.h>
17dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper#include "test.h"
18ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper#include "safe_macros.h"
19dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
20354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *safe_basename(const char *file, const int lineno,
21354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    void (*cleanup_fn) (void), char *path)
22dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
23dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	char *rval;
24dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
25dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = basename(path);
2649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == NULL) {
2749e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
2849e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: basename(%s) failed",
2949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, path);
3049e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
31dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
3249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
33dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
34dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
35dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooperint
36354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_chdir(const char *file, const int lineno, void (*cleanup_fn) (void),
37354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	   const char *path)
384a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper{
394a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper	int rval;
404a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper
414a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper	rval = chdir(path);
4249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
4349e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
4449e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: chdir(%s) failed",
4549e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, path);
4649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
474a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper
4849e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
494a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper}
504a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper
514a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooperint
52354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_close(const char *file, const int lineno, void (*cleanup_fn) (void),
53354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	   int fildes)
54dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
55dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	int rval;
56dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
57dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = close(fildes);
5849e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
5949e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
6049e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: close(%d) failed",
6149e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, fildes);
6249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
63dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
6449e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
65dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
66dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
67dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooperint
68354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_creat(const char *file, const int lineno, void (*cleanup_fn) (void),
695071db5f55b5558bde144a25f2703c9045ebf13bAlexey Kodanev	   const char *pathname, mode_t mode)
70dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
71dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	int rval;
72dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
73dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = creat(pathname, mode);
7449e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
7549e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
7649e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: creat(%s,0%o) failed",
7749e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, pathname, mode);
7849e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
79dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
8049e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
81dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
82dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
83354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *safe_dirname(const char *file, const int lineno,
84354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		   void (*cleanup_fn) (void), char *path)
85dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
86dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	char *rval;
87dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
88dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = dirname(path);
8949e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == NULL) {
9049e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
9149e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: dirname(%s) failed",
9249e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, path);
9349e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
94dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
9549e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
96dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
97dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
98354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaochar *safe_getcwd(const char *file, const int lineno, void (*cleanup_fn) (void),
99354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		  char *buf, size_t size)
100ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{
101ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	char *rval;
102ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
103ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	rval = getcwd(buf, size);
10449e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == NULL) {
10549e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
10649e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: getcwd(%p,%zu) failed",
10749e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, buf, size);
10849e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
109ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
11049e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
111ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper}
112ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
113354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostruct passwd *safe_getpwnam(const char *file, const int lineno,
114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     void (*cleanup_fn) (void), const char *name)
115ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{
116ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	struct passwd *rval;
117ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
118ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	rval = getpwnam(name);
11949e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == NULL) {
12049e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
12149e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: getpwnam(%s) failed",
12249e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, name);
12349e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
124ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
12549e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
126ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper}
127ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
128817c7822c72e4601021f612ef1a47849077c6980Caspar Zhangint
129354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaosafe_getrusage(const char *file, const int lineno, void (*cleanup_fn) (void),
130354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	       int who, struct rusage *usage)
131817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang{
132817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang	int rval;
133817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang
134817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang	rval = getrusage(who, usage);
13549e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup_fn,
13749e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: getrusage(%d,%p) failed",
13849e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, who, usage);
13949e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
140817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang
141817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang	return rval;
142817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang}
143817c7822c72e4601021f612ef1a47849077c6980Caspar Zhang
144354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid *safe_malloc(const char *file, const int lineno, void (*cleanup_fn) (void),
145354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		  size_t size)
146ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{
147ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	void *rval;
148ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
149ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	rval = malloc(size);
15049e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == NULL) {
15149e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
15249e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: malloc(%zu) failed",
15349e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, size);
15449e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
155ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
15649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
157ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper}
158ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
15949e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_mkdir(const char *file, const int lineno, void (*cleanup_fn) (void),
16049e8615fd07b150891182e202d356384c8c98416Mats Liljegren               const char *pathname, mode_t mode)
1614a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper{
1624a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper	int rval;
1634a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper
1644a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper	rval = mkdir(pathname, mode);
16549e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
16649e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
16749e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: mkdir(%s,0%o) failed",
16849e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, pathname, mode);
16949e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
1704a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper
1714a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper	return (rval);
1724a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper}
1734a3c6582f50eb0ca5dbecd323042ebd89ba809d5Garrett Cooper
17497499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubisint safe_rmdir(const char *file, const int lineno, void (*cleanup_fn) (void),
17597499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis               const char *pathname)
17697499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis{
17797499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis	int rval;
17897499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis
17997499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis	rval = rmdir(pathname);
18097499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis	if (rval == -1) {
18197499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
18297499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis			 "%s:%d: rmdir(%s) failed",
18397499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis			 file, lineno, pathname);
18497499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis	}
18597499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis
18697499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis	return (rval);
18797499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis}
18897499c2c9f06299bd49d3a302edb5607988c95a2Cyril Hrubis
18949e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_munmap(const char *file, const int lineno, void (*cleanup_fn) (void),
19049e8615fd07b150891182e202d356384c8c98416Mats Liljegren                void *addr, size_t length)
191ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{
192ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	int rval;
193ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
194ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	rval = munmap(addr, length);
19549e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
19649e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
19749e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: munmap(%p,%zu) failed",
19849e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, addr, length);
19949e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
200ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
20149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
202ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper}
203ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
20449e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_open(const char *file, const int lineno, void (*cleanup_fn) (void),
20549e8615fd07b150891182e202d356384c8c98416Mats Liljegren              const char *pathname, int oflags, ...)
206dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
207dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	va_list ap;
208dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	int rval;
209dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	mode_t mode;
210dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
211dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	va_start(ap, oflags);
212dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	mode = va_arg(ap, mode_t);
213dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	va_end(ap);
214dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
215dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = open(pathname, oflags, mode);
21649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
21749e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
21849e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: open(%s,%d,0%o) failed",
21949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, pathname, oflags, mode);
22049e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
221dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
22249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
223dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
224dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
22549e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_pipe(const char *file, const int lineno, void (*cleanup_fn) (void),
22649e8615fd07b150891182e202d356384c8c98416Mats Liljegren              int fildes[2])
227dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
228dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	int rval;
229dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
230dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = pipe(fildes);
23149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
23249e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
23349e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: pipe({%d,%d}) failed",
23449e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, fildes[0], fildes[1]);
23549e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
236dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
23749e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
238dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
239dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
24049e8615fd07b150891182e202d356384c8c98416Mats Liljegrenssize_t safe_read(const char *file, const int lineno, void (*cleanup_fn) (void),
24149e8615fd07b150891182e202d356384c8c98416Mats Liljegren                  char len_strict, int fildes, void *buf, size_t nbyte)
242dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
243dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	ssize_t rval;
244dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
245dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = read(fildes, buf, nbyte);
24649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1 || (len_strict && (size_t)rval != nbyte)) {
24749e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
24849e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: read(%d,%p,%zu) failed, returned %zd",
24949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, fildes, buf, nbyte, rval);
25049e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
251dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
25249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
253dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
254dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
25534e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wangssize_t safe_pread(const char *file, const int lineno, void (*cleanup_fn)(void),
25634e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang		   char len_strict, int fildes, void *buf, size_t nbyte,
25734e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang		   off_t offset)
25834e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang{
25934e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang	ssize_t rval;
26034e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang
26134e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang	rval = pread(fildes, buf, nbyte, offset);
26234e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang	if (rval == -1 || (len_strict && (size_t)rval != nbyte)) {
26334e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang		tst_brkm(TBROK | TERRNO, cleanup_fn,
26434e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang			 "%s:%d: read(%d,%p,%zu,%ld) failed, returned %zd",
26534e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang			 file, lineno, fildes, buf, nbyte, offset, rval);
26634e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang	}
26734e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang
26834e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang	return rval;
26934e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang}
27034e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang
27149e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_setegid(const char *file, const int lineno, void (*cleanup_fn) (void),
27249e8615fd07b150891182e202d356384c8c98416Mats Liljegren                 gid_t egid)
273400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper{
274400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper	int rval;
275400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper
276400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper	rval = setegid(egid);
27749e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
27849e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
27949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: setegid(%u) failed",
28049e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, (unsigned) egid);
28149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
282400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper
28349e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
284400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper}
285400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper
28649e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_seteuid(const char *file, const int lineno, void (*cleanup_fn) (void),
28749e8615fd07b150891182e202d356384c8c98416Mats Liljegren                 uid_t euid)
288400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper{
289400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper	int rval;
290400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper
291400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper	rval = seteuid(euid);
29249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
29349e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
29449e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: seteuid(%u) failed",
29549e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, (unsigned) euid);
29649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
297400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper
29849e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
299400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper}
300400c83670c1c02a24c9ed8e13ac9b541548fc455Garrett Cooper
30149e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_setgid(const char *file, const int lineno, void (*cleanup_fn) (void),
30249e8615fd07b150891182e202d356384c8c98416Mats Liljegren                gid_t gid)
303ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{
304ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	int rval;
305ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
306ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	rval = setgid(gid);
30749e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
30849e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
30949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: setgid(%u) failed",
31049e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, (unsigned) gid);
31149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
312ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
31349e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
314ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper}
315ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
31649e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_setuid(const char *file, const int lineno, void (*cleanup_fn) (void),
31749e8615fd07b150891182e202d356384c8c98416Mats Liljegren                uid_t uid)
318ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper{
319ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	int rval;
320ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
321ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper	rval = setuid(uid);
32249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
32349e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
32449e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: setuid(%u) failed",
32549e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, (unsigned) uid);
32649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
327ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
32849e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
329ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper}
330ca435921fcacea4e8fe08d0ea0e88786923a08deGarrett Cooper
33191d6742f731f05f627473cb64513988bdcff618cZeng Linggangint safe_getresuid(const char *file, const int lineno, void (*cleanup_fn)(void),
33291d6742f731f05f627473cb64513988bdcff618cZeng Linggang		   uid_t *ruid, uid_t *euid, uid_t *suid)
33391d6742f731f05f627473cb64513988bdcff618cZeng Linggang{
33491d6742f731f05f627473cb64513988bdcff618cZeng Linggang	int rval;
33591d6742f731f05f627473cb64513988bdcff618cZeng Linggang
33691d6742f731f05f627473cb64513988bdcff618cZeng Linggang	rval = getresuid(ruid, euid, suid);
33791d6742f731f05f627473cb64513988bdcff618cZeng Linggang	if (rval == -1) {
33891d6742f731f05f627473cb64513988bdcff618cZeng Linggang		tst_brkm(TBROK | TERRNO, cleanup_fn,
33991d6742f731f05f627473cb64513988bdcff618cZeng Linggang			 "%s:%d: getresuid(%p, %p, %p) failed",
34091d6742f731f05f627473cb64513988bdcff618cZeng Linggang			 file, lineno, ruid, euid, suid);
34191d6742f731f05f627473cb64513988bdcff618cZeng Linggang	}
34291d6742f731f05f627473cb64513988bdcff618cZeng Linggang
34391d6742f731f05f627473cb64513988bdcff618cZeng Linggang	return rval;
34491d6742f731f05f627473cb64513988bdcff618cZeng Linggang}
34591d6742f731f05f627473cb64513988bdcff618cZeng Linggang
34691d6742f731f05f627473cb64513988bdcff618cZeng Linggangint safe_getresgid(const char *file, const int lineno, void (*cleanup_fn)(void),
34791d6742f731f05f627473cb64513988bdcff618cZeng Linggang		   gid_t *rgid, gid_t *egid, gid_t *sgid)
34891d6742f731f05f627473cb64513988bdcff618cZeng Linggang{
34991d6742f731f05f627473cb64513988bdcff618cZeng Linggang	int rval;
35091d6742f731f05f627473cb64513988bdcff618cZeng Linggang
35191d6742f731f05f627473cb64513988bdcff618cZeng Linggang	rval = getresgid(rgid, egid, sgid);
35291d6742f731f05f627473cb64513988bdcff618cZeng Linggang	if (rval == -1) {
35391d6742f731f05f627473cb64513988bdcff618cZeng Linggang		tst_brkm(TBROK | TERRNO, cleanup_fn,
35491d6742f731f05f627473cb64513988bdcff618cZeng Linggang			 "%s:%d: getresgid(%p, %p, %p) failed",
35591d6742f731f05f627473cb64513988bdcff618cZeng Linggang			 file, lineno, rgid, egid, sgid);
35691d6742f731f05f627473cb64513988bdcff618cZeng Linggang	}
35791d6742f731f05f627473cb64513988bdcff618cZeng Linggang
35891d6742f731f05f627473cb64513988bdcff618cZeng Linggang	return rval;
35991d6742f731f05f627473cb64513988bdcff618cZeng Linggang}
36091d6742f731f05f627473cb64513988bdcff618cZeng Linggang
36149e8615fd07b150891182e202d356384c8c98416Mats Liljegrenint safe_unlink(const char *file, const int lineno, void (*cleanup_fn) (void),
36249e8615fd07b150891182e202d356384c8c98416Mats Liljegren                const char *pathname)
363dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
364dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	int rval;
365dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
366dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = unlink(pathname);
36749e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval == -1) {
36849e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
36949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: unlink(%s) failed",
37049e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, pathname);
37149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
372dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
37349e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
374dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
375dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
376aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
377aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubisint safe_link(const char *file, const int lineno,
378aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis              void (cleanup_fn)(void), const char *oldpath,
379aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis              const char *newpath)
380aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis{
381aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	int rval;
382aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
383aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	rval = link(oldpath, newpath);
384aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
385aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	if (rval == -1) {
386aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
38749e8615fd07b150891182e202d356384c8c98416Mats Liljegren		         "%s:%d: link(%s,%s) failed",
38849e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, oldpath, newpath);
389aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	}
390aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
391aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	return rval;
392aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis}
393aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
394f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanevint safe_linkat(const char *file, const int lineno,
395f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev		void (cleanup_fn)(void), int olddirfd, const char *oldpath,
396f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev		int newdirfd, const char *newpath, int flags)
397f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev{
398f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev	int rval;
399f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev
400f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev	rval = linkat(olddirfd, oldpath, newdirfd, newpath, flags);
401f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev
402f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev	if (rval == -1) {
403f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev		tst_brkm(TBROK | TERRNO, cleanup_fn,
404f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev			 "%s:%d: linkat(%d,%s,%d,%s,%d) failed",
405f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev			 file, lineno, olddirfd, oldpath, newdirfd,
406f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev			 newpath, flags);
407f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev	}
408f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev
409f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev	return rval;
410f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev}
411f3f4d339298def3cc0e6c2508756bcd5661763fdAlexey Kodanev
4128bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanevssize_t safe_readlink(const char *file, const int lineno,
4138bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev		  void (cleanup_fn)(void), const char *path,
4148bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev		  char *buf, size_t bufsize)
4158bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev{
4168bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev	ssize_t rval;
4178bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev
4188bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev	rval = readlink(path, buf, bufsize);
4198bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev
4208bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev	if (rval == -1) {
4218bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev		tst_brkm(TBROK | TERRNO, cleanup_fn,
4228bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev			 "%s:%d: readlink(%s,%p,%zu) failed",
4238bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev			 file, lineno, path, buf, bufsize);
4248bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev	}
4258bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev
4268bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev	return rval;
4278bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev}
4288bbb1d5d21afcb242a4eaf6c643cc77b8ae1df27Alexey Kodanev
429aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubisint safe_symlink(const char *file, const int lineno,
430aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis                 void (cleanup_fn)(void), const char *oldpath,
431aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis                 const char *newpath)
432aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis{
433aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	int rval;
434aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
435aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	rval = symlink(oldpath, newpath);
436aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
437aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	if (rval == -1) {
438aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
43949e8615fd07b150891182e202d356384c8c98416Mats Liljegren		         "%s:%d: symlink(%s,%s) failed",
44049e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, oldpath, newpath);
441aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	}
442aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
443aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis	return rval;
444aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis}
445aede40b89054619fb78cb687cd431070f31f8697Cyril Hrubis
44649e8615fd07b150891182e202d356384c8c98416Mats Liljegrenssize_t safe_write(const char *file, const int lineno, void (cleanup_fn) (void),
44749e8615fd07b150891182e202d356384c8c98416Mats Liljegren                   char len_strict, int fildes, const void *buf, size_t nbyte)
448dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper{
449dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	ssize_t rval;
450dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
451dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper	rval = write(fildes, buf, nbyte);
452f3f10e027a28a941575802980faacd31aa8edf86Guangwen Feng	if (rval == -1 || (len_strict && (size_t)rval != nbyte)) {
45349e8615fd07b150891182e202d356384c8c98416Mats Liljegren		tst_brkm(TBROK | TERRNO, cleanup_fn,
45449e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: write(%d,%p,%zu) failed",
45549e8615fd07b150891182e202d356384c8c98416Mats Liljegren		         file, lineno, fildes, buf, rval);
45649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
457dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper
45849e8615fd07b150891182e202d356384c8c98416Mats Liljegren	return rval;
459dd3f47eb1e4b47f69443a337b920b2621bd635f5Garrett Cooper}
4603f75fe43de08028ae130bce108103e888ade839bCyril Hrubis
46134e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wangssize_t safe_pwrite(const char *file, const int lineno,
46234e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang		    void (cleanup_fn) (void), char len_strict, int fildes,
46334e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang		    const void *buf, size_t nbyte, off_t offset)
46434e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang{
46534e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang	ssize_t rval;
46634e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang
46734e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang	rval = pwrite(fildes, buf, nbyte, offset);
468f3f10e027a28a941575802980faacd31aa8edf86Guangwen Feng	if (rval == -1 || (len_strict && (size_t)rval != nbyte)) {
46934e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang		tst_brkm(TBROK | TERRNO, cleanup_fn,
47034e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang			 "%s:%d: pwrite(%d,%p,%zu,%ld) failed",
47134e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang			 file, lineno, fildes, buf, rval, offset);
47234e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang	}
47334e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang
47434e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang	return rval;
47534e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang}
47634e26ebe61ccb60d5011c25726b4db3420d9168dXiaoguang Wang
477d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhanglong safe_strtol(const char *file, const int lineno,
478354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 void (cleanup_fn) (void), char *str, long min, long max)
479d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang{
480d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang	long rval;
481d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang	char *endptr;
482d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang
483d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang	errno = 0;
484d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang	rval = strtol(str, &endptr, 10);
48549e8615fd07b150891182e202d356384c8c98416Mats Liljegren
486d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang	if ((errno == ERANGE && (rval == LONG_MAX || rval == LONG_MIN))
48749e8615fd07b150891182e202d356384c8c98416Mats Liljegren	    || (errno != 0 && rval == 0)) {
488354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup_fn,
48949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: strtol(%s) failed", file, lineno, str);
49049e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
49149e8615fd07b150891182e202d356384c8c98416Mats Liljegren
49249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (endptr == str || (*endptr != '\0' && *endptr != '\n')) {
493d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang		tst_brkm(TBROK, cleanup_fn,
49449e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: strtol(%s): Invalid value", file, lineno, str);
49549e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
49649e8615fd07b150891182e202d356384c8c98416Mats Liljegren
49749e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval > max || rval < min) {
498d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang		tst_brkm(TBROK, cleanup_fn,
49949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: strtol(%s): %ld is out of range %ld - %ld",
50049e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, str, rval, min, max);
50149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
502d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang
503d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang	return rval;
504d6a1f25137b0ac8704bd08cc4bc8af01cceaca0eCaspar Zhang}
5052b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu
506354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaounsigned long safe_strtoul(const char *file, const int lineno,
507354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			   void (cleanup_fn) (void), char *str,
508354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			   unsigned long min, unsigned long max)
5092b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu{
5102b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu	unsigned long rval;
5112b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu	char *endptr;
5122b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu
5132b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu	errno = 0;
5142b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu	rval = strtoul(str, &endptr, 10);
51549e8615fd07b150891182e202d356384c8c98416Mats Liljegren
5162b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu	if ((errno == ERANGE && rval == ULONG_MAX)
51749e8615fd07b150891182e202d356384c8c98416Mats Liljegren	    || (errno != 0 && rval == 0)) {
518354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_brkm(TBROK | TERRNO, cleanup_fn,
51949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: strtoul(%s) failed", file, lineno, str);
52049e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
52149e8615fd07b150891182e202d356384c8c98416Mats Liljegren
52249e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (rval > max || rval < min) {
5232b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu		tst_brkm(TBROK, cleanup_fn,
52449e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: strtoul(%s): %lu is out of range %lu - %lu",
52549e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, str, rval, min, max);
52649e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
52749e8615fd07b150891182e202d356384c8c98416Mats Liljegren
52849e8615fd07b150891182e202d356384c8c98416Mats Liljegren	if (endptr == str || (*endptr != '\0' && *endptr != '\n')) {
5292b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu		tst_brkm(TBROK, cleanup_fn,
530354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "Invalid value: '%s' at %s:%d", str, file, lineno);
53149e8615fd07b150891182e202d356384c8c98416Mats Liljegren	}
5322b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu
5332b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu	return rval;
5342b73a15ea4c3290589b8197f9d41fe72f5a000fdZhouping Liu}
5353b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao
5363b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gaolong safe_sysconf(const char *file, const int lineno,
537354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		  void (cleanup_fn) (void), int name)
5383b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao{
5393b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao	long rval;
5403b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao	errno = 0;
5413b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao
5423b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao	rval = sysconf(name);
5433b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao
5443b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao	if (rval == -1) {
54549e8615fd07b150891182e202d356384c8c98416Mats Liljegren		if (errno) {
546354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			tst_brkm(TBROK | TERRNO, cleanup_fn,
54749e8615fd07b150891182e202d356384c8c98416Mats Liljegren				 "%s:%d: sysconf(%d) failed",
54849e8615fd07b150891182e202d356384c8c98416Mats Liljegren				 file, lineno, name);
54949e8615fd07b150891182e202d356384c8c98416Mats Liljegren		} else {
55049e8615fd07b150891182e202d356384c8c98416Mats Liljegren			tst_resm(TINFO, "%s:%d: sysconf(%d): "
55149e8615fd07b150891182e202d356384c8c98416Mats Liljegren				 "queried option is not available"
55249e8615fd07b150891182e202d356384c8c98416Mats Liljegren				 " or there is no definite limit",
55349e8615fd07b150891182e202d356384c8c98416Mats Liljegren				 file, lineno, name);
55449e8615fd07b150891182e202d356384c8c98416Mats Liljegren		}
5553b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao	}
5563b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao
5573b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao	return rval;
5583b535a875c5c3d392dc4ffe80df77020f7774526Wanlong Gao}
5591030c9d2c5264e6b1422e8c58ed92f89c66dc51aZeng Linggang
560c45923544542e125a89e420c5ed40388bb20751eCyril Hrubisint safe_chmod(const char *file, const int lineno,
561c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis               void (cleanup_fn)(void), const char *path, mode_t mode)
562c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis{
563c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	int rval;
564c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis
565c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	rval = chmod(path, mode);
566c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis
567c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	if (rval == -1) {
568c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
56949e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: chmod(%s,0%o) failed",
57049e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, path, mode);
571c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	}
572c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis
573c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	return rval;
574c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis}
575c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis
576c45923544542e125a89e420c5ed40388bb20751eCyril Hrubisint safe_fchmod(const char *file, const int lineno,
577c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis                void (cleanup_fn)(void), int fd, mode_t mode)
578c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis{
579c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	int rval;
580c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis
581c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	rval = fchmod(fd, mode);
582c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis
583c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	if (rval == -1) {
584c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
58549e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 "%s:%d: fchmod(%d,0%o) failed",
58649e8615fd07b150891182e202d356384c8c98416Mats Liljegren			 file, lineno, fd, mode);
587c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	}
588c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis
589c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis	return rval;
590c45923544542e125a89e420c5ed40388bb20751eCyril Hrubis}
591f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis
59292a14596c5e157dfbcb610393d4abba4757d9f90Xing Guint safe_chown(const char *file, const int lineno, void (cleanup_fn)(void),
59392a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu			const char *path, uid_t owner, gid_t group)
59492a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu{
59592a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu	int rval;
59692a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu
59792a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu	rval = chown(path, owner, group);
59892a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu
59992a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu	if (rval == -1) {
60092a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu		tst_brkm(TBROK | TERRNO, cleanup_fn,
60192a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu			"%s:%d: chown(%s,%d,%d) failed",
60292a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu			file, lineno, path, owner, group);
60392a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu	}
60492a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu
60592a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu	return rval;
60692a14596c5e157dfbcb610393d4abba4757d9f90Xing Gu}
60734ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis
60834ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubisint safe_fchown(const char *file, const int lineno, void (cleanup_fn)(void),
60934ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis                int fd, uid_t owner, gid_t group)
61034ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis{
61134ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis	int rval;
61234ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis
61334ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis	rval = fchown(fd, owner, group);
61434ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis
61534ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis	if (rval == -1) {
61634ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
61734ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis		         "%s:%d: fchown(%d,%d,%d) failed",
61834ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis			 file, lineno, fd, owner, group);
61934ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis	}
62034ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis
62134ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis	return rval;
62234ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis}
62334ff2279c116038ea302791d4c254665a45dd6aaCyril Hrubis
624f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubispid_t safe_wait(const char *file, const int lineno, void (cleanup_fn)(void),
625f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis                int *status)
626f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis{
627f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	pid_t rval;
628f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis
629f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	rval = wait(status);
630f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	if (rval == -1) {
631f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
632f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis			 "%s:%d: wait(%p) failed",
633f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis			 file, lineno, status);
634f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	}
635f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis
636f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	return rval;
637f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis}
638f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis
639f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubispid_t safe_waitpid(const char *file, const int lineno, void (cleanup_fn)(void),
640f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis                   pid_t pid, int *status, int opts)
641f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis{
642f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	pid_t rval;
643f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis
644f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	rval = waitpid(pid, status, opts);
645f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	if (rval == -1) {
646f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
647f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis			 "%s:%d: waitpid(%d,%p,%d) failed",
648f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis			 file, lineno, pid, status, opts);
649f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	}
650f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis
651f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis	return rval;
652f3e448f8bc5e50d3fcd75cf82042b9515cd4e651Cyril Hrubis}
6535ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang
6545ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggangvoid *safe_memalign(const char *file, const int lineno,
6555ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang		    void (*cleanup_fn) (void), size_t alignment, size_t size)
6565ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang{
6575ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang	void *rval;
6585ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang
6595ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang	rval = memalign(alignment, size);
6605ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang	if (rval == NULL)
6615ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang		tst_brkm(TBROK | TERRNO, cleanup_fn, "memalign failed at %s:%d",
6625ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang			 file, lineno);
6635ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang
6645ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang	return rval;
6655ff25ef0925912ff5f3e3f4b28bc3f5e4690d493Zeng Linggang}
6666deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang
6676deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wangint safe_kill(const char *file, const int lineno, void (cleanup_fn)(void),
6686deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang	      pid_t pid, int sig)
6696deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang{
6706deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang	int rval;
6716deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang
6726deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang	rval = kill(pid, sig);
6736deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang
6746deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang	if (rval == -1) {
6756deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang		tst_brkm(TBROK | TERRNO, cleanup_fn,
6766deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang			 "%s:%d: kill(%d,%s) failed",
6776deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang			 file, lineno, pid, tst_strsig(sig));
6786deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang	}
6796deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang
6806deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang	return rval;
6816deba587802cb96d24068dd2b470dfb3f377f1b0Xiaoguang Wang}
6823a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis
6833a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubisint safe_mkfifo(const char *file, const int lineno,
6843a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis                void (*cleanup_fn)(void), const char *pathname, mode_t mode)
6853a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis{
6863a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis	int rval;
6873a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis
6883a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis	rval = mkfifo(pathname, mode);
6893a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis
6903a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis	if (rval == -1) {
6913a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
6923a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis		         "%s:%d: mkfifo(%s, 0%o) failed",
6933a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis			 file, lineno, pathname, mode);
6943a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis	}
6953a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis
6963a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis	return rval;
6973a150e7b2ba8d17b99a9f495030b826883510468Cyril Hrubis}
698f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang
699f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wangint safe_rename(const char *file, const int lineno, void (*cleanup_fn)(void),
700f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang		const char *oldpath, const char *newpath)
701f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang{
702f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang	int rval;
703f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang
704f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang	rval = rename(oldpath, newpath);
705f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang
706f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang	if (rval == -1) {
707f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang		tst_brkm(TBROK | TERRNO, cleanup_fn,
708f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang			 "%s:%d: rename(%s, %s) failed",
709f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang			 file, lineno, oldpath, newpath);
710f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang	}
711f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang
712f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang	return rval;
713f48552ab6f79bf35472e9d28f3815659bb46fe79Xiaoguang Wang}
7148e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7158e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefkaint safe_mount(const char *file, const int lineno, void (*cleanup_fn)(void),
7168e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	       const char *source, const char *target,
7178e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	       const char *filesystemtype, unsigned long mountflags,
7188e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	       const void *data)
7198e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka{
7208e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	int rval;
7218e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7228e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	rval = mount(source, target, filesystemtype, mountflags, data);
7238e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7248e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	if (rval == -1) {
7258e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka		tst_brkm(TBROK | TERRNO, cleanup_fn,
7268e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka			 "%s:%d: mount(%s, %s, %s, %lu, %p) failed",
7278e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka			 file, lineno, source, target, filesystemtype,
7288e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka			 mountflags, data);
7298e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	}
7308e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7318e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	return rval;
7328e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka}
7338e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7348e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefkaint safe_umount(const char *file, const int lineno, void (*cleanup_fn)(void),
7358e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka		const char *target)
7368e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka{
7378e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	int rval;
7388e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7398e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	rval = umount(target);
7408e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7418e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	if (rval == -1) {
7428e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka		tst_brkm(TBROK | TERRNO, cleanup_fn,
7438e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka			 "%s:%d: umount(%s) failed",
7448e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka			 file, lineno, target);
7458e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	}
7468e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka
7478e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka	return rval;
7488e9db8d3aea9119d9ab9342384a1617943a5a5f4Matus Marhefka}
7499138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7509138a0184105389aad4aeae89dc1331829d7d2cbCyril HrubisDIR* safe_opendir(const char *file, const int lineno, void (cleanup_fn)(void),
7519138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis                  const char *name)
7529138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis{
7539138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	DIR *rval;
7549138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7559138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	rval = opendir(name);
7569138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7579138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	if (!rval) {
7589138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
7599138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis		         "%s:%d: opendir(%s) failed", file, lineno, name);
7609138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	}
7619138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7629138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	return rval;
7639138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis}
7649138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7659138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubisint safe_closedir(const char *file, const int lineno, void (cleanup_fn)(void),
7669138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis                  DIR *dirp)
7679138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis{
7689138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	int rval;
7699138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7709138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	rval = closedir(dirp);
7719138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7729138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	if (rval) {
7739138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
7749138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis		         "%s:%d: closedir(%p) failed", file, lineno, dirp);
7759138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	}
7769138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7779138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	return rval;
7789138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis}
7799138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7809138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubisstruct dirent *safe_readdir(const char *file, const int lineno, void (cleanup_fn)(void),
7819138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis                            DIR *dirp)
7829138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis{
7839138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	struct dirent *rval;
7849138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	int err = errno;
7859138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7869138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	errno = 0;
7879138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	rval = readdir(dirp);
7889138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7899138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	if (!rval && errno) {
7909138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis		tst_brkm(TBROK | TERRNO, cleanup_fn,
7919138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis		         "%s:%d: readdir(%p) failed", file, lineno, dirp);
7929138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	}
7939138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis
7949138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	errno = err;
7959138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis	return rval;
7969138a0184105389aad4aeae89dc1331829d7d2cbCyril Hrubis}
797