int cl_session_set_errors(sr_session_ctx_t *session, Sr__Error **errors, size_t error_cnt) { sr_error_info_t *tmp_info = NULL; CHECK_NULL_ARG2(session, errors); pthread_mutex_lock(&session->lock); /* first release already allocated space for errors */ for (size_t i = 0; i < session->error_info_size; i++) { if (NULL != session->error_info[i].message) { free((void*)session->error_info[i].message); session->error_info[i].message = NULL; } if (NULL != session->error_info[i].xpath) { free((void*)session->error_info[i].xpath); session->error_info[i].xpath = NULL; } } if (session->error_info_size < error_cnt) { tmp_info = realloc(session->error_info, (error_cnt * sizeof(*tmp_info))); if (NULL == tmp_info) { SR_LOG_ERR_MSG("Unable to allocate error information."); pthread_mutex_unlock(&session->lock); return SR_ERR_NOMEM; } session->error_info = tmp_info; session->error_info_size = error_cnt; } for (size_t i = 0; i < error_cnt; i++) { if (NULL != errors[i]->message) { session->error_info[i].message = strdup(errors[i]->message); if (NULL == session->error_info[i].message) { SR_LOG_WRN_MSG("Unable to allocate error message, will be left NULL."); } } else { session->error_info[i].message = NULL; } if (NULL != errors[i]->xpath) { session->error_info[i].xpath = strdup(errors[i]->xpath); if (NULL == session->error_info[i].xpath) { SR_LOG_WRN_MSG("Unable to allocate error xpath, will be left NULL."); } } else { session->error_info[i].xpath = NULL; } } session->error_cnt = error_cnt; pthread_mutex_unlock(&session->lock); return SR_ERR_OK; }
int cl_session_create(sr_conn_ctx_t *conn_ctx, sr_session_ctx_t **session_p) { sr_session_ctx_t *session = NULL; int rc = 0; /* initialize session context */ session = calloc(1, sizeof(*session)); CHECK_NULL_NOMEM_RETURN(session); /* initialize session mutext */ rc = pthread_mutex_init(&session->lock, NULL); if (0 != rc) { SR_LOG_ERR_MSG("Cannot initialize session mutex."); free(session); return SR_ERR_INIT_FAILED; } session->conn_ctx = conn_ctx; /* store the session in the connection */ rc = cl_conn_add_session(conn_ctx, session); if (SR_ERR_OK != rc) { SR_LOG_WRN_MSG("Error by adding the session to the connection session list."); } *session_p = session; return SR_ERR_OK; }
/** * @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; }