static struct main_hook hook;
static struct main_timer tm;
static struct main_signal sg;
+static int sig_counter;
static byte rb[16];
if (bio->rpos < bio->rlen)
{
msg(L_INFO, "Read EOF");
+ bio->data = NULL; // Mark as deleted
block_io_del(bio);
}
else
{
msg(L_INFO, "Read done");
block_io_read(bio, rb, sizeof(rb));
+ block_io_set_timeout(&fin, 3000);
}
}
static void derror(struct main_block_io *bio, int cause)
{
msg(L_INFO, "Error: %m !!! (cause %d)", cause);
+ bio->data = NULL;
block_io_del(bio);
}
static int dhook(struct main_hook *ho UNUSED)
{
msg(L_INFO, "Hook called");
+ if (sig_counter >= 3)
+ return HOOK_SHUTDOWN;
return 0;
}
static void dentry(void)
{
log_fork();
+ main_teardown();
msg(L_INFO, "*** SUBPROCESS START ***");
sleep(2);
msg(L_INFO, "*** SUBPROCESS FINISH ***");
static void dsignal(struct main_signal *sg UNUSED)
{
- msg(L_INFO, "SIGINT received (use Ctrl-\\ to really quit)");
+ msg(L_INFO, "SIGINT received (send 3 times to really quit, or use Ctrl-\\)");
+ sig_counter++;
}
int
fin.read_done = dread;
fin.error_handler = derror;
+ fin.data = "";
block_io_add(&fin, 0);
block_io_read(&fin, rb, sizeof(rb));
fout.write_done = dwrite;
fout.error_handler = derror;
+ fout.data = "";
block_io_add(&fout, 1);
block_io_write(&fout, "Hello, world!\n", 14);
main_loop();
msg(L_INFO, "Finished.");
+
+ if (fin.data)
+ block_io_del(&fin);
+ if (fout.data)
+ block_io_del(&fout);
+ hook_del(&hook);
+ signal_del(&sg);
+ timer_del(&tm);
+ main_cleanup();
+ return 0;
}
#endif