Skip to content
Snippets Groups Projects
ssexec_scandir_remove.c 1.99 KiB
/*
 * ssexec_scandir_remove.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 <oblibs/log.h>
#include <oblibs/types.h>
#include <oblibs/directory.h>
#include <oblibs/string.h>

#include <66/ssexec.h>
#include <66/svc.h>
#include <66/constants.h>

static void inline auto_rm(char const *str)
{
    log_flow() ;

    int r ;
    r = scan_mode(str, S_IFDIR) ;
    if (r > 0) {
        log_info("removing: ", str, "...") ;
        if (!dir_rm_rf(str))
            log_dieusys(LOG_EXIT_SYS, "remove: ", str) ;
    }
}

int ssexec_scandir_remove(int argc, char const *const *argv, ssexec_t *info)
{
    int r ;

    r = svc_scandir_ok(info->scandir.s) ;
    if (r < 0)
        log_dieusys(LOG_EXIT_SYS, "check: ", info->scandir.s) ;
    if (r) {

        log_dieu(LOG_EXIT_USER, "remove: ", info->scandir.s, ": is running")  ;
        /* for now, i have a race condition
        unsigned int m = 0 ;
        int nargc = 3 ;
        char const *newargv[nargc] ;

        newargv[m++] = "stop" ;
        newargv[m++] = "stop" ;
        newargv[m] = 0 ;

        if (ssexec_scandir_signal(m, newargv, info))
            log_dieu(LOG_EXIT_SYS, "stop scandir: ", info->scandir.s) ;
        */
    }

    /** /run/66/scandir/0 */
    auto_rm(info->scandir.s) ;

    /** /run/66/scandir/container */
    info->scandir.len = 0 ;
    if (!auto_stra(&info->scandir, info->live.s, SS_SCANDIR, "/", SS_BOOT_CONTAINER_DIR))
        log_die_nomem("stralloc") ;
    auto_rm(info->scandir.s) ;

    /** run/66/state/uid */
    info->scandir.len = 0 ;
    if (!auto_stra(&info->scandir, info->live.s, SS_STATE + 1, "/", info->ownerstr))
        log_die_nomem("stralloc") ;
    auto_rm(info->scandir.s) ;

    return 0 ;
}