Skip to content
option.cc 2.83 KiB
Newer Older
Seblu's avatar
Seblu committed
#include "sls.hh"
#include "option.hh"

#include <getopt.h>
#include <stdlib.h>

/*!
** Constructor
*/
Option::Option() {
  verbose = false;
  dbdir = "/var/db/sls";
  port = 18136;
  daemon = true;
  closefd = true;
  logfile = "/var/log/syslog/sls";
  pidfile = "/var/lock/sls.pid";
}

/*!
** Print usage on @param out. The program name is @param name.
*/
void Option::usage(const char *name, ostream &out) const {
  out << "usage: " << name
      << " [-h|--help] [-d|--database file] [-v|--verbose] [-p port]" << std::endl
      << "-h | --help           : Print this help." << std::endl
      << "-d | --database dir   : Define database directory." << std::endl
      << "-v | --verbose        : Set verbose mode." << std::endl
      << "-V | --version        : Print version and exit." << std::endl
      << "-p | --port p         : sls listen on port p." << std::endl
      << "-P | --pid-file       : Path to pid file." << std::endl
      << "-l | --log-file       : Path to log file." << std::endl
      << "-D | --debug          : Run with verbose and not in daemon mode." << std::endl
      << "-n | --no-close       : Don't close stdin,stdout and stderr." << std::endl;
}

/*!
** Parse argline arguments and fill options accordingly
**
** @param argc argc of your program
** @param argv argv of your program
**
** @return
*/
Option &Option::load(int argc, char *argv[]) {
  struct option lopt[] = {
    {"help", 0, 0, 'h'},
    {"database", 0, 0, 'd'},
    {"verbose", 0, 0, 'v'},
    {"version", 0, 0, 'V'},
    {"port", 0, 0, 'p'},
    {"pid-file", 0, 0, 'P'},
    {"log-file", 0, 0, 'l'},
    {"debug", 0, 0, 'D'},
    {"no-close", 0, 0, 'n'},
    {0, 0, 0, 0},
  };
  int option;

  while ((option = getopt_long(argc, argv, "hvnVDd:p:P:l:", lopt, 0)) != -1) {
    switch (option) {
    case 'h':
      usage(*argv, std::cout);
      break;
    case 'p':
      port = atoi(optarg);
      break;
    case 'd':
      dbdir = optarg;
      break;
    case 'P':
      pidfile = optarg;
      break;
    case 'l':
      logfile = optarg;
      break;
    case 'V':
      std::cerr << "version : " << VERSION << std::endl;
      exit(ERR_NO);
    case 'D':
      daemon = false;
    case 'v':
      verbose = true;
      break;
    case 'n':
      closefd = false;
      break;
    case '?':
      usage(*argv, std::cerr);
      exit(ERR_USAGE);
    }
  }

  if (argv[optind] != 0) {
    usage(*argv, std::cerr);
    exit(ERR_USAGE);
  }

  return *this;
}

Option &Option::loadenv() {
//   const char *senv;

//   // Get history path
//   if ((senv = getenv("SLC_HISTORY_FILE")) != 0 && *senv != 0)
//     history_file = senv;

//   // Get history size
//   if ((senv = getenv("SLC_HISTORY_SIZE")) != 0 && *senv != 0)
//     history_size = atoi(senv);

//  // Get log size
//   if ((senv = getenv("SLC_LOG_SIZE")) != 0 && *senv != 0)
//     log_size = atoi(senv);

  return *this;
}