|
SASC
DVBSoftCAM
|
00001 00002 #include <stdlib.h> 00003 #include <stdio.h> 00004 #include <unistd.h> 00005 #include <string.h> 00006 00007 int main(int argc, char *argv[]) 00008 { 00009 unsigned char match[256]; 00010 int i, max; 00011 int filt, mask, mode; 00012 int mam, manm; 00013 00014 if(argc<2) { 00015 printf("missing operation mode\n"); 00016 exit(1); 00017 } 00018 if(!strcasecmp(argv[1],"MATCH")) { 00019 if(argc<3) { 00020 printf("no matches given\n"); 00021 exit(1); 00022 } 00023 memset(match,0,sizeof(match)); 00024 printf("searching filter settings for:"); 00025 for(i=2; i<argc; i++) { 00026 int l=strtol(argv[i],0,0); 00027 if(l<0 || l>255) { 00028 printf("allowed range 0-255 / 0x00-0xFF\n"); 00029 exit(1); 00030 } 00031 match[l]=1; 00032 printf(" 0x%02x",l); 00033 } 00034 printf("\n"); 00035 00036 max=5; 00037 int mode=0; 00038 //for(mode=0; mode<256; mode++) { 00039 for(mask=0; mask<256; mask++) { 00040 mam =mask & (~mode); 00041 manm=mask & ~(~mode); 00042 for(filt=0; filt<256; filt++) { 00043 int ok=1, miss=0; 00044 unsigned char mm[256]; 00045 memset(mm,0,sizeof(mm)); 00046 for(i=0; i<256; i++) { 00047 int xxor=filt^i; 00048 if((mam&xxor) || (manm && !(manm&xxor))) { 00049 if(match[i]!=0) { 00050 ok=0; 00051 miss=0; 00052 break; 00053 } 00054 } 00055 else { 00056 if(match[i]!=1) { 00057 ok=0; 00058 miss++; mm[i]=1; 00059 if(miss>max) break; 00060 } 00061 } 00062 } 00063 00064 if(ok) { 00065 printf("found exact settings filt=%02x mask=%02x mode=%02x\n",filt,mask,mode); 00066 exit(0); 00067 } 00068 else if(miss>0 && miss<=max) { 00069 printf("mismatching"); 00070 for(i=0; i<256; i++) if(mm[i]) printf(" %02x",i); 00071 printf(" - settings filt=%02x mask=%02x mode=%02x\n",filt,mask,mode); 00072 max=miss; 00073 } 00074 } 00075 } 00076 //} 00077 printf("no exact settings found\n"); 00078 exit(1); 00079 } 00080 else if(!strcasecmp(argv[1],"TEST")) { 00081 if(argc<5) { 00082 printf("missing arguments\n"); 00083 exit(1); 00084 } 00085 filt=strtol(argv[2],0,0); 00086 if(filt<0 || filt>255) { 00087 printf("filter range 0-255 exceeded\n"); 00088 exit(1); 00089 } 00090 mask=strtol(argv[3],0,0); 00091 if(mask<0 || mask>255) { 00092 printf("mask range 0-255 exceeded\n"); 00093 exit(1); 00094 } 00095 mode=strtol(argv[4],0,0); 00096 if(mode<0 || mode>255) { 00097 printf("mode range 0-255 exceeded\n"); 00098 exit(1); 00099 } 00100 printf("settings file=%02x mask=%02x mode=%02x\n",filt,mask,mode); 00101 00102 mam =mask & (~mode); 00103 manm=mask & ~(~mode); 00104 printf("matching:"); 00105 for(i=0; i<256; i++) { 00106 int xxor=filt^i; 00107 if((mam&xxor) || (manm && !(manm&xxor))) {} 00108 else 00109 printf(" %02x",i); 00110 } 00111 printf("\n"); 00112 } 00113 else { 00114 printf("unknown operation mode\n"); 00115 } 00116 exit(1); 00117 } 00118