summaryrefslogtreecommitdiff
path: root/usr.sbin/i4b/isdnd/rates.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/i4b/isdnd/rates.c')
-rw-r--r--usr.sbin/i4b/isdnd/rates.c473
1 files changed, 0 insertions, 473 deletions
diff --git a/usr.sbin/i4b/isdnd/rates.c b/usr.sbin/i4b/isdnd/rates.c
deleted file mode 100644
index c1b11636a5c78..0000000000000
--- a/usr.sbin/i4b/isdnd/rates.c
+++ /dev/null
@@ -1,473 +0,0 @@
-/*
- * Copyright (c) 1997 Gary Jennejohn. All rights reserved.
- *
- * Copyright (c) 1997, 1998 Hellmuth Michaelis. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the author nor the names of any co-contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- * 4. Altered versions must be plainly marked as such, and must not be
- * misrepresented as being the original software and/or documentation.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *---------------------------------------------------------------------------
- *
- * i4b daemon - charging rates description file handling
- * -----------------------------------------------------
- *
- * $Id: rates.c,v 1.7 1998/12/05 18:03:34 hm Exp $
- *
- * last edit-date: [Sat Dec 5 18:11:55 1998]
- *
- *---------------------------------------------------------------------------*/
-
-static char error[256];
-
-#ifdef PARSE_DEBUG_MAIN
-
-#include <stdio.h>
-
-#define MAIN
-
-#define ERROR (-1)
-
-int main()
-{
- int ret;
- ret = readrates("/etc/isdn/isdnd.rates");
- if(ret == ERROR)
- fprintf(stderr, "readrates returns [%d], [%s]\n", ret, error);
- else
- fprintf(stderr, "readrates returns [%d]\n", ret);
- return(ret);
-}
-
-#endif
-
-#include "isdnd.h"
-
-static int getrate(cfg_entry_t *cep);
-
-/*---------------------------------------------------------------------------*
- * parse rates file
- *---------------------------------------------------------------------------*/
-int
-readrates(char *filename)
-{
- char buffer[1024];
- register char *bp;
- struct rates *rt, *ort;
- int rateindx;
- int indx;
- int line = 0;
- FILE *fp;
- int first;
-#if DEBUG
- int i, j;
-#endif
-
- indx = 0;
- rt = ort = NULL;
-
- if((fp = fopen(filename, "r")) == NULL)
- {
- sprintf(error, "error open %s: %s", filename, sys_errlist[errno]);
- rate_error = error;
- return(WARNING);
- }
-
- while((fgets(buffer, MAXPATHLEN, fp)) != NULL)
- {
- line++;
-
-/* comments */
- if(buffer[0] == '#' || buffer[0] == ' ' ||
- buffer[0] == '\t' || buffer[0] == '\n')
- {
- continue;
- }
-
- bp = &buffer[0];
-
- /* rate type */
-
- if (*bp == 'r' && *(bp+1) == 'a' && isdigit(*(bp+2)))
- {
- rateindx = *(bp+2) - '0';
- bp += 3;
-
- /* eat space delimiter */
-
- while(isspace(*bp))
- bp++;
- }
- else
- {
- sprintf(error, "rates: invalid rate type %c%c%c in line %d", *bp, *(bp+1), *(bp+2), line);
- goto rate_error;
- }
- if (rateindx >= NRATES)
- {
- sprintf(error, "rates: invalid rate index %d in line %d", rateindx, line);
- goto rate_error;
- }
-
- /* day */
-
- if(isdigit(*bp) && *bp >= '0' && *bp <= '6')
- {
- indx = *bp - '0';
-
- DBGL(DL_RATES, (log(LL_DBG, "rates: index = %d", indx)));
- }
- else
- {
- sprintf(error, "rates: invalid day digit %c in line %d", *bp, line);
- goto rate_error;
- }
-
- if(rates[rateindx][indx] == NULL)
- {
- rt = (struct rates *)malloc(sizeof (struct rates));
- if (rt == NULL)
- {
- sprintf(error, "rates: cannot malloc space for rate structure");
- goto rate_error;
- }
- rt->next = NULL;
- rates[rateindx][indx] = rt;
- }
-
- bp++;
-
- /* eat space delimiter */
-
- while(isspace(*bp))
- bp++;
-
- /* now loop to get the rates entries */
-
- first = 1;
-
- while(*bp && isdigit(*bp))
- {
- if(first)
- {
- first = 0;
- }
- else
- {
- ort = rt;
-
- rt = (struct rates *)malloc(sizeof (struct rates));
- if (rt == NULL)
- {
- sprintf(error, "rates: cannot malloc space2 for rate structure");
- goto rate_error;
- }
- ort->next = rt;
- rt->next = NULL;
- }
-
- /* start hour */
-
- if(isdigit(*bp) && isdigit(*(bp+1)))
- {
- rt->start_hr = atoi(bp);
- bp += 2;
- }
- else
- {
- sprintf(error, "rates: start_hr error in line %d", line);
- goto rate_error;
- }
-
- /* point */
-
- if(*bp == '.')
- {
- bp++;
- }
- else
- {
- sprintf(error, "rates: no '.' after start_hr in line %d", line);
- goto rate_error;
- }
-
- /* start minute */
-
- if(isdigit(*bp) && isdigit(*(bp+1)))
- {
- rt->start_min = atoi(bp);
- bp += 2;
- }
- else
- {
- sprintf(error, "rates: start_min error in line %d", line);
- goto rate_error;
- }
-
- /* minus */
-
- if(*bp == '-')
- {
- bp++;
- }
- else
- {
- sprintf(error, "rates: no '-' after start_min in line %d", line);
- goto rate_error;
- }
-
- /* end hour */
-
- if(isdigit(*bp) && isdigit(*(bp+1)))
- {
- rt->end_hr = atoi(bp);
- bp += 2;
- }
- else
- {
- sprintf(error, "rates: end_hr error in line %d", line);
- goto rate_error;
- }
-
- /* point */
-
- if(*bp == '.')
- {
- bp++;
- }
- else
- {
- sprintf(error, "rates: no '.' after end_hr in line %d", line);
- goto rate_error;
- }
-
- /* end minute */
-
- if(isdigit(*bp) && isdigit(*(bp+1)))
- {
- rt->end_min = atoi(bp);
- bp += 2;
- }
- else
- {
- sprintf(error, "rates: end_min error in line %d", line);
- goto rate_error;
- }
-
- /* colon */
-
- if(*bp == ':')
- {
- bp++;
- }
- else
- {
- sprintf(error, "rates: no ':' after end_min in line %d", line);
- goto rate_error;
- }
-
- /* time */
-
- if(isdigit(*bp))
- {
- rt->rate = atoi(bp);
- while(!isspace(*bp))
- bp++;
- }
- else
- {
- sprintf(error, "rates: first rate digit error in line %d", line);
- goto rate_error;
- }
-
- /* eat space delimiter */
-
- while(isspace(*bp))
- bp++;
- }
- }
-
-#if DEBUG
- if(debug_flags & DL_RATES)
- {
- for (j = 0; j < NRATES; j++)
- {
- for (i = 0; i < NDAYS; i++)
- {
- if (rates [j][i] != NULL)
- {
- rt = rates [j][i];
- for (; rt; rt = rt->next)
- {
- log(LL_DBG, "rates: index %d day %d = %d.%d-%d.%d:%d",
- j, i, rt->start_hr, rt->start_min,
- rt->end_hr,rt->end_min,rt->rate);
- }
- }
- else
- {
- log(LL_DBG, "rates: NO entry for day %d !!\n", i);
- }
- }
- }
- }
-#endif
- fclose(fp);
- return(GOOD);
-
-rate_error:
- fclose(fp);
- rate_error = error;
- return(ERROR);
-}
-
-#ifndef PARSE_DEBUG_MAIN
-
-/*---------------------------------------------------------------------------*
- * get unit length time from configured source
- *---------------------------------------------------------------------------*/
-int
-get_current_rate(cfg_entry_t *cep, int logit)
-{
- int rt;
-
- switch(cep->unitlengthsrc)
- {
- case ULSRC_CMDL: /* specified on commandline */
- if(logit)
- log(LL_CHD, "%05d %s rate %d sec/unit (cmdl)",
- cep->cdid, cep->name, unit_length);
- return(unit_length);
- break;
-
- case ULSRC_CONF: /* get it from config file */
- if(logit)
- log(LL_CHD, "%05d %s rate %d sec/unit (conf)",
- cep->cdid, cep->name, cep->unitlength);
- return(cep->unitlength);
-
- case ULSRC_RATE: /* get it dynamic from ratesfile*/
- if(!got_rate) /* got valid rates struct ?? */
- {
- if(logit)
- log(LL_CHD, "%05d %s rate %d sec/unit (no ratefile)",
- cep->cdid, cep->name, UNITLENGTH_DEFAULT);
- return(UNITLENGTH_DEFAULT);
- }
- if((cep->ratetype >= NRATES) ||
- (cep->ratetype == INVALID_RATE))
- {
- if(logit)
- log(LL_CHD, "%05d %s rate %d sec/unit (rate out of range)",
- cep->cdid, cep->name, UNITLENGTH_DEFAULT);
- return(UNITLENGTH_DEFAULT);
- }
-
- if((rt = getrate(cep)) != -1)
- {
- if(logit)
- log(LL_CHD, "%05d %s rate %d sec/unit (rate)",
- cep->cdid, cep->name, rt);
- return(rt);
- }
-
- if(logit)
- log(LL_CHD, "%05d %s rate %d sec/unit (ratescan fail)",
- cep->cdid, cep->name, UNITLENGTH_DEFAULT);
-
- return(UNITLENGTH_DEFAULT);
- break;
-
- case ULSRC_DYN: /* dynamically calculated from AOC */
- if((rt = getrate(cep)) != -1)
- {
- if(logit)
- log(LL_CHD, "%05d %s rate %d sec/unit (aocd, rate)",
- cep->cdid, cep->name, rt);
- return(rt);
- }
- if(logit)
- log(LL_CHD, "%05d %s rate %d sec/unit (aocd, default)",
- cep->cdid, cep->name, UNITLENGTH_DEFAULT);
-
- return(UNITLENGTH_DEFAULT);
- break;
-
- default:
- if(logit)
- log(LL_CHD, "%05d %s rate %d sec/unit (unitlen unknown)",
- cep->cdid, cep->name, UNITLENGTH_DEFAULT);
-
- return(UNITLENGTH_DEFAULT);
- break;
- }
-}
-
-/*---------------------------------------------------------------------------*
- * get the currently active rate
- *---------------------------------------------------------------------------*/
-static int
-getrate(cfg_entry_t *cep)
-{
- struct tm *ptr;
- time_t now;
- register struct rates *hd;
-
- if((!got_rate) ||
- (cep->ratetype >= NRATES) ||
- (cep->ratetype == INVALID_RATE))
- {
- return(-1);
- }
-
- time(&now); /* get current time */
-
- ptr = localtime(&now);
-
- /* walk thru the rates for weekday until rate for current time found */
-
- for (hd = rates[cep->ratetype][ptr->tm_wday]; hd; hd = hd->next)
- {
- /* current time within window ? */
- if((hd->start_hr <= ptr->tm_hour) &&
- (hd->end_hr > ptr->tm_hour))
- {
- DBGL(DL_RATES, (log(LL_DBG, "rate=%d sec/unit (day=%d, beg=%d, end=%d, current=%d)",
- hd->rate,
- ptr->tm_wday,
- hd->start_hr,
- hd->end_hr,
- ptr->tm_hour)));
-
- return (hd->rate);
- }
- }
- return(-1);
-}
-
-#endif /* PARSE_DEBUG_MAIN */
-
-/* EOF */