static void show_class(struct s_reader *reader, const char *p, uint32_t provid, const uchar *b, int32_t l) { int32_t i, j; // b -> via date (4 bytes) b+=4; l-=4; j=l-1; for (; j>=0; j--) for (i=0; i<8; i++) if (b[j] & (1 << (i&7))) { uchar cls; struct via_date vd; parse_via_date(b-4, &vd, 1); cls=(l-(j+1))*8+i; if (p) rdr_log(reader, "%sclass: %02X, expiry date: %04d/%02d/%02d - %04d/%02d/%02d", p, cls, vd.year_s+1980, vd.month_s, vd.day_s, vd.year_e+1980, vd.month_e, vd.day_e); else { rdr_log(reader, "class: %02X, expiry date: %04d/%02d/%02d - %04d/%02d/%02d", cls, vd.year_s+1980, vd.month_s, vd.day_s, vd.year_e+1980, vd.month_e, vd.day_e); time_t start_t, end_t; struct tm tm; //convert time: memset(&tm, 0, sizeof(tm)); tm.tm_year = vd.year_s+80; //via year starts in 1980, tm_year starts in 1900 tm.tm_mon = vd.month_s-1; // january is 0 in tm_mon tm.tm_mday = vd.day_s; start_t = cs_timegm(&tm); tm.tm_year = vd.year_e+80; //via year starts in 1980, tm_year starts in 1900 tm.tm_mon = vd.month_e-1; // january is 0 in tm_mon tm.tm_mday = vd.day_e; end_t = cs_timegm(&tm); cs_add_entitlement(reader, reader->caid, provid, cls, cls, start_t, end_t, 5); } } }
/* Parses the date out of a "If-Modified-Since"-header. Note that the original string is modified. */ time_t parse_modifiedsince(char *value) { int32_t day = -1, month = -1, year = -1, hour = -1, minutes = -1, seconds = -1; char months[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; char *str, *saveptr1 = NULL; time_t modifiedheader = 0; value += 18; // Parse over weekday at beginning... while(value[0] == ' ' && value[0] != '\0') { ++value; } while(value[0] != ' ' && value[0] != '\0') { ++value; } // According to http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 three different timeformats are allowed so we need a bit logic to parse all of them... if(value[0] != '\0') { ++value; for(month = 0; month < 12; ++month) { if(strstr(value, months[month])) { break; } } if(month > 11) { month = -1; } for(str = strtok_r(value, " ", &saveptr1); str; str = strtok_r(NULL, " ", &saveptr1)) { switch(strlen(str)) { case 1: case 2: day = atoi(str); break; case 4: if(str[0] != 'G') { year = atoi(str); } break; case 8: if(str[2] == ':' && str[5] == ':') { hour = atoi(str); minutes = atoi(str + 3); seconds = atoi(str + 6); } break; case 9: if(str[2] == '-' && str[6] == '-') { day = atoi(str); year = atoi(str + 7) + 2000; } break; } } if(day > 0 && day < 32 && month > 0 && year > 0 && year < 9999 && hour > -1 && hour < 24 && minutes > -1 && minutes < 60 && seconds > -1 && seconds < 60) { struct tm timeinfo; memset(&timeinfo, 0, sizeof(timeinfo)); timeinfo.tm_mday = day; timeinfo.tm_mon = month; timeinfo.tm_year = year - 1900; timeinfo.tm_hour = hour; timeinfo.tm_min = minutes; timeinfo.tm_sec = seconds; modifiedheader = cs_timegm(&timeinfo); } } return modifiedheader; }