summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--patgen.c51
-rw-r--r--patlooptest.c64
-rw-r--r--pattest.c51
3 files changed, 113 insertions, 53 deletions
diff --git a/patgen.c b/patgen.c
index e816dd9..2b619d3 100644
--- a/patgen.c
+++ b/patgen.c
@@ -33,6 +33,7 @@
#include <linux/types.h>
#include <linux/ppp_defs.h>
#include <sys/ioctl.h>
+#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include "bittest.h"
@@ -65,30 +66,40 @@ void print_packet(unsigned char *buf, int len)
printf("}\n");
}
-int channel_open(char *name, int *bs)
+int channel_open(const char *name, int *bs)
{
- int channo;
- int fd;
- struct dahdi_params tp;
- char *dev;
-
- channo = atoi(name);
- /* channo==0: The user passed a file name to be opened. */
- dev = channo ? DEVICE : name;
-
- fd = open(dev, O_RDWR, 0600);
-
- if (fd < 0) {
- perror(DEVICE);
+ int channo, fd;
+ struct dahdi_params tp;
+ struct stat filestat;
+
+ /* 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;
}
- /* If we got a channel number, get it from /dev/dahdi/channel: */
- if(channo && ioctl(fd, DAHDI_SPECIFY, &channo) < 0) {
- perror("SPECIFY");
- return -1;
- }
- if(ioctl(fd, DAHDI_SET_BLOCKSIZE, bs) < 0) {
+ if (ioctl(fd, DAHDI_SET_BLOCKSIZE, bs) < 0) {
perror("SET_BLOCKSIZE");
return -1;
}
diff --git a/patlooptest.c b/patlooptest.c
index 2ded0b2..f003ae1 100644
--- a/patlooptest.c
+++ b/patlooptest.c
@@ -39,6 +39,7 @@
#include <errno.h>
#include <stdio.h>
#include <sys/ioctl.h>
+#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
@@ -47,6 +48,7 @@
#include "dahdi_tools_version.h"
#define BLOCK_SIZE 2039
+#define DEVICE "/dev/dahdi/channel"
#define CONTEXT_SIZE 7
/* Prints a set of bytes in hex format */
@@ -97,12 +99,57 @@ static void usage(const char * progname)
printf("\n\t Also accepts old style usage:\n\t %s <device name> [<timeout in secs>]\n", progname);
}
+int channel_open(const char *name, int *bs)
+{
+ int channo, fd;
+ struct dahdi_params tp;
+ struct stat filestat;
+
+ /* 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;
+ }
+
+ if (ioctl(fd, DAHDI_SET_BLOCKSIZE, bs) < 0) {
+ perror("SET_BLOCKSIZE");
+ return -1;
+ }
+
+ if (ioctl(fd, DAHDI_GET_PARAMS, &tp)) {
+ fprintf(stderr, "Unable to get channel parameters\n");
+ return -1;
+ }
+
+ return fd;
+}
+
int main(int argc, char *argv[])
{
int fd;
int res, x;
int i;
- struct dahdi_params tp;
int bs = BLOCK_SIZE;
int skipcount = 10;
unsigned char c=0,c1=0;
@@ -173,19 +220,9 @@ int main(int argc, char *argv[])
time_t start_time = 0;
- fd = open(device, O_RDWR, 0600);
- if (fd < 0) {
- fprintf(stderr, "Unable to open %s: %s\n", device, strerror(errno));
+ fd = channel_open(device, &bs);
+ if (fd < 0)
exit(1);
- }
- if (ioctl(fd, DAHDI_SET_BLOCKSIZE, &bs)) {
- fprintf(stderr, "Unable to set block size to %d: %s\n", bs, strerror(errno));
- exit(1);
- }
- if (ioctl(fd, DAHDI_GET_PARAMS, &tp)) {
- fprintf(stderr, "Unable to get channel parameters\n");
- exit(1);
- }
ioctl(fd, DAHDI_GETEVENT);
i = DAHDI_FLUSH_ALL;
@@ -299,3 +336,4 @@ read_again:
}
}
+
diff --git a/pattest.c b/pattest.c
index 7e33a5c..09b0c8e 100644
--- a/pattest.c
+++ b/pattest.c
@@ -33,6 +33,7 @@
#include <linux/types.h>
#include <linux/ppp_defs.h>
#include <sys/ioctl.h>
+#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include "bittest.h"
@@ -64,30 +65,40 @@ void print_packet(unsigned char *buf, int len)
printf("}\n");
}
-int channel_open(char *name, int *bs)
+int channel_open(const char *name, int *bs)
{
- int channo;
- int fd;
- struct dahdi_params tp;
- char *dev;
-
- channo = atoi(name);
- /* channo==0: The user passed a file name to be opened. */
- dev = channo ? DEVICE : name;
-
- fd = open(dev, O_RDWR, 0600);
-
- if (fd < 0) {
- perror(DEVICE);
+ int channo, fd;
+ struct dahdi_params tp;
+ struct stat filestat;
+
+ /* 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;
}
- /* If we got a channel number, get it from /dev/dahdi/channel: */
- if(channo && ioctl(fd, DAHDI_SPECIFY, &channo) < 0) {
- perror("SPECIFY");
- return -1;
- }
- if(ioctl(fd, DAHDI_SET_BLOCKSIZE, bs) < 0) {
+ if (ioctl(fd, DAHDI_SET_BLOCKSIZE, bs) < 0) {
perror("SET_BLOCKSIZE");
return -1;
}