|
Packit Service |
087331 |
// SPDX-License-Identifier: GPL-2.0
|
|
Packit Service |
087331 |
/*
|
|
Packit Service |
087331 |
* utils: set of common functions
|
|
Packit Service |
087331 |
*
|
|
Packit Service |
087331 |
* Copyright (C) 2020 Patrick Uiterwijk <patrick@puiterwijk.org>
|
|
Packit Service |
087331 |
* Copyright (C) 2010 Cyril Hrubis <chrubis@suse.cz>
|
|
Packit Service |
087331 |
*/
|
|
Packit Service |
087331 |
#include <stdint.h>
|
|
Packit Service |
087331 |
#include <stdio.h>
|
|
Packit Service |
087331 |
#include <stdlib.h>
|
|
Packit Service |
087331 |
#include <string.h>
|
|
Packit Service |
087331 |
#include <sys/stat.h>
|
|
Packit Service |
087331 |
#include <unistd.h>
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
#include "utils.h"
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
#ifndef MIN
|
|
Packit Service |
087331 |
# define MIN(a, b) ({ \
|
|
Packit Service |
087331 |
typeof(a) _a = (a); \
|
|
Packit Service |
087331 |
typeof(b) _b = (b); \
|
|
Packit Service |
087331 |
_a < _b ? _a : _b; \
|
|
Packit Service |
087331 |
})
|
|
Packit Service |
087331 |
#endif /* MIN */
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
static int file_exist(const char *path)
|
|
Packit Service |
087331 |
{
|
|
Packit Service |
087331 |
struct stat st;
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
if (!access(path, R_OK) && !stat(path, &st) && S_ISREG(st.st_mode))
|
|
Packit Service |
087331 |
return 1;
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
return 0;
|
|
Packit Service |
087331 |
}
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
int get_cmd_path(const char *prog_name, char *buf, size_t buf_len)
|
|
Packit Service |
087331 |
{
|
|
Packit Service |
087331 |
const char *path = (const char *)getenv("PATH");
|
|
Packit Service |
087331 |
const char *start = path;
|
|
Packit Service |
087331 |
const char *end;
|
|
Packit Service |
087331 |
size_t size, ret;
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
if (path == NULL)
|
|
Packit Service |
087331 |
return -1;
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
do {
|
|
Packit Service |
087331 |
end = strchr(start, ':');
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
if (end != NULL)
|
|
Packit Service |
087331 |
snprintf(buf, MIN(buf_len, (size_t) (end - start + 1)),
|
|
Packit Service |
087331 |
"%s", start);
|
|
Packit Service |
087331 |
else
|
|
Packit Service |
087331 |
snprintf(buf, buf_len, "%s", start);
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
size = strlen(buf);
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
/*
|
|
Packit Service |
087331 |
* "::" inside $PATH, $PATH ending with ':' or $PATH starting
|
|
Packit Service |
087331 |
* with ':' should be expanded into current working directory.
|
|
Packit Service |
087331 |
*/
|
|
Packit Service |
087331 |
if (size == 0) {
|
|
Packit Service |
087331 |
snprintf(buf, buf_len, ".");
|
|
Packit Service |
087331 |
size = strlen(buf);
|
|
Packit Service |
087331 |
}
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
/*
|
|
Packit Service |
087331 |
* If there is no '/' ad the end of path from $PATH add it.
|
|
Packit Service |
087331 |
*/
|
|
Packit Service |
087331 |
if (buf[size - 1] != '/')
|
|
Packit Service |
087331 |
ret =
|
|
Packit Service |
087331 |
snprintf(buf + size, buf_len - size, "/%s",
|
|
Packit Service |
087331 |
prog_name);
|
|
Packit Service |
087331 |
else
|
|
Packit Service |
087331 |
ret =
|
|
Packit Service |
087331 |
snprintf(buf + size, buf_len - size, "%s",
|
|
Packit Service |
087331 |
prog_name);
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
if (buf_len - size > ret && file_exist(buf))
|
|
Packit Service |
087331 |
return 0;
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
start = end + 1;
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
} while (end != NULL);
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
return -1;
|
|
Packit Service |
087331 |
}
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
int hex_to_bin(char ch)
|
|
Packit Service |
087331 |
{
|
|
Packit Service |
087331 |
if ((ch >= '0') && (ch <= '9'))
|
|
Packit Service |
087331 |
return ch - '0';
|
|
Packit Service |
087331 |
ch = tolower(ch);
|
|
Packit Service |
087331 |
if ((ch >= 'a') && (ch <= 'f'))
|
|
Packit Service |
087331 |
return ch - 'a' + 10;
|
|
Packit Service |
087331 |
return -1;
|
|
Packit Service |
087331 |
}
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
int hex2bin(void *dst, const char *src, size_t count)
|
|
Packit Service |
087331 |
{
|
|
Packit Service |
087331 |
int hi, lo;
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
while (count--) {
|
|
Packit Service |
087331 |
if (*src == ' ')
|
|
Packit Service |
087331 |
src++;
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
hi = hex_to_bin(*src++);
|
|
Packit Service |
087331 |
lo = hex_to_bin(*src++);
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
if ((hi < 0) || (lo < 0))
|
|
Packit Service |
087331 |
return -1;
|
|
Packit Service |
087331 |
|
|
Packit Service |
087331 |
*(uint8_t *)dst++ = (hi << 4) | lo;
|
|
Packit Service |
087331 |
}
|
|
Packit Service |
087331 |
return 0;
|
|
Packit Service |
087331 |
}
|