/*
 * $Header: read_sched.c,v 2.1 89/05/09 15:40:50 billr Exp $
 */
/*
 * This routine has been extracted from the month(1L) program.
 */
/***********************************************************
 *  Month - Visual Monthly Calendar and Time/Event Browser
 *
 *  Original Author: Tim Stoehn (zeus!tims)
 *  "Book code" originally written by Scott Turner (srt@ucla-cs.ARPA)
 *  Subsequent Modifications: Jim Hull (hull@hpda) and
 *                            Michael Morrell (morrell@hpda)
 *
 *
 ***********************************************************/
#ifndef lint
static char rcsid[] = "read_sched.c,v 8.4 88/04/04 11:00:49 hull Exp";
#endif

#include <stdio.h>
#include "month.h"
// #include <sys/file.h>
#include <fcntl.h>

extern struct event_rec events;

read_schedule(m_dir, read_mode)
char *m_dir;
short read_mode;
{
	char *schedule_file_name;
	unsigned rec_size;
	short file_version;
	int fd;
	struct event_rec event_buf, *event_ptr, *chain_ptr;
	extern float get_version();
	extern char *strcat(), *strcpy();

	schedule_file_name = malloc((unsigned) strlen(m_dir)+8);
	if (schedule_file_name == NULL) {
		fprintf(stderr, "mt2ct: out of memory\n");
		exit(1);
	}
	strcpy(schedule_file_name, m_dir);
	strcat(schedule_file_name, "/.month");

	rec_size = sizeof(struct event_rec);
	//umask(0);

	chain_ptr = events.next_event;	/* free old events */
	while (chain_ptr) {
		event_ptr = chain_ptr;
		chain_ptr = chain_ptr->next_event;
		free((char *)event_ptr);
	}
	events.next_event = 0;

        fd = open(schedule_file_name, O_RDONLY);
	free(schedule_file_name);

	if (fd != -1) {
		if (read(fd, (char *) &file_version, sizeof(file_version))
		    == sizeof(file_version)) {
		    if (file_version != (int) get_version()) {
			close(fd);
			fd = -1;
			return(file_version);
		    }
		} else {	/* no version field so assume empty file */
		    if (read_mode == READ_ONLY) {
			close(fd);
			fd = -1;
		    }
		    return(1);
		}

		chain_ptr = &events;

		while (read(fd, &event_buf, rec_size) == rec_size) {
			if (event_ptr = (struct event_rec *)malloc(rec_size)) {
				chain_ptr->next_event = event_ptr;
				chain_ptr = event_ptr;
				*chain_ptr = event_buf;
				chain_ptr->next_event = (struct event_rec *)0;
			} else
				break;
		}
		if (read_mode == READ_ONLY) {
		    close(fd);
		    fd = -1;
		}
		return(0);
	}
	/* if here, open failed */
	return(-1);
}

float
get_version()
{
	return (8.7);
}
