diff --git a/src/include/66/service.h b/src/include/66/service.h index b19734561416c0483270adbbf56056b5bc55c241..4776b3309901dc2c45fb2629d298e80d3e97ce23 100644 --- a/src/include/66/service.h +++ b/src/include/66/service.h @@ -312,7 +312,8 @@ extern int service_resolve_copy(resolve_service_t *dst, resolve_service_t *res) extern int service_resolve_get_field_tosa(stralloc *sa, resolve_service_t *res, resolve_service_enum_t field) ; extern int service_resolve_modify_field(resolve_service_t *res, resolve_service_enum_t field, char const *data) ; extern int service_resolve_read_cdb(cdb *c, resolve_service_t *res) ; -extern int service_resolve_write(resolve_service_t *res) ; +extern void service_resolve_write(resolve_service_t *res) ; +extern void service_resolve_write_tmp(resolve_service_t *res, char const *dst, uint8_t force) ; extern int service_resolve_write_cdb(cdbmaker *c, resolve_service_t *sres) ; extern void service_enable_disable(graph_t *g, resolve_service_t *res, resolve_service_t *ares, unsigned int areslen, uint8_t action, visit_t *visit) ; /* avoid circular dependencies by prototyping the ss_state_t instead diff --git a/src/include/66/state.h b/src/include/66/state.h index 07eeb9bf20dd07316fb7a33b8fbf4480ac005a08..67761f088679cb50cf034d1aa088f04d03b183af 100644 --- a/src/include/66/state.h +++ b/src/include/66/state.h @@ -83,6 +83,7 @@ extern void state_unpack(char *pack, ss_state_t *sta) ; extern void state_set_flag(ss_state_t *sta, int flags,int flags_val) ; extern int state_check(resolve_service_t *res) ; extern int state_write(ss_state_t *sta, resolve_service_t *res) ; +extern int state_write_tmp(ss_state_t *sta, char const *tmp) ; extern int state_read(ss_state_t *sta, resolve_service_t *res) ; extern int state_messenger(resolve_service_t *res, uint32_t flag, uint32_t value) ; diff --git a/src/lib66/service/deps-lib/deps b/src/lib66/service/deps-lib/deps index 7c95830e872611c71b4c8ea2ab8ab0598ac1de74..af99bdb4e3ea311a76f60f36809883997114e78d 100644 --- a/src/lib66/service/deps-lib/deps +++ b/src/lib66/service/deps-lib/deps @@ -12,9 +12,10 @@ service_resolve_array_search.o service_resolve_copy.o service_resolve_get_field_tosa.o service_resolve_modify_field.o -service_resolve_read_cdb.o service_resolve_write.o +service_resolve_read_cdb.o service_resolve_write_cdb.o +service_resolve_write_tmp.o -loblibs -lskarnet diff --git a/src/lib66/service/service_resolve_write_tmp.c b/src/lib66/service/service_resolve_write_tmp.c new file mode 100644 index 0000000000000000000000000000000000000000..cc105138c93c5e828030c601dc54d880e4982d79 --- /dev/null +++ b/src/lib66/service/service_resolve_write_tmp.c @@ -0,0 +1,58 @@ +/* + * service_resolve_write_tmp.c + * + * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org> + * + * All rights reserved. + * + * This file is part of Obarun. It is subject to the license terms in + * the LICENSE file found in the top-level directory of this + * distribution. + * This file may not be copied, modified, propagated, or distributed + * except according to the terms contained in the LICENSE file./ + */ + +#include <string.h> +#include <unistd.h> +#include <stdlib.h> + +#include <oblibs/log.h> +#include <oblibs/string.h> +#include <oblibs/directory.h> + +#include <66/service.h> +#include <66/constants.h> +#include <66/parse.h> + +void service_resolve_write_tmp(resolve_service_t *res, char const *dst, uint8_t force) +{ + log_flow() ; + + char *name = res->sa.s + res->name ; + size_t dstlen = strlen(dst) ; + char dest[dstlen + SS_RESOLVE_LEN + 1] ; + + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, res) ; + + auto_strings(dest, dst, SS_RESOLVE) ; + + if (access(dest, F_OK) < 0) { + log_trace("create directory: ", dest) ; + if (!dir_create_parent(dest, 0755)) { + parse_cleanup(res, dst, force) ; + free(wres) ; + log_dieusys(LOG_EXIT_SYS, "create directory: ", dest) ; + } + } + + dest[dstlen] = 0 ; + + log_trace("write resolve file: ", dest, SS_RESOLVE, "/", name) ; + if (!resolve_write(wres, dest, name)) { + parse_cleanup(res, dst, force) ; + free(wres) ; + log_dieusys(LOG_EXIT_SYS, "write resolve file: ", dest, SS_RESOLVE, "/", name) ; + } + + free(wres) ; +} diff --git a/src/lib66/state/deps-lib/deps b/src/lib66/state/deps-lib/deps index aff0afdb1386915c3593dbad1d3f333d8c278b43..7d53df783d25c046ccc84197e14e6e492b337322 100644 --- a/src/lib66/state/deps-lib/deps +++ b/src/lib66/state/deps-lib/deps @@ -5,6 +5,7 @@ state_read.o state_rmfile.o state_set_flag.o state_unpack.o +state_write_tmp.o state_write.o -loblibs -lskarnet diff --git a/src/lib66/state/state_write_tmp.c b/src/lib66/state/state_write_tmp.c new file mode 100644 index 0000000000000000000000000000000000000000..4dac683af7541e7b617cfa74c2dd889d7d837c02 --- /dev/null +++ b/src/lib66/state/state_write_tmp.c @@ -0,0 +1,52 @@ +/* + * state_write_tmp.c + * + * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org> + * + * All rights reserved. + * + * This file is part of Obarun. It is subject to the license terms in + * the LICENSE file found in the top-level directory of this + * distribution. + * This file may not be copied, modified, propagated, or distributed + * except according to the terms contained in the LICENSE file./ + */ + +#include <string.h> +#include <unistd.h> + +#include <oblibs/log.h> +#include <oblibs/string.h> +#include <oblibs/directory.h> + +#include <skalibs/djbunix.h> + +#include <66/state.h> +#include <66/constants.h> + +int state_write_tmp(ss_state_t *sta, char const *dst) +{ + log_flow() ; + + size_t len = strlen(dst) ; + char pack[STATE_STATE_SIZE] ; + char dir[len + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ; + + auto_strings(dir, dst, SS_STATE) ; + + if (access(dir, F_OK) < 0) { + log_trace("create directory: ", dir) ; + if (!dir_create_parent(dir, 0755)) + log_warnusys_return(LOG_EXIT_ZERO, "create directory: ", dir) ; + } + + state_pack(pack, sta) ; + + auto_strings(dir + len + SS_STATE_LEN, "/", SS_STATUS) ; + + log_trace("write status file: ", dir) ; + if (!openwritenclose_unsafe(dir, pack, STATE_STATE_SIZE)) + log_warnusys_return(LOG_EXIT_ZERO, "write status file: ", dir) ; + + return 1 ; +}