/** * @brief Asks user a question and returns true (non-zero value) if the answer was positive, false otherwise. */ static int srcfg_prompt(const char *question, const char *positive, const char *negative) { char input[PATH_MAX] = { 0, }; int ret = 0; CHECK_NULL_ARG3(question, positive, negative); printf("%s [%s/%s]\n", question, positive, negative); for (;;) { ret = scanf("%" PATH_MAX_STR "s", input); if (EOF == ret) { SR_LOG_WRN_MSG("Scanf failed: end of the input stream."); return 0; } sr_str_trim(input); if (0 == strcasecmp(positive, input)) { return 1; } if (0 == strcasecmp(negative, input)) { return 0; } printf("Please enter [%s] or [%s].\n", positive, negative); } return 0; }
/** * @brief Loads a plugin form provided filename. */ static int sr_pd_load_plugin(sr_session_ctx_t *session, const char *plugin_filename, sr_pd_plugin_ctx_t *plugin_ctx) { int rc = SR_ERR_OK; CHECK_NULL_ARG3(session, plugin_filename, plugin_ctx); plugin_ctx->filename = strdup(plugin_filename); CHECK_NULL_NOMEM_GOTO(plugin_ctx->filename, rc, cleanup); /* open the dynamic library with plugin */ plugin_ctx->dl_handle = dlopen(plugin_filename, RTLD_LAZY); if (NULL == plugin_ctx->dl_handle) { SR_LOG_WRN("Unable to load the plugin: %s.", dlerror()); rc = SR_ERR_INIT_FAILED; goto cleanup; } /* get init function pointer */ *(void **) (&plugin_ctx->init_cb) = dlsym(plugin_ctx->dl_handle, SR_PLUGIN_INIT_FN_NAME); if (NULL == plugin_ctx->init_cb) { SR_LOG_WRN("Unable to find '%s' function: %s.", SR_PLUGIN_INIT_FN_NAME, dlerror()); rc = SR_ERR_INIT_FAILED; goto cleanup; } /* get cleanup function pointer */ *(void **) (&plugin_ctx->cleanup_cb) = dlsym(plugin_ctx->dl_handle, SR_PLUGIN_CLEANUP_FN_NAME); if (NULL == plugin_ctx->cleanup_cb) { SR_LOG_WRN("Unable to find '%s' function: %s.", SR_PLUGIN_CLEANUP_FN_NAME, dlerror()); rc = SR_ERR_INIT_FAILED; goto cleanup; } /* get health check function pointer */ *(void **) (&plugin_ctx->health_check_cb) = dlsym(plugin_ctx->dl_handle, SR_PLUGIN_HEALTH_CHECK_FN_NAME); if (NULL != plugin_ctx->health_check_cb) { SR_LOG_DBG("'%s' function found, health checks will be applied.", SR_PLUGIN_HEALTH_CHECK_FN_NAME); } return SR_ERR_OK; cleanup: if (NULL != plugin_ctx->dl_handle) { dlclose(plugin_ctx->dl_handle); } free(plugin_ctx->filename); return rc; }