void readline_print_status() { char str_prompt[STR_SIZE]; #if 0 term_puts("myshell"); term_putc(get_prompt()); term_putc(' '); #endif sprintf(str_prompt, "%s@%s:%s%c ", get_username(), get_nodename(), get_current_short_dir(), get_prompt()); term_puts(str_prompt); }
int main(int argc, char *argv[]) { int ret; progname = get_progname(argv[0]); nodename = get_nodename(); cl_log_set_entity(progname); cl_log_set_facility(HA_LOG_FACILITY); cl_inherit_logging_environment(0); /* read command line option */ opterr = 0; while (1) { int c = getopt(argc, argv, "hi:c:t:m:n:r:"); if (c == -1) break; switch (c) { case 'h': /* help*/ usage(stdout); exit(EXIT_SUCCESS); case 'i': /* -i <index> */ { unsigned long l = strtoul(optarg, NULL, 10); if (l < SFEX_MIN_NUMLOCKS || l > SFEX_MAX_NUMLOCKS) { cl_log(LOG_ERR, "index %s is out of range or invalid. it must be integer value between %lu and %lu.\n", optarg, (unsigned long)SFEX_MIN_NUMLOCKS, (unsigned long)SFEX_MAX_NUMLOCKS); exit(4); } lock_index = l; } break; case 'c': /* -c <collision_timeout> */ { unsigned long l = strtoul(optarg, NULL, 10); if (l < 1 || l > INT_MAX) { cl_log(LOG_ERR, "collision_timeout %s is out of range or invalid. it must be integer value between %lu and %lu.\n", optarg, (unsigned long)1, (unsigned long)INT_MAX); exit(4); } collision_timeout = l; } break; case 'm': /* -m <monitor_interval> */ { unsigned long l = strtoul(optarg, NULL, 10); if (l < 1 || l > INT_MAX) { cl_log(LOG_ERR, "monitor_interval %s is out of range or invalid. it must be integer value between %lu and %lu.\n", optarg, (unsigned long)1, (unsigned long)INT_MAX); exit(4); } monitor_interval = l; } break; case 't': /* -t <lock_timeout> */ { unsigned long l = strtoul(optarg, NULL, 10); if (l < 1 || l > INT_MAX) { cl_log(LOG_ERR, "lock_timeout %s is out of range or invalid. it must be integer value between %lu and %lu.\n", optarg, (unsigned long)1, (unsigned long)INT_MAX); exit(4); } lock_timeout = l; } break; case 'n': { free(nodename); if (strlen(optarg) > SFEX_MAX_NODENAME) { cl_log(LOG_ERR, "nodename %s is too long. must be less than %d byte.\n", optarg, (unsigned int)SFEX_MAX_NODENAME); exit(EXIT_FAILURE); } nodename = strdup(optarg); } break; case 'r': { rsc_id = strdup(optarg); } break; case '?': /* error */ usage(stderr); exit(4); } } /* check parameter except the option */ if (optind >= argc) { cl_log(LOG_ERR, "no device specified.\n"); usage(stderr); exit(EXIT_FAILURE); } else if (optind + 1 < argc) { cl_log(LOG_ERR, "too many arguments.\n"); usage(stderr); exit(EXIT_FAILURE); } device = argv[optind]; prepare_lock(device); #if !SFEX_TESTING sysrq_fd = open("/proc/sysrq-trigger", O_WRONLY); if (sysrq_fd == -1) { cl_log(LOG_ERR, "failed to open /proc/sysrq-trigger due to %s\n", strerror(errno)); exit(EXIT_FAILURE); } #endif ret = lock_index_check(&cdata, lock_index); if (ret == -1) exit(EXIT_FAILURE); { struct sigaction sig_act; sigemptyset (&sig_act.sa_mask); sig_act.sa_flags = SA_SIGINFO; sig_act.sa_sigaction = quit_handler; ret = sigaction(SIGTERM, &sig_act, NULL); if (ret == -1) { cl_log(LOG_ERR, "sigaction failed\n"); exit(EXIT_FAILURE); } } cl_log(LOG_INFO, "Starting SFeX Daemon...\n"); /* acquire lock first.*/ acquire_lock(); if (daemon(0, 1) != 0) { cl_perror("%s::%d: daemon() failed.", __FUNCTION__, __LINE__); release_lock(); exit(EXIT_FAILURE); } cl_make_realtime(-1, -1, 128, 128); cl_log(LOG_INFO, "SFeX Daemon started.\n"); while (1) { sleep (monitor_interval); update_lock(); } }