[Pkg-privacy-commits] [onioncat] 41/340: slight code cleanup
Ximin Luo
infinity0 at moszumanska.debian.org
Sat Aug 22 13:04:23 UTC 2015
This is an automated email from the git hooks/post-receive script.
infinity0 pushed a commit to branch debian
in repository onioncat.
commit 14ce37a5ce35b188329e64518856ae764a50dc61
Author: eagle <eagle at 58e1ccc2-750e-0410-8d0d-f93ca75ab447>
Date: Fri Apr 18 13:06:12 2008 +0000
slight code cleanup
git-svn-id: http://www.cypherpunk.at/svn/onioncat/trunk@193 58e1ccc2-750e-0410-8d0d-f93ca75ab447
---
config.h.in | 3 +
configure | 3 +-
configure.ac | 4 +-
ocat.c | 37 ++++++++-----
ocat.h | 34 +++++++-----
ocatlog.c | 1 -
ocatroute.c | 175 ++++++++++++++++++++++-------------------------------------
ocattun.c | 8 ---
8 files changed, 114 insertions(+), 151 deletions(-)
diff --git a/config.h.in b/config.h.in
index 4e35be6..b2463ee 100644
--- a/config.h.in
+++ b/config.h.in
@@ -12,6 +12,9 @@
/* Define to 1 if you have the <linux/if_tun.h> header file. */
#undef HAVE_LINUX_IF_TUN_H
+/* Define to 1 if you have the <linux/sockios.h> header file. */
+#undef HAVE_LINUX_SOCKIOS_H
+
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
diff --git a/configure b/configure
index 3829705..1f2be90 100755
--- a/configure
+++ b/configure
@@ -4096,7 +4096,8 @@ done
-for ac_header in netinet/in.h netinet/ip6.h netinet/in6.h net/if.h linux/if_tun.h net/if_tun.h
+
+for ac_header in netinet/in.h netinet/ip6.h netinet/in6.h net/if.h linux/if_tun.h net/if_tun.h linux/sockios.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
diff --git a/configure.ac b/configure.ac
index dca92f3..9a20930 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.61)
-AC_INIT([onioncat], [0.1.2], [eagle at cypherpunk.at])
+AC_INIT([onioncat], [0.1.4], [eagle at cypherpunk.at])
AM_INIT_AUTOMAKE([-Wall -Werror])
AC_CONFIG_SRCDIR([ocatroute.c])
AC_CONFIG_HEADER([config.h])
@@ -20,7 +20,7 @@ AC_CHECK_LIB([rt], [clock_gettime])
# Checks for header files.
#AC_HEADER_STDC
#AC_CHECK_HEADERS([arpa/inet.h fcntl.h netinet/in.h stdlib.h string.h sys/ioctl.h sys/socket.h unistd.h])
-AC_CHECK_HEADERS([netinet/in.h netinet/ip6.h netinet/in6.h net/if.h linux/if_tun.h net/if_tun.h])
+AC_CHECK_HEADERS([netinet/in.h netinet/ip6.h netinet/in6.h net/if.h linux/if_tun.h net/if_tun.h linux/sockios.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
diff --git a/ocat.c b/ocat.c
index fb8f27d..3054dda 100644
--- a/ocat.c
+++ b/ocat.c
@@ -7,6 +7,8 @@
#include <stdarg.h>
#include <arpa/inet.h>
#include <sys/socket.h>
+#include <sys/types.h>
+#include <pwd.h>
#include <errno.h>
#include <time.h>
#include <pthread.h>
@@ -29,7 +31,6 @@ void usage(const char *s)
"usage: %s [OPTIONS] <onion_hostname>\n"
" -h display usage message\n"
" -d <n> set debug level to n, default = %d\n"
- " -g <group> change GID to group, default = \"%s\"\n"
" -i <onion_hostname> convert onion hostname to IPv6 and exit\n"
" -l <port> set ocat listen port, default = %d\n"
" -o <ipv6_addr> convert IPv6 address to onion url and exit\n"
@@ -42,7 +43,7 @@ void usage(const char *s)
#endif
" -u <user> change UID to user, default = \"%s\"\n"
" -v validate packets from sockets, default = %d\n"
- , __DATE__, __TIME__, s, debug_level_, OCAT_GNAME, ocat_listen_port_, ocat_dest_port_, tor_socks_port_,
+ , __DATE__, __TIME__, s, debug_level_, ocat_listen_port_, ocat_dest_port_, tor_socks_port_,
#ifndef WITHOUT_TUN
TUN_DEV,
#endif
@@ -55,14 +56,14 @@ int main(int argc, char *argv[])
char tunname[IFNAMSIZ] = "", onion[ONION_NAME_SIZE], *s, ip6addr[INET6_ADDRSTRLEN];
struct in6_addr addr;
int c, runasroot = 0;
- uid_t uid = OCAT_UID;
- gid_t gid = OCAT_GID;
+ char *usrname = OCAT_UNAME;
+ struct passwd *pwd;
int urlconv = 0, test_only = 0;
if (argc < 2)
usage(argv[0]), exit(1);
- while ((c = getopt(argc, argv, "d:hriopl:t:T:s:")) != -1)
+ while ((c = getopt(argc, argv, "d:hriopl:t:T:s:u:")) != -1)
switch (c)
{
case 'd':
@@ -103,6 +104,10 @@ int main(int argc, char *argv[])
break;
#endif
+ case 'u':
+ usrname = optarg;
+ break;
+
case 'v':
vrec_ = 1;
break;
@@ -135,9 +140,9 @@ int main(int argc, char *argv[])
if ((s = strchr(onion, '.')))
*s = '\0';
if (strlen(onion) != 16)
- log_msg(L_ERROR, "[main] parameter seems not to be valid onion hostname"), exit(1);
+ log_msg(L_ERROR, "parameter seems not to be valid onion hostname"), exit(1);
if (oniontipv6(onion, &addr) == -1)
- log_msg(L_ERROR, "[main] parameter seems not to be valid onion hostname"), exit(1);
+ log_msg(L_ERROR, "parameter seems not to be valid onion hostname"), exit(1);
inet_ntop(AF_INET6, &addr, ip6addr, INET6_ADDRSTRLEN);
@@ -171,13 +176,17 @@ int main(int argc, char *argv[])
if (!runasroot && !getuid())
{
- log_msg(L_NOTICE, "[main] running as root, changing uid/gid to %d/%d", uid, gid);
- if (setgid(gid))
- log_msg(L_ERROR, "[main] could not change gid: \"%s\"", strerror(errno));
- if (setuid(uid))
- log_msg(L_ERROR, "[main] could not change uid: \"%d\"", strerror(errno));
+ errno = 0;
+ if (!(pwd = getpwnam(usrname)))
+ log_msg(L_FATAL, "can't get information for user \"%s\": \"%s\"", usrname, errno ? strerror(errno) : "user not found"), exit(1);
+
+ log_msg(L_NOTICE, "running as root, changing uid/gid to %s (uid %d/gid %d)", usrname, pwd->pw_uid, pwd->pw_gid);
+ if (setgid(pwd->pw_gid))
+ log_msg(L_ERROR, "could not change gid: \"%s\"", strerror(errno)), exit(1);
+ if (setuid(pwd->pw_uid))
+ log_msg(L_ERROR, "could not change uid: \"%d\"", strerror(errno)), exit(1);
}
- log_msg(L_NOTICE, "[main] uid/gid = %d/%d", getuid(), getgid());
+ log_msg(L_DEBUG, "uid/gid = %d/%d", getuid(), getgid());
// create socks connector thread
run_ocat_thread("connector", socks_connector);
@@ -187,7 +196,7 @@ int main(int argc, char *argv[])
run_ocat_thread("controller", ocat_controller);
// start forwarding packets from tunnel
- log_msg(L_NOTICE, "[main] starting packet forwarder");
+ log_msg(L_NOTICE, "starting packet forwarder");
packet_forwarder();
return 0;
diff --git a/ocat.h b/ocat.h
index f528edf..bf4a8da 100644
--- a/ocat.h
+++ b/ocat.h
@@ -14,23 +14,24 @@
#define IP6HLEN sizeof(struct ip6_hdr)
-// TOR prefix : FD87:D87E:EB43::/40
+//! TOR prefix: FD87:D87E:EB43::/48
#define TOR_PREFIX {0xfd,0x87,0xd8,0x7e,0xeb,0x43}
#define TOR_PREFIX_LEN 48
#define MAXPEERS 1024
+//! Local listening port for incoming connections from TOR.
#define OCAT_LISTEN_PORT 8000
+//! Local control port for querying status information.
#define OCAT_CTRL_PORT 8001
+//! Virtual destination port for hidden services
#define OCAT_DEST_PORT 80
+//! SOCKS port of TOR proxy
#define TOR_SOCKS_PORT 9050
#define OCAT_UNAME "tor"
#define OCAT_UID 112
-#define OCAT_GNAME "tor"
-#define OCAT_GID 116
+//#define OCAT_GNAME "tor"
+//#define OCAT_GID 116
-
-//#define FRAME_SIZE 1504
-//#define FRAME_SIZE 16440
-// should be able to keep one maximum size ipv6-packet: 2^16 + 40 + 4
+//! Maximum frame (packet) size, should be able to keep one maximum size ipv6-packet: 2^16 + 40 + 4
#define FRAME_SIZE 65580
#define ONION_NAME_SIZE 23
@@ -38,6 +39,7 @@
//! maximum number a packet stays in queue
#define MAX_QUEUE_DELAY 10
+//! Maximum idle time for a peer, after that time the peer is closed.
#define MAX_IDLE_TIME 120
#define CLEANER_WAKEUP 10
@@ -116,9 +118,10 @@ typedef struct SocksQueue
struct SocksQueue *next;
struct in6_addr addr;
int state;
-// int retry;
} SocksQueue_t;
+
+/*
// next header value for ocat internal use (RFC3692)
#define OCAT_NEXT_HEADER 254
@@ -126,8 +129,8 @@ typedef struct OcatHdr
{
uint16_t oh_plen;
uint8_t oh_nxt;
-/* struct ip6_hdrctl oh_ip6hdrctl;
- char oh_srcid[10];*/
+// struct ip6_hdrctl oh_ip6hdrctl;
+// char oh_srcid[10];
} OcatHdr_t;
@@ -140,8 +143,9 @@ typedef struct OcatCtrlHdr
uint8_t oct_type;
char oct_srcid[10];
} OcatCtrlHdr_t;
+*/
+
-//#ifdef __CYGWIN__
#ifndef HAVE_STRUCT_IP6_HDR
struct ip6_hdr
{
@@ -150,15 +154,15 @@ struct ip6_hdr
struct ip6_hdrctl
{
uint32_t ip6_un1_flow; /* 4 bits version, 8 bits TC,
- 20 bits flow-ID */
+ 20 bits flow-ID */
uint16_t ip6_un1_plen; /* payload length */
uint8_t ip6_un1_nxt; /* next header */
uint8_t ip6_un1_hlim; /* hop limit */
} ip6_un1;
- uint8_t ip6_un2_vfc; /* 4 bits version, top 4 bits tclass */
+ uint8_t ip6_un2_vfc; /* 4 bits version, top 4 bits tclass */
} ip6_ctlun;
- struct in6_addr ip6_src; /* source address */
- struct in6_addr ip6_dst; /* destination address */
+ struct in6_addr ip6_src; /* source address */
+ struct in6_addr ip6_dst; /* destination address */
};
#define ip6_vfc ip6_ctlun.ip6_un2_vfc
diff --git a/ocatlog.c b/ocatlog.c
index 3a1ab02..8d289fc 100644
--- a/ocatlog.c
+++ b/ocatlog.c
@@ -29,7 +29,6 @@ void log_msg(int lf, const char *fmt, ...)
if (debug_level_ < lf || lf < 0)
return;
- //th = get_thread();
t = time(NULL);
tm = localtime(&t);
if (tm)
diff --git a/ocatroute.c b/ocatroute.c
index fc5cc8f..bf0ded7 100644
--- a/ocatroute.c
+++ b/ocatroute.c
@@ -14,16 +14,15 @@
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
-//#include <netinet/in.h>
-//#include <netinet/ip6.h>
-//#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <errno.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
+#ifdef HAVE_LINUX_SOCKIOS_H
#include <linux/sockios.h>
+#endif
#include "ocat.h"
@@ -66,7 +65,6 @@ int snd_buf_size_ = 0;
#endif
-//k
OcatPeer_t *search_peer(const struct in6_addr *addr)
{
OcatPeer_t *peer;
@@ -78,7 +76,6 @@ OcatPeer_t *search_peer(const struct in6_addr *addr)
}
-//k
OcatPeer_t *get_empty_peer(void)
{
int rc;
@@ -105,7 +102,6 @@ OcatPeer_t *get_empty_peer(void)
}
-//k
void delete_peer(OcatPeer_t *peer)
{
int rc;
@@ -125,7 +121,6 @@ void delete_peer(OcatPeer_t *peer)
}
-//k
int forward_packet(const struct in6_addr *addr, const char *buf, int buflen)
{
OcatPeer_t *peer;
@@ -178,7 +173,6 @@ int forward_packet(const struct in6_addr *addr, const char *buf, int buflen)
}
-//k
void queue_packet(const struct in6_addr *addr, const char *buf, int buflen)
{
PacketQueue_t *queue;
@@ -206,11 +200,9 @@ void queue_packet(const struct in6_addr *addr, const char *buf, int buflen)
}
-//k
void *packet_dequeuer(void *p)
{
PacketQueue_t **queue, *fqueue;
-// OcatPeer_t *peer;
struct timespec ts;
int rc, timed = 0;
time_t delay;
@@ -274,7 +266,6 @@ void hex_code_header(const char *frame, int len, char *buf)
// do some packet validation
-//k
int validate_frame(const struct ip6_hdr *ihd, int len)
{
char buf[INET6_ADDRSTRLEN];
@@ -308,7 +299,6 @@ int validate_frame(const struct ip6_hdr *ihd, int len)
}
-//k
void cleanup_socket(int fd, OcatPeer_t *peer)
{
log_msg(L_NOTICE, "fd %d reached EOF, closing.", fd);
@@ -319,22 +309,17 @@ void cleanup_socket(int fd, OcatPeer_t *peer)
}
-//k
void *socket_receiver(void *p)
{
int maxfd, len, plen;
char buf[FRAME_SIZE];
char addr[INET6_ADDRSTRLEN];
fd_set rset;
- //struct ip6_hdr *ihd;
- //ihd = (struct ip6_hdr*) &buf[4];
OcatPeer_t *peer;
if (pipe(lpfd_) < 0)
log_msg(L_FATAL, "could not create pipe for socket_receiver: \"%s\"", strerror(errno)), exit(1);
- //*((uint32_t*) buf) = fhd_key_;
-
for (;;)
{
FD_ZERO(&rset);
@@ -377,9 +362,6 @@ void *socket_receiver(void *p)
maxfd--;
}
- //FIXME: should only run until num select returned
- //for (peer = peer_; peer; peer = peer->next)
-
peer = NULL;
while (maxfd)
{
@@ -397,9 +379,6 @@ void *socket_receiver(void *p)
pthread_mutex_lock(&peer->mutex);
pthread_mutex_unlock(&peer_mutex_);
- //state = peer->state;
- //fd = peer->tcpfd;
-
if (peer->state != PEER_ACTIVE)
{
pthread_mutex_unlock(&peer->mutex);
@@ -413,103 +392,87 @@ void *socket_receiver(void *p)
}
maxfd--;
+ log_msg(L_DEBUG, "reading from %d", peer->tcpfd);
- //if (FD_ISSET(fd, &rset))
- //{
- log_msg(L_DEBUG, "reading from %d", peer->tcpfd);
+ // read/append data to peer's fragment buffer
+ if ((len = read(peer->tcpfd, peer->fragbuf + peer->fraglen, FRAME_SIZE - 4 - peer->fraglen)) == -1)
+ {
+ // this might happen on linux, see SELECT(2)
+ log_msg(L_DEBUG, "spurious wakup of %d: \"%s\"", peer->tcpfd, strerror(errno));
+ pthread_mutex_unlock(&peer->mutex);
+ continue;
+ }
+ log_msg(L_DEBUG, "received %d bytes on %d", len, peer->tcpfd);
+ // if len == 0 EOF reached => close session
+ if (!len)
+ {
+ log_msg(L_NOTICE, "fd %d reached EOF, closing.", peer->tcpfd);
+ close(peer->tcpfd);
+ pthread_mutex_unlock(&peer->mutex);
+ pthread_mutex_lock(&peer_mutex_);
+ delete_peer(peer);
+ pthread_mutex_unlock(&peer_mutex_);
+ continue;
+ }
- // read/append data to peer's fragment buffer
- if ((len = read(peer->tcpfd, peer->fragbuf + peer->fraglen, FRAME_SIZE - 4 - peer->fraglen)) == -1)
+ peer->fraglen += len;
+ // update timestamp
+ peer->time = time(NULL);
+ peer->in += len;
+
+ while (peer->fraglen >= IP6HLEN)
+ {
+ // check frame
+ plen = validate_frame((struct ip6_hdr*) peer->fragbuf, peer->fraglen);
+
+ if (!plen)
{
- // this might happen on linux, see SELECT(2)
- log_msg(L_DEBUG, "spurious wakup of %d: \"%s\"", peer->tcpfd, strerror(errno));
- pthread_mutex_unlock(&peer->mutex);
- continue;
+ log_msg(L_DEBUG, "FRAGBUF RESET!");
+ peer->fraglen = 0;
+ break;
}
- log_msg(L_DEBUG, "received %d bytes on %d", len, peer->tcpfd);
- // if len == 0 EOF reached => close session
- if (!len)
+
+ if (vrec_ && !plen)
{
- log_msg(L_NOTICE, "fd %d reached EOF, closing.", peer->tcpfd);
- close(peer->tcpfd);
- pthread_mutex_unlock(&peer->mutex);
- pthread_mutex_lock(&peer_mutex_);
- delete_peer(peer);
- pthread_mutex_unlock(&peer_mutex_);
- continue;
+ log_msg(L_ERROR, "dropping frame");
+ break;
}
- //pthread_mutex_lock(&peer_mutex_);
- peer->fraglen += len;
- // update timestamp
- peer->time = time(NULL);
- peer->in += len;
- //pthread_mutex_unlock(&peer_mutex_);
-
- while (peer->fraglen >= IP6HLEN)
+ len = plen + IP6HLEN;
+ if (peer->fraglen < len)
{
- // check frame
- plen = validate_frame((struct ip6_hdr*) peer->fragbuf, peer->fraglen);
-
- // <FIXME> sometimes defragmentation looses sync due to currently unknown bug!
- if (!plen)
- {
- log_msg(L_DEBUG, "FRAGBUF RESET!");
- //pthread_mutex_lock(&peer_mutex_);
- peer->fraglen = 0;
- //pthread_mutex_unlock(&peer_mutex_);
- break;
- }
- // </FIXME>
-
- if (vrec_ && !plen)
- {
- log_msg(L_ERROR, "dropping frame");
- break;
- }
-
- len = plen + IP6HLEN;
- if (peer->fraglen < len)
- {
- log_msg(L_DEBUG, "keeping %d bytes frag", peer->fraglen);
- break;
- }
+ log_msg(L_DEBUG, "keeping %d bytes frag", peer->fraglen);
+ break;
+ }
- //pthread_mutex_lock(&peer_mutex_);
- // set IP address if it is not set yet and frame is valid
- if (plen && !memcmp(&peer->addr, &in6addr_any, sizeof(struct in6_addr)))
- {
- memcpy(&peer->addr, &((struct ip6_hdr*)peer->fragbuf)->ip6_src, sizeof(struct in6_addr));
- log_msg(L_NOTICE, "incoming connection on %d from %s is now identified", peer->tcpfd,
- inet_ntop(AF_INET6, &peer->addr, addr, INET6_ADDRSTRLEN));
- }
- //pthread_mutex_unlock(&peer_mutex_);
+ // set IP address if it is not set yet and frame is valid
+ if (plen && !memcmp(&peer->addr, &in6addr_any, sizeof(struct in6_addr)))
+ {
+ memcpy(&peer->addr, &((struct ip6_hdr*)peer->fragbuf)->ip6_src, sizeof(struct in6_addr));
+ log_msg(L_NOTICE, "incoming connection on %d from %s is now identified", peer->tcpfd,
+ inet_ntop(AF_INET6, &peer->addr, addr, INET6_ADDRSTRLEN));
+ }
- log_msg(L_DEBUG, "writing to tun %d framesize %d + 4", tunfd_[1], len);
- if (write(tunfd_[1], &peer->fraghdr, len + 4) != (len + 4))
- log_msg(L_ERROR, "could not write %d bytes to tunnel %d", len + 4, tunfd_[1]);
+ log_msg(L_DEBUG, "writing to tun %d framesize %d + 4", tunfd_[1], len);
+ if (write(tunfd_[1], &peer->fraghdr, len + 4) != (len + 4))
+ log_msg(L_ERROR, "could not write %d bytes to tunnel %d", len + 4, tunfd_[1]);
+ peer->fraglen -= len;
- //pthread_mutex_lock(&peer_mutex_);
- peer->fraglen -= len;
- //pthread_mutex_unlock(&peer_mutex_);
-
- if (peer->fraglen)
- {
- log_msg(L_DEBUG, "moving fragment. fragsize %d", peer->fraglen);
- memmove(peer->fragbuf, peer->fragbuf + len, FRAME_SIZE - 4 - len);
- }
- else
- log_msg(L_DEBUG, "fragbuf empty");
- } // while (peer->fraglen >= IP6HLEN)
- //}
+ if (peer->fraglen)
+ {
+ log_msg(L_DEBUG, "moving fragment. fragsize %d", peer->fraglen);
+ memmove(peer->fragbuf, peer->fragbuf + len, FRAME_SIZE - 4 - len);
+ }
+ else
+ log_msg(L_DEBUG, "fragbuf empty");
+ } // while (peer->fraglen >= IP6HLEN)
pthread_mutex_unlock(&peer->mutex);
} // while (maxfd)
} // for (;;)
}
-//k
void set_nonblock(int fd)
{
long flags;
@@ -537,7 +500,6 @@ void set_nonblock(int fd)
}
-//k
int insert_peer(int fd, const struct in6_addr *addr, time_t dly)
{
OcatPeer_t *peer;
@@ -578,7 +540,6 @@ int insert_peer(int fd, const struct in6_addr *addr, time_t dly)
}
-//k
void *socket_acceptor(void *p)
{
int fd;
@@ -617,14 +578,12 @@ void *socket_acceptor(void *p)
}
-//k
int socks_connect(const struct in6_addr *addr)
{
struct sockaddr_in in;
int fd, t;
char buf[FRAME_SIZE], onion[ONION_NAME_SIZE];
SocksHdr_t *shdr = (SocksHdr_t*) buf;
-// OcatPeer_t *ohd;
log_msg(L_DEBUG, "[socks_connect] called");
@@ -688,7 +647,6 @@ int socks_connect(const struct in6_addr *addr)
}
-//k
void socks_queue(const struct in6_addr *addr)
{
SocksQueue_t *squeue;
@@ -714,7 +672,6 @@ void socks_queue(const struct in6_addr *addr)
}
-//k
void *socks_connector(void *p)
{
OcatPeer_t *peer;
@@ -780,7 +737,6 @@ void *socks_connector(void *p)
}
-//k
void packet_forwarder(void)
{
char buf[FRAME_SIZE];
@@ -824,7 +780,6 @@ void packet_forwarder(void)
}
-//k
void *socket_cleaner(void *ptr)
{
OcatPeer_t *peer, **p;
diff --git a/ocattun.c b/ocattun.c
index 3d29049..cbc1ef1 100644
--- a/ocattun.c
+++ b/ocattun.c
@@ -20,14 +20,6 @@
#include <fcntl.h>
#include <errno.h>
#include <arpa/inet.h>
-/*
-#ifdef HAVE_NETINET_IN_H
-#include <netinet/in.h>
-#endif
-#ifdef HAVE_NETINET_IP6_H
-#include <netinet/ip6.h>
-#endif
-*/
#ifdef HAVE_NET_IF_H
#include <net/if.h>
#endif
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-privacy/packages/onioncat.git
More information about the Pkg-privacy-commits
mailing list