xpp: allow XTALK_OPTIONS from a file
* The file is defined as XTALK_OPTIONS_FILE (/etc/dahdi/xpp.conf): - Lines beginning with '#' are skipped. - Line beginning with "XTALK_OPTIONS" are used. - Anything after whitespaces (with optional "=" characters) is part of the value. * An environment variable named "XTALK_OPTIONS" may override file contents. Signed-off-by: Oron Peled <oron.peled@xorcom.com> Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>
This commit is contained in:
parent
2097f1adc5
commit
dbb5ba6db6
|
@ -1,5 +1,11 @@
|
||||||
VISIBILITY_DEFS = -DXTALK_DLL -DXTALK_DLL_EXPORTS
|
VISIBILITY_DEFS = -DXTALK_DLL -DXTALK_DLL_EXPORTS
|
||||||
COMMON_CFLAGS = -Wall -Wno-unknown-pragmas -Werror $(VISIBILITY_DEFS) $(CFLAG_VISIBILITY)
|
COMMON_CFLAGS = \
|
||||||
|
-Wall \
|
||||||
|
-Wno-unknown-pragmas \
|
||||||
|
-Werror \
|
||||||
|
$(VISIBILITY_DEFS) \
|
||||||
|
$(CFLAG_VISIBILITY)
|
||||||
|
|
||||||
AM_CFLAGS = $(COMMON_CFLAGS)
|
AM_CFLAGS = $(COMMON_CFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
@ -35,7 +41,13 @@ dist_noinst_HEADERS = \
|
||||||
|
|
||||||
man_MANS = xtalk_send.8
|
man_MANS = xtalk_send.8
|
||||||
|
|
||||||
libxtalk_la_CFLAGS = $(COMMON_CFLAGS) -I$(srcdir)/include -I$(srcdir) $(USB_CFLAGS)
|
libxtalk_la_CFLAGS = \
|
||||||
|
$(COMMON_CFLAGS) \
|
||||||
|
-I$(srcdir)/include \
|
||||||
|
-I$(srcdir) \
|
||||||
|
$(USB_CFLAGS) \
|
||||||
|
-DXTALK_OPTIONS_FILE=\"/etc/dahdi/xpp.conf\"
|
||||||
|
|
||||||
libxtalk_la_LDFLAGS = #
|
libxtalk_la_LDFLAGS = #
|
||||||
libxtalk_la_LIBADD = $(USB_LIBS)
|
libxtalk_la_LIBADD = $(USB_LIBS)
|
||||||
libxtalk_la_SOURCES = \
|
libxtalk_la_SOURCES = \
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#define _GNU_SOURCE /* for memrchr() */
|
#define _GNU_SOURCE /* for memrchr() */
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -360,16 +361,66 @@ int xtalk_option_use_clear_halt(void)
|
||||||
return use_clear_halt;
|
return use_clear_halt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void chomp(char *buf)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
if (!buf)
|
||||||
|
return;
|
||||||
|
len = strlen(buf);
|
||||||
|
for (p = buf + len - 1; p >= buf && isspace(*p); p--)
|
||||||
|
*p = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *OPTION_VAR = "XTALK_OPTIONS";
|
||||||
|
|
||||||
|
/* Caller should free the returned string if it is not NULL */
|
||||||
|
static char *read_options(const char *fname)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
char buf[BUFSIZ];
|
||||||
|
char *p;
|
||||||
|
char *ret_buf;
|
||||||
|
|
||||||
|
fp = fopen(fname, "r");
|
||||||
|
if (!fp) {
|
||||||
|
DBG("Failed opening '$fname': %s\n", strerror(errno));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
while (fgets(buf, sizeof(buf), fp) != NULL) {
|
||||||
|
chomp(buf);
|
||||||
|
if (buf[0] == '\0' || buf[0] == '#')
|
||||||
|
continue;
|
||||||
|
if (strncmp(buf, OPTION_VAR, strlen(OPTION_VAR)) != 0)
|
||||||
|
continue;
|
||||||
|
/* fprintf(stderr, "INPUT> '%s'\n", p); */
|
||||||
|
p = buf + strlen(OPTION_VAR);
|
||||||
|
while (*p && (isspace(*p) || *p == '='))
|
||||||
|
p++;
|
||||||
|
ret_buf = malloc(sizeof(buf));
|
||||||
|
strcpy(ret_buf, p); /* Cannot overflow */
|
||||||
|
return ret_buf;
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int xtalk_parse_options(void)
|
int xtalk_parse_options(void)
|
||||||
{
|
{
|
||||||
char *xtalk_options;
|
char *xtalk_options;
|
||||||
char *saveptr;
|
char *saveptr;
|
||||||
char *token;
|
char *token;
|
||||||
int ret;
|
int ret;
|
||||||
|
int free_options = 0;
|
||||||
|
|
||||||
xtalk_options = getenv("XTALK_OPTIONS");
|
xtalk_options = getenv("XTALK_OPTIONS");
|
||||||
|
if (!xtalk_options) {
|
||||||
|
xtalk_options = read_options(XTALK_OPTIONS_FILE);
|
||||||
if (!xtalk_options)
|
if (!xtalk_options)
|
||||||
return 0;
|
return 0;
|
||||||
|
free_options = 1;
|
||||||
|
}
|
||||||
token = strtok_r(xtalk_options, " \t", &saveptr);
|
token = strtok_r(xtalk_options, " \t", &saveptr);
|
||||||
while (token) {
|
while (token) {
|
||||||
ret = xtalk_one_option(token);
|
ret = xtalk_one_option(token);
|
||||||
|
@ -377,5 +428,7 @@ int xtalk_parse_options(void)
|
||||||
return ret;
|
return ret;
|
||||||
token = strtok_r(NULL, " \t", &saveptr);
|
token = strtok_r(NULL, " \t", &saveptr);
|
||||||
}
|
}
|
||||||
|
if (free_options)
|
||||||
|
free(xtalk_options);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue