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_ */
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to