diff options
Diffstat (limited to 'src/libmdsserver')
-rw-r--r-- | src/libmdsserver/client-list.c | 2 | ||||
-rw-r--r-- | src/libmdsserver/client-list.h | 2 | ||||
-rw-r--r-- | src/libmdsserver/config.h.in | 2 | ||||
-rw-r--r-- | src/libmdsserver/fd-table.c | 2 | ||||
-rw-r--r-- | src/libmdsserver/fd-table.h | 2 | ||||
-rw-r--r-- | src/libmdsserver/hash-help.h | 2 | ||||
-rw-r--r-- | src/libmdsserver/hash-list.h | 2 | ||||
-rw-r--r-- | src/libmdsserver/hash-table.c | 2 | ||||
-rw-r--r-- | src/libmdsserver/hash-table.h | 2 | ||||
-rw-r--r-- | src/libmdsserver/linked-list.c | 2 | ||||
-rw-r--r-- | src/libmdsserver/linked-list.h | 2 | ||||
-rw-r--r-- | src/libmdsserver/macro-bits.h | 2 | ||||
-rw-r--r-- | src/libmdsserver/macros.h | 118 | ||||
-rw-r--r-- | src/libmdsserver/mds-message.c | 6 | ||||
-rw-r--r-- | src/libmdsserver/mds-message.h | 2 | ||||
-rw-r--r-- | src/libmdsserver/table-common.h | 2 | ||||
-rw-r--r-- | src/libmdsserver/util.c | 145 | ||||
-rw-r--r-- | src/libmdsserver/util.h | 34 |
18 files changed, 38 insertions, 293 deletions
diff --git a/src/libmdsserver/client-list.c b/src/libmdsserver/client-list.c index 02d555e..57609ef 100644 --- a/src/libmdsserver/client-list.c +++ b/src/libmdsserver/client-list.c @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 diff --git a/src/libmdsserver/client-list.h b/src/libmdsserver/client-list.h index ffe828a..b4ae0b2 100644 --- a/src/libmdsserver/client-list.h +++ b/src/libmdsserver/client-list.h @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 diff --git a/src/libmdsserver/config.h.in b/src/libmdsserver/config.h.in index abacfa1..11b0444 100644 --- a/src/libmdsserver/config.h.in +++ b/src/libmdsserver/config.h.in @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 diff --git a/src/libmdsserver/fd-table.c b/src/libmdsserver/fd-table.c index fafaa65..1344a0e 100644 --- a/src/libmdsserver/fd-table.c +++ b/src/libmdsserver/fd-table.c @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 diff --git a/src/libmdsserver/fd-table.h b/src/libmdsserver/fd-table.h index e484937..cb7f152 100644 --- a/src/libmdsserver/fd-table.h +++ b/src/libmdsserver/fd-table.h @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 diff --git a/src/libmdsserver/hash-help.h b/src/libmdsserver/hash-help.h index 0d80cf3..2dda579 100644 --- a/src/libmdsserver/hash-help.h +++ b/src/libmdsserver/hash-help.h @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 diff --git a/src/libmdsserver/hash-list.h b/src/libmdsserver/hash-list.h index 2087bce..fb12341 100644 --- a/src/libmdsserver/hash-list.h +++ b/src/libmdsserver/hash-list.h @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 diff --git a/src/libmdsserver/hash-table.c b/src/libmdsserver/hash-table.c index 2a7bc3c..a9247eb 100644 --- a/src/libmdsserver/hash-table.c +++ b/src/libmdsserver/hash-table.c @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 diff --git a/src/libmdsserver/hash-table.h b/src/libmdsserver/hash-table.h index 448a52d..32b0716 100644 --- a/src/libmdsserver/hash-table.h +++ b/src/libmdsserver/hash-table.h @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 diff --git a/src/libmdsserver/linked-list.c b/src/libmdsserver/linked-list.c index 954c6fe..235a474 100644 --- a/src/libmdsserver/linked-list.c +++ b/src/libmdsserver/linked-list.c @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 diff --git a/src/libmdsserver/linked-list.h b/src/libmdsserver/linked-list.h index fa115f1..bd38f1e 100644 --- a/src/libmdsserver/linked-list.h +++ b/src/libmdsserver/linked-list.h @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 diff --git a/src/libmdsserver/macro-bits.h b/src/libmdsserver/macro-bits.h index a93b39e..7b697c2 100644 --- a/src/libmdsserver/macro-bits.h +++ b/src/libmdsserver/macro-bits.h @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 diff --git a/src/libmdsserver/macros.h b/src/libmdsserver/macros.h index 45412b9..26ef4c0 100644 --- a/src/libmdsserver/macros.h +++ b/src/libmdsserver/macros.h @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 @@ -22,31 +22,15 @@ #include "config.h" #include "macro-bits.h" -#include <stdio.h> -#include <errno.h> -#include <signal.h> -#include <unistd.h> -#include <time.h> -#include <stddef.h> -#include <sys/socket.h> - /* #include <pthread.h> -#include <string.h> #include <sys/types.h> -#include <dirent.h> -#include <stdlib.h> */ /* # pragma GCC diagnostic ignored "-Wpedantic" */ -/* CLOCK_MONOTONIC_RAW is a Linux-specific bug-fix */ -#ifndef CLOCK_MONOTONIC_RAW -# define CLOCK_MONOTONIC_RAW CLOCK_MONOTONIC -#endif - /* Define TEMP_FAILURE_RETRY if not defined, however * this version does not return a value, it will hoever * clear `errno` if no error occurs. */ @@ -64,48 +48,6 @@ #endif -/* Ensure that all aliases for AF_UNIX are defined */ -#if !defined(AF_LOCAL) && !defined(AF_UNIX) && defined(AF_FILE) -# define AF_LOCAL AF_FILE -# define AF_UNIX AF_FILE -#elif !defined(AF_LOCAL) && defined(AF_UNIX) -# define AF_LOCAL AF_UNIX -#elif defined(AF_LOCAL) && !defined(AF_UNIX) -# define AF_UNIX AF_LOCAL -#endif -#if !defined(AF_FILE) && defined(AF_LOCAL) -# define AF_FILE AF_LOCAL -#endif - -/* Ensure that all aliases for PF_UNIX are defined */ -#if !defined(PF_LOCAL) && !defined(PF_UNIX) && defined(PF_FILE) -# define PF_LOCAL PF_FILE -# define PF_UNIX PF_FILE -#elif !defined(PF_LOCAL) && defined(PF_UNIX) -# define PF_LOCAL PF_UNIX -#elif defined(PF_LOCAL) && !defined(PF_UNIX) -# define PF_UNIX PF_LOCAL -#endif -#if !defined(PF_FILE) && defined(PF_LOCAL) -# define PF_FILE PF_LOCAL -#endif - -/* Ensure that all aliases for AF_NETLINK are defined */ -#if !defined(AF_NETLINK) && defined(AF_ROUTE) -# define AF_NETLINK AF_ROUTE -#elif defined(AF_NETLINK) && !defined(AF_ROUTE) -# define AF_ROUTE AF_NETLINK -#endif - -/* Ensure that all aliases for PF_NETLINK are defined */ -#if !defined(PF_NETLINK) && defined(PF_ROUTE) -# define PF_NETLINK PF_ROUTE -#elif defined(PF_NETLINK) && !defined(PF_ROUTE) -# define PF_ROUTE PF_NETLINK -#endif - - - /** * Wrapper around `asprintf` that makes sure that first * argument gets set to `NULL` on error and that zero is @@ -223,28 +165,6 @@ /** - * Return the maximum value of two values - * - * @param a One of the values - * @param b The other one of the values - * @return The maximum value - */ -#define max(a, b)\ - ((a) < (b) ? (b) : (a)) - - -/** - * Return the minimum value of two values - * - * @param a One of the values - * @param b The other one of the values - * @return The minimum value - */ -#define min(a, b)\ - ((a) < (b) ? (a) : (b)) - - -/** * Cast a buffer to another type and get the slot for an element * * @param buffer:char* The buffer @@ -335,28 +255,6 @@ /** - * Check whether two strings are equal - * - * @param a:const char* One of the strings - * @param b:const char* The other of the strings - * @return :int Whether the strings are equal - */ -#define strequals(a, b)\ - (!strcmp(a, b)) - - -/** - * Check whether a string starts with another string - * - * @param haystack:const char* The string to inspect - * @param needle:const char* The string `haystack` should start with - * @return :int Whether `haystack` starts with `needle` - */ -#define startswith(haystack, needle)\ - (strstr(haystack, needle) == haystack) - - -/** * Set effective user and the effective group to the * real user and the real group, respectively. If the * group cannot be set, the user till not be set either. @@ -664,7 +562,7 @@ /** * `strdup` wrapper that returns whether the allocation was not successful * - * This macro was added because GCC 6.1.1 warns of `original` is known to + * This macro was added because GCC 6.1.1 warns if `original` is known to * be nonnull, when using `xstrdup`. * * @param var:char* The variable to which to assign the duplicate @@ -748,18 +646,6 @@ /** - * The way to get a pointer to the end of a string - * - * `strchr(str, '\0')` is faster than `str + strlen(str)`, - * at least in the GNU C Library. If this is not true for - * the compiler you are using, you may want to edit this - * macro. - */ -#define STREND(str)\ - (strchr(str, '\0')) - - -/** * The system is running out of memory. * Quick, free up all your unused memory or kill yourself! */ diff --git a/src/libmdsserver/mds-message.c b/src/libmdsserver/mds-message.c index c3d968f..0e93520 100644 --- a/src/libmdsserver/mds-message.c +++ b/src/libmdsserver/mds-message.c @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 @@ -196,7 +196,7 @@ validate_header(const char *header, size_t length) { char *p = memchr(header, ':', length * sizeof(char)); - if (verify_utf8(header, 0) < 0) + if (!isutf8(header, 0)) /* Either the string is not UTF-8, or your are under an UTF-8 attack, let's just call this unrecoverable because the client will not correct. */ return -2; @@ -392,7 +392,7 @@ mds_message_read(mds_message_t *restrict this, int fd) /* How much of the payload that has not yet been filled. */ need = this->payload_size - this->payload_ptr; /* How much we have of that what is needed. */ - move = min(this->buffer_ptr, need); + move = MIN(this->buffer_ptr, need); /* Copy what we have, and remove it from the the read buffer. */ memcpy(this->payload + this->payload_ptr, this->buffer, move * sizeof(char)); diff --git a/src/libmdsserver/mds-message.h b/src/libmdsserver/mds-message.h index c6627e9..66023a2 100644 --- a/src/libmdsserver/mds-message.h +++ b/src/libmdsserver/mds-message.h @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 diff --git a/src/libmdsserver/table-common.h b/src/libmdsserver/table-common.h index f21675a..6282693 100644 --- a/src/libmdsserver/table-common.h +++ b/src/libmdsserver/table-common.h @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 diff --git a/src/libmdsserver/util.c b/src/libmdsserver/util.c index 09d996a..5a7450a 100644 --- a/src/libmdsserver/util.c +++ b/src/libmdsserver/util.c @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 @@ -19,19 +19,7 @@ #include "config.h" #include "macros.h" -#include <alloca.h> -#include <stdlib.h> -#include <unistd.h> -#include <limits.h> -#include <string.h> -#include <signal.h> -#include <sys/socket.h> -#include <errno.h> -#include <ctype.h> -#include <time.h> -#include <sys/wait.h> -#include <stdint.h> -#include <inttypes.h> +#include <libsimple.h> @@ -68,20 +56,6 @@ parse_client_id(const char *str) /** - * Read an environment variable, but handle it as undefined if empty - * - * @param var The environment variable's name - * @return The environment variable's value, `NULL` if empty or not defined - */ -char * -getenv_nonempty(const char *var) -{ - char *rc = getenv(var); - return (rc && *rc) ? rc : NULL; -} - - -/** * Prepare the server so that it can reexec into * a newer version of the executed file. * @@ -197,7 +171,7 @@ send_message(int socket, const char *message, size_t length) errno = 0; while (length > 0) { - if ((just_sent = send(socket, message + sent, min(block_size, length), MSG_NOSIGNAL)) < 0) { + if ((just_sent = send(socket, message + sent, MIN(block_size, length), MSG_NOSIGNAL)) < 0) { if (errno == EPIPE) errno = ECONNRESET; if (errno == EMSGSIZE) { @@ -275,17 +249,13 @@ strict_atoj(const char *str, intmax_t *value, intmax_t min, intmax_t max) return -1; while ((c = *str)) { - if ('0' <= c && c <= '9') { - if (r > INTMAX_MAX / 10) { - return -1; - } else if (r == INTMAX_MAX / 10) { - if ((c & 15) > INTMAX_MAX % 10) - return -1; - } - r = r * 10 + (c & 15); - } else { + if (!isdigit(c)) return -1; - } + if (r > INTMAX_MAX / 10) + return -1; + if (r == INTMAX_MAX / 10 && (c & 15) > INTMAX_MAX % 10) + return -1; + r = r * 10 + (c & 15); } if (neg) @@ -326,17 +296,13 @@ strict_atouj(const char *str, uintmax_t *value, uintmax_t min, uintmax_t max) return -1; while ((c = *str)) { - if ('0' <= c && c <= '9') { - if (r > INTMAX_MAX / 10) { - return -1; - } else if (r == INTMAX_MAX / 10) { - if ((c & 15) > INTMAX_MAX % 10) - return -1; - } - r = r * 10 + (c & 15); - } else { + if (!isdigit(c)) return -1; - } + if (r > INTMAX_MAX / 10) + return -1; + if (r == INTMAX_MAX / 10 && (c & 15) > INTMAX_MAX % 10) + return -1; + r = r * 10 + (c & 15); } if (r < min || r > max) @@ -588,8 +554,8 @@ full_write(int fd, const char *buffer, size_t length) errno = 0; wrote = write(fd, buffer, length); fail_if (errno && errno != EINTR); - length -= (size_t)max(wrote, 0); - buffer += (size_t)max(wrote, 0); + length -= (size_t)MAX(wrote, 0); + buffer += (size_t)MAX(wrote, 0); } return 0; fail: @@ -686,11 +652,9 @@ startswith_n(const char *haystack, const char *needle, size_t haystack_n, size_t size_t i; if (haystack_n < needle_n) return 0; - for (i = 0; i < needle_n; i++) if (haystack[i] != needle[i]) return 0; - return 1; } @@ -732,81 +696,6 @@ fail: /** - * Check whether a NUL-terminated string is encoded in UTF-8 - * - * @param string The string - * @param allow_modified_nul Whether Modified UTF-8 is allowed, which allows a two-byte encoding for NUL - * @return Zero if good, -1 on encoding error - */ -int -verify_utf8(const char *string, int allow_modified_nul) -{ - static long BYTES_TO_MIN_BITS[] = {0, 0, 8, 12, 17, 22, 37}; - static long BYTES_TO_MAX_BITS[] = {0, 7, 11, 16, 21, 26, 31}; - long bytes = 0, read_bytes = 0, bits = 0, c, character; - - /* min bits max bits - 0....... 0 7 - 110..... 10...... 8 11 - 1110.... 10...... 10...... 12 16 - 11110... 10...... 10...... 10...... 17 21 - 111110.. 10...... 10...... 10...... 10...... 22 26 - 1111110. 10...... 10...... 10...... 10...... 10...... 27 31 - */ - - while ((c = (long)(*string++))) { - if (read_bytes == 0) { - /* First byte of the character. */ - - if (!(c & 0x80)) - /* Single-byte character. */ - continue; - - if ((c & 0xC0) == 0x80) - /* Single-byte character marked as multibyte, or - a non-first byte in a multibyte character. */ - return -1; - - /* Multibyte character. */ - while ((c & 0x80)) - bytes++, c <<= 1; - read_bytes = 1; - character = c & 0x7F; - if (bytes > 6) - /* 31-bit characters can be encoded with 6-bytes, - and UTF-8 does not cover higher code points. */ - return -1; - } else { - /* Not first byte of the character. */ - - if ((c & 0xC0) != 0x80) - /* Beginning of new character before a - multibyte character has ended. */ - return -1; - - character = (character << 6) | (c & 0x7F); - - if (++read_bytes < bytes) - /* Not at last byte yet. */ - continue; - - /* Check that the character is not unnecessarily long. */ - while (character) - character >>= 1, bits++; - bits = ((bits == 0) && (bytes == 2) && allow_modified_nul) ? 8 : bits; - if ((bits < BYTES_TO_MIN_BITS[bytes]) || (BYTES_TO_MAX_BITS[bytes] < bits)) - return -1; - - read_bytes = bytes = bits = 0; - } - } - - /* Make sure we did not stop at the middle of a multibyte character. */ - return read_bytes == 0 ? 0 : -1; -} - - -/** * Construct an error message to be sent to a client * * @param recv_client_id The client ID attached on the message that was received, must not be `NULL` diff --git a/src/libmdsserver/util.h b/src/libmdsserver/util.h index 77cfa17..9f2953d 100644 --- a/src/libmdsserver/util.h +++ b/src/libmdsserver/util.h @@ -1,6 +1,6 @@ /** * mds — A micro-display server - * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (maandree@kth.se) + * Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se) * * 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 @@ -23,20 +23,9 @@ #include <stdint.h> #include <sys/types.h> +#include <libsimple.h> -#ifndef __USE_GNU -static inline void *__attribute__((pure, nonnull)) -rawmemchr(const void *str, int chr) -{ - intptr_t str_address = (intptr_t)str; - void *str_nonconst = (void*)str_address; - char *s = str_nonconst; - while ((int)*s++ != chr); - return s - 1; -} -#endif - /** * Convert a client ID string into a client ID integer @@ -48,15 +37,6 @@ __attribute__((pure, nonnull)) uint64_t parse_client_id(const char *str); /** - * Read an environment variable, but handle it as undefined if empty - * - * @param var The environment variable's name - * @return The environment variable's value, `NULL` if empty or not defined - */ -__attribute__((nonnull)) -char *getenv_nonempty(const char *var); - -/** * Prepare the server so that it can reexec into * a newer version of the executed file. * @@ -409,16 +389,6 @@ int startswith_n(const char *haystack, const char *needle, size_t haystack_n, si pid_t uninterruptable_waitpid(pid_t pid, int *restrict status, int options); /** - * Check whether a NUL-terminated string is encoded in UTF-8 - * - * @param string The string - * @param allow_modified_nul Whether Modified UTF-8 is allowed, which allows a two-byte encoding for NUL - * @return Zero if good, -1 on encoding error - */ -__attribute__((pure, nonnull)) -int verify_utf8(const char *string, int allow_modified_nul); - -/** * Construct an error message to be sent to a client * * @param recv_client_id The client ID attached on the message that was received, must not be `NULL` |