static void
_fdclose(int fd)
{
  int r, retry = 0;

restart:
  r = close(fd);
  if (-1 == r) {
    switch(errno) {
    case EINTR:
      if (++retry > NPROC + 1) {
        _log_close(LOG_INFO, errno, fd);
      }
      goto restart;
    default:
      _die_close(errno, fd);
    }
  }
}
示例#2
0
static ssize_t _log_write(struct iovec *vec, int n)
{
    unsigned long long tmp_size = get_file_size(_log_name);
    if (UNLIKELY(tmp_size > _log_file_size)) {
        fprintf(stderr, "%s size= %llu reach max %llu, splited\n",
                _log_name, tmp_size, _log_file_size);
        if (-1 == _log_close()) {
            fprintf(stderr, "_log_close errno:%d", errno);
        }
        log_get_time(_log_name_time, sizeof(_log_name_time), 1);
        snprintf(_log_name, sizeof(_log_name), "%s%s_%s",
                _log_path, _log_name_prefix, _log_name_time);

        _log_open(_log_name);
        fprintf(stderr, "splited file %s\n", _log_name);
    }

    return writev(_log_fd, vec, n);
}
示例#3
0
文件: main.c 项目: liberalman/mqtt
int main(int argc, char *argv[])
{
    int ret = 0/*, i = 0*/;
    char buf[MAX_BUF]; // 数据缓冲区
    //char error[MAX_ERROR]; // 错误描述缓冲区
    libertymqtt_config config;
    
    #ifndef VERSION
        char VERSION[32];
        snprintf(VERSION, 32, "%s", "0.0");
    #else
        
    #endif
    
    // 输出版本信息
    snprintf(buf, MAX_BUF, "version %s", VERSION);
    _log(DEBUG, "%s\n", buf);

    // 载入配置文件
    ret = _init_conf(&config, argc, argv);
    if (SUCCESS != ret)
        exit(ret);

    // 初始化日志
    _init_log(config.log_file, config.log_type);

    // daemon方式启动
    daemon_mode(&config);

    // 创建socket,监听端口
    libertymqtt_listen(&config.default_listener);
    //for (i = 0; i < config.listener_count; i++){
    //}

    // 主循环
    libertymqtt_main_loop(&config);

    // 退出前不要忘了清理配置、关闭日志等
    _clear_all(&config);
    _log_close();
    return 0;
}
示例#4
0
static ssize_t _log_write(struct iovec *vec, int n)
{
    char log_rename[FILENAME_LEN] = {0};
    unsigned long long tmp_size = get_file_size(_log_name);
    if (UNLIKELY(tmp_size > _log_file_size)) {
        fprintf(stderr, "%s size= %llu reach max %llu, splited\n",
                _log_name, tmp_size, _log_file_size);
        if (-1 == _log_close()) {
            fprintf(stderr, "_log_close errno:%d", errno);
        }
        log_get_time(_log_name_time, sizeof(_log_name_time), 1);
        snprintf(log_rename, sizeof(log_rename), "%s%s_%s",
                _log_path, _log_name_prefix, _log_name_time);
        if (-1 == rename(_log_name, log_rename)) {
            fprintf(stderr, "log file splited %s error: %d:%s\n",
                    log_rename, errno , strerror(errno));
        }
        _log_open(_log_name);
        fprintf(stderr, "splited file %s\n", log_rename);
    }

    return writev(_log_fd, vec, n);
}
/* called in child process, use _exit */
__attribute__((noreturn)) static void
_die_close(int errnum, int fd)
{
  _log_close(LOG_FATAL, errnum, fd);
  _die();
}