1
0
Fork 0

Merging upstream version 2.0.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-16 12:15:45 +01:00
parent 888be815c6
commit e4376063b0
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
521 changed files with 21541 additions and 21644 deletions

View file

@ -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);

View file

@ -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
View 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
View 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 */

View file

@ -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) \

View file

@ -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>");
}

View file

@ -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
View file

@ -0,0 +1,8 @@
sources += [
'util/argconfig.c',
'util/cleanup.c',
'util/json.c',
'util/parser.c',
'util/suffix.c',
'util/base64.c',
]

View file

@ -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