示例#1
0
文件: main.c 项目: lnslbrty/naskpass
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);
}
示例#2
0
		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();
		}