Major rework to use cbchains on sockets.
[doldaconnect.git] / daemon / filenet.c
index 5e2b607..99e094a 100644 (file)
@@ -67,22 +67,18 @@ void killfnetnode(struct fnetnode *fn)
     if(fn->sk != NULL)
     {
        fn->sk->close = 1;
-       if(fn->sk->data == fn)
-       {
-           fn->sk->data = NULL;
-           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)
@@ -121,6 +117,8 @@ void putfnetnode(struct fnetnode *fn)
        free(fn->name);
     if(fn->sk != NULL)
        putsock(fn->sk);
+    if(fn->owner != NULL)
+       free(fn->owner);
     free(fn);
     numfnetnodes--;
 }
@@ -161,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)
@@ -183,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);
     }
 }
 
@@ -444,7 +443,7 @@ struct fnet *findfnet(wchar_t *name)
     return(fnet);
 }
 
-struct fnetnode *fnetinitconnect(wchar_t *name, char *addr, struct wcspair *args)
+struct fnetnode *fnetinitconnect(wchar_t *name, wchar_t *owner, char *addr, struct wcspair *args)
 {
     struct fnet *fnet;
     struct fnetnode *fn;
@@ -456,6 +455,7 @@ struct fnetnode *fnetinitconnect(wchar_t *name, char *addr, struct wcspair *args
        return(NULL);
     }
     fn = newfn(fnet);
+    fn->owner = swcsdup(owner);
     fn->pubid = icmbstowcs(addr, NULL);
     if(fn->pubid == NULL)
        fn->pubid = swcsdup(L"");