/* * Humax EPG Tool * by af123, 2011 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "lint.h" struct epg * open_file(char *filename) { struct epg *epg; struct stat st, st2; if (debug) printf("Opening file '%s'\n", filename); if (stat(filename, &st) == -1) { perror(filename); return NULL; } sleep(1); if (stat(filename, &st2) == -1) { perror(filename); return NULL; } if (st.st_size != st2.st_size) { printf("EPG data file is updating, try later.\n"); return NULL; } if (!(epg = malloc(sizeof(struct epg)))) { perror("malloc"); return NULL; } strcpy(epg->fname, filename); epg->binsize = st.st_size; if (debug) printf("Opening %s, %lu bytes.\n", epg->fname, (unsigned long)epg->binsize); if ((epg->fd = open(epg->fname, O_RDONLY, 0)) == -1) { perror(epg->fname); free(epg); return NULL; } epg->bin = (uint8_t *)mmap(NULL, epg->binsize, PROT_READ, MAP_PRIVATE, epg->fd, 0); if (epg->bin == MAP_FAILED) { perror("mmap"); close(epg->fd); free(epg); return NULL; } epg->offset = 0; return epg; } void close_file(struct epg *epg) { if (debug) printf("Closing file.\n"); munmap((void *)epg->bin, epg->binsize); if (epg->fd > 0) close(epg->fd); epg->fd = -1; }