﻿<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.ucis.nl/index.php?action=history&amp;feed=atom&amp;title=Projects%2FSoftware%2FTunTapIO%2Frawsock.c</id>
	<title>Projects/Software/TunTapIO/rawsock.c - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.ucis.nl/index.php?action=history&amp;feed=atom&amp;title=Projects%2FSoftware%2FTunTapIO%2Frawsock.c"/>
	<link rel="alternate" type="text/html" href="http://wiki.ucis.nl/index.php?title=Projects/Software/TunTapIO/rawsock.c&amp;action=history"/>
	<updated>2026-05-09T22:37:41Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>http://wiki.ucis.nl/index.php?title=Projects/Software/TunTapIO/rawsock.c&amp;diff=154&amp;oldid=prev</id>
		<title>Admin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://wiki.ucis.nl/index.php?title=Projects/Software/TunTapIO/rawsock.c&amp;diff=154&amp;oldid=prev"/>
		<updated>2022-11-09T14:49:54Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:49, 9 November 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://wiki.ucis.nl/index.php?title=Projects/Software/TunTapIO/rawsock.c&amp;diff=153&amp;oldid=prev</id>
		<title>Admin: Nieuwe pagina aangemaakt met '&lt;pre&gt; /********************************************************************** * rsio - raw socket to stdin/out proxy                                * * Written by: Ivo...'</title>
		<link rel="alternate" type="text/html" href="http://wiki.ucis.nl/index.php?title=Projects/Software/TunTapIO/rawsock.c&amp;diff=153&amp;oldid=prev"/>
		<updated>2009-04-22T23:32:03Z</updated>

		<summary type="html">&lt;p&gt;Nieuwe pagina aangemaakt met &amp;#039;&amp;lt;pre&amp;gt; /********************************************************************** * rsio - raw socket to stdin/out proxy                                * * Written by: Ivo...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/**********************************************************************&lt;br /&gt;
* rsio - raw socket to stdin/out proxy                                *&lt;br /&gt;
* Written by: Ivo Smits &amp;lt;Ivo@UFO-Net.nl&amp;gt;                              *&lt;br /&gt;
*                                                                     *&lt;br /&gt;
* Compile using: gcc rawsock.c -o rsio                                *&lt;br /&gt;
*                                                                     *&lt;br /&gt;
* Many thanks to:                                                     *&lt;br /&gt;
*  - http://www.blug.linux.no/rfc1149/                                *&lt;br /&gt;
*  - http://linux.about.com/od/commands/l/blcmdl2_select.htm          *&lt;br /&gt;
*  - http://bochs.sourceforge.net/ (the iodev/eth_linux.cc module)    *&lt;br /&gt;
*                                                                     *&lt;br /&gt;
**********************************************************************/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#ifndef HAVE_NETINET_IN_H&lt;br /&gt;
	#include &amp;lt;netinet/in.h&amp;gt;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;sys/ioctl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netpacket/packet.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netinet/in.h&amp;gt;&lt;br /&gt;
#include &amp;lt;net/ethernet.h&amp;gt;&lt;br /&gt;
#include &amp;lt;net/if.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/filter.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/if_ether.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// The main program, this is where all the magic happens&lt;br /&gt;
int main(int argc, char** argv) {&lt;br /&gt;
	int DumpStats = 1;&lt;br /&gt;
	int IncludePLen = 1;&lt;br /&gt;
&lt;br /&gt;
	//Parse command line arguments&lt;br /&gt;
	if (argc &amp;gt; 1) {&lt;br /&gt;
		if (strcmp(argv[1], &amp;quot;-h&amp;quot;) == 0) {&lt;br /&gt;
			fprintf(stderr, &amp;quot;rsio - raw socket to stdio proxy\n&amp;quot;);&lt;br /&gt;
			fprintf(stderr, &amp;quot;Usage: %s INTF [-raw|-ip] [CLEN] [-prom]\n&amp;quot;, argv[0]);&lt;br /&gt;
			fprintf(stderr, &amp;quot;  INTF:  the name of the network interface to connect to\n&amp;quot;);&lt;br /&gt;
			fprintf(stderr, &amp;quot;  -raw:  raw ethernet communication (default)\n&amp;quot;);&lt;br /&gt;
			fprintf(stderr, &amp;quot;  -tun:  IP level communication\n&amp;quot;);&lt;br /&gt;
			fprintf(stderr, &amp;quot;  CLEN:  capture size (should be the same as the mtu, default: %d)\n&amp;quot;, ETH_FRAME_LEN);&lt;br /&gt;
			fprintf(stderr, &amp;quot;  -prom: enable promiscious mode (warning, won't be disabled)\n&amp;quot;);&lt;br /&gt;
			fprintf(stderr, &amp;quot;Note that the arguments should be in exactly THIS order.\n&amp;quot;);&lt;br /&gt;
			fprintf(stderr, &amp;quot;Report bugs to &amp;lt;Ivo@UFO-Net.nl&amp;gt;\n&amp;quot;);&lt;br /&gt;
			exit(0);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		//Application won't run without arguments&lt;br /&gt;
		fprintf(stderr, &amp;quot;Try: %s -h\n&amp;quot;, argv[0]);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	int sock; //The socket&lt;br /&gt;
&lt;br /&gt;
	int CaptureLen = ETH_FRAME_LEN;&lt;br /&gt;
	{&lt;br /&gt;
		int linktype = 0; //Default to ethernet packets (0=ethernet, 1=IP)&lt;br /&gt;
		if (argc &amp;gt; 2 &amp;amp;&amp;amp; strcmp(argv[2], &amp;quot;-ip&amp;quot;) == 0) linktype = 1;&lt;br /&gt;
&lt;br /&gt;
		if (linktype == 1) CaptureLen = ETH_DATA_LEN;&lt;br /&gt;
&lt;br /&gt;
		//Different capture length?&lt;br /&gt;
		if (argc &amp;gt; 3) CaptureLen = atoi(argv[3]);&lt;br /&gt;
		if (CaptureLen &amp;lt; 1) {&lt;br /&gt;
			fprintf(stderr, &amp;quot;Capture length %d invalid!\n&amp;quot;, CaptureLen);&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
		fprintf(stderr, &amp;quot;Max packet length: %d\n&amp;quot;, CaptureLen);&lt;br /&gt;
&lt;br /&gt;
		//Open the socket!&lt;br /&gt;
		int socktype, sockproto;&lt;br /&gt;
#warning &amp;quot;ToDo: add some more protocols from /usr/include/linux/if_ether.h!&amp;quot;&lt;br /&gt;
		if (linktype == 1) {&lt;br /&gt;
			fprintf(stderr, &amp;quot;Warning: IP mode does not catch sent packets!\n&amp;quot;);&lt;br /&gt;
#warning &amp;quot;IP mode does not catch sent packets!&amp;quot;&lt;br /&gt;
			socktype = SOCK_DGRAM;&lt;br /&gt;
			sockproto = htons(ETH_P_IP);&lt;br /&gt;
		} else {&lt;br /&gt;
			socktype = SOCK_RAW;&lt;br /&gt;
			sockproto = htons(ETH_P_ALL);&lt;br /&gt;
		}&lt;br /&gt;
		if ((sock = socket(PF_PACKET, socktype, sockproto)) == -1) {&lt;br /&gt;
			fprintf(stderr, &amp;quot;Failed to create socket: %s\n&amp;quot;, strerror(errno));&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//Bind to given interface by name&lt;br /&gt;
	{&lt;br /&gt;
		const char *dev; //Device to connect to&lt;br /&gt;
		strcpy(dev, argv[1]);&lt;br /&gt;
&lt;br /&gt;
		//Translate interface name to index&lt;br /&gt;
		struct ifreq ifr;&lt;br /&gt;
		memset(&amp;amp;ifr, 0, sizeof(ifr));&lt;br /&gt;
		strcpy(ifr.ifr_name, dev);&lt;br /&gt;
		if (ioctl(sock, SIOCGIFINDEX, &amp;amp;ifr) == -1) {&lt;br /&gt;
			fprintf(stderr, &amp;quot;Failed to get index for interface: '%s'\n&amp;quot;, dev);&lt;br /&gt;
			close(sock);&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Bind to given interface&lt;br /&gt;
		struct sockaddr_ll sll;&lt;br /&gt;
		memset(&amp;amp;sll, 0, sizeof(sll));&lt;br /&gt;
		sll.sll_family = AF_PACKET;&lt;br /&gt;
		sll.sll_ifindex = ifr.ifr_ifindex;&lt;br /&gt;
		if (bind(sock, (struct sockaddr *)&amp;amp;sll, (socklen_t)sizeof(sll)) == -1) {&lt;br /&gt;
			fprintf(stderr, &amp;quot;Could not bind to interface '%s': %s\n&amp;quot;, dev, strerror(errno));&lt;br /&gt;
			close(sock);&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
#warning &amp;quot;Disable promiscious mode on exit! (signal handler?)&amp;quot;&lt;br /&gt;
		if (argc &amp;gt; 5 &amp;amp;&amp;amp; strcmp(argv[5], &amp;quot;-prom&amp;quot;) == 0) {&lt;br /&gt;
			register int Ret;&lt;br /&gt;
			if (Ret = ioctl(sock, SIOCGIFFLAGS, &amp;amp;ifr) == -1) {&lt;br /&gt;
				fprintf(stderr, &amp;quot;Failed to get interface flags: '%s'\n&amp;quot;, Ret);&lt;br /&gt;
				close(sock);&lt;br /&gt;
				exit(1);&lt;br /&gt;
			}&lt;br /&gt;
			ifr.ifr_flags |= IFF_PROMISC;&lt;br /&gt;
			if (ioctl(sock, SIOCSIFFLAGS, &amp;amp;ifr) == -1) {&lt;br /&gt;
				fprintf(stderr, &amp;quot;Failed to set interface flags for promisc mode: '%s'\n&amp;quot;, Ret);&lt;br /&gt;
				close(sock);&lt;br /&gt;
				exit(1);&lt;br /&gt;
			}&lt;br /&gt;
			fprintf(stderr, &amp;quot;Promiscious mode enabled!\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	fprintf(stderr, &amp;quot;Proxy ready for action!\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	fd_set fdsRead, fdsWrite; //FileDescriptor sets for select()&lt;br /&gt;
	unsigned char RBuf[CaptureLen], WBuf[CaptureLen]; //Data buffers&lt;br /&gt;
	int RBufLen = 0, WBufLen = 0; //Packet length&lt;br /&gt;
	int PLen;&lt;br /&gt;
	&lt;br /&gt;
	//Start an infinite loop&lt;br /&gt;
	while (1) {&lt;br /&gt;
		if (WBufLen &amp;lt; 0 || RBufLen &amp;lt; 0) {&lt;br /&gt;
			fprintf(stderr, &amp;quot;WBufLen &amp;lt; 0 or RBufLen &amp;lt; 0 :|\n&amp;quot;);&lt;br /&gt;
			exit(2);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		FD_ZERO(&amp;amp;fdsRead);			//Clear FD set&lt;br /&gt;
		if (RBufLen == 0) FD_SET(sock, &amp;amp;fdsRead);	//Add socket&lt;br /&gt;
		if (WBufLen == 0) FD_SET(0, &amp;amp;fdsRead);		//Add stdin&lt;br /&gt;
&lt;br /&gt;
		FD_ZERO(&amp;amp;fdsWrite);			//Clear FD set&lt;br /&gt;
		if (WBufLen &amp;gt; 0) FD_SET(sock, &amp;amp;fdsWrite);	//Add socket&lt;br /&gt;
		if (RBufLen &amp;gt; 0) FD_SET(1, &amp;amp;fdsWrite);		//Add stdout&lt;br /&gt;
&lt;br /&gt;
		if (select(sock + 1, &amp;amp;fdsRead, &amp;amp;fdsWrite, NULL, NULL) &amp;lt; 0) {&lt;br /&gt;
			if (errno == EAGAIN || errno == EINTR) {&lt;br /&gt;
				continue; //Retry select&lt;br /&gt;
			} else {&lt;br /&gt;
				fprintf(stderr, &amp;quot;An unhandled error occured in select: %d&amp;quot;, errno);&lt;br /&gt;
				exit(5);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//Read from socket&lt;br /&gt;
		if (FD_ISSET(sock, &amp;amp;fdsRead) &amp;amp;&amp;amp; RBufLen == 0) {&lt;br /&gt;
			RBufLen = read(sock, RBuf, CaptureLen);&lt;br /&gt;
			if (RBufLen == 0) {&lt;br /&gt;
				fprintf(stderr, &amp;quot;End of file on socket\n&amp;quot;);&lt;br /&gt;
				exit(0);&lt;br /&gt;
			} else if (RBufLen &amp;lt; 0) {&lt;br /&gt;
				fprintf(stderr, &amp;quot;Some error occured while reading from socket: %d\n&amp;quot;, RBufLen);&lt;br /&gt;
				exit(4);&lt;br /&gt;
			}&lt;br /&gt;
			if (DumpStats != 0) fprintf(stderr, &amp;quot;R: %d\n&amp;quot;, RBufLen);&lt;br /&gt;
		}&lt;br /&gt;
		//Write to socket&lt;br /&gt;
		if (FD_ISSET(sock, &amp;amp;fdsWrite) &amp;amp;&amp;amp; WBufLen &amp;gt; 0) {&lt;br /&gt;
			write(sock, WBuf, WBufLen);&lt;br /&gt;
			if (DumpStats != 0) fprintf(stderr, &amp;quot;W: %d\n&amp;quot;, WBufLen);&lt;br /&gt;
			WBufLen = 0;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//Read from stdin (FD 0)&lt;br /&gt;
		if (FD_ISSET(0, &amp;amp;fdsRead) &amp;amp;&amp;amp; WBufLen == 0) {&lt;br /&gt;
			if (IncludePLen == 1) {&lt;br /&gt;
				WBufLen = read(0, &amp;amp;PLen, 4);&lt;br /&gt;
			}&lt;br /&gt;
			if (IncludePLen == 0 || PLen &amp;gt; CaptureLen) {&lt;br /&gt;
				PLen = CaptureLen;&lt;br /&gt;
			}&lt;br /&gt;
			if (IncludePLen == 0 || WBufLen &amp;gt; 0) {&lt;br /&gt;
				WBufLen = read(0, WBuf, PLen);&lt;br /&gt;
			}&lt;br /&gt;
			if (WBufLen == 0) {&lt;br /&gt;
				fprintf(stderr, &amp;quot;End of file on stdin\n&amp;quot;);&lt;br /&gt;
				exit(0);&lt;br /&gt;
			} else if (WBufLen &amp;lt; 0) {&lt;br /&gt;
				fprintf(stderr, &amp;quot;Some error occured while reading stdin: %d\n&amp;quot;, WBufLen);&lt;br /&gt;
				exit(4);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		//Write to stdout (FD 1)&lt;br /&gt;
		if (FD_ISSET(1, &amp;amp;fdsWrite) &amp;amp;&amp;amp; RBufLen &amp;gt; 0) {&lt;br /&gt;
			if (IncludePLen == 1) write(1, &amp;amp;RBufLen, 4);&lt;br /&gt;
			write(1, RBuf, RBufLen);&lt;br /&gt;
			RBufLen = 0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>