epgrec一式改修
予てより/var/log/messagesに時々現れていた
epgdump[5897]: segfault at 7fff3b687000 ip 0000000000403c55 sp 00007fff3b680cb0 error 4 in epgdump[400000+9000]の頻度が高くなってきた気がした。
結果的には2時間間隔で実行する番組表の取得に失敗しているわけだが、何回かに1回でもきちんと取得できていれば大筋で問題無い仕組みなのでスルーしていたのだが、epgrec プロジェクト - SourceForge.JPでは特にアップデートされた形跡は無いものの、いろいろと有志が改修を試みているようなので、ひとつまじめに取り組んでみた。
yano@GT110b:~/software/tv$ diff -bc epgdumpr2_20111001/ epgdumpr2/
diff -bc epgdumpr2_20111001/Makefile epgdumpr2/Makefile
*** epgdumpr2_20111001/Makefile 2009-03-15 21:33:35.000000000 +0900
--- epgdumpr2/Makefile 2013-05-17 12:00:24.366854210 +0900
***************
*** 1,10 ****
TARGETS = epgdump
OBJ_TARGETS = epgdump.o aribstr.o eit.o ts.o util.o sdt.o
HEDDERDEPEND = eit.h sdt.h aribstr.h ts.h util.h
LANG=C
CC = gcc
! CFLAGS = -std=c99 -O2 -Wall -g
#LDFLAGS = -pthread
LIBS =
--- 1,12 ----
+ PREFIX = /usr/local
TARGETS = epgdump
OBJ_TARGETS = epgdump.o aribstr.o eit.o ts.o util.o sdt.o
HEDDERDEPEND = eit.h sdt.h aribstr.h ts.h util.h
LANG=C
CC = gcc
! #CFLAGS = -std=c99 -O2 -Wall -g
! CFLAGS = -std=c99 -O2 -Wall -g -Werror -Wno-return-type
#LDFLAGS = -pthread
LIBS =
***************
*** 21,23 ****
--- 23,28 ----
clean:
rm -f core ${TARGETS} *.o
+
+ install:
+ install -m 755 ${TARGETS} ${PREFIX}/bin
diff -bc epgdumpr2_20111001/aribstr.c epgdumpr2/aribstr.c
*** epgdumpr2_20111001/aribstr.c 2009-11-18 12:35:20.000000000 +0900
--- epgdumpr2/aribstr.c 2013-05-17 11:27:45.868259545 +0900
***************
*** 318,324 ****
fptr = code;
tptr = xcode;
! iconv(cd, &fptr, &inbyte, &tptr, &outbyte);
iconv_close(cd);
--- 318,324 ----
fptr = code;
tptr = xcode;
! iconv(cd, (char **)&fptr, &inbyte, &tptr, &outbyte);
iconv_close(cd);
***************
*** 622,644 ****
void LockingShiftGL(const BYTE byIndexG)
{
// LSx
! m_pLockingGL = &m_CodeG[byIndexG];
}
void LockingShiftGR(const BYTE byIndexG)
{
// LSxR
! m_pLockingGR = &m_CodeG[byIndexG];
}
void SingleShiftGL(const BYTE byIndexG)
{
// SSx
! m_pSingleGL = &m_CodeG[byIndexG];
}
! const bool DesignationGSET(const BYTE byIndexG, const BYTE byCode)
{
// Gのグラフィックセットを割り当てる
switch(byCode){
case 0x42U : m_CodeG[byIndexG] = CODE_KANJI; return true; // Kanji
--- 622,646 ----
void LockingShiftGL(const BYTE byIndexG)
{
// LSx
! m_pLockingGL = &m_CodeG[(int)byIndexG];
}
void LockingShiftGR(const BYTE byIndexG)
{
// LSxR
! m_pLockingGR = &m_CodeG[(int)byIndexG];
}
void SingleShiftGL(const BYTE byIndexG)
{
// SSx
! m_pSingleGL = &m_CodeG[(int)byIndexG];
}
! const bool DesignationGSET(const BYTE byIndexG_arg, const BYTE byCode)
{
+ int byIndexG = (int)byIndexG_arg;
+
// Gのグラフィックセットを割り当てる
switch(byCode){
case 0x42U : m_CodeG[byIndexG] = CODE_KANJI; return true; // Kanji
***************
*** 660,667 ****
}
}
! const bool DesignationDRCS(const BYTE byIndexG, const BYTE byCode)
{
// DRCSのグラフィックセットを割り当てる
switch(byCode){
case 0x40U : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-0
--- 662,671 ----
}
}
! const bool DesignationDRCS(const BYTE byIndexG_arg, const BYTE byCode)
{
+ int byIndexG = (int)byIndexG_arg;
+
// DRCSのグラフィックセットを割り当てる
switch(byCode){
case 0x40U : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-0
diff -bc epgdumpr2_20111001/eit.h epgdumpr2/eit.h
*** epgdumpr2_20111001/eit.h 2009-11-18 12:23:01.000000000 +0900
--- epgdumpr2/eit.h 2013-05-17 11:27:45.868259545 +0900
***************
*** 28,34 ****
typedef struct _EITbody {
int event_id;
char start_time[5];
! char duration[3];
int running_status;
int free_CA_mode;
int descriptors_loop_length;
--- 28,34 ----
typedef struct _EITbody {
int event_id;
char start_time[5];
! unsigned char duration[3];
int running_status;
int free_CA_mode;
int descriptors_loop_length;
diff -bc epgdumpr2_20111001/ts.c epgdumpr2/ts.c
*** epgdumpr2_20111001/ts.c 2010-02-27 16:45:15.000000000 +0900
--- epgdumpr2/ts.c 2013-05-21 13:30:28.732126582 +0900
***************
*** 40,52 ****
/* 戻すべき残りがあるか? */
if(ridx >= 0 && secs[ridx].cont) {
/* バッファチェック */
if((secs[ridx].cur.payload[secs[ridx].curlen] & 0xFF) == 0xFF) {
secs[ridx].cont = 0;
secs[ridx].seclen = 0;
secs[ridx].setlen = 0;
secs[ridx].curlen = 0;
! } else {
len = secs[ridx].cur.payloadlen - secs[ridx].curlen;
/* 全部設定済みチェック */
if(len == 0) {
--- 40,56 ----
/* 戻すべき残りがあるか? */
if(ridx >= 0 && secs[ridx].cont) {
+ /*
+ printf("secs[%d].cur.cont=%d, secs[%d].cur.payloadlen=%d, secs[%d].curlen=%d, secs[%d].seclen=%d, len=%d\n",
+ ridx, secs[ridx].cur.cont, ridx, secs[ridx].cur.payloadlen, ridx, secs[ridx].curlen, ridx, secs[ridx].seclen, len);
+ */
/* バッファチェック */
if((secs[ridx].cur.payload[secs[ridx].curlen] & 0xFF) == 0xFF) {
secs[ridx].cont = 0;
secs[ridx].seclen = 0;
secs[ridx].setlen = 0;
secs[ridx].curlen = 0;
! } else if ( secs[ridx].curlen <= secs[ridx].cur.payloadlen ){
len = secs[ridx].cur.payloadlen - secs[ridx].curlen;
/* 全部設定済みチェック */
if(len == 0) {
***************
*** 68,73 ****
--- 72,82 ----
boff = 12;
secs[ridx].seclen = getBit(&secs[ridx].cur.payload[secs[ridx].curlen], &boff, 12) + 3; // ヘッダ
+ if(secs[ridx].seclen > MAXSECLEN){
+ // セクションが MAXSECLEN より大きい時はこのセクションをスキップ
+ secs[ridx].cont = 0;
+ goto retry;
+ }
/*
if(secs[ridx].seclen == 2334) {
***************
*** 96,101 ****
--- 105,116 ----
goto retry; /* もう一回 */
}
}
+ } else {
+ /*
+ printf("secs[%d].cont=%d, secs[%d].cur.payloadlen=%d, secs[%d].curlen=%d, secs[%d].seclen=%d\n",
+ ridx, secs[ridx].cont, ridx, secs[ridx].cur.payloadlen, ridx, secs[ridx].curlen, ridx, secs[ridx].seclen);
+ */
+ secs[ridx].cont = 0;
}
}
***************
*** 203,209 ****
}
memset(pk.payload, 0xFF, sizeof(pk.payload));
! if(pk.payloadlen <= 0){
continue;
}
memcpy(pk.payload, payptr, pk.payloadlen);
--- 218,224 ----
}
memset(pk.payload, 0xFF, sizeof(pk.payload));
! if( !(0 < pk.payloadlen && pk.payloadlen <= sizeof(pk.payload)) ){
continue;
}
memcpy(pk.payload, payptr, pk.payloadlen);
***************
*** 227,232 ****
--- 242,252 ----
/* 最初 セクション長を調べる */
boff = 12;
secs[i].seclen = getBit(secs[i].cur.payload, &boff, 12) + 3; // ヘッダ;
+ if(secs[i].seclen > MAXSECLEN){
+ /* セクション長が MAXSECLEN より長いときはこのセクションをスキップ */
+ secs[i].cont = 0;
+ goto retry;
+ }
/*
if(secs[i].seclen == 2334) {
printf("aa");
***************
*** 274,280 ****
}
}
! //return NULL;
}
/* BonTest/TsStream.cppからのパクリ */
--- 294,300 ----
}
}
! return NULL;
}
/* BonTest/TsStream.cppからのパクリ */
***************
*** 311,316 ****
--- 331,342 ----
int checkcrc(SECcache *secs) {
+ /* regard a section with more than MAXSECLEN data as an error. */
+ if(secs->seclen > MAXSECLEN) {
+ fprintf(stderr, "SECcache overrun secs->seclen=%d\n", secs->seclen);
+ return 0;
+ }
+
/* セクションの終りに置かれる4バイトのCRC32は、
CRC計算の結果0になるように設定される。
値が発生した場合は、エラーなので対象外にする */
***************
*** 320,323 ****
}
return 1;
}
-
--- 346,348 ----
diff -bc epgdumpr2_20111001/util.h epgdumpr2/util.h
*** epgdumpr2_20111001/util.h 2009-03-08 16:53:42.000000000 +0900
--- epgdumpr2/util.h 2013-05-17 11:46:37.356293005 +0900
***************
*** 1,12 ****
--- 1,15 ----
#ifndef UTIL_H
#define UTILH 1
+ // try for segfault at 7fff77650000 ip 0000000000403c55 sp 00007fff7764ae30 error 4 in epgdump[400000+9000]
+ // #define MAXSECLEN (4096*4)
#define MAXSECLEN 4096
#ifdef __cplusplus
extern "C"{
#endif /* __cplusplus */
+ int strrep(char *buf, char *mae, char *ato);
int getBit(unsigned char *byte, int *pbit, int gbit);
void getStr(char *tostr, unsigned char *byte, int *pbit, int len);
int parseOTHERdesc(unsigned char *data);
しかし、この改修を行っても日テレNEWS24の番組表が空っぽのままだったので更に調べてみたところ、日テレNEWS24のチャンネルがCS24:350からCS8:349に移っていた。ついでにディズニージュニアがCS8:339でスタートしたのも思い出したので、そのへんも追加。差分は「BS新チャンネル対応公式版」のepgdumpr2_20111001.tar.gzに対する差分なので、2011年11月版のCSチャンネル対応も含む。
diff -bc epgdumpr2_20111001/epgdump.c epgdumpr2/epgdump.c
*** epgdumpr2_20111001/epgdump.c 2011-10-01 17:35:13.000000000 +0900
--- epgdumpr2/epgdump.c 2013-05-21 18:10:05.744396429 +0900
***************
*** 78,88 ****
{ "D-Life", "4258.epgdata.ontvjapan", 18290, 4, 258},
{ "NHK総合テレビジョン(東京)", "4291.epgdata.ontvjapan", 17168, 4, 291},
{ "NHK教育テレビジョン(東京)", "4292.epgdata.ontvjapan", 17168, 4, 292},
{ "日本テレビ", "4294.epgdata.ontvjapan", 17169, 4, 294},
{ "テレビ朝日", "4295.epgdata.ontvjapan", 17169, 4, 295},
{ "TBSテレビ", "4296.epgdata.ontvjapan", 17169, 4, 296},
{ "テレビ東京", "4297.epgdata.ontvjapan", 17169, 4, 297},
- { "フジテレビ", "4298.epgdata.ontvjapan", 17168, 4, 298},
{ "放送大学ラジオ", "4531.epgdata.ontvjapan", 18098, 4, 531},
{ "WNI", "4910.ontvjapan.com", 16626, 4, 910},
};
--- 78,88 ----
{ "D-Life", "4258.epgdata.ontvjapan", 18290, 4, 258},
{ "NHK総合テレビジョン(東京)", "4291.epgdata.ontvjapan", 17168, 4, 291},
{ "NHK教育テレビジョン(東京)", "4292.epgdata.ontvjapan", 17168, 4, 292},
+ { "フジテレビ", "4298.epgdata.ontvjapan", 17168, 4, 298},
{ "日本テレビ", "4294.epgdata.ontvjapan", 17169, 4, 294},
{ "テレビ朝日", "4295.epgdata.ontvjapan", 17169, 4, 295},
{ "TBSテレビ", "4296.epgdata.ontvjapan", 17169, 4, 296},
{ "テレビ東京", "4297.epgdata.ontvjapan", 17169, 4, 297},
{ "放送大学ラジオ", "4531.epgdata.ontvjapan", 18098, 4, 531},
{ "WNI", "4910.ontvjapan.com", 16626, 4, 910},
};
***************
*** 92,162 ****
static STATION csSta[] = {
! { "スターchプラス", "1002.ontvjapan.com", 24608, 6, 237},
! { "日本映画専門chHD", "1086.ontvjapan.com", 24608, 6, 239},
! { "フジテレビNEXT", "306ch.epgdata.ontvjapan", 24608, 6, 306},
{ "ショップチャンネル", "1059.ontvjapan.com", 24704, 6, 55},
! { "キッズステーションHD", "1045.ontvjapan.com", 24704, 6, 335},
! { "ザ・シネマ", "1217.ontvjapan.com", 24736, 6, 228},
! { "スカチャンHD800", "800ch.epgdata.ontvjapan", 24736, 6, 800},
! { "スカチャン801", "801ch.epgdata.ontvjapan", 24736, 6, 801},
! { "スカチャン802", "802ch.epgdata.ontvjapan", 24736, 6, 802},
! { "e2プロモ", "100ch.epgdata.ontvjapan", 28736, 7, 100},
! { "ホームドラマチャンネル", "294ch.epgdata.ontvjapan", 28736, 7, 294},
! { "Jスポーツ ESPN", "1025.ontvjapan.com", 28736, 7, 256},
! { "FOX", "1016.ontvjapan.com", 28736, 7, 312},
! { "スペースシャワーTV", "1018.ontvjapan.com", 28736, 7, 322},
! { "カートゥーン ネット", "1046.ontvjapan.com", 28736, 7, 331},
! { "ディズニーXD", "1213.ontvjapan.com", 28736, 7, 334},
! { "東映チャンネル", "1010.ontvjapan.com", 28768, 7, 221},
! { "衛星劇場", "1005.ontvjapan.com", 28768, 7, 222},
! { "チャンネルNECO", "1008.ontvjapan.com", 28768, 7, 223},
! { "洋画★シネフィル", "1009.ontvjapan.com", 28768, 7, 224},
! { "スター・クラシック", "1003.ontvjapan.com", 28768, 7, 238},
! { "時代劇専門チャンネル", "1133.ontvjapan.com", 28768, 7, 292},
! { "スーパードラマ", "1006.ontvjapan.com", 28768, 7, 310},
! { "AXN", "1014.ontvjapan.com", 28768, 7, 311},
! { "ナショジオチャンネル", "1204.ontvjapan.com", 28768, 7, 343},
! { "ワンテンポータル", "110ch.epgdata.ontvjapan", 28864, 7, 110},
! { "ゴルフチャンネル", "1028.ontvjapan.com", 28864, 7, 260},
! { "テレ朝チャンネル", "1092.ontvjapan.com", 28864, 7, 303},
! { "MTV", "1019.ontvjapan.com", 28864, 7, 323},
! { "ミュージック・エア", "1024.ontvjapan.com", 28864, 7, 324},
! { "朝日ニュースター", "1067.ontvjapan.com", 28864, 7, 352},
! { "BBCワールド", "1070.ontvjapan.com", 28864, 7, 353},
! { "CNNj", "1069.ontvjapan.com", 28864, 7, 354},
! { "Jスポーツ 1", "1041.ontvjapan.com", 28896, 7, 251},
! { "Jスポーツ 2", "1042.ontvjapan.com", 28896, 7, 252},
! { "JスポーツPlusH", "1043.ontvjapan.com", 28896, 7, 253},
! { "GAORA", "1026.ontvjapan.com", 28896, 7, 254},
! { "sky・Aスポーツ+", "1040.ontvjapan.com", 28896, 7, 255},
! { "宝塚プロモチャンネル", "101ch.epgdata.ontvjapan", 28928, 7, 101},
! { "SKY・STAGE", "1207.ontvjapan.com", 28928, 7, 290},
{ "チャンネル銀河", "305ch.epgdata.ontvjapan", 28928, 7, 305},
! { "AT-X", "1201.ontvjapan.com", 28928, 7, 333},
! { "ヒストリーチャンネル", "1050.ontvjapan.com", 28928, 7, 342},
! { "スカチャン803", "803ch.epgdata.ontvjapan", 28928, 7, 803},
! { "スカチャン804", "804ch.epgdata.ontvjapan", 28928, 7, 804},
! { "ムービープラスHD", "1007.ontvjapan.com", 28960, 7, 240},
{ "ゴルフネットワーク", "1027.ontvjapan.com", 28960, 7, 262},
! { "LaLa HD", "1074.ontvjapan.com", 28960, 7, 314},
! { "フジテレビONE", "1073.ontvjapan.com", 28992, 7, 307},
! { "フジテレビTWO", "1072.ontvjapan.com", 28992, 7, 308},
! { "アニマックス", "1047.ontvjapan.com", 28992, 7, 332},
! { "ディスカバリー", "1062.ontvjapan.com", 28992, 7, 340},
! { "アニマルプラネット", "1193.ontvjapan.com", 28992, 7, 341},
! { "C-TBSウエルカム", "160ch.epgdata.ontvjapan", 29024, 7, 160},
! { "QVC", "1120.ontvjapan.com", 29024, 7, 161},
! { "プライム365.TV", "185ch.epgdata.ontvjapan", 29024, 7, 185},
! { "ファミリー劇場", "1015.ontvjapan.com", 29024, 7, 293},
! { "TBSチャンネル", "3201.ontvjapan.com", 29024, 7, 301},
! { "ディズニーチャンネル", "1090.ontvjapan.com", 29024, 7, 304},
! { "MUSIC ON! TV", "1022.ontvjapan.com", 29024, 7, 325},
! { "TBSニュースバード", "1076.ontvjapan.com", 29024, 7, 351},
! { "日テレG+HD", "1068.ontvjapan.com", 29056, 7, 257},
{ "日テレプラス", "300ch.epgdata.ontvjapan", 29056, 7, 300},
! { "Music Japan TV", "1208.ontvjapan.com", 29056, 7, 321},
! { "日テレNEWS24", "2002.ontvjapan.com", 29056, 7, 350},
{ "旅チャンネル", "1052.ontvjapan.com", 29056, 7, 362},
};
--- 92,159 ----
static STATION csSta[] = {
! /* ND2 */
! { "TBSチャンネル", "3201.ontvjapan.com", 24608, 6, 296},
! { "テレ朝チャンネル", "1092.ontvjapan.com", 24608, 6, 298},
! { "朝日ニュースター", "1067.ontvjapan.com", 24608, 6, 299},
! /* ND4 */
! { "e2プロモ", "100ch.epgdata.ontvjapan", 28736, 7, 100},
! { "ザ・シネマ", "1217.ontvjapan.com", 28736, 7, 227},
! { "チャンネルNECO", "1008.ontvjapan.com", 28736, 7, 223},
! { "ヒストリーチャンネル", "1050.ontvjapan.com", 28736, 7, 342},
! { "スカイ・A Sports+", "1040.ontvjapan.com", 28736, 7, 250},
! /* ND6 */
! { "ディスカバリー", "1062.ontvjapan.com", 28768, 7, 340},
! { "アニマルプラネット", "1193.ontvjapan.com", 28768, 7, 341},
! { "ホームドラマチャンネル", "294ch.epgdata.ontvjapan", 28768, 7, 294},
! { "MTV", "1019.ontvjapan.com", 28768, 7, 323},
! { "CNNJ", "1069.ontvjapan.com", 28768, 7, 354},
! /* ND8 */
{ "ショップチャンネル", "1059.ontvjapan.com", 24704, 6, 55},
! { "東映チャンネル", "1010.ontvjapan.com", 24704, 6, 218},
! { "衛星劇場", "1005.ontvjapan.com", 24704, 6, 219},
! { "ミュージック・エア", "1024.ontvjapan.com", 24704, 6, 326},
! { "ディズニージュニア", "339ch.epgdata.ontvjapan", 24704, 6, 339},
! { "日テレNEWS24", "2002.ontvjapan.com", 24704, 6, 349},
! /* ND10 */
! { "スカチャン0HD", "800ch.epgdata.ontvjapan", 24736, 6, 800},
! { "スカチャン1HD", "801ch.epgdata.ontvjapan", 24736, 6, 801},
! { "スカチャン2", "802ch.epgdata.ontvjapan", 24736, 6, 802},
! { "スカチャン3", "803ch.epgdata.ontvjapan", 24736, 6, 805},
! /* ND12 */
! { "キッズステーションHD", "1045.ontvjapan.com", 28864, 7, 330},
! { "GAORA", "1026.ontvjapan.com", 28864, 7, 254},
! { "MUSIC ON! TV", "1022.ontvjapan.com", 28864, 7, 325},
! /* ND14 */
! { "時代劇専門チャンネル", "1133.ontvjapan.com", 28896, 7, 292},
! { "ファミリー劇場", "1015.ontvjapan.com", 28896, 7, 293},
! { "スーパー!ドラマTV", "1006.ontvjapan.com", 28896, 7, 310},
! /* ND16 */
! { "SKY STAGE", "1207.ontvjapan.com", 28928, 7, 290},
{ "チャンネル銀河", "305ch.epgdata.ontvjapan", 28928, 7, 305},
! { "AT-X", "1201.ontvjapan.com", 28928, 7, 333},
! { "AXN", "1014.ontvjapan.com", 28928, 7, 311},
! { "ナショジオチャンネル", "1204.ontvjapan.com", 28928, 7, 343},
! { "BBCワールドニュース", "1070.ontvjapan.com", 28928, 7, 353},
! /* ND18 */
! { "ムービープラスHD", "1007.ontvjapan.com", 28960, 7, 240},
{ "ゴルフネットワーク", "1027.ontvjapan.com", 28960, 7, 262},
! { "LaLa HD", "1074.ontvjapan.com", 28960, 7, 314},
! /* ND20 */
! { "フジテレビONE", "1073.ontvjapan.com", 28992, 7, 307},
! { "フジテレビTWO", "1072.ontvjapan.com", 28992, 7, 308},
! { "フジテレビNEXT", "306ch.epgdata.ontvjapan", 28992, 7, 309},
! /* ND22 */
! { "QVC", "1120.ontvjapan.com", 29024, 7, 161},
! { "TBSニュースバード", "1076.ontvjapan.com", 29024, 7, 351},
! { "FOX", "1016.ontvjapan.com", 29024, 7, 312},
! { "スペースシャワーTV", "1018.ontvjapan.com", 29024, 7, 322},
! { "カートゥーン ネットワーク", "1046.ontvjapan.com", 29024, 7, 331},
! /* ND 24*/
! { "日テレG+HD", "1068.ontvjapan.com", 29056, 7, 257},
{ "日テレプラス", "300ch.epgdata.ontvjapan", 29056, 7, 300},
! { "FOXムービー プレミアム", "229ch.epgdata.ontvjapan", 29056, 7, 229},
! { "スペースシャワーTVプラス", "321ch.epgdata.ontvjapan", 29056, 7, 321},
{ "旅チャンネル", "1052.ontvjapan.com", 29056, 7, 362},
};
***************
*** 352,357 ****
--- 349,358 ----
staCount = csStaCount;
act = 0 ;
}else{
+ if(infile == NULL){
+ fprintf(stderr, "Can't open file: %s\n", file);
+ return 1;
+ }
act = 1 ;
svttop = calloc(1, sizeof(SVT_CONTROL));
GetSDT(infile, svttop, secs, SECCOUNT);