/* * This part was written by Harald Kipp * * Bug reports should be sent to * * harald@os2point.ping.de * harald@sesam.com * Fido: 2:2448/434 * * This module contains routines to read the configuration file. * */ #undef STANDALONE #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "expire.h" static struct tz_table { char *name; time_t tdiff; } tzone[] = { { "acsst", 9 * 60 + 90, }, /* Cent. Australia */ { "acst", 9 * 60 + 30, }, /* Cent. Australia */ { "adt", -4 * 60 + 60, }, /* Atlantic (Canada) */ { "aesst", 10 * 60 + 60, }, /* E. Australia */ { "aest", 10 * 60, }, /* E. Australia */ { "ast", -4 * 60, }, /* Atlantic (Canada) */ { "awsst", 8 * 60 + 60, }, /* W. Australia */ { "awst", 8 * 60, }, /* W. Australia */ { "bst", 60, }, /* Great Britain summertime */ { "cdt", -6 * 60 + 60, }, /* Central */ { "cest", 60 + 60, }, /* Central Europe */ { "cet", 60, }, /* Central Europe */ { "cetdst", 60 + 60, }, /* Central Europe */ { "cst", -6 * 60, }, /* Central */ { "dnt", 60, }, /* Denmark */ { "dst", 60 + 60, }, /* Denmark */ { "edt", -5 * 60 + 60, }, /* Eastern US */ { "eest", 2 * 60 + 60, }, /* Eastern Europe */ { "eet", 2 * 60, }, /* Eastern Europe */ { "eetdst", 2 * 60 + 60, }, /* Eastern Europe */ { "est", -5 * 60, }, /* Eastern US */ { "gmt", 0, }, /* */ { "hdt", -10 * 60 + 60, }, /* Hawaii/Alaska */ { "hst", -10 * 60, }, /* Hawaii/Alaska */ { "ist", 2 * 60, }, /* Israel */ { "jst", 9 * 60, }, /* Japan */ { "mdt", -7 * 60 + 60, }, /* Mountain US */ { "mest", 60 + 60, }, /* Central Europe */ { "met", 60, }, /* Central Europe */ { "metdst", 60 + 60, }, /* Central Europe */ { "mst", -7 * 60, }, /* Mountain */ { "ndt", -3 * 60 -30 + 60, }, /* Nfld. (Canada) */ { "nst", -3 * 60 -30, }, /* Nfld. (Canada) */ { "pdt", -8 * 60 + 60, }, /* Pacific */ { "pst", -8 * 60, }, /* Pacific */ { "utc", 0, }, /* UTC */ { "west", 60, }, /* Western Europe */ { "wet", 0, }, /* Western Europe */ { "wetdst", 60, }, /* Western Europe */ { "ydt", -9 * 60 + 60, }, /* Yukon */ { "yst", -9 * 60, } /* Yukon */ }; /************************************************************************/ /* */ /************************************************************************/ static int is_month(char *item) { int result = 0; if(strlen(item) >= 3) { switch(toupper(*item)) { case 'J': if(stricmp(item + 1, "an") == 0) result = 1; else if(stricmp(item + 1, "un") == 0) result = 6; else if(stricmp(item + 1, "ul") == 0) result = 7; break; case 'F': if(stricmp(item + 1, "eb") == 0) result = 2; break; case 'M': if(stricmp(item + 1, "ar") == 0) result = 3; else if(stricmp(item + 1, "ay") == 0) result = 5; break; case 'A': if(stricmp(item + 1, "pr") == 0) result = 4; else if(stricmp(item + 1, "ug") == 0) result = 8; break; case 'S': if(stricmp(item + 1, "ep") == 0) result = 9; break; case 'O': if(stricmp(item + 1, "ct") == 0) result = 10; break; case 'N': if(stricmp(item + 1, "ov") == 0) result = 11; break; case 'D': if(stricmp(item + 1, "ec") == 0) result = 12; break; } } return(result); } /************************************************************************/ /* */ /************************************************************************/ static int is_wday(char *item) { int result = 0; if(strlen(item) >= 3) { switch(toupper(*item)) { case 'M': if(stricmp(item + 1, "on") == 0) result = 1; break; case 'T': if(stricmp(item + 1, "ue") == 0) result = 2; else if(stricmp(item + 1, "hu") == 0) result = 4; break; case 'W': if(stricmp(item + 1, "ed") == 0) result = 3; break; case 'F': if(stricmp(item + 1, "ri") == 0) result = 5; break; case 'S': if(stricmp(item + 1, "at") == 0) result = 6; else if(stricmp(item + 1, "un") == 0) result = 7; break; } } return(result); } /************************************************************************/ /* */ /************************************************************************/ static int cmptable(char *key, struct tz_table *tz) { return(stricmp(key, tz->name)); } /************************************************************************/ /* */ /************************************************************************/ static time_t is_tzone(char *item) { struct tz_table *tz; tz = bsearch(item, tzone, sizeof(tzone) / sizeof(tzone[0]), sizeof(tzone[0]), cmptable); if(tz) return(tz->tdiff); return(0); } /************************************************************************/ /* */ /* */ /* returns GMT */ /************************************************************************/ time_t getdate(char *date) { register char *cp; register int i; time_t result = 0; int items = 0; char *itm[5]; int day = 0, month = 0, year = 0; int hour = 0, minute = 0, second = 0; time_t tdiff = 0; int got_wday = 0; struct tm tms; char *datebuf = strdup(date); cp = datebuf; while(*cp) { while(*cp && (*cp == ' ' || *cp == '\t' || *cp == ',')) *cp++ = '\0'; if(*cp) { if(got_wday || (got_wday = is_wday(cp)) == 0) { if(items < 6) itm[items] = cp; items++; } while(*cp && *cp != ' ' && *cp != '\t' && *cp != ',') cp++; } } for(i = 0; i < items; i++) { if((month = is_month(itm[i])) != 0) break; } if(month) { if(i) { day = atoi(itm[i - 1]); year = atoi(itm[i + 1]); } else { day = atoi(itm[i + 1]); year = atoi(itm[i + 2]); } } else { for(i = 0; i < items; i++) if(strlen(itm[i]) >= 8 && itm[i][2] == '/' && itm[i][5] == '/') break; if(i < items) { month = atoi(itm[i]); if(month <= 12) day = atoi(&itm[i][3]); else { day = atoi(itm[i]); month = atoi(&itm[i][3]); } year = atoi(&itm[i][6]); } else if(itm[0][0] >= '0' && itm[0][0] <= '9') sscanf(itm[0], "%02d%02d%02d%02d%02d%", &year, &month, &day, &hour, &minute); } if(day && month && year) { for(i = 0; i < items; i++) if((cp = strchr(itm[i], ':')) != NULL) { *cp++ = '\0'; hour = atoi(itm[i]); minute = atoi(cp); if((cp = strchr(cp, ':')) != NULL) second = atoi(cp + 1); if(++i < items) { if(itm[i][0] == '+' || itm[i][0] == '-') tdiff = (atoi(itm[i]) / 100) * 60; else tdiff = is_tzone(itm[i]); } break; } if(year < 70) year += 100; else if(year > 1970) year -= 1900; tms.tm_sec = second; tms.tm_min = minute; tms.tm_hour = hour; tms.tm_mday = day; tms.tm_mon = month - 1; tms.tm_year = year; tms.tm_wday = 0; tms.tm_yday = 0; tms.tm_isdst = 0; result = mktime(&tms) - tdiff * 60; } free(datebuf); return(result); } #ifdef STANDALONE /************************************************************************/ /* */ /************************************************************************/ int main(int argc, char *argv[]) { int i; char line[128]; time_t t; if(argc < 2) printf("Usage: %s \n", argv[0]); else { line[0] = '\0'; for(i = 1; i < argc; i++) { strcat(line, argv[i]); strcat(line, " "); } printf("Input :\t%s\n", line); t = getdate(line); printf( "Result:\t%s", ctime(&t)); } return(0); } #endif