fxstest: Use DAHDI_SPECIFY when opening by integer channel number.

In DAHDI-Linux 2.7 the layout of the /dev/dahdi files changes so that they are
grouped by span. When opening channels by number all utilities need to use
DAHDI_SPECIFY now.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
This commit is contained in:
Shaun Ruffell 2013-05-09 10:34:20 -05:00 committed by Russ Meyerriecks
parent bab1ac48f5
commit 7939579d9e

View File

@ -33,6 +33,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/stat.h>
#include <dahdi/user.h> #include <dahdi/user.h>
#include <dahdi/wctdm_user.h> #include <dahdi/wctdm_user.h>
@ -101,6 +102,41 @@ static int dahdi_ring_phone(int fd)
return res; return res;
} }
int channel_open(const char *name)
{
int channo, fd;
struct stat filestat;
const char *DEVICE = "/dev/dahdi/channel";
/* stat file, if character device, open it */
channo = strtoul(name, NULL, 10);
fd = stat(name, &filestat);
if (!fd && S_ISCHR(filestat.st_mode)) {
fd = open(name, O_RDWR, 0600);
if (fd < 0) {
perror(name);
return -1;
}
/* try out the dahdi_specify interface */
} else if (channo > 0) {
fd = open(DEVICE, O_RDWR, 0600);
if (fd < 0) {
perror(DEVICE);
return -1;
}
if (ioctl(fd, DAHDI_SPECIFY, &channo) < 0) {
perror("DAHDI_SPECIFY ioctl failed");
return -1;
}
/* die */
} else {
fprintf(stderr, "Specified channel is not a valid character "
"device or channel number");
return -1;
}
return fd;
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int fd; int fd;
@ -121,7 +157,7 @@ int main(int argc, char *argv[])
" dtmfcid - create a dtmf cid spill without polarity reversal\n"); " dtmfcid - create a dtmf cid spill without polarity reversal\n");
exit(1); exit(1);
} }
fd = open(argv[1], O_RDWR); fd = channel_open(argv[1]);
if (fd < 0) { if (fd < 0) {
fprintf(stderr, "Unable to open %s: %s\n", argv[1], strerror(errno)); fprintf(stderr, "Unable to open %s: %s\n", argv[1], strerror(errno));
exit(1); exit(1);