예제 #1
0
파일: main.cpp 프로젝트: eayong/proxy
int main(int argc, char **argv)
{
    const char* short_options = "b:a:p:k:c:f:s:u:hd";
    struct option long_options[] = {
        { "bind",   1,  NULL,   'b' },
        { "addr",   1,  NULL,   'a' },
        { "port",   1,  NULL,   'p' },
        { "key",    1,  NULL,   'k' },
        { "cert",   1,  NULL,   'c' },
        { "file",   1,  NULL,   'f' },
        { "daemon", 0,  NULL,   'd' },
        { "server", 0,  NULL,   's' },
        { "ue",     0,  NULL,   'u' },
        { "help",   0,  NULL,   'h' },
        { 0, 0, 0, 0},
    };

    int c;
    while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1)
    {
        switch (c)
        {
        case 'b':
            g_bind_port = strtoul(optarg, NULL, 0);
            break;
        case 'a':
            g_proxy_host = optarg;
            break;
        case 'p':
            g_proxy_port = strtoul(optarg, NULL, 0);
            break;
        case 'k':
            g_key_path.assign(optarg);
            break;
        case 'c':
            g_cert_path.assign(optarg);
            break;
        case 'f':
            g_data_file.assign(optarg);
            break;
        case 's':
            g_replaceServ.assign(optarg);
            break;
        case 'u':
            g_replaceUE.assign(optarg);
            break;
        case 'd':
            g_daemon = true;
            break;
        case 'h':
            usage();
            return 0;
        default:
            printf("unkown type %c\n", c);
            break;
        }
    }

    if (g_daemon && Daemon() < 0)
    {
        return -1;
    }

    BugReportRegister(argv[0], ".", NULL, NULL);
    SetSignal();

    g_logFp = fopen(LOG_FILE, "w");
    if (g_logFp == NULL)
    {
        printf("can't open log file %s\n", LOG_FILE);
        return -1;
    }

    if (g_key_path.empty())
        g_key_path = g_cert_path;

    if (!g_data_file.empty())
    {
        g_dataFp = fopen(g_data_file.c_str(), "w");
        if (g_dataFp == NULL)
        {
            PrintLog(g_logFp, "can't open log file %s\n", g_data_file.c_str());
            fclose(g_logFp);
            return -1;
        }
    }

    PrintLog(g_logFp, "proxy is run...\n");
    
    Proxy proxy;
    proxy.Run(g_bind_port);

    if (g_dataFp)
    {
        fclose(g_dataFp);
        g_dataFp = NULL;
    }

    PrintLog(g_logFp, "proxy is exit...\n");

    if (g_logFp)
    {
        fclose(g_logFp);
        g_logFp = NULL;
    }
    
    return 0;
}