Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 13 Mar 2014 23:50:01 GMT
From:      oliver <oliver@beefrankly.org>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/166181: [patch] calendar(1): calendar -a does not work
Message-ID:  <201403132350.s2DNo108010863@freefall.freebsd.org>

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

From: oliver <oliver@beefrankly.org>
To: bug-followup@FreeBSD.org, mla_strick@att.net
Cc:  
Subject: Re: bin/166181: [patch] calendar(1): calendar -a does not work
Date: Fri, 14 Mar 2014 00:37:13 +0100

 --MP_/2_vQjW5KtHVoyOm9Zq0qQ6L
 Content-Type: text/plain; charset=US-ASCII
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 I found this problem is still there in stable/10.0 and CURRRENT.
 
 I could reproduce the problem:
 
 If you have multiple calendar files for multiple users, only the first
 calendar file will be mailed. That's because the function
 walkthrough_dates was only intended to run once. So it does not reset
 its state and stays on the last day. 
 
 This can be fixed, as the PR sender did, but that causes the program to
 start from the beginning, adding the new events from the next users
 calendar to the existing struct. so for every run, the old entries are
 kept and the new ones are added. So events from a users (private)
 calendar are send to other users, which is not acceptable.
 
 So here is a patch that cleans up the events after each call of cal()
 in "-a" mode and resets the struct for a new run.
 
 I've tested the patch against some test calendars, and could not find
 any further issues. Every user only gets the events from his own
 calendar.
 
 
 Greetings, Oliver
 --MP_/2_vQjW5KtHVoyOm9Zq0qQ6L
 Content-Type: text/plain
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment; filename=patch.txt
 
 diff -u /usr/src/usr.bin/calendar/calendar.c ./calendar.c
 --- /usr/src/usr.bin/calendar/calendar.c	2014-03-03 19:22:25.000000000 +0100
 +++ ./calendar.c	2014-03-12 23:36:31.000000000 +0100
 @@ -209,8 +209,10 @@
  			(void)setegid(pw->pw_gid);
  			(void)initgroups(pw->pw_name, pw->pw_gid);
  			(void)seteuid(pw->pw_uid);
 -			if (!chdir(pw->pw_dir))
 +			if (!chdir(pw->pw_dir)) {
  				cal();
 +				remove_all_events();
 +			}
  			(void)seteuid(0);
  		}
  	else
 diff -u /usr/src/usr.bin/calendar/calendar.h ./calendar.h
 --- /usr/src/usr.bin/calendar/calendar.h	2014-03-03 19:22:25.000000000 +0100
 +++ ./calendar.h	2014-03-12 23:53:24.000000000 +0100
 @@ -120,6 +120,7 @@
  struct event *event_add(int, int, int, char *, int, char *, char *);
  void	event_continue(struct event *events, char *txt);
  void	event_print_all(FILE *fp);
 +
  struct event {
  	int	year;
  	int	month;
 @@ -183,6 +184,8 @@
  extern int debug_remember;
  void	generatedates(struct tm *tp1, struct tm *tp2);
  void	dumpdates(void);
 +void	remove_all_events(void);
 +void	remove_eventlist(struct event **list);
  int	remember_ymd(int y, int m, int d);
  int	remember_yd(int y, int d, int *rm, int *rd);
  int	first_dayofweek_of_year(int y);
 @@ -190,6 +193,7 @@
  int	walkthrough_dates(struct event **e);
  void	addtodate(struct event *e, int year, int month, int day);
  
 +
  /* pom.c */
  #define	MAXMOONS	18
  void	pom(int year, double UTCoffset, int *fms, int *nms);
 Common subdirectories: /usr/src/usr.bin/calendar/calendars and ./calendars
 diff -u /usr/src/usr.bin/calendar/dates.c ./dates.c
 --- /usr/src/usr.bin/calendar/dates.c	2014-02-19 00:43:47.000000000 +0100
 +++ ./dates.c	2014-03-13 00:44:43.000000000 +0100
 @@ -256,6 +256,45 @@
  	}
  }
  
 +
 +void
 +remove_eventlist(struct event **head) 
 +{
 +	struct event *del;
 +	del = *head;
 +	while(del != NULL) {
 +		*head = (*head)->next;  		
 +		free(del);
 +		del = *head;
 +	}
 +	free(*head);
 +}
 +
 +
 +void
 +remove_all_events(void)
 +{
 +	struct cal_year *y;
 +	struct cal_month *m;
 +	struct cal_day *d;
 +
 +	y = hyear;
 +	while (y != NULL) {
 +		m = y->months;
 +		while (m != NULL) {
 +			d = m->days;
 +			while (d != NULL) {
 +				remove_eventlist(&d->events);
 +				d->events = NULL;
 +				d = d->nextday;
 +			}
 +			m = m->nextmonth;
 +		}
 +		y = y->nextyear;
 +	}
 +}
 +
 +
  int
  remember_ymd(int yy, int mm, int dd)
  {
 @@ -368,6 +407,7 @@
          return (-1);
  }
  
 +
  int
  walkthrough_dates(struct event **e)
  {
 @@ -401,6 +441,7 @@
  		return (1);
  	}
  
 +	y = NULL;
  	return (0);
  }
 
 --MP_/2_vQjW5KtHVoyOm9Zq0qQ6L--



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