Merging upstream version 2.0.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
888be815c6
commit
e4376063b0
521 changed files with 21541 additions and 21644 deletions
|
@ -39,6 +39,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
static argconfig_help_func *help_funcs[MAX_HELP_FUNC] = { NULL };
|
||||
|
||||
|
@ -176,17 +177,8 @@ int argconfig_parse(int argc, char *argv[], const char *program_desc,
|
|||
if (s->option && strlen(s->option)) {
|
||||
long_opts[option_index].name = s->option;
|
||||
long_opts[option_index].has_arg = s->argument_type;
|
||||
|
||||
if (s->argument_type == no_argument
|
||||
&& s->default_value != NULL) {
|
||||
value_addr = (void *)(char *)s->default_value;
|
||||
|
||||
long_opts[option_index].flag = value_addr;
|
||||
long_opts[option_index].val = 1;
|
||||
} else {
|
||||
long_opts[option_index].flag = NULL;
|
||||
long_opts[option_index].val = 0;
|
||||
}
|
||||
long_opts[option_index].flag = NULL;
|
||||
long_opts[option_index].val = 0;
|
||||
}
|
||||
option_index++;
|
||||
}
|
||||
|
@ -219,10 +211,6 @@ int argconfig_parse(int argc, char *argv[], const char *program_desc,
|
|||
}
|
||||
if (option_index == options_count)
|
||||
continue;
|
||||
if (long_opts[option_index].flag) {
|
||||
*(uint8_t *)(long_opts[option_index].flag) = 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
s = &options[option_index];
|
||||
|
@ -282,7 +270,7 @@ int argconfig_parse(int argc, char *argv[], const char *program_desc,
|
|||
}
|
||||
*((uint32_t *) value_addr) = tmp;
|
||||
} else if (s->config_type == CFG_INCREMENT) {
|
||||
(*((int *)value_addr))++;
|
||||
*((int *)value_addr) += 1;
|
||||
} else if (s->config_type == CFG_LONG) {
|
||||
*((unsigned long *)value_addr) = strtoul(optarg, &endptr, 0);
|
||||
if (errno || optarg == endptr) {
|
||||
|
@ -363,6 +351,8 @@ int argconfig_parse(int argc, char *argv[], const char *program_desc,
|
|||
goto out;
|
||||
}
|
||||
*((FILE **) value_addr) = f;
|
||||
} else if (s->config_type == CFG_FLAG) {
|
||||
*((bool *)value_addr) = true;
|
||||
}
|
||||
}
|
||||
free(short_opts);
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
#include <stdarg.h>
|
||||
|
||||
enum argconfig_types {
|
||||
CFG_NONE,
|
||||
CFG_FLAG,
|
||||
CFG_STRING,
|
||||
CFG_INT,
|
||||
CFG_SIZE,
|
||||
|
@ -65,7 +65,7 @@ enum argconfig_types {
|
|||
#define OPT_END() { NULL }
|
||||
|
||||
#define OPT_FLAG(l, s, v, d) \
|
||||
{l, s, NULL, CFG_NONE, v, no_argument, d}
|
||||
{l, s, NULL, CFG_FLAG, v, no_argument, d}
|
||||
|
||||
#define OPT_SUFFIX(l, s, v, d) \
|
||||
{l, s, "IONUM", CFG_LONG_SUFFIX, v, required_argument, d}
|
||||
|
@ -91,12 +91,16 @@ enum argconfig_types {
|
|||
#define OPT_SHRT(l, s, v, d) \
|
||||
{l, s, "NUM", CFG_SHORT, v, required_argument, d}
|
||||
|
||||
#define OPT_INCR(l, s, v, d) \
|
||||
{l, s, "NUM", CFG_INCREMENT, v, no_argument, d}
|
||||
|
||||
#define OPT_STRING(l, s, m, v, d) \
|
||||
{l, s, m, CFG_STRING, v, required_argument, d}
|
||||
|
||||
#define OPT_FMT(l, s, v, d) OPT_STRING(l, s, "FMT", v, d)
|
||||
#define OPT_FILE(l, s, v, d) OPT_STRING(l, s, "FILE", v, d)
|
||||
#define OPT_LIST(l, s, v, d) OPT_STRING(l, s, "LIST", v, d)
|
||||
#define OPT_STR(l, s, v, d) OPT_STRING(l, s, "STRING", v, d)
|
||||
|
||||
struct argconfig_commandline_options {
|
||||
const char *option;
|
||||
|
|
105
util/base64.c
Normal file
105
util/base64.c
Normal file
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
* base64.c - RFC4648-compliant base64 encoding
|
||||
*
|
||||
* Copyright (c) 2020 Hannes Reinecke, SUSE
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
static const char base64_table[65] =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
|
||||
/**
|
||||
* base64_encode() - base64-encode some bytes
|
||||
* @src: the bytes to encode
|
||||
* @srclen: number of bytes to encode
|
||||
* @dst: (output) the base64-encoded string. Not NUL-terminated.
|
||||
*
|
||||
* Encodes the input string using characters from the set [A-Za-z0-9+,].
|
||||
* The encoded string is roughly 4/3 times the size of the input string.
|
||||
*
|
||||
* Return: length of the encoded string
|
||||
*/
|
||||
int base64_encode(const unsigned char *src, int srclen, char *dst)
|
||||
{
|
||||
int i, bits = 0;
|
||||
u_int32_t ac = 0;
|
||||
char *cp = dst;
|
||||
|
||||
for (i = 0; i < srclen; i++) {
|
||||
ac = (ac << 8) | src[i];
|
||||
bits += 8;
|
||||
do {
|
||||
bits -= 6;
|
||||
*cp++ = base64_table[(ac >> bits) & 0x3f];
|
||||
} while (bits >= 6);
|
||||
}
|
||||
if (bits) {
|
||||
*cp++ = base64_table[(ac << (6 - bits)) & 0x3f];
|
||||
bits -= 6;
|
||||
}
|
||||
while (bits < 0) {
|
||||
*cp++ = '=';
|
||||
bits += 2;
|
||||
}
|
||||
|
||||
return cp - dst;
|
||||
}
|
||||
|
||||
/**
|
||||
* base64_decode() - base64-decode some bytes
|
||||
* @src: the base64-encoded string to decode
|
||||
* @len: number of bytes to decode
|
||||
* @dst: (output) the decoded bytes.
|
||||
*
|
||||
* Decodes the base64-encoded bytes @src according to RFC 4648.
|
||||
*
|
||||
* Return: number of decoded bytes
|
||||
*/
|
||||
int base64_decode(const char *src, int srclen, unsigned char *dst)
|
||||
{
|
||||
u_int32_t ac = 0;
|
||||
int i, bits = 0;
|
||||
unsigned char *bp = dst;
|
||||
|
||||
for (i = 0; i < srclen; i++) {
|
||||
const char *p = strchr(base64_table, src[i]);
|
||||
|
||||
if (src[i] == '=') {
|
||||
ac = (ac << 6);
|
||||
bits += 6;
|
||||
if (bits >= 8)
|
||||
bits -= 8;
|
||||
continue;
|
||||
}
|
||||
if (p == NULL || src[i] == 0)
|
||||
return -EINVAL;
|
||||
ac = (ac << 6) | (p - base64_table);
|
||||
bits += 6;
|
||||
if (bits >= 8) {
|
||||
bits -= 8;
|
||||
*bp++ = (unsigned char)(ac >> bits);
|
||||
}
|
||||
}
|
||||
if (ac && ((1 << bits) - 1))
|
||||
return -EAGAIN;
|
||||
|
||||
return bp - dst;
|
||||
}
|
7
util/base64.h
Normal file
7
util/base64.h
Normal file
|
@ -0,0 +1,7 @@
|
|||
#ifndef _BASE64_H
|
||||
#define _BASE64_H
|
||||
|
||||
int base64_encode(const unsigned char *src, int len, char *dst);
|
||||
int base64_decode(const char *src, int len, unsigned char *dst);
|
||||
|
||||
#endif /* _BASE64_H */
|
|
@ -54,6 +54,7 @@ int json_object_add_value_type(struct json_object *obj, const char *name, int ty
|
|||
json_object_add_value_type((obj), name, JSON_TYPE_INTEGER, (long long) (val))
|
||||
#define json_object_add_value_uint(obj, name, val) \
|
||||
json_object_add_value_type((obj), name, JSON_TYPE_UINT, (unsigned long long) (val))
|
||||
#define json_object_add_value_uint64 json_object_add_value_uint
|
||||
#define json_object_add_value_float(obj, name, val) \
|
||||
json_object_add_value_type((obj), name, JSON_TYPE_FLOAT, (val))
|
||||
#define json_object_add_value_string(obj, name, val) \
|
||||
|
|
90
util/log.c
90
util/log.c
|
@ -1,90 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2021 SUSE LLC
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version
|
||||
* 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
* This file implements basic logging functionality.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <syslog.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#define LOG_FUNCNAME 1
|
||||
#include "log.h"
|
||||
#include "cleanup.h"
|
||||
|
||||
#ifndef LOG_CLOCK
|
||||
#define LOG_CLOCK CLOCK_MONOTONIC
|
||||
#endif
|
||||
|
||||
int log_level = DEFAULT_LOGLEVEL;
|
||||
bool log_timestamp;
|
||||
bool log_pid;
|
||||
|
||||
void __attribute__((format(printf, 3, 4)))
|
||||
__msg(int lvl, const char *func, const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
char pidbuf[16];
|
||||
char timebuf[32];
|
||||
static const char *const formats[] = {
|
||||
"%s%s%s",
|
||||
"%s%s%s: ",
|
||||
"%s<%s>%s ",
|
||||
"%s<%s> %s: ",
|
||||
"[%s] %s%s ",
|
||||
"[%s]%s %s: ",
|
||||
"[%s] <%s>%s ",
|
||||
"[%s] <%s> %s: ",
|
||||
};
|
||||
char *header __cleanup__(cleanup_charp) = NULL;
|
||||
char *message __cleanup__(cleanup_charp) = NULL;
|
||||
int idx;
|
||||
|
||||
if (lvl > log_level)
|
||||
return;
|
||||
|
||||
if (log_timestamp) {
|
||||
struct timespec now;
|
||||
|
||||
clock_gettime(LOG_CLOCK, &now);
|
||||
snprintf(timebuf, sizeof(timebuf), "%6ld.%06ld",
|
||||
(long)now.tv_sec, now.tv_nsec / 1000);
|
||||
} else
|
||||
*timebuf = '\0';
|
||||
|
||||
if (log_pid)
|
||||
snprintf(pidbuf, sizeof(pidbuf), "%ld", (long)getpid());
|
||||
else
|
||||
*pidbuf = '\0';
|
||||
|
||||
idx = ((log_timestamp ? 1 : 0) << 2) |
|
||||
((log_pid ? 1 : 0) << 1) | (func ? 1 : 0);
|
||||
|
||||
if (asprintf(&header, formats[idx], timebuf, pidbuf, func ? func : "")
|
||||
== -1)
|
||||
header = NULL;
|
||||
|
||||
va_start(ap, format);
|
||||
if (vasprintf(&message, format, ap) == -1)
|
||||
message = NULL;
|
||||
va_end(ap);
|
||||
|
||||
fprintf(stderr, "%s%s", header ? header : "<error>",
|
||||
message ? message : "<error>");
|
||||
|
||||
}
|
34
util/log.h
34
util/log.h
|
@ -1,34 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2021 Martin Wilck, SUSE LLC
|
||||
* SPDX-License-Identifier: LGPL-2.1-or-newer
|
||||
*/
|
||||
#ifndef _LOG_H
|
||||
#define _LOG_H
|
||||
|
||||
#ifndef MAX_LOGLEVEL
|
||||
# define MAX_LOGLEVEL LOG_DEBUG
|
||||
#endif
|
||||
#ifndef DEFAULT_LOGLEVEL
|
||||
# define DEFAULT_LOGLEVEL LOG_NOTICE
|
||||
#endif
|
||||
|
||||
#if (LOG_FUNCNAME == 1)
|
||||
#define _log_func __func__
|
||||
#else
|
||||
#define _log_func NULL
|
||||
#endif
|
||||
|
||||
extern int log_level;
|
||||
extern bool log_timestamp;
|
||||
extern bool log_pid;
|
||||
|
||||
void __attribute__((format(printf, 3, 4)))
|
||||
__msg(int lvl, const char *func, const char *format, ...);
|
||||
|
||||
#define msg(lvl, format, ...) \
|
||||
do { \
|
||||
if ((lvl) <= MAX_LOGLEVEL) \
|
||||
__msg(lvl, _log_func, format, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#endif /* _LOG_H */
|
8
util/meson.build
Normal file
8
util/meson.build
Normal file
|
@ -0,0 +1,8 @@
|
|||
sources += [
|
||||
'util/argconfig.c',
|
||||
'util/cleanup.c',
|
||||
'util/json.c',
|
||||
'util/parser.c',
|
||||
'util/suffix.c',
|
||||
'util/base64.c',
|
||||
]
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
/**
|
||||
* match_one: - Determines if a string matches a simple pattern
|
||||
* @s: the string to examine for presence of the pattern
|
||||
* @p: the string containing the pattern
|
||||
* @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match
|
||||
* @s: the string to examine for presence of the pattern
|
||||
* @p: the string containing the pattern
|
||||
* @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match
|
||||
* locations.
|
||||
*
|
||||
* Description: Determines if the pattern @p is present in string @s. Can only
|
||||
|
@ -94,12 +94,12 @@ static int match_one(char *s, const char *p, substring_t args[])
|
|||
|
||||
/**
|
||||
* match_token: - Find a token (and optional args) in a string
|
||||
* @s: the string to examine for token/argument pairs
|
||||
* @table: match_table_t describing the set of allowed option tokens and the
|
||||
* arguments that may be associated with them. Must be terminated with a
|
||||
* &struct match_token whose pattern is set to the NULL pointer.
|
||||
* @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match
|
||||
* locations.
|
||||
* @s: the string to examine for token/argument pairs
|
||||
* @table: match_table_t describing the set of allowed option tokens and the
|
||||
* arguments that may be associated with them. Must be terminated with a
|
||||
* &struct match_token whose pattern is set to the NULL pointer.
|
||||
* @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match
|
||||
* locations.
|
||||
*
|
||||
* Description: Detects which if any of a set of token strings has been passed
|
||||
* to it. Tokens can include up to MAX_OPT_ARGS instances of basic c-style
|
||||
|
@ -118,9 +118,9 @@ int match_token(char *s, const match_table_t table, substring_t args[])
|
|||
|
||||
/**
|
||||
* match_number: scan a number in the given base from a substring_t
|
||||
* @s: substring to be scanned
|
||||
* @result: resulting integer on success
|
||||
* @base: base to use when converting string
|
||||
* @s: substring to be scanned
|
||||
* @result: resulting integer on success
|
||||
* @base: base to use when converting string
|
||||
*
|
||||
* Description: Given a &substring_t and a base, attempts to parse the substring
|
||||
* as a number in that base. On success, sets @result to the integer represented
|
||||
|
@ -154,8 +154,8 @@ static int match_number(substring_t *s, int *result, int base)
|
|||
|
||||
/**
|
||||
* match_int: - scan a decimal representation of an integer from a substring_t
|
||||
* @s: substring_t to be scanned
|
||||
* @result: resulting integer on success
|
||||
* @s: substring_t to be scanned
|
||||
* @result: resulting integer on success
|
||||
*
|
||||
* Description: Attempts to parse the &substring_t @s as a decimal integer. On
|
||||
* success, sets @result to the integer represented by the string and returns 0.
|
||||
|
@ -168,8 +168,8 @@ int match_int(substring_t *s, int *result)
|
|||
|
||||
/**
|
||||
* match_octal: - scan an octal representation of an integer from a substring_t
|
||||
* @s: substring_t to be scanned
|
||||
* @result: resulting integer on success
|
||||
* @s: substring_t to be scanned
|
||||
* @result: resulting integer on success
|
||||
*
|
||||
* Description: Attempts to parse the &substring_t @s as an octal integer. On
|
||||
* success, sets @result to the integer represented by the string and returns
|
||||
|
@ -182,8 +182,8 @@ int match_octal(substring_t *s, int *result)
|
|||
|
||||
/**
|
||||
* match_hex: - scan a hex representation of an integer from a substring_t
|
||||
* @s: substring_t to be scanned
|
||||
* @result: resulting integer on success
|
||||
* @s: substring_t to be scanned
|
||||
* @result: resulting integer on success
|
||||
*
|
||||
* Description: Attempts to parse the &substring_t @s as a hexadecimal integer.
|
||||
* On success, sets @result to the integer represented by the string and
|
||||
|
@ -196,8 +196,8 @@ int match_hex(substring_t *s, int *result)
|
|||
|
||||
/**
|
||||
* match_wildcard: - parse if a string matches given wildcard pattern
|
||||
* @pattern: wildcard pattern
|
||||
* @str: the string to be parsed
|
||||
* @pattern: wildcard pattern
|
||||
* @str: the string to be parsed
|
||||
*
|
||||
* Description: Parse the string @str to check if matches wildcard
|
||||
* pattern @pattern. The pattern may contain two type wildcardes:
|
||||
|
@ -246,9 +246,9 @@ bool match_wildcard(const char *pattern, const char *str)
|
|||
|
||||
/**
|
||||
* match_strlcpy: - Copy the characters from a substring_t to a sized buffer
|
||||
* @dest: where to copy to
|
||||
* @src: &substring_t to copy
|
||||
* @size: size of destination buffer
|
||||
* @dest: where to copy to
|
||||
* @src: &substring_t to copy
|
||||
* @size: size of destination buffer
|
||||
*
|
||||
* Description: Copy the characters in &substring_t @src to the
|
||||
* c-style string @dest. Copy no more than @size - 1 characters, plus
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue