static int _bsd_send_repeat_msg(struct config_rule *r) { char vt[32], *msg; time_t tick; int len, status; if (r == NULL) return -1; if (r->type != DST_TYPE_FILE) return 0; if (r->last_count == 0) return 0; /* stop the timer */ dispatch_suspend(r->dup_timer); tick = time(NULL); memset(vt, 0, sizeof(vt)); ctime_r(&tick, vt); vt[19] = '\0'; msg = NULL; asprintf(&msg, "%s: --- last message repeated %u time%s ---\n", vt + 4, r->last_count, (r->last_count == 1) ? "" : "s"); r->last_count = 0; if (msg == NULL) return -1; len = strlen(msg); status = write(r->fd, msg, len); if ((status < 0) || (status < len)) { asldebug("%s: error writing repeat message (%s): %s\n", MY_ID, r->dst, strerror(errno)); /* Try re-opening the file (once) and write again */ close(r->fd); r->fd = open(r->dst, O_WRONLY | O_APPEND | O_CREAT | O_NOCTTY, 0644); if (r->fd < 0) { asldebug("%s: re-open failed for file: %s (%s)\n", MY_ID, r->dst, strerror(errno)); free(msg); return -1; } status = write(r->fd, msg, len); if ((status < 0) || (status < len)) { asldebug("%s: error re-writing message (%s): %s\n", MY_ID, r->dst, strerror(errno)); free(msg); return -1; } } free(msg); return 0; }
static int _syslog_dst_open(struct config_rule *r) { int i; char *node, *serv; struct addrinfo hints, *gai, *ai; if (r == NULL) return -1; if (r->fd != -1) return 0; if (r->dst[0] == '/') { r->fd = open(r->dst, O_WRONLY | O_APPEND | O_CREAT | O_NOCTTY, 0644); if (r->fd < 0) { asldebug("%s: open failed for file: %s (%s)\n", MY_ID, r->dst, strerror(errno)); return -1; } r->type = DST_TYPE_FILE; if (!strcmp(r->dst, _PATH_CONSOLE)) r->type = DST_TYPE_CONS; return 0; } if (r->dst[0] == '!') { r->type = DST_TYPE_NOTE; r->fd = -1; return 0; } if (r->dst[0] == '@') { node = strdup(r->dst + 1); if (node == NULL) return -1; serv = NULL; serv = strrchr(node, ':'); if (serv != NULL) *serv++ = '\0'; else serv = "syslog"; memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; i = getaddrinfo(node, serv, &hints, &gai); free(node); if (i != 0) { asldebug("%s: getaddrinfo failed for node %s service %s: (%s)\n", MY_ID, node, serv, gai_strerror(i)); return -1; } for (ai = gai; ai != NULL; ai = ai->ai_next) { r->fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (r->fd < 0) continue; r->addr = (struct sockaddr *)malloc(ai->ai_addrlen); if (r->addr == NULL) return -1; memcpy(r->addr, ai->ai_addr, ai->ai_addrlen); break; } freeaddrinfo(gai); if (r->fd < 0) { asldebug("%s: connection failed for %s\n", MY_ID, (r->dst) + 1); free(r->addr); r->addr = NULL; return -1; } if (fcntl(r->fd, F_SETFL, O_NONBLOCK) < 0) { close(r->fd); r->fd = -1; asldebug("%s: couldn't set O_NONBLOCK for fd %d: %s\n", MY_ID, r->fd, strerror(errno)); free(r->addr); r->addr = NULL; return -1; } r->type = DST_TYPE_SOCK; return 0; } if (strcmp(r->dst, "*") == 0) { r->type = DST_TYPE_WALL; r->fd = -1; return 0; } /* Can't deal with dst! */ asldebug("%s: unsupported / unknown output name: %s\n", MY_ID, r->dst); return -1; }
static void db_asl_open(uint32_t dbtype) { uint32_t status; struct stat sb; if ((dbtype & DB_TYPE_FILE) && (global.file_db == NULL)) { memset(&sb, 0, sizeof(struct stat)); if (stat(PATH_ASL_STORE, &sb) == 0) { /* must be a directory */ if (!S_ISDIR(sb.st_mode)) { asldebug("error: %s is not a directory", PATH_ASL_STORE); return; } } else { if (errno == ENOENT) { /* /var/log/asl doesn't exist - create it */ if (mkdir(PATH_ASL_STORE, 0755) != 0) { asldebug("error: can't create data store %s: %s\n", PATH_ASL_STORE, strerror(errno)); return; } } else { /* stat failed for some other reason */ asldebug("error: can't stat data store %s: %s\n", PATH_ASL_STORE, strerror(errno)); return; } } /* * One-time store conversion from the old "LongTTL" style to the new "Best Before" style. * bb_convert returns quickly if the store has already been converted. */ status = bb_convert(PATH_ASL_STORE); if (status != ASL_STATUS_OK) { asldebug("ASL data store conversion failed!: %s\n", asl_core_error(status)); } status = asl_store_open_write(NULL, &(global.file_db)); if (status != ASL_STATUS_OK) { asldebug("asl_store_open_write: %s\n", asl_core_error(status)); } else { if (global.db_file_max != 0) asl_store_max_file_size(global.file_db, global.db_file_max); asl_trigger_aslmanager(); } } if ((dbtype & DB_TYPE_MEMORY) && (global.memory_db == NULL)) { status = asl_memory_open(global.db_memory_max, &(global.memory_db)); if (status != ASL_STATUS_OK) { asldebug("asl_memory_open: %s\n", asl_core_error(status)); } } if ((dbtype & DB_TYPE_MINI) && (global.mini_db == NULL)) { status = asl_mini_memory_open(global.db_mini_max, &(global.mini_db)); if (status != ASL_STATUS_OK) { asldebug("asl_mini_memory_open: %s\n", asl_core_error(status)); } } }