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)
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) {
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;
}
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));
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);
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)) {
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 },
void player_remove_submenu(void)
{
g_dbus_client_unref(client);
+ transport_close();
}