1.5.2-alt0.M80C.1
- backport to c8 branch
This commit is contained in:
parent
5e361f9129
commit
6696a14c22
@ -1,2 +1,4 @@
|
||||
copy: *.c
|
||||
copy: *.hex
|
||||
copy: *.patch
|
||||
tar.xz: vncterm name=vncterm
|
||||
|
@ -1,24 +0,0 @@
|
||||
Fix a buffer overflow on platforms where sizeof(long) > sizeof(int).
|
||||
https://bugs.gentoo.org/show_bug.cgi?id=329031
|
||||
|
||||
--- libvncserver/tightvnc-filetransfer/filetransfermsg.c
|
||||
+++ libvncserver/tightvnc-filetransfer/filetransfermsg.c
|
||||
@@ -393,7 +393,8 @@
|
||||
CreateFileDownloadZeroSizeDataMsg(unsigned long mTime)
|
||||
{
|
||||
FileTransferMsg fileDownloadZeroSizeDataMsg;
|
||||
- int length = sz_rfbFileDownloadDataMsg + sizeof(int);
|
||||
+ uint32_t mTime32 = (uint32_t)mTime;
|
||||
+ int length = sz_rfbFileDownloadDataMsg + sizeof(mTime32);
|
||||
rfbFileDownloadDataMsg *pFDD = NULL;
|
||||
char *pFollow = NULL;
|
||||
|
||||
@@ -413,7 +414,7 @@
|
||||
pFDD->compressedSize = Swap16IfLE(0);
|
||||
pFDD->realSize = Swap16IfLE(0);
|
||||
|
||||
- memcpy(pFollow, &mTime, sizeof(unsigned long));
|
||||
+ memcpy(pFollow, &mTime, sizeof(mTime32));
|
||||
|
||||
fileDownloadZeroSizeDataMsg.data = pData;
|
||||
fileDownloadZeroSizeDataMsg.length = length;
|
@ -2,22 +2,19 @@
|
||||
|
||||
Name: pve-%sname
|
||||
Summary: VNC Terminal Emulator
|
||||
Version: 1.2
|
||||
Release: alt1
|
||||
Version: 1.5.2
|
||||
Release: alt0.M80C.1
|
||||
License: GPLv2
|
||||
Group: Networking/WWW
|
||||
Url: https://git.proxmox.com/
|
||||
Packager: Valery Inozemtsev <shrek@altlinux.ru>
|
||||
|
||||
Source0: %sname.tar.xz
|
||||
Source1: libvncserver-memcpy.patch
|
||||
Source1: wchardata.c
|
||||
Source2: unifont.hex
|
||||
Patch0: %sname-alt.patch
|
||||
Patch1: %sname-gnutls.patch
|
||||
|
||||
|
||||
# Automatically added by buildreq on Mon Mar 21 2016
|
||||
# optimized out: libp11-kit perl-Encode perl-Pod-Escapes perl-Pod-Simple perl-podlators xz
|
||||
BuildRequires: libgnutls-devel libjpeg-devel perl-Pod-Usage zlib-devel
|
||||
BuildRequires: libgnutls-devel libjpeg-devel perl-Pod-Usage zlib-devel libpng-devel
|
||||
|
||||
%description
|
||||
With vncterm you can start commands and export its standard input and
|
||||
@ -26,18 +23,15 @@ output to any VNC client (simulating a xterm Terminal).
|
||||
%prep
|
||||
%setup -q -n %sname
|
||||
%patch0 -p1
|
||||
%patch1 -p1
|
||||
|
||||
cp %SOURCE1 vncpatches/
|
||||
install -m0644 %SOURCE1 .
|
||||
install -m0644 %SOURCE2 .
|
||||
|
||||
%build
|
||||
make %sname
|
||||
make %sname.1
|
||||
%make
|
||||
|
||||
%install
|
||||
install -pD -m0755 %sname %buildroot%_bindir/%sname
|
||||
install -pD -m0644 %sname.1 %buildroot%_man1dir/%sname.1
|
||||
install -pD -m0644 VncViewer.jar %buildroot%_datadir/%sname/VncViewer.jar
|
||||
%make DESTDIR=%buildroot install
|
||||
|
||||
%files
|
||||
%_bindir/%sname
|
||||
@ -45,6 +39,15 @@ install -pD -m0644 VncViewer.jar %buildroot%_datadir/%sname/VncViewer.jar
|
||||
%_man1dir/%sname.1*
|
||||
|
||||
%changelog
|
||||
* Mon Sep 25 2017 Valery Inozemtsev <shrek@altlinux.ru> 1.5.2-alt0.M80C.1
|
||||
- backport to c8 branch
|
||||
|
||||
* Thu Jul 20 2017 Valery Inozemtsev <shrek@altlinux.ru> 1.5.2-alt0.M80P.1
|
||||
- backport to p8 branch
|
||||
|
||||
* Tue Jul 18 2017 Valery Inozemtsev <shrek@altlinux.ru> 1.5.2-alt1
|
||||
- 1.5-2
|
||||
|
||||
* Mon Mar 21 2016 Valery Inozemtsev <shrek@altlinux.ru> 1.2-alt1
|
||||
- initial release
|
||||
|
||||
|
57086
unifont.hex
Normal file
57086
unifont.hex
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,16 +1,25 @@
|
||||
--- vncterm/Makefile.alt 2016-03-21 11:31:51.727559534 +0000
|
||||
+++ vncterm/Makefile 2016-03-21 11:51:50.857533517 +0000
|
||||
@@ -33,11 +33,11 @@ ${VNCLIB} vnc: ${VNCSRC}
|
||||
--- vncterm/Makefile.alt 2017-06-07 14:53:50.000000000 +0300
|
||||
+++ vncterm/Makefile 2017-07-19 10:37:11.678390381 +0300
|
||||
@@ -18,7 +18,7 @@ SNAP=${PACKAGE}-${VERSION}-${CDATE}.tar.
|
||||
all: vncterm
|
||||
|
||||
font.data: genfont2
|
||||
- ./genfont2 -o font.data.tmp -i /usr/share/unifont/unifont.hex
|
||||
+ ./genfont2 -o font.data.tmp -i unifont.hex
|
||||
mv font.data.tmp font.data
|
||||
|
||||
genfont2: genfont2.c
|
||||
@@ -30,11 +30,11 @@ ${VNCLIB}: ${VNCSRC}
|
||||
rm -rf ${VNCDIR}
|
||||
tar xf ${VNCSRC}
|
||||
ln -s ../vncpatches ${VNCDIR}/patches
|
||||
- cd ${VNCDIR}; quilt push -a
|
||||
+ cd ${VNCDIR}; patch -p1 < patches/tls-auth-pluging.patch; patch -p0 < patches/libvncserver-memcpy.patch
|
||||
cd ${VNCDIR}; ./configure;
|
||||
cd ${VNCDIR}; make
|
||||
+ cd ${VNCDIR}; patch -p1 < patches/tls-auth-pluging.patch; patch -p1 < patches/remove-systemd-socket-activation.patch
|
||||
cd ${VNCDIR}; ./autogen.sh --without-ssl --without-websockets --without-tightvnc-filetransfer;
|
||||
cd ${VNCDIR}; $(MAKE)
|
||||
|
||||
-vncterm: vncterm.c glyphs.h ${VNCLIB}
|
||||
+vncterm: vncterm.c ${VNCLIB}
|
||||
gcc -O2 -g -o $@ vncterm.c -Wall -Wno-deprecated-declarations -D_GNU_SOURCE -I ${VNCDIR} ${VNCLIB} -lnsl -lpthread -lz -ljpeg -lutil -lgnutls
|
||||
-vncterm: vncterm.c ${VNCLIB} wchardata.c
|
||||
+vncterm: vncterm.c ${VNCLIB} wchardata.c vncterm.1 font.data
|
||||
gcc -O2 -g -o $@ vncterm.c wchardata.c -Wall -Wno-deprecated-declarations -D_GNU_SOURCE -I ${VNCDIR} ${VNCLIB} -lnsl -lpthread -lz -ljpeg -lutil -lgnutls -lpng
|
||||
|
||||
jar: tigervnc.org
|
||||
wchardata.c:
|
||||
|
@ -1,46 +0,0 @@
|
||||
--- vncterm/vncterm.c.alt 2015-02-27 22:00:46.000000000 +0300
|
||||
+++ vncterm/vncterm.c 2015-12-27 19:57:06.000000000 +0300
|
||||
@@ -485,41 +485,8 @@
|
||||
return;
|
||||
}
|
||||
|
||||
- /* optimize for speed */
|
||||
- static const int cipher_priority_performance[] = {
|
||||
- GNUTLS_CIPHER_ARCFOUR_128,
|
||||
- GNUTLS_CIPHER_AES_128_CBC,
|
||||
- GNUTLS_CIPHER_3DES_CBC, 0
|
||||
- };
|
||||
-
|
||||
- if ((ret = gnutls_cipher_set_priority(sd->session, cipher_priority_performance)) < 0) {
|
||||
- rfbLog("gnutls_cipher_set_priority failed: %s\n", gnutls_strerror(ret));
|
||||
- sd->session = NULL;
|
||||
- rfbCloseClient(cl);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- static const int kx_anon[] = {GNUTLS_KX_ANON_DH, 0};
|
||||
- static const int kx_x509[] = {GNUTLS_KX_DHE_DSS, GNUTLS_KX_RSA, GNUTLS_KX_DHE_RSA, GNUTLS_KX_SRP, 0};
|
||||
- if ((ret = gnutls_kx_set_priority(sd->session, use_x509 ? kx_x509 : kx_anon)) < 0) {
|
||||
- rfbLog("gnutls_kx_set_priority failed: %s\n", gnutls_strerror(ret));
|
||||
- sd->session = NULL;
|
||||
- rfbCloseClient(cl);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- static const int cert_type_priority[] = { GNUTLS_CRT_X509, 0 };
|
||||
- if ((ret = gnutls_certificate_type_set_priority(sd->session, cert_type_priority)) < 0) {
|
||||
- rfbLog("gnutls_certificate_type_set_priority failed: %s\n",
|
||||
- gnutls_strerror(ret));
|
||||
- sd->session = NULL;
|
||||
- rfbCloseClient(cl);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- static const int protocol_priority[]= { GNUTLS_TLS1_1, GNUTLS_TLS1_0, GNUTLS_SSL3, 0 };
|
||||
- if ((ret = gnutls_protocol_set_priority(sd->session, protocol_priority)) < 0) {
|
||||
- rfbLog("gnutls_protocol_set_priority failed: %s\n",
|
||||
+ if ((ret = gnutls_priority_set_direct(sd->session, "NORMAL:+ANON-ECDH:+ANON-DH", NULL)) < 0) {
|
||||
+ rfbLog("gnutls_priority_set_direct failed: %s\n",
|
||||
gnutls_strerror(ret));
|
||||
sd->session = NULL;
|
||||
rfbCloseClient(cl);
|
BIN
vncterm/LibVNCServer-0.9.11.tar.gz
Normal file
BIN
vncterm/LibVNCServer-0.9.11.tar.gz
Normal file
Binary file not shown.
Binary file not shown.
106
vncterm/Makefile
106
vncterm/Makefile
@ -1,76 +1,55 @@
|
||||
RELEASE=4.0
|
||||
|
||||
PACKAGE=vncterm
|
||||
# Note: also change version in debian/control and debian/changelog
|
||||
VERSION=1.2
|
||||
PACKAGERELEASE=1
|
||||
VERSION=1.5
|
||||
PACKAGERELEASE=2
|
||||
ARCH:=$(shell dpkg-architecture -qDEB_BUILD_ARCH)
|
||||
GITVERSION:=$(shell cat .git/refs/heads/master)
|
||||
CDATE:=$(shell date +%F)
|
||||
|
||||
VNCVER=0.9.7
|
||||
VNCDIR=LibVNCServer-${VNCVER}
|
||||
VNCSRC=${VNCDIR}.tar.gz
|
||||
VNCVER=0.9.11
|
||||
VNCREL=LibVNCServer-${VNCVER}
|
||||
VNCDIR=libvncserver-${VNCREL}
|
||||
VNCSRC=${VNCREL}.tar.gz
|
||||
VNCLIB=${VNCDIR}/libvncserver/.libs/libvncserver.a
|
||||
|
||||
TIGERVNCSRC=tigervnc-1.1.0.tgz
|
||||
#TIGERVNCSRC=tigervnc-1.2.0.tgz
|
||||
|
||||
DEB=${PACKAGE}_${VERSION}-${PACKAGERELEASE}_${ARCH}.deb
|
||||
SNAP=${PACKAGE}-${VERSION}-${CDATE}.tar.gz
|
||||
|
||||
KEYSTORE=/home/dietmar/pve2-proxdev/proxmox-dev/comodo-for-java.keystore
|
||||
|
||||
all: vncterm
|
||||
|
||||
glyphs.h: genfont
|
||||
./genfont > glyphs.h
|
||||
font.data: genfont2
|
||||
./genfont2 -o font.data.tmp -i /usr/share/unifont/unifont.hex
|
||||
mv font.data.tmp font.data
|
||||
|
||||
genfont: genfont.c
|
||||
gcc -g -O2 -o $@ genfont.c -Wall -D_GNU_SOURCE -lz
|
||||
genfont2: genfont2.c
|
||||
gcc -g -O2 -o $@ genfont2.c -Wall -Wextra -D_GNU_SOURCE -lz
|
||||
|
||||
.PHONY: vnc
|
||||
${VNCLIB} vnc: ${VNCSRC}
|
||||
vnc: ${VNCLIB}
|
||||
${VNCLIB}: ${VNCSRC}
|
||||
rm -rf ${VNCDIR}
|
||||
tar xf ${VNCSRC}
|
||||
ln -s ../vncpatches ${VNCDIR}/patches
|
||||
cd ${VNCDIR}; quilt push -a
|
||||
cd ${VNCDIR}; ./configure;
|
||||
cd ${VNCDIR}; make
|
||||
cd ${VNCDIR}; ./autogen.sh --without-ssl --without-websockets --without-tightvnc-filetransfer;
|
||||
cd ${VNCDIR}; $(MAKE)
|
||||
|
||||
vncterm: vncterm.c glyphs.h ${VNCLIB}
|
||||
gcc -O2 -g -o $@ vncterm.c -Wall -Wno-deprecated-declarations -D_GNU_SOURCE -I ${VNCDIR} ${VNCLIB} -lnsl -lpthread -lz -ljpeg -lutil -lgnutls
|
||||
vncterm: vncterm.c ${VNCLIB} wchardata.c
|
||||
gcc -O2 -g -o $@ vncterm.c wchardata.c -Wall -Wno-deprecated-declarations -D_GNU_SOURCE -I ${VNCDIR} ${VNCLIB} -lnsl -lpthread -lz -ljpeg -lutil -lgnutls -lpng
|
||||
|
||||
jar: tigervnc.org
|
||||
if test ! -f /usr/share/icedtea-web/plugin.jar; then echo "please install package icedtea-netx-common"; exit 1; fi
|
||||
rm -rf tigervnc VncViewer.jar
|
||||
rsync -av --exclude .svn --exclude .svnignore tigervnc.org/ tigervnc
|
||||
ln -s ../tigerpatches tigervnc/patches
|
||||
cd tigervnc; quilt push -a
|
||||
cd tigervnc/java/src/com/tigervnc/vncviewer; make clean; make
|
||||
jarsigner -keystore ${KEYSTORE} -signedjar VncViewer.jar tigervnc/java/src/com/tigervnc/vncviewer/VncViewer.jar "dc475d72-124a-11e4-a53f-005056c00008"
|
||||
|
||||
# this is for version 1.2
|
||||
# ln -s ../newtigerpatches tigervnc/patches
|
||||
# cd tigervnc/java;cmake -G "Unix Makefiles"; make
|
||||
# jarsigner -keystore ${KEYSTORE} -signedjar VncViewer.jar tigervnc/java/VncViewer.jar proxmox
|
||||
|
||||
tigervnc.org: ${TIGERVNCSRC}
|
||||
rm -rf tigervnc.org
|
||||
tar xf ${TIGERVNCSRC}
|
||||
|
||||
download:
|
||||
rm -rf tigervnc.org
|
||||
svn co https://tigervnc.svn.sourceforge.net/svnroot/tigervnc/tags/1_1_0 tigervnc.org
|
||||
tar cf ${TIGERVNCSRC} tigervnc.org
|
||||
wchardata.c:
|
||||
cp /usr/share/unifont/$@ $@
|
||||
|
||||
.PHONY: install
|
||||
install: vncterm vncterm.1 VncViewer.jar
|
||||
install: vncterm vncterm.1 font.data
|
||||
mkdir -p ${DESTDIR}/usr/share/doc/${PACKAGE}
|
||||
install -m 0644 copyright ${DESTDIR}/usr/share/doc/${PACKAGE}
|
||||
mkdir -p ${DESTDIR}/usr/share/${PACKAGE}
|
||||
install -m 0644 font.data ${DESTDIR}/usr/share/${PACKAGE}
|
||||
mkdir -p ${DESTDIR}/usr/share/man/man1
|
||||
install -m 0644 vncterm.1 ${DESTDIR}/usr/share/man/man1
|
||||
mkdir -p ${DESTDIR}/usr/bin
|
||||
install -s -m 0755 vncterm ${DESTDIR}/usr/bin
|
||||
mkdir -p ${DESTDIR}/usr/share/vncterm/
|
||||
install -m 0644 VncViewer.jar ${DESTDIR}/usr/share/vncterm/
|
||||
|
||||
.PHONY: dinstall
|
||||
dinstall: ${DEB}
|
||||
@ -81,42 +60,25 @@ vncterm.1: vncterm.pod
|
||||
pod2man -n $< -s 1 -r ${VERSION} <$< >$@
|
||||
|
||||
.PHONY: deb
|
||||
${DEB} deb:
|
||||
make clean
|
||||
rm -rf dest
|
||||
mkdir dest
|
||||
make DESTDIR=`pwd`/dest install
|
||||
install -d -m 0755 dest/DEBIAN
|
||||
install -m 0644 debian/control dest/DEBIAN
|
||||
echo "Architecture: ${ARCH}" >>dest/DEBIAN/control
|
||||
install -m 0644 debian/conffiles dest/DEBIAN
|
||||
install -m 0644 copyright dest/usr/share/doc/${PACKAGE}
|
||||
install -m 0644 vncterm.1 dest/usr/share/man/man1
|
||||
install -m 0644 debian/changelog.Debian dest/usr/share/doc/${PACKAGE}
|
||||
gzip --best dest/usr/share/man/*/*
|
||||
gzip --best dest/usr/share/doc/${PACKAGE}/changelog.Debian
|
||||
dpkg-deb --build dest
|
||||
mv dest.deb ${DEB}
|
||||
rm -rf dest
|
||||
deb: $(DEB)
|
||||
${DEB}:
|
||||
$(MAKE) clean
|
||||
rsync -a . --exclude build build
|
||||
echo "Architecture: ${ARCH}" >> build/debian/control
|
||||
echo "git clone git://git.proxmox.com/git/vncterm.git\\ngit checkout ${GIVERSION}" > build/debian/SOURCE
|
||||
cd build; dpkg-buildpackage -rfakeroot -b -us -uc
|
||||
lintian ${DEB}
|
||||
|
||||
.PHONY: upload
|
||||
upload: ${DEB}
|
||||
umount /pve/${RELEASE}; mount /pve/${RELEASE} -o rw
|
||||
mkdir -p /pve/${RELEASE}/extra
|
||||
rm -f /pve/${RELEASE}/extra/${PACKAGE}_*.deb
|
||||
rm -f /pve/${RELEASE}/extra/Packages*
|
||||
cp ${DEB} /pve/${RELEASE}/extra
|
||||
cd /pve/${RELEASE}/extra; dpkg-scanpackages . /dev/null > Packages; gzip -9c Packages > Packages.gz
|
||||
umount /pve/${RELEASE}; mount /pve/${RELEASE} -o ro
|
||||
tar cf - ${DEB} | ssh -X repoman@repo.proxmox.com -- upload --product pmg,pve --dist stretch
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -rf vncterm vncterm.1 vncterm_*.deb tigervnc *~ ${VNCDIR} vncterm-*.tar.gz
|
||||
rm -rf vncterm vncterm.1 vncterm_*.deb genfont genfont2 *~ ${VNCDIR} vncterm-*.tar.gz glyph.h.tmp build *.changes wchardata.c font.data.tmp font.data *.buildinfo
|
||||
|
||||
.PHONY: distclean
|
||||
distclean: clean
|
||||
rm -rf tigervnc.org
|
||||
|
||||
.PHONY: dist
|
||||
${SNAP} dist: distclean
|
||||
|
Binary file not shown.
@ -1,3 +1,55 @@
|
||||
vncterm (1.5-2) unstable; urgency=medium
|
||||
|
||||
* replaced pure plack cursor with a more visible pointer with white edges
|
||||
|
||||
-- Proxmox Support Team <support@proxmox.com> Wed, 07 Jun 2017 13:53:17 +0200
|
||||
|
||||
vncterm (1.5-1) unstable; urgency=medium
|
||||
|
||||
* use unifont to support more glyphs (range 0x0000..0xFFFF)
|
||||
|
||||
* support wide characters
|
||||
|
||||
* support combining glyphs
|
||||
|
||||
-- Proxmox Support Team <support@proxmox.com> Wed, 24 May 2017 13:12:55 +0200
|
||||
|
||||
vncterm (1.4-2) unstable; urgency=medium
|
||||
|
||||
* fix bound checking on cursor move
|
||||
|
||||
-- Proxmox Support Team <support@proxmox.com> Sat, 06 May 2017 08:09:29 +0200
|
||||
|
||||
vncterm (1.4-1) unstable; urgency=medium
|
||||
|
||||
* recompile for Debian Stretch / PVE 5
|
||||
|
||||
-- Proxmox Support Team <support@proxmox.com> Fri, 10 Mar 2017 10:19:48 +0100
|
||||
|
||||
vncterm (1.3-2) unstable; urgency=medium
|
||||
|
||||
* bound check utf8 characters
|
||||
|
||||
* detect empty first parameter of escape codes
|
||||
|
||||
-- Proxmox Support Team <support@proxmox.com> Fri, 10 Mar 2017 10:11:00 +0100
|
||||
|
||||
vncterm (1.3-1) unstable; urgency=low
|
||||
|
||||
* update cipher suites to GnuTLS's NORMAL
|
||||
|
||||
* allow building with GnuTLS 3.5
|
||||
|
||||
* update LibVNCServer to 0.9.11
|
||||
|
||||
-- Proxmox Support Team <support@proxmox.com> Fri, 3 Feb 2017 08:52:31 +0100
|
||||
|
||||
vncterm (1.2-1) unstable; urgency=low
|
||||
|
||||
* recompile for Debian Jessie / PVE 4
|
||||
|
||||
-- Proxmox Support Team <support@proxmox.com> Fri, 27 Feb 2015 20:00:46 +0100
|
||||
|
||||
vncterm (1.1-8) unstable; urgency=low
|
||||
|
||||
* update applet signature (new code signing cert)
|
1
vncterm/debian/compat
Normal file
1
vncterm/debian/compat
Normal file
@ -0,0 +1 @@
|
||||
9
|
@ -1,9 +1,19 @@
|
||||
Source: vncterm
|
||||
Maintainer: Proxmox Support Team <support@proxmox.com>
|
||||
Build-Depends:
|
||||
debhelper (>= 8.0.0),
|
||||
zlib1g-dev,
|
||||
libjpeg-dev,
|
||||
libpng-dev,
|
||||
libglib2.0-dev,
|
||||
libgnutls28-dev,
|
||||
unifont
|
||||
Standards-Version: 3.9.3
|
||||
|
||||
Package: vncterm
|
||||
Version: 1.2-1
|
||||
Section: x11
|
||||
Priority: optional
|
||||
Depends: libc6 (>= 2.7-18), libjpeg62, zlib1g (>= 1:1.2.1),libgnutls-deb0-28
|
||||
Maintainer: Proxmox Support Team <support@proxmox.com>
|
||||
Depends: libc6 (>= 2.7-18), libjpeg62, zlib1g (>= 1:1.2.1), libgnutls-deb0-28 | libgnutls30, libpng16-16, ${shlibs:Depends}
|
||||
Description: VNC Terminal Emulator
|
||||
With vncterm you can start commands and export its standard input and
|
||||
output to any VNC client (simulating a xterm Terminal).
|
||||
|
1
vncterm/debian/docs
Normal file
1
vncterm/debian/docs
Normal file
@ -0,0 +1 @@
|
||||
debian/SOURCE
|
4
vncterm/debian/rules
Executable file
4
vncterm/debian/rules
Executable file
@ -0,0 +1,4 @@
|
||||
#!/usr/bin/make -f
|
||||
|
||||
%:
|
||||
dh $@
|
@ -84,7 +84,7 @@ load_psf_font (const char *filename, int is_default)
|
||||
{
|
||||
struct psf_header psfhdr;
|
||||
|
||||
gzFile *f = gzopen (filename, "rb");
|
||||
gzFile f = gzopen(filename, "rb");
|
||||
if (f == NULL) {
|
||||
fprintf (stderr, "unable to read file %s\n", filename);
|
||||
exit(-1);
|
||||
|
184
vncterm/genfont2.c
Normal file
184
vncterm/genfont2.c
Normal file
@ -0,0 +1,184 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2017 Proxmox Server Solutions GmbH
|
||||
|
||||
Copyright: vncterm is under GNU GPL, the GNU General Public License.
|
||||
|
||||
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 2 dated June, 1991.
|
||||
|
||||
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, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA.
|
||||
|
||||
Author: Dominik Csapak <d.csapak@proxmox.com>
|
||||
|
||||
This tool converts the unifont.hex file format into
|
||||
a binary format used in vncterm to render glyphs.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <inttypes.h>
|
||||
#include <errno.h>
|
||||
#include <getopt.h>
|
||||
|
||||
#define NUMCODEPOINTS 0xFFFF
|
||||
#define GLYPHLINES 16
|
||||
#define INDEXLENGTH 4
|
||||
|
||||
/* parses strings like 00F0 to the integer */
|
||||
long
|
||||
parsehex(char *val, size_t length)
|
||||
{
|
||||
unsigned int value = 0;
|
||||
|
||||
for (size_t i = 0; i < length; i++) {
|
||||
value *= 16;
|
||||
if (val[i] >= '0' && val[i] <= '9') {
|
||||
value += (val[i] - '0');
|
||||
} else if (val[i] >= 'A' && val[i] <= 'F') {
|
||||
value += (val[i] - 'A' + 10);
|
||||
} else if (val[i] >= 'a' && val[i] <= 'f') {
|
||||
value += (val[i] - 'a' + 10);
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
void usage(char **argv) {
|
||||
printf("Usage: %s [OPTION]...\n", argv[0]);
|
||||
printf("Converts font data from hex format into binary format used by vncterm.\n");
|
||||
|
||||
printf("\n");
|
||||
printf(" -o, --output file for output, if omitted, write to STDOUT\n");
|
||||
printf(" -i, --input file for input, if omitted read from STDIN\n");
|
||||
printf(" -h, --help display this help\n");
|
||||
|
||||
printf("\nThe input has to be formatted in the hex format of unifont.\n");
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char** argv)
|
||||
{
|
||||
FILE *fd;
|
||||
FILE *outfd;
|
||||
char *line = NULL;
|
||||
char *tmp = NULL;
|
||||
char *fontfile = NULL;
|
||||
char *outfile = NULL;
|
||||
size_t linesize = 0;
|
||||
uint8_t emptyglyph[GLYPHLINES*2] = { 0 };
|
||||
uint8_t glyph[GLYPHLINES*2] = { 0 };
|
||||
int nextcodepoint = 0;
|
||||
int codepoint = 0;
|
||||
int c;
|
||||
|
||||
static struct option long_options[] = {
|
||||
{"help", no_argument, 0, 'h'},
|
||||
{"output", required_argument, 0, 'o'},
|
||||
{"input", required_argument, 0, 'i'},
|
||||
{ 0 , 0, 0, 0}
|
||||
};
|
||||
int option_index = 0;
|
||||
|
||||
while((c = getopt_long(argc, argv, "hi:o:", long_options, &option_index)) != -1) {
|
||||
switch (c) {
|
||||
case 'h':
|
||||
usage(argv);
|
||||
exit(0);
|
||||
break;
|
||||
case 'o':
|
||||
outfile = optarg;
|
||||
break;
|
||||
case 'i':
|
||||
fontfile = optarg;
|
||||
break;
|
||||
default:
|
||||
usage(argv);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
if (fontfile != NULL){
|
||||
fd = fopen(fontfile, "r");
|
||||
if (fd == NULL) {
|
||||
fprintf(stderr, "Error opening '%s'\n", fontfile);
|
||||
perror(NULL);
|
||||
exit(2);
|
||||
}
|
||||
} else {
|
||||
fd = stdin;
|
||||
}
|
||||
|
||||
if (outfile != NULL) {
|
||||
outfd = fopen(outfile, "w");
|
||||
if (outfd == NULL) {
|
||||
fprintf(stderr, "Error opening '%s'\n", outfile);
|
||||
perror(NULL);
|
||||
exit(2);
|
||||
}
|
||||
} else {
|
||||
outfd = stdout;
|
||||
}
|
||||
|
||||
|
||||
while (getline(&line, &linesize, fd) != -1) {
|
||||
codepoint = parsehex(line, INDEXLENGTH);
|
||||
if (codepoint == -1) {
|
||||
fprintf(stderr, "Cannot parse codepoint index: '%s'\n", line);
|
||||
free(line);
|
||||
exit(4);
|
||||
}
|
||||
|
||||
/* fill in missing codepoints with empty glyphs */
|
||||
while (nextcodepoint++ < codepoint) {
|
||||
fwrite(emptyglyph, sizeof(emptyglyph), 1, outfd);
|
||||
}
|
||||
|
||||
tmp = line + INDEXLENGTH + 1;
|
||||
size_t i = 0;
|
||||
|
||||
/* parse until end of line */
|
||||
while (*(tmp+i*2) != '\n' && i < sizeof(glyph)) {
|
||||
int value = parsehex(tmp+i*2, 2);
|
||||
|
||||
if (value == -1) {
|
||||
fprintf(stderr, "Cannot parse glyph from line: '%s' at position %ld ('%s')\n", line, i*2, tmp+i*2);
|
||||
free(line);
|
||||
exit(4);
|
||||
}
|
||||
|
||||
glyph[i++] = (uint8_t)value;
|
||||
}
|
||||
|
||||
/* if we have a 1width glyph, fill the rest with zeroes */
|
||||
while (i < sizeof(glyph)) {
|
||||
glyph[i++] = 0;
|
||||
}
|
||||
|
||||
fwrite(glyph, sizeof(glyph), 1, outfd);
|
||||
}
|
||||
|
||||
if(errno) {
|
||||
perror("Cannot not read line from file");
|
||||
}
|
||||
|
||||
while (nextcodepoint++ <= NUMCODEPOINTS) {
|
||||
fwrite(emptyglyph, sizeof(emptyglyph), 1, outfd);
|
||||
}
|
||||
|
||||
free(line);
|
||||
exit(0);
|
||||
}
|
@ -1,75 +0,0 @@
|
||||
Index: new/java/com/tigervnc/rfb/CSecurityTLS.java
|
||||
===================================================================
|
||||
--- new.orig/java/com/tigervnc/rfb/CSecurityTLS.java 2013-04-18 11:56:22.000000000 +0200
|
||||
+++ new/java/com/tigervnc/rfb/CSecurityTLS.java 2013-04-18 13:59:03.000000000 +0200
|
||||
@@ -25,6 +25,7 @@
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.io.FileInputStream;
|
||||
+import java.io.ByteArrayInputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import javax.swing.JOptionPane;
|
||||
@@ -34,6 +35,9 @@
|
||||
|
||||
public class CSecurityTLS extends CSecurity {
|
||||
|
||||
+ public static StringParameter PVECert
|
||||
+ = new StringParameter("PVECert",
|
||||
+ "Proxmox VE CA certificate", "");
|
||||
public static StringParameter x509ca
|
||||
= new StringParameter("x509ca",
|
||||
"X509 CA certificate", "");
|
||||
@@ -92,6 +96,8 @@
|
||||
{
|
||||
anon = _anon;
|
||||
setDefaults();
|
||||
+
|
||||
+ pvecert = PVECert.getData();
|
||||
cafile = x509ca.getData();
|
||||
crlfile = x509crl.getData();
|
||||
}
|
||||
@@ -170,10 +176,15 @@
|
||||
CertificateFactory cf = CertificateFactory.getInstance("X.509");
|
||||
try {
|
||||
ks.load(null, null);
|
||||
- File cacert = new File(cafile);
|
||||
- if (!cacert.exists() || !cacert.canRead())
|
||||
- return;
|
||||
- InputStream caStream = new FileInputStream(cafile);
|
||||
+ InputStream caStream;
|
||||
+ if (pvecert != null) {
|
||||
+ caStream = new ByteArrayInputStream(pvecert.getBytes("ISO-8859-1"));
|
||||
+ } else {
|
||||
+ File cacert = new File(cafile);
|
||||
+ if (!cacert.exists() || !cacert.canRead())
|
||||
+ return;
|
||||
+ caStream = new FileInputStream(cafile);
|
||||
+ }
|
||||
X509Certificate ca = (X509Certificate)cf.generateCertificate(caStream);
|
||||
ks.setCertificateEntry("CA", ca);
|
||||
PKIXBuilderParameters params = new PKIXBuilderParameters(ks, new X509CertSelector());
|
||||
@@ -241,6 +252,7 @@
|
||||
private boolean anon;
|
||||
private SSLSession session;
|
||||
private String cafile, crlfile;
|
||||
+ private String pvecert;
|
||||
private InStream is;
|
||||
private SSLSocket ssl;
|
||||
|
||||
Index: new/java/com/tigervnc/vncviewer/VncViewer.java
|
||||
===================================================================
|
||||
--- new.orig/java/com/tigervnc/vncviewer/VncViewer.java 2013-04-18 11:56:21.000000000 +0200
|
||||
+++ new/java/com/tigervnc/vncviewer/VncViewer.java 2013-04-18 13:56:33.000000000 +0200
|
||||
@@ -168,6 +168,11 @@
|
||||
if (firstApplet) {
|
||||
alwaysShowServerDialog.setParam(true);
|
||||
Configuration.readAppletParams(this);
|
||||
+ String tmpcert = this.getParameter("PVECert");
|
||||
+ if (tmpcert != null) {
|
||||
+ CSecurityTLS.PVECert.setParam(tmpcert.replace('|', '\n'));
|
||||
+ }
|
||||
+
|
||||
String host = getCodeBase().getHost();
|
||||
if (vncServerName.getValue() == null && vncServerPort.getValue() != 0) {
|
||||
int port = vncServerPort.getValue();
|
@ -1,50 +0,0 @@
|
||||
Index: new/java/com/tigervnc/vncviewer/CConn.java
|
||||
===================================================================
|
||||
--- new.orig/java/com/tigervnc/vncviewer/CConn.java 2013-04-18 11:56:21.000000000 +0200
|
||||
+++ new/java/com/tigervnc/vncviewer/CConn.java 2013-04-18 14:23:58.000000000 +0200
|
||||
@@ -246,6 +246,16 @@
|
||||
String passwordFileStr = viewer.passwordFile.getValue();
|
||||
PasswdDialog dlg;
|
||||
|
||||
+ String usernameParam = viewer.usernameParam.getValue();
|
||||
+ String passwordParam = viewer.passwordParam.getValue();
|
||||
+ vlog.info("USERNAME: " + usernameParam);
|
||||
+ vlog.info("PASSWORD: " + passwordParam);
|
||||
+ if (usernameParam != null && passwordParam != null) {
|
||||
+ user.append(usernameParam);
|
||||
+ passwd.append(passwordParam);
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
if (user == null && passwordFileStr != "") {
|
||||
InputStream fp = null;
|
||||
try {
|
||||
Index: new/java/com/tigervnc/vncviewer/VncViewer.java
|
||||
===================================================================
|
||||
--- new.orig/java/com/tigervnc/vncviewer/VncViewer.java 2013-04-18 13:56:33.000000000 +0200
|
||||
+++ new/java/com/tigervnc/vncviewer/VncViewer.java 2013-04-19 07:52:32.000000000 +0200
|
||||
@@ -168,6 +168,9 @@
|
||||
if (firstApplet) {
|
||||
alwaysShowServerDialog.setParam(true);
|
||||
Configuration.readAppletParams(this);
|
||||
+
|
||||
+ System.err.print(Configuration.listParams());
|
||||
+
|
||||
String tmpcert = this.getParameter("PVECert");
|
||||
if (tmpcert != null) {
|
||||
CSecurityTLS.PVECert.setParam(tmpcert.replace('|', '\n'));
|
||||
@@ -263,6 +266,14 @@
|
||||
"Password file for VNC authentication", "");
|
||||
AliasParameter passwd
|
||||
= new AliasParameter("passwd", "Alias for PasswordFile", passwordFile);
|
||||
+
|
||||
+ StringParameter usernameParam
|
||||
+ = new StringParameter("USERNAME",
|
||||
+ "Username for VNC authentication", null);
|
||||
+ StringParameter passwordParam
|
||||
+ = new StringParameter("PASSWORD",
|
||||
+ "Password for VNC authentication", null);
|
||||
+
|
||||
BoolParameter autoSelect
|
||||
= new BoolParameter("AutoSelect",
|
||||
"Auto select pixel format and encoding", true);
|
@ -1,2 +0,0 @@
|
||||
add-pvecert-parameter.patch
|
||||
add-username-param.patch
|
@ -1,43 +0,0 @@
|
||||
Index: new/java/src/com/tigervnc/vncviewer/VncViewer.java
|
||||
===================================================================
|
||||
--- new.orig/java/src/com/tigervnc/vncviewer/VncViewer.java 2011-01-25 07:44:23.000000000 +0100
|
||||
+++ new/java/src/com/tigervnc/vncviewer/VncViewer.java 2011-01-28 13:26:16.000000000 +0100
|
||||
@@ -466,6 +466,38 @@
|
||||
}
|
||||
}
|
||||
|
||||
+ public void sendRefreshRequest()
|
||||
+ {
|
||||
+ if (rfb == null)
|
||||
+ return;
|
||||
+
|
||||
+ try {
|
||||
+ rfb.writeFramebufferUpdateRequest(0, 0, rfb.framebufferWidth,
|
||||
+ rfb.framebufferHeight, false);
|
||||
+ } catch (IOException e) {
|
||||
+ e.printStackTrace();
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ public void sendCtrlAltDel()
|
||||
+ {
|
||||
+ if (rfb == null)
|
||||
+ return;
|
||||
+
|
||||
+ int modifiers = InputEvent.CTRL_MASK | InputEvent.ALT_MASK;
|
||||
+
|
||||
+ try {
|
||||
+ KeyEvent ctrlAltDelEvent =
|
||||
+ new KeyEvent(this, KeyEvent.KEY_PRESSED, 0, modifiers, 127);
|
||||
+ rfb.writeKeyEvent(ctrlAltDelEvent);
|
||||
+
|
||||
+ ctrlAltDelEvent =
|
||||
+ new KeyEvent(this, KeyEvent.KEY_RELEASED, 0, modifiers, 127);
|
||||
+ rfb.writeKeyEvent(ctrlAltDelEvent);
|
||||
+ } catch (IOException e) {
|
||||
+ e.printStackTrace();
|
||||
+ }
|
||||
+ }
|
||||
|
||||
//
|
||||
// Show an authentication panel.
|
@ -1,13 +0,0 @@
|
||||
Index: new/java/src/com/tigervnc/vncviewer/Makefile
|
||||
===================================================================
|
||||
--- new.orig/java/src/com/tigervnc/vncviewer/Makefile 2013-04-20 15:24:59.000000000 +0200
|
||||
+++ new/java/src/com/tigervnc/vncviewer/Makefile 2013-04-20 15:31:48.000000000 +0200
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
CP = cp
|
||||
JC = javac
|
||||
-JCFLAGS = -target 1.5 -classpath ../../../
|
||||
+JCFLAGS = -target 1.7 -classpath ../../../
|
||||
JAR = jar
|
||||
ARCHIVE = VncViewer.jar
|
||||
MANIFEST = MANIFEST.MF
|
@ -1,35 +0,0 @@
|
||||
Sources found at http://dogfeathers.com/mark/java7issue.html
|
||||
|
||||
Index: tigervnc.new/java/src/com/tigervnc/vncviewer/VncViewer.java
|
||||
===================================================================
|
||||
--- tigervnc.new.orig/java/src/com/tigervnc/vncviewer/VncViewer.java 2012-08-21 09:05:04.000000000 +0200
|
||||
+++ tigervnc.new/java/src/com/tigervnc/vncviewer/VncViewer.java 2012-08-21 09:10:27.000000000 +0200
|
||||
@@ -110,6 +110,28 @@
|
||||
|
||||
public void init() {
|
||||
|
||||
+ // fix focus traversal
|
||||
+ Container topParent = null;
|
||||
+ Container parent = this;
|
||||
+ // The natural thing would be to call getParent() until it returns
|
||||
+ // null, but then you would be looping for a long time, since
|
||||
+ // PluginEmbeddedFrame's getParent() returns itself.
|
||||
+ for (int k=0; k < 10; k++) {
|
||||
+ topParent = parent;
|
||||
+ parent = parent.getParent();
|
||||
+ if (parent == null) break;
|
||||
+ }
|
||||
+
|
||||
+ // If topParent isn't a KeyEventDispatcher then we must be in some
|
||||
+ // Plugin version that doesn't need the workaround.
|
||||
+ try {
|
||||
+ KeyEventDispatcher ked = (KeyEventDispatcher)topParent;
|
||||
+ KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
|
||||
+ // You have to remove it twice, otherwise the problem isn't fixed
|
||||
+ kfm.removeKeyEventDispatcher(ked);
|
||||
+ kfm.removeKeyEventDispatcher(ked);
|
||||
+ } catch (ClassCastException e) {}
|
||||
+
|
||||
readParameters();
|
||||
|
||||
refApplet = this;
|
@ -1,111 +0,0 @@
|
||||
Index: new/java/src/com/tigervnc/vncviewer/VncViewer.java
|
||||
===================================================================
|
||||
--- new.orig/java/src/com/tigervnc/vncviewer/VncViewer.java 2013-05-10 07:41:18.000000000 +0200
|
||||
+++ new/java/src/com/tigervnc/vncviewer/VncViewer.java 2013-05-10 07:41:18.000000000 +0200
|
||||
@@ -27,11 +27,15 @@
|
||||
|
||||
package com.tigervnc.vncviewer;
|
||||
|
||||
+import netscape.javascript.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
|
||||
+import java.awt.Graphics;
|
||||
+import java.applet.Applet;
|
||||
+
|
||||
public class VncViewer extends java.applet.Applet
|
||||
implements java.lang.Runnable, WindowListener, ComponentListener {
|
||||
|
||||
@@ -94,6 +98,9 @@
|
||||
|
||||
String PVECert;
|
||||
|
||||
+ JSObject jswin;
|
||||
+ String myid;
|
||||
+
|
||||
// Reference to this applet for inter-applet communication.
|
||||
public static java.applet.Applet refApplet;
|
||||
|
||||
@@ -129,6 +136,11 @@
|
||||
|
||||
refApplet = this;
|
||||
|
||||
+ if (inAnApplet) {
|
||||
+ jswin = JSObject.getWindow(this);
|
||||
+ myid = getParameter("id");
|
||||
+ }
|
||||
+
|
||||
if (inSeparateFrame) {
|
||||
vncFrame = new Frame("TigerVNC");
|
||||
if (!inAnApplet) {
|
||||
@@ -159,6 +171,9 @@
|
||||
|
||||
rfbThread = new Thread(this);
|
||||
rfbThread.start();
|
||||
+
|
||||
+ String[] myparam = { myid, "init"};
|
||||
+ jswin.call("PVE_vnc_console_event", myparam);
|
||||
}
|
||||
|
||||
public void update(Graphics g) {
|
||||
@@ -1002,6 +1017,8 @@
|
||||
|
||||
if (inAnApplet) {
|
||||
showMessage("Disconnected");
|
||||
+ String[] myparam = { myid, "disconnect"};
|
||||
+ jswin.call("PVE_vnc_console_event", myparam);
|
||||
} else {
|
||||
System.exit(0);
|
||||
}
|
||||
@@ -1019,6 +1036,8 @@
|
||||
// vncContainer null, applet not inited,
|
||||
// can not present the error to the user.
|
||||
Thread.currentThread().stop();
|
||||
+ String[] myparam = { myid, "error", str};
|
||||
+ jswin.call("PVE_vnc_console_event", myparam);
|
||||
} else {
|
||||
System.exit(1);
|
||||
}
|
||||
@@ -1040,6 +1059,8 @@
|
||||
rfb.close();
|
||||
|
||||
if (inAnApplet) {
|
||||
+ String[] myparam = { myid, "error", str};
|
||||
+ jswin.call("PVE_vnc_console_event", myparam);
|
||||
showMessage(str);
|
||||
} else {
|
||||
System.exit(1);
|
||||
@@ -1109,6 +1130,9 @@
|
||||
rfb.close();
|
||||
if (inSeparateFrame)
|
||||
vncFrame.dispose();
|
||||
+
|
||||
+ String[] myparam = { myid, "destroy"};
|
||||
+ jswin.call("PVE_vnc_console_event", myparam);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1157,6 +1181,8 @@
|
||||
if (!inAnApplet) {
|
||||
System.exit(0);
|
||||
}
|
||||
+ String[] myparam = { myid, "close"};
|
||||
+ jswin.call("PVE_vnc_console_event", myparam);
|
||||
}
|
||||
|
||||
//
|
||||
Index: new/java/src/com/tigervnc/vncviewer/Makefile
|
||||
===================================================================
|
||||
--- new.orig/java/src/com/tigervnc/vncviewer/Makefile 2013-05-10 07:41:18.000000000 +0200
|
||||
+++ new/java/src/com/tigervnc/vncviewer/Makefile 2013-05-10 07:43:17.000000000 +0200
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
CP = cp
|
||||
JC = javac
|
||||
-JCFLAGS = -target 1.7 -classpath ../../../
|
||||
+JCFLAGS = -target 1.7 -classpath ../../../ -Djava.ext.dirs=/usr/share/icedtea-web/
|
||||
JAR = jar
|
||||
ARCHIVE = VncViewer.jar
|
||||
MANIFEST = MANIFEST.MF
|
@ -1,14 +0,0 @@
|
||||
Index: new/java/src/com/tigervnc/vncviewer/RfbProto.java
|
||||
===================================================================
|
||||
--- new.orig/java/src/com/tigervnc/vncviewer/RfbProto.java 2011-01-20 08:14:34.000000000 +0100
|
||||
+++ new/java/src/com/tigervnc/vncviewer/RfbProto.java 2011-01-20 08:19:20.000000000 +0100
|
||||
@@ -938,6 +938,9 @@
|
||||
|
||||
int keyChar = evt.getKeyChar();
|
||||
|
||||
+ int test = evt.getKeyCode();
|
||||
+ System.out.println("KEYCODE: " + evt.getKeyText(test));
|
||||
+
|
||||
//
|
||||
// Ignore event if only modifiers were pressed.
|
||||
//
|
@ -1,11 +0,0 @@
|
||||
Index: new/java/src/com/tigervnc/vncviewer/MANIFEST.MF
|
||||
===================================================================
|
||||
--- new.orig/java/src/com/tigervnc/vncviewer/MANIFEST.MF 2011-08-18 14:05:33.000000000 +0200
|
||||
+++ new/java/src/com/tigervnc/vncviewer/MANIFEST.MF 2013-11-08 11:17:13.000000000 +0100
|
||||
@@ -1,2 +1,6 @@
|
||||
Manifest-Version: 1.0
|
||||
Main-Class: com.tigervnc.vncviewer.VncViewer
|
||||
+Permissions: all-permissions
|
||||
+Application-Name: vncterm
|
||||
+Codebase: *
|
||||
+Caller-Allowable-Codebase: *
|
@ -1,9 +0,0 @@
|
||||
#keydebug.patch
|
||||
#javascript-events.patch
|
||||
export-ctrl-alt-delete.patch
|
||||
trust-manager.patch
|
||||
fix-makefiles.patch
|
||||
username-param.patch
|
||||
fix-tab-button.patch
|
||||
modify-jar-manifest.patch
|
||||
javascript-events.patch
|
@ -1,190 +0,0 @@
|
||||
|
||||
Unfortunately the java certificate store does not correctly access
|
||||
the browser certificate store (firefox, chrome). We also tunnel VNC
|
||||
traffic from other cluster nodes.
|
||||
|
||||
So we implement our own trust manager, and allow to pass the server
|
||||
certificate (or CA who signed the server certificate) as applet
|
||||
parameter "PVECert" (newline encoded as '|').
|
||||
|
||||
Index: tigervnc/java/src/com/tigervnc/vncviewer/X509Tunnel.java
|
||||
===================================================================
|
||||
--- tigervnc.orig/java/src/com/tigervnc/vncviewer/X509Tunnel.java 2013-06-03 08:17:17.000000000 +0200
|
||||
+++ tigervnc/java/src/com/tigervnc/vncviewer/X509Tunnel.java 2013-06-03 08:22:52.000000000 +0200
|
||||
@@ -26,13 +26,23 @@
|
||||
import javax.net.ssl.*;
|
||||
import java.security.*;
|
||||
import java.security.cert.*;
|
||||
+import java.security.cert.Certificate;
|
||||
+import java.security.cert.CertificateFactory;
|
||||
+import java.io.*;
|
||||
|
||||
public class X509Tunnel extends TLSTunnelBase
|
||||
{
|
||||
|
||||
- public X509Tunnel (Socket sock_)
|
||||
+ Certificate pvecert;
|
||||
+
|
||||
+ public X509Tunnel (Socket sock_, String certstr) throws CertificateException
|
||||
{
|
||||
super (sock_);
|
||||
+
|
||||
+ if (certstr != null) {
|
||||
+ CertificateFactory cf = CertificateFactory.getInstance("X.509");
|
||||
+ pvecert = cf.generateCertificate(new StringBufferInputStream(certstr));
|
||||
+ }
|
||||
}
|
||||
|
||||
protected void setParam (SSLSocket sock)
|
||||
@@ -52,9 +62,48 @@
|
||||
protected void initContext (SSLContext sc) throws java.security.
|
||||
GeneralSecurityException
|
||||
{
|
||||
- TrustManager[] myTM = new TrustManager[]
|
||||
- {
|
||||
- new MyX509TrustManager ()};
|
||||
+ TrustManager[] myTM;
|
||||
+
|
||||
+ if (pvecert != null) {
|
||||
+ myTM = new TrustManager[] {
|
||||
+ new X509TrustManager() {
|
||||
+ public java.security.cert.X509Certificate[]
|
||||
+ getAcceptedIssuers() {
|
||||
+ return null;
|
||||
+ }
|
||||
+ public void checkClientTrusted(
|
||||
+ java.security.cert.X509Certificate[] certs,
|
||||
+ String authType) throws CertificateException {
|
||||
+ throw new CertificateException("no clients");
|
||||
+ }
|
||||
+ public void checkServerTrusted(
|
||||
+ java.security.cert.X509Certificate[] certs,
|
||||
+ String authType) throws CertificateException {
|
||||
+
|
||||
+ if (certs == null || certs.length < 1) {
|
||||
+ throw new CertificateException("no certs");
|
||||
+ }
|
||||
+ PublicKey cakey = pvecert.getPublicKey();
|
||||
+
|
||||
+ boolean ca_match;
|
||||
+ try {
|
||||
+ certs[0].verify(cakey);
|
||||
+ ca_match = true;
|
||||
+ } catch (Exception e) {
|
||||
+ ca_match = false;
|
||||
+ }
|
||||
+
|
||||
+ if (!ca_match && !pvecert.equals(certs[0])) {
|
||||
+ throw new CertificateException("certificate does not match");
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ };
|
||||
+ } else {
|
||||
+ myTM = new TrustManager[] {
|
||||
+ new MyX509TrustManager ()
|
||||
+ };
|
||||
+ }
|
||||
sc.init (null, myTM, null);
|
||||
}
|
||||
|
||||
@@ -100,4 +149,5 @@
|
||||
return tm.getAcceptedIssuers ();
|
||||
}
|
||||
}
|
||||
+
|
||||
}
|
||||
Index: tigervnc/java/src/com/tigervnc/vncviewer/RfbProto.java
|
||||
===================================================================
|
||||
--- tigervnc.orig/java/src/com/tigervnc/vncviewer/RfbProto.java 2013-06-03 08:17:17.000000000 +0200
|
||||
+++ tigervnc/java/src/com/tigervnc/vncviewer/RfbProto.java 2013-06-03 08:19:05.000000000 +0200
|
||||
@@ -411,7 +411,8 @@
|
||||
}
|
||||
|
||||
void authenticateX509() throws Exception {
|
||||
- X509Tunnel tunnel = new X509Tunnel(sock);
|
||||
+
|
||||
+ X509Tunnel tunnel = new X509Tunnel(sock, viewer.PVECert);
|
||||
tunnel.setup (this);
|
||||
}
|
||||
|
||||
Index: tigervnc/java/src/com/tigervnc/vncviewer/VncViewer.java
|
||||
===================================================================
|
||||
--- tigervnc.orig/java/src/com/tigervnc/vncviewer/VncViewer.java 2013-06-03 08:19:03.000000000 +0200
|
||||
+++ tigervnc/java/src/com/tigervnc/vncviewer/VncViewer.java 2013-06-03 08:19:05.000000000 +0200
|
||||
@@ -91,6 +91,8 @@
|
||||
int debugStatsExcludeUpdates;
|
||||
int debugStatsMeasureUpdates;
|
||||
|
||||
+ String PVECert;
|
||||
+
|
||||
// Reference to this applet for inter-applet communication.
|
||||
public static java.applet.Applet refApplet;
|
||||
|
||||
@@ -263,7 +265,7 @@
|
||||
fatalError(e.toString(), e);
|
||||
}
|
||||
}
|
||||
-
|
||||
+
|
||||
}
|
||||
|
||||
//
|
||||
@@ -299,7 +301,7 @@
|
||||
// If the rfbThread is being stopped, ignore any exceptions,
|
||||
// otherwise rethrow the exception so it can be handled.
|
||||
//
|
||||
-
|
||||
+
|
||||
void processNormalProtocol() throws Exception {
|
||||
try {
|
||||
vc.processNormalProtocol();
|
||||
@@ -842,6 +844,11 @@
|
||||
|
||||
// SocketFactory.
|
||||
socketFactory = readParameter("SocketFactory", false);
|
||||
+
|
||||
+ String tmpcert = readParameter("PVECert", false);
|
||||
+ if (tmpcert != null) {
|
||||
+ PVECert = tmpcert.replace('|', '\n');
|
||||
+ }
|
||||
}
|
||||
|
||||
//
|
||||
@@ -991,7 +998,7 @@
|
||||
}
|
||||
|
||||
synchronized public void fatalError(String str, Exception e) {
|
||||
-
|
||||
+
|
||||
if (rfb != null && rfb.closed()) {
|
||||
// Not necessary to show error message if the error was caused
|
||||
// by I/O problems after the rfb.close() method call.
|
||||
@@ -1084,11 +1091,11 @@
|
||||
public void enableInput(boolean enable) {
|
||||
vc.enableInput(enable);
|
||||
}
|
||||
-
|
||||
+
|
||||
//
|
||||
// Resize framebuffer if autoScale is enabled.
|
||||
//
|
||||
-
|
||||
+
|
||||
public void componentResized(ComponentEvent e) {
|
||||
if (e.getComponent() == vncFrame) {
|
||||
if (options.autoScale) {
|
||||
@@ -1100,11 +1107,11 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
-
|
||||
+
|
||||
//
|
||||
// Ignore component events we're not interested in.
|
||||
//
|
||||
-
|
||||
+
|
||||
public void componentShown(ComponentEvent e) { }
|
||||
public void componentMoved(ComponentEvent e) { }
|
||||
public void componentHidden(ComponentEvent e) { }
|
@ -1,38 +0,0 @@
|
||||
Index: new/java/src/com/tigervnc/vncviewer/VncViewer.java
|
||||
===================================================================
|
||||
--- new.orig/java/src/com/tigervnc/vncviewer/VncViewer.java 2011-01-28 13:26:51.000000000 +0100
|
||||
+++ new/java/src/com/tigervnc/vncviewer/VncViewer.java 2011-01-28 13:27:04.000000000 +0100
|
||||
@@ -86,6 +86,7 @@
|
||||
String host;
|
||||
int port;
|
||||
String passwordParam;
|
||||
+ String usernameParam;
|
||||
boolean showControls;
|
||||
boolean offerRelogin;
|
||||
boolean showOfflineDesktop;
|
||||
@@ -384,10 +385,12 @@
|
||||
break;
|
||||
case RfbProto.SecTypePlain:
|
||||
showConnectionStatus("Plain authentication");
|
||||
- {
|
||||
- String user = askUser();
|
||||
- String pw = askPassword();
|
||||
- rfb.authenticatePlain(user,pw);
|
||||
+ if (usernameParam != null && passwordParam != null) {
|
||||
+ rfb.authenticatePlain(usernameParam, passwordParam);
|
||||
+ } else {
|
||||
+ String user = askUser();
|
||||
+ String pw = askPassword();
|
||||
+ rfb.authenticatePlain(user,pw);
|
||||
}
|
||||
break;
|
||||
case RfbProto.SecTypeTLSNone:
|
||||
@@ -822,6 +825,8 @@
|
||||
// Read "ENCPASSWORD" or "PASSWORD" parameter if specified.
|
||||
readPasswordParameters();
|
||||
|
||||
+ usernameParam = readParameter("USERNAME", false);
|
||||
+
|
||||
String str;
|
||||
if (inAnApplet) {
|
||||
str = readParameter("Open New Window", false);
|
Binary file not shown.
227
vncterm/vncpatches/remove-systemd-socket-activation.patch
Normal file
227
vncterm/vncpatches/remove-systemd-socket-activation.patch
Normal file
@ -0,0 +1,227 @@
|
||||
commit 25e3dfeab75b6febdb6c1157e991c3bcbeb3eb86
|
||||
Author: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
AuthorDate: Thu Feb 2 11:22:35 2017 +0100
|
||||
Commit: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
CommitDate: Thu Feb 2 11:22:35 2017 +0100
|
||||
|
||||
Revert "Support systemd socket activation"
|
||||
|
||||
unneeded extra build dep
|
||||
|
||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index 9424d8d..4c56635 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -36,7 +36,6 @@ find_package(GnuTLS)
|
||||
find_package(Threads)
|
||||
find_package(X11)
|
||||
find_package(OpenSSL)
|
||||
-find_package(PkgConfig)
|
||||
find_library(LIBGCRYPT_LIBRARIES gcrypt)
|
||||
|
||||
# Check whether the version of libjpeg we found was libjpeg-turbo and print a
|
||||
@@ -103,17 +102,6 @@ if(PNG_FOUND)
|
||||
endif(PNG_FOUND)
|
||||
option(LIBVNCSERVER_ALLOW24BPP "Allow 24 bpp" ON)
|
||||
|
||||
-pkg_check_modules(SYSTEMD "libsystemd")
|
||||
-if(SYSTEMD_FOUND)
|
||||
- option(LIBVNCSERVER_WITH_SYSTEMD "Build with systemd socket activation support" ON)
|
||||
-endif(SYSTEMD_FOUND)
|
||||
-
|
||||
-if(LIBVNCSERVER_WITH_SYSTEMD)
|
||||
- add_definitions(-DLIBVNCSERVER_WITH_SYSTEMD)
|
||||
- include_directories(${SYSTEMD_INCLUDE_DIRS})
|
||||
- set(ADDITIONAL_LIBS ${ADDITIONAL_LIBS} ${SYSTEMD_LIBRARIES})
|
||||
-endif(LIBVNCSERVER_WITH_SYSTEMD)
|
||||
-
|
||||
if(GNUTLS_FOUND)
|
||||
set(LIBVNCSERVER_WITH_CLIENT_TLS 1)
|
||||
option(LIBVNCSERVER_WITH_WEBSOCKETS "Build with websockets support (gnutls)" ON)
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index f13edb4..3f4b29a 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -68,9 +68,6 @@ if test ! -z "$with_ffmpeg"; then
|
||||
fi
|
||||
AM_CONDITIONAL(HAVE_MP3LAME, test "$HAVE_MP3LAME" = "true")
|
||||
|
||||
-PKG_CHECK_MODULES([LIBSYSTEMD], [libsystemd], [with_systemd=1], [with_systemd=0])
|
||||
-AM_CONDITIONAL([WITH_SYSTEMD], [test $with_systemd -eq 1])
|
||||
-
|
||||
# Seem to need this dummy here to induce the 'checking for egrep... grep -E', etc.
|
||||
# before it seemed to be inside the with_jpeg conditional.
|
||||
AC_CHECK_HEADER(thenonexistentheader.h, HAVE_THENONEXISTENTHEADER_H="true")
|
||||
diff --git a/libvncserver/Makefile.am b/libvncserver/Makefile.am
|
||||
index e25784b..2f23e31 100644
|
||||
--- a/libvncserver/Makefile.am
|
||||
+++ b/libvncserver/Makefile.am
|
||||
@@ -59,12 +59,6 @@ LIB_SRCS = main.c rfbserver.c rfbregion.c auth.c sockets.c $(WEBSOCKETSSRCS) \
|
||||
libvncserver_la_SOURCES=$(LIB_SRCS)
|
||||
libvncserver_la_LIBADD=$(WEBSOCKETSSSLLIBS)
|
||||
|
||||
-if WITH_SYSTEMD
|
||||
-AM_CPPFLAGS += -DLIBVNCSERVER_WITH_SYSTEMD
|
||||
-libvncserver_la_CFLAGS = $(LIBSYSTEMD_CFLAGS)
|
||||
-libvncserver_la_LIBADD += $(LIBSYSTEMD_LIBS)
|
||||
-endif
|
||||
-
|
||||
lib_LTLIBRARIES=libvncserver.la
|
||||
libvncserver_la_LDFLAGS = -version-info 1:0:0
|
||||
|
||||
diff --git a/libvncserver/sockets.c b/libvncserver/sockets.c
|
||||
index bbc3d90..6467b1c 100644
|
||||
--- a/libvncserver/sockets.c
|
||||
+++ b/libvncserver/sockets.c
|
||||
@@ -77,10 +77,6 @@
|
||||
#include "rfbssl.h"
|
||||
#endif
|
||||
|
||||
-#ifdef LIBVNCSERVER_WITH_SYSTEMD
|
||||
-#include <systemd/sd-daemon.h>
|
||||
-#endif
|
||||
-
|
||||
#if defined(__linux__) && defined(NEED_TIMEVAL)
|
||||
struct timeval
|
||||
{
|
||||
@@ -126,54 +122,6 @@ int deny_severity=LOG_WARNING;
|
||||
int rfbMaxClientWait = 20000; /* time (ms) after which we decide client has
|
||||
gone away - needed to stop us hanging */
|
||||
|
||||
-static rfbBool
|
||||
-rfbNewConnectionFromSock(rfbScreenInfoPtr rfbScreen, int sock)
|
||||
-{
|
||||
- const int one = 1;
|
||||
-#ifdef LIBVNCSERVER_IPv6
|
||||
- struct sockaddr_storage addr;
|
||||
-#else
|
||||
- struct sockaddr_in addr;
|
||||
-#endif
|
||||
- socklen_t addrlen = sizeof(addr);
|
||||
-
|
||||
- getpeername(sock, (struct sockaddr *)&addr, &addrlen);
|
||||
-
|
||||
- if(!rfbSetNonBlocking(sock)) {
|
||||
- rfbLogPerror("rfbCheckFds: setnonblock");
|
||||
- closesocket(sock);
|
||||
- return FALSE;
|
||||
- }
|
||||
-
|
||||
- if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
|
||||
- (char *)&one, sizeof(one)) < 0) {
|
||||
- rfbLogPerror("rfbCheckFds: setsockopt failed: can't set TCP_NODELAY flag, non TCP socket?");
|
||||
- }
|
||||
-
|
||||
-#ifdef USE_LIBWRAP
|
||||
- if(!hosts_ctl("vnc",STRING_UNKNOWN,inet_ntoa(addr.sin_addr),
|
||||
- STRING_UNKNOWN)) {
|
||||
- rfbLog("Rejected connection from client %s\n",
|
||||
- inet_ntoa(addr.sin_addr));
|
||||
- closesocket(sock);
|
||||
- return FALSE;
|
||||
- }
|
||||
-#endif
|
||||
-
|
||||
-#ifdef LIBVNCSERVER_IPv6
|
||||
- char host[1024];
|
||||
- if(getnameinfo((struct sockaddr*)&addr, addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST) != 0) {
|
||||
- rfbLogPerror("rfbProcessNewConnection: error in getnameinfo");
|
||||
- }
|
||||
- rfbLog("Got connection from client %s\n", host);
|
||||
-#else
|
||||
- rfbLog("Got connection from client %s\n", inet_ntoa(addr.sin_addr));
|
||||
-#endif
|
||||
-
|
||||
- rfbNewClient(rfbScreen,sock);
|
||||
- return TRUE;
|
||||
-}
|
||||
-
|
||||
/*
|
||||
* rfbInitSockets sets up the TCP and UDP sockets to listen for RFB
|
||||
* connections. It does nothing if called again.
|
||||
@@ -190,20 +138,6 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen)
|
||||
|
||||
rfbScreen->socketState = RFB_SOCKET_READY;
|
||||
|
||||
-#ifdef LIBVNCSERVER_WITH_SYSTEMD
|
||||
- if (sd_listen_fds(0) == 1)
|
||||
- {
|
||||
- int sock = SD_LISTEN_FDS_START + 0;
|
||||
- if (sd_is_socket(sock, AF_UNSPEC, 0, 0))
|
||||
- rfbNewConnectionFromSock(rfbScreen, sock);
|
||||
- else if (sd_is_socket(sock, AF_UNSPEC, 0, 1))
|
||||
- rfbProcessNewConnection(rfbScreen);
|
||||
- return;
|
||||
- }
|
||||
- else
|
||||
- rfbLog("Unable to establish connection with systemd socket\n");
|
||||
-#endif
|
||||
-
|
||||
if (rfbScreen->inetdSock != -1) {
|
||||
const int one = 1;
|
||||
|
||||
@@ -479,7 +413,14 @@ rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec)
|
||||
rfbBool
|
||||
rfbProcessNewConnection(rfbScreenInfoPtr rfbScreen)
|
||||
{
|
||||
+ const int one = 1;
|
||||
int sock = -1;
|
||||
+#ifdef LIBVNCSERVER_IPv6
|
||||
+ struct sockaddr_storage addr;
|
||||
+#else
|
||||
+ struct sockaddr_in addr;
|
||||
+#endif
|
||||
+ socklen_t addrlen = sizeof(addr);
|
||||
fd_set listen_fds;
|
||||
int chosen_listen_sock = -1;
|
||||
|
||||
@@ -500,12 +441,47 @@ rfbProcessNewConnection(rfbScreenInfoPtr rfbScreen)
|
||||
if (rfbScreen->listen6Sock >= 0 && FD_ISSET(rfbScreen->listen6Sock, &listen_fds))
|
||||
chosen_listen_sock = rfbScreen->listen6Sock;
|
||||
|
||||
- if ((sock = accept(chosen_listen_sock, NULL, NULL)) < 0) {
|
||||
+ if ((sock = accept(chosen_listen_sock,
|
||||
+ (struct sockaddr *)&addr, &addrlen)) < 0) {
|
||||
rfbLogPerror("rfbCheckFds: accept");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
- return rfbNewConnectionFromSock(rfbScreen, sock);
|
||||
+ if(!rfbSetNonBlocking(sock)) {
|
||||
+ closesocket(sock);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
|
||||
+ (char *)&one, sizeof(one)) < 0) {
|
||||
+ rfbLogPerror("rfbCheckFds: setsockopt failed: can't set TCP_NODELAY flag, non TCP socket?");
|
||||
+ }
|
||||
+
|
||||
+#ifdef USE_LIBWRAP
|
||||
+ if(!hosts_ctl("vnc",STRING_UNKNOWN,inet_ntoa(addr.sin_addr),
|
||||
+ STRING_UNKNOWN)) {
|
||||
+ rfbLog("Rejected connection from client %s\n",
|
||||
+ inet_ntoa(addr.sin_addr));
|
||||
+ closesocket(sock);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
+#ifdef LIBVNCSERVER_IPv6
|
||||
+ {
|
||||
+ char host[1024];
|
||||
+ if(getnameinfo((struct sockaddr*)&addr, addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST) != 0) {
|
||||
+ rfbLogPerror("rfbProcessNewConnection: error in getnameinfo");
|
||||
+ }
|
||||
+ rfbLog("Got connection from client %s\n", host);
|
||||
+ }
|
||||
+#else
|
||||
+ rfbLog("Got connection from client %s\n", inet_ntoa(addr.sin_addr));
|
||||
+#endif
|
||||
+
|
||||
+ rfbNewClient(rfbScreen,sock);
|
||||
+
|
||||
+ return TRUE;
|
||||
}
|
||||
|
||||
|
@ -1 +1,2 @@
|
||||
remove-systemd-socket-activation.patch
|
||||
tls-auth-pluging.patch
|
||||
|
@ -1,14 +1,14 @@
|
||||
Index: vnc/libvncserver/auth.c
|
||||
===================================================================
|
||||
@@ -270,8 +270,9 @@
|
||||
@@ -300,8 +300,9 @@
|
||||
int32_t securityType = rfbSecTypeInvalid;
|
||||
|
||||
if (!cl->screen->authPasswdData || cl->reverseConnection) {
|
||||
- /* chk if this condition is valid or not. */
|
||||
- securityType = rfbSecTypeNone;
|
||||
+ /* chk if this condition is valid or not. */
|
||||
+ /* we disable anonymous auth */
|
||||
+ // securityType = rfbSecTypeNone;
|
||||
+ /* chk if this condition is valid or not. */
|
||||
+ /* we disable anonymous auth */
|
||||
+ // securityType = rfbSecTypeNone;
|
||||
} else if (cl->screen->authPasswdData) {
|
||||
securityType = rfbSecTypeVncAuth;
|
||||
}
|
||||
@ -17,29 +17,28 @@ Index: vnc/libvncserver/sockets.c
|
||||
===================================================================
|
||||
--- vnc.orig/libvncserver/sockets.c 2011-01-20 16:42:41.000000000 +0100
|
||||
+++ vnc/libvncserver/sockets.c 2011-01-21 10:20:03.000000000 +0100
|
||||
@@ -454,8 +454,12 @@
|
||||
fd_set fds;
|
||||
struct timeval tv;
|
||||
|
||||
+
|
||||
while (len > 0) {
|
||||
@@ -613,7 +613,11 @@ rfbReadExactTimeout(rfbClientPtr cl, char* buf, int len, int timeout)
|
||||
n = read(sock, buf, len);
|
||||
}
|
||||
#else
|
||||
- n = read(sock, buf, len);
|
||||
+ if (cl->sock_read_fn)
|
||||
+ n = cl->sock_read_fn(cl, buf, len);
|
||||
+ else
|
||||
+ n = read(sock, buf, len);
|
||||
+ if (cl->sock_read_fn) {
|
||||
+ n = cl->sock_read_fn(cl, buf, len);
|
||||
+ } else {
|
||||
+ n = read(sock, buf, len);
|
||||
+ }
|
||||
#endif
|
||||
|
||||
if (n > 0) {
|
||||
|
||||
@@ -538,7 +542,10 @@
|
||||
|
||||
LOCK(cl->outputMutex);
|
||||
while (len > 0) {
|
||||
- n = write(sock, buf, len);
|
||||
+ if (cl->sock_write_fn)
|
||||
@@ -801,7 +805,11 @@ rfbWriteExact(rfbClientPtr cl,
|
||||
n = rfbssl_write(cl, buf, len);
|
||||
else
|
||||
#endif
|
||||
+ if (cl->sock_write_fn) {
|
||||
+ n = cl->sock_write_fn(cl, buf, len);
|
||||
+ else
|
||||
+ n = write(sock, buf, len);
|
||||
+ } else {
|
||||
n = write(sock, buf, len);
|
||||
+ }
|
||||
|
||||
if (n > 0) {
|
||||
|
||||
|
@ -26,6 +26,9 @@
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <rfb/rfb.h>
|
||||
@ -39,7 +42,6 @@
|
||||
#include <locale.h>
|
||||
|
||||
#include "vncterm.h"
|
||||
#include "glyphs.h"
|
||||
|
||||
#include <gnutls/gnutls.h>
|
||||
#include <gnutls/x509.h>
|
||||
@ -50,8 +52,17 @@
|
||||
char *auth_path = "/";
|
||||
char *auth_perm = "Sys.Console";
|
||||
|
||||
uint16_t screen_width = 744;
|
||||
uint16_t screen_height = 400;
|
||||
|
||||
int use_x509 = 1;
|
||||
|
||||
extern int wcwidth (wchar_t wc);
|
||||
unsigned char *fontdata;
|
||||
|
||||
#define FONTFILE "/usr/share/vncterm/font.data"
|
||||
#define GLYPHLINES 16
|
||||
|
||||
static char *
|
||||
urlencode(char *buf, const char *value)
|
||||
{
|
||||
@ -169,7 +180,7 @@ static void vnc_debug_gnutls_log(int level, const char* str) {
|
||||
}
|
||||
#endif
|
||||
|
||||
#define DH_BITS 1024
|
||||
#define DH_BITS 2048
|
||||
static gnutls_dh_params_t dh_params;
|
||||
|
||||
typedef struct {
|
||||
@ -256,7 +267,11 @@ tls_initialize_anon_cred(void)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if GNUTLS_VERSION_NUMBER >= 0x030506
|
||||
gnutls_anon_set_server_known_dh_params(anon_cred, GNUTLS_SEC_PARAM_MEDIUM);
|
||||
#else
|
||||
gnutls_anon_set_server_dh_params(anon_cred, dh_params);
|
||||
#endif
|
||||
|
||||
return anon_cred;
|
||||
}
|
||||
@ -290,8 +305,13 @@ tls_initialize_x509_cred(void)
|
||||
gnutls_certificate_free_credentials(x509_cred);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if GNUTLS_VERSION_NUMBER >= 0x030506
|
||||
/* only available since GnuTLS 3.5.6, on previous versions see
|
||||
* gnutls_certificate_set_dh_params(). */
|
||||
gnutls_certificate_set_known_dh_params(x509_cred, GNUTLS_SEC_PARAM_MEDIUM);
|
||||
#else
|
||||
gnutls_certificate_set_dh_params (x509_cred, dh_params);
|
||||
#endif
|
||||
|
||||
return x509_cred;
|
||||
}
|
||||
@ -485,42 +505,10 @@ rfbVncAuthVencrypt(rfbClientPtr cl)
|
||||
return;
|
||||
}
|
||||
|
||||
/* optimize for speed */
|
||||
static const int cipher_priority_performance[] = {
|
||||
GNUTLS_CIPHER_ARCFOUR_128,
|
||||
GNUTLS_CIPHER_AES_128_CBC,
|
||||
GNUTLS_CIPHER_3DES_CBC, 0
|
||||
};
|
||||
|
||||
if ((ret = gnutls_cipher_set_priority(sd->session, cipher_priority_performance)) < 0) {
|
||||
rfbLog("gnutls_cipher_set_priority failed: %s\n", gnutls_strerror(ret));
|
||||
sd->session = NULL;
|
||||
rfbCloseClient(cl);
|
||||
return;
|
||||
}
|
||||
|
||||
static const int kx_anon[] = {GNUTLS_KX_ANON_DH, 0};
|
||||
static const int kx_x509[] = {GNUTLS_KX_DHE_DSS, GNUTLS_KX_RSA, GNUTLS_KX_DHE_RSA, GNUTLS_KX_SRP, 0};
|
||||
if ((ret = gnutls_kx_set_priority(sd->session, use_x509 ? kx_x509 : kx_anon)) < 0) {
|
||||
rfbLog("gnutls_kx_set_priority failed: %s\n", gnutls_strerror(ret));
|
||||
sd->session = NULL;
|
||||
rfbCloseClient(cl);
|
||||
return;
|
||||
}
|
||||
|
||||
static const int cert_type_priority[] = { GNUTLS_CRT_X509, 0 };
|
||||
if ((ret = gnutls_certificate_type_set_priority(sd->session, cert_type_priority)) < 0) {
|
||||
rfbLog("gnutls_certificate_type_set_priority failed: %s\n",
|
||||
gnutls_strerror(ret));
|
||||
sd->session = NULL;
|
||||
rfbCloseClient(cl);
|
||||
return;
|
||||
}
|
||||
|
||||
static const int protocol_priority[]= { GNUTLS_TLS1_1, GNUTLS_TLS1_0, GNUTLS_SSL3, 0 };
|
||||
if ((ret = gnutls_protocol_set_priority(sd->session, protocol_priority)) < 0) {
|
||||
rfbLog("gnutls_protocol_set_priority failed: %s\n",
|
||||
gnutls_strerror(ret));
|
||||
static const char *priority_str_x509 = "NORMAL";
|
||||
static const char *priority_str_anon = "NORMAL:+ANON-ECDH:+ANON-DH";
|
||||
if ((ret = gnutls_priority_set_direct(sd->session, use_x509 ? priority_str_x509 : priority_str_anon, NULL)) < 0) {
|
||||
rfbLog("gnutls_priority_set_direct failed: %s\n", gnutls_strerror(ret));
|
||||
sd->session = NULL;
|
||||
rfbCloseClient(cl);
|
||||
return;
|
||||
@ -649,21 +637,16 @@ ucs2_to_utf8 (unicode c, char *out)
|
||||
|
||||
static void
|
||||
rfb_draw_char (rfbScreenInfoPtr rfbScreen, int x, int y,
|
||||
unsigned short c, rfbPixel col)
|
||||
unicode c, rfbPixel col, short width)
|
||||
{
|
||||
if (c > vt_font_size) {
|
||||
rfbLog ("undefined font glyph %d\n", c);
|
||||
return;
|
||||
}
|
||||
|
||||
int i,j;
|
||||
unsigned char *data= vt_font_data + c*16;
|
||||
unsigned char *data= fontdata + c*(GLYPHLINES*2);
|
||||
unsigned char d=*data;
|
||||
int rowstride=rfbScreen->paddedWidthInBytes;
|
||||
char *colour=(char*)&col;
|
||||
|
||||
for(j = 0; j < 16; j++) {
|
||||
for(i = 0; i < 8; i++) {
|
||||
for(j = 0; j < GLYPHLINES; j++) {
|
||||
for(i = 0; i < 8*width; i++) {
|
||||
if ((i&7) == 0) {
|
||||
d=*data;
|
||||
data++;
|
||||
@ -676,13 +659,16 @@ rfb_draw_char (rfbScreenInfoPtr rfbScreen, int x, int y,
|
||||
}
|
||||
|
||||
static void
|
||||
draw_char_at (vncTerm *vt, int x, int y, unicode ch, TextAttributes attrib)
|
||||
draw_char_at (vncTerm *vt, int x, int y, unicode ch, TextAttributes attrib, short width, unicode combiningglyph)
|
||||
{
|
||||
if (x < 0 || y < 0 || x >= vt->width || y >= vt->height) { return; }
|
||||
|
||||
// non printable character
|
||||
if (width < 1) return;
|
||||
|
||||
int rx = x*8;
|
||||
int ry = y*16;
|
||||
int rxe = x*8+8;
|
||||
int rxe = x*8+8*width;
|
||||
int rye = y*16+16;
|
||||
|
||||
int fg, bg;
|
||||
@ -695,8 +681,6 @@ draw_char_at (vncTerm *vt, int x, int y, unicode ch, TextAttributes attrib)
|
||||
fg = attrib.fgcol;
|
||||
}
|
||||
|
||||
int ec = vt_fontmap[ch];
|
||||
|
||||
rfbFillRect (vt->screen, rx, ry, rxe, rye, bg);
|
||||
|
||||
if (attrib.bold) {
|
||||
@ -705,7 +689,11 @@ draw_char_at (vncTerm *vt, int x, int y, unicode ch, TextAttributes attrib)
|
||||
|
||||
// unsuported attributes = (attrib.blink || attrib.unvisible)
|
||||
|
||||
rfb_draw_char (vt->screen, rx, ry, ec, fg);
|
||||
rfb_draw_char (vt->screen, rx, ry, ch, fg, width);
|
||||
|
||||
if (combiningglyph) {
|
||||
rfb_draw_char (vt->screen, rx, ry, combiningglyph, fg, 1);
|
||||
}
|
||||
|
||||
if (attrib.uline) {
|
||||
rfbDrawLine (vt->screen, rx, ry + 14, rxe, ry + 14, fg);
|
||||
@ -727,7 +715,7 @@ vncterm_update_xy (vncTerm *vt, int x, int y)
|
||||
}
|
||||
if (y2 < vt->height) {
|
||||
TextCell *c = &vt->cells[y1 * vt->width + x];
|
||||
draw_char_at (vt, x, y2, c->ch, c->attrib);
|
||||
draw_char_at (vt, x, y2, c->ch, c->attrib, c->width, c->combiningglyph);
|
||||
}
|
||||
}
|
||||
|
||||
@ -747,8 +735,10 @@ vncterm_clear_xy (vncTerm *vt, int x, int y)
|
||||
c->attrib = vt->default_attrib;
|
||||
c->attrib.fgcol = vt->cur_attrib.fgcol;
|
||||
c->attrib.bgcol = vt->cur_attrib.bgcol;
|
||||
c->width = 1;
|
||||
c->combiningglyph = 0;
|
||||
|
||||
draw_char_at (vt, x, y, c->ch, c->attrib);
|
||||
draw_char_at (vt, x, y, c->ch, c->attrib, c->width, c->combiningglyph);
|
||||
}
|
||||
}
|
||||
|
||||
@ -773,9 +763,9 @@ vncterm_show_cursor (vncTerm *vt, int show)
|
||||
if (show) {
|
||||
TextAttributes attrib = vt->default_attrib;
|
||||
attrib.invers = !(attrib.invers); /* invert fg and bg */
|
||||
draw_char_at (vt, x, y, c->ch, attrib);
|
||||
draw_char_at (vt, x, y, c->ch, attrib, c->width, c->combiningglyph);
|
||||
} else {
|
||||
draw_char_at (vt, x, y, c->ch, c->attrib);
|
||||
draw_char_at (vt, x, y, c->ch, c->attrib, c->width, c->combiningglyph);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -791,8 +781,8 @@ vncterm_refresh (vncTerm *vt)
|
||||
for(y = 0; y < vt->height; y++) {
|
||||
TextCell *c = vt->cells + y1 * vt->width;
|
||||
for(x = 0; x < vt->width; x++) {
|
||||
draw_char_at (vt, x, y, c->ch, c->attrib);
|
||||
c++;
|
||||
draw_char_at (vt, x, y, c->ch, c->attrib, c->width, c->combiningglyph);
|
||||
c += c->width;
|
||||
}
|
||||
if (++y1 == vt->total_height)
|
||||
y1 = 0;
|
||||
@ -841,6 +831,8 @@ vncterm_scroll_down (vncTerm *vt, int top, int bottom, int lines)
|
||||
for(j = 0; j < vt->width; j++) {
|
||||
c->attrib = vt->default_attrib;
|
||||
c->ch = ' ';
|
||||
c->width = 1;
|
||||
c->combiningglyph = 0;
|
||||
c++;
|
||||
}
|
||||
}
|
||||
@ -890,6 +882,8 @@ vncterm_scroll_up (vncTerm *vt, int top, int bottom, int lines, int moveattr)
|
||||
for(j = 0; j < vt->width; j++) {
|
||||
c->attrib = vt->default_attrib;
|
||||
c->ch = ' ';
|
||||
c->width = 1;
|
||||
c->combiningglyph = 0;
|
||||
c++;
|
||||
}
|
||||
}
|
||||
@ -974,6 +968,8 @@ vncterm_put_lf (vncTerm *vt)
|
||||
int x;
|
||||
for (x = 0; x < vt->width; x++) {
|
||||
c->ch = ' ';
|
||||
c->width = 1;
|
||||
c->combiningglyph = 0;
|
||||
c->attrib = vt->default_attrib;
|
||||
c++;
|
||||
}
|
||||
@ -1196,9 +1192,7 @@ vncterm_gotoxy (vncTerm *vt, int x, int y)
|
||||
|
||||
if (x < 0) {
|
||||
x = 0;
|
||||
}
|
||||
|
||||
if (x >= vt->width) {
|
||||
} else if (x >= vt->width) {
|
||||
x = vt->width - 1;
|
||||
}
|
||||
|
||||
@ -1206,9 +1200,7 @@ vncterm_gotoxy (vncTerm *vt, int x, int y)
|
||||
|
||||
if (y < 0) {
|
||||
y = 0;
|
||||
}
|
||||
|
||||
if (y >= vt->height) {
|
||||
} else if (y >= vt->height) {
|
||||
y = vt->height - 1;
|
||||
}
|
||||
|
||||
@ -1377,6 +1369,7 @@ vncterm_putchar (vncTerm *vt, unicode ch)
|
||||
}
|
||||
break;
|
||||
} else if (ch == ';') {
|
||||
vt->esc_has_par = 1;
|
||||
vt->esc_count++;
|
||||
break;
|
||||
} else {
|
||||
@ -1427,10 +1420,7 @@ vncterm_putchar (vncTerm *vt, unicode ch)
|
||||
if (vt->esc_buf[0] == 0) {
|
||||
vt->esc_buf[0] = 1;
|
||||
}
|
||||
vt->cy -= vt->esc_buf[0];
|
||||
if (vt->cy < 0) {
|
||||
vt->cy = 0;
|
||||
}
|
||||
vncterm_gotoxy (vt, vt->cx, vt->cy - vt->esc_buf[0]);
|
||||
break;
|
||||
case 'B':
|
||||
case 'e':
|
||||
@ -1438,10 +1428,7 @@ vncterm_putchar (vncTerm *vt, unicode ch)
|
||||
if (vt->esc_buf[0] == 0) {
|
||||
vt->esc_buf[0] = 1;
|
||||
}
|
||||
vt->cy += vt->esc_buf[0];
|
||||
if (vt->cy >= vt->height) {
|
||||
vt->cy = vt->height - 1;
|
||||
}
|
||||
vncterm_gotoxy (vt, vt->cx, vt->cy + vt->esc_buf[0]);
|
||||
break;
|
||||
case 'C':
|
||||
case 'a':
|
||||
@ -1449,20 +1436,14 @@ vncterm_putchar (vncTerm *vt, unicode ch)
|
||||
if (vt->esc_buf[0] == 0) {
|
||||
vt->esc_buf[0] = 1;
|
||||
}
|
||||
vt->cx += vt->esc_buf[0];
|
||||
if (vt->cx >= vt->width) {
|
||||
vt->cx = vt->width - 1;
|
||||
}
|
||||
vncterm_gotoxy (vt, vt->cx + vt->esc_buf[0], vt->cy);
|
||||
break;
|
||||
case 'D':
|
||||
/* move cursor left */
|
||||
if (vt->esc_buf[0] == 0) {
|
||||
vt->esc_buf[0] = 1;
|
||||
}
|
||||
vt->cx -= vt->esc_buf[0];
|
||||
if (vt->cx < 0) {
|
||||
vt->cx = 0;
|
||||
}
|
||||
vncterm_gotoxy (vt, vt->cx - vt->esc_buf[0], vt->cy);
|
||||
break;
|
||||
case 'G':
|
||||
case '`':
|
||||
@ -1584,6 +1565,8 @@ vncterm_putchar (vncTerm *vt, unicode ch)
|
||||
*dst = *src;
|
||||
vncterm_update_xy (vt, x + c, vt->cy);
|
||||
src->ch = ' ';
|
||||
src->width = 1;
|
||||
src->combiningglyph = 0;
|
||||
src->attrib = vt->default_attrib;
|
||||
vncterm_update_xy (vt, x, vt->cy);
|
||||
}
|
||||
@ -1622,6 +1605,8 @@ vncterm_putchar (vncTerm *vt, unicode ch)
|
||||
*dst = *src;
|
||||
vncterm_update_xy (vt, x + c, vt->cy);
|
||||
src->ch = ' ';
|
||||
src->width = 1;
|
||||
src->combiningglyph = 0;
|
||||
src->attrib = vt->cur_attrib;
|
||||
vncterm_update_xy (vt, x, vt->cy);
|
||||
}
|
||||
@ -1777,11 +1762,25 @@ vncterm_putchar (vncTerm *vt, unicode ch)
|
||||
}
|
||||
|
||||
int y1 = (vt->y_base + vt->cy) % vt->total_height;
|
||||
TextCell *c = &vt->cells[y1*vt->width + vt->cx];
|
||||
c->attrib = vt->cur_attrib;
|
||||
c->ch = ch;
|
||||
vncterm_update_xy (vt, vt->cx, vt->cy);
|
||||
vt->cx++;
|
||||
int width = wcwidth(ch);
|
||||
if (width > 0) {
|
||||
// normal/wide character
|
||||
TextCell *c = &vt->cells[y1*vt->width + vt->cx];
|
||||
c->attrib = vt->cur_attrib;
|
||||
c->ch = ch;
|
||||
c->width = width;
|
||||
c->combiningglyph = 0;
|
||||
vncterm_update_xy (vt, vt->cx, vt->cy);
|
||||
vt->cx += width;
|
||||
} else if (width == 0) {
|
||||
// combiningglyph
|
||||
TextCell *c = &vt->cells[y1*vt->width + vt->cx - 1];
|
||||
c->attrib = vt->cur_attrib;
|
||||
c->combiningglyph = ch;
|
||||
vncterm_update_xy (vt, vt->cx - 1, vt->cy);
|
||||
} else {
|
||||
// non printable character, so we do not save them
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@ -1812,7 +1811,11 @@ vncterm_puts (vncTerm *vt, const char *buf, int len)
|
||||
vt->utf_char = (vt->utf_char << 6) | (c & 0x3f);
|
||||
vt->utf_count--;
|
||||
if (vt->utf_count == 0) {
|
||||
tc = vt->utf_char;
|
||||
if (vt->utf_char <= USHRT_MAX) {
|
||||
tc = vt->utf_char;
|
||||
} else {
|
||||
tc = 0;
|
||||
}
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
@ -2198,6 +2201,63 @@ new_client (rfbClientPtr client)
|
||||
|
||||
static char *vncticket = NULL;
|
||||
|
||||
static void
|
||||
MakeRichCursor(rfbScreenInfoPtr rfbScreen)
|
||||
{
|
||||
int w = 16,
|
||||
h = 16;
|
||||
rfbCursorPtr c = rfbScreen->cursor;
|
||||
char bitmap[] =
|
||||
" "
|
||||
" x "
|
||||
" xx "
|
||||
" xxx "
|
||||
" xxxx "
|
||||
" xxxxx "
|
||||
" xxxxxx "
|
||||
" xxxxxxx "
|
||||
" xxxxxxxx "
|
||||
" xxxxxxxxx "
|
||||
" xxxxxxxxxx "
|
||||
" xxxx "
|
||||
" xxx "
|
||||
" xx "
|
||||
" x "
|
||||
" ";
|
||||
char edge[] =
|
||||
" "
|
||||
" x "
|
||||
" xx "
|
||||
" x x "
|
||||
" x x "
|
||||
" x x "
|
||||
" x x "
|
||||
" x x "
|
||||
" x x "
|
||||
" x x "
|
||||
" x xxxxxx "
|
||||
" x x "
|
||||
" x x "
|
||||
" xx "
|
||||
" x "
|
||||
" ";
|
||||
|
||||
c = rfbScreen->cursor = rfbMakeXCursor(w,h,bitmap,bitmap);
|
||||
c->richSource = (unsigned char*)calloc(w*h, 1);
|
||||
c->cleanupRichSource = TRUE;
|
||||
|
||||
for(int j=0;j<h;j++) {
|
||||
for(int i=0;i<w;i++) {
|
||||
unsigned int pos = j*w+i;
|
||||
if (edge[pos] == 'x') {
|
||||
c->richSource[pos] = 15; // white
|
||||
} else {
|
||||
c->richSource[pos] = 0; // black
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vncTerm *
|
||||
create_vncterm (int argc, char** argv, int maxx, int maxy)
|
||||
{
|
||||
@ -2205,6 +2265,7 @@ create_vncterm (int argc, char** argv, int maxx, int maxy)
|
||||
|
||||
rfbScreenInfoPtr screen = rfbGetScreen (&argc, argv, maxx, maxy, 8, 1, 1);
|
||||
screen->frameBuffer=(char*)calloc(maxx*maxy, 1);
|
||||
MakeRichCursor(screen);
|
||||
|
||||
char **passwds = calloc(sizeof(char**), 2);
|
||||
|
||||
@ -2297,6 +2358,8 @@ main (int argc, char** argv)
|
||||
int i;
|
||||
char **cmdargv = NULL;
|
||||
char *command = "/bin/bash"; // execute normal shell as default
|
||||
int fontfd;
|
||||
struct stat sb;
|
||||
int pid;
|
||||
int master;
|
||||
char ptyname[1024];
|
||||
@ -2304,6 +2367,8 @@ main (int argc, char** argv)
|
||||
struct timeval tv, tv1;
|
||||
time_t elapsed, cur_time;
|
||||
struct winsize dimensions;
|
||||
unsigned long width = 0;
|
||||
unsigned long height = 0;
|
||||
|
||||
if (gnutls_global_init () < 0) {
|
||||
fprintf(stderr, "gnutls_global_init failed\n");
|
||||
@ -2343,6 +2408,22 @@ main (int argc, char** argv)
|
||||
CHECK_ARGC (argc, argv, i);
|
||||
auth_perm = argv[i+1];
|
||||
rfbPurgeArguments(&argc, &i, 2, argv); i--;
|
||||
} else if (!strcmp (argv[i], "-width")) {
|
||||
CHECK_ARGC (argc, argv, i);
|
||||
errno = 0;
|
||||
width = strtoul(argv[i+1], NULL, 10);
|
||||
if (errno == 0 && width >= 16 && width < 0xFFFF) {
|
||||
screen_width = width;
|
||||
}
|
||||
rfbPurgeArguments(&argc, &i, 2, argv); i--;
|
||||
} else if (!strcmp (argv[i], "-height")) {
|
||||
CHECK_ARGC (argc, argv, i);
|
||||
errno = 0;
|
||||
height = strtoul(argv[i+1], NULL, 10);
|
||||
if (errno == 0 && height >= 32 && height < 0xFFFF) {
|
||||
screen_height = height;
|
||||
}
|
||||
rfbPurgeArguments(&argc, &i, 2, argv); i--;
|
||||
} else if (!strcmp (argv[i], "-notls")) {
|
||||
rfbPurgeArguments(&argc, &i, 1, argv); i--;
|
||||
if ((vncticket = getenv("PVE_VNC_TICKET")) == NULL) {
|
||||
@ -2362,7 +2443,24 @@ main (int argc, char** argv)
|
||||
rfbLogEnable (0);
|
||||
#endif
|
||||
|
||||
vncTerm *vt = create_vncterm (argc, argv, 745, 400);
|
||||
// mmap font file
|
||||
fontfd = open(FONTFILE, O_RDONLY);
|
||||
if (fontfd == -1) {
|
||||
perror("Error opening Fontfile 'FONTFILE'");
|
||||
exit (-1);
|
||||
}
|
||||
if (fstat(fontfd, &sb) == -1) {
|
||||
perror("Stat on 'FONTFILE' failed");
|
||||
exit (-1);
|
||||
}
|
||||
fontdata = mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, fontfd, 0);
|
||||
if (fontdata == MAP_FAILED) {
|
||||
perror("Could not mmap 'FONTFILE'");
|
||||
exit (-1);
|
||||
}
|
||||
|
||||
close(fontfd);
|
||||
vncTerm *vt = create_vncterm (argc, argv, screen_width, screen_height);
|
||||
|
||||
setlocale(LC_ALL, ""); // set from environment
|
||||
|
||||
@ -2462,9 +2560,12 @@ main (int argc, char** argv)
|
||||
}
|
||||
}
|
||||
|
||||
rfbScreenCleanup(vt->screen);
|
||||
|
||||
kill (pid, 9);
|
||||
int status;
|
||||
waitpid(pid, &status, 0);
|
||||
|
||||
munmap(fontdata, sb.st_size);
|
||||
exit (0);
|
||||
}
|
||||
|
@ -17,6 +17,8 @@ typedef struct TextAttributes {
|
||||
|
||||
typedef struct TextCell {
|
||||
unicode ch;
|
||||
unicode combiningglyph;
|
||||
short width;
|
||||
TextAttributes attrib;
|
||||
} TextCell;
|
||||
|
||||
@ -48,19 +50,19 @@ typedef struct vncTerm {
|
||||
// cursor
|
||||
TextAttributes cur_attrib;
|
||||
TextAttributes cur_attrib_saved;
|
||||
int tty_state; // 0 - normal, 1 - ESC, 2 - CSI
|
||||
unsigned int tty_state; // 0 - normal, 1 - ESC, 2 - CSI
|
||||
int cx; // cursor x position
|
||||
int cy; // cursor y position
|
||||
int cx_saved; // saved cursor x position
|
||||
int cy_saved; // saved cursor y position
|
||||
int esc_buf[MAX_ESC_PARAMS];
|
||||
int esc_count;
|
||||
int esc_ques;
|
||||
int esc_has_par;
|
||||
unsigned int esc_buf[MAX_ESC_PARAMS];
|
||||
unsigned int esc_count;
|
||||
unsigned int esc_ques;
|
||||
unsigned int esc_has_par;
|
||||
char osc_textbuf[4096];
|
||||
char osc_cmd;
|
||||
int region_top;
|
||||
int region_bottom;
|
||||
unsigned int region_top;
|
||||
unsigned int region_bottom;
|
||||
|
||||
unsigned int charset:1; // G0 or G1
|
||||
unsigned int charset_saved:1; // G0 or G1
|
||||
|
4235
wchardata.c
Normal file
4235
wchardata.c
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user