X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Futils.c;h=65ba4b90402bc0df2df50fccf2f3e618c6e37597;hp=594c91a5f76dd0c7726ba83893d43d41443e854a;hb=706d855e507980de3845556989d7de7a3b9c76e8;hpb=75e5b2e906bd8563bf0f53a76065618c88122e1c diff --git a/src/utils.c b/src/utils.c index 594c91a5..65ba4b90 100644 --- a/src/utils.c +++ b/src/utils.c @@ -18,10 +18,10 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include "logger.h" #include "system.h" - -#include "../src/logger.h" #include "utils.h" +#include "xalloc.h" static const char hexadecimals[] = "0123456789ABCDEF"; static const char base64_original[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; @@ -75,7 +75,7 @@ int b64decode(const char *src, void *dst, int length) { uint32_t triplet = 0; unsigned char *udst = (unsigned char *)dst; - for(i = 0; i < length / 3 * 4 && src[i]; i++) { + for(i = 0; i < length && src[i]; i++) { triplet |= base64_decode[src[i] & 0xff] << (6 * (i & 3)); if((i & 3) == 3) { if(triplet & 0xff000000U) @@ -179,3 +179,54 @@ unsigned int bitfield_to_int(const void *bitfield, size_t size) { memcpy(&value, bitfield, size); return value; } + +bool check_id(const char *id) { + if(!id || !*id) + return false; + + for(; *id; id++) + if(!isalnum(*id) && *id != '_') + return false; + + return true; +} + +/* Windows doesn't define HOST_NAME_MAX. */ +#ifndef HOST_NAME_MAX +#define HOST_NAME_MAX 255 +#endif + +char *replace_name(const char *name) { + char *ret_name; + + if (name[0] == '$') { + char *envname = getenv(name + 1); + char hostname[HOST_NAME_MAX+1]; + if (!envname) { + if (strcmp(name + 1, "HOST")) { + logger(DEBUG_ALWAYS, LOG_ERR, "Invalid Name: environment variable %s does not exist\n", name + 1); + return NULL; + } + if (gethostname(hostname, sizeof hostname) || !*hostname) { + logger(DEBUG_ALWAYS, LOG_ERR, "Could not get hostname: %s\n", sockstrerror(sockerrno)); + return NULL; + } + hostname[HOST_NAME_MAX] = 0; + envname = hostname; + } + ret_name = xstrdup(envname); + for (char *c = ret_name; *c; c++) + if (!isalnum(*c)) + *c = '_'; + } else { + ret_name = xstrdup(name); + } + + if (!check_id(ret_name)) { + logger(DEBUG_ALWAYS, LOG_ERR, "Invalid name for myself!"); + free(ret_name); + return NULL; + } + + return ret_name; +}