home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume17 / calentool / part22 / read_sched.c < prev    next >
C/C++ Source or Header  |  1991-04-07  |  2KB  |  103 lines

  1. /*
  2.  * $Header: read_sched.c,v 2.1 89/05/09 15:40:50 billr Exp $
  3.  */
  4. /*
  5.  * This routine has been extracted from the month(1L) program.
  6.  */
  7. /***********************************************************
  8.  *  Month - Visual Monthly Calendar and Time/Event Browser
  9.  *
  10.  *  Original Author: Tim Stoehn (zeus!tims)
  11.  *  "Book code" originally written by Scott Turner (srt@ucla-cs.ARPA)
  12.  *  Subsequent Modifications: Jim Hull (hull@hpda) and
  13.  *                            Michael Morrell (morrell@hpda)
  14.  *
  15.  *
  16.  ***********************************************************/
  17. #ifndef lint
  18. static char rcsid[] = "read_sched.c,v 8.4 88/04/04 11:00:49 hull Exp";
  19. #endif
  20.  
  21. #include <stdio.h>
  22. #include "month.h"
  23. #include <sys/file.h>
  24.  
  25. extern struct event_rec events;
  26.  
  27. read_schedule(m_dir, read_mode)
  28. char *m_dir;
  29. short read_mode;
  30. {
  31.     char *schedule_file_name;
  32.     unsigned rec_size;
  33.     short file_version;
  34.     int fd;
  35.     struct event_rec event_buf, *event_ptr, *chain_ptr;
  36.     extern float get_version();
  37.     extern char *strcat(), *strcpy();
  38.  
  39.     schedule_file_name = malloc((unsigned) strlen(m_dir)+8);
  40.     if (schedule_file_name == NULL) {
  41.         fprintf(stderr, "mt2ct: out of memory\n");
  42.         exit(1);
  43.     }
  44.     strcpy(schedule_file_name, m_dir);
  45.     strcat(schedule_file_name, "/.month");
  46.  
  47.     rec_size = sizeof(struct event_rec);
  48.     umask(0);
  49.  
  50.     chain_ptr = events.next_event;    /* free old events */
  51.     while (chain_ptr) {
  52.         event_ptr = chain_ptr;
  53.         chain_ptr = chain_ptr->next_event;
  54.         free((char *)event_ptr);
  55.     }
  56.     events.next_event = 0;
  57.  
  58.         fd = open(schedule_file_name, O_RDONLY);
  59.     free(schedule_file_name);
  60.  
  61.     if (fd != -1) {
  62.         if (read(fd, (char *) &file_version, sizeof(file_version))
  63.             == sizeof(file_version)) {
  64.             if (file_version != (int) get_version()) {
  65.             close(fd);
  66.             fd = -1;
  67.             return(file_version);
  68.             }
  69.         } else {    /* no version field so assume empty file */
  70.             if (read_mode == READ_ONLY) {
  71.             close(fd);
  72.             fd = -1;
  73.             }
  74.             return(1);
  75.         }
  76.  
  77.         chain_ptr = &events;
  78.  
  79.         while (read(fd, &event_buf, rec_size) == rec_size) {
  80.             if (event_ptr = (struct event_rec *)malloc(rec_size)) {
  81.                 chain_ptr->next_event = event_ptr;
  82.                 chain_ptr = event_ptr;
  83.                 *chain_ptr = event_buf;
  84.                 chain_ptr->next_event = (struct event_rec *)0;
  85.             } else
  86.                 break;
  87.         }
  88.         if (read_mode == READ_ONLY) {
  89.             close(fd);
  90.             fd = -1;
  91.         }
  92.         return(0);
  93.     }
  94.     /* if here, open failed */
  95.     return(-1);
  96. }
  97.  
  98. float
  99. get_version()
  100. {
  101.     return (8.7);
  102. }
  103.