code comments

This commit is contained in:
Olaf Rempel 2009-02-24 12:26:37 +01:00
parent 59b458a2f7
commit ed7b11726b

View File

@ -33,8 +33,12 @@
static LIST_HEAD(torrent_list); static LIST_HEAD(torrent_list);
struct torrent_file { struct torrent_file {
/* list of torrent files */
struct list_head list; struct list_head list;
/* list of clients in this cloud */
struct list_head client_list; struct list_head client_list;
char *name; char *name;
}; };
@ -45,16 +49,20 @@ struct client_con {
struct event_fd *event; struct event_fd *event;
struct linebuffer *lbuf; struct linebuffer *lbuf;
/* current bandwidth up/down */
int bw_up; int bw_up;
int bw_dn; int bw_dn;
/* total bytes up/down */
unsigned long long total_up; unsigned long long total_up;
unsigned long long total_dn; unsigned long long total_dn;
/* clients cloud view */
int chunk_total; int chunk_total;
int chunk_avail; int chunk_avail;
int chunk_have; int chunk_have;
/* timestamp when this client completed */
long completed; long completed;
struct torrent_file *torrent; struct torrent_file *torrent;
@ -62,21 +70,25 @@ struct client_con {
static struct torrent_file * find_create_torrent(const char *filename) static struct torrent_file * find_create_torrent(const char *filename)
{ {
/* search for this torrent */
struct torrent_file *torrent; struct torrent_file *torrent;
list_for_each_entry(torrent, &torrent_list, list) { list_for_each_entry(torrent, &torrent_list, list) {
if (strcmp(torrent->name, filename) == 0) if (strcmp(torrent->name, filename) == 0)
return torrent; return torrent;
} }
/* create a new one */
torrent = malloc(sizeof(struct torrent_file) + strlen(filename)); torrent = malloc(sizeof(struct torrent_file) + strlen(filename));
if (torrent == NULL) { if (torrent == NULL) {
log_print(LOG_WARN, "find_create_torrent(): out of memory"); log_print(LOG_WARN, "find_create_torrent(): out of memory");
return NULL; return NULL;
} }
/* init fields */
INIT_LIST_HEAD(&torrent->client_list); INIT_LIST_HEAD(&torrent->client_list);
torrent->name = strdup(filename); torrent->name = strdup(filename);
/* keep torrent list sorted by name */
struct torrent_file *search; struct torrent_file *search;
list_for_each_entry(search, &torrent_list, list) list_for_each_entry(search, &torrent_list, list)
if (strcmp(search->name, torrent->name) > 0) if (strcmp(search->name, torrent->name) > 0)
@ -107,6 +119,7 @@ static int data_cb(int fd, void *privdata)
{ {
struct client_con *con = (struct client_con *)privdata; struct client_con *con = (struct client_con *)privdata;
/* get data from socket */
if (linebuffer_readfd(con->lbuf, fd) < 0) { if (linebuffer_readfd(con->lbuf, fd) < 0) {
free_client(con); free_client(con);
return -1; return -1;
@ -114,6 +127,7 @@ static int data_cb(int fd, void *privdata)
char *line; char *line;
while ((line = linebuffer_getline(con->lbuf, NULL)) != NULL) { while ((line = linebuffer_getline(con->lbuf, NULL)) != NULL) {
/* bandwidth update */
if (strncmp(line, "CTBW ", 5) == 0) { if (strncmp(line, "CTBW ", 5) == 0) {
int bwup, bwdn, liup, lidn; int bwup, bwdn, liup, lidn;
if (sscanf(line +5, "%d,%d %d,%d", &bwdn, &bwup, &lidn, &liup) == 4) { if (sscanf(line +5, "%d,%d %d,%d", &bwdn, &bwup, &lidn, &liup) == 4) {
@ -121,6 +135,7 @@ static int data_cb(int fd, void *privdata)
con->bw_dn = bwdn; con->bw_dn = bwdn;
} }
/* status update */
} else if (strncmp(line, "CTSTATUS ", 9) == 0) { } else if (strncmp(line, "CTSTATUS ", 9) == 0) {
int seeds1 = 0, seeds2 = 0, leech1 = 0, leech2 = 0, count = 0; int seeds1 = 0, seeds2 = 0, leech1 = 0, leech2 = 0, count = 0;
int chunk1 = 0, chunk2 = 0, chunk3 = 0, bwdn = 0, bwup = 0; int chunk1 = 0, chunk2 = 0, chunk3 = 0, bwdn = 0, bwup = 0;
@ -140,6 +155,7 @@ static int data_cb(int fd, void *privdata)
con->chunk_avail = chunk3; con->chunk_avail = chunk3;
} }
/* update torrent-file */
} else if (strncmp(line, "CTORRENT ", 9) == 0) { } else if (strncmp(line, "CTORRENT ", 9) == 0) {
char *filename = strrchr(line +9, ' '); char *filename = strrchr(line +9, ' ');
if (filename != NULL) { if (filename != NULL) {
@ -154,12 +170,13 @@ static int data_cb(int fd, void *privdata)
linebuffer_freeline(con->lbuf); linebuffer_freeline(con->lbuf);
} }
/* move completed clients to top of the list, ordered by their timestamp */ /* client completed? */
if (con->chunk_have == con->chunk_total && con->chunk_total != 0 && con->completed == 0) { if (con->chunk_have == con->chunk_total && con->chunk_total != 0 && con->completed == 0) {
con->completed = time(NULL); con->completed = time(NULL);
list_del(&con->list); list_del(&con->list);
/* sorted insert, completed on top of list, ordered by complete-timestamp */
struct client_con *search; struct client_con *search;
list_for_each_entry(search, &con->torrent->client_list, list) { list_for_each_entry(search, &con->torrent->client_list, list) {
if (search->completed == 0) if (search->completed == 0)
@ -232,6 +249,7 @@ int ctcs_accept_handler(int fd, void *privdata)
con->event = event_add_readfd(NULL, sockfd, data_cb, con); con->event = event_add_readfd(NULL, sockfd, data_cb, con);
/* assign default torrent */
con->torrent = find_create_torrent("[unknown]"); con->torrent = find_create_torrent("[unknown]");
list_add_tail(&con->list, &con->torrent->client_list); list_add_tail(&con->list, &con->torrent->client_list);
return 0; return 0;