#include "deluge.h" Peer * peernew(int npieces) { Peer *p; p = emalloc(sizeof p[0]); p->status = 0; p->n = -1; p->ip = nil; p->port = nil; memset(p->peerid, 0, sizeof p->peerid); p->fd = -1; p->pieces = bitnew(npieces, nil); p->rate = ratenew(60); setisinterested(p, 0); setisinteresting(p, 0); setischoked(p, 1); setischoking(p, 1); p->lreq = nil; p->rreq = nil; p->meta = nil; p->dataout = nil; p->write = chancreate(sizeof (Msg *), 0); p->changed = 0; p->lastchange = time(0); p->havefirst = 0; p->next = nil; return p; } void peerfree(Peer *p) { free(p->ip); free(p->port); bitfree(p->pieces); ratefree(p->rate); assert(p->lreq == nil); assert(p->rreq == nil); chanfree(p->write); assert(p->meta == nil); assert(p->dataout == nil); free(p); } int peerlen(Peer *p) { int i; for(i = 0; p; p = p->next) i++; return i; } void peeradd(Peer **fp, Peer *p) { Peer *p2; p->next = nil; if(*fp == nil){ *fp = p; }else{ for(p2 = *fp; p2 && p2->next; p2 = p2->next) ; p2->next = p; } } Peer * peerpop(Peer **firstp) { Peer *r; if(*firstp == nil) return nil; r = *firstp; *firstp = r->next; r->next = nil; return r; } Peer * peerfind(Peer *p, int n) { while(p){ if(p->n == n) return p; p = p->next; } return nil; } Peer * peermatch(Peer *first, Peer *p) { while(first){ if(memcmp(first->peerid, p->peerid, Peeridlen) == 0 || (strcmp(first->ip, p->ip) == 0 && strcmp(first->port, p->port) == 0)) return first; first = first->next; } return nil; } Peer * peermatchbyip(Peer *first, Peer *p) { while(first){ if(memcmp(first->peerid, p->peerid, Peeridlen) == 0 || strcmp(first->ip, p->ip) == 0) return first; first = first->next; } return nil; } void peersetstatus(Peer *p, uint mask, uint v) { if(v) p->status |= mask; else p->status &= ~mask; } void peerremove(Peer **fp, Peer *p) { Peer *p2; if(*fp == p) *fp = p->next; else for(p2 = *fp; p2 && p2->next; p2 = p2->next){ if(p2->next == p){ p2->next = p->next; return; } } p->next = nil; }