void perpeer_logfree(struct connection *c) { perpeer_logclose(c); if (c->log_file_name != NULL) { pfree(c->log_file_name); c->log_file_name = NULL; c->log_file_err = FALSE; } }
void close_peerlog(void) { /* exit if the circular queue has not been initialized */ if (perpeer_list.cqh_first == NULL) return; /* end of circular queue is given by pointer to "HEAD" */ while (perpeer_list.cqh_first != (void *)&perpeer_list) perpeer_logclose(perpeer_list.cqh_first); }
void close_peerlog(void) { /* end of circular queue is given by pointer to "HEAD" * BUT if the queue is not initialized, this won't be true * so we must guard by test perpeer_list.cqh_first != NULL */ if (perpeer_list.cqh_first != NULL) while (perpeer_list.cqh_first != (void *)&perpeer_list) perpeer_logclose(perpeer_list.cqh_first); }
/* open the per-peer log */ static void open_peerlog(struct connection *c) { syslog(LOG_INFO, "opening log file for conn %s", c->name); if (c->log_file_name == NULL) { char peername[ADDRTOT_BUF], dname[ADDRTOT_BUF]; int peernamelen, lf_len; addrtot(&c->spd.that.host_addr, 'Q', peername, sizeof(peername)); peernamelen = strlen(peername); /* copy IP address, turning : and . into / */ { char c, *p, *q; p = peername; q = dname; do { c = *p++; if (c == '.' || c == ':') c = '/'; *q++ = c; } while (c != '\0'); } lf_len = peernamelen * 2 + strlen(base_perpeer_logdir) + sizeof("//.log") + 1; c->log_file_name = alloc_bytes(lf_len, "per-peer log file name"); fprintf(stderr, "base dir |%s| dname |%s| peername |%s|" , base_perpeer_logdir, dname, peername); snprintf(c->log_file_name, lf_len, "%s/%s/%s.log" , base_perpeer_logdir, dname, peername); syslog(LOG_DEBUG, "conn %s logfile is %s", c->name, c->log_file_name); } /* now open the file, creating directories if necessary */ { /* create the directory */ char *dname; int bpl_len = strlen(base_perpeer_logdir); char *slashloc; dname = clone_str(c->log_file_name, "temp copy of file name"); dname = dirname(dname); if (access(dname, W_OK) != 0) { if (errno != ENOENT) { if (c->log_file_err) { syslog(LOG_CRIT, "can not write to %s: %s" , dname, strerror(errno)); c->log_file_err = TRUE; pfree(dname); return; } } /* directory does not exist, walk path creating dirs */ /* start at base_perpeer_logdir */ slashloc = dname + bpl_len; slashloc++; /* since, by construction there is a slash right there */ while (*slashloc != '\0') { char saveslash; /* look for next slash */ while (*slashloc != '\0' && *slashloc != '/') slashloc++; saveslash = *slashloc; *slashloc = '\0'; if (mkdir(dname, 0750) != 0 && errno != EEXIST) { syslog(LOG_CRIT, "can not create dir %s: %s" , dname, strerror(errno)); c->log_file_err = TRUE; pfree(dname); return; } syslog(LOG_DEBUG, "created new directory %s", dname); *slashloc = saveslash; slashloc++; } } pfree(dname); } c->log_file = fopen(c->log_file_name, "a"); if (c->log_file == NULL) { if (c->log_file_err) { syslog(LOG_CRIT, "logging system can not open %s: %s" , c->log_file_name, strerror(errno)); c->log_file_err = TRUE; } return; } /* look for a connection to close! */ while (perpeer_count >= MAX_PEERLOG_COUNT) { /* can not be NULL because perpeer_count > 0 */ passert(perpeer_list.cqh_last != (void *)&perpeer_list); perpeer_logclose(perpeer_list.cqh_last); } /* insert this into the list */ CIRCLEQ_INSERT_HEAD(&perpeer_list, c, log_link); passert(c->log_file != NULL); perpeer_count++; }
/* open the per-peer log * * NOTE: this routine must not call our own logging facilities to report * an error since those routines are not re-entrant and such a call * would be recursive. */ static void open_peerlog(struct connection *c) { /* syslog(LOG_INFO, "opening log file for conn %s", c->name); */ if (c->log_file_name == NULL) { char peername[ADDRTOT_BUF], dname[ADDRTOT_BUF]; int peernamelen, lf_len; addrtot(&c->spd.that.host_addr, 'Q', peername, sizeof(peername)); peernamelen = strlen(peername); /* copy IP address, turning : and . into / */ { char ch, *p, *q; p = peername; q = dname; do { ch = *p++; if (ch == '.' || ch == ':') ch = '/'; *q++ = ch; } while (ch != '\0'); } lf_len = peernamelen * 2 + strlen(base_perpeer_logdir) + sizeof("//.log") + 1; c->log_file_name = alloc_bytes(lf_len, "per-peer log file name"); #if 0 fprintf(stderr, "base dir |%s| dname |%s| peername |%s|", base_perpeer_logdir, dname, peername); #endif snprintf(c->log_file_name, lf_len, "%s/%s/%s.log", base_perpeer_logdir, dname, peername); /* syslog(LOG_DEBUG, "conn %s logfile is %s", c->name, c->log_file_name); */ } /* now open the file, creating directories if necessary */ c->log_file_err = !ensure_writeable_parent_directory(c->log_file_name); if (c->log_file_err) return; c->log_file = fopen(c->log_file_name, "w"); if (c->log_file == NULL) { if (c->log_file_err) { syslog(LOG_CRIT, "logging system can not open %s: %s", c->log_file_name, strerror(errno)); c->log_file_err = TRUE; } return; } /* look for a connection to close! */ while (perpeer_count >= MAX_PEERLOG_COUNT) { /* can not be NULL because perpeer_count > 0 */ passert(perpeer_list.cqh_last != (void *)&perpeer_list); perpeer_logclose(perpeer_list.cqh_last); } /* insert this into the list */ CIRCLEQ_INSERT_HEAD(&perpeer_list, c, log_link); passert(c->log_file != NULL); perpeer_count++; }