Changeset 1838
Legend:
- Unmodified
- Added
- Removed
-
trunk/globals.h
r1826 r1838 610 610 int bindwait; 611 611 int resolvedelay; 612 int clientdyndns; 612 613 int tosleep; 613 614 in_addr_t srvip; -
trunk/oscam-config.c
r1810 r1838 424 424 } else { 425 425 cfg->resolvedelay = atoi(value); 426 return; 427 } 428 } 429 430 if (!strcmp(token, "clientdyndns")) { 431 if (strlen(value) == 0) { 432 cfg->clientdyndns = 0; 433 return; 434 } else { 435 cfg->clientdyndns = atoi(value); 426 436 return; 427 437 } -
trunk/oscam.c
r1829 r1838 899 899 static void cs_client_resolve() 900 900 { 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 901 while (1) 902 { 903 struct hostent *rht; 904 struct s_auth *account; 905 struct sockaddr_in udp_sa; 906 907 for (account=cfg->account; account; account=account->next) 908 if (account->dyndns[0]) 909 { 910 rht=gethostbyname((const char *)account->dyndns); 911 if (rht) 912 { 913 memcpy(&udp_sa.sin_addr, rht->h_addr, sizeof(udp_sa.sin_addr)); 914 account->dynip=cs_inet_order(udp_sa.sin_addr.s_addr); 915 } 916 else 917 cs_log("can't resolve hostname %s (user: %s)", account->dyndns, account->usr); 918 client[cs_idx].last=time((time_t)0); 919 } 920 sleep(cfg->resolvedelay); 921 } 922 922 } 923 923 924 924 static void start_client_resolver() 925 925 { 926 927 928 929 930 931 932 933 934 935 936 926 int i; 927 pthread_t tid; 928 929 i=pthread_create(&tid, (pthread_attr_t *)0, (void *)&cs_client_resolve, (void *) 0); 930 if (i) 931 cs_log("ERROR: can't create resolver-thread (err=%d)", i); 932 else 933 { 934 cs_log("resolver thread started"); 935 pthread_detach(tid); 936 } 937 937 } 938 938 939 939 void cs_resolve() 940 940 { 941 942 943 944 945 946 947 948 rht=gethostbyname(reader[i].device);949 950 951 952 953 954 955 956 957 958 941 int i, idx; 942 struct hostent *rht; 943 struct s_auth; 944 for (i=0; i<CS_MAXREADER; i++) 945 if ((idx=reader[i].cs_idx) && (reader[i].typ & R_IS_NETWORK)) 946 { 947 client[cs_idx].last=time((time_t)0); 948 rht = gethostbyname(reader[i].device); 949 if (rht) 950 { 951 memcpy(&client[idx].udp_sa.sin_addr, rht->h_addr, 952 sizeof(client[idx].udp_sa.sin_addr)); 953 client[idx].ip=cs_inet_order(client[idx].udp_sa.sin_addr.s_addr); 954 } 955 else 956 cs_log("can't resolve %s", reader[i].device); 957 client[cs_idx].last=time((time_t)0); 958 } 959 959 } 960 960 … … 993 993 static void start_resolver() 994 994 { 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 // sleep(cfg->resolvedelay);1009 995 int i; 996 997 cs_sleepms(1000); // wait for reader 998 while(1) 999 { 1000 if (master_pid!=getppid()) 1001 cs_exit(0); 1002 cs_resolve(); 1003 for (i=0; i<cfg->resolvedelay; i++) 1004 if (master_pid!=getppid()) 1005 cs_exit(0); 1006 else 1007 cs_sleepms(1000); 1008 // sleep(cfg->resolvedelay); 1009 } 1010 1010 } 1011 1011 … … 1138 1138 int cs_auth_client(struct s_auth *account, char *e_txt) 1139 1139 { 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1140 int rc=0; 1141 char buf[32]; 1142 char *t_crypt="encrypted"; 1143 char *t_plain="plain"; 1144 char *t_grant=" granted"; 1145 char *t_reject=" rejected"; 1146 char *t_msg[]= { buf, "invalid access", "invalid ip", "unknown reason" }; 1147 client[cs_idx].grp=0xffffffff; 1148 client[cs_idx].au=(-1); 1149 switch((long)account) 1150 { 1151 case -2: // gbx-dummy 1152 client[cs_idx].dup=0; 1153 break; 1154 case 0: // reject access 1155 rc=1; 1156 cs_log("%s %s-client %s%s (%s)", 1157 client[cs_idx].crypted ? t_crypt : t_plain, 1158 ph[client[cs_idx].ctyp].desc, 1159 client[cs_idx].ip ? cs_inet_ntoa(client[cs_idx].ip) : "", 1160 client[cs_idx].ip ? t_reject : t_reject+1, 1161 e_txt ? e_txt : t_msg[rc]); 1162 break; 1163 default: // grant/check access 1164 if (client[cs_idx].ip && account->dyndns[0]) 1165 if (client[cs_idx].ip != account->dynip) 1166 rc=2; 1167 if (!rc) 1168 { 1169 client[cs_idx].dup=0; 1170 if (client[cs_idx].typ=='c') 1171 { 1172 client[cs_idx].expirationdate=account->expirationdate; 1173 client[cs_idx].disabled=account->disabled; 1174 client[cs_idx].c35_suppresscmd08 = account->c35_suppresscmd08; 1175 client[cs_idx].ncd_keepalive = account->ncd_keepalive; 1176 client[cs_idx].grp=account->grp; 1177 client[cs_idx].au=account->au; 1178 client[cs_idx].autoau=account->autoau; 1179 client[cs_idx].tosleep=(60*account->tosleep); 1180 memcpy(&client[cs_idx].ctab, &account->ctab, sizeof(client[cs_idx].ctab)); 1181 if (account->uniq) 1182 cs_fake_client(account->usr, account->uniq, client[cs_idx].ip); 1183 client[cs_idx].ftab = account->ftab; // IDENT filter 1184 client[cs_idx].cltab = account->cltab; // CLASS filter 1185 client[cs_idx].fchid = account->fchid; // CHID filter 1186 client[cs_idx].sidtabok= account->sidtabok; // services 1187 client[cs_idx].sidtabno= account->sidtabno; // services 1188 client[cs_idx].pcrc = crc32(0L, MD5((uchar *)account->pwd, strlen(account->pwd), NULL), 16); 1189 memcpy(&client[cs_idx].ttab, &account->ttab, sizeof(client[cs_idx].ttab)); 1190 1190 #ifdef CS_ANTICASC 1191 1192 #endif 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1191 ac_init_client(account); 1192 #endif 1193 } 1194 } 1195 client[cs_idx].monlvl=account->monlvl; 1196 strcpy(client[cs_idx].usr, account->usr); 1197 case -1: // anonymous grant access 1198 if (rc) 1199 t_grant=t_reject; 1200 else 1201 { 1202 if (client[cs_idx].typ=='m') 1203 sprintf(t_msg[0], "lvl=%d", client[cs_idx].monlvl); 1204 else 1205 { 1206 if(client[cs_idx].autoau) 1207 { 1208 if(client[cs_idx].ncd_server) 1209 { 1210 int r=0; 1211 for(r=0;r<CS_MAXREADER;r++) 1212 { 1213 if(reader[r].caid[0]==cfg->ncd_ptab.ports[client[cs_idx].port_idx].ftab.filts[0].caid) 1214 { 1215 client[cs_idx].au=r; 1216 break; 1217 } 1218 } 1219 if(client[cs_idx].au<0) sprintf(t_msg[0], "au(auto)=%d", client[cs_idx].au+1); 1220 else sprintf(t_msg[0], "au(auto)=%s", reader[client[cs_idx].au].label); 1221 } 1222 else 1223 { 1224 sprintf(t_msg[0], "au=auto"); 1225 } 1226 } 1227 else 1228 { 1229 if(client[cs_idx].au<0) sprintf(t_msg[0], "au=%d", client[cs_idx].au+1); 1230 else sprintf(t_msg[0], "au=%s", reader[client[cs_idx].au].label); 1231 } 1232 } 1233 } 1234 if(client[cs_idx].ncd_server) 1235 { 1236 cs_log("%s %s:%d-client %s%s (%s, %s)", 1237 client[cs_idx].crypted ? t_crypt : t_plain, 1238 e_txt ? e_txt : ph[client[cs_idx].ctyp].desc, 1239 cfg->ncd_ptab.ports[client[cs_idx].port_idx].s_port, 1240 client[cs_idx].ip ? cs_inet_ntoa(client[cs_idx].ip) : "", 1241 client[cs_idx].ip ? t_grant : t_grant+1, 1242 username(cs_idx), t_msg[rc]); 1243 } 1244 else 1245 { 1246 cs_log("%s %s-client %s%s (%s, %s)", 1247 client[cs_idx].crypted ? t_crypt : t_plain, 1248 e_txt ? e_txt : ph[client[cs_idx].ctyp].desc, 1249 client[cs_idx].ip ? cs_inet_ntoa(client[cs_idx].ip) : "", 1250 client[cs_idx].ip ? t_grant : t_grant+1, 1251 username(cs_idx), t_msg[rc]); 1252 } 1253 1254 break; 1255 } 1256 return(rc); 1257 1257 } 1258 1258 … … 2515 2515 client[0].last=time((time_t *)0); 2516 2516 2517 start_client_resolver(); 2517 if(cfg->clientdyndns) 2518 start_client_resolver(); 2519 2518 2520 init_service(97); // logger 2519 2521 init_service(98); // resolver
Note:
See TracChangeset
for help on using the changeset viewer.