Dolda2000 GitWeb
/
ashd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
python: Make scgi-wsgi{,3} use ashd.serve.
[ashd.git]
/
src
/
htparser.c
diff --git
a/src/htparser.c
b/src/htparser.c
index
e6f545a
..
8d0b515
100644
(file)
--- a/
src/htparser.c
+++ b/
src/htparser.c
@@
-41,6
+41,7
@@
static int plex;
static char *pidfile = NULL;
static int daemonize, usesyslog;
static int plex;
static char *pidfile = NULL;
static int daemonize, usesyslog;
+struct mtbuf listeners;
static void trimx(struct hthead *req)
{
static void trimx(struct hthead *req)
{
@@
-290,7
+291,7
@@
void serve(FILE *in, struct conn *conn)
out = NULL;
req = resp = NULL;
out = NULL;
req = resp = NULL;
- while(
1
) {
+ while(
plex >= 0
) {
if((req = parsereq(in)) == NULL)
break;
if(!canonreq(req))
if((req = parsereq(in)) == NULL)
break;
if(!canonreq(req))
@@
-299,7
+300,7
@@
void serve(FILE *in, struct conn *conn)
if((conn->initreq != NULL) && conn->initreq(conn, req))
break;
if((conn->initreq != NULL) && conn->initreq(conn, req))
break;
- if(block(plex, EV_WRITE, 60) <= 0)
+ if(
(plex < 0) ||
block(plex, EV_WRITE, 60) <= 0)
break;
if(socketpair(PF_UNIX, SOCK_STREAM, 0, pfds))
break;
break;
if(socketpair(PF_UNIX, SOCK_STREAM, 0, pfds))
break;
@@
-404,22
+405,33
@@
static void plexwatch(struct muth *muth, va_list args)
{
vavar(int, fd);
char *buf;
{
vavar(int, fd);
char *buf;
- int ret;
+ int
i,
ret;
while(1) {
while(1) {
- block(fd, EV_READ, 0);
+ if(block(fd, EV_READ, 0) == 0)
+ break;
buf = smalloc(65536);
ret = recv(fd, buf, 65536, 0);
if(ret < 0) {
flog(LOG_WARNING, "received error on rootplex read channel: %s", strerror(errno));
exit(1);
} else if(ret == 0) {
buf = smalloc(65536);
ret = recv(fd, buf, 65536, 0);
if(ret < 0) {
flog(LOG_WARNING, "received error on rootplex read channel: %s", strerror(errno));
exit(1);
} else if(ret == 0) {
- exit(0);
+ free(buf);
+ break;
}
/* Maybe I'd like to implement some protocol in this direction
* some day... */
free(buf);
}
}
/* Maybe I'd like to implement some protocol in this direction
* some day... */
free(buf);
}
+ close(plex);
+ plex = -1;
+ for(i = 0; i < listeners.d; i++) {
+ if(listeners.b[i] == muth)
+ bufdel(listeners, i);
+ }
+ flog(LOG_INFO, "root handler exited, so shutting down listening...");
+ while(listeners.d > 0)
+ resume(listeners.b[0], 0);
}
static void initroot(void *uu)
}
static void initroot(void *uu)
@@
-494,9
+506,14
@@
static void addport(char *spec)
buffree(vals);
}
buffree(vals);
}
+static void sighandler(int sig)
+{
+ exitioloop(1);
+}
+
int main(int argc, char **argv)
{
int main(int argc, char **argv)
{
- int c;
+ int c
, d
;
int i, s1;
char *root;
FILE *pidout;
int i, s1;
char *root;
FILE *pidout;
@@
-548,7
+565,7
@@
int main(int argc, char **argv)
flog(LOG_ERR, "could not spawn root multiplexer: %s", strerror(errno));
return(1);
}
flog(LOG_ERR, "could not spawn root multiplexer: %s", strerror(errno));
return(1);
}
-
mustart(plexwatch, plex
);
+
bufadd(listeners, mustart(plexwatch, plex)
);
pidout = NULL;
if(pidfile != NULL) {
if((pidout = fopen(pidfile, "w")) == NULL) {
pidout = NULL;
if(pidfile != NULL) {
if((pidout = fopen(pidfile, "w")) == NULL) {
@@
-575,6
+592,9
@@
int main(int argc, char **argv)
}
}
signal(SIGPIPE, SIG_IGN);
}
}
signal(SIGPIPE, SIG_IGN);
+ signal(SIGCHLD, SIG_IGN);
+ signal(SIGINT, sighandler);
+ signal(SIGTERM, sighandler);
if(daemonize) {
daemon(0, 0);
}
if(daemonize) {
daemon(0, 0);
}
@@
-582,6
+602,22
@@
int main(int argc, char **argv)
fprintf(pidout, "%i\n", getpid());
fclose(pidout);
}
fprintf(pidout, "%i\n", getpid());
fclose(pidout);
}
- ioloop();
+ d = 0;
+ while(!d) {
+ switch(ioloop()) {
+ case 0:
+ d = 1;
+ break;
+ case 1:
+ if(listeners.d > 0) {
+ while(listeners.d > 0)
+ resume(listeners.b[0], 0);
+ flog(LOG_INFO, "no longer listening");
+ } else {
+ d = 1;
+ }
+ break;
+ }
+ }
return(0);
}
return(0);
}