X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Ffilenet.c;h=18c74eff3351e2ce5eed8fcc64a14718224e6b38;hb=198e4c0866a8f9b607bdb4ddddf5739f4af9dfb2;hp=82ed1d2a571d6624f958bdffe7040473dba51051;hpb=ffa81d5f0167a81cc81e9eec69062f0aeaf7754a;p=doldaconnect.git diff --git a/daemon/filenet.c b/daemon/filenet.c index 82ed1d2..18c74ef 100644 --- a/daemon/filenet.c +++ b/daemon/filenet.c @@ -30,6 +30,8 @@ #include "utils.h" #include "net.h" +static void freepeer(struct fnetpeer *peer); + static struct fnet *networks = NULL; struct fnetnode *fnetnodes = NULL; int numfnetnodes = 0; @@ -76,6 +78,16 @@ void getfnetnode(struct fnetnode *fn) #endif } +static void freepeers(struct btree *n) +{ + if(n == NULL) + return; + freepeers(n->l); + freepeers(n->r); + freepeer(n->d); + free(n); +} + void putfnetnode(struct fnetnode *fn) { struct fnetnode *cur; @@ -102,8 +114,7 @@ void putfnetnode(struct fnetnode *fn) fn->fnet->destroy(fn); while(fn->args != NULL) freewcspair(fn->args, &fn->args); - while(fn->peers != NULL) - fnetdelpeer(fn->peers); + freepeers(fn->peers); if(fn->mynick != NULL) free(fn->mynick); if(fn->pubid != NULL) @@ -165,17 +176,21 @@ static void conncb(struct socket *sk, int err, struct fnetnode *data) data->fnet->connect(data, sk); data->connected = 1; putfnetnode(data); - putsock(sk); } static void resolvecb(struct sockaddr *addr, int addrlen, struct fnetnode *data) { - if(addr == NULL) + struct socket *sk; + + sk = NULL; + if(addr != NULL) + sk = netcsconn(addr, addrlen, (void (*)(struct socket *, int, void *))conncb, data); + if(sk == NULL) { killfnetnode(data); putfnetnode(data); } else { - netcsconn(addr, addrlen, (void (*)(struct socket *, int, void *))conncb, data); + putsock(sk); } } @@ -317,6 +332,11 @@ void fnetpeerunset(struct fnetpeer *peer, wchar_t *id) putdatum(peer, datum); } +static int peercmpid(void *a, void *b) +{ + return(wcscmp(((struct fnetpeer *)a)->id, ((struct fnetpeer *)b)->id)); +} + struct fnetpeer *fnetaddpeer(struct fnetnode *fn, wchar_t *id, wchar_t *nick) { struct fnetpeer *new; @@ -328,30 +348,18 @@ struct fnetpeer *fnetaddpeer(struct fnetnode *fn, wchar_t *id, wchar_t *nick) new->flags.w = 0; new->dinum = 0; new->peerdi = NULL; - new->next = fn->peers; - new->prev = NULL; - if(fn->peers != NULL) - fn->peers->prev = new; - fn->peers = new; + bbtreeput(&fn->peers, new, peercmpid); fn->numpeers++; CBCHAINDOCB(fn, fnetnode_ac, fn, L"numpeers"); CBCHAINDOCB(fn, fnetpeer_new, fn, new); return(new); } -void fnetdelpeer(struct fnetpeer *peer) +static void freepeer(struct fnetpeer *peer) { int i; - if(peer->next != NULL) - peer->next->prev = peer->prev; - if(peer->prev != NULL) - peer->prev->next = peer->next; - if(peer->fn->peers == peer) - peer->fn->peers = peer->next; peer->fn->numpeers--; - CBCHAINDOCB(peer->fn, fnetnode_ac, peer->fn, L"numpeers"); - CBCHAINDOCB(peer->fn, fnetpeer_del, peer->fn, peer); free(peer->id); free(peer->nick); for(i = 0; i < peer->dinum; i++) @@ -365,12 +373,43 @@ void fnetdelpeer(struct fnetpeer *peer) free(peer); } +void fnetdelpeer(struct fnetpeer *peer) +{ + bbtreedel(&peer->fn->peers, peer, peercmpid); + CBCHAINDOCB(peer->fn, fnetnode_ac, peer->fn, L"numpeers"); + CBCHAINDOCB(peer->fn, fnetpeer_del, peer->fn, peer); + freepeer(peer); +} + +void fnetpeerdm(struct fnetnode *fn) +{ + struct btree *new; + struct fnetpeer *peer; + int intact; + + new = NULL; + intact = 1; + for(peer = btreeiter(fn->peers); peer != NULL; peer = btreeiter(NULL)) { + if(!peer->flags.b.delete) { + bbtreeput(&new, peer, peercmpid); + } else { + intact = 0; + CBCHAINDOCB(peer->fn, fnetpeer_del, peer->fn, peer); + freepeer(peer); + } + } + btreefree(fn->peers); + fn->peers = new; + if(!intact) + CBCHAINDOCB(peer->fn, fnetnode_ac, peer->fn, L"numpeers"); +} + struct fnetpeer *fnetfindpeer(struct fnetnode *fn, wchar_t *id) { - struct fnetpeer *cur; + struct fnetpeer key; - for(cur = fn->peers; (cur != NULL) && wcscmp(cur->id, id); cur = cur->next); - return(cur); + key.id = id; + return(btreeget(fn->peers, &key, peercmpid)); } int fnetsetnick(struct fnetnode *fn, wchar_t *newnick) @@ -424,6 +463,15 @@ void fnetsetstate(struct fnetnode *fn, int newstate) CBCHAINDOCB(fn, fnetnode_ac, fn, L"state"); } +wchar_t *fnfilebasename(wchar_t *path) +{ + wchar_t *p; + + if((p = wcsrchr(path, L'/')) != NULL) + return(p + 1); + return(path); +} + struct fnet *findfnet(wchar_t *name) { struct fnet *fnet;