/* CURLOPT_WRITEFUNCTION */ size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data) { size_t realsize = size * nmemb; struct http_m_cell *cell; CURL *easy = (CURL*) data; int old_len; LM_DBG("data received: %.*s [%d]\n", (int)realsize, (char*)ptr, (int)realsize); cell = http_m_cell_lookup(easy); if (cell == NULL) { LM_ERR("Cell for handler %p not found in table\n", easy); return -1; } if (cell->reply == NULL) { cell->reply = (struct http_m_reply*)shm_malloc(sizeof(struct http_m_reply)); if (cell->reply == NULL) { LM_ERR("Cannot allocate shm memory for reply\n"); return -1; } memset( cell->reply, 0, sizeof(struct http_m_reply) ); cell->reply->result = (str *)shm_malloc(sizeof(str)); if (cell->reply->result == NULL) { LM_ERR("Cannot allocate shm memory for reply's result\n"); shm_free(cell->reply); return -1; } memset( cell->reply->result, 0, sizeof(str) ); } old_len = cell->reply->result->len; cell->reply->result->len += realsize; cell->reply->result->s = (char*)shm_reallocxf(cell->reply->result->s, cell->reply->result->len); if (cell->reply->result->s == NULL) { LM_ERR("Cannot allocate shm memory for reply's result\n"); shm_free(cell->reply->result); shm_free(cell->reply); cell->reply = NULL; return -1; } strncpy(cell->reply->result->s + old_len, ptr, cell->reply->result->len - old_len); if (cell->easy == NULL ) { /* TODO: when does this happen? */ LM_DBG("cell %p easy handler is null\n", cell); } else { LM_DBG("getting easy handler info (%p)\n", cell->easy); curl_easy_getinfo(cell->easy, CURLINFO_HTTP_CODE, &cell->reply->retcode); } return realsize; }
int header_list_add(struct header_list *hl, str* hdr) { char *tmp; hl->len++; hl->t = shm_reallocxf(hl->t, hl->len * sizeof(char*)); if (!hl->t) { LM_ERR("shm memory allocation failure\n"); return -1; } hl->t[hl->len - 1] = shm_malloc(hdr->len + 1); tmp = hl->t[hl->len - 1]; if (!tmp) { LM_ERR("shm memory allocation failure\n"); return -1; } memcpy(tmp, hdr->s, hdr->len); *(tmp + hdr->len) = '\0'; LM_DBG("stored new http header: [%s]\n", tmp); return 1; }