From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> This adds transport.receive command: Get/Set file to receive Usage: receive [filename] --- client/player.c | 57 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/client/player.c b/client/player.c index 315cde712..c2c10e7e2 100644 --- a/client/player.c +++ b/client/player.c @@ -81,10 +81,13 @@ static GList *transports = NULL; struct transport { int sk; int mtu[2]; + char *filename; + int fd; struct io *io; uint32_t seq; } transport = { .sk = -1, + .fd = -1, }; static void endpoint_unregister(void *data) @@ -2219,7 +2222,7 @@ static bool transport_disconnected(struct io *io, void *user_data) static bool transport_recv(struct io *io, void *user_data) { uint8_t buf[1024]; - int ret; + int ret, len; ret = read(io_get_fd(io), buf, sizeof(buf)); if (ret < 0) { @@ -2232,6 +2235,13 @@ static bool transport_recv(struct io *io, void *user_data) transport.seq++; + if (transport.fd) { + len = write(transport.fd, buf, ret); + if (len < 0) + bt_shell_printf("Unable to write: %s (%d)", + strerror(errno), -errno); + } + return true; } @@ -2451,13 +2461,17 @@ static void cmd_release_transport(int argc, char *argv[]) return bt_shell_noninteractive_quit(EXIT_SUCCESS); } -static int open_file(const char *filename) +static int open_file(const char *filename, int flags) { int fd = -1; bt_shell_printf("Opening %s ...\n", filename); - fd = open(filename, O_RDONLY); + if (flags & O_CREAT) + fd = open(filename, flags, 0755); + else + fd = open(filename, flags); + if (fd <= 0) bt_shell_printf("Can't open file %s: %s\n", filename, strerror(errno)); @@ -2514,7 +2528,7 @@ static void cmd_send_transport(int argc, char *argv[]) return bt_shell_noninteractive_quit(EXIT_FAILURE); } - fd = open_file(argv[1]); + fd = open_file(argv[1], O_RDONLY); bt_shell_printf("Sending ...\n"); err = transport_send(fd); @@ -2527,6 +2541,38 @@ static void cmd_send_transport(int argc, char *argv[]) return bt_shell_noninteractive_quit(EXIT_SUCCESS); } +static void transport_close(void) +{ + if (transport.fd < 0) + return; + + close(transport.fd); + transport.fd = -1; + + free(transport.filename); + transport.filename = NULL; +} + +static void cmd_receive_transport(int argc, char *argv[]) +{ + if (argc == 1) { + bt_shell_printf("Filename: %s\n", transport.filename); + return bt_shell_noninteractive_quit(EXIT_SUCCESS); + } + + transport_close(); + + transport.fd = open_file(argv[1], O_RDWR | O_CREAT); + if (transport.fd < 0) + return bt_shell_noninteractive_quit(EXIT_FAILURE); + + transport.filename = strdup(argv[1]); + + bt_shell_printf("Filename: %s\n", transport.filename); + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); +} + static void volume_callback(const DBusError *error, void *user_data) { if (dbus_error_is_set(error)) { @@ -2589,6 +2635,8 @@ static const struct bt_shell_menu transport_menu = { transport_generator }, { "send", "<filename>", cmd_send_transport, "Send contents of a file" }, + { "receive", "[filename]", cmd_receive_transport, + "Get/Set file to receive" }, { "volume", "<transport> [value]", cmd_volume_transport, "Get/Set transport volume", transport_generator }, @@ -2617,4 +2665,5 @@ void player_add_submenu(void) void player_remove_submenu(void) { g_dbus_client_unref(client); + transport_close(); } -- 2.35.1