63 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <sys/types.h>
 | |
| #include <sys/stat.h>
 | |
| #include <fcntl.h>
 | |
| #include <errno.h>
 | |
| #include <stdlib.h>
 | |
| #ifdef __WINDOWS__
 | |
| #include <io.h>
 | |
| #else
 | |
| #include <unistd.h>
 | |
| #endif
 | |
| #include "tai.h"
 | |
| 
 | |
| #define GLOBAL
 | |
| #include "leapsecs.h"
 | |
| 
 | |
| #ifndef O_BINARY
 | |
| #define O_BINARY 0
 | |
| #endif
 | |
| #ifndef O_NDELAY
 | |
| #define O_NDELAY 0
 | |
| #endif
 | |
| 
 | |
| int leapsecs_read(const char *file)
 | |
| { int fd;
 | |
|   struct stat st;
 | |
|   struct tai *t;
 | |
|   int n;
 | |
|   int i;
 | |
|   struct tai u;
 | |
| 
 | |
|   fd = open(file, O_RDONLY|O_NDELAY|O_BINARY);
 | |
|   if (fd == -1) {
 | |
|     if (errno != ENOENT) return -1;
 | |
|     if (leapsecs) free(leapsecs);
 | |
|     leapsecs = 0;
 | |
|     leapsecs_num = 0;
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   if (fstat(fd,&st) == -1) { close(fd); return -1; }
 | |
| 
 | |
|   t = (struct tai *) malloc(st.st_size);
 | |
|   if (!t) { close(fd); return -1; }
 | |
| 
 | |
|   n = read(fd,(char *) t,st.st_size);
 | |
|   close(fd);
 | |
|   if (n != st.st_size) { free(t); return -1; }
 | |
| 
 | |
|   n /= sizeof(struct tai);
 | |
| 
 | |
|   for (i = 0;i < n;++i) {
 | |
|     tai_unpack((char *) &t[i],&u);
 | |
|     t[i] = u;
 | |
|   }
 | |
| 
 | |
|   if (leapsecs) free(leapsecs);
 | |
| 
 | |
|   leapsecs = t;
 | |
|   leapsecs_num = n;
 | |
| 
 | |
|   return 0;
 | |
| }
 |