Introduce channel flags in libcasper.

Instead of passing flags (which describe a type of nvlist)
every send/recv we remember them in channel.
It's enough for use to extract them only during unwrap.
This simplify use of Casper.

Reviewed by:	bruffer@, bcr@ (both man page)
Differential Revision:	https://reviews.freebsd.org/D14196 (man page)
This commit is contained in:
Mariusz Zaborski 2018-02-17 12:22:29 +00:00
parent e4ccf57fdc
commit 4fc0a2791e
20 changed files with 143 additions and 75 deletions

View File

@ -8,7 +8,7 @@ PACKAGE=casper
.if ${MK_CASPER} != "no"
SHLIB= casper
SHLIB_MAJOR= 0
SHLIB_MAJOR= 1
SRCS= libcasper.c
SRCS+= libcasper_impl.c

View File

@ -27,7 +27,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd February 5, 2018
.Dd February 17, 2018
.Dt LIBCASPER 3
.Os
.Sh NAME
@ -53,9 +53,9 @@
.Ft "cap_channel_t *"
.Fn cap_init "void"
.Ft "cap_channel_t *"
.Fn cap_wrap "int sock"
.Fn cap_wrap "int sock" "int flags"
.Ft "int"
.Fn cap_unwrap "cap_channel_t *chan"
.Fn cap_unwrap "cap_channel_t *chan" "int *flags"
.Ft "int"
.Fn cap_sock "const cap_channel_t *chan"
.Ft "cap_channel_t *"
@ -69,9 +69,9 @@
.Ft "int"
.Fn cap_send_nvlist "const cap_channel_t *chan" "const nvlist_t *nvl"
.Ft "nvlist_t *"
.Fn cap_recv_nvlist "const cap_channel_t *chan" "int flags"
.Fn cap_recv_nvlist "const cap_channel_t *chan"
.Ft "nvlist_t *"
.Fn cap_xfer_nvlist "const cap_channel_t *chan" "nvlist_t *nvl" "int flags"
.Fn cap_xfer_nvlist "const cap_channel_t *chan" "nvlist_t *nvl"
.Ft "cap_channel_t *"
.Fn cap_service_open "const cap_channel_t *chan" "const char *name"
.Sh DESCRIPTION
@ -105,6 +105,14 @@ or send over
domain socket as a regular file descriptor and has to be represented as
.Vt cap_channel_t
again.
The
.Fa flags
argument defines the channel behavior.
The supported flags are:
.Bl -ohang -offset indent
.It CASPER_NO_UNIQ
The communication between process and casper uses no unique version of nvlist.
.El
.Pp
The
.Fn cap_unwrap
@ -164,23 +172,11 @@ Most services should provide higher level API.
The
.Fn cap_recv_nvlist
function receives the given nvlist over the given capability.
The
.Fa flags
argument defines what type the top nvlist is expected to be.
If the nvlist flags do not match the flags passed to
.Fn cap_recv_nvlist ,
the nvlist will not be returned.
.Pp
The
.Fn cap_xfer_nvlist
function sends the given nvlist, destroys it and receives new nvlist in
response over the given capability.
The
.Fa flags
argument defines what type the top nvlist is expected to be.
If the nvlist flags do not match the flags passed to
.Fn cap_xfer_nvlist ,
the nvlist will not be returned.
It does not matter if the function succeeds or fails, the nvlist given
for sending will always be destroyed once the function returns.
.Pp

View File

@ -48,6 +48,8 @@ __FBSDID("$FreeBSD$");
#include "libcasper.h"
#include "libcasper_impl.h"
#define CASPER_VALID_FLAGS (CASPER_NO_UNIQ)
/*
* Structure describing communication channel between two separated processes.
*/
@ -62,6 +64,8 @@ struct cap_channel {
int cch_sock;
/* Process descriptor for casper. */
int cch_pd;
/* Flags to communicate with casper. */
int cch_flags;
};
static bool
@ -74,6 +78,13 @@ cap_add_pd(cap_channel_t *chan, int pd)
return (true);
}
int
cap_channel_flags(const cap_channel_t *chan)
{
return (chan->cch_flags);
}
cap_channel_t *
cap_init(void)
{
@ -96,7 +107,7 @@ cap_init(void)
} else if (pid > 0) {
/* Child. */
close(sock[1]);
chan = cap_wrap(sock[0]);
chan = cap_wrap(sock[0], 0);
if (chan == NULL) {
serrno = errno;
close(sock[0]);
@ -118,17 +129,21 @@ cap_init(void)
}
cap_channel_t *
cap_wrap(int sock)
cap_wrap(int sock, int flags)
{
cap_channel_t *chan;
if (!fd_is_valid(sock))
return (NULL);
if ((flags & CASPER_VALID_FLAGS) != flags)
return (NULL);
chan = malloc(sizeof(*chan));
if (chan != NULL) {
chan->cch_sock = sock;
chan->cch_pd = -1;
chan->cch_flags = flags;
chan->cch_magic = CAP_CHANNEL_MAGIC;
}
@ -136,7 +151,7 @@ cap_wrap(int sock)
}
int
cap_unwrap(cap_channel_t *chan)
cap_unwrap(cap_channel_t *chan, int *flags)
{
int sock;
@ -146,6 +161,8 @@ cap_unwrap(cap_channel_t *chan)
sock = chan->cch_sock;
if (chan->cch_pd != -1)
close(chan->cch_pd);
if (flags != NULL)
*flags = chan->cch_flags;
chan->cch_magic = 0;
free(chan);
@ -162,9 +179,9 @@ cap_clone(const cap_channel_t *chan)
assert(chan != NULL);
assert(chan->cch_magic == CAP_CHANNEL_MAGIC);
nvl = nvlist_create(0);
nvl = nvlist_create(channel_nvlist_flags(chan));
nvlist_add_string(nvl, "cmd", "clone");
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL)
return (NULL);
if (nvlist_get_number(nvl, "error") != 0) {
@ -174,7 +191,7 @@ cap_clone(const cap_channel_t *chan)
}
newsock = nvlist_take_descriptor(nvl, "sock");
nvlist_destroy(nvl);
newchan = cap_wrap(newsock);
newchan = cap_wrap(newsock, chan->cch_flags);
if (newchan == NULL) {
int serrno;
@ -216,10 +233,10 @@ cap_limit_set(const cap_channel_t *chan, nvlist_t *limits)
nvlist_t *nvlmsg;
int error;
nvlmsg = nvlist_create(0);
nvlmsg = nvlist_create(channel_nvlist_flags(chan));
nvlist_add_string(nvlmsg, "cmd", "limit_set");
nvlist_add_nvlist(nvlmsg, "limits", limits);
nvlmsg = cap_xfer_nvlist(chan, nvlmsg, 0);
nvlmsg = cap_xfer_nvlist(chan, nvlmsg);
if (nvlmsg == NULL) {
nvlist_destroy(limits);
return (-1);
@ -240,9 +257,9 @@ cap_limit_get(const cap_channel_t *chan, nvlist_t **limitsp)
nvlist_t *nvlmsg;
int error;
nvlmsg = nvlist_create(0);
nvlmsg = nvlist_create(channel_nvlist_flags(chan));
nvlist_add_string(nvlmsg, "cmd", "limit_get");
nvlmsg = cap_xfer_nvlist(chan, nvlmsg, 0);
nvlmsg = cap_xfer_nvlist(chan, nvlmsg);
if (nvlmsg == NULL)
return (-1);
error = (int)nvlist_get_number(nvlmsg, "error");
@ -270,23 +287,25 @@ cap_send_nvlist(const cap_channel_t *chan, const nvlist_t *nvl)
}
nvlist_t *
cap_recv_nvlist(const cap_channel_t *chan, int flags)
cap_recv_nvlist(const cap_channel_t *chan)
{
assert(chan != NULL);
assert(chan->cch_magic == CAP_CHANNEL_MAGIC);
return (nvlist_recv(chan->cch_sock, flags));
return (nvlist_recv(chan->cch_sock,
channel_nvlist_flags(chan)));
}
nvlist_t *
cap_xfer_nvlist(const cap_channel_t *chan, nvlist_t *nvl, int flags)
cap_xfer_nvlist(const cap_channel_t *chan, nvlist_t *nvl)
{
assert(chan != NULL);
assert(chan->cch_magic == CAP_CHANNEL_MAGIC);
return (nvlist_xfer(chan->cch_sock, nvl, flags));
return (nvlist_xfer(chan->cch_sock, nvl,
channel_nvlist_flags(chan)));
}
cap_channel_t *
@ -295,13 +314,14 @@ cap_service_open(const cap_channel_t *chan, const char *name)
cap_channel_t *newchan;
nvlist_t *nvl;
int sock, error;
int flags;
sock = -1;
nvl = nvlist_create(0);
nvl = nvlist_create(channel_nvlist_flags(chan));
nvlist_add_string(nvl, "cmd", "open");
nvlist_add_string(nvl, "service", name);
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL)
return (NULL);
error = (int)nvlist_get_number(nvl, "error");
@ -311,10 +331,11 @@ cap_service_open(const cap_channel_t *chan, const char *name)
return (NULL);
}
sock = nvlist_take_descriptor(nvl, "chanfd");
flags = nvlist_take_number(nvl, "chanflags");
assert(sock >= 0);
nvlist_destroy(nvl);
nvl = NULL;
newchan = cap_wrap(sock);
newchan = cap_wrap(sock, flags);
if (newchan == NULL)
goto fail;
return (newchan);
@ -332,7 +353,7 @@ cap_service_limit(const cap_channel_t *chan, const char * const *names,
nvlist_t *limits;
unsigned int i;
limits = nvlist_create(0);
limits = nvlist_create(channel_nvlist_flags(chan));
for (i = 0; i < nnames; i++)
nvlist_add_null(limits, names[i]);
return (cap_limit_set(chan, limits));

View File

@ -45,6 +45,8 @@
#include <stdlib.h>
#include <unistd.h>
#define CASPER_NO_UNIQ 0x00000001
#ifndef _NVLIST_T_DECLARED
#define _NVLIST_T_DECLARED
struct nvlist;
@ -62,12 +64,36 @@ typedef struct cap_channel cap_channel_t;
#else
struct cap_channel {
int cch_fd;
int cch_flags;
};
typedef struct cap_channel cap_channel_t;
#define CASPER_SUPPORT (0)
#endif /* ! WITH_CASPER */
#endif /* ! _CAP_CHANNEL_T_DECLARED */
#ifdef WITH_CASPER
int cap_channel_flags(const cap_channel_t *chan);
#else
static inline int
cap_channel_flags(const cap_channel_t *chan)
{
return (chan->cch_flags);
}
#endif
static inline int
channel_nvlist_flags(const cap_channel_t *chan)
{
int flags;
flags = 0;
if ((cap_channel_flags(chan) & CASPER_NO_UNIQ) != 0)
flags |= NV_FLAG_NO_UNIQUE;
return (flags);
}
/*
* The functions opens unrestricted communication channel to Casper.
*/
@ -103,16 +129,17 @@ int cap_service_limit(const cap_channel_t *chan,
* The function creates cap_channel_t based on the given socket.
*/
#ifdef WITH_CASPER
cap_channel_t *cap_wrap(int sock);
cap_channel_t *cap_wrap(int sock, int flags);
#else
static inline cap_channel_t *
cap_wrap(int sock)
cap_wrap(int sock, int flags)
{
cap_channel_t *chan;
chan = cap_init();
if (chan != NULL) {
chan->cch_fd = sock;
chan->cch_flags = flags;
}
return (chan);
}
@ -122,7 +149,7 @@ cap_wrap(int sock)
* The function returns communication socket and frees cap_channel_t.
*/
#ifdef WITH_CASPER
int cap_unwrap(cap_channel_t *chan);
int cap_unwrap(cap_channel_t *chan, int *flags);
#else
static inline int
cap_unwrap(cap_channel_t *chan)
@ -160,6 +187,7 @@ cap_clone(const cap_channel_t *chan)
newchan = NULL;
}
}
newchan->cch_flags = chan->cch_flags;
return (newchan);
}
@ -212,7 +240,7 @@ static inline int
cap_limit_get(const cap_channel_t *chan __unused, nvlist_t **limitsp)
{
*limitsp = nvlist_create(0);
*limitsp = nvlist_create(channel_nvlist_flags(chan));
return (0);
}
#endif
@ -230,9 +258,9 @@ int cap_send_nvlist(const cap_channel_t *chan, const nvlist_t *nvl);
* Function receives nvlist over the given capability.
*/
#ifdef WITH_CASPER
nvlist_t *cap_recv_nvlist(const cap_channel_t *chan, int flags);
nvlist_t *cap_recv_nvlist(const cap_channel_t *chan);
#else
#define cap_recv_nvlist(chan, flags) (nvlist_create(flags))
#define cap_recv_nvlist(chan) (nvlist_create(chan->cch_flags))
#endif
/*
@ -240,14 +268,14 @@ nvlist_t *cap_recv_nvlist(const cap_channel_t *chan, int flags);
* response over the given capability.
*/
#ifdef WITH_CASPER
nvlist_t *cap_xfer_nvlist(const cap_channel_t *chan, nvlist_t *nvl, int flags);
nvlist_t *cap_xfer_nvlist(const cap_channel_t *chan, nvlist_t *nvl);
#else
static inline nvlist_t *
cap_xfer_nvlist(const cap_channel_t *chan __unused, nvlist_t *nvl, int flags)
cap_xfer_nvlist(const cap_channel_t *chan, nvlist_t *nvl)
{
nvlist_destroy(nvl);
return (nvlist_create(flags));
return (nvlist_create(channel_nvlist_flags(chan)));
}
#endif

View File

@ -54,6 +54,7 @@ void service_message(struct service *service,
struct service_connection *sconn);
void service_start(struct service *service, int sock, int procfd);
const char *service_name(struct service *service);
int service_get_channel_flags(struct service *service);
/* Private service connection functions. */
struct service_connection *service_connection_add(struct service *service,

View File

@ -201,6 +201,8 @@ casper_command(const char *cmd, const nvlist_t *limits, nvlist_t *nvlin,
nvlist_destroy(nvl);
nvlist_move_descriptor(nvlout, "chanfd", chanfd);
nvlist_add_number(nvlout, "chanflags",
service_get_channel_flags(casserv->cs_service));
return (0);
}

View File

@ -42,8 +42,9 @@ struct nvlist;
typedef struct nvlist nvlist_t;
#endif
#define CASPER_SERVICE_STDIO 0x00000001
#define CASPER_SERVICE_FD 0x00000002
#define CASPER_SERVICE_STDIO 0x00000001
#define CASPER_SERVICE_FD 0x00000002
#define CASPER_SERVICE_NO_UNIQ_LIMITS 0x00000004
typedef int service_limit_func_t(const nvlist_t *, const nvlist_t *);
typedef int service_command_func_t(const char *cmd, const nvlist_t *,

View File

@ -136,7 +136,8 @@ service_connection_add(struct service *service, int sock,
sconn = malloc(sizeof(*sconn));
if (sconn == NULL)
return (NULL);
sconn->sc_chan = cap_wrap(sock);
sconn->sc_chan = cap_wrap(sock,
service_get_channel_flags(service));
if (sconn->sc_chan == NULL) {
serrno = errno;
free(sconn);
@ -149,7 +150,7 @@ service_connection_add(struct service *service, int sock,
sconn->sc_limits = nvlist_clone(limits);
if (sconn->sc_limits == NULL) {
serrno = errno;
(void)cap_unwrap(sconn->sc_chan);
(void)cap_unwrap(sconn->sc_chan, NULL);
free(sconn);
errno = serrno;
return (NULL);
@ -266,16 +267,20 @@ service_message(struct service *service, struct service_connection *sconn)
{
nvlist_t *nvlin, *nvlout;
const char *cmd;
int error;
int error, flags;
nvlin = cap_recv_nvlist(service_connection_get_chan(sconn), 0);
flags = 0;
if ((service->s_flags & CASPER_SERVICE_NO_UNIQ_LIMITS) != 0)
flags = NV_FLAG_NO_UNIQUE;
nvlin = cap_recv_nvlist(service_connection_get_chan(sconn));
if (nvlin == NULL) {
service_connection_remove(service, sconn);
return;
}
error = EDOOFUS;
nvlout = nvlist_create(0);
nvlout = nvlist_create(flags);
cmd = nvlist_get_string(nvlin, "cmd");
if (strcmp(cmd, "limit_set") == 0) {
@ -343,6 +348,20 @@ service_name(struct service *service)
return (service->s_name);
}
int
service_get_channel_flags(struct service *service)
{
int flags;
assert(service->s_magic == SERVICE_MAGIC);
flags = 0;
if ((service->s_flags & CASPER_SERVICE_NO_UNIQ_LIMITS) != 0)
flags |= CASPER_NO_UNIQ;
return (flags);
}
static void
stdnull(void)
{

View File

@ -6,7 +6,7 @@ SHLIBDIR?= /lib/casper
PACKAGE=libcasper
SHLIB_MAJOR= 0
SHLIB_MAJOR= 1
INCSDIR?= ${INCLUDEDIR}/casper
.if ${MK_CASPER} != "no"

View File

@ -139,7 +139,7 @@ cap_gethostbyname2(cap_channel_t *chan, const char *name, int type)
nvlist_add_string(nvl, "cmd", "gethostbyname");
nvlist_add_number(nvl, "family", (uint64_t)type);
nvlist_add_string(nvl, "name", name);
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL) {
h_errno = NO_RECOVERY;
return (NULL);
@ -166,7 +166,7 @@ cap_gethostbyaddr(cap_channel_t *chan, const void *addr, socklen_t len,
nvlist_add_string(nvl, "cmd", "gethostbyaddr");
nvlist_add_binary(nvl, "addr", addr, (size_t)len);
nvlist_add_number(nvl, "family", (uint64_t)type);
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL) {
h_errno = NO_RECOVERY;
return (NULL);
@ -242,7 +242,7 @@ cap_getaddrinfo(cap_channel_t *chan, const char *hostname, const char *servname,
nvlist_add_number(nvl, "hints.ai_protocol",
(uint64_t)hints->ai_protocol);
}
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL)
return (EAI_MEMORY);
if (nvlist_get_number(nvl, "error") != 0) {
@ -292,7 +292,7 @@ cap_getnameinfo(cap_channel_t *chan, const struct sockaddr *sa, socklen_t salen,
nvlist_add_number(nvl, "servlen", (uint64_t)servlen);
nvlist_add_binary(nvl, "sa", sa, (size_t)salen);
nvlist_add_number(nvl, "flags", (uint64_t)flags);
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL)
return (EAI_MEMORY);
if (nvlist_get_number(nvl, "error") != 0) {

View File

@ -6,7 +6,7 @@ SHLIBDIR?= /lib/casper
PACKAGE=libcasper
SHLIB_MAJOR= 0
SHLIB_MAJOR= 1
INCSDIR?= ${INCLUDEDIR}/casper
.if ${MK_CASPER} != "no"

View File

@ -197,7 +197,7 @@ cap_getgrcommon_r(cap_channel_t *chan, const char *cmd, const char *name,
} else {
abort();
}
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL) {
assert(errno != 0);
*result = NULL;
@ -321,7 +321,7 @@ cap_setgroupent(cap_channel_t *chan, int stayopen)
nvl = nvlist_create(0);
nvlist_add_string(nvl, "cmd", "setgroupent");
nvlist_add_bool(nvl, "stayopen", stayopen != 0);
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL)
return (0);
if (nvlist_get_number(nvl, "error") != 0) {
@ -341,7 +341,7 @@ cap_setgrent(cap_channel_t *chan)
nvl = nvlist_create(0);
nvlist_add_string(nvl, "cmd", "setgrent");
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL)
return (0);
if (nvlist_get_number(nvl, "error") != 0) {
@ -362,7 +362,7 @@ cap_endgrent(cap_channel_t *chan)
nvl = nvlist_create(0);
nvlist_add_string(nvl, "cmd", "endgrent");
/* Ignore any errors, we have no way to report them. */
nvlist_destroy(cap_xfer_nvlist(chan, nvl, 0));
nvlist_destroy(cap_xfer_nvlist(chan, nvl));
}
int

View File

@ -6,7 +6,7 @@ SHLIBDIR?= /lib/casper
PACKAGE=libcasper
SHLIB_MAJOR= 0
SHLIB_MAJOR= 1
INCSDIR?= ${INCLUDEDIR}/casper
.if ${MK_CASPER} != "no"

View File

@ -157,7 +157,7 @@ cap_getpwcommon_r(cap_channel_t *chan, const char *cmd, const char *login,
} else {
abort();
}
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL) {
assert(errno != 0);
*result = NULL;
@ -281,7 +281,7 @@ cap_setpassent(cap_channel_t *chan, int stayopen)
nvl = nvlist_create(0);
nvlist_add_string(nvl, "cmd", "setpassent");
nvlist_add_bool(nvl, "stayopen", stayopen != 0);
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL)
return (0);
if (nvlist_get_number(nvl, "error") != 0) {
@ -302,7 +302,7 @@ cap_set_end_pwent(cap_channel_t *chan, const char *cmd)
nvl = nvlist_create(0);
nvlist_add_string(nvl, "cmd", cmd);
/* Ignore any errors, we have no way to report them. */
nvlist_destroy(cap_xfer_nvlist(chan, nvl, 0));
nvlist_destroy(cap_xfer_nvlist(chan, nvl));
}
void

View File

@ -6,7 +6,7 @@ SHLIBDIR?= /lib/casper
PACKAGE=libcasper
SHLIB_MAJOR= 0
SHLIB_MAJOR= 1
INCSDIR?= ${INCLUDEDIR}/casper
.if ${MK_CASPER} != "no"

View File

@ -63,7 +63,7 @@ cap_random_buf(cap_channel_t *chan, void *buf, size_t nbytes)
nvlist_add_string(nvl, "cmd", "generate");
nvlist_add_number(nvl, "size",
(uint64_t)(left > MAXSIZE ? MAXSIZE : left));
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL)
return (-1);
if (nvlist_get_number(nvl, "error") != 0) {

View File

@ -6,7 +6,7 @@ SHLIBDIR?= /lib/casper
PACKAGE=libcasper
SHLIB_MAJOR= 0
SHLIB_MAJOR= 1
INCSDIR?= ${INCLUDEDIR}/casper
.if ${MK_CASPER} != "no"

View File

@ -71,7 +71,7 @@ cap_sysctlbyname(cap_channel_t *chan, const char *name, void *oldp,
nvlist_add_number(nvl, "oldlen", (uint64_t)*oldlenp);
if (newp != NULL)
nvlist_add_binary(nvl, "newp", newp, newlen);
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL)
return (-1);
if (nvlist_get_number(nvl, "error") != 0) {

View File

@ -6,7 +6,7 @@ SHLIBDIR?= /lib/casper
PACKAGE=libcasper
SHLIB_MAJOR= 0
SHLIB_MAJOR= 1
INCSDIR?= ${INCLUDEDIR}/casper
.if ${MK_CASPER} != "no"

View File

@ -69,7 +69,7 @@ cap_vsyslog(cap_channel_t *chan, int priority, const char *fmt, va_list ap)
nvlist_add_string(nvl, "cmd", "vsyslog");
nvlist_add_number(nvl, "priority", priority);
nvlist_add_string(nvl, "message", message);
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL) {
return;
}
@ -88,7 +88,7 @@ cap_openlog(cap_channel_t *chan, const char *ident, int logopt, int facility)
}
nvlist_add_number(nvl, "logopt", logopt);
nvlist_add_number(nvl, "facility", facility);
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL) {
return;
}
@ -102,7 +102,7 @@ cap_closelog(cap_channel_t *chan)
nvl = nvlist_create(0);
nvlist_add_string(nvl, "cmd", "closelog");
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
if (nvl == NULL) {
return;
}
@ -118,7 +118,7 @@ cap_setlogmask(cap_channel_t *chan, int maskpri)
nvl = nvlist_create(0);
nvlist_add_string(nvl, "cmd", "setlogmask");
nvlist_add_number(nvl, "maskpri", maskpri);
nvl = cap_xfer_nvlist(chan, nvl, 0);
nvl = cap_xfer_nvlist(chan, nvl);
omask = nvlist_get_number(nvl, "omask");
nvlist_destroy(nvl);