Skip to content
Snippets Groups Projects
service_resolve_write_remote.c 1.54 KiB
/*
 * service_resolve_write_remote.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_remote(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) ;
}