Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 13 Apr 2002 15:30:03 -0700 (PDT)
From:      newsyslog@oldach.net (Helge Oldach)
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/25070: newsyslog enhancement
Message-ID:  <200204132230.g3DMU3G02571@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/25070; it has been noted by GNATS.

From: newsyslog@oldach.net (Helge Oldach)
To: bug-followup@freebsd.org
Cc: hm@hcswork.hcs.de (Hellmuth Michaelis)
Subject: Re: bin/25070: newsyslog enhancement
Date: Sun, 14 Apr 2002 00:22:02 +0200 (CEST)

 Here's an updated patch for newsyslog.c. Applies to 1.25.2.5, but should
 work as well for 1.25.2.6 and 1.41.
 
 Can we please commit this useful stuff? Where can I apply for committer
 status?
 
 Helge
 
 
 --- newsyslog/newsyslog.c.ORIG	Thu Mar  7 23:56:15 2002
 +++ newsyslog/newsyslog.c	Fri Apr 12 17:28:32 2002
 @@ -85,6 +85,23 @@
  	struct conf_entry *next;/* Linked list pointer */
  };
  
 +struct log_entry {
 +	char *log;		/* name of the log to be compressed */
 +	char bz;		/* gzip or bzip2 */
 +	struct log_entry* next;	/* Linked list pointer */
 +};
 +
 +struct kill_entry {
 +	pid_t pid;		/* PID to kill */
 +	int sig;		/* Signal to send */
 +	struct kill_entry* next;/* Linked list pointer */
 +};
 +
 +struct kill_entry* kill_pending = NULL;
 +				/* List of PIDs to be killed */
 +struct log_entry* log_pending = NULL;
 +				/* List of logs to be compressed */
 +
  int archtodir = 0;		/* Archive old logfiles to other directory */
  int verbose = 0;		/* Print out what's going on */
  int needroot = 1;		/* Root privs are necessary */
 @@ -103,6 +120,8 @@
  static char *sob(char *p);
  static char *son(char *p);
  static char *missing_field(char *p, char *errline);
 +static int save_kill(pid_t pid, int sig);
 +static void save_compress_log(char* file, char bz);
  static void do_entry(struct conf_entry * ent);
  static void PRS(int argc, char **argv);
  static void usage(void);
 @@ -124,6 +143,9 @@
  main(int argc, char **argv)
  {
  	struct conf_entry *p, *q;
 +	struct kill_entry* k;
 +	struct log_entry* l;
 +	int notified;
  
  	PRS(argc, argv);
  	if (needroot && getuid() && geteuid())
 @@ -136,6 +158,34 @@
  		free((char *) q);
  		q = p;
  	}
 +
 +	notified = 0;
 +	while (kill_pending) {
 +		if (kill(kill_pending->pid, kill_pending->sig))
 +			warn("can't notify daemon, pid %d", (int) kill_pending->pid);
 +		else {
 +			notified = 1;
 +			if (verbose)
 +				printf("daemon pid %d notified\n", (int) kill_pending->pid);
 +		}
 +		k = kill_pending;
 +		kill_pending = kill_pending->next;
 +		free((char *) k);
 +	}
 +	if (notified) {
 +		if (verbose)
 +			printf("small pause to allow daemons to close logs\n");
 +		sleep(10);
 +	}
 +
 +	while (log_pending) {
 +		(log_pending->bz ? bzcompress_log : compress_log)(log_pending->log);
 +		free(log_pending->log);
 +		l = log_pending;
 +		log_pending = log_pending->next;
 +		free((char *) l);
 +	}
 +
  	return (0);
  }
  
 @@ -505,6 +555,39 @@
  	return (p);
  }
  
 +static int
 +save_kill(pid_t pid, int sig)
 +{
 +	struct kill_entry* p;
 +
 +	for (p = kill_pending; p != NULL; p = p->next)
 +		if (p->pid == pid && p->sig == sig)
 +			return (0);
 +
 +	p = (struct kill_entry *) malloc(sizeof(struct kill_entry));
 +	p->pid = pid;
 +	p->sig = sig;
 +	p->next = kill_pending;
 +	kill_pending = p;
 +	return (0);
 +}
 +
 +static void
 +save_compress_log(char *file, char bz)
 +{
 +	struct log_entry* p;
 +
 +	for (p = log_pending; p != NULL; p = p->next)
 +		if (!strcmp(p->log, file))
 +			return;
 +
 +	p = (struct log_entry *) malloc(sizeof(struct log_entry));
 +	p->log = strdup(file);
 +	p->bz = bz;
 +	p->next = log_pending;
 +	log_pending = p;
 +}
 +
  static void
  dotrim(char *log, const char *pid_file, int numdays, int flags, int perm,
      int owner_uid, int group_gid, int sig)
 @@ -669,12 +752,12 @@
  		if (noaction) {
  			notified = 1;
  			printf("kill -%d %d\n", sig, (int) pid);
 -		} else if (kill(pid, sig))
 +		} else if (save_kill(pid, sig))
  			warn("can't notify daemon, pid %d", (int) pid);
  		else {
  			notified = 1;
  			if (verbose)
 -				printf("daemon pid %d notified\n", (int) pid);
 +				printf("will notify daemon pid %d\n", (int) pid);
  		}
  	}
  	if ((flags & CE_COMPACT) || (flags & CE_BZCOMPACT)) {
 @@ -685,23 +768,18 @@
  		else if (noaction)
  			printf("Compress %s.0\n", log);
  		else {
 -			if (notified) {
 -				if (verbose)
 -					printf("small pause to allow daemon to close log\n");
 -				sleep(10);
 -			}
  			if (archtodir) {
  				(void) snprintf(file1, sizeof(file1), "%s/%s",
  				    dirpart, namepart);
  				if (flags & CE_COMPACT)
 -					compress_log(file1);
 +					if (pid) save_compress_log(file1, 0); else compress_log(file1);
  				else if (flags & CE_BZCOMPACT)
 -					bzcompress_log(file1);
 +					if (pid) save_compress_log(file1, 1); else compress_log(file1);
  			} else {
  				if (flags & CE_COMPACT)
 -					compress_log(log);
 +					if (pid) save_compress_log(log, 0); else compress_log(log);
  				else if (flags & CE_BZCOMPACT)
 -					bzcompress_log(log);
 +					if (pid) save_compress_log(log, 1); else compress_log(log);
  			}
  		}
  	}
 

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200204132230.g3DMU3G02571>