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); } } }
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); }
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; }
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(); }