|
|
|
@ -11975,38 +11975,6 @@ static int sigtype_to_signalling(int sigtype)
|
|
|
|
|
return sigtype;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* \internal
|
|
|
|
|
* \brief Get file name and channel number from (subdir,number)
|
|
|
|
|
*
|
|
|
|
|
* \param subdir name of the subdirectory under /dev/dahdi/
|
|
|
|
|
* \param channel name of device file under /dev/dahdi/<subdir>/
|
|
|
|
|
* \param path buffer to put file name in
|
|
|
|
|
* \param pathlen maximal length of path
|
|
|
|
|
*
|
|
|
|
|
* \retval minor number of dahdi channel.
|
|
|
|
|
* \retval -errno on error.
|
|
|
|
|
*/
|
|
|
|
|
static int device2chan(const char *subdir, int channel, char *path, int pathlen)
|
|
|
|
|
{
|
|
|
|
|
struct stat stbuf;
|
|
|
|
|
int num;
|
|
|
|
|
|
|
|
|
|
snprintf(path, pathlen, "/dev/dahdi/%s/%d", subdir, channel);
|
|
|
|
|
if (stat(path, &stbuf) < 0) {
|
|
|
|
|
ast_log(LOG_ERROR, "stat(%s) failed: %s\n", path, strerror(errno));
|
|
|
|
|
return -errno;
|
|
|
|
|
}
|
|
|
|
|
if (!S_ISCHR(stbuf.st_mode)) {
|
|
|
|
|
ast_log(LOG_ERROR, "%s: Not a character device file\n", path);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
num = minor(stbuf.st_rdev);
|
|
|
|
|
ast_debug(1, "%s -> %d\n", path, num);
|
|
|
|
|
return num;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* \internal
|
|
|
|
|
* \brief Initialize/create a channel interface.
|
|
|
|
@ -17424,33 +17392,9 @@ static int unload_module(void)
|
|
|
|
|
return __unload_module();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void string_replace(char *str, int char1, int char2)
|
|
|
|
|
{
|
|
|
|
|
for (; *str; str++) {
|
|
|
|
|
if (*str == char1) {
|
|
|
|
|
*str = char2;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static char *parse_spanchan(char *chanstr, char **subdir)
|
|
|
|
|
{
|
|
|
|
|
char *p;
|
|
|
|
|
|
|
|
|
|
if ((p = strrchr(chanstr, '!')) == NULL) {
|
|
|
|
|
*subdir = NULL;
|
|
|
|
|
return chanstr;
|
|
|
|
|
}
|
|
|
|
|
*p++ = '\0';
|
|
|
|
|
string_replace(chanstr, '!', '/');
|
|
|
|
|
*subdir = chanstr;
|
|
|
|
|
return p;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int build_channels(struct dahdi_chan_conf *conf, const char *value, int reload, int lineno)
|
|
|
|
|
{
|
|
|
|
|
char *c, *chan;
|
|
|
|
|
char *subdir;
|
|
|
|
|
int x, start, finish;
|
|
|
|
|
struct dahdi_pvt *tmp;
|
|
|
|
|
|
|
|
|
@ -17460,7 +17404,6 @@ static int build_channels(struct dahdi_chan_conf *conf, const char *value, int r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
c = ast_strdupa(value);
|
|
|
|
|
c = parse_spanchan(c, &subdir);
|
|
|
|
|
|
|
|
|
|
while ((chan = strsep(&c, ","))) {
|
|
|
|
|
if (sscanf(chan, "%30d-%30d", &start, &finish) == 2) {
|
|
|
|
@ -17482,39 +17425,22 @@ static int build_channels(struct dahdi_chan_conf *conf, const char *value, int r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (x = start; x <= finish; x++) {
|
|
|
|
|
char fn[PATH_MAX];
|
|
|
|
|
int real_channel = x;
|
|
|
|
|
|
|
|
|
|
if (!ast_strlen_zero(subdir)) {
|
|
|
|
|
real_channel = device2chan(subdir, x, fn, sizeof(fn));
|
|
|
|
|
if (real_channel < 0) {
|
|
|
|
|
if (conf->ignore_failed_channels) {
|
|
|
|
|
ast_log(LOG_WARNING, "Failed configuring %s!%d, (got %d). But moving on to others.\n",
|
|
|
|
|
subdir, x, real_channel);
|
|
|
|
|
continue;
|
|
|
|
|
} else {
|
|
|
|
|
ast_log(LOG_ERROR, "Failed configuring %s!%d, (got %d).\n",
|
|
|
|
|
subdir, x, real_channel);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (conf->wanted_channels_start &&
|
|
|
|
|
(real_channel < conf->wanted_channels_start ||
|
|
|
|
|
real_channel > conf->wanted_channels_end)
|
|
|
|
|
(x < conf->wanted_channels_start ||
|
|
|
|
|
x > conf->wanted_channels_end)
|
|
|
|
|
) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
tmp = mkintf(real_channel, conf, reload);
|
|
|
|
|
tmp = mkintf(x, conf, reload);
|
|
|
|
|
|
|
|
|
|
if (tmp) {
|
|
|
|
|
ast_verb(3, "%s channel %d, %s signalling\n", reload ? "Reconfigured" : "Registered", real_channel, sig2str(tmp->sig));
|
|
|
|
|
ast_verb(3, "%s channel %d, %s signalling\n", reload ? "Reconfigured" : "Registered", x, sig2str(tmp->sig));
|
|
|
|
|
} else {
|
|
|
|
|
ast_log(LOG_ERROR, "Unable to %s channel '%s'\n",
|
|
|
|
|
(reload == 1) ? "reconfigure" : "register", value);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
if (real_channel == CHAN_PSEUDO) {
|
|
|
|
|
if (x == CHAN_PSEUDO) {
|
|
|
|
|
has_pseudo = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|