Compare commits
60 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0a797b4f5f | ||
|
|
8cb849fbc3 | ||
|
|
13f9f4c896 | ||
|
|
cfd7af9241 | ||
|
|
c81592fcc5 | ||
|
|
b4a311cdc8 | ||
|
|
08617d0017 | ||
|
|
38cd3b0371 | ||
|
|
5944e61dfe | ||
|
|
585b2b08bc | ||
|
|
a3aa6fc4fb | ||
|
|
6f36424d12 | ||
|
|
fa9301da16 | ||
|
|
c154a00358 | ||
|
|
4246b510d2 | ||
|
|
c71db48ae1 | ||
|
|
e3cce8aeb9 | ||
|
|
ad0d205ff3 | ||
|
|
030087cb27 | ||
|
|
eefa7722c5 | ||
|
|
17547f555d | ||
|
|
ec9c59ce69 | ||
|
|
679927a684 | ||
|
|
2999faf5d7 | ||
|
|
219384b7e5 | ||
|
|
3649e46b03 | ||
|
|
88f314bc75 | ||
|
|
e2b3dc1b46 | ||
|
|
1815ea519f | ||
|
|
33356d5d35 | ||
|
|
4a5d07ec45 | ||
|
|
a50882e1ac | ||
|
|
b2cb8ebcbe | ||
|
|
6fd6cf8c4a | ||
|
|
f0fc2751e5 | ||
|
|
81cab007d0 | ||
|
|
606396839f | ||
|
|
a8e37bafb9 | ||
|
|
87a38012cd | ||
|
|
f04816e9a5 | ||
|
|
7107d036b1 | ||
|
|
30502e05ec | ||
|
|
905673ecec | ||
|
|
cfbb77c710 | ||
|
|
13dcdc5afb | ||
|
|
56ec81bf92 | ||
|
|
f1024381e0 | ||
|
|
3f3b21f08d | ||
|
|
40dd5ce18a | ||
|
|
5efb379251 | ||
|
|
2eb6521f9c | ||
|
|
bfd81e9666 | ||
|
|
8fa2322314 | ||
|
|
8982f27220 | ||
|
|
a5f97fcc8c | ||
|
|
35a9bf27df | ||
|
|
ba0af8cc20 | ||
|
|
ec85be5c6a | ||
|
|
fe989851ab | ||
|
|
46842dd200 |
15
.build.sh
Executable file
15
.build.sh
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
export CC="gcc -static"
|
||||||
|
|
||||||
|
git clone https://github.com/jedisct1/libsodium --depth=1 --branch stable
|
||||||
|
cd libsodium || exit 1
|
||||||
|
./autogen.sh && ./configure --enable-minimal --disable-shared --prefix=/usr && make install
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
./autogen.sh && ./configure && make
|
||||||
|
[ -x glorytun ] || exit 1
|
||||||
|
|
||||||
|
mkdir -p deploy
|
||||||
|
strip -s glorytun
|
||||||
|
mv glorytun deploy/glorytun-$(cat VERSION)-$(uname -m).bin
|
||||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2015, angt
|
Copyright (c) 2015-2016, angt
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
|||||||
18
Makefile.am
18
Makefile.am
@@ -6,19 +6,23 @@ glorytun_CFLAGS = $(libsodium_CFLAGS)
|
|||||||
glorytun_LDADD = $(libsodium_LIBS)
|
glorytun_LDADD = $(libsodium_LIBS)
|
||||||
glorytun_SOURCES = \
|
glorytun_SOURCES = \
|
||||||
src/common.h \
|
src/common.h \
|
||||||
src/common-static.h \
|
|
||||||
src/common.c \
|
src/common.c \
|
||||||
src/ip-static.h \
|
src/buffer.h \
|
||||||
|
src/ip.h \
|
||||||
|
src/str.h \
|
||||||
src/main.c \
|
src/main.c \
|
||||||
src/option.c \
|
src/option.c \
|
||||||
src/option.h \
|
src/option.h \
|
||||||
src/tun.c \
|
src/tun.c \
|
||||||
src/tun.h \
|
src/tun.h \
|
||||||
src/db.c \
|
src/db.c \
|
||||||
src/db.h
|
src/db.h \
|
||||||
|
src/state.c \
|
||||||
|
src/state.h
|
||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
LICENSE \
|
LICENSE \
|
||||||
README.md \
|
README.md \
|
||||||
autogen.sh \
|
VERSION \
|
||||||
version.sh
|
autogen.sh \
|
||||||
|
version.sh
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Glorytun
|
# π₁(Glorytun)=ℤ²
|
||||||
|
|
||||||
Small, Simple and Stupid TCP VPN.
|
Small, Simple and Stupid TCP VPN.
|
||||||
|
|
||||||
@@ -8,8 +8,7 @@ This code will probably format your harddisk!
|
|||||||
|
|
||||||
#### Build and Install
|
#### Build and Install
|
||||||
|
|
||||||
Glorytun depends on [libsodium](https://github.com/jedisct1/libsodium) version >= 1.0.4
|
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:
|
To build and install the latest version:
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ AC_INIT([glorytun],
|
|||||||
[https://github.com/angt/glorytun/issues],
|
[https://github.com/angt/glorytun/issues],
|
||||||
[glorytun],
|
[glorytun],
|
||||||
[https://github.com/angt/glorytun])
|
[https://github.com/angt/glorytun])
|
||||||
|
AC_DEFINE_UNQUOTED([VERSION_MAJOR], [m4_esyscmd([./version.sh major])])
|
||||||
AC_CONFIG_SRCDIR([src/common.h])
|
AC_CONFIG_SRCDIR([src/common.h])
|
||||||
AC_CONFIG_AUX_DIR([build-aux])
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
@@ -15,6 +16,8 @@ AC_PROG_CC_C99
|
|||||||
AC_USE_SYSTEM_EXTENSIONS
|
AC_USE_SYSTEM_EXTENSIONS
|
||||||
AC_SEARCH_LIBS([getaddrinfo], [resolv nsl])
|
AC_SEARCH_LIBS([getaddrinfo], [resolv nsl])
|
||||||
AC_SEARCH_LIBS([socket], [socket])
|
AC_SEARCH_LIBS([socket], [socket])
|
||||||
|
AC_CHECK_LIB([rt], [clock_gettime])
|
||||||
|
AC_CHECK_FUNCS([clock_gettime])
|
||||||
PKG_CHECK_MODULES([libsodium], [libsodium >= 1.0.4])
|
PKG_CHECK_MODULES([libsodium], [libsodium >= 1.0.4])
|
||||||
AC_CONFIG_FILES([Makefile])
|
AC_CONFIG_FILES([Makefile])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|||||||
16
m4/pkg.m4
16
m4/pkg.m4
@@ -1,6 +1,6 @@
|
|||||||
dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
||||||
dnl serial 11 (pkg-config-0.29)
|
# serial 12 (pkg-config-0.29.2)
|
||||||
dnl
|
|
||||||
dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
|
dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
|
||||||
dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
|
dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
|
||||||
dnl
|
dnl
|
||||||
@@ -41,7 +41,7 @@ dnl
|
|||||||
dnl See the "Since" comment for each macro you use to see what version
|
dnl See the "Since" comment for each macro you use to see what version
|
||||||
dnl of the macros you require.
|
dnl of the macros you require.
|
||||||
m4_defun([PKG_PREREQ],
|
m4_defun([PKG_PREREQ],
|
||||||
[m4_define([PKG_MACROS_VERSION], [0.29])
|
[m4_define([PKG_MACROS_VERSION], [0.29.2])
|
||||||
m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
|
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])])
|
[m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
|
||||||
])dnl PKG_PREREQ
|
])dnl PKG_PREREQ
|
||||||
@@ -142,7 +142,7 @@ 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
|
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
|
||||||
|
|
||||||
pkg_failed=no
|
pkg_failed=no
|
||||||
AC_MSG_CHECKING([for $1])
|
AC_MSG_CHECKING([for $2])
|
||||||
|
|
||||||
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
|
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
|
||||||
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
|
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
|
||||||
@@ -152,11 +152,11 @@ and $1[]_LIBS to avoid the need to call pkg-config.
|
|||||||
See the pkg-config man page for more details.])
|
See the pkg-config man page for more details.])
|
||||||
|
|
||||||
if test $pkg_failed = yes; then
|
if test $pkg_failed = yes; then
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
_PKG_SHORT_ERRORS_SUPPORTED
|
_PKG_SHORT_ERRORS_SUPPORTED
|
||||||
if test $_pkg_short_errors_supported = yes; then
|
if test $_pkg_short_errors_supported = yes; then
|
||||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
|
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
|
||||||
else
|
else
|
||||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
|
$1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
|
||||||
fi
|
fi
|
||||||
# Put the nasty error message in config.log where it belongs
|
# Put the nasty error message in config.log where it belongs
|
||||||
@@ -173,7 +173,7 @@ installed software in a non-standard prefix.
|
|||||||
_PKG_TEXT])[]dnl
|
_PKG_TEXT])[]dnl
|
||||||
])
|
])
|
||||||
elif test $pkg_failed = untried; then
|
elif test $pkg_failed = untried; then
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
m4_default([$4], [AC_MSG_FAILURE(
|
m4_default([$4], [AC_MSG_FAILURE(
|
||||||
[The pkg-config script could not be found or is too old. Make sure it
|
[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
|
is in your PATH or set the PKG_CONFIG environment variable to the full
|
||||||
|
|||||||
66
src/buffer.h
Normal file
66
src/buffer.h
Normal 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;
|
||||||
|
}
|
||||||
@@ -1,155 +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)
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
_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;
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
_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->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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
14
src/common.h
14
src/common.h
@@ -2,8 +2,11 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.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_SIZE (1<<4)
|
||||||
#define ALIGN_MASK (ALIGN_SIZE-1)
|
#define ALIGN_MASK (ALIGN_SIZE-1)
|
||||||
@@ -26,15 +29,6 @@
|
|||||||
#define _const_ __attribute__ ((const))
|
#define _const_ __attribute__ ((const))
|
||||||
#define _align_(...) __attribute__ ((aligned(__VA_ARGS__)))
|
#define _align_(...) __attribute__ ((aligned(__VA_ARGS__)))
|
||||||
|
|
||||||
typedef struct buffer buffer_t;
|
|
||||||
|
|
||||||
struct buffer {
|
|
||||||
uint8_t *data;
|
|
||||||
uint8_t *read;
|
|
||||||
uint8_t *write;
|
|
||||||
uint8_t *end;
|
|
||||||
};
|
|
||||||
|
|
||||||
int gt_print (const char *, ...) _printf_(1,2);
|
int gt_print (const char *, ...) _printf_(1,2);
|
||||||
void gt_log (const char *, ...) _printf_(1,2);
|
void gt_log (const char *, ...) _printf_(1,2);
|
||||||
void gt_fatal (const char *, ...) _printf_(1,2) _noreturn_;
|
void gt_fatal (const char *, ...) _printf_(1,2) _noreturn_;
|
||||||
|
|||||||
4
src/db.c
4
src/db.c
@@ -1,5 +1,7 @@
|
|||||||
|
#include "common.h"
|
||||||
|
|
||||||
#include "db.h"
|
#include "db.h"
|
||||||
#include "common-static.h"
|
#include "str.h"
|
||||||
|
|
||||||
#define CBIT(X) (1&(intptr_t)(X))
|
#define CBIT(X) (1&(intptr_t)(X))
|
||||||
#define CBIT_PTR(X) (uint8_t *)(1|(intptr_t)(X))
|
#define CBIT_PTR(X) (uint8_t *)(1|(intptr_t)(X))
|
||||||
|
|||||||
@@ -1,57 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
_pure_
|
|
||||||
static inline int ip_get_version (const uint8_t *data, size_t size)
|
|
||||||
{
|
|
||||||
if (size<20) // XXX
|
|
||||||
return -1; // XXX
|
|
||||||
|
|
||||||
return data[0]>>4;
|
|
||||||
}
|
|
||||||
|
|
||||||
_pure_
|
|
||||||
static inline ssize_t ip_get_size (const int ip_version, const uint8_t *data, size_t size)
|
|
||||||
{
|
|
||||||
switch (ip_version) {
|
|
||||||
case 4:
|
|
||||||
return ((data[2]<<8)|data[3]);
|
|
||||||
case 6:
|
|
||||||
return ((data[4]<<8)|data[5])+40;
|
|
||||||
case -1:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
_pure_
|
|
||||||
static inline ssize_t ip_get_proto (const int ip_version, const uint8_t *data, size_t size)
|
|
||||||
{
|
|
||||||
switch (ip_version) {
|
|
||||||
case 4:
|
|
||||||
return data[9];
|
|
||||||
case 6:
|
|
||||||
return data[6];
|
|
||||||
case -1:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
_pure_
|
|
||||||
static inline ssize_t ip_get_hdr_size (const int ip_version, const uint8_t *data, size_t size)
|
|
||||||
{
|
|
||||||
switch (ip_version) {
|
|
||||||
case 4:
|
|
||||||
return (data[0]&0xF)<<2;
|
|
||||||
case 6:
|
|
||||||
return 40;
|
|
||||||
case -1:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
39
src/ip.h
Normal file
39
src/ip.h
Normal 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;
|
||||||
|
}
|
||||||
1028
src/main.c
1028
src/main.c
File diff suppressed because it is too large
Load Diff
14
src/option.c
14
src/option.c
@@ -1,25 +1,23 @@
|
|||||||
#include "common-static.h"
|
#include "common.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "option.h"
|
#include "option.h"
|
||||||
|
#include "str.h"
|
||||||
|
|
||||||
int option_str (void *data, int argc, char **argv)
|
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]);
|
gt_print("option `%s' need a string argument\n", argv[0]);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte_cpy(data, &argv[1], sizeof(argv[1]));
|
memcpy(data, &argv[1], sizeof(argv[1]));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int option_long (void *data, int argc, char **argv)
|
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]);
|
gt_print("option `%s' need an integer argument\n", argv[0]);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -33,7 +31,7 @@ int option_long (void *data, int argc, char **argv)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte_cpy(data, &val, sizeof(val));
|
memcpy(data, &val, sizeof(val));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
62
src/state.c
Normal file
62
src/state.c
Normal 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
4
src/state.h
Normal 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
73
src/str.h
Normal 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;
|
||||||
|
}
|
||||||
15
src/tun.c
15
src/tun.c
@@ -1,7 +1,8 @@
|
|||||||
#include "common-static.h"
|
#include "common.h"
|
||||||
#include "ip-static.h"
|
|
||||||
|
|
||||||
#include "tun.h"
|
#include "tun.h"
|
||||||
|
#include "str.h"
|
||||||
|
#include "ip.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
@@ -36,7 +37,7 @@ static int tun_create_by_id (char *name, size_t size, unsigned id, _unused_ int
|
|||||||
|
|
||||||
struct ctl_info ci;
|
struct ctl_info ci;
|
||||||
|
|
||||||
byte_set(&ci, 0, sizeof(ci));
|
memset(&ci, 0, sizeof(ci));
|
||||||
str_cpy(ci.ctl_name, UTUN_CONTROL_NAME, sizeof(ci.ctl_name)-1);
|
str_cpy(ci.ctl_name, UTUN_CONTROL_NAME, sizeof(ci.ctl_name)-1);
|
||||||
|
|
||||||
if (ioctl(fd, CTLIOCGINFO, &ci)) {
|
if (ioctl(fd, CTLIOCGINFO, &ci)) {
|
||||||
@@ -130,9 +131,9 @@ static int tun_create_by_id (char *name, size_t size, unsigned id, int mq)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int tun_create (char *dev_name, int mq)
|
int tun_create (char *dev_name, char **ret_name, int mq)
|
||||||
{
|
{
|
||||||
char name[64];
|
char name[64] = {0};
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
|
|
||||||
#ifndef IFF_MULTI_QUEUE
|
#ifndef IFF_MULTI_QUEUE
|
||||||
@@ -147,8 +148,8 @@ int tun_create (char *dev_name, int mq)
|
|||||||
fd = tun_create_by_name(name, sizeof(name), dev_name, mq);
|
fd = tun_create_by_name(name, sizeof(name), dev_name, mq);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fd!=-1)
|
if (fd!=-1 && ret_name)
|
||||||
gt_print("tun name: %s\n", name);
|
*ret_name = strdup(name);
|
||||||
|
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,6 @@
|
|||||||
|
|
||||||
#include <unistd.h>
|
#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_read (int, void *, size_t);
|
||||||
ssize_t tun_write (int, const void *, size_t);
|
ssize_t tun_write (int, const void *, size_t);
|
||||||
|
|||||||
12
version.sh
12
version.sh
@@ -1,9 +1,13 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
[ -z "${VERSION}" ] && VERSION=`git describe --tags --always 2>/dev/null` \
|
[ -z "${VERSION}" ] && VERSION=`git describe --tags --match='v[0-9].*' 2>/dev/null` \
|
||||||
&& VERSION=${VERSION#v}
|
&& VERSION=${VERSION#v}
|
||||||
|
|
||||||
[ -z "${VERSION}" ] && VERSION=`basename \`pwd\`` \
|
[ -z "${VERSION}" ] && VERSION=`cat VERSION 2>/dev/null`
|
||||||
&& VERSION=${VERSION#*-}
|
|
||||||
|
|
||||||
printf ${VERSION}
|
[ -z "${VERSION}" ] && VERSION=0.0.0
|
||||||
|
|
||||||
|
[ "$1" = "major" ] && printf ${VERSION%%.*} \
|
||||||
|
&& exit 0
|
||||||
|
|
||||||
|
printf ${VERSION} | tee VERSION
|
||||||
|
|||||||
Reference in New Issue
Block a user