diff options
-rw-r--r-- | src/CMakeLists.txt | 7 | ||||
-rw-r--r-- | src/utils-file.c | 129 | ||||
-rw-r--r-- | src/utils-file.h | 24 |
3 files changed, 157 insertions, 3 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6b2b280..f126346 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -41,7 +41,7 @@ set(CMAKE_C_FLAGS_CCOV "-g -O2 --coverage") include(FindPkgConfig) -pkg_check_modules(EXTRAS REQUIRED libxml-2.0 openssl xmlsec1 xmlsec1-openssl) +pkg_check_modules(EXTRAS REQUIRED libxml-2.0 openssl xmlsec1 xmlsec1-openssl json-c) add_compile_options(${EXTRAS_CFLAGS}) include_directories(${EXTRAS_INCLUDE_DIRS}) link_libraries(${EXTRAS_LIBRARIES}) @@ -95,6 +95,8 @@ add_library(wgtpkg STATIC add_library(utils STATIC utils-dir.c + utils-file.c + utils-json.c verbose.c ) @@ -131,7 +133,7 @@ install(TARGETS wgtpkg-sign wgtpkg-pack wgtpkg-info wgtpkg-installer DESTINATION ########################################################################### # the targeted -pkg_check_modules(EXTRA2 json-c libsystemd) +pkg_check_modules(EXTRA2 libsystemd) if(EXTRA2_FOUND) add_compile_options(${EXTRA2_CFLAGS}) include_directories(${EXTRA2_INCLUDE_DIRS}) @@ -139,7 +141,6 @@ if(EXTRA2_FOUND) add_library(utils2 STATIC utils-jbus.c - utils-json.c ) add_library(afm STATIC diff --git a/src/utils-file.c b/src/utils-file.c new file mode 100644 index 0000000..09eaaed --- /dev/null +++ b/src/utils-file.c @@ -0,0 +1,129 @@ +/* + Copyright 2017 IoT.bzh + + author: José Bollo <jose.bollo@iot.bzh> + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#define _GNU_SOURCE + +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> +#include <sys/stat.h> +#include <fcntl.h> + +#include "utils-file.h" + +/* alias for getfile_at(AT_FDCWD, file, content, size) */ +int getfile(const char *file, char **content, size_t *size) +{ + return getfile_at(AT_FDCWD, file, content, size); +} + +/* + * Reads the 'file' relative to 'dfd' (see openat) in a freshly + * allocated memory and returns it in 'content' and 'size' (if not NULL). + * To help in reading text files, a pending null is added at the + * end of the content. + * Return 0 in case of success or else -1 and set 'errno'. + */ +int getfile_at(int dfd, const char *file, char **content, size_t *size) +{ + int rc, f; + struct stat s; + char *r; + ssize_t rsz; + size_t sz, i; + + if (content) + *content = NULL; + rc = openat(dfd, file, O_RDONLY); + if (rc >= 0) { + f = rc; + rc = fstat(f, &s); + if (rc != 0) { + /* nothing */; + } else if (!S_ISREG(s.st_mode)) { + rc = -1; + errno = EBADF; + } else { + sz = (size_t)s.st_size; + if (content) { + r = malloc(sz + 1); + if (!r) { + errno = ENOMEM; + rc = -1; + } else { + i = 0; + while (!rc && i < sz) { + rsz = read(f, r + i, sz - i); + if (rsz == 0) + sz = i; + else if (rsz > 0) + i += (size_t)rsz; + else if (errno != EINTR && errno != EAGAIN) { + free(r); + rc = -1; + } + } + if (rc == 0) { + r[sz] = 0; + *content = r; + } + } + } + if (size) + *size = sz; + } + close(f); + } + return rc; +} + +/* alias for putfile_at(AT_FDCWD, file, content, size) */ +int putfile(const char *file, const void *content, size_t size) +{ + return putfile_at(AT_FDCWD, file, content, size); +} + +int putfile_at(int dfd, const char *file, const void *content, size_t size) +{ + int rc, f; + ssize_t wsz; + size_t i; + + rc = openat(dfd, file, O_WRONLY|O_CREAT|O_TRUNC, 0666); + if (rc >= 0) { + if (size == (size_t)(ssize_t)-1) + size = strlen(content); + f = rc; + if (rc < 0) + i = 0; + rc = 0; + while (!rc && i < size) { + wsz = write(f, content + i, size - i); + if (wsz >= 0) + i += (size_t)wsz; + else if (errno != EINTR && errno != EAGAIN) { + unlinkat(dfd, file, 0); + rc = -1; + } + } + close(f); + } + return rc; +} + diff --git a/src/utils-file.h b/src/utils-file.h new file mode 100644 index 0000000..a29b09a --- /dev/null +++ b/src/utils-file.h @@ -0,0 +1,24 @@ +/* + Copyright 2017 IoT.bzh + + author: José Bollo <jose.bollo@iot.bzh> + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +extern int getfile_at(int dfd, const char *file, char **content, size_t *size); +extern int getfile(const char *file, char **content, size_t *size); + +extern int putfile_at(int dfd, const char *file, const void *content, size_t size); +extern int putfile(const char *file, const void *content, size_t size); + |