feat: 支持time容器
BREAKING CHANGE: 支持ipc容器及增强对外变更: 1.clone 支持CLONE_NEWTIME 2.增加”/proc/[pid]/container/time" 用于查询容器信息 3.增加”/proc/[pid]/container/time_for_children" 用于查询容器信息 4.增加”/proc/[pid]/container/pid_for_children" 用于查询容器信息 5.增加”/proc/[pid]/time_offsets" 用于查询和配置time容器信息 Close #I6B0A3 Signed-off-by: zhushengle <zhushengle@huawei.com> Change-Id: I54d79937ca608a10a4384f61e11c88757f833edf
This commit is contained in:
parent
7e0dfb79f7
commit
16ed05e844
|
@ -599,13 +599,22 @@ int clock_gettime(clockid_t clockID, struct timespec *tp)
|
||||||
|
|
||||||
switch (clockID) {
|
switch (clockID) {
|
||||||
case CLOCK_MONOTONIC_RAW:
|
case CLOCK_MONOTONIC_RAW:
|
||||||
|
#ifdef LOSCFG_TIME_CONTAINER
|
||||||
|
tmp = OsTimeSpecAdd(hwTime, CLOCK_MONOTONIC_TIME_BASE);
|
||||||
|
tp->tv_sec = tmp.tv_sec;
|
||||||
|
tp->tv_nsec = tmp.tv_nsec;
|
||||||
|
#else
|
||||||
tp->tv_sec = hwTime.tv_sec;
|
tp->tv_sec = hwTime.tv_sec;
|
||||||
tp->tv_nsec = hwTime.tv_nsec;
|
tp->tv_nsec = hwTime.tv_nsec;
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case CLOCK_MONOTONIC:
|
case CLOCK_MONOTONIC:
|
||||||
LOS_SpinLockSave(&g_timeSpin, &intSave);
|
LOS_SpinLockSave(&g_timeSpin, &intSave);
|
||||||
tmp = OsTimeSpecAdd(hwTime, g_accDeltaFromAdj);
|
tmp = OsTimeSpecAdd(hwTime, g_accDeltaFromAdj);
|
||||||
LOS_SpinUnlockRestore(&g_timeSpin, intSave);
|
LOS_SpinUnlockRestore(&g_timeSpin, intSave);
|
||||||
|
#ifdef LOSCFG_TIME_CONTAINER
|
||||||
|
tmp = OsTimeSpecAdd(tmp, CLOCK_MONOTONIC_TIME_BASE);
|
||||||
|
#endif
|
||||||
tp->tv_sec = tmp.tv_sec;
|
tp->tv_sec = tmp.tv_sec;
|
||||||
tp->tv_nsec = tmp.tv_nsec;
|
tp->tv_nsec = tmp.tv_nsec;
|
||||||
break;
|
break;
|
||||||
|
@ -639,7 +648,7 @@ int clock_gettime(clockid_t clockID, struct timespec *tp)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ERROUT:
|
ERROUT:
|
||||||
TIME_RETURN(EINVAL);
|
TIME_RETURN(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
#include "proc_fs.h"
|
#include "proc_fs.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "los_process_pri.h"
|
#include "los_process_pri.h"
|
||||||
|
#include "user_copy.h"
|
||||||
|
#include "los_memory.h"
|
||||||
|
|
||||||
#ifdef LOSCFG_PROC_PROCESS_DIR
|
#ifdef LOSCFG_PROC_PROCESS_DIR
|
||||||
#include "los_vm_dump.h"
|
#include "los_vm_dump.h"
|
||||||
|
@ -64,7 +66,7 @@ struct ProcessData {
|
||||||
static ssize_t ProcessContainerLink(unsigned int containerID, ContainerType type, char *buffer, size_t bufLen)
|
static ssize_t ProcessContainerLink(unsigned int containerID, ContainerType type, char *buffer, size_t bufLen)
|
||||||
{
|
{
|
||||||
ssize_t count = -1;
|
ssize_t count = -1;
|
||||||
if (type == PID_CONTAINER) {
|
if ((type == PID_CONTAINER) || (type == PID_CHILD_CONTAINER)) {
|
||||||
count = snprintf_s(buffer, bufLen, bufLen - 1, "'pid:[%u]'", containerID);
|
count = snprintf_s(buffer, bufLen, bufLen - 1, "'pid:[%u]'", containerID);
|
||||||
} else if (type == UTS_CONTAINER) {
|
} else if (type == UTS_CONTAINER) {
|
||||||
count = snprintf_s(buffer, bufLen, bufLen - 1, "'uts:[%u]'", containerID);
|
count = snprintf_s(buffer, bufLen, bufLen - 1, "'uts:[%u]'", containerID);
|
||||||
|
@ -72,6 +74,8 @@ static ssize_t ProcessContainerLink(unsigned int containerID, ContainerType type
|
||||||
count = snprintf_s(buffer, bufLen, bufLen - 1, "'mnt:[%u]'", containerID);
|
count = snprintf_s(buffer, bufLen, bufLen - 1, "'mnt:[%u]'", containerID);
|
||||||
} else if (type == IPC_CONTAINER) {
|
} else if (type == IPC_CONTAINER) {
|
||||||
count = snprintf_s(buffer, bufLen, bufLen - 1, "'ipc:[%u]'", containerID);
|
count = snprintf_s(buffer, bufLen, bufLen - 1, "'ipc:[%u]'", containerID);
|
||||||
|
} else if ((type == TIME_CONTAINER) || (type == TIME_CHILD_CONTAINER)) {
|
||||||
|
count = snprintf_s(buffer, bufLen, bufLen - 1, "'time:[%u]'", containerID);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count < 0) {
|
if (count < 0) {
|
||||||
|
@ -174,6 +178,110 @@ static int ProcessCpupRead(struct SeqBuf *seqBuf, LosProcessCB *pcb)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef LOSCFG_TIME_CONTAINER
|
||||||
|
static const CHAR *g_monotonic = "monotonic";
|
||||||
|
#define DECIMAL_BASE 10
|
||||||
|
|
||||||
|
static int ProcTimeContainerRead(struct SeqBuf *m, void *v)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
unsigned int intSave;
|
||||||
|
struct timespec64 offsets = {0};
|
||||||
|
|
||||||
|
if ((m == NULL) || (v == NULL)) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ProcessData *data = (struct ProcessData *)v;
|
||||||
|
SCHEDULER_LOCK(intSave);
|
||||||
|
LosProcessCB *processCB = (LosProcessCB *)data->process;
|
||||||
|
ret = OsGetTimeContainerMonotonic(processCB, &offsets);
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
if (ret != LOS_OK) {
|
||||||
|
return -ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
LosBufPrintf(m, "monotonic %lld %ld\n", offsets.tv_sec, offsets.tv_nsec);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ProcSetTimensOffset(const char *buf, LosProcessCB *processCB)
|
||||||
|
{
|
||||||
|
unsigned int intSave;
|
||||||
|
struct timespec64 offsets;
|
||||||
|
char *endptr = NULL;
|
||||||
|
|
||||||
|
offsets.tv_sec = strtoll(buf, &endptr, DECIMAL_BASE);
|
||||||
|
offsets.tv_sec = strtoll(endptr, NULL, DECIMAL_BASE);
|
||||||
|
if (offsets.tv_nsec >= OS_SYS_NS_PER_SECOND) {
|
||||||
|
return -EACCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCHEDULER_LOCK(intSave);
|
||||||
|
unsigned int ret = OsSetTimeContainerMonotonic(processCB, &offsets);
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
if (ret != LOS_OK) {
|
||||||
|
return -ret;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ProcTimeContainerWrite(struct ProcFile *pf, const char *buf, size_t count, loff_t *ppos)
|
||||||
|
{
|
||||||
|
(void)ppos;
|
||||||
|
char *kbuf = NULL;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if ((pf == NULL) || (count <= 0)) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ProcDirEntry *entry = pf->pPDE;
|
||||||
|
if (entry == NULL) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ProcessData *data = (struct ProcessData *)entry->data;
|
||||||
|
if (data == NULL) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (LOS_IsUserAddressRange((VADDR_T)(UINTPTR)buf, count)) {
|
||||||
|
kbuf = LOS_MemAlloc(m_aucSysMem1, count + 1);
|
||||||
|
if (kbuf == NULL) {
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (LOS_ArchCopyFromUser(kbuf, buf, count) != 0) {
|
||||||
|
(VOID)LOS_MemFree(m_aucSysMem1, kbuf);
|
||||||
|
return -EFAULT;
|
||||||
|
}
|
||||||
|
kbuf[count] = '\0';
|
||||||
|
buf = kbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = strncmp(buf, g_monotonic, strlen(g_monotonic));
|
||||||
|
if (ret != 0) {
|
||||||
|
(VOID)LOS_MemFree(m_aucSysMem1, kbuf);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf += strlen(g_monotonic);
|
||||||
|
ret = ProcSetTimensOffset(buf, (LosProcessCB *)data->process);
|
||||||
|
if (ret < 0) {
|
||||||
|
(VOID)LOS_MemFree(m_aucSysMem1, kbuf);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
(VOID)LOS_MemFree(m_aucSysMem1, kbuf);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct ProcFileOperations TIME_CONTAINER_FOPS = {
|
||||||
|
.read = ProcTimeContainerRead,
|
||||||
|
.write = ProcTimeContainerWrite,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static int ProcProcessRead(struct SeqBuf *m, void *v)
|
static int ProcProcessRead(struct SeqBuf *m, void *v)
|
||||||
{
|
{
|
||||||
if ((m == NULL) || (v == NULL)) {
|
if ((m == NULL) || (v == NULL)) {
|
||||||
|
@ -235,6 +343,12 @@ static struct ProcProcess g_procProcess[] = {
|
||||||
.type = PID_CONTAINER,
|
.type = PID_CONTAINER,
|
||||||
.fileOps = &PID_CONTAINER_FOPS
|
.fileOps = &PID_CONTAINER_FOPS
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "container/pid_for_children",
|
||||||
|
.mode = S_IFLNK,
|
||||||
|
.type = PID_CHILD_CONTAINER,
|
||||||
|
.fileOps = &PID_CONTAINER_FOPS
|
||||||
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef LOSCFG_UTS_CONTAINER
|
#ifdef LOSCFG_UTS_CONTAINER
|
||||||
{
|
{
|
||||||
|
@ -260,6 +374,26 @@ static struct ProcProcess g_procProcess[] = {
|
||||||
.fileOps = &PID_CONTAINER_FOPS
|
.fileOps = &PID_CONTAINER_FOPS
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef LOSCFG_TIME_CONTAINER
|
||||||
|
{
|
||||||
|
.name = "container/time",
|
||||||
|
.mode = S_IFLNK,
|
||||||
|
.type = TIME_CONTAINER,
|
||||||
|
.fileOps = &PID_CONTAINER_FOPS
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "container/time_for_children",
|
||||||
|
.mode = S_IFLNK,
|
||||||
|
.type = TIME_CHILD_CONTAINER,
|
||||||
|
.fileOps = &PID_CONTAINER_FOPS
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "time_offsets",
|
||||||
|
.mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH,
|
||||||
|
.type = TIME_CONTAINER,
|
||||||
|
.fileOps = &TIME_CONTAINER_FOPS
|
||||||
|
},
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -98,6 +98,11 @@ config IPC_CONTAINER
|
||||||
default n
|
default n
|
||||||
depends on KERNEL_CONTAINER
|
depends on KERNEL_CONTAINER
|
||||||
|
|
||||||
|
config TIME_CONTAINER
|
||||||
|
bool "Enable time container"
|
||||||
|
default n
|
||||||
|
depends on KERNEL_CONTAINER
|
||||||
|
|
||||||
######################### config options of extended #####################
|
######################### config options of extended #####################
|
||||||
source "kernel/extended/Kconfig"
|
source "kernel/extended/Kconfig"
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ kernel_module(module_name) {
|
||||||
"container/los_ipc_container.c",
|
"container/los_ipc_container.c",
|
||||||
"container/los_mnt_container.c",
|
"container/los_mnt_container.c",
|
||||||
"container/los_pid_container.c",
|
"container/los_pid_container.c",
|
||||||
|
"container/los_time_container.c",
|
||||||
"container/los_uts_container.c",
|
"container/los_uts_container.c",
|
||||||
"core/los_bitmap.c",
|
"core/los_bitmap.c",
|
||||||
"core/los_info.c",
|
"core/los_info.c",
|
||||||
|
|
|
@ -53,6 +53,7 @@ VOID OsInitRootContainer(VOID)
|
||||||
{
|
{
|
||||||
#ifdef LOSCFG_PID_CONTAINER
|
#ifdef LOSCFG_PID_CONTAINER
|
||||||
(VOID)OsInitRootPidContainer(&g_rootContainer.pidContainer);
|
(VOID)OsInitRootPidContainer(&g_rootContainer.pidContainer);
|
||||||
|
g_rootContainer.pidForChildContainer = g_rootContainer.pidContainer;
|
||||||
#endif
|
#endif
|
||||||
#ifdef LOSCFG_UTS_CONTAINER
|
#ifdef LOSCFG_UTS_CONTAINER
|
||||||
(VOID)OsInitRootUtsContainer(&g_rootContainer.utsContainer);
|
(VOID)OsInitRootUtsContainer(&g_rootContainer.utsContainer);
|
||||||
|
@ -62,13 +63,17 @@ VOID OsInitRootContainer(VOID)
|
||||||
#endif
|
#endif
|
||||||
#ifdef LOSCFG_IPC_CONTAINER
|
#ifdef LOSCFG_IPC_CONTAINER
|
||||||
(VOID)OsInitRootIpcContainer(&g_rootContainer.ipcContainer);
|
(VOID)OsInitRootIpcContainer(&g_rootContainer.ipcContainer);
|
||||||
|
#endif
|
||||||
|
#ifdef LOSCFG_TIME_CONTAINER
|
||||||
|
(VOID)OsInitRootTimeContainer(&g_rootContainer.timeContainer);
|
||||||
|
g_rootContainer.timeForChildContainer = g_rootContainer.timeContainer;
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC INLINE Container *CreateContainer(VOID)
|
STATIC INLINE Container *CreateContainer(VOID)
|
||||||
{
|
{
|
||||||
Container *container = LOS_MemAlloc(m_aucSysMem1, sizeof(Container));
|
Container *container = (Container *)LOS_MemAlloc(m_aucSysMem1, sizeof(Container));
|
||||||
if (container == NULL) {
|
if (container == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -88,7 +93,7 @@ UINT32 OsCopyContainers(UINTPTR flags, LosProcessCB *child, LosProcessCB *parent
|
||||||
UINT32 intSave;
|
UINT32 intSave;
|
||||||
UINT32 ret = LOS_OK;
|
UINT32 ret = LOS_OK;
|
||||||
|
|
||||||
if (!(flags & (CLONE_NEWNS | CLONE_NEWUTS | CLONE_NEWIPC | CLONE_NEWPID | CLONE_NEWNET))) {
|
if (!(flags & (CLONE_NEWNS | CLONE_NEWUTS | CLONE_NEWIPC | CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWTIME))) {
|
||||||
SCHEDULER_LOCK(intSave);
|
SCHEDULER_LOCK(intSave);
|
||||||
child->container = parent->container;
|
child->container = parent->container;
|
||||||
LOS_AtomicInc(&child->container->rc);
|
LOS_AtomicInc(&child->container->rc);
|
||||||
|
@ -124,6 +129,12 @@ UINT32 OsCopyContainers(UINTPTR flags, LosProcessCB *child, LosProcessCB *parent
|
||||||
if (ret != LOS_OK) {
|
if (ret != LOS_OK) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef LOSCFG_TIME_CONTAINER
|
||||||
|
ret = OsCopyTimeContainer(flags, child, parent);
|
||||||
|
if (ret != LOS_OK) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -149,9 +160,13 @@ VOID OsContainersDestroy(LosProcessCB *processCB)
|
||||||
OsIpcContainersDestroy(processCB);
|
OsIpcContainersDestroy(processCB);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef LOSCFG_TIME_CONTAINER
|
||||||
|
OsTimeContainersDestroy(processCB);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef LOSCFG_PID_CONTAINER
|
#ifndef LOSCFG_PID_CONTAINER
|
||||||
LOS_AtomicDec(&curr->container->rc);
|
LOS_AtomicDec(&curr->container->rc);
|
||||||
if (LOS_AtomicRead(&processCB->container->rc) == 1) {
|
if (LOS_AtomicRead(&processCB->container->rc) == 0) {
|
||||||
(VOID)LOS_MemFree(m_aucSysMem1, processCB->container);
|
(VOID)LOS_MemFree(m_aucSysMem1, processCB->container);
|
||||||
processCB->container = NULL;
|
processCB->container = NULL;
|
||||||
}
|
}
|
||||||
|
@ -168,6 +183,8 @@ UINT32 OsGetContainerID(Container *container, ContainerType type)
|
||||||
#ifdef LOSCFG_PID_CONTAINER
|
#ifdef LOSCFG_PID_CONTAINER
|
||||||
case PID_CONTAINER:
|
case PID_CONTAINER:
|
||||||
return OsGetPidContainerID(container->pidContainer);
|
return OsGetPidContainerID(container->pidContainer);
|
||||||
|
case PID_CHILD_CONTAINER:
|
||||||
|
return OsGetPidContainerID(container->pidForChildContainer);
|
||||||
#endif
|
#endif
|
||||||
#ifdef LOSCFG_UTS_CONTAINER
|
#ifdef LOSCFG_UTS_CONTAINER
|
||||||
case UTS_CONTAINER:
|
case UTS_CONTAINER:
|
||||||
|
@ -180,6 +197,12 @@ UINT32 OsGetContainerID(Container *container, ContainerType type)
|
||||||
#ifdef LOSCFG_IPC_CONTAINER
|
#ifdef LOSCFG_IPC_CONTAINER
|
||||||
case IPC_CONTAINER:
|
case IPC_CONTAINER:
|
||||||
return OsGetIpcContainerID(container->ipcContainer);
|
return OsGetIpcContainerID(container->ipcContainer);
|
||||||
|
#endif
|
||||||
|
#ifdef LOSCFG_TIME_CONTAINER
|
||||||
|
case TIME_CONTAINER:
|
||||||
|
return OsGetTimeContainerID(container->timeContainer);
|
||||||
|
case TIME_CHILD_CONTAINER:
|
||||||
|
return OsGetTimeContainerID(container->timeForChildContainer);
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -41,21 +41,20 @@
|
||||||
|
|
||||||
STATIC UINT32 g_currentIpcContainerNum = 0;
|
STATIC UINT32 g_currentIpcContainerNum = 0;
|
||||||
|
|
||||||
STATIC UINT32 CreateIpcContainer(IpcContainer **newIpcContainer)
|
STATIC IpcContainer *CreateNewIpcContainer(IpcContainer *parent)
|
||||||
{
|
{
|
||||||
pthread_mutexattr_t attr;
|
pthread_mutexattr_t attr;
|
||||||
UINT32 intSave;
|
|
||||||
UINT32 size = sizeof(IpcContainer);
|
UINT32 size = sizeof(IpcContainer);
|
||||||
IpcContainer *ipcContainer = (IpcContainer *)LOS_MemAlloc(m_aucSysMem1, size);
|
IpcContainer *ipcContainer = (IpcContainer *)LOS_MemAlloc(m_aucSysMem1, size);
|
||||||
if (ipcContainer == NULL) {
|
if (ipcContainer == NULL) {
|
||||||
return ENOMEM;
|
return NULL;
|
||||||
}
|
}
|
||||||
(VOID)memset_s(ipcContainer, size, 0, size);
|
(VOID)memset_s(ipcContainer, size, 0, size);
|
||||||
|
|
||||||
ipcContainer->allQueue = OsAllQueueCBInit(&ipcContainer->freeQueueList);
|
ipcContainer->allQueue = OsAllQueueCBInit(&ipcContainer->freeQueueList);
|
||||||
if (ipcContainer->allQueue == NULL) {
|
if (ipcContainer->allQueue == NULL) {
|
||||||
(VOID)LOS_MemFree(m_aucSysMem1, ipcContainer);
|
(VOID)LOS_MemFree(m_aucSysMem1, ipcContainer);
|
||||||
return ENOMEM;
|
return NULL;
|
||||||
}
|
}
|
||||||
pthread_mutexattr_init(&attr);
|
pthread_mutexattr_init(&attr);
|
||||||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
|
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
|
||||||
|
@ -66,22 +65,47 @@ STATIC UINT32 CreateIpcContainer(IpcContainer **newIpcContainer)
|
||||||
if (ipcContainer->shmSegs == NULL) {
|
if (ipcContainer->shmSegs == NULL) {
|
||||||
(VOID)LOS_MemFree(m_aucSysMem1, ipcContainer->allQueue);
|
(VOID)LOS_MemFree(m_aucSysMem1, ipcContainer->allQueue);
|
||||||
(VOID)LOS_MemFree(m_aucSysMem1, ipcContainer);
|
(VOID)LOS_MemFree(m_aucSysMem1, ipcContainer);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
ipcContainer->containerID = OsAllocContainerID();
|
||||||
|
|
||||||
|
if (parent != NULL) {
|
||||||
|
LOS_AtomicSet(&ipcContainer->rc, 1);
|
||||||
|
} else {
|
||||||
|
LOS_AtomicSet(&ipcContainer->rc, 3); /* 3: Three system processes */
|
||||||
|
}
|
||||||
|
return ipcContainer;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC UINT32 CreateIpcContainer(LosProcessCB *child, LosProcessCB *parent)
|
||||||
|
{
|
||||||
|
UINT32 intSave;
|
||||||
|
IpcContainer *parentContainer = parent->container->ipcContainer;
|
||||||
|
IpcContainer *newIpcContainer = CreateNewIpcContainer(parentContainer);
|
||||||
|
if (newIpcContainer == NULL) {
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOS_AtomicSet(&ipcContainer->rc, 1);
|
|
||||||
ipcContainer->containerID = OsAllocContainerID();
|
|
||||||
|
|
||||||
SCHEDULER_LOCK(intSave);
|
SCHEDULER_LOCK(intSave);
|
||||||
g_currentIpcContainerNum += 1;
|
g_currentIpcContainerNum++;
|
||||||
*newIpcContainer = ipcContainer;
|
child->container->ipcContainer = newIpcContainer;
|
||||||
SCHEDULER_UNLOCK(intSave);
|
SCHEDULER_UNLOCK(intSave);
|
||||||
return LOS_OK;
|
return LOS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT32 OsInitRootIpcContainer(IpcContainer **ipcContainer)
|
UINT32 OsInitRootIpcContainer(IpcContainer **ipcContainer)
|
||||||
{
|
{
|
||||||
return CreateIpcContainer(ipcContainer);
|
UINT32 intSave;
|
||||||
|
IpcContainer *newIpcContainer = CreateNewIpcContainer(NULL);
|
||||||
|
if (newIpcContainer == NULL) {
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCHEDULER_LOCK(intSave);
|
||||||
|
g_currentIpcContainerNum++;
|
||||||
|
*ipcContainer = newIpcContainer;
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
return LOS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT32 OsCopyIpcContainer(UINTPTR flags, LosProcessCB *child, LosProcessCB *parent)
|
UINT32 OsCopyIpcContainer(UINTPTR flags, LosProcessCB *child, LosProcessCB *parent)
|
||||||
|
@ -97,7 +121,7 @@ UINT32 OsCopyIpcContainer(UINTPTR flags, LosProcessCB *child, LosProcessCB *pare
|
||||||
return LOS_OK;
|
return LOS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
return CreateIpcContainer(&child->container->ipcContainer);
|
return CreateIpcContainer(child, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID OsIpcContainersDestroy(LosProcessCB *curr)
|
VOID OsIpcContainersDestroy(LosProcessCB *curr)
|
||||||
|
|
|
@ -44,20 +44,50 @@ LIST_HEAD *GetContainerMntList(VOID)
|
||||||
return &OsCurrProcessGet()->container->mntContainer->mountList;
|
return &OsCurrProcessGet()->container->mntContainer->mountList;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC UINT32 CreateMntContainer(MntContainer **newMntContainer)
|
STATIC MntContainer *CreateNewMntContainer(MntContainer *parent)
|
||||||
{
|
{
|
||||||
UINT32 intSave;
|
|
||||||
MntContainer *mntContainer = (MntContainer *)LOS_MemAlloc(m_aucSysMem1, sizeof(MntContainer));
|
MntContainer *mntContainer = (MntContainer *)LOS_MemAlloc(m_aucSysMem1, sizeof(MntContainer));
|
||||||
if (mntContainer == NULL) {
|
if (mntContainer == NULL) {
|
||||||
return ENOMEM;
|
return NULL;
|
||||||
}
|
}
|
||||||
mntContainer->containerID = OsAllocContainerID();
|
mntContainer->containerID = OsAllocContainerID();
|
||||||
LOS_AtomicSet(&mntContainer->rc, 1);
|
|
||||||
LOS_ListInit(&mntContainer->mountList);
|
LOS_ListInit(&mntContainer->mountList);
|
||||||
|
|
||||||
|
if (parent != NULL) {
|
||||||
|
LOS_AtomicSet(&mntContainer->rc, 1);
|
||||||
|
} else {
|
||||||
|
LOS_AtomicSet(&mntContainer->rc, 3); /* 3: Three system processes */
|
||||||
|
}
|
||||||
|
return mntContainer;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC UINT32 CreateMntContainer(LosProcessCB *child, LosProcessCB *parent)
|
||||||
|
{
|
||||||
|
UINT32 intSave;
|
||||||
|
MntContainer *parentContainer = parent->container->mntContainer;
|
||||||
|
MntContainer *newMntContainer = CreateNewMntContainer(parentContainer);
|
||||||
|
if (newMntContainer == NULL) {
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
SCHEDULER_LOCK(intSave);
|
SCHEDULER_LOCK(intSave);
|
||||||
g_currentMntContainerNum++;
|
g_currentMntContainerNum++;
|
||||||
*newMntContainer = mntContainer;
|
child->container->mntContainer = newMntContainer;
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
return LOS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT32 OsInitRootMntContainer(MntContainer **mntContainer)
|
||||||
|
{
|
||||||
|
UINT32 intSave;
|
||||||
|
MntContainer *newMntContainer = CreateNewMntContainer(NULL);
|
||||||
|
if (newMntContainer == NULL) {
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCHEDULER_LOCK(intSave);
|
||||||
|
g_currentMntContainerNum++;
|
||||||
|
*mntContainer = newMntContainer;
|
||||||
SCHEDULER_UNLOCK(intSave);
|
SCHEDULER_UNLOCK(intSave);
|
||||||
return LOS_OK;
|
return LOS_OK;
|
||||||
}
|
}
|
||||||
|
@ -94,7 +124,7 @@ UINT32 OsCopyMntContainer(UINTPTR flags, LosProcessCB *child, LosProcessCB *pare
|
||||||
return LOS_OK;
|
return LOS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = CreateMntContainer(&child->container->mntContainer);
|
ret = CreateMntContainer(child, parent);
|
||||||
if (ret != LOS_OK) {
|
if (ret != LOS_OK) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -158,9 +188,4 @@ UINT32 OsGetMntContainerID(MntContainer *mntContainer)
|
||||||
|
|
||||||
return mntContainer->containerID;
|
return mntContainer->containerID;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT32 OsInitRootMntContainer(MntContainer **mntContainer)
|
|
||||||
{
|
|
||||||
return CreateMntContainer(mntContainer);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -289,6 +289,7 @@ STATIC UINT32 CreatePidContainer(LosProcessCB *child, LosProcessCB *parent)
|
||||||
|
|
||||||
g_currentPidContainerNum++;
|
g_currentPidContainerNum++;
|
||||||
child->container->pidContainer = newPidContainer;
|
child->container->pidContainer = newPidContainer;
|
||||||
|
child->container->pidForChildContainer = newPidContainer;
|
||||||
ret = OsAllocSpecifiedVpidUnsafe(OS_USER_ROOT_PROCESS_ID, child, parent);
|
ret = OsAllocSpecifiedVpidUnsafe(OS_USER_ROOT_PROCESS_ID, child, parent);
|
||||||
if (ret == OS_INVALID_VALUE) {
|
if (ret == OS_INVALID_VALUE) {
|
||||||
g_currentPidContainerNum--;
|
g_currentPidContainerNum--;
|
||||||
|
@ -313,8 +314,9 @@ VOID OsPidContainersDestroy(LosProcessCB *curr)
|
||||||
FreeVpid(curr);
|
FreeVpid(curr);
|
||||||
if (LOS_AtomicRead(&pidContainer->rc) == 0) {
|
if (LOS_AtomicRead(&pidContainer->rc) == 0) {
|
||||||
g_currentPidContainerNum--;
|
g_currentPidContainerNum--;
|
||||||
(VOID)LOS_MemFree(m_aucSysMem1, pidContainer);
|
|
||||||
curr->container->pidContainer = NULL;
|
curr->container->pidContainer = NULL;
|
||||||
|
curr->container->pidForChildContainer = NULL;
|
||||||
|
(VOID)LOS_MemFree(m_aucSysMem1, pidContainer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -333,6 +335,7 @@ UINT32 OsCopyPidContainer(UINTPTR flags, LosProcessCB *child, LosProcessCB *pare
|
||||||
if (!(flags & CLONE_NEWPID)) {
|
if (!(flags & CLONE_NEWPID)) {
|
||||||
SCHEDULER_LOCK(intSave);
|
SCHEDULER_LOCK(intSave);
|
||||||
child->container->pidContainer = parent->container->pidContainer;
|
child->container->pidContainer = parent->container->pidContainer;
|
||||||
|
child->container->pidForChildContainer = parent->container->pidContainer;
|
||||||
ret = OsAllocVpid(child);
|
ret = OsAllocVpid(child);
|
||||||
SCHEDULER_UNLOCK(intSave);
|
SCHEDULER_UNLOCK(intSave);
|
||||||
if (ret == OS_INVALID_VALUE) {
|
if (ret == OS_INVALID_VALUE) {
|
||||||
|
|
|
@ -0,0 +1,182 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include "los_time_container_pri.h"
|
||||||
|
#include "los_process_pri.h"
|
||||||
|
|
||||||
|
#ifdef LOSCFG_TIME_CONTAINER
|
||||||
|
STATIC UINT32 g_currentTimeContainerNum;
|
||||||
|
|
||||||
|
STATIC TimeContainer *CreateNewTimeContainer(TimeContainer *parent)
|
||||||
|
{
|
||||||
|
UINT32 size = sizeof(TimeContainer);
|
||||||
|
TimeContainer *timeContainer = (TimeContainer *)LOS_MemAlloc(m_aucSysMem1, size);
|
||||||
|
if (timeContainer == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
(VOID)memset_s(timeContainer, size, 0, size);
|
||||||
|
|
||||||
|
timeContainer->containerID = OsAllocContainerID();
|
||||||
|
if (parent != NULL) {
|
||||||
|
timeContainer->frozenOffsets = FALSE;
|
||||||
|
LOS_AtomicSet(&timeContainer->rc, 1);
|
||||||
|
} else {
|
||||||
|
timeContainer->frozenOffsets = TRUE;
|
||||||
|
LOS_AtomicSet(&timeContainer->rc, 3); /* 3: Three system processes */
|
||||||
|
}
|
||||||
|
return timeContainer;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC UINT32 CreateTimeContainer(LosProcessCB *child, LosProcessCB *parent)
|
||||||
|
{
|
||||||
|
UINT32 intSave;
|
||||||
|
TimeContainer *parentContainer = parent->container->timeContainer;
|
||||||
|
TimeContainer *newTimeContainer = CreateNewTimeContainer(parentContainer);
|
||||||
|
if (newTimeContainer == NULL) {
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCHEDULER_LOCK(intSave);
|
||||||
|
g_currentTimeContainerNum++;
|
||||||
|
(VOID)memcpy_s(&newTimeContainer->monotonic, sizeof(struct timespec64),
|
||||||
|
&parentContainer->monotonic, sizeof(struct timespec64));
|
||||||
|
child->container->timeContainer = newTimeContainer;
|
||||||
|
child->container->timeForChildContainer = newTimeContainer;
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
return LOS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT32 OsInitRootTimeContainer(TimeContainer **timeContainer)
|
||||||
|
{
|
||||||
|
UINT32 intSave;
|
||||||
|
TimeContainer *newTimeContainer = CreateNewTimeContainer(NULL);
|
||||||
|
if (newTimeContainer == NULL) {
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCHEDULER_LOCK(intSave);
|
||||||
|
*timeContainer = newTimeContainer;
|
||||||
|
g_currentTimeContainerNum++;
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
return LOS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT32 OsCopyTimeContainer(UINTPTR flags, LosProcessCB *child, LosProcessCB *parent)
|
||||||
|
{
|
||||||
|
UINT32 intSave;
|
||||||
|
TimeContainer *currTimeContainer = parent->container->timeContainer;
|
||||||
|
|
||||||
|
if (!(flags & CLONE_NEWTIME)) {
|
||||||
|
SCHEDULER_LOCK(intSave);
|
||||||
|
if (!currTimeContainer->frozenOffsets) {
|
||||||
|
currTimeContainer->frozenOffsets = TRUE;
|
||||||
|
}
|
||||||
|
LOS_AtomicInc(&currTimeContainer->rc);
|
||||||
|
child->container->timeContainer = currTimeContainer;
|
||||||
|
child->container->timeForChildContainer = currTimeContainer;
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
return LOS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CreateTimeContainer(child, parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID OsTimeContainersDestroy(LosProcessCB *curr)
|
||||||
|
{
|
||||||
|
UINT32 intSave;
|
||||||
|
if (curr->container == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCHEDULER_LOCK(intSave);
|
||||||
|
TimeContainer *timeContainer = curr->container->timeContainer;
|
||||||
|
if (timeContainer != NULL) {
|
||||||
|
LOS_AtomicDec(&timeContainer->rc);
|
||||||
|
if (LOS_AtomicRead(&timeContainer->rc) == 0) {
|
||||||
|
g_currentTimeContainerNum--;
|
||||||
|
curr->container->timeContainer = NULL;
|
||||||
|
curr->container->timeForChildContainer = NULL;
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
(VOID)LOS_MemFree(m_aucSysMem1, timeContainer);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT32 OsGetTimeContainerID(TimeContainer *timeContainer)
|
||||||
|
{
|
||||||
|
if (timeContainer == NULL) {
|
||||||
|
return OS_INVALID_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return timeContainer->containerID;
|
||||||
|
}
|
||||||
|
|
||||||
|
TimeContainer *OsGetCurrTimeContainer(VOID)
|
||||||
|
{
|
||||||
|
return OsCurrProcessGet()->container->timeContainer;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT32 OsGetTimeContainerMonotonic(LosProcessCB *processCB, struct timespec64 *offsets)
|
||||||
|
{
|
||||||
|
if ((processCB == NULL) || (offsets == NULL)) {
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OsProcessIsInactive(processCB)) {
|
||||||
|
return ESRCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
TimeContainer *timeContainer = processCB->container->timeForChildContainer;
|
||||||
|
(VOID)memcpy_s(offsets, sizeof(struct timespec64), &timeContainer->monotonic, sizeof(struct timespec64));
|
||||||
|
return LOS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT32 OsSetTimeContainerMonotonic(LosProcessCB *processCB, struct timespec64 *offsets)
|
||||||
|
{
|
||||||
|
if ((processCB == NULL) || (offsets == NULL)) {
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OsProcessIsInactive(processCB)) {
|
||||||
|
return ESRCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
TimeContainer *timeContainer = processCB->container->timeForChildContainer;
|
||||||
|
if (timeContainer->frozenOffsets) {
|
||||||
|
return EACCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
timeContainer->monotonic.tv_sec = offsets->tv_sec;
|
||||||
|
timeContainer->monotonic.tv_nsec = offsets->tv_nsec;
|
||||||
|
return LOS_OK;
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -36,82 +36,9 @@
|
||||||
|
|
||||||
STATIC UINT32 g_currentUtsContainerNum;
|
STATIC UINT32 g_currentUtsContainerNum;
|
||||||
|
|
||||||
STATIC UINT32 CreateUtsContainer(UtsContainer **newUtsContainer)
|
|
||||||
{
|
|
||||||
UINT32 intSave;
|
|
||||||
UINT32 size = sizeof(UtsContainer);
|
|
||||||
UtsContainer *utsContainer = LOS_MemAlloc(m_aucSysMem1, size);
|
|
||||||
if (utsContainer == NULL) {
|
|
||||||
return ENOMEM;
|
|
||||||
}
|
|
||||||
(VOID)memset_s(utsContainer, sizeof(UtsContainer), 0, sizeof(UtsContainer));
|
|
||||||
|
|
||||||
utsContainer->containerID = OsAllocContainerID();
|
|
||||||
LOS_AtomicSet(&utsContainer->rc, 1);
|
|
||||||
|
|
||||||
SCHEDULER_LOCK(intSave);
|
|
||||||
g_currentUtsContainerNum += 1;
|
|
||||||
*newUtsContainer = utsContainer;
|
|
||||||
SCHEDULER_UNLOCK(intSave);
|
|
||||||
return LOS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
UINT32 OsCopyUtsContainer(UINTPTR flags, LosProcessCB *child, LosProcessCB *parent)
|
|
||||||
{
|
|
||||||
UINT32 intSave;
|
|
||||||
UINT32 ret;
|
|
||||||
UtsContainer *newUtsContainer = NULL;
|
|
||||||
UtsContainer *currUtsContainer = parent->container->utsContainer;
|
|
||||||
|
|
||||||
if (!(flags & CLONE_NEWUTS)) {
|
|
||||||
SCHEDULER_LOCK(intSave);
|
|
||||||
LOS_AtomicInc(&currUtsContainer->rc);
|
|
||||||
child->container->utsContainer = currUtsContainer;
|
|
||||||
SCHEDULER_UNLOCK(intSave);
|
|
||||||
return LOS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = CreateUtsContainer(&newUtsContainer);
|
|
||||||
if (ret != LOS_OK) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
SCHEDULER_LOCK(intSave);
|
|
||||||
(VOID)memcpy_s(&newUtsContainer->utsName, sizeof(newUtsContainer->utsName),
|
|
||||||
&currUtsContainer->utsName, sizeof(currUtsContainer->utsName));
|
|
||||||
child->container->utsContainer = newUtsContainer;
|
|
||||||
SCHEDULER_UNLOCK(intSave);
|
|
||||||
return LOS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID OsUtsContainersDestroy(LosProcessCB *curr)
|
|
||||||
{
|
|
||||||
UINT32 intSave;
|
|
||||||
if (curr->container == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SCHEDULER_LOCK(intSave);
|
|
||||||
UtsContainer *utsContainer = curr->container->utsContainer;
|
|
||||||
if (utsContainer != NULL) {
|
|
||||||
LOS_AtomicDec(&utsContainer->rc);
|
|
||||||
if (LOS_AtomicRead(&utsContainer->rc) == 0) {
|
|
||||||
g_currentUtsContainerNum--;
|
|
||||||
curr->container->utsContainer = NULL;
|
|
||||||
SCHEDULER_UNLOCK(intSave);
|
|
||||||
(VOID)LOS_MemFree(m_aucSysMem1, utsContainer);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SCHEDULER_UNLOCK(intSave);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
STATIC UINT32 InitUtsContainer(struct utsname *name)
|
STATIC UINT32 InitUtsContainer(struct utsname *name)
|
||||||
{
|
{
|
||||||
UINT32 ret;
|
UINT32 ret = sprintf_s(name->sysname, sizeof(name->sysname), "%s", KERNEL_NAME);
|
||||||
|
|
||||||
ret = sprintf_s(name->sysname, sizeof(name->sysname), "%s", KERNEL_NAME);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return LOS_NOK;
|
return LOS_NOK;
|
||||||
}
|
}
|
||||||
|
@ -138,14 +65,100 @@ STATIC UINT32 InitUtsContainer(struct utsname *name)
|
||||||
return LOS_OK;
|
return LOS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT32 OsInitRootUtsContainer(UtsContainer **utsContainer)
|
STATIC UtsContainer *CreateNewUtsContainer(UtsContainer *parent)
|
||||||
{
|
{
|
||||||
UINT32 ret = CreateUtsContainer(utsContainer);
|
UINT32 ret;
|
||||||
|
UINT32 size = sizeof(UtsContainer);
|
||||||
|
UtsContainer *utsContainer = (UtsContainer *)LOS_MemAlloc(m_aucSysMem1, size);
|
||||||
|
if (utsContainer == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
(VOID)memset_s(utsContainer, sizeof(UtsContainer), 0, sizeof(UtsContainer));
|
||||||
|
|
||||||
|
utsContainer->containerID = OsAllocContainerID();
|
||||||
|
if (parent != NULL) {
|
||||||
|
LOS_AtomicSet(&utsContainer->rc, 1);
|
||||||
|
return utsContainer;
|
||||||
|
}
|
||||||
|
LOS_AtomicSet(&utsContainer->rc, 3); /* 3: Three system processes */
|
||||||
|
ret = InitUtsContainer(&utsContainer->utsName);
|
||||||
if (ret != LOS_OK) {
|
if (ret != LOS_OK) {
|
||||||
return ret;
|
(VOID)LOS_MemFree(m_aucSysMem1, utsContainer);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return utsContainer;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC UINT32 CreateUtsContainer(LosProcessCB *child, LosProcessCB *parent)
|
||||||
|
{
|
||||||
|
UINT32 intSave;
|
||||||
|
UtsContainer *parentContainer = parent->container->utsContainer;
|
||||||
|
UtsContainer *newUtsContainer = CreateNewUtsContainer(parentContainer);
|
||||||
|
if (newUtsContainer == NULL) {
|
||||||
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
return InitUtsContainer(&(*utsContainer)->utsName);
|
SCHEDULER_LOCK(intSave);
|
||||||
|
g_currentUtsContainerNum++;
|
||||||
|
(VOID)memcpy_s(&newUtsContainer->utsName, sizeof(newUtsContainer->utsName),
|
||||||
|
&parentContainer->utsName, sizeof(parentContainer->utsName));
|
||||||
|
child->container->utsContainer = newUtsContainer;
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
return LOS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT32 OsInitRootUtsContainer(UtsContainer **utsContainer)
|
||||||
|
{
|
||||||
|
UINT32 intSave;
|
||||||
|
UtsContainer *newUtsContainer = CreateNewUtsContainer(NULL);
|
||||||
|
if (newUtsContainer == NULL) {
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCHEDULER_LOCK(intSave);
|
||||||
|
g_currentUtsContainerNum++;
|
||||||
|
*utsContainer = newUtsContainer;
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
return LOS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT32 OsCopyUtsContainer(UINTPTR flags, LosProcessCB *child, LosProcessCB *parent)
|
||||||
|
{
|
||||||
|
UINT32 intSave;
|
||||||
|
UtsContainer *currUtsContainer = parent->container->utsContainer;
|
||||||
|
|
||||||
|
if (!(flags & CLONE_NEWUTS)) {
|
||||||
|
SCHEDULER_LOCK(intSave);
|
||||||
|
LOS_AtomicInc(&currUtsContainer->rc);
|
||||||
|
child->container->utsContainer = currUtsContainer;
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
return LOS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CreateUtsContainer(child, parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID OsUtsContainersDestroy(LosProcessCB *curr)
|
||||||
|
{
|
||||||
|
UINT32 intSave;
|
||||||
|
if (curr->container == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCHEDULER_LOCK(intSave);
|
||||||
|
UtsContainer *utsContainer = curr->container->utsContainer;
|
||||||
|
if (utsContainer != NULL) {
|
||||||
|
LOS_AtomicDec(&utsContainer->rc);
|
||||||
|
if (LOS_AtomicRead(&utsContainer->rc) == 0) {
|
||||||
|
g_currentUtsContainerNum--;
|
||||||
|
curr->container->utsContainer = NULL;
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
(VOID)LOS_MemFree(m_aucSysMem1, utsContainer);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct utsname *OsGetCurrUtsName(VOID)
|
struct utsname *OsGetCurrUtsName(VOID)
|
||||||
|
|
|
@ -2075,6 +2075,9 @@ LITE_OS_SEC_TEXT INT32 OsClone(UINT32 flags, UINTPTR sp, UINT32 size)
|
||||||
return -LOS_EINVAL;
|
return -LOS_EINVAL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef LOSCFG_TIME_CONTAINER
|
||||||
|
cloneFlag |= CLONE_NEWTIME;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (flags & (~cloneFlag)) {
|
if (flags & (~cloneFlag)) {
|
||||||
|
|
|
@ -45,19 +45,26 @@
|
||||||
#ifdef LOSCFG_IPC_CONTAINER
|
#ifdef LOSCFG_IPC_CONTAINER
|
||||||
#include "los_ipc_container_pri.h"
|
#include "los_ipc_container_pri.h"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef LOSCFG_TIME_CONTAINER
|
||||||
|
#include "los_time_container_pri.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CONTAINER = 0,
|
CONTAINER = 0,
|
||||||
PID_CONTAINER,
|
PID_CONTAINER,
|
||||||
|
PID_CHILD_CONTAINER,
|
||||||
UTS_CONTAINER,
|
UTS_CONTAINER,
|
||||||
MNT_CONTAINER,
|
MNT_CONTAINER,
|
||||||
IPC_CONTAINER,
|
IPC_CONTAINER,
|
||||||
|
TIME_CONTAINER,
|
||||||
|
TIME_CHILD_CONTAINER,
|
||||||
} ContainerType;
|
} ContainerType;
|
||||||
|
|
||||||
typedef struct Container {
|
typedef struct Container {
|
||||||
Atomic rc;
|
Atomic rc;
|
||||||
#ifdef LOSCFG_PID_CONTAINER
|
#ifdef LOSCFG_PID_CONTAINER
|
||||||
struct PidContainer *pidContainer;
|
struct PidContainer *pidContainer;
|
||||||
|
struct PidContainer *pidForChildContainer;
|
||||||
#endif
|
#endif
|
||||||
#ifdef LOSCFG_UTS_CONTAINER
|
#ifdef LOSCFG_UTS_CONTAINER
|
||||||
struct UtsContainer *utsContainer;
|
struct UtsContainer *utsContainer;
|
||||||
|
@ -68,6 +75,10 @@ typedef struct Container {
|
||||||
#ifdef LOSCFG_IPC_CONTAINER
|
#ifdef LOSCFG_IPC_CONTAINER
|
||||||
struct IpcContainer *ipcContainer;
|
struct IpcContainer *ipcContainer;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef LOSCFG_IPC_CONTAINER
|
||||||
|
struct TimeContainer *timeContainer;
|
||||||
|
struct TimeContainer *timeForChildContainer;
|
||||||
|
#endif
|
||||||
} Container;
|
} Container;
|
||||||
|
|
||||||
VOID OsContainerInitSystemProcess(LosProcessCB *processCB);
|
VOID OsContainerInitSystemProcess(LosProcessCB *processCB);
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022-2022 Huawei Device Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LOS_TIME_CONTAINER_PRI_H
|
||||||
|
#define _LOS_TIME_CONTAINER_PRI_H
|
||||||
|
#include "time.h"
|
||||||
|
#include "los_atomic.h"
|
||||||
|
|
||||||
|
#ifdef LOSCFG_TIME_CONTAINER
|
||||||
|
typedef struct ProcessCB LosProcessCB;
|
||||||
|
|
||||||
|
typedef struct TimeContainer {
|
||||||
|
Atomic rc;
|
||||||
|
BOOL frozenOffsets;
|
||||||
|
struct timespec64 monotonic;
|
||||||
|
UINT32 containerID;
|
||||||
|
} TimeContainer;
|
||||||
|
|
||||||
|
UINT32 OsInitRootTimeContainer(TimeContainer **timeContainer);
|
||||||
|
|
||||||
|
UINT32 OsCopyTimeContainer(UINTPTR flags, LosProcessCB *child, LosProcessCB *parent);
|
||||||
|
|
||||||
|
VOID OsTimeContainersDestroy(LosProcessCB *curr);
|
||||||
|
|
||||||
|
UINT32 OsGetTimeContainerID(TimeContainer *timeContainer);
|
||||||
|
|
||||||
|
TimeContainer *OsGetCurrTimeContainer(VOID);
|
||||||
|
|
||||||
|
UINT32 OsGetTimeContainerMonotonic(LosProcessCB *processCB, struct timespec64 *offsets);
|
||||||
|
|
||||||
|
UINT32 OsSetTimeContainerMonotonic(LosProcessCB *processCB, struct timespec64 *offsets);
|
||||||
|
|
||||||
|
#define CLOCK_MONOTONIC_TIME_BASE (OsGetCurrTimeContainer()->monotonic)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* _LOS_TIME_CONTAINER_PRI_H */
|
|
@ -137,6 +137,7 @@ LOSCFG_USER_TEST_PID_CONTAINER = false
|
||||||
LOSCFG_USER_TEST_UTS_CONTAINER = false
|
LOSCFG_USER_TEST_UTS_CONTAINER = false
|
||||||
LOSCFG_USER_TEST_MNT_CONTAINER = false
|
LOSCFG_USER_TEST_MNT_CONTAINER = false
|
||||||
LOSCFG_USER_TEST_IPC_CONTAINER = false
|
LOSCFG_USER_TEST_IPC_CONTAINER = false
|
||||||
|
LOSCFG_USER_TEST_TIME_CONTAINER = false
|
||||||
if (defined(LOSCFG_KERNEL_CONTAINER)) {
|
if (defined(LOSCFG_KERNEL_CONTAINER)) {
|
||||||
LOSCFG_USER_TEST_CONTAINER = true
|
LOSCFG_USER_TEST_CONTAINER = true
|
||||||
if (defined(LOSCFG_PID_CONTAINER)) {
|
if (defined(LOSCFG_PID_CONTAINER)) {
|
||||||
|
@ -151,4 +152,7 @@ if (defined(LOSCFG_KERNEL_CONTAINER)) {
|
||||||
if (defined(LOSCFG_IPC_CONTAINER)) {
|
if (defined(LOSCFG_IPC_CONTAINER)) {
|
||||||
LOSCFG_USER_TEST_IPC_CONTAINER = true
|
LOSCFG_USER_TEST_IPC_CONTAINER = true
|
||||||
}
|
}
|
||||||
|
if (defined(LOSCFG_TIME_CONTAINER)) {
|
||||||
|
LOSCFG_USER_TEST_TIME_CONTAINER = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,9 @@ config("container_config") {
|
||||||
if (defined(LOSCFG_USER_TEST_IPC_CONTAINER)) {
|
if (defined(LOSCFG_USER_TEST_IPC_CONTAINER)) {
|
||||||
cflags += [ "-DLOSCFG_USER_TEST_IPC_CONTAINER" ]
|
cflags += [ "-DLOSCFG_USER_TEST_IPC_CONTAINER" ]
|
||||||
}
|
}
|
||||||
|
if (defined(LOSCFG_USER_TEST_TIME_CONTAINER)) {
|
||||||
|
cflags += [ "-DLOSCFG_USER_TEST_TIME_CONTAINER" ]
|
||||||
|
}
|
||||||
cflags_cc = cflags
|
cflags_cc = cflags
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -126,6 +126,30 @@ HWTEST_F(ContainerTest, ItPidContainer023, TestSize.Level0)
|
||||||
{
|
{
|
||||||
ItPidContainer023();
|
ItPidContainer023();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @tc.name: Container_Pid_Test_025
|
||||||
|
* @tc.desc: pid container function test case
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: issueI68LVW
|
||||||
|
* @tc.author:
|
||||||
|
*/
|
||||||
|
HWTEST_F(ContainerTest, ItPidContainer025, TestSize.Level0)
|
||||||
|
{
|
||||||
|
ItPidContainer025();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @tc.name: Container_Pid_Test_026
|
||||||
|
* @tc.desc: pid container function test case
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: issueI68LVW
|
||||||
|
* @tc.author:
|
||||||
|
*/
|
||||||
|
HWTEST_F(ContainerTest, ItPidContainer026, TestSize.Level0)
|
||||||
|
{
|
||||||
|
ItPidContainer026();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(LOSCFG_USER_TEST_UTS_CONTAINER)
|
#if defined(LOSCFG_USER_TEST_UTS_CONTAINER)
|
||||||
/**
|
/**
|
||||||
|
@ -242,6 +266,56 @@ HWTEST_F(ContainerTest, ItIpcContainer004, TestSize.Level0)
|
||||||
ItIpcContainer004();
|
ItIpcContainer004();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(LOSCFG_USER_TEST_TIME_CONTAINER)
|
||||||
|
/**
|
||||||
|
* @tc.name: Container_TIME_Test_001
|
||||||
|
* @tc.desc: time container function test case
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: issueI6B0A3
|
||||||
|
* @tc.author:
|
||||||
|
*/
|
||||||
|
HWTEST_F(ContainerTest, ItTimeContainer001, TestSize.Level0)
|
||||||
|
{
|
||||||
|
ItTimeContainer001();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @tc.name: Container_TIME_Test_007
|
||||||
|
* @tc.desc: time container function test case
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: issueI6B0A3
|
||||||
|
* @tc.author:
|
||||||
|
*/
|
||||||
|
HWTEST_F(ContainerTest, ItTimeContainer007, TestSize.Level0)
|
||||||
|
{
|
||||||
|
ItTimeContainer007();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @tc.name: Container_TIME_Test_009
|
||||||
|
* @tc.desc: time container function test case
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: issueI6B0A3
|
||||||
|
* @tc.author:
|
||||||
|
*/
|
||||||
|
HWTEST_F(ContainerTest, ItTimeContainer009, TestSize.Level0)
|
||||||
|
{
|
||||||
|
ItTimeContainer009();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @tc.name: Container_TIME_Test_010
|
||||||
|
* @tc.desc: time container function test case
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: issueI6B0A3
|
||||||
|
* @tc.author:
|
||||||
|
*/
|
||||||
|
HWTEST_F(ContainerTest, ItTimeContainer010, TestSize.Level0)
|
||||||
|
{
|
||||||
|
ItTimeContainer010();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif /* LOSCFG_USER_TEST_SMOKE */
|
#endif /* LOSCFG_USER_TEST_SMOKE */
|
||||||
|
|
||||||
#if defined(LOSCFG_USER_TEST_FULL)
|
#if defined(LOSCFG_USER_TEST_FULL)
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include <csignal>
|
#include <csignal>
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
#include <sys/capability.h>
|
#include <sys/capability.h>
|
||||||
|
#include <cstring>
|
||||||
#include "osTest.h"
|
#include "osTest.h"
|
||||||
#include "mqueue.h"
|
#include "mqueue.h"
|
||||||
#include "sys/time.h"
|
#include "sys/time.h"
|
||||||
|
@ -86,6 +87,10 @@ extern const int CHILD_FUNC_ARG;
|
||||||
|
|
||||||
const int MQUEUE_STANDARD_NAME_LENGTH = 255;
|
const int MQUEUE_STANDARD_NAME_LENGTH = 255;
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#define CLONE_NEWTIME 0x00000080
|
||||||
|
}
|
||||||
|
|
||||||
int ChildFunction(void *args);
|
int ChildFunction(void *args);
|
||||||
|
|
||||||
pid_t CloneWrapper(int (*func)(void *), int flag, void *args);
|
pid_t CloneWrapper(int (*func)(void *), int flag, void *args);
|
||||||
|
@ -135,6 +140,8 @@ void ItContainer001(void);
|
||||||
void ItContainerChroot001(void);
|
void ItContainerChroot001(void);
|
||||||
#if defined(LOSCFG_USER_TEST_PID_CONTAINER)
|
#if defined(LOSCFG_USER_TEST_PID_CONTAINER)
|
||||||
void ItPidContainer023(void);
|
void ItPidContainer023(void);
|
||||||
|
void ItPidContainer025(void);
|
||||||
|
void ItPidContainer026(void);
|
||||||
#endif
|
#endif
|
||||||
#if defined(LOSCFG_USER_TEST_UTS_CONTAINER)
|
#if defined(LOSCFG_USER_TEST_UTS_CONTAINER)
|
||||||
void ItUtsContainer001(void);
|
void ItUtsContainer001(void);
|
||||||
|
@ -158,6 +165,18 @@ void ItIpcContainer004(void);
|
||||||
void ItIpcContainer005(void);
|
void ItIpcContainer005(void);
|
||||||
void ItIpcContainer006(void);
|
void ItIpcContainer006(void);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(LOSCFG_USER_TEST_TIME_CONTAINER)
|
||||||
|
void ItTimeContainer001(void);
|
||||||
|
void ItTimeContainer002(void);
|
||||||
|
void ItTimeContainer003(void);
|
||||||
|
void ItTimeContainer004(void);
|
||||||
|
void ItTimeContainer005(void);
|
||||||
|
void ItTimeContainer006(void);
|
||||||
|
void ItTimeContainer007(void);
|
||||||
|
void ItTimeContainer008(void);
|
||||||
|
void ItTimeContainer009(void);
|
||||||
|
void ItTimeContainer010(void);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(LOSCFG_USER_TEST_FULL)
|
#if defined(LOSCFG_USER_TEST_FULL)
|
||||||
|
|
|
@ -44,8 +44,11 @@ sources_smoke = [
|
||||||
sources_full = []
|
sources_full = []
|
||||||
|
|
||||||
if (defined(LOSCFG_USER_TEST_PID_CONTAINER)) {
|
if (defined(LOSCFG_USER_TEST_PID_CONTAINER)) {
|
||||||
sources_smoke +=
|
sources_smoke += [
|
||||||
[ "$TEST_UNITTEST_DIR/container/smoke/It_pid_container_023.cpp" ]
|
"$TEST_UNITTEST_DIR/container/smoke/It_pid_container_023.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/container/smoke/It_pid_container_025.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/container/smoke/It_pid_container_026.cpp",
|
||||||
|
]
|
||||||
sources_full += [
|
sources_full += [
|
||||||
"$TEST_UNITTEST_DIR/container/full/It_pid_container_001.cpp",
|
"$TEST_UNITTEST_DIR/container/full/It_pid_container_001.cpp",
|
||||||
"$TEST_UNITTEST_DIR/container/full/It_pid_container_002.cpp",
|
"$TEST_UNITTEST_DIR/container/full/It_pid_container_002.cpp",
|
||||||
|
@ -102,3 +105,18 @@ if (defined(LOSCFG_USER_TEST_IPC_CONTAINER)) {
|
||||||
"$TEST_UNITTEST_DIR/container/smoke/It_ipc_container_006.cpp",
|
"$TEST_UNITTEST_DIR/container/smoke/It_ipc_container_006.cpp",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (defined(LOSCFG_USER_TEST_TIME_CONTAINER)) {
|
||||||
|
sources_smoke += [
|
||||||
|
"$TEST_UNITTEST_DIR/container/smoke/It_time_container_001.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/container/smoke/It_time_container_002.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/container/smoke/It_time_container_003.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/container/smoke/It_time_container_004.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/container/smoke/It_time_container_005.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/container/smoke/It_time_container_006.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/container/smoke/It_time_container_007.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/container/smoke/It_time_container_008.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/container/smoke/It_time_container_009.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/container/smoke/It_time_container_010.cpp",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include "It_container_test.h"
|
||||||
|
|
||||||
|
static int childFunc(void *arg)
|
||||||
|
{
|
||||||
|
(void)arg;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ItPidContainer025(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int status;
|
||||||
|
char *containerType = "pid";
|
||||||
|
char *containerType1 = "pid_for_children";
|
||||||
|
|
||||||
|
char *stack = (char *)mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, CLONE_STACK_MMAP_FLAG, -1, 0);
|
||||||
|
ASSERT_NE(stack, nullptr);
|
||||||
|
char *stackTop = stack + STACK_SIZE;
|
||||||
|
std::cout << getpid() << std::endl;
|
||||||
|
auto linkBuffer = ReadlinkContainer(getpid(), containerType);
|
||||||
|
auto linkBuffer1 = ReadlinkContainer(getpid(), containerType1);
|
||||||
|
ret = linkBuffer.compare(linkBuffer1);
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
auto pid = clone(childFunc, stackTop, CLONE_NEWPID | SIGCHLD, NULL);
|
||||||
|
ASSERT_TRUE(pid != -1);
|
||||||
|
|
||||||
|
ret = waitpid(pid, &status, 0);
|
||||||
|
ASSERT_EQ(ret, pid);
|
||||||
|
|
||||||
|
ret = WIFEXITED(status);
|
||||||
|
ASSERT_NE(ret, 0);
|
||||||
|
|
||||||
|
int exitCode = WEXITSTATUS(status);
|
||||||
|
ASSERT_EQ(exitCode, 0);
|
||||||
|
|
||||||
|
auto linkBuffer2 = ReadlinkContainer(getpid(), containerType);
|
||||||
|
ret = linkBuffer.compare(linkBuffer2);
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include "It_container_test.h"
|
||||||
|
|
||||||
|
static int childFunc(void *arg)
|
||||||
|
{
|
||||||
|
(void)arg;
|
||||||
|
sleep(1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ItPidContainer026(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int status;
|
||||||
|
char *containerType = "pid";
|
||||||
|
char *containerType1 = "pid_for_children";
|
||||||
|
|
||||||
|
char *stack = (char *)mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, CLONE_STACK_MMAP_FLAG, -1, 0);
|
||||||
|
ASSERT_NE(stack, nullptr);
|
||||||
|
char *stackTop = stack + STACK_SIZE;
|
||||||
|
std::cout << getpid() << std::endl;
|
||||||
|
auto linkBuffer = ReadlinkContainer(getpid(), containerType);
|
||||||
|
auto linkBuffer1 = ReadlinkContainer(getpid(), containerType1);
|
||||||
|
ret = linkBuffer.compare(linkBuffer1);
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
auto pid = clone(childFunc, stackTop, CLONE_NEWPID | SIGCHLD, NULL);
|
||||||
|
ASSERT_TRUE(pid != -1);
|
||||||
|
|
||||||
|
auto linkBuffer2 = ReadlinkContainer(pid, containerType);
|
||||||
|
ret = linkBuffer.compare(linkBuffer2);
|
||||||
|
ASSERT_NE(ret, 0);
|
||||||
|
|
||||||
|
ret = waitpid(pid, &status, 0);
|
||||||
|
ASSERT_EQ(ret, pid);
|
||||||
|
|
||||||
|
ret = WIFEXITED(status);
|
||||||
|
ASSERT_NE(ret, 0);
|
||||||
|
|
||||||
|
int exitCode = WEXITSTATUS(status);
|
||||||
|
ASSERT_EQ(exitCode, 0);
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include "It_container_test.h"
|
||||||
|
|
||||||
|
static int childFunc(void *arg)
|
||||||
|
{
|
||||||
|
int value = *((int*)arg);
|
||||||
|
if (value != CHILD_FUNC_ARG) {
|
||||||
|
return EXIT_CODE_ERRNO_1;
|
||||||
|
}
|
||||||
|
sleep(1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ItTimeContainer001(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int status;
|
||||||
|
char *containerType = "time";
|
||||||
|
char *containerType1 = "time_for_children";
|
||||||
|
|
||||||
|
char *stack = (char *)mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, CLONE_STACK_MMAP_FLAG, -1, 0);
|
||||||
|
ASSERT_NE(stack, nullptr);
|
||||||
|
char *stackTop = stack + STACK_SIZE;
|
||||||
|
std::cout << getpid() << std::endl;
|
||||||
|
auto linkBuffer = ReadlinkContainer(getpid(), containerType);
|
||||||
|
auto linkBuffer1 = ReadlinkContainer(getpid(), containerType1);
|
||||||
|
ret = linkBuffer.compare(linkBuffer1);
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
int arg = CHILD_FUNC_ARG;
|
||||||
|
auto pid = clone(childFunc, stackTop, CLONE_NEWTIME | SIGCHLD, &arg);
|
||||||
|
ASSERT_TRUE(pid != -1);
|
||||||
|
|
||||||
|
auto linkBuffer2 = ReadlinkContainer(pid, containerType);
|
||||||
|
ret = linkBuffer.compare(linkBuffer2);
|
||||||
|
ASSERT_NE(ret, 0);
|
||||||
|
|
||||||
|
ret = waitpid(pid, &status, 0);
|
||||||
|
ASSERT_EQ(ret, pid);
|
||||||
|
|
||||||
|
ret = WIFEXITED(status);
|
||||||
|
ASSERT_NE(ret, 0);
|
||||||
|
|
||||||
|
int exitCode = WEXITSTATUS(status);
|
||||||
|
ASSERT_EQ(exitCode, 0);
|
||||||
|
}
|
|
@ -0,0 +1,139 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include "It_container_test.h"
|
||||||
|
|
||||||
|
const int STR_LEN = 50;
|
||||||
|
const int SEC = 600;
|
||||||
|
const int NSEC = 800000000;
|
||||||
|
|
||||||
|
static int childFunc(void *arg)
|
||||||
|
{
|
||||||
|
char path[STR_LEN];
|
||||||
|
char timeOff[STR_LEN];
|
||||||
|
char readBuf[STR_LEN];
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = sprintf_s(timeOff, STR_LEN, "monotonic %d %d", SEC, NSEC);
|
||||||
|
if (ret <= 0) {
|
||||||
|
return EXIT_CODE_ERRNO_4;
|
||||||
|
}
|
||||||
|
ret = sprintf_s(path, STR_LEN, "/proc/%d/time_offsets", getpid());
|
||||||
|
if (ret <= 0) {
|
||||||
|
return EXIT_CODE_ERRNO_5;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fd = open(path, O_RDWR);
|
||||||
|
if (fd == -1) {
|
||||||
|
return EXIT_CODE_ERRNO_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = read(fd, readBuf, STR_LEN);
|
||||||
|
if (ret == -1) {
|
||||||
|
close(fd);
|
||||||
|
return EXIT_CODE_ERRNO_2;
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
ret = strncmp(timeOff, readBuf, strlen(timeOff));
|
||||||
|
if (ret != 0) {
|
||||||
|
return EXIT_CODE_ERRNO_3;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static int WriteProcTime(int pid)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
char path[STR_LEN];
|
||||||
|
char timeOff[STR_LEN];
|
||||||
|
|
||||||
|
ret = sprintf_s(timeOff, STR_LEN, "monotonic %d %d", SEC, NSEC);
|
||||||
|
if (ret <= 0) {
|
||||||
|
return EXIT_CODE_ERRNO_6;
|
||||||
|
}
|
||||||
|
ret = sprintf_s(path, STR_LEN, "/proc/%d/time_offsets", pid);
|
||||||
|
if (ret <= 0) {
|
||||||
|
return EXIT_CODE_ERRNO_7;
|
||||||
|
}
|
||||||
|
|
||||||
|
int strLen = strlen(timeOff);
|
||||||
|
int fd = open(path, O_WRONLY);
|
||||||
|
if (ret == -1) {
|
||||||
|
return EXIT_CODE_ERRNO_8;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = write(fd, timeOff, strLen);
|
||||||
|
if (ret != strLen) {
|
||||||
|
close(fd);
|
||||||
|
return EXIT_CODE_ERRNO_9;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ItTimeContainer002(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int status;
|
||||||
|
char *containerType = "time";
|
||||||
|
char *containerType1 = "time_for_children";
|
||||||
|
|
||||||
|
char *stack = (char *)mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, CLONE_STACK_MMAP_FLAG, -1, 0);
|
||||||
|
ASSERT_NE(stack, nullptr);
|
||||||
|
char *stackTop = stack + STACK_SIZE;
|
||||||
|
|
||||||
|
ret = unshare(CLONE_NEWTIME);
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
ret = WriteProcTime(getpid());
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
auto linkBuffer = ReadlinkContainer(getpid(), containerType);
|
||||||
|
auto linkBuffer1 = ReadlinkContainer(getpid(), containerType1);
|
||||||
|
ret = linkBuffer.compare(linkBuffer1);
|
||||||
|
ASSERT_TRUE(ret != 0);
|
||||||
|
|
||||||
|
int arg = CHILD_FUNC_ARG;
|
||||||
|
auto pid = clone(childFunc, stackTop, CLONE_NEWTIME | SIGCHLD, &arg);
|
||||||
|
ASSERT_TRUE(pid != -1);
|
||||||
|
|
||||||
|
auto linkBuffer2 = ReadlinkContainer(pid, containerType);
|
||||||
|
ret = linkBuffer1.compare(linkBuffer2);
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
ret = waitpid(pid, &status, 0);
|
||||||
|
ASSERT_EQ(ret, pid);
|
||||||
|
|
||||||
|
ret = WIFEXITED(status);
|
||||||
|
ASSERT_TRUE(ret != 0);
|
||||||
|
|
||||||
|
int exitCode = WEXITSTATUS(status);
|
||||||
|
ASSERT_EQ(exitCode, 0);
|
||||||
|
}
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include "It_container_test.h"
|
||||||
|
|
||||||
|
static int childFunc(void *arg)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char *containerType = "time";
|
||||||
|
char *containerType1 = "time_for_children";
|
||||||
|
char pid_link[100]; /* 100: test len */
|
||||||
|
char targetpath[100]; /* 100: test len */
|
||||||
|
auto linkBuffer = ReadlinkContainer(getppid(), containerType);
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
ret = sprintf_s(pid_link, 100, "%s", linkBuffer.c_str()); /* 100: test len */
|
||||||
|
if (ret <= 0) {
|
||||||
|
return EXIT_CODE_ERRNO_4;
|
||||||
|
}
|
||||||
|
ret = sprintf_s(targetpath, 100, "/proc/%d/container/time", getppid()); /* 100: test len */
|
||||||
|
if (ret <= 0) {
|
||||||
|
return EXIT_CODE_ERRNO_5;
|
||||||
|
}
|
||||||
|
fd = open(targetpath, O_RDONLY | O_CLOEXEC);
|
||||||
|
if (fd == -1) {
|
||||||
|
return EXIT_CODE_ERRNO_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = setns(fd, CLONE_NEWTIME);
|
||||||
|
if (ret != 0) {
|
||||||
|
close(fd);
|
||||||
|
return EXIT_CODE_ERRNO_2;
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
auto linkBuffer1 = ReadlinkContainer(getpid(), containerType);
|
||||||
|
auto linkBuffer2 = ReadlinkContainer(getpid(), containerType1);
|
||||||
|
ret = linkBuffer1.compare(linkBuffer2);
|
||||||
|
EXPECT_EQ(ret, 0);
|
||||||
|
if (ret != 0) {
|
||||||
|
return EXIT_CODE_ERRNO_3;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ItTimeContainer003(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int status;
|
||||||
|
char *containerType = "time";
|
||||||
|
char *containerType1 = "time_for_children";
|
||||||
|
|
||||||
|
char *stack = (char *)mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, CLONE_STACK_MMAP_FLAG, -1, 0);
|
||||||
|
ASSERT_NE(stack, nullptr);
|
||||||
|
char *stackTop = stack + STACK_SIZE;
|
||||||
|
|
||||||
|
ret = unshare(CLONE_NEWTIME);
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
auto linkBuffer = ReadlinkContainer(getpid(), containerType1);
|
||||||
|
|
||||||
|
int arg = CHILD_FUNC_ARG;
|
||||||
|
auto pid = clone(childFunc, stackTop, CLONE_NEWTIME | SIGCHLD, &arg);
|
||||||
|
ASSERT_TRUE(pid != -1);
|
||||||
|
|
||||||
|
ret = waitpid(pid, &status, 0);
|
||||||
|
ASSERT_EQ(ret, pid);
|
||||||
|
|
||||||
|
ret = WIFEXITED(status);
|
||||||
|
ASSERT_TRUE(ret != 0);
|
||||||
|
|
||||||
|
int exitCode = WEXITSTATUS(status);
|
||||||
|
ASSERT_EQ(exitCode, 0);
|
||||||
|
}
|
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include "It_container_test.h"
|
||||||
|
|
||||||
|
const int STR_LEN = 50;
|
||||||
|
const int SEC = 172800;
|
||||||
|
const int NSEC = 800000000;
|
||||||
|
|
||||||
|
static int childFunc(void *arg)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
struct timespec tp = *((struct timespec *)arg);
|
||||||
|
struct timespec tp1;
|
||||||
|
|
||||||
|
ret = clock_gettime(CLOCK_MONOTONIC_RAW, &tp1);
|
||||||
|
if (ret != 0) {
|
||||||
|
return EXIT_CODE_ERRNO_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = ((tp1.tv_sec >= tp.tv_sec + SEC));
|
||||||
|
if (ret != 1) {
|
||||||
|
return EXIT_CODE_ERRNO_2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static int WriteProcTime(int pid)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char path[STR_LEN];
|
||||||
|
char timeOff[STR_LEN];
|
||||||
|
|
||||||
|
ret = sprintf_s(timeOff, STR_LEN, "monotonic %d %d", SEC, NSEC);
|
||||||
|
if (ret <= 0) {
|
||||||
|
return EXIT_CODE_ERRNO_5;
|
||||||
|
}
|
||||||
|
ret = sprintf_s(path, STR_LEN, "/proc/%d/time_offsets", pid);
|
||||||
|
if (ret <= 0) {
|
||||||
|
return EXIT_CODE_ERRNO_6;
|
||||||
|
}
|
||||||
|
int strLen = strlen(timeOff);
|
||||||
|
int fd = open(path, O_WRONLY);
|
||||||
|
if (fd == -1) {
|
||||||
|
return EXIT_CODE_ERRNO_3;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = write(fd, timeOff, strLen);
|
||||||
|
if (ret != strLen) {
|
||||||
|
close(fd);
|
||||||
|
return EXIT_CODE_ERRNO_4;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ItTimeContainer004(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int status;
|
||||||
|
struct timespec tp;
|
||||||
|
|
||||||
|
char *stack = (char *)mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, CLONE_STACK_MMAP_FLAG, -1, 0);
|
||||||
|
ASSERT_NE(stack, nullptr);
|
||||||
|
char *stackTop = stack + STACK_SIZE;
|
||||||
|
|
||||||
|
ret = unshare(CLONE_NEWTIME);
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
ret = WriteProcTime(getpid());
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
ret = clock_gettime(CLOCK_MONOTONIC_RAW, &tp);
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
auto pid = clone(childFunc, stackTop, CLONE_NEWTIME | SIGCHLD, &tp);
|
||||||
|
ASSERT_TRUE(pid != -1);
|
||||||
|
|
||||||
|
ret = waitpid(pid, &status, 0);
|
||||||
|
ASSERT_EQ(ret, pid);
|
||||||
|
|
||||||
|
ret = WIFEXITED(status);
|
||||||
|
ASSERT_NE(ret, 0);
|
||||||
|
|
||||||
|
int exitCode = WEXITSTATUS(status);
|
||||||
|
ASSERT_EQ(exitCode, 0);
|
||||||
|
}
|
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include "It_container_test.h"
|
||||||
|
|
||||||
|
const int STR_LEN = 50;
|
||||||
|
const int SEC = 172800;
|
||||||
|
const int NSEC = 800000000;
|
||||||
|
|
||||||
|
static int childFunc(void *arg)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
struct timespec tp = *((struct timespec *)arg);
|
||||||
|
struct timespec tp1 = {0};
|
||||||
|
|
||||||
|
ret = clock_gettime(CLOCK_MONOTONIC, &tp1);
|
||||||
|
if (ret != 0) {
|
||||||
|
return EXIT_CODE_ERRNO_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = ((tp1.tv_sec >= tp.tv_sec + SEC));
|
||||||
|
if (ret != 1) {
|
||||||
|
return EXIT_CODE_ERRNO_2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static int WriteProcTime(int pid)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char path[STR_LEN];
|
||||||
|
char timeOff[STR_LEN];
|
||||||
|
|
||||||
|
ret = sprintf_s(timeOff, STR_LEN, "monotonic %d %d", SEC, NSEC);
|
||||||
|
if (ret <= 0) {
|
||||||
|
return EXIT_CODE_ERRNO_5;
|
||||||
|
}
|
||||||
|
ret = sprintf_s(path, STR_LEN, "/proc/%d/time_offsets", pid);
|
||||||
|
if (ret <= 0) {
|
||||||
|
return EXIT_CODE_ERRNO_5;
|
||||||
|
}
|
||||||
|
int strLen = strlen(timeOff);
|
||||||
|
int fd = open(path, O_WRONLY);
|
||||||
|
if (fd == -1) {
|
||||||
|
return EXIT_CODE_ERRNO_3;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = write(fd, timeOff, strLen);
|
||||||
|
if (ret != strLen) {
|
||||||
|
close(fd);
|
||||||
|
return EXIT_CODE_ERRNO_4;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ItTimeContainer005(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int status;
|
||||||
|
struct timespec tp = {0};
|
||||||
|
|
||||||
|
char *stack = (char *)mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, CLONE_STACK_MMAP_FLAG, -1, 0);
|
||||||
|
ASSERT_NE(stack, nullptr);
|
||||||
|
char *stackTop = stack + STACK_SIZE;
|
||||||
|
|
||||||
|
ret = unshare(CLONE_NEWTIME);
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
ret = WriteProcTime(getpid());
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
ret = clock_gettime(CLOCK_MONOTONIC, &tp);
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
auto pid = clone(childFunc, stackTop, CLONE_NEWTIME | SIGCHLD, &tp);
|
||||||
|
ASSERT_TRUE(pid != -1);
|
||||||
|
|
||||||
|
ret = waitpid(pid, &status, 0);
|
||||||
|
ASSERT_EQ(ret, pid);
|
||||||
|
|
||||||
|
ret = WIFEXITED(status);
|
||||||
|
ASSERT_TRUE(ret != 0);
|
||||||
|
|
||||||
|
int exitCode = WEXITSTATUS(status);
|
||||||
|
ASSERT_EQ(exitCode, 0);
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include "It_container_test.h"
|
||||||
|
|
||||||
|
const int MAX_TIME_CONTAINER = 64;
|
||||||
|
const int STR_LEN = 100;
|
||||||
|
|
||||||
|
void ItTimeContainer006(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char *fileName = "/proc/sys/user/max_time_container";
|
||||||
|
FILE *fp = nullptr;
|
||||||
|
char strBuf[STR_LEN] = {0};
|
||||||
|
|
||||||
|
fp = fopen(fileName, "rb");
|
||||||
|
ASSERT_TRUE(fp != 0);
|
||||||
|
|
||||||
|
ret = fread(strBuf, 1, STR_LEN, fp);
|
||||||
|
ASSERT_TRUE(ret != -1);
|
||||||
|
|
||||||
|
ret = atoi(strBuf);
|
||||||
|
ASSERT_EQ(ret, MAX_TIME_CONTAINER);
|
||||||
|
|
||||||
|
(void)fclose(fp);
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include "It_container_test.h"
|
||||||
|
|
||||||
|
const int STR_LEN = 50;
|
||||||
|
const int SEC = 172800;
|
||||||
|
const int NSEC = 80000000;
|
||||||
|
|
||||||
|
static int WriteProcTime(int pid)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char path[STR_LEN] = {0};
|
||||||
|
char timeOff[STR_LEN] = {0};
|
||||||
|
|
||||||
|
ret = sprintf_s(timeOff, STR_LEN, "monotonic %d %d", SEC, NSEC);
|
||||||
|
if (ret < 0) {
|
||||||
|
return EXIT_CODE_ERRNO_3;
|
||||||
|
}
|
||||||
|
ret = sprintf_s(path, STR_LEN, "/proc/%d/time_offsets", pid);
|
||||||
|
if (ret < 0) {
|
||||||
|
return EXIT_CODE_ERRNO_4;
|
||||||
|
}
|
||||||
|
|
||||||
|
int strLen = strlen(timeOff);
|
||||||
|
int fd = open(path, O_WRONLY);
|
||||||
|
if (fd == -1) {
|
||||||
|
return EXIT_CODE_ERRNO_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = write(fd, timeOff, strLen);
|
||||||
|
if (ret != -1) {
|
||||||
|
close(fd);
|
||||||
|
return EXIT_CODE_ERRNO_2;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ItTimeContainer007(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = WriteProcTime(getpid());
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include "It_container_test.h"
|
||||||
|
|
||||||
|
const int STR_LEN = 50;
|
||||||
|
const int SEC = 172800;
|
||||||
|
const long long NSEC = 800000000000;
|
||||||
|
|
||||||
|
static int WriteProcTime(int pid)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char path[STR_LEN] = {0};
|
||||||
|
char timeOff[STR_LEN] = {0};
|
||||||
|
|
||||||
|
ret = sprintf_s(timeOff, STR_LEN, "monotonic %d %lld", SEC, NSEC);
|
||||||
|
if (ret < 0) {
|
||||||
|
return EXIT_CODE_ERRNO_3;
|
||||||
|
}
|
||||||
|
ret = sprintf_s(path, STR_LEN, "/proc/%d/time_offsets", pid);
|
||||||
|
if (ret < 0) {
|
||||||
|
return EXIT_CODE_ERRNO_3;
|
||||||
|
}
|
||||||
|
int strLen = strlen(timeOff);
|
||||||
|
int fd = open(path, O_WRONLY);
|
||||||
|
if (fd == -1) {
|
||||||
|
return EXIT_CODE_ERRNO_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = write(fd, timeOff, strLen);
|
||||||
|
if (ret != -1) {
|
||||||
|
close(fd);
|
||||||
|
return EXIT_CODE_ERRNO_2;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ItTimeContainer008(void)
|
||||||
|
{
|
||||||
|
int ret = unshare(CLONE_NEWTIME);
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
ret = WriteProcTime(getpid());
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include "It_container_test.h"
|
||||||
|
|
||||||
|
static std::string GenTimeLinkPath(int pid)
|
||||||
|
{
|
||||||
|
std::ostringstream buf;
|
||||||
|
buf << "/proc/" << pid << "/container/time";
|
||||||
|
return buf.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string ReadlinkTime(int pid)
|
||||||
|
{
|
||||||
|
auto path = GenTimeLinkPath(pid);
|
||||||
|
struct stat sb;
|
||||||
|
|
||||||
|
int ret = lstat(path.data(), &sb);
|
||||||
|
if (ret == -1) {
|
||||||
|
perror("lstat");
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto bufsiz = sb.st_size + 1;
|
||||||
|
if (sb.st_size == 0) {
|
||||||
|
bufsiz = PATH_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<char> buf(bufsiz);
|
||||||
|
auto nbytes = readlink(path.c_str(), buf.data(), bufsiz);
|
||||||
|
if (nbytes == -1) {
|
||||||
|
perror("readlink");
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf.data();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ItTimeContainer009(void)
|
||||||
|
{
|
||||||
|
auto timelink = ReadlinkTime(getpid());
|
||||||
|
std::cout << "Contents of the time link is: " << timelink << std::endl;
|
||||||
|
|
||||||
|
std::regex reg("'time:\\[[0-9]+\\]'");
|
||||||
|
bool ret = std::regex_match(timelink, reg);
|
||||||
|
ASSERT_TRUE(ret);
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include "It_container_test.h"
|
||||||
|
|
||||||
|
static int childFunc(void *arg)
|
||||||
|
{
|
||||||
|
int value = *((int*)arg);
|
||||||
|
if (value != CHILD_FUNC_ARG) {
|
||||||
|
return EXIT_CODE_ERRNO_1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ItTimeContainer010(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int status;
|
||||||
|
char *containerType = "time";
|
||||||
|
char *containerType1 = "time_for_children";
|
||||||
|
|
||||||
|
char *stack = (char *)mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, CLONE_STACK_MMAP_FLAG, -1, 0);
|
||||||
|
ASSERT_NE(stack, nullptr);
|
||||||
|
char *stackTop = stack + STACK_SIZE;
|
||||||
|
std::cout << getpid() << std::endl;
|
||||||
|
auto linkBuffer = ReadlinkContainer(getpid(), containerType);
|
||||||
|
auto linkBuffer1 = ReadlinkContainer(getpid(), containerType1);
|
||||||
|
ret = linkBuffer.compare(linkBuffer1);
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
|
||||||
|
int arg = CHILD_FUNC_ARG;
|
||||||
|
auto pid = clone(childFunc, stackTop, CLONE_NEWTIME | SIGCHLD, &arg);
|
||||||
|
ASSERT_TRUE(pid != -1);
|
||||||
|
|
||||||
|
ret = waitpid(pid, &status, 0);
|
||||||
|
ASSERT_EQ(ret, pid);
|
||||||
|
|
||||||
|
ret = WIFEXITED(status);
|
||||||
|
ASSERT_NE(ret, 0);
|
||||||
|
|
||||||
|
int exitCode = WEXITSTATUS(status);
|
||||||
|
ASSERT_EQ(exitCode, 0);
|
||||||
|
|
||||||
|
auto linkBuffer2 = ReadlinkContainer(getpid(), containerType);
|
||||||
|
ret = linkBuffer.compare(linkBuffer2);
|
||||||
|
ASSERT_EQ(ret, 0);
|
||||||
|
}
|
|
@ -54,5 +54,12 @@ extern void ItProcessFs012(void);
|
||||||
extern void ItProcessFs013(void);
|
extern void ItProcessFs013(void);
|
||||||
extern void ItProcessFs014(void);
|
extern void ItProcessFs014(void);
|
||||||
extern void ItProcessFs015(void);
|
extern void ItProcessFs015(void);
|
||||||
|
extern void ItProcessFs015(void);
|
||||||
|
extern void ItProcessFs016(void);
|
||||||
|
extern void ItProcessFs017(void);
|
||||||
|
extern void ItProcessFs018(void);
|
||||||
|
extern void ItProcessFs019(void);
|
||||||
|
extern void ItProcessFs020(void);
|
||||||
extern void ItProcessFs021(void);
|
extern void ItProcessFs021(void);
|
||||||
|
extern void ItProcessFs022(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -61,7 +61,13 @@ process_fs_sources_smoke = [
|
||||||
"$TEST_UNITTEST_DIR/process/fs/smoke/It_process_fs_013.cpp",
|
"$TEST_UNITTEST_DIR/process/fs/smoke/It_process_fs_013.cpp",
|
||||||
"$TEST_UNITTEST_DIR/process/fs/smoke/It_process_fs_014.cpp",
|
"$TEST_UNITTEST_DIR/process/fs/smoke/It_process_fs_014.cpp",
|
||||||
"$TEST_UNITTEST_DIR/process/fs/smoke/It_process_fs_015.cpp",
|
"$TEST_UNITTEST_DIR/process/fs/smoke/It_process_fs_015.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/process/fs/smoke/It_process_fs_016.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/process/fs/smoke/It_process_fs_017.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/process/fs/smoke/It_process_fs_018.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/process/fs/smoke/It_process_fs_019.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/process/fs/smoke/It_process_fs_020.cpp",
|
||||||
"$TEST_UNITTEST_DIR/process/fs/smoke/It_process_fs_021.cpp",
|
"$TEST_UNITTEST_DIR/process/fs/smoke/It_process_fs_021.cpp",
|
||||||
|
"$TEST_UNITTEST_DIR/process/fs/smoke/It_process_fs_022.cpp",
|
||||||
]
|
]
|
||||||
|
|
||||||
process_fs_sources_full = []
|
process_fs_sources_full = []
|
||||||
|
|
|
@ -36,7 +36,7 @@ VOID PrintTest(const CHAR *fmt, ...)
|
||||||
{
|
{
|
||||||
#ifdef PRINT_TEST
|
#ifdef PRINT_TEST
|
||||||
va_list ap;
|
va_list ap;
|
||||||
if (g_osLkHook != NULL) {
|
if (g_osLkHook != nullptr) {
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
printf(fmt, ap);
|
printf(fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
@ -224,5 +224,17 @@ HWTEST_F(ProcessFsTest, ItProcessFs021, TestSize.Level0)
|
||||||
{
|
{
|
||||||
ItProcessFs021();
|
ItProcessFs021();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @tc.name: Process_fs_Test_022
|
||||||
|
* @tc.desc: Process mount directory test
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: issueI6B0A3
|
||||||
|
* @tc.author:
|
||||||
|
*/
|
||||||
|
HWTEST_F(ProcessFsTest, ItProcessFs022, TestSize.Level0)
|
||||||
|
{
|
||||||
|
ItProcessFs022();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,8 +46,6 @@ static int childFunc(void *arg)
|
||||||
|
|
||||||
void ItProcessFs016(void)
|
void ItProcessFs016(void)
|
||||||
{
|
{
|
||||||
const int CONFIG_FILE_LEN = 1024;
|
|
||||||
char szFile[CONFIG_FILE_LEN] = {0};
|
|
||||||
std::string path = "/proc/sys/user/max_uts_container";
|
std::string path = "/proc/sys/user/max_uts_container";
|
||||||
int fd = open(path.c_str(), O_WRONLY);
|
int fd = open(path.c_str(), O_WRONLY);
|
||||||
ASSERT_NE(fd, -1);
|
ASSERT_NE(fd, -1);
|
||||||
|
@ -59,9 +57,9 @@ void ItProcessFs016(void)
|
||||||
|
|
||||||
int arg = CHILD_FUNC_ARG;
|
int arg = CHILD_FUNC_ARG;
|
||||||
|
|
||||||
char *stack = (char *)mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK,
|
char *stack = (char *)mmap(nullptr, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK,
|
||||||
-1, 0);
|
-1, 0);
|
||||||
ASSERT_NE(stack, NULL);
|
ASSERT_NE(stack, nullptr);
|
||||||
char *stackTop = stack + STACK_SIZE;
|
char *stackTop = stack + STACK_SIZE;
|
||||||
|
|
||||||
auto pid = clone(childFunc, stackTop, CLONE_NEWUTS, &arg);
|
auto pid = clone(childFunc, stackTop, CLONE_NEWUTS, &arg);
|
||||||
|
|
|
@ -46,8 +46,6 @@ static int childFunc(void *arg)
|
||||||
|
|
||||||
void ItProcessFs017(void)
|
void ItProcessFs017(void)
|
||||||
{
|
{
|
||||||
const int CONFIG_FILE_LEN = 1024;
|
|
||||||
char szFile[CONFIG_FILE_LEN] = {0};
|
|
||||||
std::string path = "/proc/sys/user/max_user_container";
|
std::string path = "/proc/sys/user/max_user_container";
|
||||||
int fd = open(path.c_str(), O_WRONLY);
|
int fd = open(path.c_str(), O_WRONLY);
|
||||||
ASSERT_NE(fd, -1);
|
ASSERT_NE(fd, -1);
|
||||||
|
@ -60,9 +58,9 @@ void ItProcessFs017(void)
|
||||||
|
|
||||||
int arg = CHILD_FUNC_ARG;
|
int arg = CHILD_FUNC_ARG;
|
||||||
|
|
||||||
char *stack = (char *)mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK,
|
char *stack = (char *)mmap(nullptr, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK,
|
||||||
-1, 0);
|
-1, 0);
|
||||||
ASSERT_NE(stack, NULL);
|
ASSERT_NE(stack, nullptr);
|
||||||
char *stackTop = stack + STACK_SIZE;
|
char *stackTop = stack + STACK_SIZE;
|
||||||
|
|
||||||
auto pid = clone(childFunc, stackTop, CLONE_NEWUSER, &arg);
|
auto pid = clone(childFunc, stackTop, CLONE_NEWUSER, &arg);
|
||||||
|
|
|
@ -46,8 +46,6 @@ static int childFunc(void *arg)
|
||||||
|
|
||||||
void ItProcessFs018(void)
|
void ItProcessFs018(void)
|
||||||
{
|
{
|
||||||
const int CONFIG_FILE_LEN = 1024;
|
|
||||||
char szFile[CONFIG_FILE_LEN] = {0};
|
|
||||||
std::string path = "/proc/sys/user/max_mnt_container";
|
std::string path = "/proc/sys/user/max_mnt_container";
|
||||||
int fd = open(path.c_str(), O_WRONLY);
|
int fd = open(path.c_str(), O_WRONLY);
|
||||||
ASSERT_NE(fd, -1);
|
ASSERT_NE(fd, -1);
|
||||||
|
@ -60,9 +58,9 @@ void ItProcessFs018(void)
|
||||||
|
|
||||||
int arg = CHILD_FUNC_ARG;
|
int arg = CHILD_FUNC_ARG;
|
||||||
|
|
||||||
char *stack = (char *)mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK,
|
char *stack = (char *)mmap(nullptr, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK,
|
||||||
-1, 0);
|
-1, 0);
|
||||||
ASSERT_NE(stack, NULL);
|
ASSERT_NE(stack, nullptr);
|
||||||
char *stackTop = stack + STACK_SIZE;
|
char *stackTop = stack + STACK_SIZE;
|
||||||
|
|
||||||
auto pid = clone(childFunc, stackTop, CLONE_NEWNS, &arg);
|
auto pid = clone(childFunc, stackTop, CLONE_NEWNS, &arg);
|
||||||
|
|
|
@ -46,8 +46,6 @@ static int childFunc(void *arg)
|
||||||
|
|
||||||
void ItProcessFs019(void)
|
void ItProcessFs019(void)
|
||||||
{
|
{
|
||||||
const int CONFIG_FILE_LEN = 1024;
|
|
||||||
char szFile[CONFIG_FILE_LEN] = {0};
|
|
||||||
std::string path = "/proc/sys/user/max_pid_container";
|
std::string path = "/proc/sys/user/max_pid_container";
|
||||||
int fd = open(path.c_str(), O_WRONLY);
|
int fd = open(path.c_str(), O_WRONLY);
|
||||||
ASSERT_NE(fd, -1);
|
ASSERT_NE(fd, -1);
|
||||||
|
@ -60,9 +58,9 @@ void ItProcessFs019(void)
|
||||||
|
|
||||||
int arg = CHILD_FUNC_ARG;
|
int arg = CHILD_FUNC_ARG;
|
||||||
|
|
||||||
char *stack = (char *)mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK,
|
char *stack = (char *)mmap(nullptr, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK,
|
||||||
-1, 0);
|
-1, 0);
|
||||||
ASSERT_NE(stack, NULL);
|
ASSERT_NE(stack, nullptr);
|
||||||
char *stackTop = stack + STACK_SIZE;
|
char *stackTop = stack + STACK_SIZE;
|
||||||
|
|
||||||
auto pid = clone(childFunc, stackTop, CLONE_NEWPID, &arg);
|
auto pid = clone(childFunc, stackTop, CLONE_NEWPID, &arg);
|
||||||
|
|
|
@ -46,23 +46,21 @@ static int childFunc(void *arg)
|
||||||
|
|
||||||
void ItProcessFs020(void)
|
void ItProcessFs020(void)
|
||||||
{
|
{
|
||||||
const int CONFIG_FILE_LEN = 1024;
|
|
||||||
char szFile[CONFIG_FILE_LEN] = {0};
|
|
||||||
std::string path = "/proc/sys/user/max_net_container";
|
std::string path = "/proc/sys/user/max_net_container";
|
||||||
int fd = open(path.c_str(), O_WRONLY);
|
int fd = open(path.c_str(), O_WRONLY);
|
||||||
ASSERT_NE(fd, -1);
|
ASSERT_NE(fd, -1);
|
||||||
|
|
||||||
char buf[configLen];
|
char buf[configLen];
|
||||||
size_t ret = sprintf(buf, configLen, "%d", invalidNum);
|
size_t ret = sprintf_s(buf, configLen, "%d", invalidNum);
|
||||||
ASSERT_GT(ret, 0);
|
ASSERT_GT(ret, 0);
|
||||||
ret = write(fd, buf, (strlen(buf) + 1));
|
ret = write(fd, buf, (strlen(buf) + 1));
|
||||||
ASSERT_NE(ret, -1);
|
ASSERT_NE(ret, -1);
|
||||||
|
|
||||||
int arg = CHILD_FUNC_ARG;
|
int arg = CHILD_FUNC_ARG;
|
||||||
|
|
||||||
char *stack = (char *)mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK,
|
char *stack = (char *)mmap(nullptr, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK,
|
||||||
-1, 0);
|
-1, 0);
|
||||||
ASSERT_NE(stack, NULL);
|
ASSERT_NE(stack, nullptr);
|
||||||
char *stackTop = stack + STACK_SIZE;
|
char *stackTop = stack + STACK_SIZE;
|
||||||
|
|
||||||
auto pid = clone(childFunc, stackTop, CLONE_NEWNET, &arg);
|
auto pid = clone(childFunc, stackTop, CLONE_NEWNET, &arg);
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
* conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include <sched.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <climits>
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <regex>
|
||||||
|
#include "It_process_fs_test.h"
|
||||||
|
|
||||||
|
void ItProcessFs022(void)
|
||||||
|
{
|
||||||
|
auto path = GenProcPidContainerPath(getpid(), "time");
|
||||||
|
std::vector<char> buf(PATH_MAX);
|
||||||
|
auto nbytes = readlink(path.c_str(), buf.data(), PATH_MAX);
|
||||||
|
ASSERT_NE(nbytes, -1);
|
||||||
|
|
||||||
|
std::regex reg("'time:\\[[0-9]+\\]'");
|
||||||
|
bool ret = std::regex_match(buf.data(), reg);
|
||||||
|
ASSERT_EQ(ret, true);
|
||||||
|
}
|
Loading…
Reference in New Issue