}
-
/*
*
*/
f->hmf_flags |= HMF_INALLOCED;
}
+/*
+ *
+ */
+void
+htsmsg_add_str_alloc(htsmsg_t *msg, const char *name, char *str)
+{
+ htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_STR, 0, 0);
+ f->hmf_str = str;
+ f->hmf_flags |= HMF_ALLOCED;
+}
+
/*
*
*/
*
*/
void
-htsmsg_add_binptr(htsmsg_t *msg, const char *name, const void *bin, size_t len)
+htsmsg_add_bin_alloc(htsmsg_t *msg, const char *name, const void *bin, size_t len)
+{
+ htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_BIN, 0, 0);
+ f->hmf_flags |= HMF_ALLOCED;
+ f->hmf_bin = bin;
+ f->hmf_binsize = len;
+}
+
+/*
+ *
+ */
+void
+htsmsg_add_bin_ptr(htsmsg_t *msg, const char *name, const void *bin, size_t len)
{
htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_BIN, 0, 0);
f->hmf_bin = bin;
*/
void htsmsg_add_str2(htsmsg_t *msg, const char *name, const char *str);
+/**
+ * Add a string field (allocated using malloc).
+ */
+void htsmsg_add_str_alloc(htsmsg_t *msg, const char *name, char *str);
+
/**
* Add a string field to a list only once.
*/
*/
void htsmsg_add_bin(htsmsg_t *msg, const char *name, const void *bin, size_t len);
+/**
+ * Add an binary field. The passed data must be mallocated.
+ */
+void htsmsg_add_bin_alloc(htsmsg_t *msg, const char *name, const void *bin, size_t len);
+
/**
* Add an binary field. The data is not copied, instead the caller
* is responsible for keeping the data valid for as long as the message
* is around.
*/
-void htsmsg_add_binptr(htsmsg_t *msg, const char *name, const void *bin, size_t len);
+void htsmsg_add_bin_ptr(htsmsg_t *msg, const char *name, const void *bin, size_t len);
/**
* Get an integer as an unsigned 32 bit integer.
htsp_file_update_stats(hf, r);
rep = htsmsg_create_map();
- htsmsg_add_bin(rep, "data", m, r);
- free(m);
+ htsmsg_add_bin_alloc(rep, "data", m, r);
error:
pthread_mutex_lock(&global_lock);
* object that just points to data, thus avoiding a copy.
*/
payloadlen = pktbuf_len(pkt->pkt_payload);
- htsmsg_add_binptr(m, "payload", pktbuf_ptr(pkt->pkt_payload), payloadlen);
+ htsmsg_add_bin_ptr(m, "payload", pktbuf_ptr(pkt->pkt_payload), payloadlen);
htsp_send_subscription(htsp, m, pkt->pkt_payload, hs, payloadlen);
atomic_add(&hs->hs_s_bytes_out, payloadlen);
}
if (ssc->ssc_gh)
- htsmsg_add_binptr(m, "meta", pktbuf_ptr(ssc->ssc_gh),
- pktbuf_len(ssc->ssc_gh));
+ htsmsg_add_bin_ptr(m, "meta", pktbuf_ptr(ssc->ssc_gh),
+ pktbuf_len(ssc->ssc_gh));
htsmsg_add_msg(streams, NULL, c);
}
if (p == NULL)
return -1;
if (tcp_read(hc->hc_fd, bl, 4))
- return -1;
+ goto err1;
if (tcp_read(hc->hc_fd, p, plen))
- return -1;
+ goto err1;
/* apply mask descrambling */
for (pi = 0; pi < plen; pi++)
p[pi] ^= bl[pi & 3];
if (op == HTTP_WSOP_PING) {
http_websocket_send(hc, p, plen, HTTP_WSOP_PONG);
+ free(p);
goto again;
}
msg = htsmsg_create_map();
p[plen] = '\0';
msg1 = p[0] == '{' || p[0] == '[' ?
htsmsg_json_deserialize((char *)p) : NULL;
- if (msg1)
+ if (msg1) {
htsmsg_add_msg(msg, "json", msg1);
- else
- htsmsg_add_str(msg, "text", (char *)p);
+ free(p);
+ } else {
+ htsmsg_add_str_alloc(msg, "text", (char *)p);
+ }
} else {
- htsmsg_add_bin(msg, "bin", p, plen);
+ htsmsg_add_bin_alloc(msg, "bin", p, plen);
}
*_res = msg;
return 0;
+err1:
+ free(p);
+ return -1;
}
/**