[Pkg-voip-commits] [dahdi-tools] 27/285: tools: Allow pattern tools to access channels above the device file limit

tzafrir at debian.org tzafrir at debian.org
Thu Jul 7 19:18:22 UTC 2016


This is an automated email from the git hooks/post-receive script.

tzafrir pushed a commit to branch master
in repository dahdi-tools.

commit 178ae278251c97cb39cea67e7ece939412b1aab9
Author: Kinsey Moore <kmoore at digium.com>
Date:   Tue Jun 7 19:44:34 2011 +0000

    tools: Allow pattern tools to access channels above the device file limit
    
    pattest and patgen already had this capability, but there were cases in which
    they would act unexpectedly.  Now, if the name specified is not a character
    device file, it will be treated as a channel number if possible.
    
    Acked-by: Shaun Ruffell <sruffell at digium.com>
    
    
    git-svn-id: http://svn.astersk.org/svn/dahdi/tools/trunk@9975 17933a7a-c749-41c5-a318-cba88f637d49
---
 patgen.c      | 51 ++++++++++++++++++++++++++++-------------------
 patlooptest.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++------------
 pattest.c     | 51 ++++++++++++++++++++++++++++-------------------
 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;
 	}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-voip/dahdi-tools.git



More information about the Pkg-voip-commits mailing list