static void create_thread(int conn, struct sockaddr_in *addr) { struct workorder *work; pthread_t tdata; work = malloc(sizeof(struct workorder)); if (work == NULL) { oprogname(); fprintf(stderr, "out of memory for thread.\n"); close(conn); return; } work->conn = conn; work->addr = *addr; init_python(); if (pthread_create(&tdata, NULL, (void *)service_thread, work) < 0) { oprogname(); perror("can't create new thread"); close(conn); return; } if (pthread_detach(tdata) < 0) { oprogname(); perror("can't detach from thread"); } }
int check_and_set_ready(void){ int ret; //pthread_mutex_lock(&check_lock); ret = ready; if(ret==0){ if(!init_python()){ ret = 1; } } //pthread_mutex_unlock(&check_lock); return ret; }
G_MODULE_EXPORT struct bt_plugin_set *bt_plugin_python_create_all_from_file(const char *path) { struct bt_plugin_set *plugin_set = NULL; struct bt_plugin *plugin = NULL; PyObject *py_plugin_info = NULL; gchar *basename = NULL; size_t path_len; assert(path); if (python_state == PYTHON_STATE_CANNOT_INITIALIZE) { /* * We do not even care about the rest of the function * here because we already know Python cannot be fully * initialized. */ goto error; } BT_LOGD("Creating all Python plugins from file: path=\"%s\"", path); path_len = strlen(path); /* File name ends with `.py` */ if (strncmp(path + path_len - PYTHON_PLUGIN_FILE_EXT_LEN, PYTHON_PLUGIN_FILE_EXT, PYTHON_PLUGIN_FILE_EXT_LEN) != 0) { BT_LOGD("Skipping non-Python file: path=\"%s\"", path); goto error; } /* File name starts with `bt_plugin_` */ basename = g_path_get_basename(path); if (!basename) { BT_LOGW("Cannot get path's basename: path=\"%s\"", path); goto error; } if (strncmp(basename, PYTHON_PLUGIN_FILE_PREFIX, PYTHON_PLUGIN_FILE_PREFIX_LEN) != 0) { BT_LOGD("Skipping Python file not starting with `%s`: " "path=\"%s\"", PYTHON_PLUGIN_FILE_PREFIX, path); goto error; } /* * Initialize Python now. * * This is not done in the library contructor because the * interpreter is somewhat slow to initialize. If you don't * have any potential Python plugins, you don't need to endure * this waiting time everytime you load the library. */ init_python(); if (python_state != PYTHON_STATE_FULLY_INITIALIZED) { /* * For some reason we cannot initialize Python, * import the required modules, and get the required * attributes from them. */ BT_LOGI("Failed to initialize Python interpreter."); goto error; } /* * Call bt2.py_plugin._try_load_plugin_module() with this path * to get plugin info if the plugin is loadable and complete. * This function returns None when there's an error, but just in * case we also manually clear the last Python error state. */ BT_LOGD_STR("Getting Python plugin info object from Python module."); py_plugin_info = PyObject_CallFunction(py_try_load_plugin_module_func, "(s)", path); if (!py_plugin_info || py_plugin_info == Py_None) { BT_LOGW("Cannot load Python plugin: path=\"%s\"", path); print_python_traceback_warn(); PyErr_Clear(); goto error; } /* * Get bt_plugin from plugin info object. */ plugin = bt_plugin_from_python_plugin_info(py_plugin_info); if (!plugin) { BT_LOGW("Cannot create plugin object from Python plugin info object: " "path=\"%s\", py-plugin-info-addr=%p", path, py_plugin_info); goto error; } bt_plugin_set_path(plugin, path); plugin_set = bt_plugin_set_create(); if (!plugin_set) { BT_LOGE_STR("Cannot create empty plugin set."); goto error; } bt_plugin_set_add_plugin(plugin_set, plugin); BT_LOGD("Created all Python plugins from file: path=\"%s\", " "plugin-addr=%p, plugin-name=\"%s\"", path, plugin, bt_plugin_get_name(plugin)); goto end; error: BT_PUT(plugin_set); end: bt_put(plugin); Py_XDECREF(py_plugin_info); g_free(basename); return plugin_set; }
int main(int argc, char *argv[]) { #ifndef _WIN32 if (geteuid() == 0) { fprintf(stderr, "Running IRC services is root is not recommended."); return 1; } setup_corefile(); #endif memset(&ServicesInfo, 0, sizeof(ServicesInfo)); memset(&ServicesState, 0, sizeof(ServicesState)); ServicesState.configfile = CPATH; ServicesState.logfile = LPATH; ServicesState.pidfile = PPATH; ServicesState.fully_connected = 0; parseargs(&argc, &argv, myopts); if(ServicesState.printversion) { printf("oftc-ircservices: version: %s\n", VERSION); exit(EXIT_SUCCESS); } if(chdir(DPATH)) { perror("chdir"); exit(EXIT_FAILURE); } #ifndef _WIN32 if(!ServicesState.foreground) make_daemon(); else print_startup(getpid()); #endif setup_signals(); memset(&me, 0, sizeof(me)); libio_init(!ServicesState.foreground); init_events(); iorecv_cb = register_callback("iorecv", iorecv_default); connected_cb = register_callback("server connected", server_connected); iosend_cb = register_callback("iosend", iosend_default); OpenSSL_add_all_digests(); init_interface(); check_pidfile(ServicesState.pidfile); init_log(ServicesState.logfile); #ifdef HAVE_RUBY init_ruby(); signal(SIGSEGV, SIG_DFL); #endif init_channel(); init_conf(); init_client(); init_parser(); init_channel_modes(); init_mqueue(); init_tor(); me.from = me.servptr = &me; SetServer(&me); SetMe(&me); dlinkAdd(&me, &me.node, &global_client_list); read_services_conf(TRUE); init_db(); init_uid(); #ifdef HAVE_PYTHON init_python(); #endif init_kill(); write_pidfile(ServicesState.pidfile); ilog(L_NOTICE, "Services Ready"); db_load_driver(); #ifdef USE_SHARED_MODULES if(chdir(MODPATH)) { ilog(L_ERROR, "Could not load core modules from %s: %s", MODPATH, strerror(errno)); exit(EXIT_FAILURE); } /* Go back to DPATH after checking to see if we can chdir to MODPATH */ chdir(DPATH); #else load_all_modules(1); #endif boot_modules(1); connect_server(); for(;;) { while (eventNextTime() <= CurrentTime) eventRun(); execute_callback(do_event_cb); if(events_loop() == -1) { ilog(L_CRIT, "libevent returned error %d", errno); services_die("Libevent returned some sort of error", NO); break; } comm_select(); send_queued_all(); if(dorehash) { ilog(L_INFO, "Got SIGHUP, reloading configuration"); read_services_conf(NO); dorehash = 0; } } return 0; }
void init_ipython_kernel(void) { init_python(); kernel_do_one_iteration = start_ipython_kernel(commandline_args); }