1cdd6ea94SMariusz Zaborski /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3cdd6ea94SMariusz Zaborski * 4cdd6ea94SMariusz Zaborski * Copyright (c) 2018 Mariusz Zaborski <oshogbo@FreeBSD.org> 5cdd6ea94SMariusz Zaborski * All rights reserved. 6cdd6ea94SMariusz Zaborski * 7cdd6ea94SMariusz Zaborski * Redistribution and use in source and binary forms, with or without 8cdd6ea94SMariusz Zaborski * modification, are permitted provided that the following conditions 9cdd6ea94SMariusz Zaborski * are met: 10cdd6ea94SMariusz Zaborski * 1. Redistributions of source code must retain the above copyright 11cdd6ea94SMariusz Zaborski * notice, this list of conditions and the following disclaimer. 12cdd6ea94SMariusz Zaborski * 2. Redistributions in binary form must reproduce the above copyright 13cdd6ea94SMariusz Zaborski * notice, this list of conditions and the following disclaimer in the 14cdd6ea94SMariusz Zaborski * documentation and/or other materials provided with the distribution. 15cdd6ea94SMariusz Zaborski * 16cdd6ea94SMariusz Zaborski * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 17cdd6ea94SMariusz Zaborski * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18cdd6ea94SMariusz Zaborski * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19cdd6ea94SMariusz Zaborski * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 20cdd6ea94SMariusz Zaborski * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21cdd6ea94SMariusz Zaborski * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22cdd6ea94SMariusz Zaborski * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23cdd6ea94SMariusz Zaborski * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24cdd6ea94SMariusz Zaborski * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25cdd6ea94SMariusz Zaborski * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26cdd6ea94SMariusz Zaborski * SUCH DAMAGE. 27cdd6ea94SMariusz Zaborski */ 28cdd6ea94SMariusz Zaborski 29cdd6ea94SMariusz Zaborski #ifndef _FILEARGS_H_ 30cdd6ea94SMariusz Zaborski #define _FILEARGS_H_ 31cdd6ea94SMariusz Zaborski 32b30c6ac9SConrad Meyer #include <sys/cdefs.h> 33cdd6ea94SMariusz Zaborski #include <sys/dnv.h> 34cdd6ea94SMariusz Zaborski #include <sys/nv.h> 35cdd6ea94SMariusz Zaborski 36cdd6ea94SMariusz Zaborski #include <stdbool.h> 37cdd6ea94SMariusz Zaborski 387b558caeSEd Maste #define FA_OPEN 1 397b558caeSEd Maste #define FA_LSTAT 2 40dcdad299SMariusz Zaborski #define FA_REALPATH 4 417b558caeSEd Maste 42cdd6ea94SMariusz Zaborski #ifdef WITH_CASPER 43cdd6ea94SMariusz Zaborski struct fileargs; 44cdd6ea94SMariusz Zaborski typedef struct fileargs fileargs_t; 457b558caeSEd Maste struct stat; 46cdd6ea94SMariusz Zaborski 47b30c6ac9SConrad Meyer __BEGIN_DECLS 48b30c6ac9SConrad Meyer 49cdd6ea94SMariusz Zaborski fileargs_t *fileargs_init(int argc, char *argv[], int flags, mode_t mode, 507b558caeSEd Maste cap_rights_t *rightsp, int operations); 51cdd6ea94SMariusz Zaborski fileargs_t *fileargs_cinit(cap_channel_t *cas, int argc, char *argv[], 527b558caeSEd Maste int flags, mode_t mode, cap_rights_t *rightsp, int operations); 53cdd6ea94SMariusz Zaborski fileargs_t *fileargs_initnv(nvlist_t *limits); 54cdd6ea94SMariusz Zaborski fileargs_t *fileargs_cinitnv(cap_channel_t *cas, nvlist_t *limits); 557b558caeSEd Maste int fileargs_lstat(fileargs_t *fa, const char *name, struct stat *sb); 56cdd6ea94SMariusz Zaborski int fileargs_open(fileargs_t *fa, const char *name); 57dcdad299SMariusz Zaborski char *fileargs_realpath(fileargs_t *fa, const char *pathname, 58dcdad299SMariusz Zaborski char *reserved_path); 59cdd6ea94SMariusz Zaborski void fileargs_free(fileargs_t *fa); 60cdd6ea94SMariusz Zaborski FILE *fileargs_fopen(fileargs_t *fa, const char *name, const char *mode); 614b3f7927SMariusz Zaborski 624b3f7927SMariusz Zaborski fileargs_t *fileargs_wrap(cap_channel_t *chan, int fdflags); 634b3f7927SMariusz Zaborski cap_channel_t *fileargs_unwrap(fileargs_t *fa, int *fdflags); 64b30c6ac9SConrad Meyer 65b30c6ac9SConrad Meyer __END_DECLS 66b30c6ac9SConrad Meyer 67cdd6ea94SMariusz Zaborski #else 68cdd6ea94SMariusz Zaborski typedef struct fileargs { 69cdd6ea94SMariusz Zaborski int fa_flags; 70cdd6ea94SMariusz Zaborski mode_t fa_mode; 71cdd6ea94SMariusz Zaborski } fileargs_t; 72cdd6ea94SMariusz Zaborski 73cdd6ea94SMariusz Zaborski static inline fileargs_t * 74cdd6ea94SMariusz Zaborski fileargs_init(int argc __unused, char *argv[] __unused, int flags, mode_t mode, 757b558caeSEd Maste cap_rights_t *rightsp __unused, int operations __unused) { 76cdd6ea94SMariusz Zaborski fileargs_t *fa; 77cdd6ea94SMariusz Zaborski 78cdd6ea94SMariusz Zaborski fa = malloc(sizeof(*fa)); 79cdd6ea94SMariusz Zaborski if (fa != NULL) { 80cdd6ea94SMariusz Zaborski fa->fa_flags = flags; 81cdd6ea94SMariusz Zaborski fa->fa_mode = mode; 82cdd6ea94SMariusz Zaborski } 83cdd6ea94SMariusz Zaborski 84cdd6ea94SMariusz Zaborski return (fa); 85cdd6ea94SMariusz Zaborski } 86cdd6ea94SMariusz Zaborski 87cdd6ea94SMariusz Zaborski static inline fileargs_t * 88cdd6ea94SMariusz Zaborski fileargs_cinit(cap_channel_t *cas __unused, int argc, char *argv[], int flags, 897b558caeSEd Maste mode_t mode, cap_rights_t *rightsp, int operations) 90cdd6ea94SMariusz Zaborski { 91cdd6ea94SMariusz Zaborski 927b558caeSEd Maste return (fileargs_init(argc, argv, flags, mode, rightsp, operations)); 93cdd6ea94SMariusz Zaborski } 94cdd6ea94SMariusz Zaborski 95cdd6ea94SMariusz Zaborski static inline fileargs_t * 96cdd6ea94SMariusz Zaborski fileargs_initnv(nvlist_t *limits) 97cdd6ea94SMariusz Zaborski { 98cdd6ea94SMariusz Zaborski fileargs_t *fa; 99cdd6ea94SMariusz Zaborski 100cdd6ea94SMariusz Zaborski fa = fileargs_init(0, NULL, 101cdd6ea94SMariusz Zaborski nvlist_get_number(limits, "flags"), 102cdd6ea94SMariusz Zaborski dnvlist_get_number(limits, "mode", 0), 1037b558caeSEd Maste NULL, 1047b558caeSEd Maste nvlist_get_number(limits, "operations")); 105cdd6ea94SMariusz Zaborski nvlist_destroy(limits); 106cdd6ea94SMariusz Zaborski 107cdd6ea94SMariusz Zaborski return (fa); 108cdd6ea94SMariusz Zaborski } 109cdd6ea94SMariusz Zaborski 110cdd6ea94SMariusz Zaborski static inline fileargs_t * 111cdd6ea94SMariusz Zaborski fileargs_cinitnv(cap_channel_t *cas __unused, nvlist_t *limits) 112cdd6ea94SMariusz Zaborski { 113cdd6ea94SMariusz Zaborski 114cdd6ea94SMariusz Zaborski return (fileargs_initnv(limits)); 115cdd6ea94SMariusz Zaborski } 116cdd6ea94SMariusz Zaborski 1177b558caeSEd Maste #define fileargs_lstat(fa, name, sb) \ 1187b558caeSEd Maste lstat(name, sb) 119cdd6ea94SMariusz Zaborski #define fileargs_open(fa, name) \ 120cdd6ea94SMariusz Zaborski open(name, fa->fa_flags, fa->fa_mode) 121dcdad299SMariusz Zaborski #define fileargs_realpath(fa, pathname, reserved_path) \ 122dcdad299SMariusz Zaborski realpath(pathname, reserved_path) 123dcdad299SMariusz Zaborski 124d2fd7f28SAdrian Chadd static inline 125d2fd7f28SAdrian Chadd FILE *fileargs_fopen(fileargs_t *fa, const char *name, const char *mode) 126d2fd7f28SAdrian Chadd { 127d2fd7f28SAdrian Chadd (void) fa; 128d2fd7f28SAdrian Chadd return (fopen(name, mode)); 129d2fd7f28SAdrian Chadd } 130cdd6ea94SMariusz Zaborski #define fileargs_free(fa) (free(fa)) 1314b3f7927SMariusz Zaborski 1324b3f7927SMariusz Zaborski static inline fileargs_t * 1334b3f7927SMariusz Zaborski fileargs_wrap(cap_channel_t *chan, int fdflags) 1344b3f7927SMariusz Zaborski { 1354b3f7927SMariusz Zaborski 1364b3f7927SMariusz Zaborski cap_close(chan); 1374b3f7927SMariusz Zaborski return (fileargs_init(0, NULL, fdflags, 0, NULL, 0)); 1384b3f7927SMariusz Zaborski } 1394b3f7927SMariusz Zaborski 1404b3f7927SMariusz Zaborski static inline cap_channel_t * 1414b3f7927SMariusz Zaborski fileargs_unwrap(fileargs_t *fa, int *fdflags) 1424b3f7927SMariusz Zaborski { 1434b3f7927SMariusz Zaborski 1444b3f7927SMariusz Zaborski if (fdflags != NULL) { 1454b3f7927SMariusz Zaborski *fdflags = fa->fa_flags; 1464b3f7927SMariusz Zaborski } 1474b3f7927SMariusz Zaborski fileargs_free(fa); 1484b3f7927SMariusz Zaborski return (cap_init()); 1494b3f7927SMariusz Zaborski } 1504b3f7927SMariusz Zaborski 151cdd6ea94SMariusz Zaborski #endif 152cdd6ea94SMariusz Zaborski 153cdd6ea94SMariusz Zaborski #endif /* !_FILEARGS_H_ */ 154