1
0
Fork 0
mirror of https://github.com/albfan/miraclecast.git synced 2025-03-09 23:38:56 +00:00

miracle-dispd: replace assert() with assert_?ret?()

for capturing more information about buggy behaviours, more
    validations and loggings are added

Change-Id: I57e11d201324ed10b2218c9e72627759aae619c9
This commit is contained in:
Derek Dai 2017-04-22 15:40:55 +08:00
parent 875fa86f6b
commit d8d85c1b97
5 changed files with 145 additions and 89 deletions

View file

@ -20,7 +20,6 @@
#include <systemd/sd-bus.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <errno.h>
#include <stdarg.h>
#include "dispd-encoder.h"
@ -77,7 +76,7 @@ static int dispd_encoder_exec(const char *cmd, int fd, struct wfd_session *s)
*/
r = dup2(fd, 3);
if(0 > r) {
return r;
return log_ERRNO();
}
if(fd != 3) {
@ -132,7 +131,7 @@ static int dispd_encoder_kill_child(struct dispd_encoder *e)
static void dispd_encoder_notify_state_change(struct dispd_encoder *e,
enum dispd_encoder_state state)
{
assert(e);
assert_vret(e);
if(!e->handler) {
return;
@ -187,8 +186,8 @@ int dispd_encoder_spawn(struct dispd_encoder **out, struct wfd_session *s)
int fds[2] = { -1, -1 };
int r;
assert(out);
assert(s);
assert_ret(out);
assert_ret(s);
r = dispd_encoder_new(&e);
if(0 > r) {
@ -238,7 +237,7 @@ int dispd_encoder_spawn(struct dispd_encoder **out, struct wfd_session *s)
close(fds[1]);
*out = dispd_encoder_ref(e);
goto end;
return 0;
close_pipe:
close(fds[0]);
@ -247,18 +246,18 @@ kill_encoder:
// dispd will do the cleanup
kill(pid, SIGKILL);
end:
return r;
return log_ERRNO();
}
static int dispd_encoder_new(struct dispd_encoder **out)
{
_shl_free_ struct dispd_encoder *e = NULL;
assert(out);
assert_ret(out);
e = calloc(1, sizeof(struct dispd_encoder));
if(!e) {
return -ENOMEM;
return log_ENOMEM();
}
e->ref = 1;
@ -270,8 +269,8 @@ static int dispd_encoder_new(struct dispd_encoder **out)
struct dispd_encoder * dispd_encoder_ref(struct dispd_encoder *e)
{
assert(e);
assert(0 < e->ref);
assert_retv(e, NULL);
assert_retv(0 < e->ref, NULL);
++ e->ref;
@ -287,8 +286,8 @@ void dispd_encoder_unrefp(struct dispd_encoder **e)
void dispd_encoder_unref(struct dispd_encoder *e)
{
assert(e);
assert(0 < e->ref);
assert_vret(e);
assert_vret(0 < e->ref);
--e->ref;
if(e->ref) {
@ -312,7 +311,7 @@ void dispd_encoder_set_handler(struct dispd_encoder *e,
dispd_encoder_state_change_handler handler,
void *userdata)
{
assert(e);
assert_vret(e);
e->handler = handler;
e->userdata = userdata;
@ -320,14 +319,14 @@ void dispd_encoder_set_handler(struct dispd_encoder *e,
dispd_encoder_state_change_handler dispd_encoder_get_handler(struct dispd_encoder *e)
{
assert(e);
assert_retv(e, NULL);
return e->handler;
}
enum dispd_encoder_state dispd_encoder_get_state(struct dispd_encoder *e)
{
assert(e);
assert_retv(e, DISPD_ENCODER_STATE_NULL);
return e->state;
}
@ -354,7 +353,7 @@ static const char * state_to_name(enum dispd_encoder_state s)
static void dispd_encoder_set_state(struct dispd_encoder *e,
enum dispd_encoder_state state)
{
assert(e);
assert_vret(e);
if(e->state == state) {
return;
@ -440,7 +439,7 @@ static int on_encoder_disappeared(sd_bus_message *m,
r = dispd_encoder_kill_child(e);
if(0 > r) {
return r;
return log_ERRNO();
}
else if(r) {
return 0;
@ -525,6 +524,7 @@ static int dispd_encoder_on_unique_name(sd_event_source *source,
goto end;
error:
log_vERRNO();
dispd_encoder_kill_child(e);
end:
dispd_encoder_close_pipe(e);
@ -540,22 +540,22 @@ static int config_append(sd_bus_message *m,
int r;
va_list argv;
assert(m);
assert(t);
assert_ret(m);
assert_ret(t);
r = sd_bus_message_open_container(m, 'e', "iv");
if(0 > r) {
return r;
return log_ERRNO();
}
r = sd_bus_message_append(m, "i", k);
if(0 > r) {
return r;
return log_ERRNO();
}
r = sd_bus_message_open_container(m, 'v', t);
if(0 > r) {
return r;
return log_ERRNO();
}
va_start(argv, t);
@ -572,15 +572,20 @@ static int config_append(sd_bus_message *m,
va_end(argv);
if(0 > r) {
return r;
return log_ERRNO();
}
r = sd_bus_message_close_container(m);
if(0 > r) {
return r;
return log_ERRNO();
}
return sd_bus_message_close_container(m);
r = sd_bus_message_close_container(m);
if(0 > r) {
return log_ERRNO();
}
return 0;
}
int dispd_encoder_configure(struct dispd_encoder *e, struct wfd_session *s)
@ -592,9 +597,10 @@ int dispd_encoder_configure(struct dispd_encoder *e, struct wfd_session *s)
struct wfd_sink *sink;
int r;
assert(e);
assert(s);
assert(wfd_is_out_session(s));
assert_ret(e);
assert_ret(e->bus);
assert_ret(s);
assert_ret(wfd_is_out_session(s));
r = sd_bus_message_new_method_call(e->bus,
&call,
@ -603,12 +609,12 @@ int dispd_encoder_configure(struct dispd_encoder *e, struct wfd_session *s)
"org.freedesktop.miracle.encoder",
"Configure");
if(0 > r) {
return r;
return log_ERRNO();
}
r = sd_bus_message_open_container(call, 'a', "{iv}");
if(0 > r) {
return r;
return log_ERRNO();
}
sink = wfd_out_session_get_sink(s);
@ -617,7 +623,7 @@ int dispd_encoder_configure(struct dispd_encoder *e, struct wfd_session *s)
"s",
sink->peer->remote_address);
if(0 > r) {
return r;
return log_ERRNO();
}
r = config_append(call,
@ -625,7 +631,7 @@ int dispd_encoder_configure(struct dispd_encoder *e, struct wfd_session *s)
"u",
s->stream.rtp_port);
if(0 > r) {
return r;
return log_ERRNO();
}
if(s->stream.rtcp_port) {
@ -634,7 +640,7 @@ int dispd_encoder_configure(struct dispd_encoder *e, struct wfd_session *s)
"u",
s->stream.rtcp_port);
if(0 > r) {
return r;
return log_ERRNO();
}
}
@ -643,7 +649,7 @@ int dispd_encoder_configure(struct dispd_encoder *e, struct wfd_session *s)
"s",
sink->peer->local_address);
if(0 > r) {
return r;
return log_ERRNO();
}
if(s->stream.rtcp_port) {
@ -652,7 +658,7 @@ int dispd_encoder_configure(struct dispd_encoder *e, struct wfd_session *s)
"u",
s->stream.rtcp_port);
if(0 > r) {
return r;
return log_ERRNO();
}
}
@ -663,7 +669,7 @@ int dispd_encoder_configure(struct dispd_encoder *e, struct wfd_session *s)
"u",
rect->x);
if(0 > r) {
return r;
return log_ERRNO();
}
r = config_append(call,
@ -671,7 +677,7 @@ int dispd_encoder_configure(struct dispd_encoder *e, struct wfd_session *s)
"u",
rect->y);
if(0 > r) {
return r;
return log_ERRNO();
}
r = config_append(call,
@ -679,7 +685,7 @@ int dispd_encoder_configure(struct dispd_encoder *e, struct wfd_session *s)
"u",
rect->width);
if(0 > r) {
return r;
return log_ERRNO();
}
r = config_append(call,
@ -687,22 +693,23 @@ int dispd_encoder_configure(struct dispd_encoder *e, struct wfd_session *s)
"u",
rect->height);
if(0 > r) {
return r;
return log_ERRNO();
}
}
r = sd_bus_message_close_container(call);
if(0 > r) {
return r;
return log_ERRNO();
}
r = sd_bus_call(e->bus, call, 0, &error, &reply);
if(0 > r) {
log_warning("%s: %s", error.name, error.message);
sd_bus_error_free(&error);
return log_ERRNO();
}
return r;
return 0;
}
static int dispd_encoder_call(struct dispd_encoder *e, const char *method)
@ -712,9 +719,9 @@ static int dispd_encoder_call(struct dispd_encoder *e, const char *method)
_cleanup_sd_bus_error_ sd_bus_error error = SD_BUS_ERROR_NULL;
int r;
assert(e);
assert(method);
assert(e->bus);
assert_ret(e);
assert_ret(method);
assert_ret(e->bus);
r = sd_bus_message_new_method_call(e->bus,
&call,

View file

@ -588,7 +588,7 @@ static int wfd_out_session_handle_play_request(struct wfd_session *s,
*out_rep = (rtsp_message_ref(m), m);
return r;
return 0;
}
static void on_encoder_state_changed(struct dispd_encoder *e,

View file

@ -22,6 +22,7 @@
#include "wfd-dbus.h"
#include "wfd-session.h"
#include "shl_macro.h"
#include "shl_log.h"
#define rtsp_message_id_is_valid(_id) ( \
(_id) >= RTSP_M1_REQUEST_SINK_OPTIONS && \
@ -65,12 +66,12 @@ static int wfd_session_do_request(struct wfd_session *s,
const struct wfd_arg_list *args,
struct rtsp_message **out)
{
if(!rtsp_message_id_is_valid(id)) {
return -EINVAL;
}
assert_ret(s);
assert_ret(rtsp_message_id_is_valid(id));
assert_ret(out);
if(!s->rtsp_disp_tbl[id].request) {
log_warning("!!! request not implemented !!!");
log_warning("!!! request %d not implemented !!!", id);
return -ENOTSUP;
}
@ -80,8 +81,13 @@ static int wfd_session_do_request(struct wfd_session *s,
static int wfd_session_do_handle_request(struct wfd_session *s,
enum rtsp_message_id id,
struct rtsp_message *req,
struct rtsp_message **out_rep)
struct rtsp_message **rep)
{
assert_ret(s);
assert_ret(rtsp_message_id_is_valid(id));
assert_ret(req);
assert_ret(rep);
if(!rtsp_message_id_is_valid(id)) {
return -EINVAL;
}
@ -93,13 +99,17 @@ static int wfd_session_do_handle_request(struct wfd_session *s,
return (*s->rtsp_disp_tbl[id].handle_request)(s,
req,
out_rep);
rep);
}
static int wfd_session_do_handle_reply(struct wfd_session *s,
enum rtsp_message_id id,
struct rtsp_message *m)
struct rtsp_message *rep)
{
assert_ret(s);
assert_ret(rtsp_message_id_is_valid(id));
assert_ret(rep);
if(!rtsp_message_id_is_valid(id)) {
return -EINVAL;
}
@ -108,22 +118,28 @@ static int wfd_session_do_handle_reply(struct wfd_session *s,
return 0;
}
return (*s->rtsp_disp_tbl[id].handle_reply)(s, m);
return (*s->rtsp_disp_tbl[id].handle_reply)(s, rep);
}
unsigned int wfd_session_get_id(struct wfd_session *s)
{
assert_retv(s, (unsigned int) -1);
return s->id;
}
enum wfd_session_state wfd_session_get_state(struct wfd_session *s)
{
assert_retv(s, WFD_SESSION_STATE_NULL);
return s->state;
}
void wfd_session_set_state(struct wfd_session *s,
enum wfd_session_state state)
{
assert_vret(wfd_is_session(s));
if(state == s->state) {
return;
}
@ -133,16 +149,16 @@ void wfd_session_set_state(struct wfd_session *s,
wfd_fn_session_properties_changed(s, "State");
}
int wfd_session_is_established(struct wfd_session *s)
bool wfd_session_is_established(struct wfd_session *s)
{
assert(wfd_is_session(s));
assert_retv(wfd_is_session(s), false);
return WFD_SESSION_STATE_ESTABLISHED <= s->state;
}
int wfd_session_resume(struct wfd_session *s)
{
assert(wfd_is_session(s));
assert_ret(wfd_is_session(s));
if(WFD_SESSION_STATE_PLAYING == s->state) {
return 0;
@ -160,7 +176,7 @@ int wfd_session_resume(struct wfd_session *s)
int wfd_session_pause(struct wfd_session *s)
{
assert(wfd_is_session(s));
assert_ret(wfd_is_session(s));
if(WFD_SESSION_STATE_PAUSED == s->state) {
return 0;
@ -178,7 +194,7 @@ int wfd_session_pause(struct wfd_session *s)
int wfd_session_teardown(struct wfd_session *s)
{
assert(wfd_is_session(s));
assert_ret(wfd_is_session(s));
if(wfd_session_is_established(s)) {
if(!session_vtbl[s->dir].teardown) {
@ -198,9 +214,7 @@ int wfd_session_teardown(struct wfd_session *s)
int wfd_session_terminate(struct wfd_session *s)
{
if(!s) {
return 0;
}
assert_ret(wfd_is_session(s));
if(session_vtbl[s->dir].destroy) {
(*session_vtbl[s->dir].destroy)(s);
@ -267,7 +281,7 @@ void wfd_session_unref(struct wfd_session *s)
return;
}
assert(1 <= s->ref);
assert_vret(1 <= s->ref);
-- s->ref;
if(s->ref) {
@ -281,21 +295,29 @@ void wfd_session_unref(struct wfd_session *s)
enum wfd_session_dir wfd_session_get_dir(struct wfd_session *s)
{
assert_retv(s, WFD_SESSION_DIR_OUT);
return s->dir;
}
unsigned int * wfd_session_to_htable(struct wfd_session *s)
{
assert_retv(s, NULL);
return &s->id;
}
struct wfd_session * wfd_session_from_htable(unsigned int *e)
{
assert_retv(e, NULL);
return shl_htable_entry(e, struct wfd_session, id);
}
const char * wfd_session_get_stream_url(struct wfd_session *s)
{
assert_retv(wfd_is_session(s), NULL);
return s->stream.url;
}
@ -306,25 +328,30 @@ int wfd_session_gen_stream_url(struct wfd_session *s,
char *url;
int r;
if(!wfd_stream_id_is_valid(id)) {
return -EINVAL;
}
assert_ret(wfd_is_session(s));
assert_ret(local_addr);
assert_ret(wfd_stream_id_is_valid(id));
r = asprintf(&url, "rtsp://%s/wfd1.0/streamid=%d", local_addr, id);
if(0 <= r) {
free(s->stream.url);
s->stream.url = url;
url = NULL;
if(0 > r) {
return log_ERRNO();
}
return r;
free(s->stream.url);
s->stream.url = url;
return 0;
}
static enum rtsp_message_id wfd_session_message_to_id(struct wfd_session *s,
struct rtsp_message *m)
{
const char *method = m ? rtsp_message_get_method(m) : NULL;
const char *method;
assert_retv(wfd_is_session(s), RTSP_M_UNKNOWN);
method = m ? rtsp_message_get_method(m) : NULL;
if(!method) {
return RTSP_M_UNKNOWN;
}
@ -400,13 +427,17 @@ static enum rtsp_message_id wfd_session_message_to_id(struct wfd_session *s,
static int wfd_session_post_handle_request_n_reply(struct wfd_session *s,
enum rtsp_message_id ror)
{
const struct wfd_arg_list *args = &s->rtsp_disp_tbl[ror].rule;
const struct wfd_arg_list *args;
enum rtsp_message_id next_request = RTSP_M_UNKNOWN;
enum wfd_session_arg_id arg_id;
enum wfd_session_state new_state = WFD_SESSION_STATE_NULL;
const struct wfd_arg_list *req_args = NULL;
int i;
assert_ret(s);
assert_ret(RTSP_M_UNKNOWN != ror);
args = &s->rtsp_disp_tbl[ror].rule;
if(!args->len) {
return 0;
}
@ -512,7 +543,7 @@ static int wfd_session_handle_request(struct rtsp *bus,
error:
wfd_session_terminate(s);
return log_ERRNO();
return log_ERR(r);
}
static int wfd_session_handle_reply(struct rtsp *bus,
@ -553,10 +584,9 @@ static int wfd_session_handle_reply(struct rtsp *bus,
return 0;
error:
log_info("error while handling reply: %s", strerror(-r));
wfd_session_terminate(s);
return r;
return log_ERR(r);
}
int wfd_session_init(struct wfd_session *s,
@ -579,7 +609,7 @@ int wfd_session_request(struct wfd_session *s,
int r;
_rtsp_message_unref_ struct rtsp_message *m = NULL;
assert(s);
assert_ret(s);
r = wfd_session_do_request(s, id, args, &m);
if(0 > r) {
@ -679,7 +709,7 @@ int wfd_session_start(struct wfd_session *s)
_shl_close_ int fd = -1;
uint32_t mask;
assert(wfd_is_session(s));
assert_ret(wfd_is_session(s));
if(WFD_SESSION_STATE_NULL != s->state) {
return -EINPROGRESS;
@ -687,7 +717,7 @@ int wfd_session_start(struct wfd_session *s)
r = (*session_vtbl[s->dir].initiate_io)(s, &fd, &mask);
if(0 > r) {
return r;
return log_ERRNO();
}
r = sd_event_add_io(ctl_wfd_get_loop(),
@ -697,7 +727,7 @@ int wfd_session_start(struct wfd_session *s)
wfd_session_handle_io,
s);
if (r < 0) {
return r;
return log_ERRNO();
}
fd = -1;
@ -789,7 +819,7 @@ const struct wfd_rectangle * wfd_session_get_disp_dimension(struct wfd_session *
int wfd_session_set_disp_dimension(struct wfd_session *s, const struct wfd_rectangle *rect)
{
assert(rect);
assert_ret(rect);
if(rect) {
s->disp_dimen = *rect;

View file

@ -16,7 +16,6 @@
* You should have received a copy of the GNU Lesser General Public License
* along with MiracleCast; If not, see <http://www.gnu.org/licenses/>.
*/
#include <assert.h>
#include <time.h>
#include <systemd/sd-event.h>
#include "ctl.h"
@ -28,6 +27,8 @@ static int wfd_sink_set_session(struct wfd_sink *sink,
{
int r;
assert_ret(sink);
if(sink->session == session) {
return 0;
}
@ -58,9 +59,10 @@ int wfd_sink_new(struct wfd_sink **out,
{
struct wfd_sink *sink;
assert(out);
assert(peer);
assert(sube && wfd_sube_device_is_sink(sube));
assert_ret(out);
assert_ret(peer);
assert_ret(sube);
assert_ret(wfd_sube_device_is_sink(sube));
sink = calloc(1, sizeof(struct wfd_sink));
if(!sink) {
@ -98,16 +100,22 @@ void wfd_sink_free(struct wfd_sink *sink)
const char * wfd_sink_get_label(struct wfd_sink *sink)
{
assert_retv(sink, NULL);
return sink->label;
}
const union wfd_sube * wfd_sink_get_dev_info(struct wfd_sink *sink)
{
assert_retv(sink, NULL);
return &sink->dev_info;
}
struct ctl_peer * wfd_sink_get_peer(struct wfd_sink *sink)
{
assert_retv(sink, NULL);
return sink->peer;
}
@ -116,8 +124,8 @@ int wfd_sink_create_session(struct wfd_sink *sink, struct wfd_session **out)
int r;
_wfd_session_unref_ struct wfd_session *sess = NULL;
assert(sink);
assert(out);
assert_ret(sink);
assert_ret(out);
if(wfd_sink_is_session_started(sink)) {
return -EALREADY;
@ -146,7 +154,7 @@ int wfd_sink_create_session(struct wfd_sink *sink, struct wfd_session **out)
int wfd_fn_out_session_ended(struct wfd_session *s)
{
assert(wfd_is_out_session(s));
assert_ret(wfd_is_out_session(s));
wfd_sink_set_session(wfd_out_session_get_sink(s), NULL);
@ -155,5 +163,7 @@ int wfd_fn_out_session_ended(struct wfd_session *s)
bool wfd_sink_is_session_started(struct wfd_sink *sink)
{
assert_retv(sink, false);
return NULL != sink->session;
}

View file

@ -236,4 +236,13 @@ extern const char *LOG_SUBSYSTEM;
#define log_vEUNMANAGED() \
((void)log_EUNMANAGED())
#define assert_ret(c) \
if(!(c)) return (log_error("assertion " #c " failed"), -EINVAL)
#define assert_retv(c, v) \
if(!(c)) return (log_error("assertion " #c " failed"), (v))
#define assert_vret(c) \
if(!(c)) { log_error("assertion " #c " failed"); return; }
#endif /* SHL_LOG_H */