static int bz_autotools__stage(void *user_data) { struct bz_env *env = user_data; const char *package_name; struct cork_path *build_dir; struct cork_path *staging_dir; bool verbose; struct cork_env *exec_env; struct cork_exec *exec; rii_check(bz_stage_message(env, "autotools")); rip_check(package_name = bz_env_get_string(env, "name", true)); clog_info("(%s) Stage using autotools", package_name); rip_check(build_dir = bz_env_get_path(env, "build_dir", true)); rip_check(staging_dir = bz_env_get_path(env, "staging_dir", true)); rie_check(verbose = bz_env_get_bool(env, "verbose", true)); /* Create the staging path */ rii_check(bz_create_directory(cork_path_get(staging_dir), 0750)); /* $ make install */ exec = cork_exec_new("make"); cork_exec_add_param(exec, "make"); cork_exec_add_param(exec, "install"); cork_exec_set_cwd(exec, cork_path_get(build_dir)); exec_env = cork_env_clone_current(); cork_env_add(exec_env, "DESTDIR", cork_path_get(staging_dir)); cork_exec_set_env(exec, exec_env); return bz_subprocess_run_exec(verbose, NULL, exec); }
static int bz_autotools__test(void *user_data) { struct bz_env *env = user_data; const char *package_name; struct cork_path *build_dir; bool verbose; struct cork_exec *exec; rii_check(bz_test_message(env, "autotools")); /* $ make check */ rip_check(package_name = bz_env_get_string(env, "name", true)); clog_info("(%s) Test using autotools", package_name); rip_check(build_dir = bz_env_get_path(env, "build_dir", true)); rie_check(verbose = bz_env_get_bool(env, "verbose", true)); exec = cork_exec_new("make"); cork_exec_add_param(exec, "make"); cork_exec_add_param(exec, "check"); cork_exec_set_cwd(exec, cork_path_get(build_dir)); return bz_subprocess_run_exec(verbose, NULL, exec); }
/* * For obfsproxy, we use standalone mode for now. * Managed mode needs to use SOCKS5 proxy as forwarder, which is not supported * yet. * * The idea of using standalone mode is quite simple, just assemble the * internal port into obfsproxy parameters. * * Using manually ran scramblesuit as an example: * obfsproxy \ * --data-dir /tmp/ss_libev_plugin_with_suffix \ * scramblesuit \ * --password SOMEMEANINGLESSPASSWORDASEXAMPLE \ * --dest some.server.org:12345 \ * client \ * 127.0.0.1:54321 * * In above case, @plugin = "obfsproxy", * @plugin_opts = "scramblesuit --password SOMEMEANINGLESSPASSWORDASEXAMPLE" * For obfs3, it's even easier, just pass @plugin = "obfsproxy" * @plugin_opts = "obfs3" * * And the rest parameters are all assembled here. * Some old obfsproxy will not be supported as it doesn't even support * "--data-dir" option */ static int start_obfsproxy(const char *plugin, const char *plugin_opts, const char *remote_host, const char *remote_port, const char *local_host, const char *local_port, enum plugin_mode mode) { char *pch; char *opts_dump = NULL; char *buf = NULL; int ret, buf_size = 0; if (plugin_opts != NULL) { opts_dump = strndup(plugin_opts, OBFSPROXY_OPTS_MAX); if (!opts_dump) { ERROR("start_obfsproxy strndup failed"); if (env != NULL) { cork_env_free(env); } return -ENOMEM; } } exec = cork_exec_new(plugin); /* The first parameter will be skipped, so pass @plugin again */ cork_exec_add_param(exec, plugin); cork_exec_add_param(exec, "--data-dir"); buf_size = 20 + strlen(plugin) + strlen(remote_host) + strlen(remote_port) + strlen(local_host) + strlen(local_port); buf = ss_malloc(buf_size); snprintf(buf, buf_size, TEMPDIR "%s_%s:%s_%s:%s", plugin, remote_host, remote_port, local_host, local_port); cork_exec_add_param(exec, buf); /* * Iterate @plugin_opts by space */ if (opts_dump != NULL) { pch = strtok(opts_dump, " "); while (pch) { cork_exec_add_param(exec, pch); pch = strtok(NULL, " "); } } /* The rest options */ if (mode == MODE_CLIENT) { /* Client mode */ cork_exec_add_param(exec, "--dest"); snprintf(buf, buf_size, "%s:%s", remote_host, remote_port); cork_exec_add_param(exec, buf); cork_exec_add_param(exec, "client"); snprintf(buf, buf_size, "%s:%s", local_host, local_port); cork_exec_add_param(exec, buf); } else { /* Server mode */ cork_exec_add_param(exec, "--dest"); snprintf(buf, buf_size, "%s:%s", local_host, local_port); cork_exec_add_param(exec, buf); cork_exec_add_param(exec, "server"); snprintf(buf, buf_size, "%s:%s", remote_host, remote_port); cork_exec_add_param(exec, buf); } cork_exec_set_env(exec, env); sub = cork_subprocess_new_exec(exec, NULL, NULL, &exit_code); #ifdef __MINGW32__ cork_subprocess_set_control(sub, sub_control_port); #endif ret = cork_subprocess_start(sub); ss_free(opts_dump); free(buf); return ret; }
static int bz_autotools__build(void *user_data) { struct bz_env *env = user_data; struct bz_value *ctx = bz_env_as_value(env); const char *package_name; struct cork_path *build_dir; struct cork_path *source_dir; struct cork_path *configure; struct bz_value *configure_args; const char *pkgconfig_path; bool exists; bool verbose; struct cork_exec *exec; struct cork_env *exec_env; struct cork_buffer buf = CORK_BUFFER_INIT(); rii_check(bz_install_dependency_string("autoconf", ctx)); rii_check(bz_install_dependency_string("automake", ctx)); rii_check(bz_build_message(env, "autotools")); rip_check(package_name = bz_env_get_string(env, "name", true)); rip_check(build_dir = bz_env_get_path(env, "build_dir", true)); rip_check(source_dir = bz_env_get_path(env, "source_dir", true)); rip_check(configure = bz_env_get_path(env, "autotools.configure.configure", true)); rie_check(pkgconfig_path = bz_env_get_string(env, "pkgconfig.path", false)); rie_check(verbose = bz_env_get_bool(env, "verbose", true)); /* Create the build path */ rii_check(bz_create_directory(cork_path_get(build_dir), 0750)); clog_info("(%s) Configure using autotools", package_name); /* $ autoreconf -i */ rii_check(bz_file_exists(cork_path_get(configure), &exists)); if (!exists) { exec = cork_exec_new("autoreconf"); cork_exec_add_param(exec, "autoreconf"); cork_exec_add_param(exec, "-i"); cork_exec_set_cwd(exec, cork_path_get(source_dir)); ei_check(bz_subprocess_run_exec(verbose, NULL, exec)); } #define add_dir(buzzy_name, param_name) \ do { \ struct cork_path *value; \ ep_check(value = bz_env_get_path(env, buzzy_name, true)); \ cork_buffer_printf(&buf, "--" param_name "=%s", cork_path_get(value)); \ cork_exec_add_param(exec, buf.buf); \ } while (0) /* $ ./configure ... */ exec = cork_exec_new(cork_path_get(configure)); exec_env = cork_env_clone_current(); cork_exec_set_env(exec, exec_env); cork_exec_add_param(exec, cork_path_get(configure)); add_dir("prefix", "prefix"); add_dir("exec_prefix", "exec-prefix"); add_dir("bin_dir", "bindir"); add_dir("sbin_dir", "sbindir"); add_dir("lib_dir", "libdir"); add_dir("libexec_dir", "libexecdir"); add_dir("share_dir", "datadir"); add_dir("man_dir", "mandir"); /* Add custom configure arguments, if given. */ configure_args = bz_env_get_value(env, "autotools.configure.args"); if (configure_args != NULL) { struct bz_configure_add_arg state = { exec, env }; switch (bz_value_kind(configure_args)) { case BZ_VALUE_SCALAR: ei_check(bz_configure_add_arg(&state, configure_args)); break; case BZ_VALUE_ARRAY: ei_check(bz_array_value_map (configure_args, &state, bz_configure_add_arg)); break; case BZ_VALUE_MAP: bz_bad_config("autotools.configure.args cannot be a map"); goto error; default: cork_unreachable(); } } cork_exec_set_cwd(exec, cork_path_get(build_dir)); if (pkgconfig_path != NULL) { cork_env_add(exec_env, "PKG_CONFIG_PATH", pkgconfig_path); } ei_check(bz_subprocess_run_exec(verbose, NULL, exec)); /* $ make */ clog_info("(%s) Build using autotools", package_name); exec = cork_exec_new("make"); cork_exec_add_param(exec, "make"); cork_exec_set_cwd(exec, cork_path_get(build_dir)); ei_check(bz_subprocess_run_exec(verbose, NULL, exec)); cork_buffer_done(&buf); return 0; error: cork_buffer_done(&buf); return -1; }