X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Ffilenet.c;h=99e094a618b994efa32de8308b21649357e66b82;hb=f5dbbe62975d51f5096e1b38c3d982e6af093d8b;hp=81a83c4d79ef60bb88ddc47018cb26db84246d92;hpb=d3372da97568d5e1f35fa19787c8ec8af93a0435;p=doldaconnect.git diff --git a/daemon/filenet.c b/daemon/filenet.c index 81a83c4..99e094a 100644 --- a/daemon/filenet.c +++ b/daemon/filenet.c @@ -52,6 +52,9 @@ static struct fnetnode *newfn(struct fnet *fnet) CBCHAININIT(new, fnetnode_chat); CBCHAININIT(new, fnetnode_unlink); CBCHAININIT(new, fnetnode_destroy); + CBCHAININIT(new, fnetpeer_new); + CBCHAININIT(new, fnetpeer_del); + CBCHAININIT(new, fnetpeer_chdi); new->next = NULL; new->prev = NULL; numfnetnodes++; @@ -64,19 +67,18 @@ void killfnetnode(struct fnetnode *fn) if(fn->sk != NULL) { fn->sk->close = 1; - if(fn->sk->data == fn) - putfnetnode(fn); putsock(fn->sk); fn->sk = NULL; } } -void getfnetnode(struct fnetnode *fn) +struct fnetnode *getfnetnode(struct fnetnode *fn) { fn->refcount++; #ifdef DEBUG fprintf(stderr, "getfnetnode on id %i at %p, refcount=%i\n", fn->id, fn, fn->refcount); #endif + return(fn); } void putfnetnode(struct fnetnode *fn) @@ -98,16 +100,25 @@ void putfnetnode(struct fnetnode *fn) CBCHAINFREE(fn, fnetnode_chat); CBCHAINFREE(fn, fnetnode_unlink); CBCHAINFREE(fn, fnetnode_destroy); + CBCHAINFREE(fn, fnetpeer_new); + CBCHAINFREE(fn, fnetpeer_del); + CBCHAINFREE(fn, fnetpeer_chdi); if(fn->fnet->destroy != NULL) fn->fnet->destroy(fn); + while(fn->args != NULL) + freewcspair(fn->args, &fn->args); while(fn->peers != NULL) fnetdelpeer(fn->peers); if(fn->mynick != NULL) free(fn->mynick); + if(fn->pubid != NULL) + free(fn->pubid); if(fn->name != NULL) free(fn->name); if(fn->sk != NULL) putsock(fn->sk); + if(fn->owner != NULL) + free(fn->owner); free(fn); numfnetnodes--; } @@ -148,19 +159,20 @@ void unlinkfnetnode(struct fnetnode *fn) putfnetnode(fn); } -static void conncb(struct socket *sk, int err, struct fnetnode *data) +static int conncb(struct socket *sk, int err, struct fnetnode *data) { if(err != 0) { killfnetnode(data); putfnetnode(data); - return; + return(1); } data->sk = sk; fnetsetstate(data, FNN_HS); socksettos(sk, confgetint("fnet", "fntos")); data->fnet->connect(data); putfnetnode(data); + return(1); } static void resolvecb(struct sockaddr *addr, int addrlen, struct fnetnode *data) @@ -170,7 +182,7 @@ static void resolvecb(struct sockaddr *addr, int addrlen, struct fnetnode *data) killfnetnode(data); putfnetnode(data); } else { - netcsconn(addr, addrlen, (void (*)(struct socket *, int, void *))conncb, data); + netcsconn(addr, addrlen, (int (*)(struct socket *, int, void *))conncb, data); } } @@ -202,7 +214,7 @@ static struct fnetpeerdatum *adddatum(struct fnetnode *fn, wchar_t *id, int data return(new); } -static struct fnetpeerdi *difindoradd(struct fnetpeer *peer, struct fnetpeerdatum *datum) +static struct fnetpeerdi *difindoradd(struct fnetpeer *peer, struct fnetpeerdatum *datum, int *isnew) { int i; @@ -217,8 +229,12 @@ static struct fnetpeerdi *difindoradd(struct fnetpeer *peer, struct fnetpeerdatu memset(&peer->peerdi[peer->dinum], 0, sizeof(struct fnetpeerdi)); peer->peerdi[peer->dinum].datum = datum; datum->refcount++; + if(isnew != NULL) + *isnew = 1; return(&peer->peerdi[peer->dinum++]); } else { + if(isnew != NULL) + *isnew = 0; return(&peer->peerdi[i]); } } @@ -227,35 +243,50 @@ void fnetpeersetstr(struct fnetpeer *peer, wchar_t *id, wchar_t *value) { struct fnetpeerdatum *datum; struct fnetpeerdi *di; + int changed; if((datum = finddatum(peer->fn, id)) == NULL) datum = adddatum(peer->fn, id, FNPD_STR); - di = difindoradd(peer, datum); - if(di->data.str != NULL) + di = difindoradd(peer, datum, &changed); + if(di->data.str != NULL) { + changed = (changed || wcscmp(value, di->data.str)); free(di->data.str); + } else { + changed = 1; + } di->data.str = swcsdup(value); + if(changed) + CBCHAINDOCB(peer->fn, fnetpeer_chdi, peer->fn, peer, di); } void fnetpeersetnum(struct fnetpeer *peer, wchar_t *id, int value) { struct fnetpeerdatum *datum; struct fnetpeerdi *di; + int changed; if((datum = finddatum(peer->fn, id)) == NULL) datum = adddatum(peer->fn, id, FNPD_INT); - di = difindoradd(peer, datum); + di = difindoradd(peer, datum, &changed); + changed = (changed || (di->data.num != value)); di->data.num = value; + if(changed) + CBCHAINDOCB(peer->fn, fnetpeer_chdi, peer->fn, peer, di); } void fnetpeersetlnum(struct fnetpeer *peer, wchar_t *id, long long value) { struct fnetpeerdatum *datum; struct fnetpeerdi *di; + int changed; if((datum = finddatum(peer->fn, id)) == NULL) datum = adddatum(peer->fn, id, FNPD_LL); - di = difindoradd(peer, datum); + di = difindoradd(peer, datum, &changed); + changed = (changed || (di->data.lnum != value)); di->data.lnum = value; + if(changed) + CBCHAINDOCB(peer->fn, fnetpeer_chdi, peer->fn, peer, di); } static void putdatum(struct fnetpeer *peer, struct fnetpeerdatum *datum) @@ -311,6 +342,7 @@ struct fnetpeer *fnetaddpeer(struct fnetnode *fn, wchar_t *id, wchar_t *nick) fn->peers = new; fn->numpeers++; CBCHAINDOCB(fn, fnetnode_ac, fn, L"numpeers"); + CBCHAINDOCB(fn, fnetpeer_new, fn, new); return(new); } @@ -326,6 +358,7 @@ void fnetdelpeer(struct fnetpeer *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++) @@ -410,10 +443,11 @@ struct fnet *findfnet(wchar_t *name) return(fnet); } -struct fnetnode *fnetinitconnect(wchar_t *name, char *addr) +struct fnetnode *fnetinitconnect(wchar_t *name, wchar_t *owner, char *addr, struct wcspair *args) { struct fnet *fnet; struct fnetnode *fn; + struct wcspair *arg; if((fnet = findfnet(name)) == NULL) { @@ -421,6 +455,16 @@ struct fnetnode *fnetinitconnect(wchar_t *name, char *addr) return(NULL); } fn = newfn(fnet); + fn->owner = swcsdup(owner); + fn->pubid = icmbstowcs(addr, NULL); + if(fn->pubid == NULL) + fn->pubid = swcsdup(L""); + fn->args = args; + for(arg = fn->args; arg != NULL; arg = arg->next) + { + if(!wcscmp(arg->key, L"nick")) + fnetsetnick(fn, arg->val); + } getfnetnode(fn); if(netresolve(addr, (void (*)(struct sockaddr *, int, void *))resolvecb, fn) < 0) return(NULL); @@ -458,6 +502,7 @@ static struct configvar myvars[] = {CONF_VAR_INT, "srchwait", {.num = 15}}, {CONF_VAR_INT, "fntos", {.num = 0}}, {CONF_VAR_INT, "fnptos", {.num = 0}}, + {CONF_VAR_INT, "maxnodes", {.num = 0}}, {CONF_VAR_END} };