* cancelled.
*/
int ev_fd_enable(ev_source *ev, ev_fdmode mode, int fd) {
+ assert(fd >= 0);
D(("enabling mode %s fd %d", modenames[mode], fd));
FD_SET(fd, &ev->mode[mode].enabled);
return 0;
if(w->fd == -1)
return 0; /* already shut down */
- info("writer_shutdown fd=%d", w->fd);
+ info("writer_shutdown fd=%d error=%d", w->fd, w->error);
ev_timeout_cancel(ev, w->timeout);
ev_fd_cancel(ev, ev_write, w->fd);
w->timeout = 0;
if(!n)
return 0; /* avoid silliness */
+ if(w->fd == -1)
+ error(0, "ev_writer_write on %s after shutdown", w->what);
if(w->spacebound && w->b.end - w->b.start + n > w->spacebound) {
/* The new buffer contents will exceed the space bound. We assume that the
* remote client has gone away and TCP hasn't noticed yet, or that it's got
/*
* This file is part of DisOrder
- * Copyright (C) 2005 Richard Kettlewell
+ * Copyright (C) 2005, 2007 Richard Kettlewell
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
} else {
if(errno_value != EPIPE)
error(errno_value, "S%x write error on socket", c->tag);
- info("cancel reader");
- ev_reader_cancel(c->r);
+ if(c->r) {
+ info("cancel reader");
+ ev_reader_cancel(c->r);
+ c->r = 0;
+ }
info("done cancel reader");
}
+ c->w = 0;
ev_report(ev);
return 0;
}
D(("server reader_error %d", errno_value));
info("reader_error S%x %d", c->tag, errno_value);
error(errno_value, "S%x read error on socket", c->tag);
- ev_writer_close(c->w);
+ if(c->w)
+ ev_writer_close(c->w);
+ c->w = 0;
+ c->r = 0;
ev_report(ev);
return 0;
}
struct sockaddr_un addr;
static const int one = 1;
struct speaker_message sm;
+ const char *d;
set_progname(argv);
if(!setlocale(LC_CTYPE, "")) fatal(errno, "error calling setlocale");
default: fatal(0, "invalid option");
}
}
- if(getenv("DISORDER_DEBUG_SPEAKER")) debugging = 1;
+ if((d = getenv("DISORDER_DEBUG_SPEAKER"))) debugging = atoi(d);
/* If stderr is a TTY then log there, otherwise to syslog. */
if(!isatty(2)) {
openlog(progname, LOG_PID, LOG_DAEMON);