Changeset View
Changeset View
Standalone View
Standalone View
lib/libcasper/services/cap_fileargs/cap_fileargs.h
- This file was added.
/*- | |||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD | |||||
* | |||||
emaste: Ought to add a `SPDX-License-Identifier: BSD-2-Clause-FreeBSD` (and to the .c) | |||||
* Copyright (c) 2018 Mariusz Zaborski <oshogbo@FreeBSD.org> | |||||
* All rights reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in the | |||||
* documentation and/or other materials provided with the distribution. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND | |||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE | |||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
* | |||||
* $FreeBSD$ | |||||
*/ | |||||
#ifndef _FILEARGS_H_ | |||||
#define _FILEARGS_H_ | |||||
#include <stdbool.h> | |||||
#ifdef WITH_CASPER | |||||
struct fileargs; | |||||
typedef struct fileargs fileargs_t; | |||||
fileargs_t *fileargs_init(int argc, char *argv[], int flags, mode_t mode, | |||||
cap_rights_t *rightsp); | |||||
fileargs_t *fileargs_cinit(cap_channel_t *cas, int argc, char *argv[], | |||||
int flags, mode_t mode, cap_rights_t *rightsp); | |||||
fileargs_t *fileargs_initnv(nvlist_t *limits); | |||||
fileargs_t *fileargs_cinitnv(cap_channel_t *cas, nvlist_t *limits); | |||||
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); | |||||
Not Done Inline ActionsPerhaps the stubs deserve a comment? emaste: Perhaps the stubs deserve a comment? | |||||
Not Done Inline ActionsNot sure what kind of comment you thinking about? oshogbo: Not sure what kind of comment you thinking about? | |||||
Not Done Inline ActionsIt feels a bit odd to me that the user of this interface is required to know the details of the implementation, e.g., whether fileargs or an nvlist are used to store the descriptors. Couldn't this be hidden behind an opaque type with the nv-or-plain-structure choice as an implementation detail? jonathan: It feels a bit odd to me that the user of this interface is required to know the details of the… | |||||
Not Done Inline ActionsThis is optional function only for optimization purpose. Normally you would use fileargs_init, fileargs_initnv I found usefully when I need to pares somehow argc/argv and I don't want to create extra buffer and copy memory etc... I left all that operation to be handled by nvlist. oshogbo: This is optional function only for optimization purpose. Normally you would use fileargs_init… | |||||
#else | |||||
typedef struct fileargs { | |||||
int fa_flags; | |||||
mode_t fa_mode; | |||||
} fileargs_t; | |||||
static inline fileargs_t * | |||||
fileargs_init(int argc __unused, char *argv[] __unused, int flags, mode_t mode, | |||||
cap_rights_t *rightsp __unused) { | |||||
fileargs_t *fa; | |||||
fa = malloc(sizeof(*fa)); | |||||
if (fa != NULL) { | |||||
fa->fa_flags = flags; | |||||
fa->fa_mode = mode; | |||||
} | |||||
return (fa); | |||||
} | |||||
static inline fileargs_t * | |||||
fileargs_cinit(cap_channel_t *cas __unused, int argc, char *argv[], int flags, | |||||
mode_t mode, cap_rights_t *rightsp) | |||||
{ | |||||
return (fileargs_init(argc, argv, flags, mode, rightsp)); | |||||
} | |||||
static inline fileargs_t * | |||||
fileargs_initnv(nvlist_t *limits) | |||||
{ | |||||
fileargs_t *fa; | |||||
fa = fileargs_init(0, NULL, | |||||
nvlist_get_number(limits, "flags"), | |||||
dnvlist_get_number(limits, "mode", 0), | |||||
emasteUnsubmitted Not Done Inline ActionsIn file included from /scratch/tmp/emaste/freebsd/usr.bin/head/head.c:60: /scratch/tmp/emaste/obj/scratch/tmp/emaste/freebsd/amd64.amd64/tmp/usr/include/casper/cap_fileargs.h:82:6: error: implicit declaration of function 'dnvlist_get_number' is invalid in C99 [-Werror,-Wimplicit-function-declaration] dnvlist_get_number(limits, "mode", 0)); ^ emaste: ```
In file included from /scratch/tmp/emaste/freebsd/usr.bin/head/head.c:60… | |||||
NULL); | |||||
nvlist_destroy(limits); | |||||
return (fa); | |||||
} | |||||
static inline fileargs_t * | |||||
fileargs_cinitnv(cap_channel_t *cas __unused, nvlist_t *limits) | |||||
{ | |||||
return (fileargs_initnv(limits)); | |||||
} | |||||
#define fileargs_open(fa, name) \ | |||||
open(name, fa->fa_flags, fa->fa_mode) | |||||
#define fileargs_fopen(fa, name, mode) \ | |||||
fopen(name, mode) | |||||
#define fileargs_free(fa) (free(fa)) | |||||
#endif | |||||
#endif /* !_FILEARGS_H_ */ |
Ought to add a SPDX-License-Identifier: BSD-2-Clause-FreeBSD (and to the .c)