diff options
Diffstat (limited to 'calendar.c')
-rw-r--r-- | calendar.c | 60 |
1 files changed, 57 insertions, 3 deletions
@@ -10,6 +10,7 @@ #include <string.h> #include <stdio.h> #include <errno.h> +#include <unistd.h> #include "macro.h" #include "parse.h" @@ -36,8 +37,11 @@ int get_extension(const char* filename, char* ext, ssize_t max_len) { : ext_idx; } -int read_vcalendar(vcalendar* cal, char* path) { +/* + * TODO merge the code for files and dirs. + */ +int parse_dir(vcalendar* cal, char* path) { DIR* dir = opendir(path); struct dirent* d; while ((d = readdir(dir)) != NULL) { @@ -70,11 +74,61 @@ int read_vcalendar(vcalendar* cal, char* path) { parse_file(fname, f, cal); fclose(f); - - ; } closedir(dir); return 0; } + +int read_vcalendar(vcalendar* cal, char* path) { + + struct stat statbuf; + if (stat (path, &statbuf) != 0) { + fprintf(stderr, + "Error opening file or directory, errno = %i\npath = [%s]\n", + errno, path); + } + + int type = statbuf.st_mode & 0777000; + int chmod = statbuf.st_mode & 0777; + printf("file has mode 0%o, with chmod = 0%o\n", type, chmod); + + switch (type) { + case S_IFREG: + puts("Parsing a single file"); + + char ext[10]; + int has_ext = get_extension(path, ext, 9); + if (! has_ext || strcmp(ext, "ics") != 0) { + fprintf(stderr, "File doesn't have .ics extension.\n"); + exit(1); + } + + FILE* f = fopen(path, "r"); + if (f == NULL) { + fprintf(stderr, "Error opening file [%s], errno = %i\n", + path, errno); + exit (1); + } + + parse_file(path, f, cal); + fclose(f); + break; + + case S_IFDIR: + puts("Parsing a directory"); + parse_dir (cal, path); + break; + + case S_IFLNK: + fputs("Found symlink, can't be bothered to check it further.", stderr); + break; + + default: + ; + } + + + return 0; +} |