Changeset 1762 for trunk/oscam.c
- Timestamp:
- 03/03/10 19:57:46 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/oscam.c
r1760 r1762 1061 1061 static void init_service(int srv) 1062 1062 { 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1063 switch(cs_fork(0, srv)) 1064 { 1065 case -1: 1066 cs_exit(1); 1067 case 0: 1068 break; 1069 default: 1070 wait4master(); 1071 switch(srv) 1072 { 1073 1073 #ifdef CS_ANTICASC 1074 1075 #endif 1076 1077 1074 case 96: start_anticascader(); 1075 #endif 1076 case 97: cs_logger(); 1077 case 98: start_resolver(); 1078 1078 #ifdef WEBIF 1079 1080 #endif 1081 1082 1079 case 95: cs_http(); 1080 #endif 1081 } 1082 } 1083 1083 } 1084 1084 … … 1260 1260 void cs_disconnect_client(void) 1261 1261 { 1262 1263 1264 1265 1266 1262 char buf[32]={0}; 1263 if (client[cs_idx].ip) 1264 sprintf(buf, " from %s", cs_inet_ntoa(client[cs_idx].ip)); 1265 cs_log("%s disconnected%s", username(cs_idx), buf); 1266 cs_exit(0); 1267 1267 } 1268 1268 … … 1286 1286 static void store_ecm(ECM_REQUEST *er) 1287 1287 { 1288 1289 1290 1291 1292 1293 1294 ecmcache[rc].caid=er->caid;1295 ecmcache[rc].grp=reader[er->reader[0]].grp;1296 1288 int rc; 1289 rc=*ecmidx; 1290 *ecmidx=(*ecmidx+1) % CS_ECMCACHESIZE; 1291 //cs_log("store ecm from reader %d", er->reader[0]); 1292 memcpy(ecmcache[rc].ecmd5, er->ecmd5, CS_ECMSTORESIZE); 1293 memcpy(ecmcache[rc].cw, er->cw, 16); 1294 ecmcache[rc].caid = er->caid; 1295 ecmcache[rc].grp = reader[er->reader[0]].grp; 1296 //cs_ddump(ecmcache[*ecmidx].ecmd5, CS_ECMSTORESIZE, "ECM stored (idx=%d)", *ecmidx); 1297 1297 } 1298 1298 … … 1300 1300 { 1301 1301 #ifdef CS_LOGHISTORY 1302 1303 1304 1305 1306 1307 1308 1309 1302 char *ptr; 1303 ptr=(char *)(loghist+(*loghistidx*CS_LOGHISTSIZE)); 1304 ptr[0]='\1'; // make username unusable 1305 ptr[1]='\0'; 1306 if ((client[cs_idx].typ=='c') || (client[cs_idx].typ=='m')) 1307 cs_strncpy(ptr, client[cs_idx].usr, 31); 1308 cs_strncpy(ptr+32, txt, CS_LOGHISTSIZE-33); 1309 *loghistidx=(*loghistidx+1) % CS_MAXLOGHIST; 1310 1310 #endif 1311 1311 } … … 1523 1523 return(write_ecm_request(fd, er)); 1524 1524 } 1525 /* 1525 1526 /* 1526 1527 static int cs_read_timer(int fd, uchar *buf, int l, int msec) 1527 1528 { … … 1548 1549 ECM_REQUEST *get_ecmtask() 1549 1550 { 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1551 int i, n; 1552 ECM_REQUEST *er=0; 1553 1554 if (!ecmtask) 1555 { 1556 n=(ph[client[cs_idx].ctyp].multi)?CS_MAXPENDING:1; 1557 if( (ecmtask=(ECM_REQUEST *)malloc(n*sizeof(ECM_REQUEST))) ) 1558 memset(ecmtask, 0, n*sizeof(ECM_REQUEST)); 1559 } 1560 1561 n=(-1); 1562 if (!ecmtask) 1563 { 1564 cs_log("Cannot allocate memory (errno=%d)", errno); 1565 n=(-2); 1566 } 1567 else 1568 if (ph[client[cs_idx].ctyp].multi) 1569 { 1570 for (i=0; (n<0) && (i<CS_MAXPENDING); i++) 1571 if (ecmtask[i].rc<100) 1572 er=&ecmtask[n=i]; 1573 } 1574 else 1575 er=&ecmtask[n=0]; 1576 1577 if (n<0) 1578 cs_log("WARNING: ecm pending table overflow !"); 1579 else 1580 { 1581 memset(er, 0, sizeof(ECM_REQUEST)); 1582 er->rc=100; 1583 er->cpti=n; 1584 er->cidx=cs_idx; 1585 cs_ftime(&er->tps); 1586 } 1587 return(er); 1587 1588 } 1588 1589 1589 1590 int send_dcw(ECM_REQUEST *er) 1590 1591 { 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1592 static char *stxt[]={"found", "cache1", "cache2", "emu", 1593 "not found", "timeout", "sleeping", 1594 "fake", "invalid", "corrupt", "no card", "expdate", "disabled"}; 1595 static char *stxtEx[]={"", "group", "caid", "ident", "class", "chid", "queue", "peer"}; 1596 static char *stxtWh[]={"", "user ", "reader ", "server ", "lserver "}; 1597 char sby[32]=""; 1598 char erEx[32]=""; 1599 char uname[38]=""; 1600 struct timeb tpe; 1601 ushort lc, *lp; 1602 for (lp=(ushort *)er->ecm+(er->l>>2), lc=0; lp>=(ushort *)er->ecm; lp--) 1603 lc^=*lp; 1604 cs_ftime(&tpe); 1604 1605 1605 1606 #ifdef CS_WITH_GBOX 1606 1607 1608 1609 #endif 1610 1611 1612 1607 if(er->gbxFrom) 1608 snprintf(uname,sizeof(uname)-1, "%s(%04X)", username(cs_idx), er->gbxFrom); 1609 else 1610 #endif 1611 snprintf(uname,sizeof(uname)-1, "%s", username(cs_idx)); 1612 if (er->rc==0) 1613 { 1613 1614 #ifdef CS_WITH_GBOX 1614 if(reader[er->reader[0]].typ==R_GBOX) 1615 snprintf(sby, sizeof(sby)-1, " by %s(%04X)", reader[er->reader[0]].label,er->gbxCWFrom); 1616 else 1617 #endif 1618 // add marker to reader if ECM_REQUEST was betatunneled 1619 if(er->btun) 1620 snprintf(sby, sizeof(sby)-1, " by %s(btun)", reader[er->reader[0]].label); 1621 else 1622 snprintf(sby, sizeof(sby)-1, " by %s", reader[er->reader[0]].label); 1623 } 1624 if (er->rc<4) er->rcEx=0; 1625 if (er->rcEx) 1626 snprintf(erEx, sizeof(erEx)-1, "rejected %s%s", stxtWh[er->rcEx>>4], 1627 stxtEx[er->rcEx&0xf]); 1628 1629 client[cs_idx].cwlastresptime = 1000*(tpe.time-er->tps.time)+tpe.millitm-er->tps.millitm; 1630 1631 cs_log("%s (%04X&%06X/%04X/%02X:%04X): %s (%d ms)%s", 1632 uname, er->caid, er->prid, er->srvid, er->l, lc, 1633 er->rcEx?erEx:stxt[er->rc], client[cs_idx].cwlastresptime, sby); 1634 1635 1636 if(!client[cs_idx].ncd_server && client[cs_idx].autoau && er->rcEx==0) 1637 { 1638 if(client[cs_idx].au>=0 && er->caid!=reader[client[cs_idx].au].caid[0]) 1639 { 1640 client[cs_idx].au=(-1); 1641 } 1642 1643 client[cs_idx].au=er->reader[0]; 1644 if(client[cs_idx].au<0) 1645 { 1646 int r=0; 1647 for(r=0;r<CS_MAXREADER;r++) 1648 { 1649 if(er->caid==reader[r].caid[0]) 1650 { 1651 client[cs_idx].au=r; 1652 break; 1653 } 1654 } 1655 if(r==CS_MAXREADER) 1656 { 1657 client[cs_idx].au=(-1); 1658 } 1659 } 1660 } 1661 1662 er->caid=er->ocaid; 1663 switch(er->rc) 1664 { 1665 case 0: 1666 case 3: 1667 // 0 - found 1668 // 3 - emu FIXME: obsolete ? 1669 client[cs_idx].cwfound++; 1670 break; 1671 1672 case 1: 1673 case 2: 1674 // 1 - cache1 1675 // 2 - cache2 1676 client[cs_idx].cwcache++; 1677 break; 1678 1679 case 4: 1680 case 9: 1681 case 10: 1682 // 4 - not found 1683 // 9 - corrupt 1684 // 10 - no card 1685 if (er->rcEx) 1615 if(reader[er->reader[0]].typ==R_GBOX) 1616 snprintf(sby, sizeof(sby)-1, " by %s(%04X)", reader[er->reader[0]].label,er->gbxCWFrom); 1617 else 1618 #endif 1619 // add marker to reader if ECM_REQUEST was betatunneled 1620 if(er->btun) 1621 snprintf(sby, sizeof(sby)-1, " by %s(btun)", reader[er->reader[0]].label); 1622 else 1623 snprintf(sby, sizeof(sby)-1, " by %s", reader[er->reader[0]].label); 1624 } 1625 if (er->rc<4) er->rcEx=0; 1626 if (er->rcEx) 1627 snprintf(erEx, sizeof(erEx)-1, "rejected %s%s", stxtWh[er->rcEx>>4], 1628 stxtEx[er->rcEx&0xf]); 1629 1630 client[cs_idx].cwlastresptime = 1000*(tpe.time-er->tps.time)+tpe.millitm-er->tps.millitm; 1631 1632 if(cfg->mon_appendchaninfo) 1633 cs_log("%s (%04X&%06X/%04X/%02X:%04X): %s (%d ms)%s - %s", 1634 uname, er->caid, er->prid, er->srvid, er->l, lc, 1635 er->rcEx?erEx:stxt[er->rc], client[cs_idx].cwlastresptime, sby, monitor_get_srvname(er->srvid, er->caid)); 1636 else 1637 cs_log("%s (%04X&%06X/%04X/%02X:%04X): %s (%d ms)%s", 1638 uname, er->caid, er->prid, er->srvid, er->l, lc, 1639 er->rcEx?erEx:stxt[er->rc], client[cs_idx].cwlastresptime, sby); 1640 1641 if(!client[cs_idx].ncd_server && client[cs_idx].autoau && er->rcEx==0) 1642 { 1643 if(client[cs_idx].au>=0 && er->caid!=reader[client[cs_idx].au].caid[0]) 1644 { 1645 client[cs_idx].au=(-1); 1646 } 1647 1648 client[cs_idx].au=er->reader[0]; 1649 if(client[cs_idx].au<0) 1650 { 1651 int r=0; 1652 for(r=0;r<CS_MAXREADER;r++) 1653 { 1654 if(er->caid==reader[r].caid[0]) 1655 { 1656 client[cs_idx].au=r; 1657 break; 1658 } 1659 } 1660 if(r==CS_MAXREADER) 1661 { 1662 client[cs_idx].au=(-1); 1663 } 1664 } 1665 } 1666 1667 er->caid = er->ocaid; 1668 switch(er->rc) { 1669 case 0: 1670 case 3: 1671 // 0 - found 1672 // 3 - emu FIXME: obsolete ? 1673 client[cs_idx].cwfound++; 1674 break; 1675 1676 case 1: 1677 case 2: 1678 // 1 - cache1 1679 // 2 - cache2 1680 client[cs_idx].cwcache++; 1681 break; 1682 1683 case 4: 1684 case 9: 1685 case 10: 1686 // 4 - not found 1687 // 9 - corrupt 1688 // 10 - no card 1689 if (er->rcEx) 1690 client[cs_idx].cwignored++; 1691 else 1692 client[cs_idx].cwnot++; 1693 break; 1694 1695 case 5: 1696 // 5 - timeout 1697 client[cs_idx].cwtout++; 1698 break; 1699 1700 default: 1686 1701 client[cs_idx].cwignored++; 1687 else 1688 client[cs_idx].cwnot++; 1689 break; 1690 1691 case 5: 1692 // 5 - timeout 1693 client[cs_idx].cwtout++; 1694 break; 1695 1696 default: 1697 client[cs_idx].cwignored++; 1698 } 1702 } 1699 1703 1700 1704 #ifdef CS_ANTICASC 1701 1702 #endif 1703 1704 1705 1706 1707 1705 ac_chk(er, 1); 1706 #endif 1707 1708 cs_ddump_mask (D_ATR, er->cw, 16, "cw:"); 1709 if (er->rc==7) er->rc=0; 1710 ph[client[cs_idx].ctyp].send_dcw(er); 1711 return 0; 1708 1712 } 1709 1713
Note:
See TracChangeset
for help on using the changeset viewer.