fix some signal handling

git-svn-id: https://svn.musicpd.org/mpd/trunk@3101 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
Warren Dukes 2005-03-19 12:28:47 +00:00
parent d392b7e48b
commit 9193766c06
3 changed files with 13 additions and 15 deletions

View File

@ -44,9 +44,7 @@ void decodeSigHandler(int sig, siginfo_t * si, void * v) {
int status; int status;
if(decode_pid==wait3(&status,WNOHANG,NULL)) { if(decode_pid==wait3(&status,WNOHANG,NULL)) {
if(WIFSIGNALED(status)) { if(WIFSIGNALED(status)) {
if(WTERMSIG(status)!=SIGTERM && if(WTERMSIG(status)!=SIGTERM) {
WTERMSIG(status)!=SIGINT)
{
ERROR("decode process died from " ERROR("decode process died from "
"signal: %i\n", "signal: %i\n",
WTERMSIG(status)); WTERMSIG(status));
@ -65,12 +63,6 @@ void decodeSigHandler(int sig, siginfo_t * si, void * v) {
else DEBUG("decoder (or child) got SIGTERM\n"); else DEBUG("decoder (or child) got SIGTERM\n");
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
else if(sig==SIGINT) {
if(decode_pid > 0) {
DEBUG("player (or child) got SIGINT\n");
}
else DEBUG("decoder (or child) got SIGINT\n");
}
} }
void stopDecode(DecoderControl * dc) { void stopDecode(DecoderControl * dc) {

View File

@ -629,11 +629,15 @@ void printInterfaceOutBuffer(Interface * interface) {
char * buffer; char * buffer;
int ret; int ret;
DEBUG("enter print interface out buffer\n");
if(!interface->open || interface->expired || !interface->outBuflen) { if(!interface->open || interface->expired || !interface->outBuflen) {
DEBUG("nothing todo, leaving\n");
return; return;
} }
if(interface->bufferList) { if(interface->bufferList) {
DEBUG("we have a bufferList\n");
interface->outputBufferSize+=sizeof(ListNode); interface->outputBufferSize+=sizeof(ListNode);
interface->outputBufferSize+=interface->outBuflen+1; interface->outputBufferSize+=interface->outBuflen+1;
if(interface->outputBufferSize> if(interface->outputBufferSize>
@ -658,9 +662,12 @@ void printInterfaceOutBuffer(Interface * interface) {
} }
} }
else { else {
DEBUG("no bufferList, just generic buffer\n");
DEBUG("attempting to write\n");
if((ret = write(interface->fd,interface->outBuffer, if((ret = write(interface->fd,interface->outBuffer,
interface->outBuflen))<0) interface->outBuflen))<0)
{ {
DEBUG("write unsuccessful\n");
if(errno==EAGAIN || errno==EINTR) { if(errno==EAGAIN || errno==EINTR) {
buffer = malloc(interface->outBuflen+1); buffer = malloc(interface->outBuflen+1);
memcpy(buffer,interface->outBuffer, memcpy(buffer,interface->outBuffer,
@ -678,6 +685,7 @@ void printInterfaceOutBuffer(Interface * interface) {
} }
} }
else if(ret<interface->outBuflen) { else if(ret<interface->outBuflen) {
DEBUG("returned less than outBufLen\n");
buffer = malloc(interface->outBuflen-ret+1); buffer = malloc(interface->outBuflen-ret+1);
memcpy(buffer,interface->outBuffer+ret, memcpy(buffer,interface->outBuffer+ret,
interface->outBuflen-ret); interface->outBuflen-ret);
@ -694,7 +702,10 @@ void printInterfaceOutBuffer(Interface * interface) {
(char *)interface->bufferList-> (char *)interface->bufferList->
firstNode->data)+1; firstNode->data)+1;
} }
DEBUG("done writing\n");
} }
interface->outBuflen = 0; interface->outBuflen = 0;
DEBUG("leaving print interface out buffer\n");
} }

View File

@ -72,9 +72,7 @@ void initSigHandlers() {
struct sigaction sa; struct sigaction sa;
sa.sa_flags = 0; sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
sa.sa_handler = SIG_IGN; sa.sa_handler = SIG_IGN;
sa.sa_sigaction = NULL;
while(sigaction(SIGPIPE,&sa,NULL)<0 && errno==EINTR); while(sigaction(SIGPIPE,&sa,NULL)<0 && errno==EINTR);
sa.sa_handler = chldSigHandler; sa.sa_handler = chldSigHandler;
while(sigaction(SIGCHLD,&sa,NULL)<0 && errno==EINTR); while(sigaction(SIGCHLD,&sa,NULL)<0 && errno==EINTR);
@ -97,16 +95,13 @@ void setSigHandlersForDecoder() {
finishSigHandlers(); finishSigHandlers();
sa.sa_flags = 0; sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
sa.sa_handler = SIG_IGN; sa.sa_handler = SIG_IGN;
sa.sa_sigaction = NULL;
while(sigaction(SIGHUP,&sa,NULL)<0 && errno==EINTR); while(sigaction(SIGHUP,&sa,NULL)<0 && errno==EINTR);
sa.sa_handler = NULL; while(sigaction(SIGINT,&sa,NULL)<0 && errno==EINTR);
sa.sa_flags = SA_SIGINFO; sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = decodeSigHandler; sa.sa_sigaction = decodeSigHandler;
while(sigaction(SIGCHLD,&sa,NULL)<0 && errno==EINTR); while(sigaction(SIGCHLD,&sa,NULL)<0 && errno==EINTR);
while(sigaction(SIGTERM,&sa,NULL)<0 && errno==EINTR); while(sigaction(SIGTERM,&sa,NULL)<0 && errno==EINTR);
while(sigaction(SIGINT,&sa,NULL)<0 && errno==EINTR);
} }
void ignoreSignals() { void ignoreSignals() {