[svn-commits] kmoore: tools/trunk r9975 - in /tools/trunk: patgen.c patlooptest.c pattest.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Jun 7 14:44:38 CDT 2011


Author: kmoore
Date: Tue Jun  7 14:44:34 2011
New Revision: 9975

URL: http://svnview.digium.com/svn/dahdi?view=rev&rev=9975
Log:
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>

Modified:
    tools/trunk/patgen.c
    tools/trunk/patlooptest.c
    tools/trunk/pattest.c

Modified: tools/trunk/patgen.c
URL: http://svnview.digium.com/svn/dahdi/tools/trunk/patgen.c?view=diff&rev=9975&r1=9974&r2=9975
==============================================================================
--- tools/trunk/patgen.c (original)
+++ tools/trunk/patgen.c Tue Jun  7 14:44:34 2011
@@ -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 @@
 	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;
+	int	channo, fd;
+	struct	dahdi_params tp;
+	struct	stat filestat;
 
-	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);
+	/* 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;
 	}

Modified: tools/trunk/patlooptest.c
URL: http://svnview.digium.com/svn/dahdi/tools/trunk/patlooptest.c?view=diff&rev=9975&r1=9974&r2=9975
==============================================================================
--- tools/trunk/patlooptest.c (original)
+++ tools/trunk/patlooptest.c Tue Jun  7 14:44:34 2011
@@ -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 @@
 	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 @@
 	
 	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 @@
 	}
 	
 }
+

Modified: tools/trunk/pattest.c
URL: http://svnview.digium.com/svn/dahdi/tools/trunk/pattest.c?view=diff&rev=9975&r1=9974&r2=9975
==============================================================================
--- tools/trunk/pattest.c (original)
+++ tools/trunk/pattest.c Tue Jun  7 14:44:34 2011
@@ -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 @@
 	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;
+	int	channo, fd;
+	struct	dahdi_params tp;
+	struct	stat filestat;
 
-	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);
+	/* 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;
 	}




More information about the svn-commits mailing list