示例#1
0
文件: log.c 项目: dotmark/libreswan
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;
	}
}
示例#2
0
文件: log.c 项目: dotmark/libreswan
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);
}
示例#3
0
文件: log.c 项目: odit/rv042
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);
}
示例#4
0
文件: log.c 项目: odit/rv042
/* 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++;
}
示例#5
0
文件: log.c 项目: dotmark/libreswan
/* 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++;
}