From ae0520e57267dbd866fc8cd25f66f4e6af2ac118 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Mon, 13 Jul 2020 15:59:30 +0200 Subject: Move c files into src directory --- src/transmission.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/transmission.c (limited to 'src/transmission.c') diff --git a/src/transmission.c b/src/transmission.c new file mode 100644 index 0000000..0acb5a5 --- /dev/null +++ b/src/transmission.c @@ -0,0 +1,81 @@ +#include "transmission.h" +#include "program.h" +#include "buffer.h" +#include +#include +#include +#include + +#define NUM_COLUMNS 10 + +int transmission_is_daemon_running() { + const char *args[] = { "transmission-remote", "-si", NULL }; + return program_exec(args, NULL, NULL); +} + +int transmission_start_daemon() { + /* TODO: Make seed ratio configurable */ + const char *args[] = { "transmission-daemon", "--global-seedratio", "2.0", "--download-dir", NULL }; + int res = program_exec(args, NULL, NULL); + if(res != 0) + return res; + + fprintf(stderr, "Waiting for the transmission daemon to startup...\n"); + while(transmission_is_daemon_running()) { + const useconds_t one_hundred_ms = 1000 * 1000 * 100; + usleep(one_hundred_ms); + } + fprintf(stderr, "The transmission daemon is now running!\n"); + return 0; +} + +int transmission_add_torrent(const char *url) { + const char *args[] = { "transmission-remote", "-a", "--", url, NULL }; + return program_exec(args, NULL, NULL); +} + +int transmission_get_all_torrents(TorrentListCallback callback, void *userdata) { + int result = 0; + + Buffer buffer; + buffer_init(&buffer); + + const char *args[] = { "transmission-remote", "--list", NULL }; + int exec_res = program_exec(args, program_buffer_write_callback, &buffer); + if(exec_res != 0) { + result = exec_res; + goto cleanup; + } + buffer_append(&buffer, "0", 1); + + char id[6]; + char done[6]; + char have[13]; + char format[7]; + char eta[33]; + char up[11]; + char down[11]; + char ratio[11]; + char status[33]; + char name[256]; + + char *end_of_first_line = strchr(buffer.data, '\n'); + if(!end_of_first_line) + goto cleanup; + + int num_bytes_read = 0; + size_t offset = end_of_first_line - (char*)buffer.data; + while(offset < buffer.size) { + /* ID, Done, Have (size, format), ETA, Up, Down, Ratio, Status, Name */ + int res = sscanf(buffer.data + offset, "%5s %5s %12s %6s %32s %10s %10s %10s %32s %[^\n] %n", id, done, have, format, eta, up, down, ratio, status, name, &num_bytes_read); + if(res == EOF || res != NUM_COLUMNS) + break; + /*printf("id: %s, done: %s, have: %s, format: %s, eta: %s, up: %s, down: %s, ratio: %s, status: %s, name: %s\n", id, done, have, format, eta, up, down, ratio, status, name);*/ + callback(atoi(id), atof(done), name, userdata); + offset += num_bytes_read; + } + + cleanup: + buffer_deinit(&buffer); + return result; +} -- cgit v1.2.3