util: Add open_in_ns() helper
Most of our helpers which need to enter the pasta network namespace are quite specialised. Add one which is rather general - it just open()s a given file in the namespace context and returns the fd back to the main namespace. This will have some future uses. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
17d40d1cb5
commit
4f0b9f91e4
2 changed files with 54 additions and 0 deletions
53
util.c
53
util.c
|
@ -364,6 +364,59 @@ bool ns_is_init(void)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* struct open_in_ns_args - Parameters for do_open_in_ns()
|
||||
* @c: Execution context
|
||||
* @fd: Filled in with return value from open()
|
||||
* @err: Filled in with errno if open() failed
|
||||
* @path: Path to open
|
||||
* @flags: open() flags
|
||||
*/
|
||||
struct open_in_ns_args {
|
||||
const struct ctx *c;
|
||||
int fd;
|
||||
int err;
|
||||
const char *path;
|
||||
int flags;
|
||||
};
|
||||
|
||||
/**
|
||||
* do_open_in_ns() - Enter namespace and open a file
|
||||
* @arg: See struct open_in_ns_args
|
||||
*
|
||||
* Must be called via NS_CALL()
|
||||
*/
|
||||
static int do_open_in_ns(void *arg)
|
||||
{
|
||||
struct open_in_ns_args *a = (struct open_in_ns_args *)arg;
|
||||
|
||||
ns_enter(a->c);
|
||||
|
||||
a->fd = open(a->path, a->flags);
|
||||
a->err = errno;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* open_in_ns() - open() within the pasta namespace
|
||||
* @c: Execution context
|
||||
* @path: Path to open
|
||||
* @flags: open() flags
|
||||
*
|
||||
* Return: fd of open()ed file or -1 on error, errno is set to indicate error
|
||||
*/
|
||||
int open_in_ns(const struct ctx *c, const char *path, int flags)
|
||||
{
|
||||
struct open_in_ns_args arg = {
|
||||
.c = c, .path = path, .flags = flags,
|
||||
};
|
||||
|
||||
NS_CALL(do_open_in_ns, &arg);
|
||||
errno = arg.err;
|
||||
return arg.fd;
|
||||
}
|
||||
|
||||
/**
|
||||
* pid_file() - Write PID to file, if requested to do so, and close it
|
||||
* @fd: Open PID file descriptor, closed on exit, -1 to skip writing it
|
||||
|
|
1
util.h
1
util.h
|
@ -219,6 +219,7 @@ int bitmap_isset(const uint8_t *map, int bit);
|
|||
char *line_read(char *buf, size_t len, int fd);
|
||||
void ns_enter(const struct ctx *c);
|
||||
bool ns_is_init(void);
|
||||
int open_in_ns(const struct ctx *c, const char *path, int flags);
|
||||
void write_pidfile(int fd, pid_t pid);
|
||||
int __daemon(int pidfile_fd, int devnull_fd);
|
||||
int fls(unsigned long x);
|
||||
|
|
Loading…
Reference in a new issue