Grooooot ea866b2786 sync from openeuler 3.7
Signed-off-by: Grooooot <isula@huawei.com>
2020-03-07 11:04:55 +08:00

163 lines
4.0 KiB
C

/******************************************************************************
* Copyright (c) Huawei Technologies Co., Ltd. 2020. All rights reserved.
* iSulad licensed under the Mulan PSL v1.
* You can use this software according to the terms and conditions of the Mulan PSL v1.
* You may obtain a copy of Mulan PSL v1 at:
* http://license.coscl.org.cn/MulanPSL
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v1 for more details.
* Author: leizhongkai
* Create: 2020-1-20
* Description: main process of isulad-shim
******************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <limits.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/prctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "common.h"
#include "process.h"
int g_log_fd = -1;
void signal_routine(int sig)
{
switch (sig) {
case SIGALRM:
write_message(g_log_fd, ERR_MSG, "runtime timeout");
exit(EXIT_FAILURE);
default:
break;
}
}
static void set_timeout_exit(unsigned int timeout)
{
signal(SIGALRM, signal_routine);
(void)alarm(timeout);
}
static void released_timeout_exit()
{
(void)alarm(0);
signal(SIGALRM, SIG_IGN);
}
static int set_subreaper()
{
int ret = SHIM_ERR;
ret = prctl(PR_SET_CHILD_SUBREAPER, 1);
if (ret != SHIM_OK) {
return SHIM_SYS_ERR(errno);
}
return SHIM_OK;
}
static int parse_args(int argc, char **argv, char **cid, char **bundle, char **rt_name, char **log_level)
{
if (argc < 4) {
return SHIM_ERR;
}
*cid = strdup(argv[1]);
*bundle = strdup(argv[2]);
*rt_name = strdup(argv[3]);
if (*cid == NULL || *bundle == NULL || rt_name == NULL) {
return SHIM_ERR;
}
if (argc > 4) {
*log_level = strdup(argv[4]);
if (*log_level == NULL) {
return SHIM_ERR;
}
}
return SHIM_OK;
}
int main(int argc, char **argv)
{
char *container_id = NULL;
char *bundle = NULL;
char *rt_name = NULL;
char *log_level = NULL;
int ret = SHIM_ERR;
int efd = -1;
process_t *p = NULL;
g_log_fd = open_no_inherit(SHIM_LOG_NAME, O_CREAT | O_WRONLY | O_APPEND | O_SYNC, 0640);
if (g_log_fd < 0) {
_exit(EXIT_FAILURE);
}
set_timeout_exit(DEFAULT_TIMEOUT);
ret = set_subreaper();
if (ret != SHIM_OK) {
write_message(g_log_fd, ERR_MSG, "set subreaper failed:%d", ret);
exit(EXIT_FAILURE);
}
ret = parse_args(argc, argv, &container_id, &bundle, &rt_name, &log_level);
if (ret != SHIM_OK) {
write_message(g_log_fd, ERR_MSG, "parse args failed:%d", ret);
exit(EXIT_FAILURE);
}
p = new_process(container_id, bundle, rt_name);
if (p == NULL) {
write_message(g_log_fd, ERR_MSG, "new process failed");
exit(EXIT_FAILURE);
}
// open exit pipe
if (!p->state->exec) {
if (p->state->exit_fifo != NULL) {
efd = open_no_inherit("exit_fifo", O_WRONLY, -1);
if (efd < 0) {
write_message(g_log_fd, ERR_MSG, "open exit pipe failed:%d", SHIM_SYS_ERR(errno));
exit(EXIT_FAILURE);
}
p->exit_fd = efd;
}
}
// create main loop and start epoll
ret = process_io_init(p);
if (ret != SHIM_OK) {
write_message(g_log_fd, ERR_MSG, "process io init failed:%d", ret);
exit(EXIT_FAILURE);
}
ret = open_io(p);
if (ret != SHIM_OK) {
exit(EXIT_FAILURE);
}
ret = create_process(p);
if (ret != SHIM_OK) {
exit(EXIT_FAILURE);
}
released_timeout_exit();
ret = process_signal_handle_routine(p);
if (ret != SHIM_OK) {
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}