summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Eversberg2009-10-27 07:53:27 +0100
committerAndreas Eversberg2009-10-27 07:53:27 +0100
commitb987a1bbbcabbf183ebe009903778671a1591337 (patch)
treec1cb7f202d4edb4bd5d8787047cfb12f6316be76
parentDon't detect tones for SS5, if the minimum noise level is not reached. (diff)
downloadlcr-b987a1bbbcabbf183ebe009903778671a1591337.tar.gz
lcr-b987a1bbbcabbf183ebe009903778671a1591337.tar.xz
lcr-b987a1bbbcabbf183ebe009903778671a1591337.zip
Fixes and improves parsing of config file.
Last character of unterminated line was ignored. Minor bug fix in 2600 Hz pulse dialing. modified: README modified: action_vbox.cpp modified: crypt.cpp modified: extension.c modified: gsm_conf.c modified: interface.c modified: macro.h modified: route.c modified: ss5.cpp modified: ss5.h
-rw-r--r--README1
-rw-r--r--action_vbox.cpp5
-rw-r--r--crypt.cpp2
-rw-r--r--extension.c20
-rw-r--r--gsm_conf.c4
-rw-r--r--interface.c4
-rw-r--r--macro.h18
-rw-r--r--route.c4
-rw-r--r--ss5.cpp8
-rw-r--r--ss5.h2
10 files changed, 33 insertions, 35 deletions
diff --git a/README b/README
index 85e8d96..f423b62 100644
--- a/README
+++ b/README
@@ -520,6 +520,7 @@ Changes after Version 1.6
-> Just add 'extern' right below your external interface definition, or give
external interface name in routing.conf: ": extern interfaces=XXXXX"
- Added experimental CCITT No. 5 signalling system. (for educational purpose)
+- Fixed/simplyfied config parser. The last digit of the last line was ignored.
diff --git a/action_vbox.cpp b/action_vbox.cpp
index 2426610..e325c0f 100644
--- a/action_vbox.cpp
+++ b/action_vbox.cpp
@@ -142,10 +142,7 @@ void EndpointAppPBX::vbox_index_read(int num)
fduse++;
i = 0;
- while((fgets(buffer,sizeof(buffer),fp))) {
- buffer[sizeof(buffer)-1] = '\0';
- if (buffer[0]) buffer[strlen(buffer)-1] = '\0';
-
+ while((GETLINE(buffer, fp))) {
name[0] = callerid[0] = '\0';
mon = mday = hour = min = 0;
sscanf(buffer, "%s %d %d %d %d %d %s", name, &year, &mon, &mday, &hour, &min, callerid);
diff --git a/crypt.cpp b/crypt.cpp
index ee8e7cc..44e901c 100644
--- a/crypt.cpp
+++ b/crypt.cpp
@@ -216,7 +216,7 @@ static unsigned int get_bogomips(void)
}
fduse++;
buffer[sizeof(buffer-1)] = '\0';
- while(fgets(buffer, sizeof(buffer)-1, fp)) {
+ while(GETLINE(buffer, fp)) {
if (!!strncmp(buffer, "bogomips", 8))
continue;
if (!strchr(buffer, ':'))
diff --git a/extension.c b/extension.c
index a1c3aa7..00e5326 100644
--- a/extension.c
+++ b/extension.c
@@ -68,10 +68,8 @@ int read_extension(struct extension *ext, char *num)
ext->vbox_codec = CODEC_MONO;
line=0;
- while((fgets(buffer, sizeof(buffer), fp))) {
+ while((GETLINE(buffer, fp))) {
line++;
- buffer[sizeof(buffer)-1] = '\0';
- if (buffer[0]) buffer[strlen(buffer)-1] = '\0';
p = buffer;
while(*p <= 32) { /* skip spaces */
@@ -1228,10 +1226,8 @@ int parse_phonebook(char *number, char **abbrev_pointer, char **phone_pointer, c
}
line=0;
- while((fgets(buffer, sizeof(buffer), fp))) {
+ while((GETLINE(buffer, fp))) {
line++;
- buffer[sizeof(buffer)-1] = '\0';
- if (buffer[0]) buffer[strlen(buffer)-1] = '\0';
p = buffer;
while(*p <= 32) { /* skip spaces */
@@ -1351,10 +1347,8 @@ int parse_secrets(char *number, char *remote_id, char **auth_pointer, char **cry
}
line=0;
- while((fgets(buffer, sizeof(buffer), fp))) {
+ while((GETLINE(buffer, fp))) {
line++;
- buffer[sizeof(buffer)-1] = '\0';
- if (buffer[0]) buffer[strlen(buffer)-1] = '\0';
p = buffer;
while(*p <= 32) { /* skip spaces */
@@ -1476,10 +1470,8 @@ char *parse_directory(char *number, int type)
}
line=0;
- while((fgets(buffer, sizeof(buffer), fp))) {
+ while((GETLINE(buffer, fp))) {
line++;
- buffer[sizeof(buffer)-1] = '\0';
- if (buffer[0]) buffer[strlen(buffer)-1] = '\0';
p = buffer;
while(*p <= 32) { /* skip spaces */
@@ -1611,10 +1603,8 @@ int parse_callbackauth(char *number, struct caller_info *callerinfo)
}
line=0;
- while((fgets(buffer, sizeof(buffer), fp))) {
+ while((GETLINE(buffer, fp))) {
line++;
- buffer[sizeof(buffer)-1] = '\0';
- if (buffer[0]) buffer[strlen(buffer)-1] = '\0';
p = buffer;
while(*p <= 32) { /* skip spaces */
diff --git a/gsm_conf.c b/gsm_conf.c
index 9957b86..082a6ed 100644
--- a/gsm_conf.c
+++ b/gsm_conf.c
@@ -47,10 +47,8 @@ int gsm_conf(struct gsm_conf *gsm_conf)
}
line=0;
- while((fgets(buffer,sizeof(buffer),fp))) {
+ while((GETLINE(buffer, fp))) {
line++;
- buffer[sizeof(buffer)-1]=0;
- if (buffer[0]) buffer[strlen(buffer)-1]=0;
p=buffer;
while(*p <= 32) { /* skip spaces */
diff --git a/interface.c b/interface.c
index 42f409c..8e21c75 100644
--- a/interface.c
+++ b/interface.c
@@ -1148,9 +1148,7 @@ struct interface *read_interfaces(void)
}
line=0;
- while((fgets(buffer,sizeof(buffer),fp))) {
- buffer[sizeof(buffer)-1]=0;
- if (buffer[0]) buffer[strlen(buffer)-1]=0;
+ while((GETLINE(buffer, fp))) {
p=buffer;
line++;
diff --git a/macro.h b/macro.h
index 29b2794..9e4bcd1 100644
--- a/macro.h
+++ b/macro.h
@@ -92,7 +92,7 @@ static inline void *_malloc(unsigned int size, const char *function, int line)
if (!addr)
fatal(function, line, "No memory for %d bytes.\n", size);
memset(addr, 0, size);
- return(addr);
+ return addr;
}
/* memory freeing with clearing memory to prevent using freed memory */
@@ -104,4 +104,20 @@ static inline void _free(void *addr, int size)
free(addr);
}
+/* fill buffer and be sure that it's result is 0-terminated, also remove newline */
+#define GETLINE(buffer, fp) _getline(buffer, sizeof(buffer), fp)
+static inline char *_getline(char *buffer, int size, FILE *fp)
+{
+ if (!fgets(buffer, size-1, fp))
+ return NULL;
+ buffer[size-1] = '\0';
+ if (!buffer[0])
+ return buffer;
+ if (buffer[strlen(buffer)-1] == '\n')
+ buffer[strlen(buffer)-1] = '\0';
+ if (buffer[strlen(buffer)-1] == '\r')
+ buffer[strlen(buffer)-1] = '\0';
+ return buffer;
+}
+
diff --git a/route.c b/route.c
index d47f8c2..4fecf38 100644
--- a/route.c
+++ b/route.c
@@ -839,11 +839,9 @@ struct route_ruleset *ruleset_parse(void)
go_leaf:
line[nesting]=0;
go_root:
- while((fgets(buffer,sizeof(buffer),fp[nesting])))
+ while((GETLINE(buffer, fp[nesting])))
{
line[nesting]++;
- buffer[sizeof(buffer)-1]=0;
- if (buffer[0]) buffer[strlen(buffer)-1]=0;
p = buffer;
/* remove tabs */
diff --git a/ss5.cpp b/ss5.cpp
index 0d453e4..164ef0c 100644
--- a/ss5.cpp
+++ b/ss5.cpp
@@ -1347,7 +1347,7 @@ void Pss5::digit_ind(char digit)
end_trace();
new_ss5_state(SS5_STATE_IDLE);
- do_setup(dial);
+ do_setup(dial, 1);
new_state(PORT_STATE_IN_PROCEEDING);
}
@@ -1392,7 +1392,7 @@ void Pss5::pulse_ind(int on)
}
if (p_state == PORT_STATE_IN_SETUP) {
/* sending digit as setup */
- do_setup(dial); /* include 'a' == KP1 */
+ do_setup(dial, 0); /* include 'a' == KP1 */
new_state(PORT_STATE_IN_OVERLAP);
} else {
/* sending digit as information */
@@ -1618,13 +1618,13 @@ void Pss5::do_release(int cause, int location)
/*
* create endpoint and send setup
*/
-void Pss5::do_setup(char *dial)
+void Pss5::do_setup(char *dial, int complete)
{
class Endpoint *epoint;
struct lcr_msg *message;
SCPY(p_dialinginfo.id, dial);
- p_dialinginfo.sending_complete = 1;
+ p_dialinginfo.sending_complete = complete;
p_callerinfo.present = INFO_PRESENT_NOTAVAIL;
p_callerinfo.screen = INFO_SCREEN_NETWORK;
p_callerinfo.ntype = INFO_NTYPE_NOTPRESENT;
diff --git a/ss5.h b/ss5.h
index 6897abd..238501f 100644
--- a/ss5.h
+++ b/ss5.h
@@ -57,7 +57,7 @@ class Pss5 : public PmISDN
void start_signal(int);
void start_outgoing(void);
void do_release(int cause, int location);
- void do_setup(char *digit);
+ void do_setup(char *digit, int complete);
void seizing_ind(void);
void digit_ind(char digit);