Installing libVFS.so as a generic AppWrapper
This commit is contained in:
parent
9dfefc69a1
commit
02e643a6b8
12
Makefile
12
Makefile
|
@ -1,6 +1,6 @@
|
|||
PACKAGE = VPN
|
||||
VERSION = 0.0.0
|
||||
SUBDIRS = data include src
|
||||
SUBDIRS = include src tools
|
||||
RM ?= rm -f
|
||||
LN ?= ln -f
|
||||
TAR ?= tar -czvf
|
||||
|
@ -21,18 +21,20 @@ dist:
|
|||
$(RM) -r -- $(PACKAGE)-$(VERSION)
|
||||
$(LN) -s -- . $(PACKAGE)-$(VERSION)
|
||||
@$(TAR) $(PACKAGE)-$(VERSION).tar.gz -- \
|
||||
$(PACKAGE)-$(VERSION)/data/Makefile \
|
||||
$(PACKAGE)-$(VERSION)/data/VPN.interface \
|
||||
$(PACKAGE)-$(VERSION)/data/project.conf \
|
||||
$(PACKAGE)-$(VERSION)/include/VPN.h \
|
||||
$(PACKAGE)-$(VERSION)/include/Makefile \
|
||||
$(PACKAGE)-$(VERSION)/include/VPN.interface \
|
||||
$(PACKAGE)-$(VERSION)/include/appbroker.sh \
|
||||
$(PACKAGE)-$(VERSION)/include/project.conf \
|
||||
$(PACKAGE)-$(VERSION)/src/vpn.c \
|
||||
$(PACKAGE)-$(VERSION)/src/main.c \
|
||||
$(PACKAGE)-$(VERSION)/src/Makefile \
|
||||
$(PACKAGE)-$(VERSION)/src/appbroker.sh \
|
||||
$(PACKAGE)-$(VERSION)/src/common.c \
|
||||
$(PACKAGE)-$(VERSION)/src/vpn.h \
|
||||
$(PACKAGE)-$(VERSION)/src/project.conf \
|
||||
$(PACKAGE)-$(VERSION)/tools/libvpn.c \
|
||||
$(PACKAGE)-$(VERSION)/tools/Makefile \
|
||||
$(PACKAGE)-$(VERSION)/tools/project.conf \
|
||||
$(PACKAGE)-$(VERSION)/COPYING \
|
||||
$(PACKAGE)-$(VERSION)/Makefile \
|
||||
$(PACKAGE)-$(VERSION)/config.h \
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
PREFIX = /usr/local
|
||||
DESTDIR =
|
||||
MKDIR ?= mkdir -p
|
||||
INSTALL ?= install
|
||||
RM ?= rm -f
|
||||
|
||||
|
||||
all:
|
||||
|
||||
clean:
|
||||
|
||||
distclean: clean
|
||||
|
||||
install:
|
||||
$(MKDIR) $(DESTDIR)$(PREFIX)/etc/AppInterface
|
||||
$(INSTALL) -m 0644 -- VPN.interface $(DESTDIR)$(PREFIX)/etc/AppInterface/VPN.interface
|
||||
|
||||
uninstall:
|
||||
$(RM) -- $(DESTDIR)$(PREFIX)/etc/AppInterface/VPN.interface
|
||||
|
||||
.PHONY: all clean distclean install uninstall
|
|
@ -1,4 +0,0 @@
|
|||
dist=Makefile,VPN.interface
|
||||
|
||||
[VPN.interface]
|
||||
install=$(PREFIX)/etc/AppInterface
|
|
@ -1,3 +1,7 @@
|
|||
MKDIR ?= mkdir -p
|
||||
INSTALL ?= install
|
||||
RM ?= rm -f
|
||||
TARGETS = VPN.h
|
||||
PREFIX = /usr/local
|
||||
DESTDIR =
|
||||
RM ?= rm -f
|
||||
|
@ -7,17 +11,25 @@ INSTALL ?= install
|
|||
INCLUDEDIR= $(PREFIX)/include
|
||||
|
||||
|
||||
all:
|
||||
all: $(TARGETS)
|
||||
|
||||
VPN.h: VPN.interface
|
||||
./appbroker.sh -P "$(PREFIX)" -- "VPN.h"
|
||||
|
||||
clean:
|
||||
$(RM) -- $(VPN.h_OBJS)
|
||||
|
||||
distclean: clean
|
||||
$(RM) -- $(TARGETS)
|
||||
|
||||
install:
|
||||
install: $(TARGETS)
|
||||
$(MKDIR) $(DESTDIR)$(INCLUDEDIR)
|
||||
$(INSTALL) -m 0644 -- VPN.h $(DESTDIR)$(INCLUDEDIR)/VPN.h
|
||||
$(MKDIR) $(DESTDIR)$(PREFIX)/etc/AppInterface
|
||||
$(INSTALL) -m 0644 -- VPN.interface $(DESTDIR)$(PREFIX)/etc/AppInterface/VPN.interface
|
||||
|
||||
uninstall:
|
||||
$(RM) -- $(DESTDIR)$(INCLUDEDIR)/VPN.h
|
||||
$(RM) -- $(DESTDIR)$(PREFIX)/etc/AppInterface/VPN.interface
|
||||
|
||||
.PHONY: all clean distclean install uninstall
|
||||
|
|
|
@ -1,26 +1,56 @@
|
|||
/* $Id$ */
|
||||
/* Copyright (c) 2010 Pierre Pronchery <khorben@defora.org> */
|
||||
/* This file is part of DeforaOS System VPN */
|
||||
/* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
|
||||
|
||||
#ifndef VPN_VPN_H
|
||||
# define VPN_VPN_H
|
||||
|
||||
# include <stdint.h>
|
||||
# include <System.h>
|
||||
|
||||
|
||||
/* VPN */
|
||||
/* types */
|
||||
typedef enum _VPNProtocol { VPN_PROTOCOL_IP_TCP = 0 } VPNProtocol;
|
||||
typedef Buffer * BUFFER;
|
||||
typedef double * DOUBLE;
|
||||
typedef float * FLOAT;
|
||||
typedef int16_t INT16;
|
||||
typedef int32_t INT32;
|
||||
typedef uint16_t UINT16;
|
||||
typedef uint32_t UINT32;
|
||||
typedef String const * STRING;
|
||||
typedef void VOID;
|
||||
|
||||
typedef BUFFER BUFFER_IN;
|
||||
|
||||
typedef DOUBLE DOUBLE_IN;
|
||||
|
||||
typedef FLOAT FLOAT_IN;
|
||||
typedef INT32 INT32_IN;
|
||||
typedef UINT32 UINT32_IN;
|
||||
typedef STRING STRING_IN;
|
||||
|
||||
typedef Buffer * BUFFER_OUT;
|
||||
typedef int32_t * INT32_OUT;
|
||||
typedef uint32_t * UINT32_OUT;
|
||||
typedef String ** STRING_OUT;
|
||||
|
||||
typedef Buffer * BUFFER_INOUT;
|
||||
typedef int32_t * INT32_INOUT;
|
||||
typedef uint32_t * UINT32_INOUT;
|
||||
typedef String ** STRING_INOUT;
|
||||
|
||||
|
||||
/* constants */
|
||||
# define VPN_PROTOCOL_IP_TCP 0
|
||||
# define VPN_EPERM 1
|
||||
# define VPN_EBADF 9
|
||||
# define VPN_EPROTO 96
|
||||
|
||||
|
||||
/* calls */
|
||||
INT32 VPN_close(INT32 fd);
|
||||
INT32 VPN_connect(UINT32 protocol, STRING name);
|
||||
INT32 VPN_recv(INT32 fd, BUFFER_IN buf, UINT32 size, UINT32 flags);
|
||||
INT32 VPN_send(INT32 fd, BUFFER_OUT buf, UINT32 size, UINT32 flags);
|
||||
|
||||
#endif /* !VPN_VPN_H */
|
||||
|
|
|
@ -2,6 +2,14 @@
|
|||
service=VPN
|
||||
port=4246
|
||||
|
||||
[constants]
|
||||
#protocols
|
||||
PROTOCOL_IP_TCP=0
|
||||
#errno
|
||||
EPERM=1
|
||||
EBADF=9
|
||||
EPROTO=96
|
||||
|
||||
[call::close]
|
||||
ret=INT32
|
||||
arg1=INT32,fd
|
56
include/appbroker.sh
Executable file
56
include/appbroker.sh
Executable file
|
@ -0,0 +1,56 @@
|
|||
#!/bin/sh
|
||||
#$Id$
|
||||
#Copyright (c) 2011 Pierre Pronchery <khorben@defora.org>
|
||||
#All rights reserved.
|
||||
#
|
||||
#Redistribution and use in source and binary forms, with or without
|
||||
#modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice, this
|
||||
# list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
#
|
||||
#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
#AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
#IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
#DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
#FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
#DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
#SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
#CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
#OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
#OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
|
||||
#functions
|
||||
#usage
|
||||
_usage()
|
||||
{
|
||||
echo "Usage: appbroker.sh target" 1>&2
|
||||
return 1
|
||||
}
|
||||
|
||||
|
||||
#main
|
||||
while getopts P: name; do
|
||||
case "$name" in
|
||||
P)
|
||||
#we can ignore it
|
||||
;;
|
||||
?)
|
||||
_usage
|
||||
exit $?
|
||||
;;
|
||||
esac
|
||||
done
|
||||
shift $(($OPTIND - 1))
|
||||
if [ $# -ne 1 ]; then
|
||||
_usage
|
||||
exit $?
|
||||
fi
|
||||
|
||||
APPINTERFACE="${1%%.h}.interface"
|
||||
AppBroker -o "$1" "$APPINTERFACE"
|
|
@ -1,2 +1,11 @@
|
|||
targets=VPN.h
|
||||
includes=VPN.h
|
||||
dist=Makefile
|
||||
dist=Makefile,VPN.interface,appbroker.sh
|
||||
|
||||
[VPN.h]
|
||||
type=script
|
||||
script=./appbroker.sh
|
||||
depends=VPN.interface
|
||||
|
||||
[VPN.interface]
|
||||
install=$(PREFIX)/etc/AppInterface
|
||||
|
|
|
@ -2,5 +2,5 @@ package=VPN
|
|||
version=0.0.0
|
||||
config=h
|
||||
|
||||
subdirs=data,include,src
|
||||
subdirs=include,src,tools
|
||||
dist=COPYING,Makefile,config.h
|
||||
|
|
10
src/Makefile
10
src/Makefile
|
@ -1,4 +1,4 @@
|
|||
TARGETS = ../data/VPN.h VPN
|
||||
TARGETS = ../include/VPN.h VPN
|
||||
PREFIX = /usr/local
|
||||
DESTDIR =
|
||||
BINDIR = $(PREFIX)/bin
|
||||
|
@ -17,8 +17,8 @@ INSTALL ?= install
|
|||
|
||||
all: $(TARGETS)
|
||||
|
||||
../data/VPN.h: ../data/VPN.interface
|
||||
./appbroker.sh -P "$(PREFIX)" -- "../data/VPN.h"
|
||||
../include/VPN.h:
|
||||
../include/appbroker.sh -P "$(PREFIX)" -- "../include/VPN.h"
|
||||
|
||||
VPN_OBJS = vpn.o main.o
|
||||
VPN_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS)
|
||||
|
@ -27,14 +27,14 @@ VPN_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)
|
|||
VPN: $(VPN_OBJS)
|
||||
$(CC) -o VPN $(VPN_OBJS) $(VPN_LDFLAGS)
|
||||
|
||||
vpn.o: vpn.c ../data/VPN.h
|
||||
vpn.o: vpn.c ../include/VPN.h
|
||||
$(CC) $(VPN_CFLAGS) -c vpn.c
|
||||
|
||||
main.o: main.c
|
||||
$(CC) $(VPN_CFLAGS) -c main.c
|
||||
|
||||
clean:
|
||||
$(RM) -- $(../data/VPN.h_OBJS) $(VPN_OBJS)
|
||||
$(RM) -- $(../include/VPN.h_OBJS) $(VPN_OBJS)
|
||||
|
||||
distclean: clean
|
||||
$(RM) -- $(TARGETS)
|
||||
|
|
|
@ -1,16 +1,15 @@
|
|||
targets=../data/VPN.h,VPN
|
||||
targets=../include/VPN.h,VPN
|
||||
cppflags_force=-I ../include
|
||||
cppflags=
|
||||
cflags_force=-W `pkg-config --cflags libApp`
|
||||
cflags=-Wall -g -O2 -pedantic
|
||||
ldflags_force=`pkg-config --libs libApp` -Wl,--export-dynamic
|
||||
ldflags=
|
||||
dist=Makefile,appbroker.sh,vpn.h
|
||||
dist=Makefile,common.c,vpn.h
|
||||
|
||||
[../data/VPN.h]
|
||||
[../include/VPN.h]
|
||||
type=script
|
||||
script=./appbroker.sh
|
||||
depends=../data/VPN.interface
|
||||
script=../include/appbroker.sh
|
||||
|
||||
[VPN]
|
||||
type=binary
|
||||
|
@ -18,4 +17,4 @@ sources=vpn.c,main.c
|
|||
install=$(BINDIR)
|
||||
|
||||
[vpn.c]
|
||||
depends=../data/VPN.h
|
||||
depends=../include/VPN.h
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
#include <System.h>
|
||||
#include "VPN.h"
|
||||
#include "vpn.h"
|
||||
#include "../data/VPN.h"
|
||||
#include "../config.h"
|
||||
|
||||
|
||||
|
@ -39,6 +38,11 @@ typedef struct _VPNClient
|
|||
size_t sockets_cnt;
|
||||
} VPNClient;
|
||||
|
||||
typedef enum _VPNProtocol
|
||||
{
|
||||
VP_IP_TCP = VPN_PROTOCOL_IP_TCP
|
||||
} VPNProtocol;
|
||||
|
||||
|
||||
/* variables */
|
||||
static AppServer * _appserver;
|
||||
|
@ -111,7 +115,7 @@ int32_t VPN_connect(uint32_t protocol, String const * uri)
|
|||
|
||||
switch(vprotocol)
|
||||
{
|
||||
case VPN_PROTOCOL_IP_TCP:
|
||||
case VP_IP_TCP:
|
||||
sdomain = PF_INET;
|
||||
stype = SOCK_STREAM;
|
||||
sa_in.sin_family = AF_INET;
|
||||
|
|
46
tools/Makefile
Normal file
46
tools/Makefile
Normal file
|
@ -0,0 +1,46 @@
|
|||
TARGETS = libVPN.so
|
||||
PREFIX = /usr/local
|
||||
DESTDIR =
|
||||
LIBDIR = $(PREFIX)/lib
|
||||
CC ?= cc
|
||||
CPPFLAGSF= -I ../include
|
||||
CPPFLAGS= -I $(PREFIX)/include
|
||||
CFLAGSF = -W -fPIC `pkg-config --cflags libApp`
|
||||
CFLAGS = -Wall -g -O2 -pedantic
|
||||
LDFLAGSF= `pkg-config --libs libApp`
|
||||
LDFLAGS =
|
||||
AR ?= ar
|
||||
RANLIB ?= ranlib
|
||||
CCSHARED?= $(CC) -shared
|
||||
RM ?= rm -f
|
||||
LN ?= ln -f
|
||||
MKDIR ?= mkdir -p
|
||||
INSTALL ?= install
|
||||
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
libVPN_OBJS = libvpn.o
|
||||
libVPN_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS)
|
||||
libVPN_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)
|
||||
|
||||
libVPN.so: $(libVPN_OBJS)
|
||||
$(CCSHARED) -o libVPN.so $(libVPN_OBJS) $(libVPN_LDFLAGS)
|
||||
|
||||
libvpn.o: libvpn.c ../include/VPN.h
|
||||
$(CC) $(libVPN_CFLAGS) -c libvpn.c
|
||||
|
||||
clean:
|
||||
$(RM) -- $(libVPN_OBJS)
|
||||
|
||||
distclean: clean
|
||||
$(RM) -- $(TARGETS)
|
||||
|
||||
install: $(TARGETS)
|
||||
$(MKDIR) $(DESTDIR)$(PREFIX)/lib/AppWrapper
|
||||
$(INSTALL) -m 0644 -- libVPN.so $(DESTDIR)$(PREFIX)/lib/AppWrapper/libVPN.so
|
||||
|
||||
uninstall:
|
||||
$(RM) -- $(DESTDIR)$(PREFIX)/lib/AppWrapper/libVPN.so
|
||||
|
||||
.PHONY: all clean distclean install uninstall
|
105
tools/libvpn.c
Normal file
105
tools/libvpn.c
Normal file
|
@ -0,0 +1,105 @@
|
|||
/* $Id$ */
|
||||
/* Copyright (c) 2011 Pierre Pronchery <khorben@defora.org> */
|
||||
/* This file is part of DeforaOS System VPN */
|
||||
/* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <dlfcn.h>
|
||||
#include <sys/socket.h>
|
||||
#include <System.h>
|
||||
#include <System/App.h>
|
||||
#include "../src/common.c"
|
||||
|
||||
|
||||
/* libVPN */
|
||||
/* private */
|
||||
/* types */
|
||||
typedef struct _VPNSocket
|
||||
{
|
||||
int fd;
|
||||
} VPNSocket;
|
||||
|
||||
|
||||
/* constants */
|
||||
#define PROGNAME "libVPN"
|
||||
#define VPN_OFFSET 1024
|
||||
|
||||
|
||||
/* variables */
|
||||
static AppClient * _appclient = NULL;
|
||||
|
||||
/* local functions */
|
||||
static int (*old_connect)(int fd, const struct sockaddr * name,
|
||||
socklen_t namelen);
|
||||
|
||||
|
||||
/* prototypes */
|
||||
static void _libvpn_init(void);
|
||||
|
||||
|
||||
/* functions */
|
||||
static void _libvpn_init(void)
|
||||
{
|
||||
static void * hdl = NULL;
|
||||
/* FIXME some symbols may be in libsocket.so instead */
|
||||
static char * libc[] = { "/lib/libc.so", "/lib/libc.so.6" };
|
||||
size_t i;
|
||||
|
||||
if(hdl != NULL)
|
||||
return;
|
||||
for(i = 0; i < sizeof(libc) / sizeof(*libc); i++)
|
||||
if((hdl = dlopen(libc[i], RTLD_LAZY)) != NULL)
|
||||
break;
|
||||
if(hdl == NULL)
|
||||
{
|
||||
fprintf(stderr, "%s: %s\n", PROGNAME, dlerror());
|
||||
exit(1);
|
||||
}
|
||||
if((old_connect = dlsym(hdl, "connect")) == NULL)
|
||||
{
|
||||
fprintf(stderr, "%s: %s\n", PROGNAME, dlerror());
|
||||
dlclose(hdl);
|
||||
exit(1);
|
||||
}
|
||||
dlclose(hdl);
|
||||
if((_appclient = appclient_new("VPN")) == NULL)
|
||||
{
|
||||
error_print(PROGNAME);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* public */
|
||||
/* interface */
|
||||
/* connect */
|
||||
int connect(int fd, const struct sockaddr * name, socklen_t namelen)
|
||||
{
|
||||
int ret;
|
||||
|
||||
_libvpn_init();
|
||||
if(fd < VPN_OFFSET)
|
||||
return old_connect(fd, name, namelen);
|
||||
if(appclient_call(_appclient, &ret, "connect", fd - VPN_OFFSET) != 0)
|
||||
return -1;
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "DEBUG: connect(%d) => %d\n", fd - VFS_OFFSET, ret);
|
||||
#endif
|
||||
if(ret != 0)
|
||||
return _vpn_errno(_vpn_error, _vpn_error_cnt, -ret, 1);
|
||||
return ret;
|
||||
}
|
16
tools/project.conf
Normal file
16
tools/project.conf
Normal file
|
@ -0,0 +1,16 @@
|
|||
targets=libVPN
|
||||
cppflags_force=-I ../include
|
||||
cppflags=-I $(PREFIX)/include
|
||||
cflags_force=-W -fPIC `pkg-config --cflags libApp`
|
||||
cflags=-Wall -g -O2 -pedantic
|
||||
ldflags_force=`pkg-config --libs libApp`
|
||||
ldflags=
|
||||
dist=Makefile
|
||||
|
||||
[libVPN]
|
||||
type=plugin
|
||||
sources=libvpn.c
|
||||
install=$(PREFIX)/lib/AppWrapper
|
||||
|
||||
[libvpn.c]
|
||||
depends=../include/VPN.h
|
Loading…
Reference in New Issue
Block a user