/* $Id$ */ /* * Copyright (c) 2004 Dimitri Sokolyuk * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #include #include #include #include #include #include #include #include #include #include extern char *__progname; const char *copyright = "TGeb parasite 0.3.2 - " "Copyright (c) 2004 Dimitri Sokolyuk "; void usage(void); void prdt(AN_D *, TA_D *); void print_reg(int); int main(int argc, char **argv) { AN *an; TA *ta; AU *au; SORTED *sd; char ch; char *datum; int reg = FERN_W; int flags = 0; time_t tval = time(NULL); struct tm *tm = localtime(&tval); int time = tm->tm_hour; int quant = 3; int i; struct passwd *pw; char *home; home = calloc(_POSIX_PATH_MAX, sizeof(char)); pw = getpwuid(getuid()); snprintf(home, _POSIX_PATH_MAX, "%s/.tgeb", pw->pw_dir); if (chdir(home) == -1) { if (mkdir(home, 0755) == -1) err(1, "%s", home); if (chdir(home) == -1) err(1, "%s", home); } free(home); while ((ch = getopt(argc, argv, "CRP9n5fo12eONE?h:q:u")) != -1) switch (ch) { case 'u': /* update */ tgeb_update(tm); exit(0); break; case 'h': /* time hour */ time = atoi(optarg); if (time >= 24) errx(1, "wrong time"); break; case 'q': /* time hour */ quant = atoi(optarg); break; case 'C': /* Call by Call */ flags ^= T_CBC; break; case 'R': /* Call by Call with reg. */ flags ^= T_CBCR; break; case 'P': /* Preselect */ flags ^= T_PRES; break; case '9': /* 0190 */ flags ^= T_0190; break; case 'n': /* Nah */ reg = NAH_W; break; case '5': /* Reg 50km */ reg = REG_W; break; case 'f': /* Fern */ reg = FERN_W; break; case 'o': /* Ort */ reg = ORT_W; break; case '1': /* D1 */ reg = D1_W; break; case '2': /* D2 */ reg = D2_W; break; case 'e': /* E+ */ reg = EP_W; break; case 'O': /* o2 */ reg = O2_W; break; case 'N': // Now if ((tm->tm_wday == 0) || (tm->tm_wday == 6)) reg++; break; case 'E': // Wochenende reg++; break; case '?': default: usage(); } argc -= optind; argv += optind; if (!(flags & ~T_0190)) /* default T_CBC, ignore T_0190 */ flags ^= T_CBC; if ((tm->tm_wday == 0) || (tm->tm_wday == 6)) reg++; datum = tgeb_read_date("datum.dat"); if (datum == NULL) { tgeb_update(tm); exit(1); } an = tgeb_read_an("anbieter.dat"); au = tgeb_read_au("ausland.dat"); ta = tgeb_read_ta("tarife.dat", au); if (an->e_q != ta->q) { errx(1, "database missmatch - obtain new files"); } sd = tgeb_select(ta, an, reg, flags, time); printf("\nDB\t%s\n\n", datum); print_reg(reg); for (i = 0; i < sd->q; i++) { prdt(&an->e[sd->id[i]], sd->data[i]); if ((i + 1) >= quant) break; } free(datum); tgeb_free_sd(sd); tgeb_free_ta(ta); tgeb_free_au(au); tgeb_free_an(an); exit(0); return 0; } void prdt(AN_D * an_d, TA_D * ta_d) { #ifdef DEBUG printf("ID\t%.2u\n", an_d->id); #endif printf("Prefix\t%s\n" "Name\t%s" " (%s)\n", an_d->pref, an_d->h->name, an_d->serv); printf("Valid\t%.2u:00 - %.2u:00 h\n", ta_d->prev ? ta_d->prev->time : (char) NULL, ta_d->time); printf("Fee\t%.2f ct/min", ta_d->fee * 100); if (ta_d->dfee != 0) printf(" + %.2f ct", ta_d->dfee * 100); printf("\nTiming\t%u/%u s\n\n", ta_d->t1, ta_d->t2); return; } void print_reg(int reg) { char *regions[] = { "Nah", "Nah Wochenende", "50km", "50km Wochenende", "Fern", "Fern Wochenende", "Ort", "Ort Wochenende", "D1", "D1 Wochenende", "D2", "D2 Wochenende", "E+", "E+ Wochenende", "o2", "o2 Wochenende", NULL }; if (reg < 0x00 || reg > 0xFF) #ifdef DEBUG errx(1, "wrong region: 0x%.2x", reg); #else return; #endif printf("Region\t%s\n\n", regions[reg]); return; } void usage() { printf("%s\n", copyright); printf("Usage: %s [-CRP9n5fo12eONE] [-h ] [-q ] [-u] [-?]\n", __progname); printf(" -C Call-by-Call (default)\n" \ " -R Call-by-Call with registration\n" \ " -P Preselect\n" \ " -9 with 0190 (default - without)\n" \ " -n Nah\n" \ " -5 Region 50km\n" \ " -f Fern (default)\n" \ " -o Ort\n" \ " -1 D1\n" \ " -2 D2\n" \ " -e E+\n" \ " -O o2\n" \ " -N Now\n" \ " -E Weekend\n" \ " -h hour (default - now)\n" \ " -q output quantity (default - 3)\n" \ " -u update db\n" \ " -? usage\n"); exit(1); return; }