Blame utils.h

Packit 400c17
/*
Packit 400c17
	Copyright(C) 2016, Red Hat, Inc., Stanislav Kozina
Packit 400c17
Packit 400c17
	This program is free software: you can redistribute it and/or modify
Packit 400c17
	it under the terms of the GNU General Public License as published by
Packit 400c17
	the Free Software Foundation, either version 3 of the License, or
Packit 400c17
	(at your option) any later version.
Packit 400c17
Packit 400c17
	This program is distributed in the hope that it will be useful,
Packit 400c17
	but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 400c17
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 400c17
	GNU General Public License for more details.
Packit 400c17
Packit 400c17
	You should have received a copy of the GNU General Public License
Packit 400c17
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit 400c17
*/
Packit 400c17
Packit 400c17
#ifndef UTILS_H_
Packit 400c17
#define	UTILS_H_
Packit 400c17
Packit 400c17
#include <stdarg.h>
Packit 400c17
#include <stdio.h>
Packit 400c17
#include <stdbool.h>
Packit 400c17
#include <string.h>
Packit 400c17
#include <errno.h>
Packit 400c17
Packit 400c17
/*
Packit 400c17
 * Changes to file format that keep backward compatibility call for
Packit 400c17
 * incementing the minor number, changes that don't calls for
Packit 400c17
 * incrementing the major number.
Packit 400c17
 */
Packit 400c17
#define _VERSION(s,j) _STR(s,j)
Packit 400c17
#define _STR(s,j) _STR2(Version: s##.j\n)
Packit 400c17
#define _STR2(s) #s
Packit 400c17
Packit 400c17
#define FILEFMT_VERSION_MAJOR	1
Packit 400c17
#define FILEFMT_VERSION_MINOR	0
Packit 400c17
#define FILEFMT_VERSION_STRING	\
Packit 400c17
	_VERSION(FILEFMT_VERSION_MAJOR,FILEFMT_VERSION_MINOR)
Packit 400c17
Packit 400c17
#define	fail(fmt, ...)	{					\
Packit 400c17
	fprintf(stderr, "%s():%d ", __func__, __LINE__);	\
Packit 400c17
	fprintf(stderr, fmt, ## __VA_ARGS__);			\
Packit 400c17
	exit(1);						\
Packit 400c17
}
Packit 400c17
Packit 400c17
static inline void safe_asprintf(char **strp, const char *fmt, ...)
Packit 400c17
{
Packit 400c17
	va_list arglist;
Packit 400c17
Packit 400c17
	va_start(arglist, fmt);
Packit 400c17
	if (vasprintf(strp, fmt, arglist) == -1)
Packit 400c17
		fail("asprintf failed: %s", strerror(errno));
Packit 400c17
	va_end(arglist);
Packit 400c17
}
Packit 400c17
Packit 400c17
static inline void *safe_zmalloc(size_t size)
Packit 400c17
{
Packit 400c17
	void *result = malloc(size);
Packit 400c17
Packit 400c17
	if (result == NULL)
Packit 400c17
		fail("Malloc of size %zu failed", size);
Packit 400c17
	memset(result, 0, size);
Packit 400c17
	return result;
Packit 400c17
}
Packit 400c17
Packit 400c17
static inline void *safe_realloc(void *ptr, size_t size)
Packit 400c17
{
Packit 400c17
	void *result = realloc(ptr, size);
Packit 400c17
Packit 400c17
	if (result == NULL)
Packit 400c17
		fail("Rellloc of size %zu failed: %s\n", size, strerror(errno));
Packit 400c17
	return result;
Packit 400c17
}
Packit 400c17
Packit 400c17
static inline void *safe_strdup(const char *s)
Packit 400c17
{
Packit 400c17
	void *result = strdup(s);
Packit 400c17
Packit 400c17
	if (result == NULL)
Packit 400c17
		fail("strdup() of \"%s\" failed", s);
Packit 400c17
	return result;
Packit 400c17
}
Packit 400c17
Packit 400c17
static inline void *safe_strdup_or_null(const char *s)
Packit 400c17
{
Packit 400c17
	if (s == NULL)
Packit 400c17
		return NULL;
Packit 400c17
	return safe_strdup(s);
Packit 400c17
}
Packit 400c17
Packit 400c17
static inline bool safe_streq(const char *s1, const char *s2)
Packit 400c17
{
Packit 400c17
	if ((s1 == NULL) != (s2 == NULL))
Packit 400c17
		return false;
Packit 400c17
	if (s1)
Packit 400c17
		return !strcmp(s1, s2);
Packit 400c17
	return true;
Packit 400c17
}
Packit 400c17
Packit 400c17
static inline bool safe_strendswith(const char *s1, const char *s2)
Packit 400c17
{
Packit 400c17
	int len1, len2;
Packit 400c17
Packit 400c17
	if ((s1 == NULL) != (s2 == NULL))
Packit 400c17
		return false;
Packit 400c17
Packit 400c17
	if (!s1)
Packit 400c17
		return true;
Packit 400c17
Packit 400c17
	len1 = strlen(s1);
Packit 400c17
	len2 = strlen(s2);
Packit 400c17
Packit 400c17
	if ((len1 == 0) || (len2 == 0))
Packit 400c17
		return false;
Packit 400c17
Packit 400c17
	if (len2 > len1)
Packit 400c17
		return false;
Packit 400c17
Packit 400c17
	return strcmp(s1 + len1 - len2, s2) == 0;
Packit 400c17
}
Packit 400c17
Packit 400c17
static inline ssize_t safe_getline(char **lineptr, size_t *n, FILE *stream)
Packit 400c17
{
Packit 400c17
	ssize_t ret = getline(lineptr, n, stream);
Packit 400c17
Packit 400c17
	if ((ret == -1) && (errno != ENOENT))
Packit 400c17
		fail("getline failed: %s\n", strerror(errno));
Packit 400c17
Packit 400c17
	return ret;
Packit 400c17
}
Packit 400c17
Packit 400c17
static inline FILE *safe_fopen(char *filename)
Packit 400c17
{
Packit 400c17
	FILE *file;
Packit 400c17
Packit 400c17
	file = fopen(filename, "r");
Packit 400c17
	if (!file)
Packit 400c17
		fail("Failed to open kABI file: %s\n", filename);
Packit 400c17
Packit 400c17
	return file;
Packit 400c17
}
Packit 400c17
Packit 400c17
typedef enum {
Packit 400c17
	WALK_CONT,
Packit 400c17
	WALK_STOP,
Packit 400c17
	WALK_SKIP,
Packit 400c17
} walk_rv_t;
Packit 400c17
Packit 400c17
extern void walk_dir(char *, bool, walk_rv_t (*)(char *, void *), void *);
Packit 400c17
extern int check_is_directory(char *);
Packit 400c17
extern void rec_mkdir(char *);
Packit 400c17
extern void safe_rename(const char *, const char *);
Packit 400c17
extern char *path_normalize(char *);
Packit 400c17
extern char *filenametotype(char *);
Packit 400c17
extern char *filenametosymbol(char *);
Packit 400c17
Packit 400c17
#endif /* UTILS_H */