static void sockdebug(int level, struct socket *sk, char *format, ...)
{
va_list args;
+ char *tb;
- if((sk->dbgnm == NULL) || (level < sk->dbglvl))
+ if((sk->dbgnm == NULL) || (level > sk->dbglvl))
return;
va_start(args, format);
- vfprintf(stderr, format, args);
+ tb = vsprintf2(format, args);
va_end(args);
+ fprintf(stderr, "%s: %s\n", sk->dbgnm, tb);
+ free(tb);
}
void socksetdebug(struct socket *sk, int level, char *nm, ...)
free(tb);
sk->dbglvl = level;
sk->back->dbglvl = level;
+ sockdebug(1, sk, "enabled debugging");
}
static void freesock(struct socket *sk)
sk->buf.s.bufsize = sk->buf.s.datasize = 0;
sockread(sk);
}
- sockdebug(2, sk, "read %ji bytes", *size);
+ sockdebug(2, sk, "read %zi bytes", *size);
return(buf);
}
struct sockaddr *remote;
socklen_t remotelen;
- sockdebug(2, sk, "queued %ji bytes", size);
+ sockdebug(2, sk, "queued %zi bytes", size);
if(size == 0)
return;
if(sk->state == SOCK_STL)
memcpy(sk->ufd->d.s.remote = smalloc(addrlen), addr, sk->ufd->d.s.remotelen = addrlen);
sk->back->conncb = func;
sk->back->data = data;
+ getsock(sk->back);
+ putsock(sk);
if(!connect(sk->ufd->fd, addr, addrlen))
{
sksetstate(sk, SOCK_EST);
static void cleansocks(void)
{
struct ufd *ufd, *next;
+ int dead;
for(ufd = ufds; ufd != NULL; ufd = next) {
next = ufd->next;
- if(ufd->sk && ((ufd->fd < 0) || (sockgetdatalen(ufd->sk) == 0))) {
+ if(ufd->sk) {
+ dead = (ufd->fd < 0);
+ if(ufd->sk->state == SOCK_STL)
+ dead = 1;
+ if((ufd->sk->state == SOCK_EST) && (sockgetdatalen(ufd->sk) == 0))
+ dead = 1;
+ if(!dead)
+ continue;
if(ufd->sk->eos == 1) {
ufd->sk->eos = 2;
closeufd(ufd);