/** * Main */ int main(int argc, char* argv[], char* envp[]) { parent_pid = getpid(); child_pid = fork(); switch(child_pid) { case -1: { PFLUSH("Fork failed!\n"); exit(-1); } case 0: { child_entry: child_loop(); break; } default: { child_pid2 = fork(); if (!child_pid2) { goto child_entry; } struct sigaction sig_action; sig_action.sa_sigaction = &handle_signals_info; sig_action.sa_flags = SA_SIGINFO; sigemptyset(&sig_action.sa_mask); sigaction(SIGUSR1, &sig_action, NULL); sigaction(SIGUSR2, &sig_action, NULL); sigaction(SIGINT, &sig_action, NULL); while(1) { PFLUSH("waiting... "); pause(); } break; } } return 0; }
int PBOUT (int c) { if (!sslstdio) return putchar (c); /* flush buffer if full */ if (!sslstdio->octr && PFLUSH ()) return EOF; sslstdio->octr--; /* count down one character */ *sslstdio->optr++ = c; /* write character */ return c; /* return that character */ }
/** * Handle User Signal. * Log the occurence of receiving a SIGUSR1 or SIGUSR2. */ void handle_signals_info(int sig, siginfo_t* info, void* v) { switch(sig) { case SIGUSR1: case SIGUSR2: { PFLUSH("received %s from: %d\n", strsignal(sig), info->si_pid); break; } case SIGINT: { PFLUSH("\n\treceived: %s\n\t%s %d... %s\n\t%s %d... %s\n\tparent shutting down...\n", strsignal(sig), "killing child", child_pid, (SEND_SIG(child_pid, SIGKILL) == 0) ? "OK" : "FAIL", "killing child", child_pid2, (SEND_SIG(child_pid2, SIGKILL) == 0) ? "OK" : "FAIL"); exit(0); break; } } }
int PSOUT (char *s) { if (!sslstdio) return fputs (s,stdout); while (*s) { /* flush buffer if full */ if (!sslstdio->octr && PFLUSH ()) return EOF; *sslstdio->optr++ = *s++; /* write one more character */ sslstdio->octr--; /* count down one character */ } return 0; /* success */ }
int PSOUTR (SIZEDTEXT *s) { unsigned char *t = s->data; unsigned long i = s->size; unsigned long j; if (sslstdio) while (i) { /* until request satisfied */ /* flush buffer if full */ if (!sslstdio->octr && PFLUSH ()) break; /* blat as big a chucnk as we can */ memcpy (sslstdio->optr,t,j = min (i,sslstdio->octr)); sslstdio->optr += j; /* account for chunk */ sslstdio->octr -= j; t += j; i -= j; } else while (i && ((j = fwrite (t,1,i,stdout)) || (errno == EINTR))) t += j,i -= j; return i ? EOF : NIL; }
HALT() { PFLUSH(); fputs("Call to procedure halt\n", stderr); PCEXIT(0); }