ioline: add length to callback

This is required to be able to skip over a HTTP/RTSP body which might
contain nul bytes.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/820>
This commit is contained in:
Mohamed Akram 2024-06-06 18:00:05 +04:00
parent c1990dd026
commit fa8943c80e
6 changed files with 11 additions and 11 deletions

View file

@ -49,7 +49,7 @@ struct userdata {
pa_ioline *line; pa_ioline *line;
}; };
static void line_callback(pa_ioline *line, const char *s, void *userdata) { static void line_callback(pa_ioline *line, const char *s, size_t l, void *userdata) {
struct userdata *u = userdata; struct userdata *u = userdata;
pa_module *m = NULL; pa_module *m = NULL;
unsigned devnum; unsigned devnum;

View file

@ -187,7 +187,7 @@ static void headers_read(pa_rtsp_client *c) {
c->callback(c, c->state, c->status, c->response_headers, c->userdata); c->callback(c, c->state, c->status, c->response_headers, c->userdata);
} }
static void line_callback(pa_ioline *line, const char *s, void *userdata) { static void line_callback(pa_ioline *line, const char *s, size_t l, void *userdata) {
pa_rtsp_client *c = userdata; pa_rtsp_client *c = userdata;
char *delimpos; char *delimpos;
char *s2, *s2p; char *s2, *s2p;

View file

@ -57,7 +57,7 @@ struct pa_cli {
char *last_line; char *last_line;
}; };
static void line_callback(pa_ioline *line, const char *s, void *userdata); static void line_callback(pa_ioline *line, const char *s, size_t l, void *userdata);
static void client_kill(pa_client *c); static void client_kill(pa_client *c);
pa_cli* pa_cli_new(pa_core *core, pa_iochannel *io, pa_module *m) { pa_cli* pa_cli_new(pa_core *core, pa_iochannel *io, pa_module *m) {
@ -117,7 +117,7 @@ static void client_kill(pa_client *client) {
c->eof_callback(c, c->userdata); c->eof_callback(c, c->userdata);
} }
static void line_callback(pa_ioline *line, const char *s, void *userdata) { static void line_callback(pa_ioline *line, const char *s, size_t l, void *userdata) {
pa_strbuf *buf; pa_strbuf *buf;
pa_cli *c = userdata; pa_cli *c = userdata;
char *p; char *p;

View file

@ -227,14 +227,14 @@ static void failure(pa_ioline *l, bool process_leftover) {
/* Pass the last missing bit to the client */ /* Pass the last missing bit to the client */
if (l->callback) { if (l->callback) {
char *p = pa_xstrndup(l->rbuf+l->rbuf_index, l->rbuf_valid_length); char *p = pa_xmemdup(l->rbuf+l->rbuf_index, l->rbuf_valid_length);
l->callback(l, p, l->userdata); l->callback(l, p, l->rbuf_valid_length, l->userdata);
pa_xfree(p); pa_xfree(p);
} }
} }
if (l->callback) { if (l->callback) {
l->callback(l, NULL, l->userdata); l->callback(l, NULL, 0, l->userdata);
l->callback = NULL; l->callback = NULL;
} }
@ -256,7 +256,7 @@ static void scan_for_lines(pa_ioline *l, size_t skip) {
*e = 0; *e = 0;
p = l->rbuf + l->rbuf_index; p = l->rbuf + l->rbuf_index;
m = strlen(p); m = e - p;
l->rbuf_index += m+1; l->rbuf_index += m+1;
l->rbuf_valid_length -= m+1; l->rbuf_valid_length -= m+1;
@ -266,7 +266,7 @@ static void scan_for_lines(pa_ioline *l, size_t skip) {
l->rbuf_index = 0; l->rbuf_index = 0;
if (l->callback) if (l->callback)
l->callback(l, pa_strip_nl(p), l->userdata); l->callback(l, pa_strip_nl(p), m, l->userdata);
skip = 0; skip = 0;
} }

View file

@ -30,7 +30,7 @@
typedef struct pa_ioline pa_ioline; typedef struct pa_ioline pa_ioline;
typedef void (*pa_ioline_cb_t)(pa_ioline*io, const char *s, void *userdata); typedef void (*pa_ioline_cb_t)(pa_ioline*io, const char *s, size_t l, void *userdata);
typedef void (*pa_ioline_drain_cb_t)(pa_ioline *io, void *userdata); typedef void (*pa_ioline_drain_cb_t)(pa_ioline *io, void *userdata);
pa_ioline* pa_ioline_new(pa_iochannel *io); pa_ioline* pa_ioline_new(pa_iochannel *io);

View file

@ -629,7 +629,7 @@ static void handle_url(struct connection *c) {
html_response(c, 404, "Not Found", NULL); html_response(c, 404, "Not Found", NULL);
} }
static void line_callback(pa_ioline *line, const char *s, void *userdata) { static void line_callback(pa_ioline *line, const char *s, size_t l, void *userdata) {
struct connection *c = userdata; struct connection *c = userdata;
pa_assert(line); pa_assert(line);
pa_assert(c); pa_assert(c);