fileargs: add wrapping/unwrapping functions

Those function may be useful to pass fileargs connections around.
This commit is contained in:
Mariusz Zaborski 2019-06-12 19:31:26 +00:00
parent a802439365
commit 4b3f792718
2 changed files with 57 additions and 1 deletions

View File

@ -424,6 +424,39 @@ fileargs_free(fileargs_t *fa)
free(fa);
}
cap_channel_t *
fileargs_unwrap(fileargs_t *fa, int *flags)
{
cap_channel_t *chan;
if (fa == NULL)
return (NULL);
assert(fa->fa_magic == FILEARGS_MAGIC);
chan = fa->fa_chann;
if (flags != NULL) {
*flags = fa->fa_fdflags;
}
nvlist_destroy(fa->fa_cache);
explicit_bzero(&fa->fa_magic, sizeof(fa->fa_magic));
free(fa);
return (chan);
}
fileargs_t *
fileargs_wrap(cap_channel_t *chan, int fdflags)
{
if (chan == NULL) {
return (NULL);
}
return (fileargs_create(chan, fdflags));
}
/*
* Service functions.
*/

View File

@ -54,6 +54,9 @@ int fileargs_lstat(fileargs_t *fa, const char *name, struct stat *sb);
int fileargs_open(fileargs_t *fa, const char *name);
void fileargs_free(fileargs_t *fa);
FILE *fileargs_fopen(fileargs_t *fa, const char *name, const char *mode);
fileargs_t *fileargs_wrap(cap_channel_t *chan, int fdflags);
cap_channel_t *fileargs_unwrap(fileargs_t *fa, int *fdflags);
#else
typedef struct fileargs {
int fa_flags;
@ -114,7 +117,27 @@ FILE *fileargs_fopen(fileargs_t *fa, const char *name, const char *mode)
(void) fa;
return (fopen(name, mode));
}
#define fileargs_free(fa) (free(fa))
#define fileargs_free(fa) (free(fa))
static inline fileargs_t *
fileargs_wrap(cap_channel_t *chan, int fdflags)
{
cap_close(chan);
return (fileargs_init(0, NULL, fdflags, 0, NULL, 0));
}
static inline cap_channel_t *
fileargs_unwrap(fileargs_t *fa, int *fdflags)
{
if (fdflags != NULL) {
*fdflags = fa->fa_flags;
}
fileargs_free(fa);
return (cap_init());
}
#endif
#endif /* !_FILEARGS_H_ */