Split config into multiple sub-files on mount-point boundaries and dont write clean subfiles

Added CLICON_XMLDB_MULTI option, added cl:xmldb-split extension
This commit is contained in:
Olof hagsand 2024-04-16 12:19:15 +02:00
parent bd290e4594
commit f511cb0030
30 changed files with 1311 additions and 285 deletions

View file

@ -176,6 +176,7 @@ clicon_files_recursive(const char *dir,
* @code
* char *dir = "/root/fs";
* struct dirent *dp;
* int ndp;
* if ((ndp = clicon_file_dirent(dir, &dp, "\\.so$", S_IFREG)) < 0)
* return -1;
* for (i = 0; i < ndp; i++)
@ -221,6 +222,8 @@ clicon_file_dirent(const char *dir,
goto quit;
}
while((dent = readdir(dirp)) != NULL) {
if (strcmp(dent->d_name, ".") == 0 || strcmp(dent->d_name, "..") == 0)
continue;
/* Filename matching */
if (regexp) {
if (regexec(&re, dent->d_name, (size_t) 0, NULL, 0) != 0)
@ -250,7 +253,6 @@ clicon_file_dirent(const char *dir,
memcpy(&new[nent], dent, direntStructSize);
nent++;
} /* while */
qsort((void *)new, nent, sizeof(*new), clicon_file_dirent_sort);
*ent = new;
new = NULL;
@ -271,6 +273,7 @@ quit:
* @param[out] target Destination filename
* @retval 0 OK
* @retval -1 Error
* XXX This is probably faster with stdio?
*/
int
clicon_file_copy(char *src,
@ -312,6 +315,43 @@ clicon_file_copy(char *src,
return retval;
}
/*! Make a copy of directory non-recursive
*
* @param[in] srcdir Source dirname
* @param[out] dstdir Destination dirname
* @retval 0 OK
* @retval -1 Error
*/
int
clicon_dir_copy(char *srcdir,
char *dstdir)
{
int retval = -1;
struct dirent *dent = NULL;
DIR *dirp = NULL;
char srcfile[MAXPATHLEN];
char dstfile[MAXPATHLEN];
if (srcdir == NULL || dstdir == NULL){
clixon_err(OE_UNIX, EINVAL, "Requires src and dst dir != NULL");
goto done;
}
if ((dirp = opendir(srcdir)) != NULL)
while ((dent = readdir(dirp)) != NULL) {
if (dent->d_type != DT_REG)
continue;
snprintf(srcfile, MAXPATHLEN-1, "%s/%s", srcdir, dent->d_name);
snprintf(dstfile, MAXPATHLEN-1, "%s/%s", dstdir, dent->d_name);
if (clicon_file_copy(srcfile, dstfile) < 0)
goto done;
}
retval = 0;
done:
if (dirp)
closedir(dirp);
return retval;
}
/*! Read content of file into cbuf
*
* @param[in] filename