* of the GNU Lesser General Public License.
*/
-#include "ucw/lib.h"
-#include "ucw/mainloop.h"
+#include <ucw/lib.h>
+#include <ucw/mainloop.h>
#include <stdio.h>
#include <stdlib.h>
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);
+ switch (cause)
+ {
+ case BIO_ERR_READ:
+ case BIO_ERR_WRITE:
+ msg(L_INFO, "derror: %s error: %m", (cause == BIO_ERR_READ ? "read" : "write"));
+ break;
+ case BIO_ERR_TIMEOUT:
+ msg(L_INFO, "derror: Timeout");
+ break;
+ default:
+ ASSERT(0);
+ }
+ 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