GNUnet 0.27.0-17-g14611e095
 
Loading...
Searching...
No Matches
Strings library

Strings and string handling functions, including malloc and string tokenizing. More...

Collaboration diagram for Strings library:

Data Structures

struct  GNUNET_STRINGS_PortPolicy
 
struct  GNUNET_STRINGS_IPv4NetworkPolicy
 IPV4 network in CIDR notation. More...
 
struct  GNUNET_STRINGS_IPv6NetworkPolicy
 network in CIDR notation for IPV6. More...
 

Enumerations

enum  GNUNET_STRINGS_FilenameCheck { GNUNET_STRINGS_CHECK_EXISTS = 0x00000001 , GNUNET_STRINGS_CHECK_IS_DIRECTORY = 0x00000002 , GNUNET_STRINGS_CHECK_IS_LINK = 0x00000004 , GNUNET_STRINGS_CHECK_IS_ABSOLUTE = 0x00000008 }
 Flags for what we should check a file for. More...
 

Functions

enum GNUNET_GenericReturnValue GNUNET_STRINGS_fancy_size_to_bytes (const char *fancy_size, unsigned long long *size)
 Convert a given fancy human-readable size to bytes.
 
enum GNUNET_GenericReturnValue GNUNET_STRINGS_fancy_time_to_relative (const char *fancy_time, struct GNUNET_TIME_Relative *rtime)
 Convert a given fancy human-readable time to our internal representation.
 
char * GNUNET_STRINGS_byte_size_fancy (unsigned long long size)
 Convert a given filesize into a fancy human-readable format.
 
char * GNUNET_STRINGS_conv (const char *input, size_t len, const char *input_charset, const char *output_charset)
 Convert the len characters long character sequence given in input that is in the given input charset to a string in given output charset.
 
char * GNUNET_STRINGS_to_utf8 (const char *input, size_t len, const char *charset)
 Convert the len characters long character sequence given in input that is in the given charset to UTF-8.
 
char * GNUNET_STRINGS_utf8_normalize (const char *input)
 Normalize the utf-8 input string to NFC.
 
char * GNUNET_STRINGS_from_utf8 (const char *input, size_t len, const char *charset)
 Convert the len bytes-long UTF-8 string given in input to the given charset.
 
char * GNUNET_STRINGS_utf8_tolower (const char *input)
 Convert the utf-8 input string to lower case.
 
char * GNUNET_STRINGS_utf8_toupper (const char *input)
 Convert the utf-8 input string to upper case.
 
char * GNUNET_STRINGS_filename_expand (const char *fil)
 Complete filename (a la shell) from abbrevition.
 
size_t GNUNET_STRINGS_buffer_fill (char *buffer, size_t size, unsigned int count,...)
 Fill a buffer of the given size with count 0-terminated strings (given as varargs).
 
unsigned int GNUNET_STRINGS_buffer_tokenize (const char *buffer, size_t size, unsigned int count,...)
 Given a buffer of a given size, find "count" 0-terminated strings in the buffer and assign the count (varargs) of type "const char**" to the locations of the respective strings in the buffer.
 
const char * GNUNET_STRINGS_get_short_name (const char *filename)
 "man basename" Returns a pointer to a part of filename (allocates nothing)!
 
char * GNUNET_STRINGS_data_to_string (const void *data, size_t size, char *out, size_t out_size)
 Convert binary data to ASCII encoding using CrockfordBase32.
 
char * GNUNET_STRINGS_data_to_string_alloc (const void *buf, size_t size)
 Return the base32crockford encoding of the given buffer.
 
enum GNUNET_GenericReturnValue GNUNET_STRINGS_string_to_data (const char *enc, size_t enclen, void *out, size_t out_size)
 Convert CrockfordBase32 encoding back to data.
 
enum GNUNET_GenericReturnValue GNUNET_STRINGS_string_to_data_alloc (const char *enc, size_t enclen, void **out, size_t *out_size)
 Convert CrockfordBase32 encoding back to data.
 
size_t GNUNET_STRINGS_base64_encode (const void *in, size_t len, char **output)
 Encode into Base64.
 
size_t GNUNET_STRINGS_urlencode (size_t len, const char data[static len], char **out)
 url/percent encode (RFC3986).
 
size_t GNUNET_STRINGS_base64url_encode (const void *in, size_t len, char **output)
 Encode into Base64url.
 
size_t GNUNET_STRINGS_base64_decode (const char *data, size_t len, void **output)
 Decode from Base64.
 
size_t GNUNET_STRINGS_base64url_decode (const char *data, size_t len, void **out)
 Decode from Base64url.
 
size_t GNUNET_STRINGS_urldecode (const char *data, size_t len, char **out)
 url/percent encode (RFC3986).
 
enum GNUNET_GenericReturnValue GNUNET_STRINGS_parse_uri (const char *path, char **scheme_part, const char **path_part)
 Parse a path that might be an URI.
 
enum GNUNET_GenericReturnValue GNUNET_STRINGS_path_is_absolute (const char *filename, int can_be_uri, int *r_is_uri, char **r_uri_scheme)
 Check whether filename is absolute or not, and if it's an URI.
 
enum GNUNET_GenericReturnValue GNUNET_STRINGS_check_filename (const char *filename, enum GNUNET_STRINGS_FilenameCheck checks)
 Perform checks on filename.
 
enum GNUNET_GenericReturnValue GNUNET_STRINGS_to_address_ipv6 (const char *zt_addr, size_t addrlen, struct sockaddr_in6 *r_buf)
 Tries to convert zt_addr string to an IPv6 address.
 
enum GNUNET_GenericReturnValue GNUNET_STRINGS_to_address_ipv4 (const char *zt_addr, size_t addrlen, struct sockaddr_in *r_buf)
 Tries to convert zt_addr string to an IPv4 address.
 
size_t GNUNET_STRINGS_parse_socket_addr (const char *addr, uint8_t *af, struct sockaddr **sa)
 Parse an address given as a string into a struct sockaddr.
 
enum GNUNET_GenericReturnValue GNUNET_STRINGS_to_address_ip (const char *addr, uint16_t addrlen, struct sockaddr_storage *r_buf)
 Tries to convert addr string to an IP (v4 or v6) address.
 
size_t GNUNET_strlcpy (char *dst, const char *src, size_t n)
 Like strlcpy but portable.
 
char * GNUNET_STRINGS_get_suffix_from_binary_name (const char *argv0)
 Sometimes we use the binary name to determine which specific test to run.
 
struct GNUNET_STRINGS_IPv4NetworkPolicyGNUNET_STRINGS_parse_ipv4_policy (const char *routeListX)
 Parse an IPv4 network policy.
 
struct GNUNET_STRINGS_IPv6NetworkPolicyGNUNET_STRINGS_parse_ipv6_policy (const char *routeListX)
 Parse an IPv6 network policy.
 

Detailed Description

Strings and string handling functions, including malloc and string tokenizing.

Enumeration Type Documentation

◆ GNUNET_STRINGS_FilenameCheck

Flags for what we should check a file for.

Enumerator
GNUNET_STRINGS_CHECK_EXISTS 

Check that it exists.

GNUNET_STRINGS_CHECK_IS_DIRECTORY 

Check that it is a directory.

GNUNET_STRINGS_CHECK_IS_LINK 

Check that it is a link.

GNUNET_STRINGS_CHECK_IS_ABSOLUTE 

Check that the path is an absolute path.

Definition at line 542 of file gnunet_strings_lib.h.

543{
547 GNUNET_STRINGS_CHECK_EXISTS = 0x00000001,
548
553
557 GNUNET_STRINGS_CHECK_IS_LINK = 0x00000004,
558
563};
@ GNUNET_STRINGS_CHECK_IS_ABSOLUTE
Check that the path is an absolute path.
@ GNUNET_STRINGS_CHECK_IS_DIRECTORY
Check that it is a directory.
@ GNUNET_STRINGS_CHECK_EXISTS
Check that it exists.
@ GNUNET_STRINGS_CHECK_IS_LINK
Check that it is a link.

Function Documentation

◆ GNUNET_STRINGS_fancy_size_to_bytes()

enum GNUNET_GenericReturnValue GNUNET_STRINGS_fancy_size_to_bytes ( const char *  fancy_size,
unsigned long long *  size 
)

Convert a given fancy human-readable size to bytes.

Parameters
fancy_sizehuman readable string (e.g. 1 MB)
sizeset to the size in bytes
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 235 of file strings.c.

237{
238 static const struct ConversionTable table[] =
239 { { "B", 1 },
240 { "KiB", 1024 },
241 { "kB", 1000 },
242 { "MiB", 1024 * 1024 },
243 { "MB", 1000 * 1000 },
244 { "GiB", 1024 * 1024 * 1024 },
245 { "GB", 1000 * 1000 * 1000 },
246 { "TiB", 1024LL * 1024LL * 1024LL * 1024LL },
247 { "TB", 1000LL * 1000LL * 1000LL * 1024LL },
248 { "PiB", 1024LL * 1024LL * 1024LL * 1024LL * 1024LL },
249 { "PB", 1000LL * 1000LL * 1000LL * 1024LL * 1000LL },
250 { "EiB", 1024LL * 1024LL * 1024LL * 1024LL * 1024LL * 1024LL },
251 { "EB", 1000LL * 1000LL * 1000LL * 1024LL * 1000LL * 1000LL },
252 { NULL, 0 } };
253
254 return convert_with_table (fancy_size, table, size);
255}
static struct PeerEntry ** table
Table with our interned peer IDs.
Definition peer.c:56
static unsigned int size
Size of the "table".
Definition peer.c:68
static enum GNUNET_GenericReturnValue convert_with_table(const char *input, const struct ConversionTable *table, unsigned long long *output)
Convert a string of the form "4 X 5 Y" into a numeric value by interpreting "X" and "Y" as units and ...
Definition strings.c:180
Unit conversion table entry for 'convert_with_table'.
Definition strings.c:155

References convert_with_table(), size, and table.

Referenced by GNUNET_CONFIGURATION_get_value_size().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_STRINGS_fancy_time_to_relative()

enum GNUNET_GenericReturnValue GNUNET_STRINGS_fancy_time_to_relative ( const char *  fancy_time,
struct GNUNET_TIME_Relative rtime 
)

Convert a given fancy human-readable time to our internal representation.

Parameters
fancy_timehuman readable string (e.g. 1 minute)
rtimeset to the relative time
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 259 of file strings.c.

261{
262 static const struct ConversionTable table[] =
263 { { "us", 1 },
264 { "ms", 1000 },
265 { "s", 1000 * 1000LL },
266 { "second", 1000 * 1000LL },
267 { "seconds", 1000 * 1000LL },
268 { "\"", 1000 * 1000LL },
269 { "m", 60 * 1000 * 1000LL },
270 { "min", 60 * 1000 * 1000LL },
271 { "minute", 60 * 1000 * 1000LL },
272 { "minutes", 60 * 1000 * 1000LL },
273 { "'", 60 * 1000 * 1000LL },
274 { "h", 60 * 60 * 1000 * 1000LL },
275 { "hour", 60 * 60 * 1000 * 1000LL },
276 { "hours", 60 * 60 * 1000 * 1000LL },
277 { "d", 24 * 60 * 60 * 1000LL * 1000LL },
278 { "day", 24 * 60 * 60 * 1000LL * 1000LL },
279 { "days", 24 * 60 * 60 * 1000LL * 1000LL },
280 { "w", 7 * 24 * 60 * 60 * 1000LL * 1000LL },
281 { "week", 7 * 24 * 60 * 60 * 1000LL * 1000LL },
282 { "weeks", 7 * 24 * 60 * 60 * 1000LL * 1000LL },
283 { "year", 31536000000000LL /* year */ },
284 { "years", 31536000000000LL /* year */ },
285 { "y", 31536000000000LL /* year */ },
286 { "a", 31536000000000LL /* year */ },
287 { NULL, 0 } };
288 int ret;
289 unsigned long long val;
290
291 if (0 == strcasecmp ("forever", fancy_time))
292 {
294 return GNUNET_OK;
295 }
296 ret = convert_with_table (fancy_time, table, &val);
297 rtime->rel_value_us = (uint64_t) val;
298 return ret;
299}
static int ret
Final status code.
Definition gnunet-arm.c:93
@ GNUNET_OK
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
uint64_t rel_value_us
The actual value.

References convert_with_table(), GNUNET_OK, GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_TIME_Relative::rel_value_us, ret, and table.

Referenced by create_did_ego_lockup_cb(), GNUNET_CONFIGURATION_get_value_time(), parse_expiration(), parse_expiration(), run(), set_relative_time(), and set_timetravel_time().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_STRINGS_byte_size_fancy()

char * GNUNET_STRINGS_byte_size_fancy ( unsigned long long  size)

Convert a given filesize into a fancy human-readable format.

Parameters
sizenumber of bytes
Returns
fancy representation of the size (possibly rounded) for humans

Definition at line 105 of file strings.c.

106{
107 const char *unit = /* size unit */ "b";
108 char *ret;
109
110 if (size > 5 * 1024)
111 {
112 size = size / 1024;
113 unit = "KiB";
114 if (size > 5 * 1024)
115 {
116 size = size / 1024;
117 unit = "MiB";
118 if (size > 5 * 1024)
119 {
120 size = size / 1024;
121 unit = "GiB";
122 if (size > 5 * 1024)
123 {
124 size = size / 1024;
125 unit = "TiB";
126 }
127 }
128 }
129 }
130 ret = GNUNET_malloc (32);
131 GNUNET_snprintf (ret, 32, "%llu %s", size, unit);
132 return ret;
133}
int GNUNET_snprintf(char *buf, size_t size, const char *format,...) __attribute__((format(printf
Like snprintf, just aborts if the buffer is of insufficient size.
#define GNUNET_malloc(size)
Wrapper around malloc.

References GNUNET_malloc, GNUNET_snprintf(), ret, and size.

Referenced by progress_cb(), and publish_inspector().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_STRINGS_conv()

char * GNUNET_STRINGS_conv ( const char *  input,
size_t  len,
const char *  input_charset,
const char *  output_charset 
)

Convert the len characters long character sequence given in input that is in the given input charset to a string in given output charset.

Parameters
inputinput string
lennumber of bytes in input
input_charsetcharacter set used for input
output_charsetdesired character set for the return value
Returns
the converted string (0-terminated), if conversion fails, a copy of the original string is returned.

Definition at line 374 of file strings.c.

378{
379 char *ret;
380 uint8_t *u8_string;
381 char *encoded_string;
382 size_t u8_string_length;
383 size_t encoded_string_length;
384
385 u8_string = u8_conv_from_encoding (input_charset,
386 iconveh_error,
387 input,
388 len,
389 NULL,
390 NULL,
391 &u8_string_length);
392 if (NULL == u8_string)
393 {
394 LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "u8_conv_from_encoding");
395 goto fail;
396 }
397 if (0 == strcmp (output_charset, "UTF-8"))
398 {
399 ret = GNUNET_malloc (u8_string_length + 1);
400 GNUNET_memcpy (ret, u8_string, u8_string_length);
401 ret[u8_string_length] = '\0';
402 free (u8_string);
403 return ret;
404 }
405 encoded_string = u8_conv_to_encoding (output_charset,
406 iconveh_error,
407 u8_string,
408 u8_string_length,
409 NULL,
410 NULL,
411 &encoded_string_length);
412 free (u8_string);
413 if (NULL == encoded_string)
414 {
415 LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "u8_conv_to_encoding");
416 goto fail;
417 }
418 ret = GNUNET_malloc (encoded_string_length + 1);
419 GNUNET_memcpy (ret, encoded_string, encoded_string_length);
420 ret[encoded_string_length] = '\0';
421 free (encoded_string);
422 return ret;
423fail:
425 _ ("Character sets requested were `%s'->`%s'\n"),
426 "UTF-8",
427 output_charset);
428 ret = GNUNET_malloc (len + 1);
429 GNUNET_memcpy (ret, input, len);
430 ret[len] = '\0';
431 return ret;
432}
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
@ GNUNET_ERROR_TYPE_WARNING
#define _(String)
GNU gettext support macro.
Definition platform.h:179
#define LOG(kind,...)
Definition strings.c:36
#define LOG_STRERROR(kind, syscall)
Definition strings.c:38

References _, GNUNET_ERROR_TYPE_WARNING, GNUNET_malloc, GNUNET_memcpy, LOG, LOG_STRERROR, and ret.

Referenced by GNUNET_STRINGS_from_utf8(), and GNUNET_STRINGS_to_utf8().

Here is the caller graph for this function:

◆ GNUNET_STRINGS_to_utf8()

char * GNUNET_STRINGS_to_utf8 ( const char *  input,
size_t  len,
const char *  charset 
)

Convert the len characters long character sequence given in input that is in the given charset to UTF-8.

Parameters
inputthe input string (not necessarily 0-terminated)
lenthe number of bytes in the input
charsetcharacter set to convert from
Returns
the converted string (0-terminated)

Definition at line 436 of file strings.c.

439{
440 return GNUNET_STRINGS_conv (input,
441 len,
442 charset,
443 "UTF-8");
444}
char * GNUNET_STRINGS_conv(const char *input, size_t len, const char *input_charset, const char *output_charset)
Convert the len characters long character sequence given in input that is in the given input charset ...
Definition strings.c:374

References GNUNET_STRINGS_conv().

Here is the call graph for this function:

◆ GNUNET_STRINGS_utf8_normalize()

char * GNUNET_STRINGS_utf8_normalize ( const char *  input)

Normalize the utf-8 input string to NFC.

Parameters
inputinput string
Returns
result (freshly allocated) or NULL on error.

Definition at line 460 of file strings.c.

461{
462 uint8_t *tmp;
463 size_t len;
464 char *output;
465 tmp = u8_normalize (UNINORM_NFC,
466 (uint8_t *) input,
467 strlen ((char*) input),
468 NULL,
469 &len);
470 if (NULL == tmp)
471 return NULL;
472 output = GNUNET_malloc (len + 1);
473 GNUNET_memcpy (output, tmp, len);
474 output[len] = '\0';
475 free (tmp);
476 return output;
477}

References GNUNET_malloc, and GNUNET_memcpy.

Referenced by GNUNET_GNSRECORD_string_normalize().

Here is the caller graph for this function:

◆ GNUNET_STRINGS_from_utf8()

char * GNUNET_STRINGS_from_utf8 ( const char *  input,
size_t  len,
const char *  charset 
)

Convert the len bytes-long UTF-8 string given in input to the given charset.

Parameters
inputthe input string (not necessarily 0-terminated)
lenthe number of bytes in the input
charsetcharacter set to convert to
Returns
the converted string (0-terminated), if conversion fails, a copy of the original string is returned.

Definition at line 448 of file strings.c.

451{
452 return GNUNET_STRINGS_conv (input,
453 len,
454 "UTF-8",
455 charset);
456}

References GNUNET_STRINGS_conv().

Here is the call graph for this function:

◆ GNUNET_STRINGS_utf8_tolower()

char * GNUNET_STRINGS_utf8_tolower ( const char *  input)

Convert the utf-8 input string to lower case.

Parameters
inputinput string
Returns
NULL on error

Definition at line 481 of file strings.c.

482{
483 uint8_t *tmp_in;
484 size_t len;
485 char *ret;
486
487 tmp_in = u8_tolower ((uint8_t *) input,
488 strlen ((char *) input),
489 NULL,
490 UNINORM_NFD,
491 NULL,
492 &len);
493
494 if (NULL == tmp_in)
495 return NULL;
496 ret = GNUNET_malloc (len + 1);
497 memcpy (ret,
498 tmp_in,
499 len);
500 free (tmp_in);
501 return ret;
502}

References GNUNET_malloc, and ret.

Referenced by ego_create(), GNUNET_RECLAIM_attribute_new(), GNUNET_RECLAIM_credential_new(), handle_collect(), handle_create_message(), handle_delete_message(), handle_rename_message(), handle_verify(), header_iterator(), and store_handle_encryption_key().

Here is the caller graph for this function:

◆ GNUNET_STRINGS_utf8_toupper()

char * GNUNET_STRINGS_utf8_toupper ( const char *  input)

Convert the utf-8 input string to upper case.

Parameters
inputinput string
Returns
NULL on error

Definition at line 506 of file strings.c.

507{
508 uint8_t *tmp_in;
509 size_t len;
510 char *ret;
511
512 tmp_in = u8_toupper ((uint8_t *) input,
513 strlen ((char *) input),
514 NULL,
515 UNINORM_NFD,
516 NULL,
517 &len);
518
519 if (NULL == tmp_in)
520 return NULL;
521 ret = GNUNET_malloc (len + 1);
522 memcpy (ret,
523 tmp_in,
524 len);
525 free (tmp_in);
526 return ret;
527}

References GNUNET_malloc, and ret.

Referenced by GNUNET_CRYPTO_hash_from_string2(), and GNUNET_HOSTLIST_client_start().

Here is the caller graph for this function:

◆ GNUNET_STRINGS_filename_expand()

char * GNUNET_STRINGS_filename_expand ( const char *  fil)

Complete filename (a la shell) from abbrevition.

Parameters
filthe name of the file, may contain ~/ or be relative to the current directory
Returns
the full file name, NULL is returned on error

Definition at line 531 of file strings.c.

532{
533 char *buffer;
534 size_t len;
535 char *fm;
536 const char *fil_ptr;
537
538 if (NULL == fil)
539 return NULL;
540
541 if (fil[0] == DIR_SEPARATOR)
542 /* absolute path, just copy */
543 return GNUNET_strdup (fil);
544 if (fil[0] == '~')
545 {
546 fm = getenv ("HOME");
547 if (fm == NULL)
548 {
550 _ ("Failed to expand `$HOME': environment variable `HOME' not set"));
551 return NULL;
552 }
553 fm = GNUNET_strdup (fm);
554 /* do not copy '~' */
555 fil_ptr = fil + 1;
556
557 /* skip over dir separator to be consistent */
558 if (fil_ptr[0] == DIR_SEPARATOR)
559 fil_ptr++;
560 }
561 else
562 {
563 /* relative path */
564 fil_ptr = fil;
565 len = 512;
566 fm = NULL;
567 while (1)
568 {
569 buffer = GNUNET_malloc (len);
570 if (NULL != getcwd (buffer,
571 len))
572 {
573 fm = buffer;
574 break;
575 }
576 if ( (errno == ERANGE) &&
577 (len < 1024 * 1024 * 4) )
578 {
579 len *= 2;
580 GNUNET_free (buffer);
581 continue;
582 }
583 GNUNET_free (buffer);
584 break;
585 }
586 if (NULL == fm)
587 {
589 "getcwd");
590 buffer = getenv ("PWD"); /* alternative */
591 if (buffer != NULL)
592 fm = GNUNET_strdup (buffer);
593 }
594 if (NULL == fm)
595 fm = GNUNET_strdup ("./"); /* give up */
596 }
597 GNUNET_asprintf (&buffer,
598 "%s%s%s",
599 fm,
600 (fm[strlen (fm) - 1] == DIR_SEPARATOR)
601 ? ""
603 fil_ptr);
604 GNUNET_free (fm);
605 return buffer;
606}
char * getenv()
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_free(ptr)
Wrapper around free.
#define DIR_SEPARATOR
Definition platform.h:166
#define DIR_SEPARATOR_STR
Definition platform.h:167

References _, DIR_SEPARATOR, DIR_SEPARATOR_STR, getenv(), GNUNET_asprintf(), GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_malloc, GNUNET_strdup, LOG, and LOG_STRERROR.

Referenced by check_client_index_start(), file_test_internal(), GNUNET_CONFIGURATION_get_value_filename(), GNUNET_CONFIGURATION_load(), GNUNET_CONFIGURATION_parse(), GNUNET_CONFIGURATION_write(), GNUNET_DISK_directory_create(), GNUNET_DISK_directory_create_for_file(), GNUNET_DISK_directory_scan(), GNUNET_DISK_file_open(), GNUNET_FS_directory_scan_start(), GNUNET_FS_make_file_reader_context_(), GNUNET_log_setup(), handle_client_index_start(), handle_inline(), hash_for_index_cb(), print_filename_option(), and set_filename().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_STRINGS_buffer_fill()

size_t GNUNET_STRINGS_buffer_fill ( char *  buffer,
size_t  size,
unsigned int  count,
  ... 
)

Fill a buffer of the given size with count 0-terminated strings (given as varargs).

If "buffer" is NULL, only compute the amount of space required (sum of "strlen(arg)+1").

Unlike using "snprintf" with "%s", this function will add 0-terminators after each string. The "GNUNET_string_buffer_tokenize" function can be used to parse the buffer back into individual strings.

Parameters
bufferthe buffer to fill with strings, can be NULL in which case only the necessary amount of space will be calculated
sizenumber of bytes available in buffer
countnumber of strings that follow
...count 0-terminated strings to copy to buffer
Returns
number of bytes written to the buffer (or number of bytes that would have been written)

Definition at line 43 of file strings.c.

46{
47 size_t needed;
48 va_list ap;
49
50 needed = 0;
51 va_start (ap, count);
52 while (count > 0)
53 {
54 const char *s = va_arg (ap, const char *);
55 size_t slen = strlen (s) + 1;
56
57 GNUNET_assert (slen <= size - needed);
58 if (NULL != buffer)
59 GNUNET_memcpy (&buffer[needed],
60 s,
61 slen);
62 needed += slen;
63 count--;
64 }
65 va_end (ap);
66 return needed;
67}
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.

References GNUNET_assert, GNUNET_memcpy, and size.

Referenced by save(), transmit(), transmit_get(), transmit_set(), and transmit_watch().

Here is the caller graph for this function:

◆ GNUNET_STRINGS_buffer_tokenize()

unsigned int GNUNET_STRINGS_buffer_tokenize ( const char *  buffer,
size_t  size,
unsigned int  count,
  ... 
)

Given a buffer of a given size, find "count" 0-terminated strings in the buffer and assign the count (varargs) of type "const char**" to the locations of the respective strings in the buffer.

Parameters
bufferthe buffer to parse
sizesize of the buffer
countnumber of strings to locate
...pointers to where to store the strings
Returns
offset of the character after the last 0-termination in the buffer, or 0 on error.

Definition at line 71 of file strings.c.

75{
76 unsigned int start;
77 unsigned int needed;
78 const char **r;
79 va_list ap;
80
81 needed = 0;
82 va_start (ap, count);
83 while (count > 0)
84 {
85 r = va_arg (ap, const char **);
86
87 start = needed;
88 while ((needed < size) && (buffer[needed] != '\0'))
89 needed++;
90 if (needed == size)
91 {
92 va_end (ap);
93 return 0; /* error */
94 }
95 *r = &buffer[start];
96 needed++; /* skip 0-termination */
97 count--;
98 }
99 va_end (ap);
100 return needed;
101}
static int start
Set if we are to start default services (including ARM).
Definition gnunet-arm.c:38

References size, and start.

Referenced by check_get(), check_set(), check_statistics_value(), check_watch(), handle_get(), handle_set(), handle_statistics_value(), handle_watch(), and process_sblock().

Here is the caller graph for this function:

◆ GNUNET_STRINGS_get_short_name()

const char * GNUNET_STRINGS_get_short_name ( const char *  filename)

"man basename" Returns a pointer to a part of filename (allocates nothing)!

Parameters
filenamefilename to extract basename from
Returns
short (base) name of the file (that is, everything following the last directory separator in filename. If filename ends with a directory separator, the result will be a zero-length string. If filename has no directory separators, the result is filename itself.

Definition at line 694 of file strings.c.

695{
696 const char *short_fn = filename;
697 const char *ss;
698
699 while (NULL != (ss = strstr (short_fn, DIR_SEPARATOR_STR)) && (ss[1] != '\0'))
700 short_fn = 1 + ss;
701 return short_fn;
702}
static char * filename

References DIR_SEPARATOR_STR, and filename.

Referenced by expand_tree(), iter_check_config(), and iter_testbed_path().

Here is the caller graph for this function:

◆ GNUNET_STRINGS_data_to_string()

char * GNUNET_STRINGS_data_to_string ( const void *  data,
size_t  size,
char *  out,
size_t  out_size 
)

Convert binary data to ASCII encoding using CrockfordBase32.

Does not append 0-terminator, but returns a pointer to the place where it should be placed, if needed.

Parameters
datadata to encode
sizesize of data (in bytes)
outbuffer to fill
out_sizesize of the buffer. Must be large enough to hold ((size*8) + (((size*8) % 5) > 0 ? 5 - ((size*8) % 5) : 0)) / 5
Returns
pointer to the next byte in 'out' or NULL on error.

32 characters for encoding

Definition at line 763 of file strings.c.

767{
771 static const char *encTable__ = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
772 unsigned int wpos;
773 unsigned int rpos;
774 unsigned int bits;
775 unsigned int vbit;
776 const unsigned char *udata;
777
778 GNUNET_assert (size < SIZE_MAX / 8 - 4);
779 udata = data;
780 if (out_size < (size * 8 + 4) / 5)
781 {
782 GNUNET_break (0);
783 return NULL;
784 }
785 vbit = 0;
786 wpos = 0;
787 rpos = 0;
788 bits = 0;
789 while ((rpos < size) || (vbit > 0))
790 {
791 if ((rpos < size) && (vbit < 5))
792 {
793 bits = (bits << 8) | udata[rpos++]; /* eat 8 more bits */
794 vbit += 8;
795 }
796 if (vbit < 5)
797 {
798 bits <<= (5 - vbit); /* zero-padding */
799 GNUNET_assert (vbit == ((size * 8) % 5));
800 vbit = 5;
801 }
802 if (wpos >= out_size)
803 {
804 GNUNET_break (0);
805 return NULL;
806 }
807 out[wpos++] = encTable__[(bits >> (vbit - 5)) & 31];
808 vbit -= 5;
809 }
810 GNUNET_assert (0 == vbit);
811 if (wpos < out_size)
812 out[wpos] = '\0';
813 return &out[wpos];
814}
static char * data
The data to insert into the dht.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
#define SIZE_MAX
Definition platform.h:209

References data, GNUNET_assert, GNUNET_break, size, and SIZE_MAX.

Referenced by auth_key_to_string(), GNUNET_buffer_write_data_encoded(), GNUNET_CRYPTO_ecdsa_private_key_to_string(), GNUNET_CRYPTO_ecdsa_public_key_to_string(), GNUNET_CRYPTO_eddsa_private_key_to_string(), GNUNET_CRYPTO_eddsa_public_key_to_string(), GNUNET_CRYPTO_hash_to_enc(), GNUNET_GNSRECORD_z2s(), GNUNET_PQ_event_notify(), GNUNET_sh2s(), GNUNET_STRINGS_data_to_string_alloc(), GNUNET_uuid2s(), output_message(), print_examples_ecdh(), run_edkey(), run_pkey(), run_with_key(), sh_to_channel(), uri_loc_to_string(), and uri_sks_to_string().

Here is the caller graph for this function:

◆ GNUNET_STRINGS_data_to_string_alloc()

char * GNUNET_STRINGS_data_to_string_alloc ( const void *  buf,
size_t  size 
)

Return the base32crockford encoding of the given buffer.

The returned string will be freshly allocated, and must be free'd with GNUNET_free().

Parameters
bufbuffer with data
sizesize of the buffer buf
Returns
freshly allocated, null-terminated string

Definition at line 818 of file strings.c.

819{
820 char *str_buf;
821 size_t len = size * 8;
822 char *end;
823
824 if (len % 5 > 0)
825 len += 5 - len % 5;
826 len /= 5;
827 str_buf = GNUNET_malloc (len + 1);
829 size,
830 str_buf,
831 len);
832 if (NULL == end)
833 {
834 GNUNET_free (str_buf);
835 return NULL;
836 }
837 *end = '\0';
838 return str_buf;
839}
static int end
Set if we are to shutdown all services (including ARM).
Definition gnunet-arm.c:33
char * GNUNET_STRINGS_data_to_string(const void *data, size_t size, char *out, size_t out_size)
Convert binary data to ASCII encoding using CrockfordBase32.
Definition strings.c:763

References end, GNUNET_free, GNUNET_malloc, GNUNET_STRINGS_data_to_string(), and size.

Referenced by attr_collect(), attr_store_task(), conversation_value_to_string(), cred_collect(), cred_iter_cb(), cred_store_task(), d2j(), generate_id_token_body(), generate_userinfo_json(), GNUNET_b2s(), GNUNET_CRYPTO_blindable_private_key_to_string(), GNUNET_CRYPTO_blindable_public_key_to_string(), GNUNET_HELLO_build_url(), GNUNET_HELLO_parser_to_url(), GNUNET_JSON_from_data(), handle_attribute_delete_message(), handle_credential_delete_message(), issue_ticket(), iter_cb(), lookup_authz_cb(), main(), messenger_value_to_string(), move_attr_finished(), move_attrs(), oidc_ticket_issue_cb(), process_attrs(), process_record(), purge_attributes(), run(), rvk_move_attr_cb(), save_member(), save_member_session(), save_operation(), setup_job_headers(), value_to_string(), and write_encrypted_message().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_STRINGS_string_to_data()

enum GNUNET_GenericReturnValue GNUNET_STRINGS_string_to_data ( const char *  enc,
size_t  enclen,
void *  out,
size_t  out_size 
)

Convert CrockfordBase32 encoding back to data.

out_size must match exactly the size of the data before it was encoded.

Parameters
encthe encoding
enclennumber of characters in enc (without 0-terminator, which can be missing)
outlocation where to store the decoded data
out_sizesize of the output buffer out
Returns
GNUNET_OK on success, GNUNET_SYSERR if result has the wrong encoding

Definition at line 843 of file strings.c.

847{
848 size_t rpos;
849 size_t wpos;
850 unsigned int bits;
851 unsigned int vbit;
852 int ret;
853 int shift;
854 unsigned char *uout;
855 size_t encoded_len;
856
857 if (0 == enclen)
858 {
859 if (0 == out_size)
860 return GNUNET_OK;
861 return GNUNET_SYSERR;
862 }
863 GNUNET_assert (out_size < SIZE_MAX / 8);
864 encoded_len = out_size * 8;
865 uout = out;
866 wpos = out_size;
867 rpos = enclen;
868 if ((encoded_len % 5) > 0)
869 {
870 vbit = encoded_len % 5; /* padding! */
871 shift = 5 - vbit;
872 bits = (ret = getValue__ (enc[--rpos])) >> shift;
873 }
874 else
875 {
876 vbit = 5;
877 shift = 0;
878 bits = (ret = getValue__ (enc[--rpos]));
879 }
880 if ((encoded_len + shift) / 5 != enclen)
881 return GNUNET_SYSERR;
882 if (-1 == ret)
883 return GNUNET_SYSERR;
884 while (wpos > 0)
885 {
886 if (0 == rpos)
887 {
888 GNUNET_break (0);
889 return GNUNET_SYSERR;
890 }
891 bits = ((ret = getValue__ (enc[--rpos])) << vbit) | bits;
892 if (-1 == ret)
893 return GNUNET_SYSERR;
894 vbit += 5;
895 if (vbit >= 8)
896 {
897 uout[--wpos] = (unsigned char) bits;
898 bits >>= 8;
899 vbit -= 8;
900 }
901 }
902 if ((0 != rpos) || (0 != vbit))
903 return GNUNET_SYSERR;
904 return GNUNET_OK;
905}
static OpusEncoder * enc
OPUS encoder.
@ GNUNET_SYSERR
static unsigned int getValue__(unsigned char a)
Get the decoded value corresponding to a character according to Crockford Base32 encoding.
Definition strings.c:713

References enc, getValue__(), GNUNET_assert, GNUNET_break, GNUNET_OK, GNUNET_SYSERR, ret, and SIZE_MAX.

Referenced by channel_to_sh(), check_authorization(), consume_fail(), conversation_string_to_value(), delete_attribute_cont(), delete_credential_cont(), ego_create(), expect_data_dynamic(), expect_data_fixed(), GNUNET_CONFIGURATION_get_data(), GNUNET_CRYPTO_blindable_private_key_from_string(), GNUNET_CRYPTO_blindable_public_key_from_string(), GNUNET_CRYPTO_ecdsa_public_key_from_string(), GNUNET_CRYPTO_eddsa_private_key_from_string(), GNUNET_CRYPTO_eddsa_public_key_from_string(), GNUNET_CRYPTO_hash_from_string2(), GNUNET_HELLO_parser_from_url(), GNUNET_STRINGS_string_to_data_alloc(), lookup_redirect_uri_result(), main(), messenger_string_to_value(), parse_attr(), parse_credential(), parse_fixed_data(), parse_rsa_public_key(), parse_rsa_signature(), read_service_conf(), run(), set_base32(), start_process(), string_to_auth_key(), string_to_value(), uri_loc_parse(), and uri_sks_parse().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_STRINGS_string_to_data_alloc()

enum GNUNET_GenericReturnValue GNUNET_STRINGS_string_to_data_alloc ( const char *  enc,
size_t  enclen,
void **  out,
size_t *  out_size 
)

Convert CrockfordBase32 encoding back to data.

out_size will be determined from enc and out will be allocated to be large enough.

Parameters
encthe encoding
enclennumber of characters in enc (without 0-terminator, which can be missing)
[out]outlocation where to allocate and store the decoded data
[out]out_sizeset to the size of the output buffer out
Returns
GNUNET_OK on success, GNUNET_SYSERR if result has the wrong encoding

Definition at line 909 of file strings.c.

913{
914 size_t size;
915 void *data;
916 int res;
917
918 size = (enclen * 5) / 8;
920 {
921 GNUNET_break_op (0);
922 return GNUNET_SYSERR;
923 }
926 enclen,
927 data,
928 size);
929 if ( (0 < size) &&
930 (GNUNET_OK != res) )
931 {
932 size--;
934 enclen,
935 data,
936 size);
937 }
938 if (GNUNET_OK != res)
939 {
940 GNUNET_break_op (0);
942 return GNUNET_SYSERR;
943 }
944 *out = data;
945 *out_size = size;
946 return GNUNET_OK;
947}
static char * res
Currently read line or NULL on EOF.
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
#define GNUNET_MAX_MALLOC_CHECKED
Maximum allocation with GNUNET_malloc macro.
enum GNUNET_GenericReturnValue GNUNET_STRINGS_string_to_data(const char *enc, size_t enclen, void *out, size_t out_size)
Convert CrockfordBase32 encoding back to data.
Definition strings.c:843

References data, enc, GNUNET_break_op, GNUNET_free, GNUNET_malloc, GNUNET_MAX_MALLOC_CHECKED, GNUNET_OK, GNUNET_STRINGS_string_to_data(), GNUNET_SYSERR, res, and size.

Referenced by GNUNET_PQ_event_do_poll(), parse_variable_data(), and read_encrypted_message().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_STRINGS_base64_encode()

size_t GNUNET_STRINGS_base64_encode ( const void *  in,
size_t  len,
char **  output 
)

Encode into Base64.

Parameters
datathe data to encode
lenthe length of the input
outputwhere to write the output (*output should be NULL, is allocated)
Returns
the size of the output

Definition at line 1629 of file strings.c.

1632{
1633 const unsigned char *data = in;
1634 size_t ret;
1635 char *opt;
1636
1637 ret = 0;
1638 GNUNET_assert (len < SIZE_MAX / 4);
1639 opt = GNUNET_malloc (2 + (len * 4 / 3) + 8);
1640 for (size_t i = 0; i < len; ++i)
1641 {
1642 char c;
1643
1644 c = (data[i] >> 2) & 0x3f;
1645 opt[ret++] = cvt[(int) c];
1646 c = (data[i] << 4) & 0x3f;
1647 if (++i < len)
1648 c |= (data[i] >> 4) & 0x0f;
1649 opt[ret++] = cvt[(int) c];
1650 if (i < len)
1651 {
1652 c = (data[i] << 2) & 0x3f;
1653 if (++i < len)
1654 c |= (data[i] >> 6) & 0x03;
1655 opt[ret++] = cvt[(int) c];
1656 }
1657 else
1658 {
1659 ++i;
1660 opt[ret++] = FILLCHAR;
1661 }
1662 if (i < len)
1663 {
1664 c = data[i] & 0x3f;
1665 opt[ret++] = cvt[(int) c];
1666 }
1667 else
1668 {
1669 opt[ret++] = FILLCHAR;
1670 }
1671 }
1672 *output = opt;
1673 return ret;
1674}
static const char * cvt
Definition strings.c:1623
#define FILLCHAR
******************** Base64 encoding
Definition strings.c:1622

References cvt, data, FILLCHAR, GNUNET_assert, GNUNET_malloc, ret, and SIZE_MAX.

Referenced by dns_value_to_string(), GNUNET_ABD_delegate_to_string(), GNUNET_JSON_from_data64(), GNUNET_STRINGS_base64url_encode(), OIDC_access_token_new(), pabc_create_presentation(), pils_sign_addr_cb(), store_and_free_entries(), and store_and_free_entries().

Here is the caller graph for this function:

◆ GNUNET_STRINGS_urlencode()

size_t GNUNET_STRINGS_urlencode ( size_t  len,
const char  data[static len],
char **  out 
)

url/percent encode (RFC3986).

FIXME: awkward API, len is not actually used out is 0-terminated, should probably be changed to only input data and directly return @out or NULL.

Parameters
datathe data to decode
lenthe length of the input
outwhere to write the output (*out should be NULL, is allocated)
Returns
the size of the output

Definition at line 1893 of file strings.c.

1896{
1897 struct GNUNET_Buffer buf = { 0 };
1898 const uint8_t *i8 = (uint8_t *) data;
1899 const uint8_t *end = (uint8_t *) (data + len);
1900
1901 while (end != i8)
1902 {
1903 if (0 == *i8)
1904 {
1905 /* invalid UTF-8 (or bad @a len): fail */
1906 GNUNET_break (0);
1907 GNUNET_buffer_clear (&buf);
1908 return 0;
1909 }
1910 if (0 == (0x80 & *i8))
1911 {
1912 /* traditional ASCII */
1913 if (isalnum (*i8) ||
1914 (*i8 == '-') ||
1915 (*i8 == '_') ||
1916 (*i8 == '.') ||
1917 (*i8 == '~') )
1918 GNUNET_buffer_write (&buf,
1919 (const char*) i8,
1920 1);
1921 else if (*i8 == ' ')
1922 GNUNET_buffer_write (&buf,
1923 "+",
1924 1);
1925 else
1927 "%%%X%X",
1928 *i8 >> 4,
1929 *i8 & 15);
1930 i8++;
1931 continue;
1932 }
1933 if (0x80 + 0x40 == ((0x80 + 0x40 + 0x20) & *i8))
1934 {
1935 /* 2-byte value, percent-encode */
1937 "%%%X%X",
1938 *i8 >> 4,
1939 *i8 & 15);
1940 i8++;
1941 if ( (end == i8) ||
1942 (0 == *i8) )
1943 {
1944 /* invalid UTF-8 (or bad @a len): fail */
1945 GNUNET_break (0);
1946 GNUNET_buffer_clear (&buf);
1947 return 0;
1948 }
1950 "%%%X%X",
1951 *i8 >> 4,
1952 *i8 & 15);
1953 i8++;
1954 continue;
1955 }
1956 if (0x80 + 0x40 + 0x20 == ((0x80 + 0x40 + 0x20 + 0x10) & *i8))
1957 {
1958 /* 3-byte value, percent-encode */
1959 for (unsigned int i = 0; i<3; i++)
1960 {
1961 if ( (end == i8) ||
1962 (0 == *i8) )
1963 {
1964 /* invalid UTF-8 (or bad @a len): fail */
1965 GNUNET_break (0);
1966 GNUNET_buffer_clear (&buf);
1967 return 0;
1968 }
1970 "%%%X%X",
1971 *i8 >> 4,
1972 *i8 & 15);
1973 i8++;
1974 }
1975 continue;
1976 }
1977 if (0x80 + 0x40 + 0x20 + 0x10 == ((0x80 + 0x40 + 0x20 + 0x10 + 0x08) & *i8))
1978 {
1979 /* 4-byte value, percent-encode */
1980 for (unsigned int i = 0; i<4; i++)
1981 {
1982 if ( (end == i8) ||
1983 (0 == *i8) )
1984 {
1985 /* invalid UTF-8 (or bad @a len): fail */
1986 GNUNET_break (0);
1987 GNUNET_buffer_clear (&buf);
1988 return 0;
1989 }
1991 "%%%X%X",
1992 *i8 >> 4,
1993 *i8 & 15);
1994 i8++;
1995 }
1996 continue;
1997 }
1998 if (0x80 + 0x40 + 0x20 + 0x10 + 0x08 == ((0x80 + 0x40 + 0x20 + 0x10 + 0x08
1999 + 0x04) & *i8))
2000 {
2001 /* 5-byte value, percent-encode (outside of UTF-8 modern standard, but so what) */
2002 for (unsigned int i = 0; i<5; i++)
2003 {
2004 if ( (end == i8) ||
2005 (0 == *i8) )
2006 {
2007 /* invalid UTF-8 (or bad @a len): fail */
2008 GNUNET_break (0);
2009 GNUNET_buffer_clear (&buf);
2010 return 0;
2011 }
2013 "%%%X%X",
2014 *i8 >> 4,
2015 *i8 & 15);
2016 i8++;
2017 }
2018 continue;
2019 }
2020 if (0x80 + 0x40 + 0x20 + 0x10 + 0x08 + 0x04 == ((0x80 + 0x40 + 0x20 + 0x10
2021 + 0x08 + 0x04 + 0x02)
2022 & *i8))
2023 {
2024 /* 6-byte value, percent-encode (outside of UTF-8 modern standard, but so what) */
2025 for (unsigned int i = 0; i<6; i++)
2026 {
2027 if ( (end == i8) ||
2028 (0 == *i8) )
2029 {
2030 /* invalid UTF-8 (or bad @a len): fail */
2031 GNUNET_break (0);
2032 GNUNET_buffer_clear (&buf);
2033 return 0;
2034 }
2036 "%%%X%X",
2037 *i8 >> 4,
2038 *i8 & 15);
2039 i8++;
2040 }
2041 continue;
2042 }
2043 /* really, really invalid UTF-8: fail */
2044 GNUNET_break (0);
2045 GNUNET_buffer_clear (&buf);
2046 return 0;
2047 }
2048 *out = GNUNET_buffer_reap_str (&buf);
2049 return strlen (*out);
2050}
char * GNUNET_buffer_reap_str(struct GNUNET_Buffer *buf)
Clear the buffer and return the string it contained.
Definition buffer.c:89
void GNUNET_buffer_write_fstr(struct GNUNET_Buffer *buf, const char *fmt,...) __attribute__((format(printf
Write a 0-terminated formatted string to a buffer, excluding the 0-terminator.
void GNUNET_buffer_write(struct GNUNET_Buffer *buf, const char *data, size_t len)
Write bytes to the buffer.
Definition buffer.c:63
void GNUNET_buffer_clear(struct GNUNET_Buffer *buf)
Free the backing memory of the given buffer.
Definition buffer.c:123
Dynamically growing buffer.

References data, end, GNUNET_break, GNUNET_buffer_clear(), GNUNET_buffer_reap_str(), GNUNET_buffer_write(), and GNUNET_buffer_write_fstr().

Referenced by GNUNET_HELLO_build_url(), GNUNET_HELLO_parser_to_url(), login_redirect(), PABC_load_public_parameters(), PABC_read_usr_ctx(), PABC_write_public_parameters(), and PABC_write_usr_ctx().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_STRINGS_base64url_encode()

size_t GNUNET_STRINGS_base64url_encode ( const void *  in,
size_t  len,
char **  output 
)

Encode into Base64url.

RFC7515

Parameters
inthe data to encode
lenthe length of the input
outputwhere to write the output (*output should be NULL, is allocated)
Returns
the size of the output

Definition at line 1678 of file strings.c.

1681{
1682 char *enc;
1683 size_t pos;
1684
1686 len,
1687 output);
1688 enc = *output;
1689 /* Replace with correct characters for base64url */
1690 pos = 0;
1691 while ('\0' != enc[pos])
1692 {
1693 if ('+' == enc[pos])
1694 enc[pos] = '-';
1695 if ('/' == enc[pos])
1696 enc[pos] = '_';
1697 if ('=' == enc[pos])
1698 {
1699 enc[pos] = '\0';
1700 break;
1701 }
1702 pos++;
1703 }
1704 return strlen (enc);
1705}
size_t GNUNET_STRINGS_base64_encode(const void *in, size_t len, char **output)
Encode into Base64.
Definition strings.c:1629

References enc, and GNUNET_STRINGS_base64_encode().

Referenced by check_code_challenge(), DID_key_convert_gnunet_to_multibase_base64(), ego_sign_data_cb(), OIDC_build_authz_code(), and OIDC_generate_id_token_hmac().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_STRINGS_base64_decode()

size_t GNUNET_STRINGS_base64_decode ( const char *  data,
size_t  len,
void **  output 
)

Decode from Base64.

Parameters
datathe data to decode
lenthe length of the input
[out]outputwhere to write the output (*output should be NULL, is allocated)
Returns
the size of the output

Definition at line 1731 of file strings.c.

1734{
1735 unsigned char *output;
1736 size_t ret = 0;
1737
1738 GNUNET_assert (len / 3 < SIZE_MAX);
1739 output = GNUNET_malloc ((len * 3 / 4) + 8);
1741 "base64_decode decoding len=%d\n",
1742 (int) len);
1743 for (size_t i = 0; i < len; ++i)
1744 {
1745 unsigned char c;
1746 unsigned char c1;
1747
1748 CHECK_CRLF;
1749 if (FILLCHAR == data[i])
1750 break;
1751 c = (unsigned char) cvtfind (data[i]);
1752 ++i;
1753 CHECK_CRLF;
1754 c1 = (unsigned char) cvtfind (data[i]);
1755 c = (c << 2) | ((c1 >> 4) & 0x3);
1756 output[ret++] = c;
1757 if (++i < len)
1758 {
1759 CHECK_CRLF;
1760 c = data[i];
1761 if (FILLCHAR == c)
1762 break;
1763 c = (unsigned char) cvtfind (c);
1764 c1 = ((c1 << 4) & 0xf0) | ((c >> 2) & 0xf);
1765 output[ret++] = c1;
1766 }
1767 if (++i < len)
1768 {
1769 CHECK_CRLF;
1770 c1 = data[i];
1771 if (FILLCHAR == c1)
1772 break;
1773
1774 c1 = (unsigned char) cvtfind (c1);
1775 c = ((c << 6) & 0xc0) | c1;
1776 output[ret++] = c;
1777 }
1778 }
1779END:
1780 *out = output;
1781 return ret;
1782}
@ END
We're done processing.
#define GNUNET_log(kind,...)
@ GNUNET_ERROR_TYPE_DEBUG
#define CHECK_CRLF
Definition strings.c:1718
#define cvtfind(a)
Definition strings.c:1708

References CHECK_CRLF, cvtfind, data, END, FILLCHAR, GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_malloc, ret, and SIZE_MAX.

Referenced by database_setup(), database_setup(), dns_string_to_value(), GNUNET_ABD_delegate_from_string(), GNUNET_STRINGS_base64url_decode(), OIDC_access_token_parse(), parse_credentials_basic_auth(), and parse_fixed64_data().

Here is the caller graph for this function:

◆ GNUNET_STRINGS_base64url_decode()

size_t GNUNET_STRINGS_base64url_decode ( const char *  data,
size_t  len,
void **  out 
)

Decode from Base64url.

RFC7515

Parameters
datathe data to decode
lenthe length of the input
outwhere to write the output (*out should be NULL, is allocated)
Returns
the size of the output

Definition at line 1789 of file strings.c.

1792{
1793 char *s;
1794 int padding;
1795 size_t ret;
1796
1797 /* make enough space for padding */
1798 GNUNET_assert (len < SIZE_MAX - 3);
1799 s = GNUNET_malloc (len + 3);
1800 memcpy (s,
1801 data,
1802 len);
1803 for (size_t i = 0; i < strlen (s); i++)
1804 {
1805 if (s[i] == '-')
1806 s[i] = '+';
1807 if (s[i] == '_')
1808 s[i] = '/';
1809 }
1810 padding = len % 4;
1811 switch (padding) // Pad with trailing '='s
1812 {
1813 case 0:
1814 break; // No pad chars in this case
1815 case 2:
1816 memcpy (&s[len],
1817 "==",
1818 2);
1819 len += 2;
1820 break; // Two pad chars
1821 case 3:
1822 s[len] = '=';
1823 len++;
1824 break; // One pad char
1825 default:
1826 GNUNET_assert (0);
1827 break;
1828 }
1830 len,
1831 out);
1832 GNUNET_free (s);
1833 return ret;
1834}
size_t GNUNET_STRINGS_base64_decode(const char *data, size_t len, void **out)
Decode from Base64.
Definition strings.c:1731

References data, GNUNET_assert, GNUNET_free, GNUNET_malloc, GNUNET_STRINGS_base64_decode(), ret, and SIZE_MAX.

Referenced by jwt_get_expiration(), jwt_get_issuer(), jwt_parse_attributes(), OIDC_parse_authz_code(), and set_attributes_from_idtoken().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_STRINGS_urldecode()

size_t GNUNET_STRINGS_urldecode ( const char *  data,
size_t  len,
char **  out 
)

url/percent encode (RFC3986).

Parameters
datathe data to encode
lenthe length of the input
[out]outwhere to write the output (*output should be NULL, is allocated)
Returns
the size of the output

Definition at line 1838 of file strings.c.

1841{
1842 const char *rpos = data;
1843 char *wpos;
1844 size_t resl = 0;
1845 *out = GNUNET_malloc (len + 1); /* output should always fit into input */
1846 wpos = *out;
1847
1848 while ( ('\0' != *rpos) &&
1849 (data + len != rpos) )
1850 {
1851 unsigned int num;
1852 switch (*rpos)
1853 {
1854 case '%':
1855 if (rpos + 3 > data + len)
1856 {
1857 GNUNET_break_op (0);
1858 GNUNET_free (*out);
1859 return 0;
1860 }
1861 if (1 != sscanf (rpos + 1,
1862 "%2x",
1863 &num))
1864 {
1865 /* Invalid URL encoding, try to continue anyway */
1866 GNUNET_break_op (0);
1867 *wpos = *rpos;
1868 wpos++;
1869 resl++;
1870 rpos++;
1871 break;
1872 }
1873 *wpos = (char) ((unsigned char) num);
1874 wpos++;
1875 resl++;
1876 rpos += 3;
1877 break;
1878 /* TODO: add bad sequence handling */
1879 /* intentional fall through! */
1880 default:
1881 *wpos = *rpos;
1882 wpos++;
1883 resl++;
1884 rpos++;
1885 }
1886 }
1887 *wpos = '\0'; /* add 0-terminator */
1888 return resl;
1889}

References data, GNUNET_break_op, GNUNET_free, and GNUNET_malloc.

Referenced by get_url_parameter_copy(), and GNUNET_HELLO_parser_from_url().

Here is the caller graph for this function:

◆ GNUNET_STRINGS_parse_uri()

enum GNUNET_GenericReturnValue GNUNET_STRINGS_parse_uri ( const char *  path,
char **  scheme_part,
const char **  path_part 
)

Parse a path that might be an URI.

Parameters
pathpath to parse. Must be NULL-terminated.
[out]scheme_partpointer to a string that represents the URI scheme will be stored. Can be NULL. The string is allocated by the function, and should be freed by GNUNET_free() when it is no longer needed.
path_parta pointer to 'const char *' where a pointer to the path part of the URI will be stored. Can be NULL. Points to the same block of memory as path, and thus must not be freed. Might point to '\0', if path part is zero-length.
Returns
GNUNET_YES if it's an URI, GNUNET_NO otherwise. If 'path' is not an URI, '* scheme_part' and '*path_part' will remain unchanged (if they weren't NULL).

Definition at line 951 of file strings.c.

954{
955 size_t len;
956 size_t i;
957 int end;
958 int pp_state = 0;
959 const char *post_scheme_part = NULL;
960
961 len = strlen (path);
962 for (end = 0, i = 0; ! end && i < len; i++)
963 {
964 switch (pp_state)
965 {
966 case 0:
967 if ((path[i] == ':') && (i > 0))
968 {
969 pp_state += 1;
970 continue;
971 }
972 if (! (((path[i] >= 'A') && (path[i] <= 'Z') ) ||
973 ((path[i] >= 'a') && (path[i] <= 'z') ) ||
974 ((path[i] >= '0') && (path[i] <= '9') ) || (path[i] == '+') ||
975 (path[i] == '-') || (path[i] == '.')))
976 end = 1;
977 break;
978
979 case 1:
980 case 2:
981 if (path[i] == '/')
982 {
983 pp_state += 1;
984 continue;
985 }
986 end = 1;
987 break;
988
989 case 3:
990 post_scheme_part = &path[i];
991 end = 1;
992 break;
993
994 default:
995 end = 1;
996 }
997 }
998 if (post_scheme_part == NULL)
999 return GNUNET_NO;
1000 if (scheme_part)
1001 {
1002 *scheme_part = GNUNET_strndup (path,
1003 post_scheme_part - path);
1004 }
1005 if (path_part)
1006 *path_part = post_scheme_part;
1007 return GNUNET_YES;
1008}
@ GNUNET_YES
@ GNUNET_NO
#define GNUNET_strndup(a, length)
Wrapper around GNUNET_xstrndup_.

References end, GNUNET_NO, GNUNET_strndup, and GNUNET_YES.

Referenced by GNUNET_STRINGS_path_is_absolute().

Here is the caller graph for this function:

◆ GNUNET_STRINGS_path_is_absolute()

enum GNUNET_GenericReturnValue GNUNET_STRINGS_path_is_absolute ( const char *  filename,
int  can_be_uri,
int *  r_is_uri,
char **  r_uri_scheme 
)

Check whether filename is absolute or not, and if it's an URI.

Parameters
filenamefilename to check
can_be_uriGNUNET_YES to check for being URI, GNUNET_NO - to assume it's not URI
r_is_uria pointer to an int that is set to GNUNET_YES if 'filename' is URI and to GNUNET_NO otherwise. Can be NULL. If 'can_be_uri' is not GNUNET_YES, *r_is_uri is set to GNUNET_NO.
r_uri_schemea pointer to a char * that is set to a pointer to URI scheme. The string is allocated by the function, and should be freed with GNUNET_free (). Can be NULL.
Returns
GNUNET_YES if 'filename' is absolute, GNUNET_NO otherwise.

Definition at line 1012 of file strings.c.

1016{
1017 const char *post_scheme_path;
1018 int is_uri;
1019 char *uri;
1020 /* consider POSIX paths to be absolute too, even on W32,
1021 * as plibc expansion will fix them for us.
1022 */
1023 if (filename[0] == '/')
1024 return GNUNET_YES;
1025 if (can_be_uri)
1026 {
1027 is_uri = GNUNET_STRINGS_parse_uri (filename, &uri, &post_scheme_path);
1028 if (r_is_uri)
1029 *r_is_uri = is_uri;
1030 if (is_uri)
1031 {
1032 if (r_uri_scheme)
1033 *r_uri_scheme = uri;
1034 else
1035 GNUNET_free (uri);
1036
1037 return GNUNET_STRINGS_path_is_absolute (post_scheme_path,
1038 GNUNET_NO,
1039 NULL,
1040 NULL);
1041 }
1042 }
1043 else
1044 {
1045 if (r_is_uri)
1046 *r_is_uri = GNUNET_NO;
1047 }
1048
1049 return GNUNET_NO;
1050}
static struct GNUNET_FS_Uri * uri
Value of URI provided on command-line (when not publishing a file but just creating UBlocks to refer ...
enum GNUNET_GenericReturnValue GNUNET_STRINGS_path_is_absolute(const char *filename, int can_be_uri, int *r_is_uri, char **r_uri_scheme)
Check whether filename is absolute or not, and if it's an URI.
Definition strings.c:1012
enum GNUNET_GenericReturnValue GNUNET_STRINGS_parse_uri(const char *path, char **scheme_part, const char **path_part)
Parse a path that might be an URI.
Definition strings.c:951

References filename, GNUNET_free, GNUNET_NO, GNUNET_STRINGS_parse_uri(), GNUNET_STRINGS_path_is_absolute(), GNUNET_YES, and uri.

Referenced by GNUNET_CONFIGURATION_get_suid_binary_path(), GNUNET_OS_check_helper_binary(), GNUNET_OS_get_libexec_binary_path(), GNUNET_STRINGS_check_filename(), and GNUNET_STRINGS_path_is_absolute().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_STRINGS_check_filename()

enum GNUNET_GenericReturnValue GNUNET_STRINGS_check_filename ( const char *  filename,
enum GNUNET_STRINGS_FilenameCheck  checks 
)

Perform checks on filename.

FIXME: some duplication with "GNUNET_DISK_"-APIs. We should unify those.

Parameters
filenamefile to check
checkschecks to perform
Returns
GNUNET_YES if all checks pass, GNUNET_NO if at least one of them fails, GNUNET_SYSERR when a check can't be performed

Definition at line 1054 of file strings.c.

1056{
1057 struct stat st;
1058
1059 if ((NULL == filename) || (filename[0] == '\0'))
1060 return GNUNET_SYSERR;
1061 if (0 != (checks & GNUNET_STRINGS_CHECK_IS_ABSOLUTE))
1063 return GNUNET_NO;
1064 if (0 != (checks
1067 {
1068 if (0 != lstat (filename, &st))
1069 {
1070 if (0 != (checks & GNUNET_STRINGS_CHECK_EXISTS))
1071 return GNUNET_NO;
1072 else
1073 return GNUNET_SYSERR;
1074 }
1075 }
1076 if (0 != (checks & GNUNET_STRINGS_CHECK_IS_DIRECTORY))
1077 if (! S_ISDIR (st.st_mode))
1078 return GNUNET_NO;
1079 if (0 != (checks & GNUNET_STRINGS_CHECK_IS_LINK))
1080 if (! S_ISLNK (st.st_mode))
1081 return GNUNET_NO;
1082 return GNUNET_YES;
1083}
#define S_ISLNK(m)
Definition disk.c:61
static struct GNUNET_SCHEDULER_Task * st
The shutdown task.

References filename, GNUNET_NO, GNUNET_STRINGS_CHECK_EXISTS, GNUNET_STRINGS_CHECK_IS_ABSOLUTE, GNUNET_STRINGS_CHECK_IS_DIRECTORY, GNUNET_STRINGS_CHECK_IS_LINK, GNUNET_STRINGS_path_is_absolute(), GNUNET_SYSERR, GNUNET_YES, S_ISLNK, and st.

Here is the call graph for this function:

◆ GNUNET_STRINGS_to_address_ipv6()

enum GNUNET_GenericReturnValue GNUNET_STRINGS_to_address_ipv6 ( const char *  zt_addr,
size_t  addrlen,
struct sockaddr_in6 *  r_buf 
)

Tries to convert zt_addr string to an IPv6 address.

The string is expected to have the format "[ABCD::01]:80".

Parameters
zt_addr0-terminated string. May be mangled by the function.
addrlenlength of zt_addr (not counting 0-terminator).
r_bufa buffer to fill. Initially gets filled with zeroes, then its sin6_port, sin6_family and sin6_addr are set appropriately.
Returns
GNUNET_OK if conversion succeeded. GNUNET_SYSERR otherwise, in which case the contents of r_buf are undefined.

Definition at line 1087 of file strings.c.

1090{
1091 if (addrlen < 6)
1092 return GNUNET_SYSERR;
1093 if (addrlen > 512)
1094 return GNUNET_SYSERR; /* sanity check to protect zbuf allocation,
1095 actual limit is not precise */
1096 {
1097 char zbuf[addrlen + 1];
1098 int ret;
1099 char *port_colon;
1100 unsigned int port;
1101 char dummy[2];
1102
1103 GNUNET_memcpy (zbuf, zt_addr, addrlen);
1104 if ('[' != zbuf[0])
1105 {
1107 _ ("IPv6 address did not start with `['\n"));
1108 return GNUNET_SYSERR;
1109 }
1110 zbuf[addrlen] = '\0';
1111 port_colon = strrchr (zbuf, ':');
1112 if (NULL == port_colon)
1113 {
1115 _ ("IPv6 address did contain ':' to separate port number\n"));
1116 return GNUNET_SYSERR;
1117 }
1118 if (']' != *(port_colon - 1))
1119 {
1120 GNUNET_log (
1122 _ (
1123 "IPv6 address did contain ']' before ':' to separate port number\n"));
1124 return GNUNET_SYSERR;
1125 }
1126 ret = sscanf (port_colon, ":%u%1s", &port, dummy);
1127 if ((1 != ret) || (port > 65535))
1128 {
1129 GNUNET_log (
1131 _ (
1132 "IPv6 address did contain a valid port number after the last ':'\n"));
1133 return GNUNET_SYSERR;
1134 }
1135 *(port_colon - 1) = '\0';
1136 memset (r_buf, 0, sizeof(struct sockaddr_in6));
1137 ret = inet_pton (AF_INET6, &zbuf[1], &r_buf->sin6_addr);
1138 if (ret <= 0)
1139 {
1141 _ ("Invalid IPv6 address `%s': %s\n"),
1142 &zbuf[1],
1143 strerror (errno));
1144 return GNUNET_SYSERR;
1145 }
1146 r_buf->sin6_port = htons (port);
1147 r_buf->sin6_family = AF_INET6;
1148#if HAVE_SOCKADDR_IN_SIN_LEN
1149 r_buf->sin6_len = (u_char) sizeof(struct sockaddr_in6);
1150#endif
1151 return GNUNET_OK;
1152 }
1153}
static uint16_t port
Port number.
Definition gnunet-bcd.c:146
static struct in_addr dummy
Target "dummy" address of the packet we pretend to respond to.

References _, dummy, GNUNET_ERROR_TYPE_WARNING, GNUNET_log, GNUNET_memcpy, GNUNET_OK, GNUNET_SYSERR, port, and ret.

Referenced by GNUNET_STRINGS_parse_socket_addr(), and GNUNET_STRINGS_to_address_ip().

Here is the caller graph for this function:

◆ GNUNET_STRINGS_to_address_ipv4()

enum GNUNET_GenericReturnValue GNUNET_STRINGS_to_address_ipv4 ( const char *  zt_addr,
size_t  addrlen,
struct sockaddr_in *  r_buf 
)

Tries to convert zt_addr string to an IPv4 address.

The string is expected to have the format "1.2.3.4:80".

Parameters
zt_addr0-terminated string. May be mangled by the function.
addrlenlength of zt_addr (not counting 0-terminator).
r_bufa buffer to fill.
Returns
GNUNET_OK if conversion succeeded. GNUNET_SYSERR otherwise, in which case the contents of r_buf are undefined.

Definition at line 1157 of file strings.c.

1160{
1161 unsigned int temps[4];
1162 unsigned int port;
1163 unsigned int cnt;
1164 char dummy[2];
1165
1166 if (addrlen < 9)
1167 return GNUNET_SYSERR;
1168 cnt = sscanf (zt_addr,
1169 "%u.%u.%u.%u:%u%1s",
1170 &temps[0],
1171 &temps[1],
1172 &temps[2],
1173 &temps[3],
1174 &port,
1175 dummy);
1176 if (5 != cnt)
1177 return GNUNET_SYSERR;
1178 for (cnt = 0; cnt < 4; cnt++)
1179 if (temps[cnt] > 0xFF)
1180 return GNUNET_SYSERR;
1181 if (port > 65535)
1182 return GNUNET_SYSERR;
1183 r_buf->sin_family = AF_INET;
1184 r_buf->sin_port = htons (port);
1185 r_buf->sin_addr.s_addr =
1186 htonl ((temps[0] << 24) + (temps[1] << 16) + (temps[2] << 8) + temps[3]);
1187#if HAVE_SOCKADDR_IN_SIN_LEN
1188 r_buf->sin_len = (u_char) sizeof(struct sockaddr_in);
1189#endif
1190 return GNUNET_OK;
1191}

References dummy, GNUNET_OK, GNUNET_SYSERR, and port.

Referenced by GNUNET_STRINGS_parse_socket_addr(), and GNUNET_STRINGS_to_address_ip().

Here is the caller graph for this function:

◆ GNUNET_STRINGS_parse_socket_addr()

size_t GNUNET_STRINGS_parse_socket_addr ( const char *  addr,
uint8_t *  af,
struct sockaddr **  sa 
)

Parse an address given as a string into a struct sockaddr.

Parameters
addrthe address
[out]afset to the parsed address family (e.g. AF_INET)
[out]saset to the parsed address
Returns
0 on error, otherwise number of bytes in sa

Definition at line 1210 of file strings.c.

1213{
1214 *af = AF_UNSPEC;
1215 if ('[' == *addr)
1216 {
1217 /* IPv6 */
1218 *sa = GNUNET_malloc (sizeof(struct sockaddr_in6));
1219 if (GNUNET_OK !=
1221 strlen (addr),
1222 (struct sockaddr_in6 *) *sa))
1223 {
1224 GNUNET_free (*sa);
1225 *sa = NULL;
1226 return 0;
1227 }
1228 *af = AF_INET6;
1229 return sizeof(struct sockaddr_in6);
1230 }
1231 else
1232 {
1233 /* IPv4 */
1234 *sa = GNUNET_malloc (sizeof(struct sockaddr_in));
1235 if (GNUNET_OK !=
1237 strlen (addr),
1238 (struct sockaddr_in *) *sa))
1239 {
1240 GNUNET_free (*sa);
1241 *sa = NULL;
1242 return 0;
1243 }
1244 *af = AF_INET;
1245 return sizeof(struct sockaddr_in);
1246 }
1247}
enum GNUNET_GenericReturnValue GNUNET_STRINGS_to_address_ipv6(const char *zt_addr, size_t addrlen, struct sockaddr_in6 *r_buf)
Tries to convert zt_addr string to an IPv6 address.
Definition strings.c:1087
enum GNUNET_GenericReturnValue GNUNET_STRINGS_to_address_ipv4(const char *zt_addr, size_t addrlen, struct sockaddr_in *r_buf)
Tries to convert zt_addr string to an IPv4 address.
Definition strings.c:1157

References GNUNET_free, GNUNET_malloc, GNUNET_OK, GNUNET_STRINGS_to_address_ipv4(), and GNUNET_STRINGS_to_address_ipv6().

Referenced by run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_STRINGS_to_address_ip()

enum GNUNET_GenericReturnValue GNUNET_STRINGS_to_address_ip ( const char *  addr,
uint16_t  addrlen,
struct sockaddr_storage *  r_buf 
)

Tries to convert addr string to an IP (v4 or v6) address.

Will automatically decide whether to treat 'addr' as v4 or v6 address.

Parameters
addra string, may not be 0-terminated.
addrlennumber of bytes in addr (if addr is 0-terminated, 0-terminator should not be counted towards addrlen).
r_bufa buffer to fill.
Returns
GNUNET_OK if conversion succeeded. GNUNET_SYSERR otherwise, in which case the contents of r_buf are undefined.

Definition at line 1195 of file strings.c.

1198{
1199 if (addr[0] == '[')
1200 return GNUNET_STRINGS_to_address_ipv6 (addr,
1201 addrlen,
1202 (struct sockaddr_in6 *) r_buf);
1203 return GNUNET_STRINGS_to_address_ipv4 (addr,
1204 addrlen,
1205 (struct sockaddr_in *) r_buf);
1206}

References GNUNET_STRINGS_to_address_ipv4(), and GNUNET_STRINGS_to_address_ipv6().

Here is the call graph for this function:

◆ GNUNET_strlcpy()

size_t GNUNET_strlcpy ( char *  dst,
const char *  src,
size_t  n 
)

Like strlcpy but portable.

The given string src is copied in full length (until its null byte). The destination buffer is guaranteed to be null-terminated.

to a destination buffer and ensures that the destination string is null-terminated.

Parameters
dstdestination of the copy
srcsource of the copy, must be null-terminated
nthe length of the string to copy, including its terminating null byte
Returns
the length of the string that was copied, excluding the terminating null byte

Definition at line 137 of file strings.c.

140{
141 size_t slen;
142
143 GNUNET_assert (0 != n);
144 slen = strnlen (src, n - 1);
145 memcpy (dst, src, slen);
146 dst[slen] = '\0';
147 return slen;
148}
static size_t strnlen(const char *s, size_t n)

References GNUNET_assert, and strnlen().

Referenced by add_unixpath(), add_unixpath(), create_keys(), GCP_2s(), GNUNET_i2s(), GNUNET_i2s2(), mylog(), regex_split(), and try_unixpath().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_STRINGS_get_suffix_from_binary_name()

char * GNUNET_STRINGS_get_suffix_from_binary_name ( const char *  argv0)

Sometimes we use the binary name to determine which specific test to run.

In those cases, the string after the last "_" in 'argv[0]' specifies a string that determines the configuration file or plugin to use.

This function returns the respective substring, taking care of issues such as binaries ending in '.exe' on W32.

Parameters
argv0the name of the binary
Returns
string between the last '_' and the '.exe' (or the end of the string), NULL if argv0 has no '_'

Definition at line 2067 of file strings.c.

2068{
2069 const char *ret;
2070 const char *dot;
2071
2072 ret = strrchr (argv0, '_');
2073 if (NULL == ret)
2074 return NULL;
2075 ret++; /* skip underscore */
2076 dot = strchr (ret,
2077 '.');
2078 if (NULL != dot)
2079 return GNUNET_strndup (ret,
2080 dot - ret);
2081 return GNUNET_strdup (ret);
2082}

References GNUNET_strdup, GNUNET_strndup, and ret.

◆ GNUNET_STRINGS_parse_ipv4_policy()

struct GNUNET_STRINGS_IPv4NetworkPolicy * GNUNET_STRINGS_parse_ipv4_policy ( const char *  routeListX)

Parse an IPv4 network policy.

The argument specifies a list of subnets. The format is (network[/netmask][:[!]SPORT-DPORT];)* (no whitespace, must be terminated with a semicolon). The network must be given in dotted-decimal notation. The netmask can be given in CIDR notation (/16) or in dotted-decimal (/255.255.0.0).

Parameters
routeListXa string specifying the IPv4 subnets
Returns
the converted list, terminated with all zeros; NULL if the syntax is flawed

Definition at line 1305 of file strings.c.

1306{
1307 size_t count;
1308 size_t len;
1309 size_t pos;
1310 unsigned int temps[8];
1312 char *routeList;
1313
1314 if (NULL == routeListX)
1315 return NULL;
1316 len = strlen (routeListX);
1317 if (0 == len)
1318 return NULL;
1319 routeList = GNUNET_strdup (routeListX);
1320 count = 0;
1321 for (size_t i = 0; i < len; i++)
1322 if (routeList[i] == ';')
1323 count++;
1324 GNUNET_assert (count < SIZE_MAX);
1325 result = GNUNET_new_array (count + 1,
1327 pos = 0;
1328 for (size_t i = 0; i < count; i++)
1329 {
1330 size_t colon;
1331 size_t end;
1332 char dummy;
1333
1334 for (colon = pos; ':' != routeList[colon]; colon++)
1335 if ((';' == routeList[colon]) || ('\0' == routeList[colon]))
1336 break;
1337 for (end = colon; ';' != routeList[end]; end++)
1338 if ('\0' == routeList[end])
1339 break;
1340 if ('\0' == routeList[end])
1341 break;
1342 routeList[end] = '\0';
1343 if (':' == routeList[colon])
1344 {
1345 routeList[colon] = '\0';
1346 if (GNUNET_OK != parse_port_policy (&routeList[colon + 1], &result[i].pp))
1347 break;
1348 }
1349 if (8 ==
1350 sscanf (&routeList[pos],
1351 "%u.%u.%u.%u/%u.%u.%u.%u%c",
1352 &temps[0],
1353 &temps[1],
1354 &temps[2],
1355 &temps[3],
1356 &temps[4],
1357 &temps[5],
1358 &temps[6],
1359 &temps[7],
1360 &dummy))
1361 {
1362 for (unsigned int j = 0; j < 8; j++)
1363 if (temps[j] > 0xFF)
1364 {
1366 _ ("Invalid format for IP: `%s'\n"),
1367 &routeList[pos]);
1369 GNUNET_free (routeList);
1370 return NULL;
1371 }
1372 result[i].network.s_addr = htonl ((temps[0] << 24) + (temps[1] << 16)
1373 + (temps[2] << 8) + temps[3]);
1374 result[i].netmask.s_addr = htonl ((temps[4] << 24) + (temps[5] << 16)
1375 + (temps[6] << 8) + temps[7]);
1376 pos = end + 1;
1377 continue;
1378 }
1379
1380 /* try second notation */
1381 {
1382 unsigned int slash;
1383
1384 if (5 ==
1385 sscanf (&routeList[pos],
1386 "%u.%u.%u.%u/%u%c",
1387 &temps[0],
1388 &temps[1],
1389 &temps[2],
1390 &temps[3],
1391 &slash,
1392 &dummy))
1393 {
1394 for (unsigned int j = 0; j < 4; j++)
1395 if (temps[j] > 0xFF)
1396 {
1398 _ ("Invalid format for IP: `%s'\n"),
1399 &routeList[pos]);
1401 GNUNET_free (routeList);
1402 return NULL;
1403 }
1404 result[i].network.s_addr = htonl ((temps[0] << 24) + (temps[1] << 16)
1405 + (temps[2] << 8) + temps[3]);
1406 if (slash <= 32)
1407 {
1408 result[i].netmask.s_addr = 0;
1409 while (slash > 0)
1410 {
1411 result[i].netmask.s_addr =
1412 (result[i].netmask.s_addr >> 1) + 0x80000000;
1413 slash--;
1414 }
1415 result[i].netmask.s_addr = htonl (result[i].netmask.s_addr);
1416 pos = end + 1;
1417 continue;
1418 }
1419 else
1420 {
1422 _ (
1423 "Invalid network notation ('/%d' is not legal in IPv4 CIDR)."),
1424 slash);
1426 GNUNET_free (routeList);
1427 return NULL; /* error */
1428 }
1429 }
1430 }
1431
1432 /* try third notation */
1433 if (4 ==
1434 sscanf (&routeList[pos],
1435 "%u.%u.%u.%u%c",
1436 &temps[0],
1437 &temps[1],
1438 &temps[2],
1439 &temps[3],
1440 &dummy))
1441 {
1442 for (unsigned int j = 0; j < 4; j++)
1443 if (temps[j] > 0xFF)
1444 {
1446 _ ("Invalid format for IP: `%s'\n"),
1447 &routeList[pos]);
1449 GNUNET_free (routeList);
1450 return NULL;
1451 }
1452 result[i].network.s_addr = htonl ((temps[0] << 24) + (temps[1] << 16)
1453 + (temps[2] << 8) + temps[3]);
1454 result[i].netmask.s_addr = htonl (0xffffffff); /* yeah, the htonl is useless */
1455 pos = end + 1;
1456 continue;
1457 }
1459 _ ("Invalid format for IP: `%s'\n"),
1460 &routeList[pos]);
1462 GNUNET_free (routeList);
1463 return NULL; /* error */
1464 }
1465 if (pos < strlen (routeList))
1466 {
1468 _ ("Invalid format: `%s'\n"),
1469 &routeListX[pos]);
1471 GNUNET_free (routeList);
1472 return NULL; /* oops */
1473 }
1474 GNUNET_free (routeList);
1475 return result; /* ok */
1476}
static int result
Global testing status.
#define GNUNET_new_array(n, type)
Allocate a size n array with structs or unions of the given type.
static enum GNUNET_GenericReturnValue parse_port_policy(const char *port_policy, struct GNUNET_STRINGS_PortPolicy *pp)
Parse the given port policy.
Definition strings.c:1260
IPV4 network in CIDR notation.
struct GNUNET_STRINGS_PortPolicy pp
Policy for port access.
struct in_addr netmask
IPv4 netmask.

References _, dummy, end, GNUNET_assert, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_new_array, GNUNET_OK, GNUNET_strdup, LOG, GNUNET_STRINGS_IPv4NetworkPolicy::netmask, parse_port_policy(), GNUNET_STRINGS_IPv4NetworkPolicy::pp, result, and SIZE_MAX.

Referenced by GNUNET_REGEX_ipv4policy2regex(), and process_acl4().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_STRINGS_parse_ipv6_policy()

struct GNUNET_STRINGS_IPv6NetworkPolicy * GNUNET_STRINGS_parse_ipv6_policy ( const char *  routeListX)

Parse an IPv6 network policy.

The argument specifies a list of subnets. The format is (network[/netmask[:[!]SPORT[-DPORT]]];)* (no whitespace, must be terminated with a semicolon). The network must be given in colon-hex notation. The netmask must be given in CIDR notation (/16) or can be omitted to specify a single host. Note that the netmask is mandatory if ports are specified.

Parameters
routeListXa string specifying the policy
Returns
the converted list, 0-terminated, NULL if the syntax is flawed

Definition at line 1480 of file strings.c.

1481{
1482 size_t count;
1483 size_t len;
1484 size_t pos;
1485 int ret;
1486 char *routeList;
1488 unsigned int off;
1489
1490 if (NULL == routeListX)
1491 return NULL;
1492 len = strlen (routeListX);
1493 if (0 == len)
1494 return NULL;
1495 routeList = GNUNET_strdup (routeListX);
1496 count = 0;
1497 for (size_t j = 0; j < len; j++)
1498 if (';' == routeList[j])
1499 count++;
1500 if (';' != routeList[len - 1])
1501 {
1503 _ ("Invalid network notation (does not end with ';': `%s')\n"),
1504 routeList);
1505 GNUNET_free (routeList);
1506 return NULL;
1507 }
1508 GNUNET_assert (count < UINT_MAX);
1509 result = GNUNET_new_array (count + 1,
1511 pos = 0;
1512 for (size_t i = 0; i < count; i++)
1513 {
1514 size_t start;
1515 size_t slash;
1516
1517 start = pos;
1518 while (';' != routeList[pos])
1519 pos++;
1520 slash = pos;
1521 while ( (slash > start) &&
1522 (routeList[slash] != '/') )
1523 slash--;
1524 if (slash <= start)
1525 {
1526 memset (&result[i].netmask,
1527 0xFF,
1528 sizeof(struct in6_addr));
1529 slash = pos;
1530 }
1531 else
1532 {
1533 size_t colon;
1534
1535 routeList[pos] = '\0';
1536 for (colon = pos; ':' != routeList[colon]; colon--)
1537 if ('/' == routeList[colon])
1538 break;
1539 if (':' == routeList[colon])
1540 {
1541 routeList[colon] = '\0';
1542 if (GNUNET_OK !=
1543 parse_port_policy (&routeList[colon + 1],
1544 &result[i].pp))
1545 {
1547 GNUNET_free (routeList);
1548 return NULL;
1549 }
1550 }
1551 ret = inet_pton (AF_INET6,
1552 &routeList[slash + 1],
1553 &result[i].netmask);
1554 if (ret <= 0)
1555 {
1556 char dummy;
1557 unsigned int bits;
1558 int save = errno;
1559
1560 if ( (1 != sscanf (&routeList[slash + 1],
1561 "%u%c",
1562 &bits,
1563 &dummy)) ||
1564 (bits > 128))
1565 {
1566 if (0 == ret)
1567 {
1569 _ ("Wrong format `%s' for netmask\n"),
1570 &routeList[slash]);
1571 }
1572 else
1573 {
1574 errno = save;
1576 "inet_pton");
1577 }
1579 GNUNET_free (routeList);
1580 return NULL;
1581 }
1582 off = 0;
1583 while (bits > 8)
1584 {
1585 result[i].netmask.s6_addr[off++] = 0xFF;
1586 bits -= 8;
1587 }
1588 while (bits > 0)
1589 {
1590 result[i].netmask.s6_addr[off] =
1591 (result[i].netmask.s6_addr[off] >> 1) + 0x80;
1592 bits--;
1593 }
1594 }
1595 }
1596 routeList[slash] = '\0';
1597 ret = inet_pton (AF_INET6,
1598 &routeList[start],
1599 &result[i].network);
1600 if (ret <= 0)
1601 {
1602 if (0 == ret)
1604 _ ("Wrong format `%s' for network\n"),
1605 &routeList[slash + 1]);
1606 else
1608 "inet_pton");
1610 GNUNET_free (routeList);
1611 return NULL;
1612 }
1613 pos++;
1614 }
1615 GNUNET_free (routeList);
1616 return result;
1617}
static void save()
Write persistent statistics to disk.
@ GNUNET_ERROR_TYPE_ERROR
network in CIDR notation for IPV6.
struct GNUNET_STRINGS_PortPolicy pp
Policy for port access.
struct in6_addr network
IPv6 address.
struct in6_addr netmask
IPv6 netmask.

References _, dummy, GNUNET_assert, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_new_array, GNUNET_OK, GNUNET_strdup, LOG, LOG_STRERROR, GNUNET_STRINGS_IPv6NetworkPolicy::netmask, GNUNET_STRINGS_IPv6NetworkPolicy::network, parse_port_policy(), GNUNET_STRINGS_IPv6NetworkPolicy::pp, result, ret, save(), and start.

Referenced by GNUNET_REGEX_ipv6policy2regex(), and process_acl6().

Here is the call graph for this function:
Here is the caller graph for this function: