Ejemplo n.º 1
0
Archivo: s2.cpp Proyecto: dCache/s2
/********************************************************************
 * Parse command-line options
 ********************************************************************/
static int
parse_cmd_opts(int argc, char **argv)
{
  int i;

  if(argv == NULL) {
    /* internal error */
    DM_ERR_ASSERT("argv == NULL\n");
    return 0;
  }

  for (i = 1; i < argc; i++)
  {
    char *opt = argv[i];
    int ret_val;

    if((ret_val = parse_cmd_opt(opt, FALSE)) == -1)
      /* non -+ option */
      break;
    else if(ret_val == 1) {
      /* option not found */
      DM_ERR(ERR_ERR, _("unknown option %s\n"), opt);
      exit(usage(ERR_ERR));
    }
  }

  return i;
}
Ejemplo n.º 2
0
int32_t main(int32_t argc, char** argv) {
    // init common parameters
    int32_t i, j, k;

    // TODO parse command line options
    int32_t parse_cmd_opt_res = parse_cmd_opt(argc, argv);
    CHECK_RES(parse_cmd_opt_res, FATAL, true, -1,
            "parse_cmd_opt failed, res=[%d]", parse_cmd_opt_res);

    // TODO init encryption/decryption method
    cryption_t* crpt = init_cryption(g_conf.cryption_method);
    CHECK_RES(crpt == NULL, FATAL, true, -2,
            "init_cryption failed, res=[%d]", init_cryption_res);

    // prepare to fork children
    g_pids = (pid_t*)malloc(g_conf.worker_num * sizeof(pid_t));
    CHECK_RES((g_pids == NULL), FATAL, true, -3,
            "malloc for g_pids failed");
    for (i = 0; i < worker_num; ++i) {
        g_pids[i] = -1;
    }

    parent_pid = getpid();
    cur_pid    = getpid();

    loop = uv_default_loop();

    uv_tcp_t server;
    uv_tcp_init(loop, &server);

    struct sockaddr_in addr;
    uv_ip4_addr(g_conf.listen_host, g_conf.listen_port, &addr);
    uv_tcp_bind(&server, (const struct sockaddr*)&addr, 0);

    int32_t uv_listen_res = uv_listen(
        (uv_stream_t*)&server, 
        g_conf.max_connection_num,
        on_new_downstream_connection
    );

    //TODO(xuruiqi) write spawn_workers
    int32_t spawn_workers_res = spawn_workers(g_conf.worker_num);
    CHECK_RES(spawn_workers_res, FATAL, true, -4,
            "spawn_workers failed, res=[%d]", spawn_workers_res);
    if (cur_pid == parent_pid) {
        // close master's listening event
        uv_close((uv_handle_t*)&server, NULL);

        int32_t join_res = 0;
        for (i = 0; i < g_conf.worker_num; ++i) {
            if (g_pids[i] <= 0) {
                continue;
            }
            join_res = waitpid(g_pids[i], NULL, 0);
            if (join_res == -1) {
                LOG_ERROR("Wait for pid %d failed\n", g_pids[i]);
            } else {
                LOG_INFO("Child process %d finished\n", g_pids[i]);
            }
        }
    } else {
        return uv_run(loop, UV_RUN_DEFAULT);
    }
    
    return 0;
}