summaryrefslogtreecommitdiff
path: root/src/license-manager/agent/main.cpp
blob: f7a687b97a19a7686b5f874da9e4d25688122146 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
 * Copyright (c) 2017-2020 Samsung Electronics Co., Ltd. All rights reserved.
 *
 * This file is licensed under the terms of MIT License or the Apache License
 * Version 2.0 of your choice. See the LICENSE.MIT file for MIT license details.
 * See the LICENSE file or the notice below for Apache License Version 2.0
 * details.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file        src/license-manager/agent/main.cpp
 * @author      Bartlomiej Grzelewski <b.grzelewski@samsung.com>
 * @brief       Main function of license manager agent
 */

#include <csignal>
#include <cstdlib>
#include <cstring>
#include <exception>

#include <systemd/sd-daemon.h>
#include <openssl/evp.h>
#include <openssl/ssl.h>
#include <openssl/conf.h>
#include <openssl/err.h>

#include <alog.h>
#include <agent_logic.h>
#include <agent.h>

static LicenseManager::Agent *s_agentPtr = nullptr;

void kill_handler(int sig UNUSED) {
    ALOGD("License manager service is going down now");
    if (s_agentPtr)
        s_agentPtr->exitLoop();
}

int main(int, char **) {
    init_agent_log();

    int ret;
    struct sigaction act;

    memset(&act, 0, sizeof(act));
    act.sa_handler = &kill_handler;
    if ((ret = sigaction(SIGTERM, &act, NULL)) < 0) {
        ALOGE("sigaction failed [<<" << ret << "]");
        return EXIT_FAILURE;
    }

    OpenSSL_add_all_algorithms();
    SSL_library_init();
    OPENSSL_config(NULL);
    SSL_load_error_strings();

    try {

        LicenseManager::AgentLogic *logic = new LicenseManager::AgentLogic;
        LicenseManager::Agent agent;
        if (!agent.initialize(logic)) {
            ALOGE("cynara initialization failed");
            return -1;
        }
        s_agentPtr = &agent;
        ret = sd_notify(0, "READY=1");
        if (ret == 0) {
            ALOGW("Agent was not configured to notify its status");
        } else if (ret < 0) {
            ALOGE("sd_notify failed: [" << ret << "]");
        }
        agent.mainLoop();
        s_agentPtr = nullptr;
    } catch (const std::exception &e) {
        s_agentPtr = nullptr;
        std::string error = e.what();
        ALOGE("Exception: %s", error.c_str());
    }

    CONF_modules_free();
    EVP_cleanup();
    ERR_free_strings();
    CRYPTO_cleanup_all_ex_data();

    return 0;
}