Compare commits

...

172 Commits

Author SHA1 Message Date
Adrien Gallouët
d0376e3aa5 Update mud 2016-06-22 09:18:34 +00:00
Adrien Gallouët
a7518c0e5a Update mud 2016-06-21 16:51:24 +00:00
Adrien Gallouët
378316bd68 Add mtu option 2016-06-13 15:43:45 +00:00
angt
286d6abf2d Update mud 2016-05-10 10:46:15 +00:00
angt
1f1464e90d Update mud 2016-05-09 14:23:17 +00:00
angt
55d9dd9277 Update mud 2016-05-02 09:18:44 +00:00
angt
2f290dbf85 Update mud and merge from master 2016-04-26 06:54:30 +00:00
angt
39e3f53139 Add v{4,6}only option 2016-04-25 16:29:20 +00:00
angt
babe14d544 Quit on tun error 2016-04-25 10:24:42 +00:00
angt
278fc69789 Update mud 2016-04-21 15:35:35 +00:00
angt
99262777fc Update mud 2016-04-17 10:16:13 +00:00
angt
b0f60caab2 Update mud 2016-04-14 20:12:45 +00:00
angt
efd5e0bb36 Remove down-timeout and use timeout for send-timeout 2016-04-08 14:38:07 +00:00
angt
ade4617d53 Update mud 2016-04-08 13:00:52 +00:00
angt
64a5fd8227 Update mud 2016-04-05 14:23:45 +00:00
angt
eba968797c Add {down,send,pong}-timeout and time-tolerance option 2016-04-05 14:17:07 +00:00
angt
d60f28a7fe Update mud 2016-04-05 06:42:03 +00:00
angt
32069eb104 Print tun device on STARTED and STOPPED too 2016-04-04 20:05:33 +00:00
angt
a6adcefc25 Update mud 2016-04-04 16:48:11 +00:00
angt
743b0ee0da Don't check AES-NI 2016-04-01 16:50:04 +00:00
angt
ba06a6fc10 Update mud 2016-04-01 16:37:02 +00:00
Adrien Gallouët
80d4c2814f Update README.md 2016-03-24 18:52:18 +01:00
angt
b0d5007bfb Restore STARTED and STOPPED states 2016-03-24 14:45:15 +00:00
angt
d2046eb00b Revert "Add branch name in version"
This reverts commit 03cd87df1c.
2016-03-09 11:42:51 +00:00
angt
d04acc9c0f Update mud 2016-03-09 10:59:52 +00:00
angt
03cd87df1c Add branch name in version 2016-03-09 10:20:01 +00:00
angt
8e8ad7178d Update mud 2016-03-04 11:32:42 +00:00
angt
0e26b4def7 Update mud 2016-03-04 11:20:15 +00:00
angt
f800985766 Update mud 2016-03-04 11:01:43 +00:00
angt
7b88c28a45 Update mud 2016-03-03 10:49:28 +00:00
angt
194dfe17d3 Update mud 2016-03-02 12:59:33 +00:00
angt
664160e0cc Add bind-port option 2016-03-01 15:11:16 +00:00
angt
1dd760e382 Code cleanup 2016-03-01 08:13:05 +00:00
angt
05219b81f7 Update README.md 2016-02-29 16:14:08 +00:00
angt
0bb7e4f1d0 Update mud 2016-02-29 15:35:57 +00:00
angt
a7fbf806fb Use a list to setup mud_bind() 2016-02-29 15:28:37 +00:00
angt
e750c46665 Update mud 2016-02-25 15:22:47 +00:00
angt
935111cfea Fix Makefile.am 2016-02-04 11:31:02 +01:00
angt
c4b2512df4 Add .gitmodules 2016-02-04 10:44:53 +01:00
angt
27970e24fb Import and use mud 2016-02-04 10:39:36 +01:00
angt
acc3ee3461 Encrypt only one packet at a time 2016-01-26 12:18:00 +01:00
angt
eefa7722c5 Use timeout in connect() too 2016-01-21 16:22:31 +01:00
angt
17547f555d Add SECRETKEY state 2016-01-18 18:07:35 +01:00
angt
ec9c59ce69 Code cleanup 2016-01-18 18:00:41 +01:00
angt
679927a684 Show device name in INITIALIZED state 2016-01-18 17:58:20 +01:00
angt
2999faf5d7 Move up state_init() 2016-01-18 17:26:42 +01:00
angt
219384b7e5 Remove the old school daemon option 2016-01-18 16:09:29 +01:00
angt
3649e46b03 Remove the absolute path restriction on statefile 2016-01-18 16:02:29 +01:00
angt
88f314bc75 Add state.[ch] 2016-01-18 15:59:18 +01:00
angt
e2b3dc1b46 Use only v[0-9].* tags to get VERSION 2016-01-17 10:56:55 +01:00
angt
1815ea519f Create a tcp_entry only on ACK 2016-01-17 10:18:39 +01:00
angt
33356d5d35 Don't work too much 2016-01-17 09:40:56 +01:00
angt
4a5d07ec45 Merge pull request #11 from jedisct1/notag
Cope with branches that don't have tags
2016-01-16 16:16:05 +01:00
Frank Denis
a50882e1ac Cope with branches that don't have tags
`version.sh` used to return only the hash of the last commit, causing
VERSION_MAJOR to possibly contain non-numeric junk.
2016-01-16 15:37:42 +01:00
angt
b2cb8ebcbe The minimum value for buffer-size option is GT_PKT_MAX 2016-01-15 17:02:11 +01:00
angt
6fd6cf8c4a Merge pull request #10 from jedisct1/socket
Include <sys/socket.h> for AF_INET/AF_INET6 definitions
2016-01-14 17:14:56 +01:00
Frank Denis
f0fc2751e5 Include <sys/socket.h> for AF_INET/AF_INET6 definitions
Required on OpenBSD
2016-01-14 17:11:27 +01:00
angt
81cab007d0 Resend packet on partial tun_write() 2016-01-14 10:25:37 +01:00
angt
606396839f Don't update sa->base with old acks 2016-01-14 09:27:15 +01:00
angt
a8e37bafb9 Use realloc(): easier, better, faster, stronger 2016-01-13 16:19:58 +01:00
angt
87a38012cd Don't forget to free() seq_elem 2016-01-13 16:16:05 +01:00
angt
f04816e9a5 Try to detect TCP retransmission 2016-01-12 18:07:58 +01:00
angt
7107d036b1 Code cleanup 2016-01-07 08:30:21 +01:00
angt
30502e05ec Print state info in stdout if no statefile 2016-01-06 18:41:39 +01:00
angt
905673ecec Add timeout option 2016-01-06 18:33:59 +01:00
angt
cfbb77c710 Code cleanup 2016-01-06 17:57:12 +01:00
angt
13dcdc5afb Reduce GT_BUFFER_SIZE 2016-01-06 16:03:42 +01:00
angt
56ec81bf92 Fix last commit 2016-01-06 12:15:28 +01:00
angt
f1024381e0 Remove old code from qos 2016-01-06 11:29:13 +01:00
angt
3f3b21f08d Update Makefile.am 2016-01-05 14:16:30 +01:00
angt
40dd5ce18a Code cleanup 2016-01-05 14:07:18 +01:00
angt
5efb379251 Remove byte_*() as we don't use freestanding anymore 2016-01-05 12:26:38 +01:00
angt
2eb6521f9c Add a simple tcp tracker in debug mode 2016-01-05 08:24:03 +01:00
angt
bfd81e9666 Code cleanup 2016-01-04 20:07:11 +01:00
angt
8fa2322314 Add VERSION in the tarball 2016-01-01 12:32:20 +01:00
angt
8982f27220 Update LICENSE 2016-01-01 11:47:17 +01:00
angt
a5f97fcc8c States need EOL 2016-01-01 11:00:29 +01:00
angt
35a9bf27df Add state INITIALIZED 2015-12-31 16:07:36 +01:00
angt
ba0af8cc20 Define VERSION_MAJOR and use it in handshake 2015-12-29 18:31:23 +01:00
angt
ec85be5c6a Code cleanup 2015-12-29 12:59:55 +01:00
angt
fe989851ab Print more debug info 2015-12-29 12:58:39 +01:00
angt
46842dd200 Write state after the close() 2015-12-28 07:18:00 +01:00
angt
e5eb30598d Code cleanup 2015-12-24 17:38:08 +01:00
angt
c81ad0a7c6 One more time 2015-12-24 17:35:01 +01:00
angt
97641d6dda Reserve exclam for very bad message 2015-12-24 17:32:32 +01:00
angt
e48dac775c The statefile option needs an absolute path and a fifo 2015-12-24 17:29:41 +01:00
angt
6282f36ac7 Add statefile option 2015-12-24 16:53:50 +01:00
angt
cf022af4a9 Simplify the db by merging size and mask 2015-12-24 13:13:43 +01:00
angt
597c586657 Don't free data in db_remove() 2015-12-23 22:26:53 +01:00
angt
fc7f9aa0c8 Add a very simple low cost database 2015-12-23 17:11:20 +01:00
angt
7492f977b6 Define a simple proto 2015-12-21 12:34:24 +01:00
angt
38b7333533 Refuse to start the client without keyfile 2015-12-18 16:07:14 +01:00
angt
1ab854f058 Code cleanup 2015-12-18 11:57:20 +01:00
angt
c59def90fb Try to use SO_ACCEPTFILTER to defer accept on non-linux platforms 2015-12-17 23:20:31 +01:00
angt
347a3ecce7 Try to open tunX instead of glorytun by default in Linux 2015-12-17 17:06:04 +01:00
angt
98d13ef510 Print the tun name, not the path 2015-12-17 17:01:31 +01:00
angt
35b95001c4 Warn only when tun_create() fail 2015-12-17 14:07:14 +01:00
angt
75c12b36d6 Code cleanup 2015-12-17 13:59:40 +01:00
angt
db01c8b33f Update README.md 2015-12-17 08:51:07 +01:00
angt
fb4f6f6cb9 Do the md5sum after deploy 2015-12-16 11:27:53 +01:00
angt
a86aea431d Let travis do the md5sum 2015-12-16 08:35:20 +01:00
angt
1a128a6d92 Print readable ip in debug mode 2015-12-15 17:32:03 +01:00
angt
ddae22a3d9 Use a new random secret key without keyfile 2015-12-15 09:07:44 +01:00
angt
893de45272 Accept lower-case in fromhex() 2015-12-15 08:28:10 +01:00
angt
78ba4c9a59 Do not call ip_get_version() again and again 2015-12-14 18:37:50 +01:00
angt
ffa549e444 Fix and cleanup gt_{from,to}hex 2015-12-13 11:26:58 +01:00
angt
6040f17e1c Code cleanup 2015-12-13 11:07:55 +01:00
angt
da30c9110a Do not ask too much to macosx 2015-12-12 13:30:27 +01:00
angt
05de7b8109 Show udp hdr too in debug mode 2015-12-12 13:18:56 +01:00
angt
7cc6d08d7a Use __FAVOR_BSD... 2015-12-12 13:07:51 +01:00
angt
d526a3cfa5 Fix retry when kx fails 2015-12-12 12:19:09 +01:00
angt
0e319b068d Listener should retry accept() by default 2015-12-12 11:05:58 +01:00
angt
c82026cfd7 Update README.md 2015-12-11 17:44:16 +01:00
angt
109f70c208 Secret key must be stored in upper-case hex now 2015-12-11 17:33:35 +01:00
angt
23cdc37ea8 Add gt_tohex() and gt_fromhex() 2015-12-11 16:33:45 +01:00
angt
7688209093 Show tcp hdr in debug 2015-12-11 11:32:22 +01:00
angt
52a3a4b853 Add debug option to show ip_proto 2015-12-10 15:28:45 +01:00
angt
4cf0e7bc68 Function dt_ms() is pure too 2015-12-10 13:19:24 +01:00
angt
f36fde5054 Add ip_get_proto() 2015-12-10 13:17:27 +01:00
angt
e08eb73f98 Remove TCP_INFO 2015-12-10 12:33:54 +01:00
angt
f3143eff83 Do not print error for EPIPE or ECONNRESET on write() 2015-12-09 20:38:49 +01:00
angt
ea1fa120eb Allow IPv6 2015-12-09 20:27:40 +01:00
angt
be29a12842 Deploy only on linux-gcc 2015-12-09 11:25:51 +01:00
angt
113f1ae58d Use file_glob in travis 2015-12-08 18:27:59 +01:00
angt
73fff34bfe Try to deploy with travis 2015-12-08 18:10:39 +01:00
angt
84ae6dae32 Use printf instead of echo -n 2015-12-08 15:16:22 +01:00
angt
5cf39c288c Add m4/pkg.m4 2015-12-08 01:20:59 +01:00
angt
7a0db79e31 Add LICENSE in the tarball 2015-12-08 01:07:47 +01:00
angt
40d0b20ece Add README.md autogen.sh and version.sh in the tarball 2015-12-08 01:02:02 +01:00
angt
09cd749107 Add version.sh 2015-12-08 00:38:52 +01:00
angt
9dda940928 Bye Bye fake mode 2015-12-05 11:39:46 +01:00
angt
b7b64f98fd Bye Bye trap 2015-12-05 11:39:46 +01:00
angt
ed2114a1ce Version 0.0.12 2015-12-04 11:18:04 +01:00
angt
8b6ae96a2e Little fix 2015-12-04 11:13:46 +01:00
angt
72d771e126 Key exchange may fail for several reasons 2015-12-04 08:11:56 +01:00
angt
4d7192667e Update configure.ac 2015-12-04 07:33:24 +01:00
angt
43f5457802 Oups 2015-12-03 21:13:24 +01:00
angt
2005068039 Wait for kx to send SIGUSR2 2015-12-03 21:11:58 +01:00
angt
9028aaea88 Update README.md 2015-12-03 20:53:43 +01:00
angt
e80eb158d8 Update README.md 2015-12-03 20:48:24 +01:00
angt
68abb63f74 Fix last commit 2015-12-03 20:10:29 +01:00
angt
c458a4d86f Dont try to poll for read when read buffer are full 2015-12-03 19:03:59 +01:00
angt
cbdba8cba3 Dont try to poll for write, use a timeout 2015-12-03 18:49:18 +01:00
angt
d787fa1dca Version 0.0.11 2015-12-03 18:10:55 +01:00
angt
b7582d0107 Set GT_TIMEOUT to 5s 2015-12-03 16:59:22 +01:00
angt
2d46958f9f Beautify usage 2015-12-02 20:51:23 +01:00
angt
9131742ff3 Add retry const option 2015-12-02 20:48:13 +01:00
angt
590bac0f89 Add trap option to use SIGUSR2 2015-12-02 17:05:51 +01:00
angt
a43f2c935d Send SIGUSR2 on successful connection 2015-12-02 16:50:34 +01:00
angt
200dd6273f Fix last commit 2015-12-02 16:08:35 +01:00
angt
2a97e94770 Version 0.0.10 2015-12-02 16:06:29 +01:00
angt
bd46acb672 Add retry (count, slope and limit) option 2015-12-02 16:05:15 +01:00
angt
723006a10d Add fake daemon mode 2015-12-02 12:04:36 +01:00
angt
da6a2a7d61 Code cleanup 2015-12-01 09:15:40 +01:00
angt
7db50de8df Version 0.0.9 2015-11-30 16:08:36 +01:00
angt
22a6b511f7 Little opt 2015-11-30 16:07:13 +01:00
angt
2f2e5e6f99 Use SIGUSR1 to show tcp_info 2015-11-29 18:10:15 +01:00
angt
3472771a6f Try to close nicely on tun error 2015-11-28 14:23:45 +01:00
angt
8989138051 Version 0.0.8 2015-11-27 14:53:18 +01:00
angt
c2f76213cc Add noquickack option 2015-11-27 14:52:52 +01:00
angt
6ed736327a Align blk.data to 16 bytes 2015-11-27 08:07:53 +01:00
angt
e20be0ad97 Keep it simple and use the right tools 2015-11-27 07:56:40 +01:00
angt
2e7355bb92 Write shutdown() should be called only one time 2015-11-27 07:44:45 +01:00
angt
8ec7238f49 Version 0.0.7 2015-11-25 15:50:38 +01:00
angt
ac10f5a4e1 Fix prio and add priority size option 2015-11-25 15:49:45 +01:00
angt
d658669a04 Beautify usage 2015-11-24 18:42:14 +01:00
angt
746d998d4e Add some useless free() 2015-11-24 13:34:29 +01:00
angt
d1c51d90d4 Version 0.0.6 2015-11-24 11:30:04 +01:00
angt
0b1303b029 Add dscp-prio option (first qos draft) 2015-11-24 11:05:16 +01:00
angt
a78089ba10 Version 0.0.5 2015-11-23 12:13:42 +01:00
angt
128aaae368 Add daemon option (only one fork) 2015-11-23 12:12:28 +01:00
angt
230c9fa26a Little fix and cleanup 2015-11-21 19:09:21 +01:00
26 changed files with 1202 additions and 1005 deletions

2
.gitignore vendored
View File

@@ -1,9 +1,9 @@
*.o
*.log
*.scan
*.m4
*.cache
*.status
aclocal.m4
Makefile
Makefile.in
configure

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "mud"]
path = mud
url = https://github.com/angt/mud.git

View File

@@ -14,7 +14,22 @@ before_script:
- export PKG_CONFIG_PATH=/tmp/lib/pkgconfig
- git clone https://github.com/jedisct1/libsodium.git --branch=stable
- cd libsodium && ./autogen.sh && ./configure --enable-minimal --disable-dependency-tracking --prefix=/tmp && make install && cd -
- ./autogen.sh
- ./autogen.sh
script:
- ./configure --disable-dependency-tracking && make distcheck
deploy:
provider: releases
api_key:
secure: Ira1jd3j+17QVFbJ7KlkytTNp0oMZLTqCWPQLxNHLEt32PVY/IPs/16BcvTbFpKrY+Ma7E3KCihfufTVG8T+jRlZ5hFO7HNpoQMgi7L7yZZAGScYO5pnMQvsr8O9hf7jzSi1DjFXgFHznbPJJ3lOSwegcqzSrbZflokiCR50GTLLWewHoPpfs+1gJ5XbtVyRhZlmXhMPC0NEH2sh33X2WdUiKUJUMOnlYC0atPBL+4n12qxnugF9YA9wPK5NHJSLiPHue7I2rHlSrOLX5NkN3vqnEvusiuIFQX1y0NuKtkpOscFD9n1CLHThGLuzMvPlwpdQfzRMVxwjYFGu6Ma5alf64ksFnMKl8Oo0yCXEA7WvHXz+qUai/a1gzYZLTGuasHtjrHN/mgKxM4QRSiHo8t5hj3CczUW+OFglytawZQyGjyUUiKdwx2kvlO96RVDIYEhUD4DeHzHR8rhvDLmlMlGAWqUPXq7d4D+bExqKmqWCCSkhrbubq5B1kChRmgw7/gly4SryqGy+R0xsC4oq9jUUxd7Sl801BIKcYDb5r5gFSw+hEhOzBb+uE2xJYFNO2KZ+eG69lkFeG3oNJMTy8afs8fRRUXq0poQJ39wFWerps3Md7h8Sxs61YLIAKHvLJJMfoMI+AORTcjnnpqujMhgWGWt8wLhJZdxaSycoQkU=
skip_cleanup: true
file_glob: true
file: glorytun-*.tar.gz
on:
tags: true
repo: angt/glorytun
condition: "${TRAVIS_OS_NAME}-${CC} == linux-gcc"
after_deploy:
- md5sum glorytun-*.tar.gz

View File

@@ -1,4 +1,4 @@
Copyright (c) 2015, angt
Copyright (c) 2015-2016, angt
All rights reserved.
Redistribution and use in source and binary forms, with or without

View File

@@ -1,13 +1,33 @@
ACLOCAL_AMFLAGS = -I m4 --install
bin_PROGRAMS = glorytun
glorytun_CFLAGS = $(libsodium_CFLAGS)
glorytun_LDADD = $(libsodium_LIBS)
glorytun_SOURCES = \
src/common.h \
src/common-static.h \
src/common.c \
src/ip-static.h \
src/buffer.h \
src/ip.h \
src/str.h \
src/main.c \
src/option.c \
src/option.h \
src/tun.c \
src/tun.h
src/tun.h \
src/db.c \
src/db.h \
src/state.c \
src/state.h
glorytun_CFLAGS += -I$(srcdir)/mud
glorytun_SOURCES += \
mud/mud.h \
mud/mud.c
EXTRA_DIST = \
LICENSE \
README.md \
VERSION \
autogen.sh \
version.sh

View File

@@ -1,20 +1,23 @@
# glorytun
# π₁(Glorytun)=ℤ²
**Work In Progress:** Do not touch!
Small, Simple and Stupid VPN over [mud](https://github.com/angt/mud).
glorytun depends on [libsodium](https://github.com/jedisct1/libsodium) version >= 1.0.4
#### Work In Progress
This code will probably format your harddisk!
#### Build and Install
Glorytun depends on [libsodium](https://github.com/jedisct1/libsodium) version >= 1.0.4
and needs an AES-NI capable CPU.
To build and install the latest version:
$ git clone https://github.com/angt/glorytun
$ git clone https://github.com/angt/glorytun --recursive --branch mud
$ cd glorytun
$ ./autogen.sh
$ ./configure
$ make
# make install
To create and use a new secret key:
$ dd if=/dev/urandom of=glorytun.key bs=32 count=1
# glorytun keyfile glorytun.key [...]
For feature requests and bug reports, please create an [issue](https://github.com/angt/glorytun/issues).

View File

@@ -1,2 +1,3 @@
#!/bin/sh
autoreconf -i -f

View File

@@ -1,11 +1,17 @@
AC_PREREQ([2.65])
AC_INIT([glorytun], [0.0.4], [https://github.com/angt/glorytun/issues],
[glorytun], [https://github.com/angt/glorytun])
AC_INIT([glorytun],
[m4_esyscmd([./version.sh])],
[https://github.com/angt/glorytun/issues],
[glorytun],
[https://github.com/angt/glorytun])
AC_DEFINE_UNQUOTED([VERSION_MAJOR], [m4_esyscmd([./version.sh major])])
AC_CONFIG_SRCDIR([src/common.h])
AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([1.9 -Wall -Werror foreign tar-ustar subdir-objects])
AM_DEP_TRACK
AM_SILENT_RULES([yes])
AM_PROG_CC_C_O
AC_PROG_CC_C99
AC_USE_SYSTEM_EXTENSIONS
AC_SEARCH_LIBS([getaddrinfo], [resolv nsl])

275
m4/pkg.m4 Normal file
View File

@@ -0,0 +1,275 @@
dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
dnl serial 11 (pkg-config-0.29)
dnl
dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
dnl
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
dnl the Free Software Foundation; either version 2 of the License, or
dnl (at your option) any later version.
dnl
dnl This program is distributed in the hope that it will be useful, but
dnl WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
dnl General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program; if not, write to the Free Software
dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
dnl 02111-1307, USA.
dnl
dnl As a special exception to the GNU General Public License, if you
dnl distribute this file as part of a program that contains a
dnl configuration script generated by Autoconf, you may include it under
dnl the same distribution terms that you use for the rest of that
dnl program.
dnl PKG_PREREQ(MIN-VERSION)
dnl -----------------------
dnl Since: 0.29
dnl
dnl Verify that the version of the pkg-config macros are at least
dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
dnl installed version of pkg-config, this checks the developer's version
dnl of pkg.m4 when generating configure.
dnl
dnl To ensure that this macro is defined, also add:
dnl m4_ifndef([PKG_PREREQ],
dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
dnl
dnl See the "Since" comment for each macro you use to see what version
dnl of the macros you require.
m4_defun([PKG_PREREQ],
[m4_define([PKG_MACROS_VERSION], [0.29])
m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
[m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
])dnl PKG_PREREQ
dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
dnl ----------------------------------
dnl Since: 0.16
dnl
dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
dnl first found in the path. Checks that the version of pkg-config found
dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
dnl used since that's the first version where most current features of
dnl pkg-config existed.
AC_DEFUN([PKG_PROG_PKG_CONFIG],
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
fi
if test -n "$PKG_CONFIG"; then
_pkg_min_version=m4_default([$1], [0.9.0])
AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
PKG_CONFIG=""
fi
fi[]dnl
])dnl PKG_PROG_PKG_CONFIG
dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
dnl -------------------------------------------------------------------
dnl Since: 0.18
dnl
dnl Check to see whether a particular set of modules exists. Similar to
dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
dnl
dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
dnl only at the first occurence in configure.ac, so if the first place
dnl it's called might be skipped (such as if it is within an "if", you
dnl have to call PKG_CHECK_EXISTS manually
AC_DEFUN([PKG_CHECK_EXISTS],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
if test -n "$PKG_CONFIG" && \
AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
m4_default([$2], [:])
m4_ifvaln([$3], [else
$3])dnl
fi])
dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
dnl ---------------------------------------------
dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
dnl pkg_failed based on the result.
m4_define([_PKG_CONFIG],
[if test -n "$$1"; then
pkg_cv_[]$1="$$1"
elif test -n "$PKG_CONFIG"; then
PKG_CHECK_EXISTS([$3],
[pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes ],
[pkg_failed=yes])
else
pkg_failed=untried
fi[]dnl
])dnl _PKG_CONFIG
dnl _PKG_SHORT_ERRORS_SUPPORTED
dnl ---------------------------
dnl Internal check to see if pkg-config supports short errors.
AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
_pkg_short_errors_supported=yes
else
_pkg_short_errors_supported=no
fi[]dnl
])dnl _PKG_SHORT_ERRORS_SUPPORTED
dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
dnl [ACTION-IF-NOT-FOUND])
dnl --------------------------------------------------------------
dnl Since: 0.4.0
dnl
dnl Note that if there is a possibility the first call to
dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
AC_DEFUN([PKG_CHECK_MODULES],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
pkg_failed=no
AC_MSG_CHECKING([for $1])
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
and $1[]_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.])
if test $pkg_failed = yes; then
AC_MSG_RESULT([no])
_PKG_SHORT_ERRORS_SUPPORTED
if test $_pkg_short_errors_supported = yes; then
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
else
$1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
fi
# Put the nasty error message in config.log where it belongs
echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
m4_default([$4], [AC_MSG_ERROR(
[Package requirements ($2) were not met:
$$1_PKG_ERRORS
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
_PKG_TEXT])[]dnl
])
elif test $pkg_failed = untried; then
AC_MSG_RESULT([no])
m4_default([$4], [AC_MSG_FAILURE(
[The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.
_PKG_TEXT
To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
])
else
$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
AC_MSG_RESULT([yes])
$3
fi[]dnl
])dnl PKG_CHECK_MODULES
dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
dnl [ACTION-IF-NOT-FOUND])
dnl ---------------------------------------------------------------------
dnl Since: 0.29
dnl
dnl Checks for existence of MODULES and gathers its build flags with
dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
dnl and VARIABLE-PREFIX_LIBS from --libs.
dnl
dnl Note that if there is a possibility the first call to
dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
dnl configure.ac.
AC_DEFUN([PKG_CHECK_MODULES_STATIC],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
_save_PKG_CONFIG=$PKG_CONFIG
PKG_CONFIG="$PKG_CONFIG --static"
PKG_CHECK_MODULES($@)
PKG_CONFIG=$_save_PKG_CONFIG[]dnl
])dnl PKG_CHECK_MODULES_STATIC
dnl PKG_INSTALLDIR([DIRECTORY])
dnl -------------------------
dnl Since: 0.27
dnl
dnl Substitutes the variable pkgconfigdir as the location where a module
dnl should install pkg-config .pc files. By default the directory is
dnl $libdir/pkgconfig, but the default can be changed by passing
dnl DIRECTORY. The user can override through the --with-pkgconfigdir
dnl parameter.
AC_DEFUN([PKG_INSTALLDIR],
[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
m4_pushdef([pkg_description],
[pkg-config installation directory @<:@]pkg_default[@:>@])
AC_ARG_WITH([pkgconfigdir],
[AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
[with_pkgconfigdir=]pkg_default)
AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
m4_popdef([pkg_default])
m4_popdef([pkg_description])
])dnl PKG_INSTALLDIR
dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
dnl --------------------------------
dnl Since: 0.27
dnl
dnl Substitutes the variable noarch_pkgconfigdir as the location where a
dnl module should install arch-independent pkg-config .pc files. By
dnl default the directory is $datadir/pkgconfig, but the default can be
dnl changed by passing DIRECTORY. The user can override through the
dnl --with-noarch-pkgconfigdir parameter.
AC_DEFUN([PKG_NOARCH_INSTALLDIR],
[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
m4_pushdef([pkg_description],
[pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
AC_ARG_WITH([noarch-pkgconfigdir],
[AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
[with_noarch_pkgconfigdir=]pkg_default)
AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
m4_popdef([pkg_default])
m4_popdef([pkg_description])
])dnl PKG_NOARCH_INSTALLDIR
dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
dnl -------------------------------------------
dnl Since: 0.28
dnl
dnl Retrieves the value of the pkg-config variable for the given module.
AC_DEFUN([PKG_CHECK_VAR],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
_PKG_CONFIG([$1], [variable="][$3]["], [$2])
AS_VAR_COPY([$1], [pkg_cv_][$1])
AS_VAR_IF([$1], [""], [$5], [$4])dnl
])dnl PKG_CHECK_VAR

1
mud Submodule

Submodule mud added at 4499b841f4

66
src/buffer.h Normal file
View File

@@ -0,0 +1,66 @@
#pragma once
#include "common.h"
typedef struct buffer buffer_t;
struct buffer {
uint8_t *data;
uint8_t *read;
uint8_t *write;
uint8_t *end;
};
static inline void buffer_setup (buffer_t *buffer, void *data, size_t size)
{
if (!data)
data = malloc(ALIGN(size));
buffer->data = data;
buffer->read = data;
buffer->write = data;
buffer->end = data;
buffer->end += size;
}
static inline void buffer_format (buffer_t *buffer)
{
buffer->write = buffer->data;
buffer->read = buffer->data;
}
_pure_
static inline size_t buffer_size (buffer_t *buffer)
{
return buffer->end-buffer->data;
}
_pure_
static inline size_t buffer_write_size (buffer_t *buffer)
{
return buffer->end-buffer->write;
}
_pure_
static inline size_t buffer_read_size (buffer_t *buffer)
{
return buffer->write-buffer->read;
}
static inline void buffer_shift (buffer_t *buffer)
{
if (buffer->read==buffer->data)
return;
if (buffer->read==buffer->write) {
buffer_format(buffer);
return;
}
const size_t size = buffer_read_size(buffer);
memmove(buffer->data, buffer->read, size);
buffer->read = buffer->data;
buffer->write = buffer->data+size;
}

View File

@@ -1,142 +0,0 @@
#pragma once
#include "common.h"
#include <unistd.h>
#include <errno.h>
static inline void byte_set (void *dst, const char value, size_t size)
{
if (!dst)
return;
char *restrict d = dst;
while (size--)
*d++ = value;
}
static inline void byte_cpy (void *dst, const void *src, size_t size)
{
if (!dst || !src)
return;
char *restrict d = dst;
const char *restrict s = src;
while (size--)
*d++ = *s++;
}
static inline size_t str_cpy (char *restrict dst, const char *restrict src, size_t len)
{
if (!dst || !src)
return 0;
size_t i;
for (i=0; i<len && src[i]; i++)
dst[i] = src[i];
dst[i] = 0;
return i;
}
static inline int str_cmp (const char *restrict sa, const char *restrict sb)
{
if (!sa || !sb)
return 1;
while (*sa==*sb++)
if (!*sa++)
return 0;
return 1;
}
static inline size_t str_len (const char *restrict str)
{
if (!str)
return 0;
size_t i = 0;
while (str[i])
i++;
return i;
}
static inline char *str_cat (const char *const strs[], size_t count)
{
size_t size = 1;
for (size_t i=0; i<count; i++)
size += str_len(strs[i]);
char *str = malloc(size);
if (!str)
return NULL;
char *p = str;
for (size_t i=0; i<count; i++) {
size_t len = str_len(strs[i]);
byte_cpy(p, strs[i], len);
p += len;
}
p[0] = 0;
return str;
}
static inline void buffer_setup (buffer_t *buffer, void *data, size_t size)
{
if (!data)
data = malloc(ALIGN(size));
buffer->data = data;
buffer->read = data;
buffer->write = data;
buffer->end = data;
buffer->end += size;
}
static inline void buffer_format (buffer_t *buffer)
{
buffer->write = buffer->data;
buffer->read = buffer->data;
}
static inline size_t buffer_size (buffer_t *buffer)
{
return buffer->end-buffer->data;
}
static inline size_t buffer_write_size (buffer_t *buffer)
{
return buffer->end-buffer->write;
}
static inline size_t buffer_read_size (buffer_t *buffer)
{
return buffer->write-buffer->read;
}
static inline void buffer_shift (buffer_t *buffer)
{
if (buffer->read==buffer->write) {
buffer_format(buffer);
} else {
const uint8_t *src = PALIGN_DOWN(buffer->read);
const size_t size = ALIGN(buffer->write-src);
if (buffer->data+size<src) {
byte_cpy(buffer->data, src, size);
buffer->read -= src-buffer->data;
buffer->write -= src-buffer->data;
}
}
}

View File

@@ -36,5 +36,61 @@ void gt_fatal (const char *fmt, ...)
void gt_na (const char *name)
{
gt_log("%s is not available on your platform!\n", name);
gt_log("%s is not available on your platform\n", name);
}
int gt_tohex (char *dst, size_t dst_size, const uint8_t *src, size_t src_size)
{
if _0_(!dst_size)
return -1;
if _0_(((dst_size-1)/2)<src_size)
return -1;
static const char tbl[] = "0123456789ABCDEF";
for (size_t i=0; i<src_size; i++) {
*dst++ = tbl[0xF&(src[i]>>4)];
*dst++ = tbl[0xF&(src[i])];
}
*dst = 0;
return 0;
}
_const_
static inline int fromhex (const char c)
{
if (c>='0' && c<='9')
return c-'0';
if (c>='A' && c<='F')
return c-'A'+10;
if (c>='a' && c<='f')
return c-'a'+10;
return -1;
}
int gt_fromhex (uint8_t *dst, size_t dst_size, const char *src, size_t src_size)
{
if _0_(src_size&1)
return -1;
if _0_(dst_size<(src_size/2))
return -1;
for (size_t i=0; i<src_size; i+=2) {
const int a = fromhex(src[i]);
const int b = fromhex(src[i+1]);
if _0_(a==-1 || b==-1)
return -1;
*dst++ = (a<<4)|b;
}
return 0;
}

View File

@@ -2,8 +2,11 @@
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#define COUNT(x) (sizeof(x)/sizeof(x[0]))
#define COUNT(x) (sizeof(x)/sizeof(x[0]))
#define ALIGN_SIZE (1<<4)
#define ALIGN_MASK (ALIGN_SIZE-1)
@@ -14,20 +17,22 @@
#define PALIGN(x) ((void *)ALIGN((size_t)(x)))
#define PALIGN_DOWN(x) ((void *)ALIGN_DOWN((size_t)(x)))
#define _printf_(A,B) __attribute__((format(printf,A,B)))
#define _noreturn_ __attribute__((noreturn))
#define _unused_ __attribute__((unused))
#define _1_(x) (__builtin_expect((x), 1))
#define _0_(x) (__builtin_expect((x), 0))
typedef struct buffer buffer_t;
#define CLZ(x) (__builtin_clz(x))
struct buffer {
uint8_t *data;
uint8_t *read;
uint8_t *write;
uint8_t *end;
};
#define _printf_(A,B) __attribute__ ((format(printf,A,B)))
#define _noreturn_ __attribute__ ((noreturn))
#define _unused_ __attribute__ ((unused))
#define _pure_ __attribute__ ((pure))
#define _const_ __attribute__ ((const))
#define _align_(...) __attribute__ ((aligned(__VA_ARGS__)))
int gt_print (const char *, ...) _printf_(1,2);
void gt_log (const char *, ...) _printf_(1,2);
void gt_fatal (const char *, ...) _printf_(1,2) _noreturn_;
void gt_na (const char *);
int gt_tohex (char *, size_t, const uint8_t *, size_t);
int gt_fromhex (uint8_t *, size_t, const char *, size_t);

155
src/db.c Normal file
View File

@@ -0,0 +1,155 @@
#include "common.h"
#include "db.h"
#include "str.h"
#define CBIT(X) (1&(intptr_t)(X))
#define CBIT_PTR(X) (uint8_t *)(1|(intptr_t)(X))
#define CBIT_NODE(X) (struct node *)(1^(intptr_t)(X))
struct node {
uint8_t *child[2];
uint32_t point;
};
_pure_
static inline size_t db_size (const uint8_t *a)
{
return (a[0]?:str_len((char *)a+1))+1;
}
_pure_
static inline size_t db_cmp (const uint8_t *a, const uint8_t *b)
{
const size_t size = a[0];
if (size!=b[0])
return 1;
if (!size) {
size_t i = str_cmp((char *)a+1, (char *)b+1);
return i?i+1:0;
}
for (size_t i=1; i<=size; i++) {
if (a[i]!=b[i])
return i+1;
}
return 0;
}
_pure_
static inline int db_dir (const uint32_t point, uint8_t *data, const size_t size)
{
const size_t pos = point>>8;
if (pos>=size)
return 0;
return ((point|data[pos])&255)==255;
}
uint8_t *db_search (uint8_t **p, uint8_t *data)
{
if _0_(!*p)
return NULL;
uint8_t *r = *p;
const size_t size = db_size(data);
while (CBIT(r)) {
struct node *node = CBIT_NODE(r);
r = node->child[db_dir(node->point, data, size)];
}
if (!db_cmp(r, data))
return r;
return NULL;
}
uint8_t *db_insert (uint8_t **p, uint8_t *data)
{
if _0_(CBIT(data))
return NULL;
if _0_(!*p) {
*p = data;
return data;
}
uint8_t *r = *p;
size_t size = db_size(data);
while (CBIT(r)) {
struct node *node = CBIT_NODE(r);
r = node->child[db_dir(node->point, data, size)];
}
const size_t diff = db_cmp(r, data);
if _0_(!diff)
return r;
const size_t pos = diff-1;
const uint8_t mask = ~((1u<<31)>>CLZ(r[pos]^data[pos]));
const size_t point = (pos<<8)|mask;
while (CBIT(*p)) {
struct node *node = CBIT_NODE(*p);
if (node->point>point)
break;
p = node->child+db_dir(node->point, data, size);
}
struct node *node = malloc(sizeof(struct node));
if _0_(!node)
return NULL;
const int dir = (mask|r[pos])==255;
node->child[dir] = *p;
node->child[1-dir] = data;
node->point = point;
*p = CBIT_PTR(node);
return data;
}
uint8_t *db_remove (uint8_t **p, uint8_t *data)
{
if _0_(!*p)
return NULL;
const size_t size = db_size(data);
uint8_t **p_old = NULL;
struct node *node = NULL;
int dir = 0;
while (CBIT(*p)) {
p_old = p;
node = CBIT_NODE(*p);
dir = db_dir(node->point, data, size);
p = node->child+dir;
}
if _0_(db_cmp(data, *p))
return NULL;
uint8_t *r = *p;
if (p_old) {
*p_old = node->child[1-dir];
free(node);
} else {
*p = NULL;
}
return r;
}

7
src/db.h Normal file
View File

@@ -0,0 +1,7 @@
#pragma once
#include <stdint.h>
uint8_t *db_search (uint8_t **, uint8_t *);
uint8_t *db_insert (uint8_t **, uint8_t *);
uint8_t *db_remove (uint8_t **, uint8_t *);

View File

@@ -1,30 +0,0 @@
#pragma once
#include <stdint.h>
static inline int ip_get_version (const uint8_t *data, size_t size)
{
if (size<20) // XXX
return -1; // XXX
return data[0]>>4;
}
static inline void ip_set_size (uint8_t *data, size_t size)
{
data[2] = 0xFF&(size>>8);
data[3] = 0xFF&(size);
}
static inline ssize_t ip_get_size (const uint8_t *data, size_t size)
{
switch (ip_get_version(data, size)) {
case 4:
return (data[2]<<8)|data[3];
case -1:
return -1;
}
return 0;
}

39
src/ip.h Normal file
View File

@@ -0,0 +1,39 @@
#pragma once
#include <stdint.h>
struct ip_common {
uint8_t version;
uint8_t proto;
uint8_t hdr_size;
uint16_t size;
};
_pure_
static inline uint8_t ip_get_version (const uint8_t *data, size_t size)
{
if (size<20)
return 0;
return data[0]>>4;
}
static inline int ip_get_common (struct ip_common *ic, const uint8_t *data, size_t size)
{
ic->version = ip_get_version(data, size);
switch (ic->version) {
case 4:
ic->proto = data[9];
ic->hdr_size = (data[0]&0xF)<<2;
ic->size = ((data[2]<<8)|data[3]);
return 0;
case 6:
ic->proto = data[6];
ic->hdr_size = 40;
ic->size = ((data[4]<<8)|data[5])+40;
return 0;
}
return -1;
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,25 +1,23 @@
#include "common-static.h"
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
#include "option.h"
#include "str.h"
int option_str (void *data, int argc, char **argv)
{
if (argc<2 || !argv[1]) {
if (argc<2 || str_empty(argv[1])) {
gt_print("option `%s' need a string argument\n", argv[0]);
return -1;
}
byte_cpy(data, &argv[1], sizeof(argv[1]));
memcpy(data, &argv[1], sizeof(argv[1]));
return 1;
}
int option_long (void *data, int argc, char **argv)
{
if (argc<2 || !argv[1]) {
if (argc<2 || str_empty(argv[1])) {
gt_print("option `%s' need an integer argument\n", argv[0]);
return -1;
}
@@ -33,7 +31,7 @@ int option_long (void *data, int argc, char **argv)
return -1;
}
byte_cpy(data, &val, sizeof(val));
memcpy(data, &val, sizeof(val));
return 1;
}
@@ -94,18 +92,18 @@ static int option_usage (struct option *opts, int slen)
if (!opts)
return 0;
int len = slen;
int len = 0;
for (int k=0; opts[k].name; k++) {
if (len>60) {
gt_print("\n%*s", (int)slen, "");
len = slen;
if (len>40) {
gt_print("\n%*s", slen, "");
len = 0;
}
len += gt_print(" [%s", opts[k].name);
if (opts[k].call==option_option) {
len += option_usage((struct option *)opts[k].data, len);
len += option_usage((struct option *)opts[k].data, slen+len);
} else {
len += gt_print(" ARG");
}
@@ -130,12 +128,13 @@ int option (struct option *opts, int argc, char **argv)
int slen = gt_print("usage: %s", argv[0]);
if (slen>40)
if (slen>40) {
slen = 12;
gt_print("\n%*s", slen, "");
}
option_usage(opts, slen);
printf("\n");
gt_print("\n");
return 1;
}

62
src/state.c Normal file
View File

@@ -0,0 +1,62 @@
#include "common.h"
#include "state.h"
#include "str.h"
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
int state_create (const char *filename)
{
if (str_empty(filename))
return -1;
int fd = open(filename, O_WRONLY);
if (fd==-1) {
if (errno!=EINTR)
perror("open");
return -1;
}
struct stat st = {0};
if (fstat(fd, &st)==-1) {
perror("fstat");
close(fd);
return -1;
}
if (!S_ISFIFO(st.st_mode)) {
gt_log("`%s' is not a fifo\n", filename);
close(fd);
return -1;
}
return fd;
}
void state_send (int fd, const char *state, const char *info)
{
if (str_empty(state))
return;
if (fd==-1) {
gt_print("%s %s\n", state, info);
return;
}
const char *strs[] = { state, " ", info, "\n" };
char *str = str_cat(strs, COUNT(strs));
if (!str) {
perror("str_cat");
return;
}
if (write(fd, str, str_len(str))==-1 && errno!=EINTR)
perror("write");
free(str);
}

4
src/state.h Normal file
View File

@@ -0,0 +1,4 @@
#pragma once
int state_create (const char *);
void state_send (int, const char *, const char *);

73
src/str.h Normal file
View File

@@ -0,0 +1,73 @@
#pragma once
#include "common.h"
static inline size_t str_cpy (char *restrict dst, const char *restrict src, size_t len)
{
if (!dst || !src)
return 0;
size_t i;
for (i=0; i<len && src[i]; i++)
dst[i] = src[i];
dst[i] = 0;
return i;
}
_pure_
static inline int str_empty (const char *restrict str)
{
return !str || !str[0];
}
_pure_
static inline size_t str_cmp (const char *restrict sa, const char *restrict sb)
{
if (!sa || !sb)
return 1;
size_t i = 0;
while (sa[i]==sb[i])
if (!sa[i++])
return 0;
return i+1;
}
_pure_
static inline size_t str_len (const char *restrict str)
{
if (!str)
return 0;
return strlen(str);
}
static inline char *str_cat (const char **strs, size_t count)
{
size_t size = 1;
for (size_t i=0; i<count; i++)
size += str_len(strs[i]);
char *str = malloc(size);
if (!str)
return NULL;
char *p = str;
for (size_t i=0; i<count; i++) {
size_t len = str_len(strs[i]);
memcpy(p, strs[i], len);
p += len;
}
p[0] = 0;
return str;
}

181
src/tun.c
View File

@@ -1,7 +1,8 @@
#include "common-static.h"
#include "ip-static.h"
#include "common.h"
#include "tun.h"
#include "str.h"
#include "ip.h"
#include <stdio.h>
#include <fcntl.h>
@@ -11,120 +12,152 @@
#include <sys/uio.h>
#ifdef __linux__
# include <linux/if.h>
# include <linux/if_tun.h>
#include <linux/if.h>
#include <linux/if_tun.h>
#endif
#ifdef __APPLE__
# include <sys/sys_domain.h>
# include <sys/kern_control.h>
# include <net/if_utun.h>
#include <sys/sys_domain.h>
#include <sys/kern_control.h>
#include <net/if_utun.h>
#endif
#if defined(__APPLE__) || defined(__OpenBSD__)
# define GT_BSD_TUN 1
#define GT_BSD_TUN
#endif
#ifdef __APPLE__
static int tun_create_by_id (char *name, size_t size, unsigned id, _unused_ int mq)
{
int fd = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL);
if (fd==-1)
return -1;
struct ctl_info ci;
memset(&ci, 0, sizeof(ci));
str_cpy(ci.ctl_name, UTUN_CONTROL_NAME, sizeof(ci.ctl_name)-1);
if (ioctl(fd, CTLIOCGINFO, &ci)) {
close(fd);
return -1;
}
struct sockaddr_ctl sc = {
.sc_id = ci.ctl_id,
.sc_len = sizeof(sc),
.sc_family = AF_SYSTEM,
.ss_sysaddr = AF_SYS_CONTROL,
.sc_unit = id+1,
};
if (connect(fd, (struct sockaddr *)&sc, sizeof(sc))) {
close(fd);
return -1;
}
snprintf(name, size, "utun%u", id);
return fd;
}
static int tun_create_by_name (char *name, size_t size, char *dev_name, int mq)
{
unsigned id = 0;
if (sscanf(dev_name, "utun%u", &id)!=1)
return -1;
return tun_create_by_id(name, size, id, mq);
}
#else /* not __APPLE__ */
#ifdef __linux__
int tun_create (char *name, int multiqueue)
static int tun_create_by_name (char *name, size_t size, char *dev_name, int mq)
{
int fd = open("/dev/net/tun", O_RDWR);
if (fd<0) {
perror("open /dev/net/tun");
if (fd==-1)
return -1;
}
struct ifreq ifr = {
.ifr_flags = IFF_TUN|IFF_NO_PI,
};
if (multiqueue) {
if (mq) {
#ifdef IFF_MULTI_QUEUE
ifr.ifr_flags |= IFF_MULTI_QUEUE;
#else
gt_na("IFF_MULTI_QUEUE");
#endif
}
str_cpy(ifr.ifr_name, name, IFNAMSIZ-1);
str_cpy(ifr.ifr_name, dev_name, IFNAMSIZ-1);
int ret = ioctl(fd, TUNSETIFF, &ifr);
if (ret<0) {
perror("ioctl TUNSETIFF");
if (ioctl(fd, TUNSETIFF, &ifr)) {
close(fd);
return -1;
}
gt_log("tun name: %s\n", ifr.ifr_name);
str_cpy(name, ifr.ifr_name, size-1);
return fd;
}
#elif defined(__APPLE__)
int tun_create (_unused_ char *name, _unused_ int mq)
#else /* not __linux__ not __APPLE__ */
static int tun_create_by_name (char *name, size_t size, char *dev_name, _unused_ int mq)
{
for (unsigned dev_id = 0; dev_id < 32; dev_id++) {
struct ctl_info ci;
char path[64];
byte_set(&ci, 0, sizeof(ci));
str_cpy(ci.ctl_name, UTUN_CONTROL_NAME, sizeof(ci.ctl_name)-1);
snprintf(path, sizeof(path), "/dev/%s", dev_name);
str_cpy(name, dev_name, size-1);
int fd = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL);
if (fd==-1)
return -1;
if (ioctl(fd, CTLIOCGINFO, &ci)==-1) {
close(fd);
continue;
}
struct sockaddr_ctl sc = {
.sc_id = ci.ctl_id,
.sc_len = sizeof(sc),
.sc_family = AF_SYSTEM,
.ss_sysaddr = AF_SYS_CONTROL,
.sc_unit = dev_id+1,
};
if (connect(fd, (struct sockaddr *)&sc, sizeof(sc))==-1) {
close(fd);
continue;
}
gt_log("tun name: /dev/utun%u\n", dev_id);
return fd;
}
return -1;
return open(path, O_RDWR);
}
#else
int tun_create (_unused_ char *name, _unused_ int mq)
#endif /* not __APPLE__ */
static int tun_create_by_id (char *name, size_t size, unsigned id, int mq)
{
for (unsigned dev_id = 0; dev_id < 32; dev_id++) {
char dev_path[11];
char dev_name[64];
snprintf(dev_path, sizeof(dev_path), "/dev/tun%u", dev_id);
snprintf(dev_name, sizeof(dev_name), "tun%u", id);
int fd = open(dev_path, O_RDWR);
if (fd==-1)
continue;
gt_log("tun name: %s\n", dev_path);
return fd;
}
return -1;
return tun_create_by_name(name, size, dev_name, mq);
}
#endif
int tun_create (char *dev_name, char **ret_name, int mq)
{
char name[64] = {0};
int fd = -1;
#ifndef IFF_MULTI_QUEUE
if (mq)
gt_na("IFF_MULTI_QUEUE");
#endif
if (str_empty(dev_name)) {
for (unsigned id=0; id<32 && fd==-1; id++)
fd = tun_create_by_id(name, sizeof(name), id, mq);
} else {
fd = tun_create_by_name(name, sizeof(name), dev_name, mq);
}
if (fd!=-1 && ret_name)
*ret_name = strdup(name);
return fd;
}
ssize_t tun_read (int fd, void *data, size_t size)
{
if (!size)
return -2;
return -1;
#ifdef GT_BSD_TUN
uint32_t family;
@@ -162,7 +195,7 @@ ssize_t tun_read (int fd, void *data, size_t size)
ssize_t tun_write (int fd, const void *data, size_t size)
{
if (!size)
return -2;
return -1;
#ifdef GT_BSD_TUN
uint32_t family;

View File

@@ -2,6 +2,6 @@
#include <unistd.h>
int tun_create (char *, int);
int tun_create (char *, char **, int);
ssize_t tun_read (int, void *, size_t);
ssize_t tun_write (int, const void *, size_t);

13
version.sh Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/sh
[ -z "${VERSION}" ] && VERSION=`git describe --tags --match='v[0-9].*' 2>/dev/null` \
&& VERSION=${VERSION#v}
[ -z "${VERSION}" ] && VERSION=`cat VERSION 2>/dev/null`
[ -z "${VERSION}" ] && VERSION=0.0.0
[ "$1" = "major" ] && printf ${VERSION%%.*} \
&& exit 0
printf ${VERSION} | tee VERSION