/* KMEnter.h
 *
 * Copyright (C) 2024 OpenKylin, Inc
 */

#ifndef __KMENTER_H__
#define __KMENTER_H__

#include "app/KMSubCommand.h"
#include "common/KMLogger.h"
#include "common/KMMetaData.h"
#include "common/KMOptions.h"
#include "common/KMStorageDir.h"
#include "common/kmtranslation.h"

/**
 * @brief enter command
 */
class KMEnter : public KMSubCommand
{
    DECLARE_DYNCREATE(KMEnter);

public:
    KMEnter();
    virtual ~KMEnter();

    int despose(int argc, char **argv) override;

protected:
    /**
     * @brief 数据解析与环境检查
     * @return true 成功 false 失败
     */
    bool checkEnv(int argc, char **argv);

    /**
     * @brief 检查并获取子进程的pid
     * @param id instance id
     * @param pid 进程pid
     * @return bool true 是 fase 否
     */
    bool checkPid(const string &id, int &pid);

    /**
     * @brief enter 子命令运行
     * @param pid 进程pid
     * @param command 子命令参数
     * @return bool true 是 fase 否
     */
    bool enter(int &pid, vector<string> &command);

    /**
     * @brief 获取uid gid
     * @param pid 进程id
     * @param uid 用户id
     * @param gid 组id
     * @return bool true 是 fase 否
     */
    bool getUidGid(const int &pid, int &uid, int &gid);

    /**
     * @brief 清除进程的所有capability
     */
    void clearAllCaps();

    /**
     * @brief 获取当前工作目录和根目录
     * @param pid 进程id
     * @param cwdPath 当前工作目录
     * @param rootPath 根目录
     * @return bool true 是 fase 否
     */
    bool getCwdAndRoot(int pid, string &cwdPath, string &rootPath);

    /**
     * @brief 设置命名空间
     * @param pid 进程id
     * @return bool true 是 fase 否
     */
    bool setNameSpace(int pid);

    /**
     * @brief 获取环境变量
     * @param pid 进程id
     * @param uid 用户id
     * @param env 环境变量
     */
    void getEnv(int pid, int uid, vector<string> &env);

    /**
     * @brief 启动子进程
     * @param vArgs 命令行参数
     * @param vEnv 环境变量
     * @return bool true 是 fase 否
     */
    bool spawnSync(vector<string> &vArgs, vector<string> &vEnv);

private:
    class Options;
    class Private;
    std::unique_ptr<Private> d;
};

#endif // __KMENTER_H__