[comp.sources.unix] v16i058: A visual calendar and appointment system, Part05/06

rsalz@uunet.uu.net (Rich Salz) (11/10/88)

Submitted-by: Michael Morrell <hplabs!hpda!morrell>
Posting-number: Volume 16, Issue 58
Archive-name: month8.7/part05

# This is a shell archive.  Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
# This archive contains:
#	monthd.c	xmonthd.c	chmonth.c	
LANG=""; export LANG

echo x - monthd.c
cat >monthd.c <<'@EOF'
#ifndef lint
static char rcsid[] = "$Header: monthd.c,v 8.5 88/04/04 11:09:01 hull Exp $";
#endif

#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <ctype.h>
#include "month.h"

short dhour, dminute, dsecond;
short days;
short my_file = 1;
short month_start;
unsigned short file_owner;
char *month_dir = NULL;
char *prog_name;
int dint = 15 * 60;	/* default wake-up interval is 15 minutes */
int user_id;
int parent_pid;
int fd;
FILE *tty;
struct date_rec current_date, todays_date;
struct event_rec events = {{0, 0, 0}, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0},
0, 0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}, 0, 0, 0, 0, 0, {0, 0, 0}, 0};

extern char *get_home_dir();
extern alarm_t alarm();
extern unsigned short getuid();

main(argc, argv)
int argc;
char *argv[];
{
	int sig_terminate();

	prog_name = argv[0];
	user_id = (int) getuid();
	parent_pid = getppid();
	tty = fopen("/dev/tty", "w");
	/*
	fprintf(tty, "%s: pid = %d\n", prog_name, getpid());
	fprintf(tty, "%s: parent_pid = %d\n", prog_name, parent_pid);
	fprintf(tty, "%s: pgrp = %d\n", prog_name, getpgrp());
	*/
	month_dir = get_home_dir(user_id);
	check_args(argc, argv);
	close(0); close(1); close(2);	/* close stdin, stdout, stderr */
	if (fork() == 0) {
	    signal(SIGHUP, sig_terminate);	/* child process */
	    signal(SIGTERM, sig_terminate);
	    signal(SIGINT, SIG_IGN);
	    signal(SIGQUIT, SIG_IGN);
#ifdef SIGTSTP
	    signal(SIGTSTP, SIG_IGN);
	    signal(SIGTTIN, SIG_IGN);
	    signal(SIGTTOU, SIG_IGN);
#endif
	    /*
	    fprintf(tty, "%s: child pid = %d\n", prog_name, getpid());
	    fprintf(tty, "%s: child pgrp before setpgrp2 = %d\n",
		prog_name, getpgrp());
	    */
#ifdef SIGTSTP
#ifdef hpux
	    setpgrp2(0, parent_pid);
#else
	    setpgrp(0, parent_pid);
#endif
#endif
	    inf_loop();
	}

	/*
	fprintf(tty, "%s: parent exiting\n", prog_name);
	*/
	exit(0);
	/* NOTREACHED */
}

check_args(argc, argv)
int argc;
char *argv[];
{
	int err_flag = 0, c;
	extern char *optarg;
	extern int optind;

	while ((c = getopt(argc, argv, "i:")) != EOF) {
	    switch (c) {
	    case 'i':
		if (isdigit(optarg[0]) && (optarg[0] > '0'))
			dint = atoi(optarg) * 60;
		else {
		    fprintf(stderr, "%s: invalid number -- %s\n",
			prog_name, optarg);
		    err_flag++;
		}
		break;
	    case '?':
	        err_flag++;
		break;
	    }
	}

	if (err_flag) {
	    fprintf(stderr, "Usage: %s [-in]\n", prog_name);
	    exit(1);
	}
}

inf_loop()
{
	int stat, do_nothing();
	struct event_rec *eptr;
	short minutes, eminutes, wminutes, diff;
	alarm_t seconds;

	for (;;) {
	    signal(SIGALRM, do_nothing);
	    if (get_todays_date() != 0) {
		fprintf(tty, "%s: Cannot get today's date\n", prog_name);
		exit(1);
	    }
	    seconds = dint - ((60 * dminute + dsecond) % dint);
	    if (seconds < 60)
		seconds += dint;
	    alarm(seconds);
	    minutes = (60 * dhour) + dminute;
	    current_date.month = todays_date.month;
	    current_date.day = todays_date.day;
	    current_date.year = todays_date.year;
	    month_start = get_month_start(current_date.month,
		current_date.year);
	    days = days_in(current_date.month, current_date.year);
	    if (stat = read_schedule(month_dir, READ_ONLY))
		terminate(stat);

	    eptr = events.next_event;

	    while (eptr) {
		if (event_today(eptr)) {
		    eminutes = (((short)60) * eptr->start_time.hour) +
			eptr->start_time.minute;
		    wminutes = (((short)60) * eptr->warning.hour)
			+ eptr->warning.minute;
		    diff = eminutes - minutes;
		    if ((diff >= 0) && (diff <= wminutes))
			print_reminder(eptr->event_string, diff);
		}
		eptr = eptr->next_event;
	    }
	    pause();
	    if (logged_out())
		terminate(0);
	}
}

sig_terminate(sig)
int sig;
{
	signal(SIGHUP, SIG_IGN);
	signal(SIGTERM, SIG_IGN);
	alarm((alarm_t) 0);

	/*
	fprintf(tty, "%s: terminate(%d)\n", prog_name, sig);
	*/
	exit(sig);
	/* NOTREACHED */
}

terminate(code)
int code;
{
	signal(SIGHUP, SIG_IGN);
	signal(SIGTERM, SIG_IGN);
	alarm((alarm_t) 0);

	if (code < 0)
	    fprintf(tty, "%s: cannot open .month\n", prog_name);
	else if (code > 0)
	    fprintf(tty, "%s: cannot read .month version %d\n",
		prog_name, code);
	exit(code);
	/* NOTREACHED */
}

print_reminder(str, minutes)
char *str;
int minutes;
{
	int hours;

	hours = minutes / 60;
	minutes = minutes % 60;
	fprintf(tty, "\r\n%s   \r\n", str);

	if ((hours == 0) && (minutes == 0))
	    fprintf(tty, "Right now");
	else {
	    fprintf(tty, "In");
	    if (hours > 1)
		fprintf(tty, " %d hours", hours);
	    else if (hours == 1)
		fprintf(tty, " 1 hour");

	    if (minutes > 1)
		fprintf(tty, " %d minutes", minutes);
	    else if (minutes == 1)
		fprintf(tty, " 1 minute");
	}

	fprintf(tty, ".   \r\n\007");
}

logged_out()
{
	/*
	fprintf(tty, "%s: child pgrp = %d\n", prog_name, getpgrp());
	*/
#if SYS5
	return(getpgrp() == 0);	/* pgrp is 0 after logout */
#else
	return(getpgrp(0) == 0);/* pgrp is 0 after logout */
#endif
}

do_nothing()
{
}
@EOF

chmod 644 monthd.c

echo x - xmonthd.c
cat >xmonthd.c <<'@EOF'
#ifndef lint
static char rcsid[] = "$Header: xmonthd.c,v 1.4 88/04/04 11:11:18 hull Exp $";
#endif

#include <stdio.h>
#include <signal.h>
#if SYS5
#include <time.h>
#else
#include <sys/time.h>
#endif
#include <sys/types.h>
#include <X/Xlib.h>
#include "month.h"

#ifndef DEF_BORDER
#define DEF_BORDER	2
#endif
#ifndef DEF_INTBORDER
#define DEF_INTBORDER	2
#endif
#ifndef DEF_FONT
#define DEF_FONT	"vtsingle"
#endif
#ifndef DEF_DELAY
#define DEF_DELAY	5
#endif
#ifndef NUM_FLASH
#define NUM_FLASH	10
#endif

#define MAX_EVENT_TIME_LENGTH	24
#define MAX(a, b)	((a) > (b) ? (a) : (b))

struct remind_rec {
	char event_string[MAX_EVENT_STRING_LENGTH];
	char time_string[MAX_EVENT_TIME_LENGTH];
	int time;
	struct remind_rec *next;
};

short dhour, dminute, dsecond;
short days;
short my_file = 1;
short month_start;
unsigned short file_owner;
char *month_dir = NULL;
char *prog_name;
char *geom = NULL;
char *display = NULL;
char *Base_font = DEF_FONT;
char *Fore_color;
char *Back_color;
char *Brdr_color;
int reverse = 0;
int num_flash = NUM_FLASH;
FontInfo *base_font;
int border = DEF_BORDER;
int int_border = DEF_INTBORDER;
int delay = DEF_DELAY;
int fore_color;
int back_color;
int brdr_color;
int width;
int height;
int xneg;
int yneg;
Window win;
int have_new;
int dint = 15 * 60;	/* default wake-up interval is 15 minutes */
int user_id;
int fd;
struct remind_rec *remind_list = 0;
struct date_rec current_date, todays_date;
struct event_rec events = {{0, 0, 0}, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0},
0, 0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}, 0, 0, 0, 0, 0, {0, 0, 0}, 0};

#if !SYS5
#define strchr index
#endif
extern char *strcat(), *strcpy(), *strchr();
extern char *get_home_dir();
extern alarm_t alarm();
extern unsigned short getuid();

main(argc, argv)
int argc;
char *argv[];
{
	char default_geom[20];
	int mask, x, y, sig_terminate();
	Color cdef;
	OpaqueFrame frame;

	prog_name = argv[0];
	user_id = (int) getuid();
	month_dir = get_home_dir(user_id);
	check_Xdefaults();
	check_args(argc, argv);
	close(0); close(1);	/* close stdin, stdout */
	if (fork() == 0) {
	    signal(SIGHUP, sig_terminate);	/* child process */
	    signal(SIGTERM, sig_terminate);
	    signal(SIGINT, SIG_IGN);
	    signal(SIGQUIT, SIG_IGN);
#ifdef SIGTSTP
	    signal(SIGTSTP, SIG_IGN);
	    signal(SIGTTIN, SIG_IGN);
	    signal(SIGTTOU, SIG_IGN);
#endif

	    /* Open X display. */

	    if (XOpenDisplay(display) == NULL) {
		fprintf(stderr, "%s: cannot open display\n", prog_name);
		exit(1);
	    }

	    /* Set up colors and pixmaps. */

	    if (DisplayCells() > 2 &&
		Brdr_color != NULL &&
		XParseColor(Brdr_color, &cdef) &&
		XGetHardwareColor(&cdef)
	    ) brdr_color = cdef.pixel;
	    else if (reverse) brdr_color = WhitePixel;
	    else brdr_color = BlackPixel;

	    if (DisplayCells() > 2 &&
		Fore_color != NULL &&
		XParseColor(Fore_color, &cdef) &&
		XGetHardwareColor(&cdef)
	    ) fore_color = cdef.pixel;
	    else if (reverse) fore_color = WhitePixel;
	    else fore_color = BlackPixel;

	    if (DisplayCells() > 2 &&
		Back_color != NULL &&
		XParseColor(Back_color, &cdef) &&
		XGetHardwareColor(&cdef)
	    ) back_color = cdef.pixel;
	    else if (reverse) back_color = BlackPixel;
	    else back_color = WhitePixel;

	    /* Open the font */

	    if ((base_font = XOpenFont(Base_font)) == NULL) {
                fprintf(stderr, "%s: cannot open font \"%s\"\n",
		    prog_name, Base_font);
		exit(1);
	    }

	    /* Determine if either xoffset and/or yoffset were negative */

	    mask = XParseGeometry(geom, &x, &y, &width, &height);
	    xneg = mask & XNegative;
	    yneg = mask & YNegative;

	    /* Create the window */

	    width = base_font->width*MAX_EVENT_STRING_LENGTH + int_border*2;
	    height = base_font->height*2 + int_border*2;
	    sprintf(default_geom, "=%dx%d+0+0", width, height);
	    frame.bdrwidth = border;
	    frame.border = XMakeTile(brdr_color);
	    frame.background = XMakeTile(back_color);
	    if ((win = XCreate("month events", prog_name, geom, default_geom,
              &frame, width, height)) == 0) {
                fprintf(stderr, "%s: cannot open window\n", prog_name);
		exit(1);
	    }

	    XSelectInput(win, ButtonPressed|ButtonReleased|ExposeWindow);
	    check_sched();
	    inf_loop();
	}
	exit(0);
	/* NOTREACHED */
}

check_Xdefaults()
{
	char *def_val;

	def_val = XGetDefault(prog_name, "Delay");
	if (def_val != NULL) delay = atoi(def_val);

	def_val = XGetDefault(prog_name, "Flashes");
	if (def_val != NULL) num_flash = atoi(def_val);

	def_val = XGetDefault(prog_name, "Geometry");
	if (def_val != NULL) geom = def_val;

	def_val = XGetDefault(prog_name, "InternalBorder");
	if (def_val != NULL) int_border = atoi(def_val);

	def_val = XGetDefault(prog_name, "Interval");
	if (def_val != NULL) dint = atoi(def_val) * 60;

	def_val = XGetDefault(prog_name, "BorderWidth");
	if (def_val != NULL) border = atoi(def_val);

	def_val = XGetDefault(prog_name, "BaseFont");
	if (def_val != NULL) Base_font = def_val;

	Fore_color = XGetDefault(prog_name, "Foreground");
	Back_color = XGetDefault(prog_name, "Background");
	Brdr_color = XGetDefault(prog_name, "Border");

	def_val = XGetDefault(prog_name, "ReverseVideo");
	if (def_val != NULL && strcmp(def_val, "on") == 0) reverse++;
}

check_args(argc, argv)
int argc;
char *argv[];
{
	int i;

	for (i = 1; i < argc; i++) {
	    if (argv[i][0] == '=') {
		geom = argv[i];
		continue;
	    }
	    if (strchr(argv[i], ':') != (char *)NULL) {
		display = argv[i];
		continue;
	    }
	    fprintf(stderr, "Usage: %s [=geometry] [host:display]\n", prog_name);
	    exit(1);
	}
}

inf_loop()
{
	XEvent event;

	for (;;) {
	    XNextEvent(&event);

	    switch(event.type) {
	    case ExposeWindow:
		if (have_new) {
		    flash_window(num_flash);
		    have_new = 0;
		} else
		    draw_window();
		break;
	    case ButtonPressed:
		XUnmapWindow(win);
		break;
	    }
	}
}

sig_terminate(sig)
int sig;
{
	signal(SIGHUP, SIG_IGN);
	signal(SIGTERM, SIG_IGN);
	alarm((alarm_t) 0);

	/*
	fprintf(stderr, "%s: terminate(%d)\n", prog_name, sig);
	*/
	exit(sig);
	/* NOTREACHED */
}

terminate(code)
int code;
{
        signal(SIGHUP, SIG_IGN);
        signal(SIGTERM, SIG_IGN);
        alarm((alarm_t) 0);

        if (code < 0)
            fprintf(stderr, "%s: cannot open .month\n", prog_name);
        else if (code > 0)
            fprintf(stderr, "%s: cannot read .month version %d\n",
                prog_name, code);
        exit(code);
        /* NOTREACHED */
}

struct remind_rec *
link_reminder(str, minutes)
char *str;
int minutes;
{
	int hours;
	char buf[12];
	struct remind_rec *remind;

	remind = (struct remind_rec *)malloc(sizeof(struct remind_rec));
	strcpy(remind->event_string, str);
	remind->time = minutes;
	hours = minutes / 60;
	minutes = minutes % 60;

	if ((hours == 0) && (minutes == 0))
	    strcpy(remind->time_string, "Right now");
	else {
	    strcpy(remind->time_string, "In");
	    if (hours > 1) {
		sprintf(buf, " %d hours", hours);
		strcat(remind->time_string, buf);
	    } else if (hours == 1)
		strcat(remind->time_string, " 1 hour");

	    if (minutes > 1) {
		sprintf(buf, " %d minutes", minutes);
		strcat(remind->time_string, buf);
	    } else if (minutes == 1)
		strcat(remind->time_string, " 1 minute");
	}

	strcat(remind->time_string, ".");
	remind->next = (struct remind_rec *)0;
	return(remind);
}

free_reminders(list)
struct remind_rec *list;
{
	struct remind_rec *p;

	while (list) {
	    p = list->next;
	    free((char *) list);
	    list = p;
	}
}
	    
sort_reminders()
{
	/* algorithm assumes at least one element in list */
	struct remind_rec *o, *p, *q;
	int swap;

	for (;;) {
	    o = (struct remind_rec *) 0;
	    p = remind_list;
	    q = p->next;
	    swap = 0;
	    while (q) {
		if (p->time > q->time) {
		    p->next = q->next;
		    q->next = p;
		    if (o)
			o->next = q;
		    else
			remind_list = q;
		    swap = 1;
		    o = q;
		    q = p->next;
		} else {
		    o = p;
		    p = q;
		    q = q->next;
		}
	    }
	    if (swap == 0)
		break;
	}
}

check_sched()
{
	int stat;
	struct event_rec *eptr;
	struct remind_rec *rptr;
	short minutes, eminutes, wminutes, diff;
	alarm_t seconds;

	signal(SIGALRM, check_sched);
	if (get_todays_date() != 0) {
	    fprintf(stderr, "%s: Cannot get today's date\n", prog_name);
	    exit(1);
	}
	seconds = dint - ((60 * dminute + dsecond) % dint);
	if (seconds < 60)
	    seconds += dint;
	alarm(seconds);
	minutes = (60 * dhour) + dminute;
	current_date.month = todays_date.month;
	current_date.day = todays_date.day;
	current_date.year = todays_date.year;
	month_start = get_month_start(current_date.month,
	    current_date.year);
	days = days_in(current_date.month, current_date.year);
	if (stat = read_schedule(month_dir, READ_ONLY))
	    terminate(stat);

	eptr = events.next_event;
	have_new = 0;

	while (eptr) {
	    if (event_today(eptr)) {
		eminutes = (((short)60) * eptr->start_time.hour) +
		    eptr->start_time.minute;
		wminutes = (((short)60) * eptr->warning.hour)
		    + eptr->warning.minute;
		diff = eminutes - minutes;
		if ((diff >= 0) && (diff <= wminutes)) {
		    if (have_new++) {
			rptr->next = link_reminder(eptr->event_string, diff);
			rptr = rptr->next;
		    } else {
			free_reminders(remind_list);
			remind_list = link_reminder(eptr->event_string, diff);
			rptr = remind_list;
		    }
		}
	    }
	    eptr = eptr->next_event;
	}

	if (have_new) {
	    sort_reminders();
	    map_window(have_new);
	}
}

map_window(num_events)
int num_events;
{
	struct remind_rec *rptr = remind_list;
	WindowInfo wininfo;

	width = 0;
	while (rptr) {
	    width = MAX(width, XStringWidth(rptr->event_string, base_font,
		0, 0));
	    width = MAX(width, XStringWidth(rptr->time_string, base_font,
		0, 0));
	    rptr = rptr->next;
	}

	width += (2 * int_border);
	height = (3 * num_events - 1) * base_font->height + 2 * int_border;

	XQueryWindow(win, &wininfo);

	if (xneg)
	    wininfo.x += (wininfo.width - width);
	if (yneg)
	    wininfo.y += (wininfo.height - height);

	XConfigureWindow(win, (int)wininfo.x, (int)wininfo.y, width, height);
	XMapWindow(win);
	XFeep(0);
	XFlush();
}

draw_window()
{
	struct remind_rec *rptr = remind_list;
	int x = int_border;
	int y = int_border;
	int yline;

	XPixSet (win, 0, 0, width, height, back_color);

	while (rptr) {
	    XText(win, x, y, rptr->event_string, strlen(rptr->event_string),
		base_font->id, fore_color, back_color);
	    y += base_font->height;
	    XText(win, x, y, rptr->time_string, strlen(rptr->time_string),
		base_font->id, fore_color, back_color);
	    y += 2*base_font->height;
	    yline = y - base_font->height / 2;
	    if (y < height)
		XLine(win, 0, yline, width - 1, yline, 1, 1,
		    brdr_color, GXcopy, AllPlanes);
	    rptr = rptr->next;
	}
}

flash_window(num)
int num;
{
	int i, j;
	int temp_color;
#if defined(hpux) || !SYS5
	static struct timeval delaytime;

	delaytime.tv_sec = 0;
	delaytime.tv_usec = delay * 10000;
#endif

	for (i = 0; i < num; i++) {
	    for (j = 0; j < 2; j++) {
		temp_color = fore_color;
		fore_color = back_color;
		back_color = temp_color;
		draw_window();
		XFlush();
#if defined(hpux) || !SYS5
		(void) select (0, (fd_type *)0, (fd_type *)0, (fd_type *)0,
			&delaytime);
#endif
	    }
	}
}
@EOF

chmod 644 xmonthd.c

echo x - chmonth.c
cat >chmonth.c <<'@EOF'
#ifndef lint
static char rcsid[] = "$Header: chmonth.c,v 8.3 88/01/15 10:58:19 hull Exp $";
#endif

#include <stdio.h>
#include <sys/types.h>
#if LOCKF
#include <fcntl.h>
#include <unistd.h>
#endif LOCKF
#if FLOCK
#include <sys/file.h>
#endif FLOCK
#include <pwd.h>
#include "month.h"
#include "month2.h"
#include "month3.h"
#include "month4.h"
#include "month5.h"
#include "month6.h"
#include "month7.h"

short updating, update_schedule = 1, keep_old = 1;
int user_id, fd;
char *month_dir = NULL;
struct date_rec todays_date;
struct event_rec2 events2 = {0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0},
0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
struct event_rec3 events3 = {0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0},
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
struct event_rec4 events4 = {0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0},
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
struct event_rec5 events5 = {0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0},
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
struct event_rec6 events6 = {0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0},
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
struct event_rec7 events7 = {{0, 0, 0}, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0},
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0}, 0};
struct event_rec events = {{0, 0, 0}, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0},
0, 0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}, 0, 0, 0, 0, 0, {0, 0, 0}, 0};
extern char *strcat(), *strcpy();
extern unsigned short getuid();
extern float get_version();

char *
get_user()
{
	struct passwd *pw;

	user_id = (int) getuid();

	if ((pw = getpwuid(user_id)) == NULL)
	    return(NULL);
	else
	    return(pw->pw_dir);
}

char *
get_user_arg(arg)
char *arg;
{
	struct passwd *pw;

	if ((pw = getpwnam(arg)) == NULL)
	    return(NULL);
	else {
	    user_id = pw->pw_uid;
	    return(pw->pw_dir);
	}
}

check_args(argc, argv)
int argc;
char *argv[];
{
	switch(argc) {
	case 1:
		if ((month_dir = get_user()) == NULL) {
			printf("%s: No passwd entry\n", argv[0]);
			printf("Usage: %s [user]\n", argv[0]);
			exit(1);
		}
		user_id = (int) getuid();
		break;
	case 2:
		if ((month_dir = get_user_arg(argv[1])) == NULL) {
			printf("%s: No such user -- %s\n", argv[0], argv[1]);
			printf("Usage: %s [user]\n", argv[0]);
			exit(1);
		}
		break;
	default:
		printf("Usage: %s [user]\n", argv[0]);
		exit(1);

	}
}

main(argc, argv)
int argc;
char *argv[];
{
	int ret;

	check_args(argc, argv);
	if ((ret = read_schedule7(month_dir)) == 0)
	    convert_schedule7();
	else if ((ret = read_schedule6(month_dir)) == 0)
	    convert_schedule6();
	else if ((ret = read_schedule5(month_dir)) == 0)
	    convert_schedule5();
	else if ((ret = read_schedule4(month_dir)) == 0)
	    convert_schedule4();
	else if ((ret = read_schedule3(month_dir)) == 0)
	    convert_schedule3();
	else
	    if (ret == -2) {
		printf(".month file locked\n");
		exit(1);
	    } else if (ret == -1) {
		printf("cannot open .month\n");
		exit(1);
	    } else if (ret == (int) get_version()) {
		printf(".month file is up-to-date\n");
		exit(2);
	    } else
		if ((ret = read_schedule2(month_dir)) == 0)
		    convert_schedule2();
		else
		    if (ret == -2) {
			printf(".month file locked\n");
			exit(1);
		    } else if (ret == -1) {
			printf("cannot open .month\n");
			exit(1);
		    }

	if (write_schedule() < 0) {
	    printf("cannot write .month\n");
	    exit(1);
	}

	exit(0);
	/* NOTREACHED */
}

read_schedule2(m_dir)
char *m_dir;
{
	char *schedule_file_name;
	unsigned rec_size;
	struct event_rec2 event_buf, *event_ptr, *chain_ptr;

#ifdef DEBUG
	printf("reading schedule");
#endif
	events2.next_event = 0;

	schedule_file_name = malloc((unsigned) strlen(m_dir)+8);
	strcpy(schedule_file_name, m_dir);
	strcat(schedule_file_name, "/.month");
#ifdef DEBUG
	printf(" %s\n", schedule_file_name);
#endif

	rec_size = sizeof(struct event_rec2);

#if MULTIUSER
	if ((fd = open(schedule_file_name, O_RDWR|O_CREAT)) != -1)
#if LOCKF
	    if (lockf(fd, F_TLOCK, 0L) == -1)
#else
#if FLOCK
	    if (flock(fd, LOCK_EX | LOCK_NB) == -1)
#endif FLOCK
#endif LOCKF
		return(-2);
#else
	fd = open(schedule_file_name, O_RDWR|O_CREAT);
#endif MULTIUSER

	if (fd != -1) {
		chain_ptr = &events2;

		while (read(fd, &event_buf, rec_size) == rec_size) {
			if (event_ptr = (struct event_rec2 *) malloc(rec_size)) {
				chain_ptr->next_event = event_ptr;
				chain_ptr = event_ptr;
				*chain_ptr = event_buf;
				chain_ptr->next_event = (struct event_rec2 *)0;
			} else
				break;
		}
		return(0);
	}
	return(-1);
}

convert_schedule2()
{
	struct event_rec *chain_ptr, *event_ptr;
	struct event_rec2 *chain_ptr2;

#ifdef DEBUG
	printf("converting schedule\n");
#endif
	chain_ptr = &events;
	chain_ptr2 = events2.next_event;

	while (chain_ptr2) {
		if (event_ptr = (struct event_rec *) malloc(sizeof(struct event_rec))) {
			chain_ptr->next_event = event_ptr;
			chain_ptr = event_ptr;
			copy_event2(chain_ptr2, chain_ptr);
			chain_ptr->next_event = (struct event_rec *)0;
		} else
			break;
		chain_ptr2 = chain_ptr2->next_event;
	}
}

copy_event2(event_ptr2, event_ptr)
struct event_rec2 *event_ptr2;
struct event_rec *event_ptr;
{
	int i;

	event_ptr->start_date.month = event_ptr2->event_month;
	event_ptr->start_date.day = event_ptr2->event_day;
	event_ptr->start_date.year = event_ptr2->event_year;
	event_ptr->monthly = event_ptr2->monthly;
	event_ptr->yearly = event_ptr2->yearly;
	event_ptr->every = event_ptr2->every;
	for (i = 0; i < 7; i++)
	    event_ptr->smtwtfs[i] = event_ptr2->smtwtfs[i];
	event_ptr->nth = event_ptr2->nth;
	event_ptr->last = event_ptr2->last;
	event_ptr->nth_is_on = event_ptr2->nth_is_on;
	event_ptr->start_time.hour = event_ptr2->hour;
	event_ptr->start_time.minute = event_ptr2->minute;
	event_ptr->duration.hour = event_ptr2->duration_hours;
	event_ptr->duration.minute = event_ptr2->duration_minutes;
	event_ptr->warning.hour = 0;
	event_ptr->warning.minute = 15;
	event_ptr->end_time.minute = event_ptr->start_time.minute +
	    event_ptr->duration.minute;
	event_ptr->end_time.hour = (event_ptr->start_time.hour +
	    event_ptr->duration.hour + (event_ptr->end_time.minute / 60)) % 24;
	event_ptr->end_time.minute %= 60;
	for (i = 0; i < MAX_EVENT_STRING_LENGTH; i++)
	    event_ptr->event_string[i] = event_ptr2->event_string[i];
	event_ptr->private = event_ptr2->private;
	event_ptr->event_owner = user_id;
	event_ptr->until = 0;
	event_ptr->until_date.month = event_ptr2->event_month;
	event_ptr->until_date.day = event_ptr2->event_day;
	event_ptr->until_date.year = event_ptr2->event_year;
}

read_schedule3(m_dir)
char *m_dir;
{
	char *schedule_file_name;
	unsigned rec_size;
	short file_version;
	struct event_rec3 event_buf, *event_ptr, *chain_ptr;

#ifdef DEBUG
	printf("reading schedule");
#endif
	schedule_file_name = malloc((unsigned) strlen(m_dir)+8);
	strcpy(schedule_file_name, m_dir);
	strcat(schedule_file_name, "/.month");
#ifdef DEBUG
	printf(" %s\n", schedule_file_name);
#endif

	rec_size = sizeof(struct event_rec3);
	umask(0);

#if MULTIUSER
	if ((fd = open(schedule_file_name, O_RDWR|O_CREAT)) != -1)
#if LOCKF
	    if (lockf(fd, F_TLOCK, 0L) == -1)
#else
#if FLOCK
	    if (flock(fd, LOCK_EX | LOCK_NB) == -1)
#endif FLOCK
#endif LOCKF
		return(-2);
#else
	fd = open(schedule_file_name, O_RDWR|O_CREAT);
#endif MULTIUSER

	if (fd != -1) {
		events3.next_event = 0;

		if (read(fd, (char *) &file_version, sizeof(file_version)) !=
		    sizeof(file_version))
			return(-1);
		if (file_version != 3)
			return(file_version);

		chain_ptr = &events3;

		while (read(fd, &event_buf, rec_size) == rec_size) {
			if (event_ptr = (struct event_rec3 *) malloc(rec_size)) {
				chain_ptr->next_event = event_ptr;
				chain_ptr = event_ptr;
				*chain_ptr = event_buf;
				chain_ptr->next_event = (struct event_rec3 *)0;
			} else
				break;
		}
		return(0);
	}
	return(-1);
}

convert_schedule3()
{
	struct event_rec *chain_ptr, *event_ptr;
	struct event_rec3 *chain_ptr3;

#ifdef DEBUG
	printf("converting schedule\n");
#endif
	chain_ptr = &events;
	chain_ptr3 = events3.next_event;

	while (chain_ptr3) {
		if (event_ptr = (struct event_rec *) malloc(sizeof(struct event_rec))) {
			chain_ptr->next_event = event_ptr;
			chain_ptr = event_ptr;
			copy_event3(chain_ptr3, chain_ptr);
			chain_ptr->next_event = (struct event_rec *)0;
		} else
			break;
		chain_ptr3 = chain_ptr3->next_event;
	}
}

copy_event3(event_ptr3, event_ptr)
struct event_rec3 *event_ptr3;
struct event_rec *event_ptr;
{
	int i;

	event_ptr->start_date.month = event_ptr3->event_month;
	event_ptr->start_date.day = event_ptr3->event_day;
	event_ptr->start_date.year = event_ptr3->event_year;
	event_ptr->monthly = event_ptr3->monthly;
	event_ptr->yearly = event_ptr3->yearly;
	event_ptr->every = event_ptr3->every;
	for (i = 0; i < 7; i++)
	    event_ptr->smtwtfs[i] = event_ptr3->smtwtfs[i];
	event_ptr->nth = event_ptr3->nth;
	event_ptr->last = event_ptr3->last;
	event_ptr->nth_is_on = event_ptr3->nth_is_on;
	event_ptr->start_time.hour = event_ptr3->hour;
	event_ptr->start_time.minute = event_ptr3->minute;
	event_ptr->duration.hour = event_ptr3->duration_hours;
	event_ptr->duration.minute = event_ptr3->duration_minutes;
	event_ptr->warning.hour = 0;
	event_ptr->warning.minute = 15;
	event_ptr->end_time.minute = event_ptr->start_time.minute +
	    event_ptr->duration.minute;
	event_ptr->end_time.hour = (event_ptr->start_time.hour +
	    event_ptr->duration.hour + (event_ptr->end_time.minute / 60)) % 24;
	event_ptr->end_time.minute %= 60;
	for (i = 0; i < MAX_EVENT_STRING_LENGTH; i++)
	    event_ptr->event_string[i] = event_ptr3->event_string[i];
	event_ptr->private = event_ptr3->private;
	event_ptr->event_owner = event_ptr3->event_owner;
	event_ptr->until = 0;
	event_ptr->until_date.month = event_ptr3->event_month;
	event_ptr->until_date.day = event_ptr3->event_day;
	event_ptr->until_date.year = event_ptr3->event_year;
}

read_schedule4(m_dir)
char *m_dir;
{
	char *schedule_file_name;
	unsigned rec_size;
	short file_version;
	struct event_rec4 event_buf, *event_ptr, *chain_ptr;

#ifdef DEBUG
	printf("reading schedule");
#endif
	schedule_file_name = malloc((unsigned) strlen(m_dir)+8);
	strcpy(schedule_file_name, m_dir);
	strcat(schedule_file_name, "/.month");
#ifdef DEBUG
	printf(" %s\n", schedule_file_name);
#endif

	rec_size = sizeof(struct event_rec4);
	umask(0);

#if MULTIUSER
	if ((fd = open(schedule_file_name, O_RDWR|O_CREAT)) != -1)
#if LOCKF
	    if (lockf(fd, F_TLOCK, 0L) == -1)
#else
#if FLOCK
	    if (flock(fd, LOCK_EX | LOCK_NB) == -1)
#endif FLOCK
#endif LOCKF
		return(-2);
#else
	fd = open(schedule_file_name, O_RDWR|O_CREAT);
#endif MULTIUSER

	if (fd != -1) {
		events4.next_event = 0;

		if (read(fd, (char *) &file_version, sizeof(file_version)) !=
		    sizeof(file_version))
			return(-1);
		if (file_version != 4)
			return(file_version);

		chain_ptr = &events4;

		while (read(fd, &event_buf, rec_size) == rec_size) {
			if (event_ptr = (struct event_rec4 *) malloc(rec_size)) {
				chain_ptr->next_event = event_ptr;
				chain_ptr = event_ptr;
				*chain_ptr = event_buf;
				chain_ptr->next_event = (struct event_rec4 *)0;
			} else
				break;
		}
		return(0);
	}
	return(-1);
}

convert_schedule4()
{
	struct event_rec *chain_ptr, *event_ptr;
	struct event_rec4 *chain_ptr4;

#ifdef DEBUG
	printf("converting schedule\n");
#endif
	chain_ptr = &events;
	chain_ptr4 = events4.next_event;

	while (chain_ptr4) {
		if (event_ptr = (struct event_rec *) malloc(sizeof(struct event_rec))) {
			chain_ptr->next_event = event_ptr;
			chain_ptr = event_ptr;
			copy_event4(chain_ptr4, chain_ptr);
			chain_ptr->next_event = (struct event_rec *)0;
		} else
			break;
		chain_ptr4 = chain_ptr4->next_event;
	}
}

copy_event4(event_ptr4, event_ptr)
struct event_rec4 *event_ptr4;
struct event_rec *event_ptr;
{
	int i;

	event_ptr->start_date.month = event_ptr4->start_month;
	event_ptr->start_date.day = event_ptr4->start_day;
	event_ptr->start_date.year = event_ptr4->start_year;
	event_ptr->monthly = event_ptr4->monthly;
	event_ptr->yearly = event_ptr4->yearly;
	event_ptr->every = event_ptr4->every;
	for (i = 0; i < 7; i++)
	    event_ptr->smtwtfs[i] = event_ptr4->smtwtfs[i];
	event_ptr->nth = event_ptr4->nth;
	event_ptr->last = event_ptr4->last;
	event_ptr->nth_is_on = event_ptr4->nth_is_on;
	event_ptr->start_time.hour = event_ptr4->hour;
	event_ptr->start_time.minute = event_ptr4->minute;
	event_ptr->duration.hour = event_ptr4->duration_hours;
	event_ptr->duration.minute = event_ptr4->duration_minutes;
	event_ptr->warning.hour = 0;
	event_ptr->warning.minute = 15;
	event_ptr->end_time.minute = event_ptr->start_time.minute +
	    event_ptr->duration.minute;
	event_ptr->end_time.hour = (event_ptr->start_time.hour +
	    event_ptr->duration.hour + (event_ptr->end_time.minute / 60)) % 24;
	event_ptr->end_time.minute %= 60;
	for (i = 0; i < MAX_EVENT_STRING_LENGTH; i++)
	    event_ptr->event_string[i] = event_ptr4->event_string[i];
	event_ptr->private = event_ptr4->private;
	event_ptr->event_owner = event_ptr4->event_owner;
	event_ptr->until = event_ptr4->until;
	event_ptr->until_date.month = event_ptr4->until_month;
	event_ptr->until_date.day = event_ptr4->until_day;
	event_ptr->until_date.year = event_ptr4->until_year;
}

read_schedule5(m_dir)
char *m_dir;
{
	char *schedule_file_name;
	unsigned rec_size;
	short file_version;
	struct event_rec5 event_buf, *event_ptr, *chain_ptr;

#ifdef DEBUG
	printf("reading schedule");
#endif
	schedule_file_name = malloc((unsigned) strlen(m_dir)+8);
	strcpy(schedule_file_name, m_dir);
	strcat(schedule_file_name, "/.month");
#ifdef DEBUG
	printf(" %s\n", schedule_file_name);
#endif

	rec_size = sizeof(struct event_rec5);
	umask(0);

#if MULTIUSER
	if ((fd = open(schedule_file_name, O_RDWR|O_CREAT)) != -1)
#if LOCKF
	    if (lockf(fd, F_TLOCK, 0L) == -1)
#else
#if FLOCK
	    if (flock(fd, LOCK_EX | LOCK_NB) == -1)
#endif FLOCK
#endif LOCKF
		return(-2);
#else
	fd = open(schedule_file_name, O_RDWR|O_CREAT);
#endif MULTIUSER

	if (fd != -1) {
		events5.next_event = 0;

		if (read(fd, (char *) &file_version, sizeof(file_version)) !=
		    sizeof(file_version))
			return(-1);
		if (file_version != 5)
			return(file_version);

		chain_ptr = &events5;

		while (read(fd, &event_buf, rec_size) == rec_size) {
			if (event_ptr = (struct event_rec5 *) malloc(rec_size)) {
				chain_ptr->next_event = event_ptr;
				chain_ptr = event_ptr;
				*chain_ptr = event_buf;
				chain_ptr->next_event = (struct event_rec5 *)0;
			} else
				break;
		}
		return(0);
	}
	return(-1);
}

convert_schedule5()
{
	struct event_rec *chain_ptr, *event_ptr;
	struct event_rec5 *chain_ptr5;

#ifdef DEBUG
	printf("converting schedule\n");
#endif
	chain_ptr = &events;
	chain_ptr5 = events5.next_event;

	while (chain_ptr5) {
		if (event_ptr = (struct event_rec *) malloc(sizeof(struct event_rec))) {
			chain_ptr->next_event = event_ptr;
			chain_ptr = event_ptr;
			copy_event5(chain_ptr5, chain_ptr);
			chain_ptr->next_event = (struct event_rec *)0;
		} else
			break;
		chain_ptr5 = chain_ptr5->next_event;
	}
}

copy_event5(event_ptr5, event_ptr)
struct event_rec5 *event_ptr5;
struct event_rec *event_ptr;
{
	int i;

	event_ptr->start_date.month = event_ptr5->start_month;
	event_ptr->start_date.day = event_ptr5->start_day;
	event_ptr->start_date.year = event_ptr5->start_year;
	event_ptr->monthly = event_ptr5->monthly;
	event_ptr->yearly = event_ptr5->yearly;
	event_ptr->every = event_ptr5->every;
	for (i = 0; i < 7; i++)
	    event_ptr->smtwtfs[i] = event_ptr5->smtwtfs[i];
	event_ptr->nth = event_ptr5->nth;
	event_ptr->last = event_ptr5->last;
	event_ptr->nth_is_on = event_ptr5->nth_is_on;
	event_ptr->start_time.hour = event_ptr5->hour;
	event_ptr->start_time.minute = event_ptr5->minute;
	event_ptr->duration.hour = event_ptr5->duration_hours;
	event_ptr->duration.minute = event_ptr5->duration_minutes;
	event_ptr->warning.hour = event_ptr5->warning_hours;
	event_ptr->warning.minute = event_ptr5->warning_minutes;
	event_ptr->end_time.minute = event_ptr->start_time.minute +
	    event_ptr->duration.minute;
	event_ptr->end_time.hour = (event_ptr->start_time.hour +
	    event_ptr->duration.hour + (event_ptr->end_time.minute / 60)) % 24;
	event_ptr->end_time.minute %= 60;
	for (i = 0; i < MAX_EVENT_STRING_LENGTH; i++)
	    event_ptr->event_string[i] = event_ptr5->event_string[i];
	event_ptr->private = event_ptr5->private;
	event_ptr->anti = 0;
	event_ptr->event_owner = event_ptr5->event_owner;
	event_ptr->until = event_ptr5->until;
	event_ptr->until_date.month = event_ptr5->until_month;
	event_ptr->until_date.day = event_ptr5->until_day;
	event_ptr->until_date.year = event_ptr5->until_year;
}

read_schedule6(m_dir)
char *m_dir;
{
	char *schedule_file_name;
	unsigned rec_size;
	short file_version;
	struct event_rec6 event_buf, *event_ptr, *chain_ptr;

#ifdef DEBUG
	printf("reading schedule");
#endif
	schedule_file_name = malloc((unsigned) strlen(m_dir)+8);
	strcpy(schedule_file_name, m_dir);
	strcat(schedule_file_name, "/.month");
#ifdef DEBUG
	printf(" %s\n", schedule_file_name);
#endif

	rec_size = sizeof(struct event_rec6);
	umask(0);

#if MULTIUSER
	if ((fd = open(schedule_file_name, O_RDWR|O_CREAT)) != -1)
#if LOCKF
	    if (lockf(fd, F_TLOCK, 0L) == -1)
#else
#if FLOCK
	    if (flock(fd, LOCK_EX | LOCK_NB) == -1)
#endif FLOCK
#endif LOCKF
		return(-2);
#else
	fd = open(schedule_file_name, O_RDWR|O_CREAT);
#endif MULTIUSER

	if (fd != -1) {
		events6.next_event = 0;

		if (read(fd, (char *) &file_version, sizeof(file_version)) !=
		    sizeof(file_version))
			return(-1);
		if (file_version != 6)
			return(file_version);

		chain_ptr = &events6;

		while (read(fd, &event_buf, rec_size) == rec_size) {
			if (event_ptr = (struct event_rec6 *) malloc(rec_size)) {
				chain_ptr->next_event = event_ptr;
				chain_ptr = event_ptr;
				*chain_ptr = event_buf;
				chain_ptr->next_event = (struct event_rec6 *)0;
			} else
				break;
		}
		return(0);
	}
	return(-1);
}

convert_schedule6()
{
	struct event_rec *chain_ptr, *event_ptr;
	struct event_rec6 *chain_ptr6;

#ifdef DEBUG
	printf("converting schedule\n");
#endif
	chain_ptr = &events;
	chain_ptr6 = events6.next_event;

	while (chain_ptr6) {
		if (event_ptr = (struct event_rec *) malloc(sizeof(struct event_rec))) {
			chain_ptr->next_event = event_ptr;
			chain_ptr = event_ptr;
			copy_event6(chain_ptr6, chain_ptr);
			chain_ptr->next_event = (struct event_rec *)0;
		} else
			break;
		chain_ptr6 = chain_ptr6->next_event;
	}
}

copy_event6(event_ptr6, event_ptr)
struct event_rec6 *event_ptr6;
struct event_rec *event_ptr;
{
	int i;

	event_ptr->start_date.month = event_ptr6->start_month;
	event_ptr->start_date.day = event_ptr6->start_day;
	event_ptr->start_date.year = event_ptr6->start_year;
	event_ptr->monthly = event_ptr6->monthly;
	event_ptr->yearly = event_ptr6->yearly;
	event_ptr->every = event_ptr6->every;
	for (i = 0; i < 7; i++)
	    event_ptr->smtwtfs[i] = event_ptr6->smtwtfs[i];
	event_ptr->nth = event_ptr6->nth;
	event_ptr->last = event_ptr6->last;
	event_ptr->nth_is_on = event_ptr6->nth_is_on;
	event_ptr->start_time.hour = event_ptr6->hour;
	event_ptr->start_time.minute = event_ptr6->minute;
	event_ptr->duration.hour = event_ptr6->duration_hours;
	event_ptr->duration.minute = event_ptr6->duration_minutes;
	event_ptr->warning.hour = event_ptr6->warning_hours;
	event_ptr->warning.minute = event_ptr6->warning_minutes;
	event_ptr->end_time.minute = event_ptr->start_time.minute +
	    event_ptr->duration.minute;
	event_ptr->end_time.hour = (event_ptr->start_time.hour +
	    event_ptr->duration.hour + (event_ptr->end_time.minute / 60)) % 24;
	event_ptr->end_time.minute %= 60;
	for (i = 0; i < MAX_EVENT_STRING_LENGTH; i++)
	    event_ptr->event_string[i] = event_ptr6->event_string[i];
	event_ptr->private = event_ptr6->private;
	event_ptr->anti = event_ptr6->anti;
	event_ptr->event_owner = event_ptr6->event_owner;
	event_ptr->until = event_ptr6->until;
	event_ptr->until_date.month = event_ptr6->until_month;
	event_ptr->until_date.day = event_ptr6->until_day;
	event_ptr->until_date.year = event_ptr6->until_year;
}

read_schedule7(m_dir)
char *m_dir;
{
	char *schedule_file_name;
	unsigned rec_size;
	short file_version;
	struct event_rec7 event_buf, *event_ptr, *chain_ptr;

#ifdef DEBUG
	printf("reading schedule");
#endif
	schedule_file_name = malloc((unsigned) strlen(m_dir)+8);
	strcpy(schedule_file_name, m_dir);
	strcat(schedule_file_name, "/.month");
#ifdef DEBUG
	printf(" %s\n", schedule_file_name);
#endif

	rec_size = sizeof(struct event_rec7);
	umask(0);

#if MULTIUSER
	if ((fd = open(schedule_file_name, O_RDWR|O_CREAT)) != -1)
#if LOCKF
	    if (lockf(fd, F_TLOCK, 0L) == -1)
#else
#if FLOCK
	    if (flock(fd, LOCK_EX | LOCK_NB) == -1)
#endif FLOCK
#endif LOCKF
		return(-2);
#else
	fd = open(schedule_file_name, O_RDWR|O_CREAT);
#endif MULTIUSER

	if (fd != -1) {
		events7.next_event = 0;

		if (read(fd, (char *) &file_version, sizeof(file_version)) !=
		    sizeof(file_version))
			return(-1);
		if (file_version != 7)
			return(file_version);

		chain_ptr = &events7;

		while (read(fd, &event_buf, rec_size) == rec_size) {
			if (event_ptr = (struct event_rec7 *) malloc(rec_size)) {
				chain_ptr->next_event = event_ptr;
				chain_ptr = event_ptr;
				*chain_ptr = event_buf;
				chain_ptr->next_event = (struct event_rec7 *)0;
			} else
				break;
		}
		return(0);
	}
	return(-1);
}

convert_schedule7()
{
	struct event_rec *chain_ptr, *event_ptr;
	struct event_rec7 *chain_ptr7;

#ifdef DEBUG
	printf("converting schedule\n");
#endif
	chain_ptr = &events;
	chain_ptr7 = events7.next_event;

	while (chain_ptr7) {
		if (event_ptr = (struct event_rec *) malloc(sizeof(struct event_rec))) {
			chain_ptr->next_event = event_ptr;
			chain_ptr = event_ptr;
			copy_event7(chain_ptr7, chain_ptr);
			chain_ptr->next_event = (struct event_rec *)0;
		} else
			break;
		chain_ptr7 = chain_ptr7->next_event;
	}
}

copy_event7(event_ptr7, event_ptr)
struct event_rec7 *event_ptr7;
struct event_rec *event_ptr;
{
	int i;

	event_ptr->start_date.month = event_ptr7->start_date.month;
	event_ptr->start_date.day = event_ptr7->start_date.day;
	event_ptr->start_date.year = event_ptr7->start_date.year;
	event_ptr->monthly = event_ptr7->monthly;
	event_ptr->yearly = event_ptr7->yearly;
	event_ptr->every = event_ptr7->every;
	for (i = 0; i < 7; i++)
	    event_ptr->smtwtfs[i] = event_ptr7->smtwtfs[i];
	event_ptr->nth = event_ptr7->nth;
	event_ptr->last = event_ptr7->last;
	event_ptr->nth_is_on = event_ptr7->nth_is_on;
	event_ptr->start_time.hour = event_ptr7->hour;
	event_ptr->start_time.minute = event_ptr7->minute;
	event_ptr->duration.hour = event_ptr7->duration_hours;
	event_ptr->duration.minute = event_ptr7->duration_minutes;
	event_ptr->warning.hour = event_ptr7->warning_hours;
	event_ptr->warning.minute = event_ptr7->warning_minutes;
	event_ptr->end_time.minute = event_ptr->start_time.minute +
	    event_ptr->duration.minute;
	event_ptr->end_time.hour = (event_ptr->start_time.hour +
	    event_ptr->duration.hour + (event_ptr->end_time.minute / 60)) % 24;
	event_ptr->end_time.minute %= 60;
	for (i = 0; i < MAX_EVENT_STRING_LENGTH; i++)
	    event_ptr->event_string[i] = event_ptr7->event_string[i];
	event_ptr->private = event_ptr7->private;
	event_ptr->anti = event_ptr7->anti;
	event_ptr->event_owner = event_ptr7->event_owner;
	event_ptr->until = event_ptr7->until;
	event_ptr->until_date.month = event_ptr7->until_date.month;
	event_ptr->until_date.day = event_ptr7->until_date.day;
	event_ptr->until_date.year = event_ptr7->until_date.year;
}

/* ARGSUSED */
delete_event(event)
struct event_rec *event;
{
/* dummy routine to satisfy reference in write_schedule */
}
@EOF

chmod 644 chmonth.c

exit 0

-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.