Ethereal-dev: Re: [ethereal-dev] Sending raw packets

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Stefan `Sec` Zehl <sec@xxxxxx>
Date: Thu, 7 Jan 1999 04:56:56 +0100
On Thu, Jan 07, 1999 at 04:52:04AM +0100, Stefan `Sec` Zehl wrote:
> Some searching around made me find that patch again, I attached it.

attached ? I need a new brain :-(

CU,
    Sec
-- 
CUSTOMER: "I'm running Windows '95."       > TECH: "Yes."
CUSTOMER: "My computer isn't working now." > TECH: "Yes, you already said that."
                                           -- (found in comp.os.linux.misc)

--- libpcap-0.4a5/pcap-bpf.c	Tue Dec 31 23:53:50 1996
+++ libpcap-changed/pcap-bpf.c	Sun Dec 07 11:21:55 1997
@@ -141,7 +141,8 @@
 	 */
 	do {
 		(void)sprintf(device, "/dev/bpf%d", n++);
-		fd = open(device, O_RDONLY);
+/*patched by jamal to allow writting */
+		fd = open(device, O_RDWR);
 	} while (fd < 0 && errno == EBUSY);
 
 	/*
@@ -253,3 +254,15 @@
 	}
 	return (0);
 }
+
+
+/* patched by jamal to allow writting of 
+frames to the open device at the datalink layer
+*/
+int
+pcap_write(pcap_t *pd, unsigned char *buf,int count)
+{
+if (write(pd->fd, buf, count) != count)
+return -1;
+else return count;
+}                           
--- libpcap-0.4a5/pcap-dlpi.c	Thu Oct 16 00:59:34 1997
+++ libpcap-changed/pcap-dlpi.c	Sun Dec 07 11:23:07 1997
@@ -846,3 +846,14 @@
 	return (cc);
 }
 #endif
+
+/* patched by jamal to allow writting of 
+frames to the open device at the datalink layer
+*/
+int
+pcap_write(pcap_t *pd, unsigned char *buf,int count)
+{
+if (write(pd->fd, buf, count) != count)
+return -1;
+else return count;
+}                           
--- libpcap-0.4a5/pcap-enet.c	Wed Dec 11 02:11:47 1996
+++ libpcap-changed/pcap-enet.c	Sun Dec 07 11:23:56 1997
@@ -148,10 +148,13 @@
 	u_int maxwaiting;
 	int if_fd;
 
+/* patched by jamal to read-write to allow
+writting of frames
+*/
 #ifdef	IBMRTPC
-	GETENETDEVICE(0, O_RDONLY, &if_fd);
+	GETENETDEVICE(0, O_RDWR, &if_fd);
 #else	/* !IBMRTPC */
-	if_fd = open("/dev/enet", O_RDONLY, 0);
+	if_fd = open("/dev/enet", O_RDWR, 0);
 #endif	/* IBMRTPC */
 
 	if (if_fd == -1) {
@@ -225,3 +228,15 @@
 
 	return(if_fd);
 }
+
+
+/* patched by jamal to allow writting of 
+frames to the open device at the datalink layer
+*/
+int
+pcap_write(pcap_t *pd, unsigned char *buf,int count)
+{
+if (write(pd->fd, buf, count) != count)
+return -1;
+else return count;
+}                           
--- libpcap-0.4a5/pcap-linux.c	Fri Oct  3 01:39:53 1997
+++ libpcap-changed/pcap-linux.c	Sun Dec 07 11:47:50 1997
@@ -329,3 +329,27 @@
 	else if (ioctl(fd, SIOCSIFFLAGS, &saved_ifr) < 0)
 		fprintf(stderr, "linux SIOCSIFFLAGS: %s", pcap_strerror(errno));
 }
+
+
+/* patched by jamal to allow writting of 
+frames to the open device at the datalink layer
+*/
+int
+pcap_write(pcap_t *pd, unsigned unsigned char *buf,int count)
+{
+int i;
+struct sockaddr sa;
+
+sa.sa_family = PF_INET;
+strcpy(sa.sa_data, pd->md.device);
+
+i=sendto(pd->fd, buf, count, 0, &sa, sizeof(sa));
+if (i<0)
+    {
+      return (-1);
+    }
+if (i != count)
+return -1;
+else return i;
+
+}                           
Only in libpcap-changed: pcap-linux.o
--- libpcap-0.4a5/pcap-nit.c	Wed Dec 11 02:15:01 1996
+++ libpcap-changed/pcap-nit.c	Sun Dec 07 11:25:34 1997
@@ -242,3 +242,17 @@
 	p->fcode = *fp;
 	return (0);
 }
+
+
+/* patched by jamal to allow writting of 
+frames to the open device at the datalink layer
+Someone please verify this; maybe we need to use 
+sendto() instead of write 
+*/
+int
+pcap_write(pcap_t *pd, unsigned char *buf,count)
+{
+if (write(pd->fd, buf, count) != count)
+return -1;
+else return count;
+}                           
--- libpcap-0.4a5/pcap-pf.c	Wed Dec 11 02:15:01 1996
+++ libpcap-changed/pcap-pf.c	Sun Dec 07 11:18:54 1997
@@ -214,7 +214,8 @@
 		return (0);
 	}
 	bzero((char *)p, sizeof(*p));
-	p->fd = pfopen(device, O_RDONLY);
+/* patched by jamal to allow writting */
+	p->fd = pfopen(device, O_RDWR);
 	if (p->fd < 0) {
 		sprintf(ebuf, "pf open: %s: %s\n\
 your system may not be properly configured; see \"man packetfilter(4)\"\n",
@@ -349,3 +350,15 @@
 		fprintf(stderr, "tcpdump: Filtering in user process\n");
 	return (0);
 }
+
+
+/* patched by jamal to allow writting of 
+frames to the open device at the datalink layer
+*/
+int
+pcap_write(pcap_t *pd, unsigned char *buf,int count)
+{
+if (write(pd->fd, buf, count) != count
+return -1;
+else return count;
+}                           
--- libpcap-0.4a5/pcap-snit.c	Wed Dec 11 02:15:02 1996
+++ libpcap-changed/pcap-snit.c	Sun Dec 07 11:19:56 1997
@@ -222,7 +222,8 @@
 		snaplen = 96;
 
 	bzero(p, sizeof(*p));
-	p->fd = fd = open(dev, O_RDONLY);
+/* patched by jamal to allow writting */
+	p->fd = fd = open(dev, O_RDWR);
 	if (fd < 0) {
 		sprintf(ebuf, "%s: %s", dev, pcap_strerror(errno));
 		goto bad;
@@ -298,3 +299,15 @@
 	p->fcode = *fp;
 	return (0);
 }
+
+
+/* patched by jamal to allow writting of 
+frames to the open device at the datalink layer
+*/
+int
+pcap_write(pcap_t *pd, unsigned char *buf,int count)
+{
+if (write(pd->fd, buf, count) != count)
+return -1;
+else return count;
+}                           
--- libpcap-0.4a5/pcap-snoop.c	Wed Apr  9 00:07:01 1997
+++ libpcap-changed/pcap-snoop.c	Sun Dec 07 11:27:04 1997
@@ -214,3 +214,17 @@
 	p->fcode = *fp;
 	return (0);
 }
+
+
+/* patched by jamal to allow writting of 
+frames to the open device at the datalink layer
+Someone please verify this
+maybe we need to use sendto instead of write
+*/
+int
+pcap_write(pcap_t *pd, unsigned char *buf,int count)
+{
+if (write(pd->fd, buf, count) != count)
+return -1;
+else return count;
+}                           
--- libpcap-0.4a5/pcap.h	Thu Oct 16 00:59:16 1997
+++ libpcap-changed/pcap.h	Sun Dec 07 11:40:08 1997
@@ -111,6 +111,7 @@
 int	pcap_stats(pcap_t *, struct pcap_stat *);
 int	pcap_setfilter(pcap_t *, struct bpf_program *);
 void	pcap_perror(pcap_t *, char *);
+int	pcap_write(pcap_t *, unsigned char *,int);
 char	*pcap_strerror(int);
 char	*pcap_geterr(pcap_t *);
 int	pcap_compile(pcap_t *, struct bpf_program *, char *, int,