Files
xen/tools/include/xen-tools/xenstore-common.h
T
Juergen Gross b2126a992f tools/xenstore: replace xs_lib.c with a header
Instead of including the same small C source in multiple binaries from
2 source directories, use a header file with inline functions as a
replacement.

As some of the functions are exported by libxenstore, rename the inline
functions from xs_*() do xenstore_*() and add xs_*() wrappers to
libxenstore.

With that no sources required to build libxenstore are left in
tools/xenstore, so the file COPYING can be removed now.

Signed-off-by: Juergen Gross <jgross@suse.com>
Acked-by: Julien Grall <jgrall@amazon.com>
2023-06-29 22:38:22 +01:00

129 lines
2.8 KiB
C

/* SPDX-License-Identifier: LGPL-2.1-or-later */
/* Common functions for libxenstore, xenstored and xenstore-clients. */
#ifndef __XEN_TOOLS_XENSTORE_COMMON__
#define __XEN_TOOLS_XENSTORE_COMMON__
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <xenstore_lib.h>
static inline const char *xenstore_daemon_rundir(void)
{
char *s = getenv("XENSTORED_RUNDIR");
return s ? s : XEN_RUN_STORED;
}
static inline const char *xenstore_daemon_path(void)
{
static char buf[PATH_MAX];
char *s = getenv("XENSTORED_PATH");
if ( s )
return s;
if ( snprintf(buf, sizeof(buf), "%s/socket", xenstore_daemon_rundir()) >=
PATH_MAX )
return NULL;
return buf;
}
/* Convert strings to permissions. False if a problem. */
static inline bool xenstore_strings_to_perms(struct xs_permissions *perms,
unsigned int num,
const char *strings)
{
const char *p;
char *end;
unsigned int i;
for ( p = strings, i = 0; i < num; i++ )
{
/* "r", "w", or "b" for both. */
switch ( *p )
{
case 'r':
perms[i].perms = XS_PERM_READ;
break;
case 'w':
perms[i].perms = XS_PERM_WRITE;
break;
case 'b':
perms[i].perms = XS_PERM_READ|XS_PERM_WRITE;
break;
case 'n':
perms[i].perms = XS_PERM_NONE;
break;
default:
errno = EINVAL;
return false;
}
p++;
perms[i].id = strtol(p, &end, 0);
if ( *end || !*p )
{
errno = EINVAL;
return false;
}
p = end + 1;
}
return true;
}
/* Convert permissions to a string (up to len MAX_STRLEN(unsigned int)+1). */
static inline bool xenstore_perm_to_string(const struct xs_permissions *perm,
char *buffer, size_t buf_len)
{
switch ( (int)perm->perms & ~XS_PERM_IGNORE )
{
case XS_PERM_WRITE:
*buffer = 'w';
break;
case XS_PERM_READ:
*buffer = 'r';
break;
case XS_PERM_READ|XS_PERM_WRITE:
*buffer = 'b';
break;
case XS_PERM_NONE:
*buffer = 'n';
break;
default:
errno = EINVAL;
return false;
}
snprintf(buffer + 1, buf_len - 1, "%i", (int)perm->id);
return true;
}
/* Given a string and a length, count how many strings (nul terms). */
static inline unsigned int xenstore_count_strings(const char *strings,
unsigned int len)
{
unsigned int num;
const char *p;
for ( p = strings, num = 0; p < strings + len; p++ )
if ( *p == '\0' )
num++;
return num;
}
#endif /* __XEN_TOOLS_XENSTORE_COMMON__ */