Match-id-643ea45ddaa5db67fa89a9ed6cc3c7c1cca217b1

This commit is contained in:
BianTanggui
2020-07-10 16:56:45 +08:00
parent a9ec644488
commit 5383ef422c
11 changed files with 597 additions and 409 deletions

View File

@@ -19,6 +19,9 @@
#include "mount.h"
#include "cgrp.h"
#include "logging.h"
#include "options.h"
#define DECIMAL 10
struct ParsedConfig {
char containerNsPath[BUF_SIZE];
@@ -30,9 +33,97 @@ static struct option g_cmdOpts[] = {
{"devices", required_argument, 0, 'd'},
{"pid", required_argument, 0, 'p'},
{"rootfs", required_argument, 0, 'r'},
{"options", required_argument, 0, 'o'},
{0, 0, 0, 0}
};
typedef bool (*CmdArgParser)(struct CmdArgs *args, const char *arg);
static bool DevicesCmdArgParser(struct CmdArgs *args, const char *arg)
{
errno_t err = strcpy_s(args->devices, BUF_SIZE, arg);
if (err != EOK) {
LogError("error: failed to get devices from cmd args.");
return false;
}
return true;
}
static bool PidCmdArgParser(struct CmdArgs *args, const char *arg)
{
errno = 0;
args->pid = strtol(optarg, NULL, DECIMAL);
if (errno != 0) {
LogError("error: failed to convert pid string from cmd args, pid string: %s.", arg);
return false;
}
if (args->pid <= 0) {
LogError("error: invalid pid %d.", args->pid);
return false;
}
return true;
}
static bool RootfsCmdArgParser(struct CmdArgs *args, const char *arg)
{
errno_t err = strcpy_s(args->rootfs, BUF_SIZE, arg);
if (err != EOK) {
LogError("error: failed to get rootfs path from cmd args");
return false;
}
return true;
}
static bool OptionsCmdArgParser(struct CmdArgs *args, const char *arg)
{
errno_t err = strcpy_s(args->options, BUF_SIZE, arg);
if (err != EOK) {
LogError("error: failed to get options string from cmd args");
return false;
}
return true;
}
#define NUM_OF_CMD_ARGS 4
static struct {
const int c;
CmdArgParser parser;
} g_cmdArgParsers[NUM_OF_CMD_ARGS] = {
{'d', DevicesCmdArgParser},
{'p', PidCmdArgParser},
{'r', RootfsCmdArgParser},
{'o', OptionsCmdArgParser}
};
static int ParseOneCmdArg(struct CmdArgs *args, int indicator, const char *value)
{
int i;
for (i = 0; i < NUM_OF_CMD_ARGS; i++) {
if (g_cmdArgParsers[i].c == indicator) {
break;
}
}
if (i == NUM_OF_CMD_ARGS) {
LogError("error: unrecognized cmd arg: indicate char: %c, value: %s.", indicator, value);
return -1;
}
bool isOK = g_cmdArgParsers[i].parser(args, value);
if (!isOK) {
LogError("error: failed while parsing cmd arg, indicate char: %c, value: %s.", indicator, value);
return -1;
}
return 0;
}
static inline bool IsCmdArgsValid(struct CmdArgs *args)
{
return (strlen(args->devices) > 0) && (strlen(args->rootfs) > 0) && (args->pid > 0);
@@ -67,6 +158,12 @@ int DoPrepare(const struct CmdArgs *args, struct ParsedConfig *config)
return -1;
}
ret = ParseRuntimeOptions(args->options);
if (ret < 0) {
LogError("error: failed to parse runtime options.");
return -1;
}
return 0;
}
@@ -118,51 +215,24 @@ int SetupContainer(struct CmdArgs *args)
int Process(int argc, char **argv)
{
int c;
errno_t err;
int ret;
int optionIndex;
bool isSucceed;
struct CmdArgs args = {0};
isSucceed = true;
while (isSucceed) {
c = getopt_long(argc, argv, "d:p:r", g_cmdOpts, &optionIndex);
if (c == -1) {
// cmd options exhausted
break;
}
switch (c) {
case 'd':
err = strcpy_s(args.devices, BUF_SIZE, optarg);
if (err != EOK) {
isSucceed = false;
}
break;
case 'p':
args.pid = atoi(optarg);
if (args.pid <= 0) {
isSucceed = false;
}
break;
case 'r':
err = strcpy_s(args.rootfs, BUF_SIZE, optarg);
if (err != EOK) {
isSucceed = false;
}
break;
default:
LogError("unrecongnized option\n");
isSucceed = false; // unrecognized option
break;
while ((c = getopt_long(argc, argv, "d:p:r:o", g_cmdOpts, &optionIndex)) != -1) {
ret = ParseOneCmdArg(&args, c, optarg);
if (ret < 0) {
LogError("error: failed to parse cmd args.");
return -1;
}
}
if (!isSucceed || !IsCmdArgsValid(&args)) {
if (!IsCmdArgsValid(&args)) {
LogError("error: information not completed or valid.\n");
return -1;
}
int ret = SetupContainer(&args);
ret = SetupContainer(&args);
if (ret < 0) {
return ret;
}