From: Fredrik Tolf <fredrik@dolda2000.com>
Date: Sun, 8 Jun 2008 15:27:35 +0000 (+0200)
Subject: Added socket debugging support.
X-Git-Tag: 1.3~17
X-Git-Url: http://git.dolda2000.com/gitweb/?a=commitdiff_plain;h=b2e73d7b835172abbc5e217b75faaa2daec2110d;p=doldaconnect.git

Added socket debugging support.
---

diff --git a/daemon/net.c b/daemon/net.c
index ed7ad9b..a9238cb 100644
--- a/daemon/net.c
+++ b/daemon/net.c
@@ -358,10 +358,37 @@ void getsock(struct socket *sk)
     sk->refcount++;
 }
 
+static void sockdebug(int level, struct socket *sk, char *format, ...)
+{
+    va_list args;
+    
+    if((sk->dbgnm == NULL) || (level < sk->dbglvl))
+	return;
+    va_start(args, format);
+    vfprintf(stderr, format, args);
+    va_end(args);
+}
+
+void socksetdebug(struct socket *sk, int level, char *nm, ...)
+{
+    va_list args;
+    char *tb;
+    
+    va_start(args, nm);
+    tb = vsprintf2(nm, args);
+    va_end(args);
+    sk->dbgnm = sprintf2("%s (f)", tb);
+    sk->back->dbgnm = sprintf2("%s (b)", tb);
+    free(tb);
+    sk->dbglvl = level;
+    sk->back->dbglvl = level;
+}
+
 static void freesock(struct socket *sk)
 {
     struct dgrambuf *buf;
     
+    sockdebug(1, sk, "freeing socket");
     if(sk->dgram) {
 	while((buf = sk->buf.d.f) != NULL) {
 	    sk->buf.d.f = buf->next;
@@ -371,6 +398,8 @@ static void freesock(struct socket *sk)
 	if(sk->buf.s.buf != NULL)
 	    free(sk->buf.s.buf);
     }
+    if(sk->dbgnm != NULL)
+	free(sk->dbgnm);
     free(sk);
     numsocks--;
 }
@@ -476,6 +505,7 @@ void *sockgetinbuf(struct socket *sk, size_t *size)
 	if((sk->buf.s.buf == NULL) || (sk->buf.s.datasize == 0))
 	{
 	    *size = 0;
+	    sockdebug(2, sk, "read 0 bytes", *size);
 	    return(NULL);
 	}
 	buf = sk->buf.s.buf;
@@ -484,6 +514,7 @@ void *sockgetinbuf(struct socket *sk, size_t *size)
 	sk->buf.s.bufsize = sk->buf.s.datasize = 0;
 	sockread(sk);
     }
+    sockdebug(2, sk, "read %ji bytes", *size);
     return(buf);
 }
 
@@ -493,6 +524,7 @@ void sockqueue(struct socket *sk, void *data, size_t size)
     struct sockaddr *remote;
     socklen_t remotelen;
     
+    sockdebug(2, sk, "queued %ji bytes", size);
     if(size == 0)
 	return;
     if(sk->state == SOCK_STL)
@@ -753,6 +785,7 @@ static int sockflush(struct ufd *ufd)
 
 void closesock(struct socket *sk)
 {
+    sockdebug(1, sk, "closed");
     sksetstate(sk, SOCK_STL);
     if(sk->back->eos == 0)
 	sk->back->eos = 1;
diff --git a/daemon/net.h b/daemon/net.h
index b539860..be0156e 100644
--- a/daemon/net.h
+++ b/daemon/net.h
@@ -66,6 +66,8 @@ struct socket
     void (*writecb)(struct socket *sk, void *data);
     struct ufd *ufd;
     void *data;
+    char *dbgnm;
+    int dbglvl;
 };
 
 struct lport {
@@ -111,5 +113,6 @@ int sockpeeraddr(struct socket *sk, struct sockaddr **namebuf, socklen_t *lenbuf
 int getucred(struct socket *sk, uid_t *uid, gid_t *gid);
 int sockfamily(struct socket *sk);
 void quitsock(struct socket *sk);
+void socksetdebug(struct socket *sk, int level, char *nm, ...);
 
 #endif