-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsec-filter.cpp
More file actions
108 lines (82 loc) · 1.94 KB
/
sec-filter.cpp
File metadata and controls
108 lines (82 loc) · 1.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <string.h>
#include <linux/dvb/dmx.h>
#include <signal.h>
#include <arpa/inet.h>
void sighandler(int n) {
_exit(n);
}
int main(int argc, char* argv[]) {
sigset_t sigs;
sigfillset(&sigs);
sigprocmask(SIG_UNBLOCK, &sigs, 0);
struct sigaction sa = {{0}};
sa.sa_handler = sighandler;
sigaction(SIGTERM, &sa, 0);
if(argc < 5) {
fprintf(stderr, "usage: sec-filter device_name pid filter mask\n");
return 1;
}
int fd = open(argv[1], O_RDWR);
if(fd < 0) {
perror("failed to open demuxer\n");
return 1;
}
int pid;
if(1 != sscanf(argv[2], "%d", &pid)) {
fprintf(stderr, "invalid pid\n");
return 1;
}
dmx_sct_filter_params params;
memset(¶ms, 0, sizeof(params));
params.pid = pid;
params.flags = DMX_IMMEDIATE_START | DMX_CHECK_CRC;
for(size_t i = 0; argv[3][i*2] != 0; ++i) {
int v;
if(1 != sscanf(argv[3]+i*2, "%2x", &v)) {
fprintf(stderr, "invalid filter\n");
return 1;
}
params.filter.filter[i] = v;
}
for(size_t i = 0; argv[4][i*2] != 0; ++i) {
int v;
if(1 != sscanf(argv[4]+i*2, "%2x", &v)) {
fprintf(stderr, "invalid mask\n");
return 1;
}
params.filter.mask[i] = v;
}
for(size_t i = 0; i < sizeof(params.filter.filter);++i) {
fprintf(stderr, "%02x ", params.filter.filter[i]);
}
fprintf(stderr,"\n");
for(size_t i = 0; i < sizeof(params.filter.mask);++i) {
fprintf(stderr, "%02x ", params.filter.mask[i]);
}
fprintf(stderr,"%04x\n",(int)htons(2602));
if(ioctl(fd, DMX_SET_BUFFER_SIZE, 64*1024) != 0) {
fprintf(stderr, "failed to set buffer size\n");
return 1;
}
if(ioctl(fd, DMX_SET_FILTER, ¶ms) != 0) {
fprintf(stderr, "failed to set filter\n");
return 1;
}
char buf[4096];
for(;;) {
int n;
n = read(fd, buf, sizeof(buf));
if(n <= 0) {
perror("read");
break;
}
if(-1 == write(STDOUT_FILENO, buf, n))
break;
break;
}
return 0;
}