int
process_fork(struct main_process *mp)
{
+ ASSERT(!mp->pid);
pid_t pid = fork();
if (pid < 0)
- return -1;
+ {
+ DBG("MAIN: Fork failed");
+ mp->status = -1;
+ format_exit_status(mp->status_msg, -1);
+ mp->handler(mp);
+ return 1;
+ }
else if (!pid)
return 0;
else
{
pr->status = stat;
process_del(pr);
- if (WIFEXITED(stat) && WEXITSTATUS(stat) < 256)
- {
- if (WEXITSTATUS(stat))
- sprintf(pr->status_msg, "died with exit code %d", WEXITSTATUS(stat));
- else
- pr->status_msg[0] = 0;
- }
- else if (WIFSIGNALED(stat))
- sprintf(pr->status_msg, "died on signal %d", WTERMSIG(stat));
- else
- sprintf(pr->status_msg, "died with status %x", stat);
+ format_exit_status(pr->status_msg, pr->status);
DBG("MAIN: Calling process exit handler");
pr->handler(pr);
break;
struct main_process {
cnode n;
- int pid;
- int status; /* Exit status */
- byte status_msg[32];
+ int pid; /* Process id (0=not running) */
+ int status; /* Exit status (-1=fork failed) */
+ byte status_msg[EXIT_STATUS_MSG_SIZE];
void (*handler)(struct main_process *mp); /* [*] Called when the process exits; process_del done automatically */
void *data; /* [*] For use by the handler */
};