initial epg check-in
This commit is contained in:
commit
9ebe37681b
|
@ -0,0 +1,65 @@
|
||||||
|
|
||||||
|
MAKE=gmake
|
||||||
|
|
||||||
|
# Setting these makes sure that the subsequent include files know that
|
||||||
|
# we are going to be threaded so they should do whatever they need to
|
||||||
|
# support this. In particular, this makes the global variable 'errno'
|
||||||
|
# become thread safe by replacing it with a call to the internal function
|
||||||
|
# ___errno() on Solaris - and should do something similar on other operating
|
||||||
|
# systems. Solaris also supports _TS_ERRNO to enable thread-safe errno
|
||||||
|
# _REENTRANT is also required for the tempnam() function to be properly
|
||||||
|
# thread-safe.
|
||||||
|
DEFS=-D_REENTRANT -D_TS_ERRNO -DHMT_PROTECT
|
||||||
|
# -DWITH_MPATROL
|
||||||
|
|
||||||
|
SRCS= epg.c \
|
||||||
|
file.c \
|
||||||
|
main.c \
|
||||||
|
util.c
|
||||||
|
|
||||||
|
OBJS= $(SRCS:.c=.o)
|
||||||
|
CC=gcc
|
||||||
|
#CC=mipsel-linux-gcc
|
||||||
|
PLATFORM=$(shell uname -s | cut -d- -f1)
|
||||||
|
PROCESSOR=$(shell uname -p)
|
||||||
|
CFLAGS=-g
|
||||||
|
INCS=
|
||||||
|
LIBS=
|
||||||
|
ifeq ($(PLATFORM),CYGWIN_NT)
|
||||||
|
CFLAGS=-g -mno-cygwin
|
||||||
|
endif
|
||||||
|
#ifeq ($(PLATFORM),Linux)
|
||||||
|
#CFLAGS=-static -g
|
||||||
|
#endif
|
||||||
|
#CFLAGS=-g -O3 -fno-strict-aliasing
|
||||||
|
#WARN=-pedantic -Wall -Wnested-externs -Wpointer-arith -Werror -Wno-unused
|
||||||
|
WARN=-pedantic -Wall -W -Wnested-externs -Wpointer-arith -Wno-long-long
|
||||||
|
|
||||||
|
all: tags epg
|
||||||
|
|
||||||
|
epg: ${OBJS}
|
||||||
|
@echo "Linking..."
|
||||||
|
@-[ -f $@ ] && mv $@ $@~ || exit 0
|
||||||
|
${CC} -static-libgcc \
|
||||||
|
${WARN} \
|
||||||
|
${DEFS} \
|
||||||
|
${CFLAGS} -o $@ \
|
||||||
|
${OBJS} \
|
||||||
|
${LIBS}
|
||||||
|
@echo "Done..."
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@-touch core
|
||||||
|
rm -f epg epg~ *.exe core tags asm ${OBJS} ${AROBJS}
|
||||||
|
rm -f *.raw *.raw.sum *.lh5
|
||||||
|
rm -rf epg-*
|
||||||
|
|
||||||
|
tags:
|
||||||
|
@-ctags *.[ch] 2>> /dev/null
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
@echo " $<"
|
||||||
|
@$(CC) $(CFLAGS) ${WARN} ${DEFS} ${INCS} -c $< -o $@
|
||||||
|
|
||||||
|
${OBJS}: lint.h
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <strings.h>
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
|
|
||||||
|
struct section_header *
|
||||||
|
read_section_header(struct epg *epg)
|
||||||
|
{
|
||||||
|
static struct section_header h;
|
||||||
|
|
||||||
|
if (epg->binsize - epg->offset < sizeof(h))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
memcpy(&h, epg->bin + epg->offset, sizeof(h));
|
||||||
|
if (memcmp(h.magic, SECTION_HEADER_MAGIC, sizeof(h.magic)))
|
||||||
|
{
|
||||||
|
printf("Section header magic mismatch.\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
epg->offset += sizeof(h);
|
||||||
|
|
||||||
|
return &h;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DUMPINT(ss,xx) printf(" %30s: %d\n", #xx, ss->xx)
|
||||||
|
#define DUMPSTR(ss,xx) printf(" %30s: %s\n", #xx, ss->xx)
|
||||||
|
#define DUMPHEX(ss,xx) printf(" %30s: %s\n", #xx, \
|
||||||
|
hexstr(ss->xx, sizeof(ss->xx)))
|
||||||
|
|
||||||
|
void
|
||||||
|
dump_section_header(struct section_header *h)
|
||||||
|
{
|
||||||
|
printf("Section header:\n");
|
||||||
|
DUMPINT(h, total_length);
|
||||||
|
DUMPINT(h, table_id);
|
||||||
|
DUMPINT(h, section_syntax_indicator);
|
||||||
|
DUMPINT(h, reserved);
|
||||||
|
DUMPINT(h, section_length);
|
||||||
|
DUMPINT(h, service_id);
|
||||||
|
DUMPINT(h, reserved2);
|
||||||
|
DUMPINT(h, version_number);
|
||||||
|
DUMPINT(h, current_next_indicator);
|
||||||
|
DUMPINT(h, section_number);
|
||||||
|
DUMPINT(h, last_section_number);
|
||||||
|
DUMPINT(h, transport_stream_id);
|
||||||
|
DUMPINT(h, original_network_id);
|
||||||
|
DUMPINT(h, segment_last_section_number);
|
||||||
|
DUMPINT(h, last_table_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct data *
|
||||||
|
read_data(struct epg *epg)
|
||||||
|
{
|
||||||
|
static struct data d;
|
||||||
|
|
||||||
|
if (epg->binsize - epg->offset < sizeof(d))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
memcpy(&d, epg->bin + epg->offset, sizeof(d));
|
||||||
|
epg->offset += sizeof(d);
|
||||||
|
|
||||||
|
return &d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dump_data(struct data *d)
|
||||||
|
{
|
||||||
|
time_t tm;
|
||||||
|
|
||||||
|
printf("Data:\n");
|
||||||
|
DUMPINT(d, event_id);
|
||||||
|
DUMPINT(d, start_date);
|
||||||
|
|
||||||
|
tm = MJD_TO_UNIX(d->start_date);
|
||||||
|
|
||||||
|
printf(" %s", ctime(&tm));
|
||||||
|
|
||||||
|
DUMPINT(d, start_time);
|
||||||
|
// DUMPINT(d, duration);
|
||||||
|
DUMPINT(d, free_CA_mode);
|
||||||
|
DUMPINT(d, descriptors_loop_length);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
|
||||||
|
#include <sys/param.h>
|
||||||
|
|
||||||
|
struct epg {
|
||||||
|
char fname[MAXPATHLEN + 1];
|
||||||
|
int fd;
|
||||||
|
uint8_t *bin;
|
||||||
|
uint32_t offset;
|
||||||
|
uint32_t binsize;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define SECTION_HEADER_MAGIC "(Gq\x87\x00\x00\x00\x00\x02\x00\x00\x00\x00\x01"
|
||||||
|
|
||||||
|
#pragma pack(1)
|
||||||
|
struct section_header {
|
||||||
|
char magic[14];
|
||||||
|
unsigned int total_length:16;
|
||||||
|
unsigned int magic2:32;
|
||||||
|
unsigned int table_id:8;
|
||||||
|
unsigned int section_syntax_indicator:1;
|
||||||
|
unsigned int reserved:3;
|
||||||
|
unsigned int section_length:12;
|
||||||
|
unsigned int service_id:16;
|
||||||
|
unsigned int reserved2:2;
|
||||||
|
unsigned int version_number:5;
|
||||||
|
unsigned int current_next_indicator:1;
|
||||||
|
unsigned int section_number:8;
|
||||||
|
unsigned int last_section_number:8;
|
||||||
|
unsigned int transport_stream_id:16;
|
||||||
|
unsigned int original_network_id:16;
|
||||||
|
unsigned int segment_last_section_number:8;
|
||||||
|
unsigned int last_table_id:8;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct data {
|
||||||
|
unsigned int event_id:16;
|
||||||
|
unsigned int start_date:16;
|
||||||
|
unsigned int start_time:24;
|
||||||
|
char duration[3];
|
||||||
|
unsigned int free_CA_mode:1;
|
||||||
|
unsigned int descriptors_loop_length:12;
|
||||||
|
};
|
||||||
|
|
|
@ -0,0 +1,80 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
|
|
||||||
|
struct epg *
|
||||||
|
open_file(char *filename)
|
||||||
|
{
|
||||||
|
struct epg *epg;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (!(epg = malloc(sizeof(struct epg))))
|
||||||
|
{
|
||||||
|
perror("malloc");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
printf("Opening file '%s'\n", filename);
|
||||||
|
|
||||||
|
strcpy(epg->fname, filename);
|
||||||
|
|
||||||
|
if (stat(epg->fname, &st) == -1)
|
||||||
|
{
|
||||||
|
perror(epg->fname);
|
||||||
|
free(epg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
|
||||||
|
#include "epg.h"
|
||||||
|
|
||||||
|
/* Works for modern dates, 1970 - 2038 */
|
||||||
|
#define MJD_TO_UNIX(xx) (((xx) - 40587) * 86400)
|
||||||
|
|
||||||
|
extern int debug;
|
||||||
|
extern const char *version;
|
||||||
|
extern unsigned long sysopts;
|
||||||
|
|
||||||
|
inline uint16_t read_uint16(uint8_t *, int);
|
||||||
|
inline uint32_t read_uint32(uint8_t *, int);
|
||||||
|
void hexdump(uint8_t *, uint32_t, uint32_t);
|
||||||
|
void hexstr(uint8_t *, uint32_t);
|
||||||
|
|
||||||
|
struct epg *open_file(char *);
|
||||||
|
void close_file(struct epg *);
|
||||||
|
|
||||||
|
struct section_header *read_section_header(struct epg *);
|
||||||
|
void dump_section_header(struct section_header *);
|
||||||
|
|
||||||
|
struct data *read_data(struct epg *);
|
||||||
|
void dump_data(struct data *);
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* Humax EPG Tool
|
||||||
|
* by af123, 2011
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "lint.h"
|
||||||
|
|
||||||
|
int debug = 0;
|
||||||
|
const char *version = "0.0.1";
|
||||||
|
unsigned long sysopts = 0;
|
||||||
|
|
||||||
|
int
|
||||||
|
syntax()
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Humax EPG Tool v%s, by af123, 2011.\n\n", version);
|
||||||
|
fprintf(stderr,
|
||||||
|
"Syntax: epg ...\n");
|
||||||
|
fprintf(stderr,
|
||||||
|
" Commands:\n"
|
||||||
|
);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
struct section_header *h;
|
||||||
|
struct data *d;
|
||||||
|
struct epg *epg;
|
||||||
|
|
||||||
|
if (!(epg = open_file("epg.dat")))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
h = read_section_header(epg);
|
||||||
|
dump_section_header(h);
|
||||||
|
|
||||||
|
d = read_data(epg);
|
||||||
|
dump_data(d);
|
||||||
|
|
||||||
|
close_file(epg);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,154 @@
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "lint.h"
|
||||||
|
|
||||||
|
inline uint32_t
|
||||||
|
read_uint32(uint8_t *p, int le)
|
||||||
|
{
|
||||||
|
if (le)
|
||||||
|
return p[3] << 24 | p[2] << 16 | p[1] << 8 | p[0];
|
||||||
|
else
|
||||||
|
return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline uint16_t
|
||||||
|
read_uint16(uint8_t *p, int le)
|
||||||
|
{
|
||||||
|
if (le)
|
||||||
|
return p[1] << 8 | p[0];
|
||||||
|
else
|
||||||
|
return p[0] << 8 | p[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *
|
||||||
|
memmem(register uint8_t *mem, uint32_t mlen,
|
||||||
|
register uint8_t *pat, uint32_t plen)
|
||||||
|
{
|
||||||
|
while (mlen >= plen)
|
||||||
|
{
|
||||||
|
if (!memcmp(mem, pat, plen))
|
||||||
|
return mem;
|
||||||
|
mem++, mlen--;
|
||||||
|
}
|
||||||
|
return (uint8_t *)NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hexdump(uint8_t *s, uint32_t len, uint32_t o)
|
||||||
|
{
|
||||||
|
uint16_t off;
|
||||||
|
|
||||||
|
if (!s)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!len)
|
||||||
|
len = strlen((char *)s);
|
||||||
|
|
||||||
|
for (off = 0; off < len; off += 16)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
printf("%08lx: ", (unsigned long)off + o);
|
||||||
|
|
||||||
|
for (i = off; i - off < 16; i++)
|
||||||
|
{
|
||||||
|
if (i < len)
|
||||||
|
printf("%02x ", s[i] & 0xff);
|
||||||
|
else
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(" ");
|
||||||
|
|
||||||
|
for (i = off; i < len && i - off < 16; i++)
|
||||||
|
printf("%c", isprint((int)s[i]) ? s[i] : '.');
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hexstr(uint8_t *s, uint32_t len)
|
||||||
|
{
|
||||||
|
uint16_t off;
|
||||||
|
|
||||||
|
if (!s)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!len)
|
||||||
|
len = strlen((char *)s);
|
||||||
|
|
||||||
|
for (off = 0; off < len; off += 16)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
for (i = off; i - off < 16; i++)
|
||||||
|
{
|
||||||
|
if (i < len)
|
||||||
|
printf("%02x", s[i] & 0xff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hexdump_fd(int fd, uint32_t len)
|
||||||
|
{
|
||||||
|
off_t pos = lseek(fd, 0, SEEK_CUR);
|
||||||
|
|
||||||
|
uint8_t *buffer;
|
||||||
|
|
||||||
|
buffer = (uint8_t *)malloc(len);
|
||||||
|
|
||||||
|
read(fd, buffer, len);
|
||||||
|
hexdump(buffer, len, 0);
|
||||||
|
|
||||||
|
lseek(fd, pos, SEEK_SET);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
error(char *fmt, ...)
|
||||||
|
{
|
||||||
|
char buf[0x400];
|
||||||
|
va_list argp;
|
||||||
|
|
||||||
|
va_start(argp, fmt);
|
||||||
|
vsprintf(buf, fmt, argp);
|
||||||
|
|
||||||
|
fprintf(stderr, "%s\n", buf);
|
||||||
|
va_end(argp);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__MINGW32__) || defined(__linux__)
|
||||||
|
|
||||||
|
size_t
|
||||||
|
strlcpy(char *s, const char *t, size_t n)
|
||||||
|
{
|
||||||
|
const char *o = t;
|
||||||
|
|
||||||
|
if (n)
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (!--n)
|
||||||
|
{
|
||||||
|
*s = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while ((*s++ = *t++));
|
||||||
|
if (!n)
|
||||||
|
while (*t++);
|
||||||
|
return t - o - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue