#define kurl_isfile(u) ((u)->fd >= 0)
+#ifndef kroundup32
+#define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x))
+#endif
+
struct kurl_t {
CURLM *multi; // cURL multi handler
CURL *curl; // cURL easy handle
{
kurl_t *ku = (kurl_t*)data;
ssize_t nbytes = size * nmemb;
- assert(nbytes + ku->l_buf < ku->m_buf);
+ if (nbytes + ku->l_buf > ku->m_buf) {
+ ku->m_buf = nbytes + ku->l_buf;
+ kroundup32(ku->m_buf);
+ ku->buf = (uint8_t*)realloc(ku->buf, ku->m_buf);
+ if (ku->buf == 0) {
+ ku->err = KURL_NO_MEM;
+ return 0;
+ }
+ }
memcpy(ku->buf + ku->l_buf, ptr, nbytes);
ku->l_buf += nbytes;
return nbytes;
nanosleep(&req, &rem);
}
rc = curl_multi_perform(ku->multi, &n_running); // FIXME: check return code
- } while (n_running && ku->l_buf < ku->m_buf - CURL_MAX_WRITE_SIZE);
- if (ku->l_buf < ku->m_buf - CURL_MAX_WRITE_SIZE) ku->done_reading = 1;
+ } while (n_running && ku->l_buf < CURL_MAX_WRITE_SIZE);
+ if (ku->l_buf < CURL_MAX_WRITE_SIZE) ku->done_reading = 1;
}
return ku->l_buf;
}
return ku;
}
-#ifndef kroundup32
-#define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x))
-#endif
-
int kurl_buflen(kurl_t *ku, int len)
{
if (len <= 0 || len < ku->l_buf) return ku->m_buf;
#define KURL_NULL 1
#define KURL_INV_WHENCE 2
#define KURL_SEEK_OUT 3
+#define KURL_NO_MEM 4
struct kurl_t;
typedef struct kurl_t kurl_t;
#define knet_open(fn, mode) kurl_open(fn, 0)
#define knet_dopen(fd, mode) kurl_dopen(fd)
#define knet_close(fp) kurl_close(fp)
+#define knet_read(fp, buf, len) kurl_read(fp, buf, len)
#define knet_seek(fp, off, whence) kurl_seek(fp, off, whence)
#define knet_tell(fp) kurl_tell(fp)
#define knet_fileno(fp) kurl_fileno(fp)