static int eap_sim_db_send(struct eap_sim_db_data *data, const char *msg, size_t len) { int _errno = 0; if (send(data->sock, msg, len, 0) < 0) { _errno = errno; perror("send[EAP-SIM DB UNIX]"); } if (_errno == ENOTCONN || _errno == EDESTADDRREQ || _errno == EINVAL || _errno == ECONNREFUSED) { /* Try to reconnect */ eap_sim_db_close_socket(data); if (eap_sim_db_open_socket(data) < 0) return -1; wpa_printf(MSG_DEBUG, "EAP-SIM DB: Reconnected to the " "external server"); if (send(data->sock, msg, len, 0) < 0) { perror("send[EAP-SIM DB UNIX]"); return -1; } } return 0; }
/** * eap_sim_db_deinit - Deinitialize EAP-SIM DB/authentication gw interface * @priv: Private data pointer from eap_sim_db_init() */ void eap_sim_db_deinit(void *priv) { struct eap_sim_db_data *data = priv; struct eap_sim_pseudonym *p, *prev; struct eap_sim_reauth *r, *prevr; struct eap_sim_db_pending *pending, *prev_pending; eap_sim_db_close_socket(data); VM_FREE(data->fname); p = data->pseudonyms; while (p) { prev = p; p = p->next; eap_sim_db_free_pseudonym(prev); } r = data->reauths; while (r) { prevr = r; r = r->next; eap_sim_db_free_reauth(prevr); } pending = data->pending; while (pending) { prev_pending = pending; pending = pending->next; VM_FREE(prev_pending); } VM_FREE(data); }
/** * eap_sim_db_init - Initialize EAP-SIM DB / authentication gateway interface * @config: Configuration data (e.g., file name) * @get_complete_cb: Callback function for reporting availability of triplets * @ctx: Context pointer for get_complete_cb * Returns: Pointer to a private data structure or %NULL on failure */ void * eap_sim_db_init(const char *config, void (*get_complete_cb)(void *ctx, void *session_ctx), void *ctx) { struct eap_sim_db_data *data; data = wpa_zalloc(sizeof(*data)); if (data == NULL) return NULL; data->sock = -1; data->get_complete_cb = get_complete_cb; data->ctx = ctx; data->fname = VM_STRDUP(config); if (data->fname == NULL) goto fail; if (strncmp(data->fname, "unix:", 5) == 0) { if (eap_sim_db_open_socket(data)) goto fail; } return data; fail: eap_sim_db_close_socket(data); VM_FREE(data->fname); VM_FREE(data); return NULL; }
/** * eap_sim_db_init - Initialize EAP-SIM DB / authentication gateway interface * @config: Configuration data (e.g., file name) * @db_timeout: Database lookup timeout * @get_complete_cb: Callback function for reporting availability of triplets * @ctx: Context pointer for get_complete_cb * Returns: Pointer to a private data structure or %NULL on failure */ struct eap_sim_db_data * eap_sim_db_init(const char *config, unsigned int db_timeout, void (*get_complete_cb)(void *ctx, void *session_ctx), void *ctx) { struct eap_sim_db_data *data; char *pos; data = os_zalloc(sizeof(*data)); if (data == NULL) return NULL; data->sock = -1; data->get_complete_cb = get_complete_cb; data->ctx = ctx; data->eap_sim_db_timeout = db_timeout; data->fname = os_strdup(config); if (data->fname == NULL) goto fail; pos = os_strstr(data->fname, " db="); if (pos) { *pos = '\0'; #ifdef CONFIG_SQLITE pos += 4; data->sqlite_db = db_open(pos); if (data->sqlite_db == NULL) goto fail; #endif /* CONFIG_SQLITE */ } if (os_strncmp(data->fname, "unix:", 5) == 0) { if (eap_sim_db_open_socket(data)) { wpa_printf(MSG_DEBUG, "EAP-SIM DB: External database " "connection not available - will retry " "later"); } } return data; fail: eap_sim_db_close_socket(data); os_free(data->fname); os_free(data); return NULL; }
/** * eap_sim_db_deinit - Deinitialize EAP-SIM DB/authentication gw interface * @priv: Private data pointer from eap_sim_db_init() */ void eap_sim_db_deinit(void *priv) { struct eap_sim_db_data *data = priv; struct eap_sim_pseudonym *p, *prev; struct eap_sim_reauth *r, *prevr; struct eap_sim_db_pending *pending, *prev_pending; #ifdef CONFIG_SQLITE if (data->sqlite_db) { sqlite3_close(data->sqlite_db); data->sqlite_db = NULL; } #endif /* CONFIG_SQLITE */ eap_sim_db_close_socket(data); os_free(data->fname); p = data->pseudonyms; while (p) { prev = p; p = p->next; eap_sim_db_free_pseudonym(prev); } r = data->reauths; while (r) { prevr = r; r = r->next; eap_sim_db_free_reauth(prevr); } pending = data->pending; while (pending) { prev_pending = pending; pending = pending->next; eap_sim_db_free_pending(data, prev_pending); } os_free(data); }