Commit Diff


commit - 50e0da0e7f8e07ab5d5c970ebca132a49b5fdbd8
commit + 9307af9e3cb00ecb2647b4a62818fb728ca05dd4
blob - a564ad9a76e0273f9f5f0df79e9d1725d8f655c1
blob + b4c6b13bb50662e21b5c2c07350b4534676818f0
--- amused.c
+++ amused.c
@@ -103,6 +103,7 @@ main_dispatch_player(int sig, int event, void *d)
 	struct imsgev	*iev = d;
 	struct imsgbuf	*imsgbuf = &iev->imsgbuf;
 	struct imsg	 imsg;
+	struct ibuf	 ibuf;
 	size_t		 datalen;
 	ssize_t		 n;
 	int		 shut = 0;
@@ -126,32 +127,28 @@ main_dispatch_player(int sig, int event, void *d)
 		if (n == 0)	/* No more messages. */
 			break;
 
-		datalen = IMSG_DATA_SIZE(imsg);
 		switch (imsg.hdr.type) {
 		case IMSG_POS:
-			if (datalen != sizeof(current_position))
-				fatalx("IMSG_POS: got wrong size (%zu vs %zu)",
-				    datalen, sizeof(current_position));
-			memcpy(&current_position, imsg.data,
-			    sizeof(current_position));
+			if (imsg_get_data(&imsg, &current_position,
+			    sizeof(current_position)) == -1)
+				fatalx("IMSG_POS: got wrong size");
 			if (current_position < 0)
 				current_position = -1;
 			control_notify(IMSG_CTL_SEEK);
 			break;
 		case IMSG_LEN:
-			if (datalen != sizeof(current_duration))
-				fatalx("IMSG_LEN: got wrong size (%zu vs %zu)",
-				    datalen, sizeof(current_duration));
-			memcpy(&current_duration, imsg.data,
-			    sizeof(current_duration));
+			if (imsg_get_data(&imsg, &current_duration,
+			    sizeof(current_duration)) == -1)
+				fatalx("IMSG_LEN: got wrong size");
 			if (current_duration < 0)
 				current_duration = -1;
 			break;
 		case IMSG_ERR:
-			if (datalen == 0)
+			if (imsg_get_ibuf(&imsg, &ibuf) == -1 ||
+			    (datalen = ibuf_size(&ibuf)) == 0)
 				errstr = "unknown error";
 			else {
-				errstr = imsg.data;
+				errstr = ibuf_data(&ibuf);
 				errstr[datalen-1] = '\0';
 			}
 			log_warnx("%s; skipping %s", errstr, current_song);
@@ -425,17 +422,14 @@ main_play_song(const char *path)
 void
 main_playlist_jump(struct imsgev *iev, struct imsg *imsg)
 {
-	size_t datalen;
 	char arg[PATH_MAX];
 	const char *song;
 
-	datalen = IMSG_DATA_SIZE(*imsg);
-	if (datalen != sizeof(arg)) {
+	if (imsg_get_data(imsg, arg, sizeof(arg)) == -1) {
 		main_senderr(iev, "wrong size");
 		return;
 	}
 
-	memcpy(arg, imsg->data, sizeof(arg));
 	if (arg[sizeof(arg)-1] != '\0') {
 		main_senderr(iev, "data corrupted");
 		return;
@@ -521,18 +515,15 @@ void
 main_enqueue(int tx, struct playlist *px, struct imsgev *iev,
     struct imsg *imsg)
 {
-	size_t datalen;
 	char path[PATH_MAX];
 	const char *err = NULL;
 
-	datalen = IMSG_DATA_SIZE(*imsg);
-	if (datalen != sizeof(path)) {
+	if (imsg_get_data(imsg, path, sizeof(path)) == -1) {
 		err = "data size mismatch";
 		goto err;
 	}
 
-	memcpy(path, imsg->data, sizeof(path));
-	if (path[datalen-1] != '\0') {
+	if (path[sizeof(path)-1] != '\0') {
 		err = "malformed data";
 		goto err;
 	}
blob - 988d2bcd20786c9e57b0a22d5009d482ff7259d8
blob + 9d5e547e17bd94286648f3a42a40c7e637c55821
--- control.c
+++ control.c
@@ -378,11 +378,10 @@ control_dispatch_imsg(int fd, int event, void *bula)
 			main_playlist_jump(&c->iev, &imsg);
 			break;
 		case IMSG_CTL_MODE:
-			if (IMSG_DATA_SIZE(imsg) != sizeof(mode)) {
+			if (imsg_get_data(&imsg, &mode, sizeof(mode)) == -1) {
 				log_warnx("%s: got wrong size", __func__);
 				break;
 			}
-			memcpy(&mode, imsg.data, sizeof(mode));
 			consume = new_mode(consume, mode.consume);
 			repeat_all = new_mode(repeat_all, mode.repeat_all);
 			repeat_one = new_mode(repeat_one, mode.repeat_one);
@@ -413,11 +412,10 @@ control_dispatch_imsg(int fd, int event, void *bula)
 				main_senderr(&c->iev, "locked");
 				break;
 			}
-			if (IMSG_DATA_SIZE(imsg) != sizeof(off)) {
+			if (imsg_get_data(&imsg, &off, sizeof(off)) == -1) {
 				main_senderr(&c->iev, "wrong size");
 				break;
 			}
-			memcpy(&off, imsg.data, sizeof(off));
 			playlist_swap(&control_state.play, off);
 			memset(&control_state.play, 0,
 			    sizeof(control_state.play));
@@ -430,11 +428,10 @@ control_dispatch_imsg(int fd, int event, void *bula)
 			c->monitor = 1;
 			break;
 		case IMSG_CTL_SEEK:
-			if (IMSG_DATA_SIZE(imsg) != sizeof(seek)) {
+			if (imsg_get_data(&imsg, &seek, sizeof(seek)) == -1) {
 				main_senderr(&c->iev, "wrong size");
 				break;
 			}
-			memcpy(&seek, imsg.data, sizeof(seek));
 			main_seek(&seek);
 			break;
 		default:
blob - 465d6a472c51cdb319d512a85f9bb2ee5280c1e7
blob + cb65f159136ceeccc6d056e7c9214215f8d47380
--- ctl.c
+++ ctl.c
@@ -215,12 +215,14 @@ load_files(struct parse_result *res, int *ret)
 static const char *
 imsg_strerror(struct imsg *imsg)
 {
+	struct ibuf ibuf;
 	size_t datalen;
 	const char *msg;
 
-	datalen = IMSG_DATA_SIZE(*imsg);
-	msg = imsg->data;
-	if (datalen == 0 || msg[datalen-1] != '\0')
+	if (imsg_get_ibuf(imsg, &ibuf) == -1 ||
+	    (datalen = ibuf_size(&ibuf)) == 0 ||
+	    (msg = ibuf_data(&ibuf)) == NULL ||
+	    msg[datalen - 1] != '\0')
 		fatalx("malformed error message");
 
 	return msg;
@@ -361,7 +363,6 @@ ctlaction(struct parse_result *res)
 	struct imsg imsg;
 	struct player_status ps;
 	struct player_event ev;
-	size_t datalen;
 	ssize_t n;
 	int i, ret = 0, done = 1;
 
@@ -497,8 +498,6 @@ ctlaction(struct parse_result *res)
 				done = 1;
 				break;
 			}
-
-			datalen = IMSG_DATA_SIZE(imsg);
 
 			switch (res->action) {
 			case ADD:
@@ -515,13 +514,13 @@ ctlaction(struct parse_result *res)
 				done = res->files[i] == NULL;
 				break;
 			case SHOW:
-				if (datalen == 0) {
+				if (imsg_get_len(&imsg) == 0) {
 					done = 1;
 					break;
 				}
-				if (datalen != sizeof(ps))
+				if (imsg_get_data(&imsg, &ps, sizeof(ps))
+				    == -1)
 					fatalx("data size mismatch");
-				memcpy(&ps, imsg.data, sizeof(ps));
 				if (ps.path[sizeof(ps.path) - 1] != '\0')
 					fatalx("received corrupted data");
 				if (res->pretty) {
@@ -543,9 +542,9 @@ ctlaction(struct parse_result *res)
 					fatalx("invalid message %d",
 					    imsg.hdr.type);
 
-				if (datalen != sizeof(ps))
+				if (imsg_get_data(&imsg, &ps, sizeof(ps))
+				    == -1)
 					fatalx("data size mismatch");
-				memcpy(&ps, imsg.data, sizeof(ps));
 				if (ps.path[sizeof(ps.path) - 1] != '\0')
 					fatalx("received corrupted data");
 
@@ -571,10 +570,10 @@ ctlaction(struct parse_result *res)
 					fatalx("invalid message %d",
 					    imsg.hdr.type);
 
-				if (datalen != sizeof(ev))
+				if (imsg_get_data(&imsg, &ev, sizeof(ev))
+				    == -1)
 					fatalx("data size mismatch");
 
-				memcpy(&ev, imsg.data, sizeof(ev));
 				if (ev.event < 0 || ev.event > IMSG__LAST)
 					fatalx("received corrupted data");
 
blob - 856bac10e35258f4711b55437794f4e815427be0
blob + 9270889eb3a67de7cfa82fc7a63d2f9e198ac5a5
--- player.c
+++ player.c
@@ -142,9 +142,8 @@ again:
 	case IMSG_CTL_SEEK:
 		if (s == NULL)
 			break;
-		if (IMSG_DATA_SIZE(imsg) != sizeof(seek))
+		if (imsg_get_data(&imsg, &seek, sizeof(seek)) == -1)
 			fatalx("wrong size for seek ctl");
-		memcpy(&seek, imsg.data, sizeof(seek));
 		if (seek.percent)
 			*s = (double)seek.offset * (double)duration / 100.0;
 		else
blob - 8e365099a89783bf8a46797ee6c04fe3e0610a28
blob + 77c66abdeb8de47549a767232c6a8ff8264bdfdc
--- web/web.c
+++ web/web.c
@@ -437,6 +437,7 @@ imsg_dispatch(int fd, int ev, void *d)
 	static int		 off_found;
 	char			 seekmsg[128];
 	struct imsg		 imsg;
+	struct ibuf		 ibuf;
 	struct player_status	 ps;
 	struct player_event	 event;
 	const char		*msg;
@@ -467,8 +468,10 @@ imsg_dispatch(int fd, int ev, void *d)
 
 		switch (imsg.hdr.type) {
 		case IMSG_CTL_ERR:
-			msg = imsg.data;
-			if (datalen == 0 || msg[datalen - 1] != '\0')
+			if (imsg_get_ibuf(&imsg, &ibuf) == -1 ||
+			    (datalen = ibuf_size(&ibuf)) == 0 ||
+			    (msg = ibuf_data(&ibuf)) == NULL ||
+			    msg[datalen - 1] != '\0')
 				fatalx("malformed error message");
 			log_warnx("error: %s", msg);
 			break;
@@ -480,9 +483,8 @@ imsg_dispatch(int fd, int ev, void *d)
 			break;
 
 		case IMSG_CTL_MONITOR:
-			if (datalen != sizeof(event))
+			if (imsg_get_data(&imsg, &event, sizeof(event)) == -1)
 				fatalx("corrupted IMSG_CTL_MONITOR");
-			memcpy(&event, imsg.data, sizeof(event));
 			switch (event.event) {
 			case IMSG_CTL_PLAY:
 			case IMSG_CTL_PAUSE:
@@ -522,7 +524,7 @@ imsg_dispatch(int fd, int ev, void *d)
 			break;
 
 		case IMSG_CTL_SHOW:
-			if (datalen == 0) {
+			if (imsg_get_len(&imsg) == 0) {
 				if (playlist_tmp.len == 0) {
 					dispatch_event("x:");
 					off = -1;
@@ -535,9 +537,8 @@ imsg_dispatch(int fd, int ev, void *d)
 				off_found = 0;
 				break;
 			}
-			if (datalen != sizeof(ps))
+			if (imsg_get_data(&imsg, &ps, sizeof(ps)) == -1)
 				fatalx("corrupted IMSG_CTL_SHOW");
-			memcpy(&ps, imsg.data, sizeof(ps));
 			if (ps.path[sizeof(ps.path) - 1] != '\0')
 				fatalx("corrupted IMSG_CTL_SHOW");
 			if (playlist_tmp.len == 0)
@@ -551,9 +552,9 @@ imsg_dispatch(int fd, int ev, void *d)
 			break;
 
 		case IMSG_CTL_STATUS:
-			if (datalen != sizeof(player_status))
+			if (imsg_get_data(&imsg, &player_status,
+			    sizeof(player_status)) == -1)
 				fatalx("corrupted IMSG_CTL_STATUS");
-			memcpy(&player_status, imsg.data, datalen);
 			if (player_status.path[sizeof(player_status.path) - 1]
 			    != '\0')
 				fatalx("corrupted IMSG_CTL_STATUS");