/* SPDX-License-Identifier: LGPL-3.0-or-later */
/*
* Copyright (C) 2008 Banco do Brasil S.A.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*/
/*
* Contatos:
*
* perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
* erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
*
*/
/**
* @brief Linux Utility functions.
*/
#include
#include
#include
#include
static char * concat(char *path, const char *name, size_t *length) {
size_t szCurrent = strlen(path);
if(szCurrent > 1 && path[szCurrent-1] != '/')
strcat(path,"/");
szCurrent += strlen(name);
if(szCurrent >= *length) {
*length += (szCurrent + 1024);
path = lib3270_realloc(path,*length);
}
strcat(path,name);
return path;
}
static char * build_filename(const char *root, const char *str, va_list args) {
size_t szFilename = 1024 + strlen(root);
char * filename = (char *) lib3270_malloc(szFilename);
strcpy(filename,root);
while(str) {
filename = concat(filename,str,&szFilename);
str = va_arg(args, const char *);
}
return (char *) lib3270_realloc(filename,strlen(filename)+1);
}
char * lib3270_build_data_filename(const char *str, ...) {
va_list args;
va_start (args, str);
char *filename = build_filename(LIB3270_STRINGIZE_VALUE_OF(DATADIR), str, args);
va_end (args);
return filename;
}
char * lib3270_build_config_filename(const char *str, ...) {
va_list args;
va_start (args, str);
char *filename = build_filename(LIB3270_STRINGIZE_VALUE_OF(CONFDIR), str, args);
va_end (args);
return filename;
}
char * lib3270_build_filename(const char *str, ...) {
size_t szFilename = 1024;
char * filename = (char *) lib3270_malloc(szFilename);
char * tempname;
// First build the base filename
memset(filename,0,szFilename);
va_list args;
va_start (args, str);
while(str) {
filename = concat(filename,str,&szFilename);
str = va_arg(args, const char *);
}
va_end (args);
// Check paths
size_t ix;
static const char * paths[] = {
LIB3270_STRINGIZE_VALUE_OF(DATADIR),
LIB3270_STRINGIZE_VALUE_OF(CONFDIR),
"."
};
for(ix = 0; ix < (sizeof(paths)/sizeof(paths[0])); ix++) {
tempname = lib3270_strdup_printf("%s/%s",paths[ix],filename);
if(access(tempname, F_OK) == 0) {
lib3270_free(filename);
return tempname;
}
lib3270_free(tempname);
}
// Not found! Force the standard data dir
tempname = lib3270_strdup_printf("%s/%s",paths[0],filename);
lib3270_free(filename);
return tempname;
}