Date: Wed, 12 Jun 2019 19:31:27 +0000 (UTC) From: Mariusz Zaborski <oshogbo@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r349002 - head/lib/libcasper/services/cap_fileargs Message-ID: <201906121931.x5CJVRha031779@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: oshogbo Date: Wed Jun 12 19:31:26 2019 New Revision: 349002 URL: https://svnweb.freebsd.org/changeset/base/349002 Log: fileargs: add wrapping/unwrapping functions Those function may be useful to pass fileargs connections around. Modified: head/lib/libcasper/services/cap_fileargs/cap_fileargs.c head/lib/libcasper/services/cap_fileargs/cap_fileargs.h Modified: head/lib/libcasper/services/cap_fileargs/cap_fileargs.c ============================================================================== --- head/lib/libcasper/services/cap_fileargs/cap_fileargs.c Wed Jun 12 19:29:48 2019 (r349001) +++ head/lib/libcasper/services/cap_fileargs/cap_fileargs.c Wed Jun 12 19:31:26 2019 (r349002) @@ -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. */ Modified: head/lib/libcasper/services/cap_fileargs/cap_fileargs.h ============================================================================== --- head/lib/libcasper/services/cap_fileargs/cap_fileargs.h Wed Jun 12 19:29:48 2019 (r349001) +++ head/lib/libcasper/services/cap_fileargs/cap_fileargs.h Wed Jun 12 19:31:26 2019 (r349002) @@ -54,6 +54,9 @@ int fileargs_lstat(fileargs_t *fa, const char *name, s 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, (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_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201906121931.x5CJVRha031779>