mirror of
https://github.com/Ascend/ascend-docker-runtime.git
synced 2025-11-02 14:34:02 +08:00
Match-id-df4725b6c80f635a41309e55ed1b71e075c67f50
This commit is contained in:
@@ -3,7 +3,6 @@
|
||||
* Description: ascend-docker-cli工具容器CGroup配置模块
|
||||
*/
|
||||
#include "cgrp.h"
|
||||
#include "basic.h"
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
#include <stdlib.h>
|
||||
@@ -84,7 +83,7 @@ int ParseFileByLine(char* buffer, int bufferSize, const ParseFileLine fn, const
|
||||
fp = fopen(resolvedPath, "r");
|
||||
if (fp == NULL) {
|
||||
char msg[] = "cannot open file.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -182,7 +181,7 @@ int SetupDeviceCgroup(FILE *cgroupAllow, const char *devName)
|
||||
fflush(cgroupAllow) == EOF || ferror(cgroupAllow) < 0;
|
||||
if (isFailed) {
|
||||
char msg[] = "write devices failed.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -241,7 +240,7 @@ int GetCgroupPath(int pid, char *effPath, size_t maxSize)
|
||||
ret = ParseFileByLine(mount, BUF_SIZE, GetCgroupMount, mountPath);
|
||||
if (ret < 0) {
|
||||
char msg[] = "cat file content failed.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -259,7 +258,7 @@ int GetCgroupPath(int pid, char *effPath, size_t maxSize)
|
||||
ret = ParseFileByLine(cgroup, BUF_SIZE, GetCgroupRoot, cgroupPath);
|
||||
if (ret < 0) {
|
||||
char msg[] = "cat file content failed.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -269,7 +268,7 @@ int GetCgroupPath(int pid, char *effPath, size_t maxSize)
|
||||
ret = sprintf_s(effPath, maxSize, "%s%s%s", mount, cgroup, ALLOW_PATH);
|
||||
if (ret < 0) {
|
||||
char msg[] = "assemble cgroup device path failed.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -279,24 +278,22 @@ int GetCgroupPath(int pid, char *effPath, size_t maxSize)
|
||||
int SetupCgroup(const struct ParsedConfig *config)
|
||||
{
|
||||
int ret;
|
||||
int iLength = 0;
|
||||
char *str = NULL;
|
||||
char deviceName[BUF_SIZE] = {0};
|
||||
char resolvedCgroupPath[PATH_MAX] = {0};
|
||||
FILE *cgroupAllow = NULL;
|
||||
|
||||
if (realpath(config->cgroupPath, resolvedCgroupPath) == NULL && errno != ENOENT) {
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("cannot canonicalize cgroup path: %s.", &iLength, config->cgroupPath);
|
||||
str = FormatLogMessage("cannot canonicalize cgroup path: %s.", &iLength, config->cgroupPath);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
|
||||
cgroupAllow = fopen((const char *)resolvedCgroupPath, "a");
|
||||
if (cgroupAllow == NULL) {
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed to open cgroup file: %s.", &iLength, resolvedCgroupPath);
|
||||
str = FormatLogMessage("failed to open cgroup file: %s.", &iLength, resolvedCgroupPath);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -304,7 +301,7 @@ int SetupCgroup(const struct ParsedConfig *config)
|
||||
if (ret < 0) {
|
||||
fclose(cgroupAllow);
|
||||
char msg[] = "failed to setup driver cgroup.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -314,24 +311,19 @@ int SetupCgroup(const struct ParsedConfig *config)
|
||||
config->devices[idx]);
|
||||
if (ret < 0) {
|
||||
fclose(cgroupAllow);
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed to assemble device path for no.%u.", &iLength, config->devices[idx]);
|
||||
str = FormatLogMessage("failed to assemble device path for no.%u.", &iLength, config->devices[idx]);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = SetupDeviceCgroup(cgroupAllow, (const char *)deviceName);
|
||||
if (ret < 0) {
|
||||
fclose(cgroupAllow);
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed to setup cgroup for %s.", &iLength, deviceName);
|
||||
str = FormatLogMessage("failed to setup cgroup for %s.", &iLength, deviceName);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
free(str);
|
||||
fclose(cgroupAllow);
|
||||
return 0;
|
||||
}
|
||||
@@ -7,19 +7,30 @@
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include "basic.h"
|
||||
|
||||
#define FILE_MAX_SIZE (1024*1024*10)
|
||||
#define FILE_MAX_SIZE (1024 * 1024 * 10)
|
||||
#define LOG_PATH_DIR "/var/log/"
|
||||
#define TEMP_BUFFER 30
|
||||
#define YEAR_OFFSET 1900
|
||||
#define MONTH_OFFSET 1
|
||||
#define LEVEL_LENGTH 20
|
||||
|
||||
void GetCurrentLocalTime(char* buffer, int length)
|
||||
int GetCurrentLocalTime(const char* buffer, int length)
|
||||
{
|
||||
time_t rawtime;
|
||||
struct tm* timeinfo = NULL;
|
||||
time(&rawtime);
|
||||
timeinfo = localtime(&rawtime);
|
||||
sprintf_s(buffer, TEMP_BUFFER, "[%04d-%02d-%02d %02d:%02d:%02d]", (timeinfo->tm_year+1900), (timeinfo->tm_mon+1),
|
||||
(timeinfo->tm_mday), (timeinfo->tm_hour), (timeinfo->tm_min), (timeinfo->tm_sec));
|
||||
return sprintf_s(buffer,
|
||||
TEMP_BUFFER,
|
||||
"[%04d-%02d-%02d %02d:%02d:%02d]",
|
||||
(timeinfo->tm_year + YEAR_OFFSET),
|
||||
(timeinfo->tm_mon + MONTH_OFFSET),
|
||||
(timeinfo->tm_mday),
|
||||
(timeinfo->tm_hour),
|
||||
(timeinfo->tm_min),
|
||||
(timeinfo->tm_sec));
|
||||
}
|
||||
|
||||
long GetLogSize(char* filename)
|
||||
@@ -27,13 +38,11 @@ long GetLogSize(char* filename)
|
||||
long length = 0;
|
||||
FILE *fp = NULL;
|
||||
fp = fopen(filename, "rb");
|
||||
if (fp != NULL)
|
||||
{
|
||||
if (fp != NULL) {
|
||||
fseek(fp, 0, SEEK_END);
|
||||
length = ftell(fp);
|
||||
}
|
||||
if (fp != NULL)
|
||||
{
|
||||
if (fp != NULL) {
|
||||
fclose(fp);
|
||||
fp = NULL;
|
||||
}
|
||||
@@ -45,8 +54,7 @@ void LogLoop(char* filename)
|
||||
char* loopPath = LOG_PATH_DIR"docker-runtime-log.log.1";
|
||||
int exist;
|
||||
exist = access(loopPath, 0);
|
||||
if (exist == 0)
|
||||
{
|
||||
if (exist == 0) {
|
||||
unlink(loopPath);
|
||||
}
|
||||
rename(filename, loopPath);
|
||||
@@ -54,19 +62,21 @@ void LogLoop(char* filename)
|
||||
|
||||
void WriteLogFile(char* filename, long maxSize, char* buffer, unsigned bufferSize)
|
||||
{
|
||||
if (filename != NULL && buffer != NULL)
|
||||
{
|
||||
if (filename != NULL && buffer != NULL) {
|
||||
long length = GetLogSize(filename);
|
||||
if (length > maxSize)
|
||||
{
|
||||
if (length > maxSize) {
|
||||
LogLoop(filename);
|
||||
}
|
||||
FILE *fp;
|
||||
fp = fopen(filename, "a+");
|
||||
if (fp != NULL)
|
||||
{
|
||||
if (fp != NULL) {
|
||||
int ret;
|
||||
char now[TEMP_BUFFER] = {0};
|
||||
GetCurrentLocalTime(now, sizeof(now)/sizeof(now[0]));
|
||||
ret = GetCurrentLocalTime(now, sizeof(now) / sizeof(char));
|
||||
if (ret < 0) {
|
||||
fclose(fp);
|
||||
return;
|
||||
}
|
||||
fwrite(now, strlen(now), 1, fp);
|
||||
fwrite(buffer, bufferSize, 1, fp);
|
||||
fclose(fp);
|
||||
@@ -75,21 +85,45 @@ void WriteLogFile(char* filename, long maxSize, char* buffer, unsigned bufferSiz
|
||||
}
|
||||
}
|
||||
|
||||
void Logger(const char *msg, int level, int length) {
|
||||
enum LEVEL { Info=0, Warn, Error, Debug};
|
||||
enum LEVEL _level;
|
||||
void Logger(const char *msg, int level, int length)
|
||||
{
|
||||
if (msg == NULL) {
|
||||
return;
|
||||
}
|
||||
int iret;
|
||||
char *logPath = LOG_PATH_DIR"docker-runtime-log.log";
|
||||
_level = level;
|
||||
char* buffer = malloc(length+20);
|
||||
switch (_level)
|
||||
{
|
||||
case Debug:sprintf(buffer, "[Debug]%s\n", msg);
|
||||
int destMax = length + LEVEL_LENGTH;
|
||||
if (destMax <= 0) {
|
||||
return;
|
||||
}
|
||||
char* buffer = malloc(destMax);
|
||||
if (buffer == NULL) {
|
||||
return;
|
||||
}
|
||||
switch (level) {
|
||||
case LEVEL_DEBUG:
|
||||
iret = sprintf_s(buffer, destMax, "[Debug]%s\n", msg);
|
||||
if (iret < 0) {
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case Error:sprintf(buffer, "[Error]%s\n", msg);
|
||||
case LEVEL_ERROR:
|
||||
iret = sprintf_s(buffer, destMax, "[Error]%s\n", msg);
|
||||
if (iret < 0) {
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case Warn:sprintf(buffer, "[Warn]%s\n", msg);
|
||||
case LEVEL_WARN:
|
||||
iret = sprintf_s(buffer, destMax, "[Warn]%s\n", msg);
|
||||
if (iret < 0) {
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:sprintf(buffer, "[Info]%s\n", msg);
|
||||
default:
|
||||
iret = sprintf_s(buffer, destMax, "[Info]%s\n", msg);
|
||||
if (iret < 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
WriteLogFile(logPath, FILE_MAX_SIZE, buffer, strlen(buffer));
|
||||
free(buffer);
|
||||
|
||||
@@ -50,7 +50,7 @@ static bool DevicesCmdArgParser(struct CmdArgs *args, const char *arg)
|
||||
errno_t err = strcpy_s(args->devices, BUF_SIZE, arg);
|
||||
if (err != EOK) {
|
||||
char msg[] = "failed to get devices from cmd args.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ static bool RootfsCmdArgParser(struct CmdArgs *args, const char *arg)
|
||||
errno_t err = strcpy_s(args->rootfs, BUF_SIZE, arg);
|
||||
if (err != EOK) {
|
||||
char msg[] = "failed to get rootfs path from cmd args";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ static bool OptionsCmdArgParser(struct CmdArgs *args, const char *arg)
|
||||
errno_t err = strcpy_s(args->options, BUF_SIZE, arg);
|
||||
if (err != EOK) {
|
||||
char msg[] = "failed to get options string from cmd args";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -183,7 +183,8 @@ static int ParseOneCmdArg(struct CmdArgs *args, char indicator, const char *valu
|
||||
bool isOK = g_cmdArgParsers[i].parser(args, value);
|
||||
if (!isOK) {
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed while parsing cmd arg, indicate char: %c, value: %s.", &iLength, indicator, value);
|
||||
char* str = FormatLogMessage("failed while parsing cmd arg, indicate char: %c, value: %s.",
|
||||
&iLength, indicator, value);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
@@ -207,7 +208,8 @@ static int ParseDeviceIDs(unsigned int *idList, size_t *idListSize, char *device
|
||||
while (token != NULL) {
|
||||
if (idx >= *idListSize) {
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("too many devices(%u), support %u devices maximally", &iLength, idx, *idListSize);
|
||||
char* str = FormatLogMessage("too many devices(%u), support %u devices maximally",
|
||||
&iLength, idx, *idListSize);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
@@ -239,14 +241,14 @@ int DoPrepare(const struct CmdArgs *args, struct ParsedConfig *config)
|
||||
err = strcpy_s(config->rootfs, BUF_SIZE, args->rootfs);
|
||||
if (err != EOK) {
|
||||
char msg[] = "failed to copy rootfs path to parsed config.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = ParseDeviceIDs(config->devices, &config->devicesNr, (char *)args->devices);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to parse device ids from cmdline argument";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -262,7 +264,7 @@ int DoPrepare(const struct CmdArgs *args, struct ParsedConfig *config)
|
||||
ret = GetCgroupPath(args->pid, config->cgroupPath, BUF_SIZE);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to get cgroup path.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -270,7 +272,7 @@ int DoPrepare(const struct CmdArgs *args, struct ParsedConfig *config)
|
||||
ret = GetSelfNsPath("mnt", originNsPath, BUF_SIZE);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to get self ns path.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -299,7 +301,7 @@ int SetupContainer(struct CmdArgs *args)
|
||||
ret = DoPrepare(args, &config);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to prepare nesessary config.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -317,7 +319,7 @@ int SetupContainer(struct CmdArgs *args)
|
||||
ret = DoMounting(&config);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to do mounting.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
close(config.originNsFd);
|
||||
return -1;
|
||||
}
|
||||
@@ -325,7 +327,7 @@ int SetupContainer(struct CmdArgs *args)
|
||||
ret = SetupCgroup(&config);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to set up cgroup.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
close(config.originNsFd);
|
||||
return -1;
|
||||
}
|
||||
@@ -334,7 +336,7 @@ int SetupContainer(struct CmdArgs *args)
|
||||
ret = EnterNsByFd(config.originNsFd, CLONE_NEWNS);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to set ns back.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
close(config.originNsFd);
|
||||
return -1;
|
||||
}
|
||||
@@ -351,34 +353,34 @@ int Process(int argc, char **argv)
|
||||
struct CmdArgs args = {0};
|
||||
|
||||
char startMsg[] = "runc start prestart-hook ...";
|
||||
Logger(startMsg, LEVEL_INFO, sizeof(startMsg)/sizeof(char));
|
||||
Logger(startMsg, LEVEL_INFO, sizeof(startMsg) / sizeof(char));
|
||||
while ((c = getopt_long(argc, argv, "d:p:r:o:f:i", g_cmdOpts, &optionIndex)) != -1) {
|
||||
ret = ParseOneCmdArg(&args, (char)c, optarg);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to parse cmd args.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
char parametersMsg[] = "verify parameters valid and parse runtime options";
|
||||
Logger(parametersMsg, LEVEL_INFO, sizeof(parametersMsg)/sizeof(char));
|
||||
Logger(parametersMsg, LEVEL_INFO, sizeof(parametersMsg) / sizeof(char));
|
||||
if (!IsCmdArgsValid(&args)) {
|
||||
char msg[] = "information not completed or valid.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
ParseRuntimeOptions(args.options);
|
||||
char containerMsg[] = "setup container config";
|
||||
Logger(containerMsg, LEVEL_INFO, sizeof(containerMsg)/sizeof(char));
|
||||
Logger(containerMsg, LEVEL_INFO, sizeof(containerMsg) / sizeof(char));
|
||||
ret = SetupContainer(&args);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to setup container.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return ret;
|
||||
}
|
||||
char successMsg[] = "prestart-hook setup container successful.";
|
||||
Logger(successMsg, LEVEL_INFO, sizeof(successMsg)/sizeof(char));
|
||||
Logger(successMsg, LEVEL_INFO, sizeof(successMsg) / sizeof(char));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -25,14 +25,14 @@ int Mount(const char *src, const char *dst)
|
||||
ret = mount(src, dst, NULL, mountFlags, NULL);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to mount.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = mount(NULL, dst, NULL, remountFlags, NULL);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to re-mount.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -97,63 +97,51 @@ static int GetDeviceMntSrcDst(const char *rootfs, const char *srcDeviceName,
|
||||
int MountDevice(const char *rootfs, const char *srcDeviceName, const char *dstDeviceName)
|
||||
{
|
||||
int ret;
|
||||
int iLength = 0;
|
||||
char *str = NULL;
|
||||
char src[BUF_SIZE] = {0};
|
||||
char dst[BUF_SIZE] = {0};
|
||||
struct PathInfo pathInfo = {src, BUF_SIZE, dst, BUF_SIZE};
|
||||
|
||||
ret = GetDeviceMntSrcDst(rootfs, srcDeviceName, dstDeviceName, &pathInfo);
|
||||
if (ret < 0) {
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed to get device mount src and(or) dst path, device name: %s.", &iLength, srcDeviceName);
|
||||
str = FormatLogMessage("failed to get mount src and dst path, device name: %s.", &iLength, srcDeviceName);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct stat srcStat;
|
||||
ret = stat((const char *)src, &srcStat);
|
||||
if (ret < 0) {
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed to stat src: %s.", &iLength, src);
|
||||
str = FormatLogMessage("failed to stat src: %s.", &iLength, src);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
struct stat dstStat;
|
||||
ret = stat((const char *)dst, &dstStat);
|
||||
if (ret == 0 && S_ISCHR(dstStat.st_mode)) {
|
||||
return 0; // 特权容器自动挂载HOST所有设备,故此处跳过
|
||||
} else if (ret == 0) {
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("%s already exists but not a char device as expected.", &iLength, dst);
|
||||
str = FormatLogMessage("%s already exists but not a char device as expected.", &iLength, dst);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
} else if (ret < 0 && errno != ENOENT) {
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed to check dst %s stat", &iLength, dst);
|
||||
str = FormatLogMessage("failed to check dst %s stat", &iLength, dst);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
ret = MakeMountPoints(dst, srcStat.st_mode);
|
||||
if (ret < 0) {
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed to create mount dst file: %s.", &iLength, dst);
|
||||
str = FormatLogMessage("failed to create mount dst file: %s.", &iLength, dst);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = Mount(src, dst);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to mount dev.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
free(str);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -217,7 +205,7 @@ int MountFile(const char *rootfs, const char *filepath)
|
||||
ret = Mount(filepath, dst);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to mount dev.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -302,7 +290,8 @@ int DoDirectoryMounting(const char *rootfs, const struct MountList *list)
|
||||
ret = MountDir(rootfs, (const char *)&list->list[i][0]);
|
||||
if (ret < 0) {
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed to do directory mounting for %s.", &iLength, (const char *)&list->list[i][0]);
|
||||
char* str = FormatLogMessage("failed to do directory mounting for %s.", &iLength,
|
||||
(const char *)&list->list[i][0]);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
@@ -320,7 +309,8 @@ int DoFileMounting(const char *rootfs, const struct MountList *list)
|
||||
ret = MountFile(rootfs, (const char *)&list->list[i][0]);
|
||||
if (ret < 0) {
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed to do file mounting for %s.", &iLength, (const char *)&list->list[i][0]);
|
||||
char* str = FormatLogMessage("failed to do file mounting for %s.", &iLength,
|
||||
(const char *)&list->list[i][0]);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
@@ -338,14 +328,14 @@ int DoMounting(const struct ParsedConfig *config)
|
||||
config->devices, config->devicesNr);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to mount devices.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = DoCtrlDeviceMounting(config->rootfs);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to mount ctrl devices.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -356,14 +346,14 @@ int DoMounting(const struct ParsedConfig *config)
|
||||
ret = DoFileMounting(config->rootfs, config->files);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to mount files.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = DoDirectoryMounting(config->rootfs, config->dirs);
|
||||
if (ret < 0) {
|
||||
char msg[] = "failed to do mount directories.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg) / sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -15,23 +15,27 @@
|
||||
#include "securec.h"
|
||||
#include "logger.h"
|
||||
|
||||
char *FormatLogMessage(char *format, int* iLength, ...){
|
||||
char *FormatLogMessage(char *format, int* iLength, ...)
|
||||
{
|
||||
va_list list;
|
||||
// 获取格式化后字符串的长度
|
||||
va_start(list, format);
|
||||
va_start(list, iLength);
|
||||
char buff[1024] = {0};
|
||||
int size = vsnprintf_s(buff, sizeof(buff), sizeof(buff), format, list);
|
||||
va_end(list);
|
||||
if(size <= 0){
|
||||
if (size <= 0) {
|
||||
return NULL;
|
||||
}
|
||||
size++;
|
||||
// 复位va_list, 将格式化字符串写入到buf
|
||||
va_start(list, format);
|
||||
va_start(list, iLength);
|
||||
char *buf = (char *)malloc(size);
|
||||
*iLength = size;
|
||||
vsnprintf_s(buf, size, size, format, list);
|
||||
int ret = vsnprintf_s(buf, size, size, format, list);
|
||||
va_end(list);
|
||||
if (ret <= 0) {
|
||||
return NULL;
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user