int main(int argc, char **argv) { int ret = EXIT_FAILURE, ffd = -1, c_status; pid_t child; char pbuf[IPC_MQSIZ+1]; bool csetup_ok = false; signal(SIGINT, SIG_IGN); signal(SIGTERM, sigfunc); if ( parse_cmd(argc, argv) != 0 ) exit(EXIT_FAILURE); if (OPT(CRYPT_CMD).found == 0) { fprintf(stderr, "%s: crypt cmd is mandatory\n", argv[0]); goto error; } if (check_fifo(GETOPT(FIFO_PATH).str) == false) goto error; if ((ffd = open(GETOPT(FIFO_PATH).str, O_NONBLOCK | O_RDWR)) < 0) { fprintf(stderr, "%s: fifo '%s' error: %d (%s)\n", argv[0], GETOPT(FIFO_PATH).str, errno, strerror(errno)); goto error; } if (ui_ipc_init(1) != 0) { fprintf(stderr, "%s: can not create semaphore/message queue: %d (%s)\n", argv[0], errno, strerror(errno)); goto error; } memset(pbuf, '\0', IPC_MQSIZ+1); log_init( GETOPT(LOG_FILE).str ); logs("%s\n", "log init"); logs_dbg("%s\n", "debug mode active"); ui_ipc_sempost(SEM_UI); ui_ipc_sempost(SEM_IN); if ((child = fork()) == 0) { /* child */ logs("%s\n", "child"); if (ffd >= 0) close(ffd); #ifndef DEBUG fclose(stderr); #endif /* Slave process: TUI */ if (ui_ipc_init(0) == 0) { do_ui(); } ui_ipc_free(0); exit(0); } else if (child > 0) { /* parent */ logs("%s\n", "parent"); fclose(stdin); fclose(stdout); /* Master process: mainloop (read passwd from message queue or fifo and exec cryptcreate */ while ( ui_ipc_getvalue(SEM_UI) > 0 ) { if (read(ffd, pbuf, IPC_MQSIZ) >= 0) { ui_ipc_semwait(SEM_IN); logs_dbg("%s\n", "fifo password"); if (run_cryptcreate(pbuf, GETOPT(CRYPT_CMD).str) != 0) { logs_dbg("%s\n", "cryptcreate error"); sleep(3); } else { csetup_ok = true; logs_dbg("%s\n", "cryptcreate success"); ui_ipc_semtrywait(SEM_UI); } ui_ipc_sempost(SEM_IN); } else if ( ui_ipc_msgcount(MQ_PW) > 0 ) { //ui_ipc_semwait(SEM_IN); ui_ipc_msgrecv(MQ_PW, pbuf, 0); logs_dbg("%s\n", "password"); ui_ipc_msgsend(MQ_IF, MSG(MSG_BUSY)); if (run_cryptcreate(pbuf, GETOPT(CRYPT_CMD).str) != 0) { logs_dbg("%s\n", "cryptcreate error"); ui_ipc_msgsend(MQ_IF, MSG(MSG_CRYPTCMD_ERR)); } else { csetup_ok = true; logs_dbg("%s\n", "cryptcreate success"); ui_ipc_semtrywait(SEM_UI); } //ui_ipc_sempost(SEM_IN); } usleep(100000); } logs("%s\n", "waiting for child"); wait(&c_status); memset(pbuf, '\0', IPC_MQSIZ+1); } else { /* fork error */ perror("fork"); goto error; } if (csetup_ok) ret = EXIT_SUCCESS; else ret = EXIT_FAILURE; ui_ipc_free(1); error: logs("%s\n", "exiting .."); if (ffd >= 0) close(ffd); log_free(); exit(ret); }
virtual void handle_request(http_server* server, const tu_string& key, http_request* req) { webtweaker wt("My Tweaker", server, req); do_ui(&wt); wt.send_response(); }