From d9f8cd1ab09c48faddd7ea8dd30087a0d53343f4 Mon Sep 17 00:00:00 2001 From: "Chang.H.S" Date: Tue, 27 Nov 2012 16:48:34 +0900 Subject: [PATCH] update base pkgs.. --- meta-openvuplus/classes/git-project.bbclass | 7 + meta-openvuplus/classes/opendreambox-git.bbclass | 5 + .../dreambox-keymaps/dreambox-keymaps.bb | 18 + .../dreambox-keymaps/dreambox-keymaps/GPL-1.0 | 252 +++++ .../dreambox-keymaps/dream-de.info | 2 + .../dreambox-keymaps/dream-de.kmap | Bin 0 -> 2823 bytes .../dreambox-keymaps/dreambox-keymaps/eng.info | 2 + .../dreambox-keymaps/dreambox-keymaps/eng.kmap | Bin 0 -> 2823 bytes .../hddtemp/hddtemp/hddtemp-no-nls-support.patch | 66 ++ .../recipes-base/hddtemp/hddtemp_0.3-beta15.bb | 22 + meta-openvuplus/recipes-base/joe/joe_3.7.bb | 14 + .../mc/mc-4.8.1/optional-extfs-dir.patch | 18 + .../recipes-base/mc/mc-4.8.1/optional-hints.patch | 17 + .../mc/mc-4.8.1/optional-sfs-ini.patch | 17 + .../mc/mc-4.8.1/optional-syntax-file.patch | 18 + meta-openvuplus/recipes-base/mc/mc_4.8.1.bbappend | 26 + .../mtd/mtd-utils-1.4.9/disable-ubi.patch | 19 + .../recipes-base/mtd/mtd-utils_1.4.9.bbappend | 7 + meta-openvuplus/recipes-base/ncdu/ncdu_1.8.bb | 11 + .../recipes-base/ppp/ppp_2.4.5.bbappend | 8 + ...-client-Push-the-domain-and-netbios-name-.patch | 31 + .../samba/samba-3.0.37/configure.patch | 213 ++++ .../samba/samba-3.0.37/kernel-oplocks.patch | 20 + .../samba-3.0.37/samba-3.0-CVE-2012-0870.patch | 91 ++ .../samba-3.0.37/samba-3.0.37-CVE-2012-1182.patch | 59 + .../samba-3.0.37/uclibc-strlcpy-strlcat.patch | 46 + .../recipes-base/samba/samba/01samba-kill | 5 + .../recipes-base/samba/samba/01samba-start | 3 + .../recipes-base/samba/samba/config-lfs.patch | 47 + meta-openvuplus/recipes-base/samba/samba/init | 58 + .../recipes-base/samba/samba/quota.patch | 11 + meta-openvuplus/recipes-base/samba/samba/smb.conf | 29 + meta-openvuplus/recipes-base/samba/samba/tdb.pc | 11 + .../recipes-base/samba/samba/volatiles.03_samba | 2 + meta-openvuplus/recipes-base/samba/samba_3.0.37.bb | 20 + .../recipes-base/samba/samba_3.0.37.bbappend | 31 + .../recipes-base/smartmontools/smartmontools.inc | 10 + .../smartmontools/smartmontools_5.42.bb | 6 + .../recipes-base/tasks/task-vuplus-base.bb | 8 + .../recipes-base/tasks/task-vuplus-base.inc | 76 ++ .../recipes-base/timezones/files/GPL-1.0 | 252 +++++ .../recipes-base/timezones/files/zoneinfo.tar.bz2 | Bin 0 -> 38585 bytes .../timezones/timezones-alternative.bb | 25 + .../recipes-base/tuxbox/tuxbox-common_0.1.bb | 18 + .../recipes-base/tuxcom/tuxbox-tuxcom-32bpp.bb | 32 + .../tuxcom/tuxbox-tuxcom-32bpp/32bpp.diff | 1136 ++++++++++++++++++++ .../tuxcom/tuxbox-tuxcom-32bpp/add_e2_plugin.diff | 48 + .../tuxcom/tuxbox-tuxcom-32bpp/add_font.diff | Bin 0 -> 67589 bytes .../tuxcom/tuxbox-tuxcom-32bpp/fix_smstext.diff | 48 + .../tuxcom/tuxbox-tuxcom-32bpp/largefile.diff | 11 + .../tuxcom/tuxbox-tuxcom-32bpp/makefiles.diff | 505 +++++++++ .../support_newer_freetype.diff | 78 ++ .../recipes-base/tuxtxt/tuxbox-libtuxtxt.bb | 28 + .../tuxtxt/tuxbox-libtuxtxt/32bpp.diff | 738 +++++++++++++ .../tuxtxt/tuxbox-libtuxtxt/acinclude.m4 | 385 +++++++ .../tuxbox-libtuxtxt/allow_different_demux.diff | 95 ++ .../tuxtxt/tuxbox-libtuxtxt/ignorelibs.patch | 11 + .../tuxtxt/tuxbox-libtuxtxt/libz.patch | 10 + .../tuxbox-libtuxtxt/resize_framebuffer.diff | 48 + .../tuxtxt/tuxbox-libtuxtxt/videodev2.patch | 11 + .../recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp.bb | 32 + .../tuxtxt/tuxbox-tuxtxt-32bpp/32bpp.diff | 388 +++++++ .../tuxbox-tuxtxt-32bpp/add_advanced_rc.diff | 161 +++ .../tuxbox-tuxtxt-32bpp/add_new_default_conf.diff | 36 + .../tuxbox-tuxtxt-32bpp/allow_different_demux.diff | 77 ++ .../tuxtxt/tuxbox-tuxtxt-32bpp/makefiles.diff | 548 ++++++++++ .../tuxtxt/tuxbox-tuxtxt-32bpp/nonblocking.diff | 142 +++ .../tuxtxt/tuxbox-tuxtxt-32bpp/plugin.py | 60 ++ .../tuxbox-tuxtxt-32bpp/vuplus/tuxtxt_vuplus.patch | 12 + .../recipes-base/usbtunerhelper/usbtunerhelper.bb | 23 + .../usbtunerhelper/usbtunerhelper/GPL-2.0 | 132 +++ .../usbtunerhelper/usbtunerhelper.sh | 24 + .../recipes-base/vsftpd/vsftpd/01-builddefs.patch | 18 + .../recipes-base/vsftpd/vsftpd/02-config.patch | 120 +++ .../recipes-base/vsftpd/vsftpd/03-db-doc.patch | 19 + .../recipes-base/vsftpd/vsftpd/04-link-local.patch | 91 ++ .../vsftpd/vsftpd/05-whitespaces.patch | 81 ++ .../recipes-base/vsftpd/vsftpd/06-greedy.patch | 32 + .../recipes-base/vsftpd/vsftpd/07-utf8.patch | 58 + .../recipes-base/vsftpd/vsftpd/08-manpage.patch | 23 + .../recipes-base/vsftpd/vsftpd/09-s390.patch | 15 + .../recipes-base/vsftpd/vsftpd/10-remote-dos.patch | 69 ++ .../recipes-base/vsftpd/vsftpd/vsftpd.conf | 105 ++ .../recipes-base/vsftpd/vsftpd/vsftpd.socket | 8 + .../recipes-base/vsftpd/vsftpd/vsftpd.xinetd.in | 7 + .../recipes-base/vsftpd/vsftpd/vsftpd@.service | 5 + .../recipes-base/vsftpd/vsftpd_2.3.5.bb | 100 ++ .../recipes-base/vuplus-vucamd/vuplus-vucamd.bb | 25 + .../vuplus-vucamd/vuplus-vucamd/Proprietary | 1 + .../vuplus-vucamd/vuplus-vucamd/vucamd | Bin 0 -> 70300 bytes .../vuplus-vucamd/vuplus-vucamd/vucamd.sh | 38 + .../recipes-base/zeroconf/zeroconf_0.9.bbappend | 5 + .../recipes-vuplus/tasks/task-vuplus-base.bb | 8 + .../recipes-vuplus/tasks/task-vuplus-base.inc | 78 ++ meta-openvuplus/smartmontools/smartmontools.inc | 10 + .../smartmontools/smartmontools_5.42.bb | 6 + 96 files changed, 7342 insertions(+) create mode 100644 meta-openvuplus/classes/git-project.bbclass create mode 100644 meta-openvuplus/classes/opendreambox-git.bbclass create mode 100644 meta-openvuplus/dreambox-keymaps/dreambox-keymaps.bb create mode 100644 meta-openvuplus/dreambox-keymaps/dreambox-keymaps/GPL-1.0 create mode 100644 meta-openvuplus/dreambox-keymaps/dreambox-keymaps/dream-de.info create mode 100644 meta-openvuplus/dreambox-keymaps/dreambox-keymaps/dream-de.kmap create mode 100644 meta-openvuplus/dreambox-keymaps/dreambox-keymaps/eng.info create mode 100644 meta-openvuplus/dreambox-keymaps/dreambox-keymaps/eng.kmap create mode 100644 meta-openvuplus/recipes-base/hddtemp/hddtemp/hddtemp-no-nls-support.patch create mode 100644 meta-openvuplus/recipes-base/hddtemp/hddtemp_0.3-beta15.bb create mode 100644 meta-openvuplus/recipes-base/joe/joe_3.7.bb create mode 100644 meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-extfs-dir.patch create mode 100644 meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-hints.patch create mode 100644 meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-sfs-ini.patch create mode 100644 meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-syntax-file.patch create mode 100644 meta-openvuplus/recipes-base/mc/mc_4.8.1.bbappend create mode 100644 meta-openvuplus/recipes-base/mtd/mtd-utils-1.4.9/disable-ubi.patch create mode 100644 meta-openvuplus/recipes-base/mtd/mtd-utils_1.4.9.bbappend create mode 100644 meta-openvuplus/recipes-base/ncdu/ncdu_1.8.bb create mode 100644 meta-openvuplus/recipes-base/ppp/ppp_2.4.5.bbappend create mode 100644 meta-openvuplus/recipes-base/samba/samba-3.0.37/0001-s3-schannel-client-Push-the-domain-and-netbios-name-.patch create mode 100644 meta-openvuplus/recipes-base/samba/samba-3.0.37/configure.patch create mode 100644 meta-openvuplus/recipes-base/samba/samba-3.0.37/kernel-oplocks.patch create mode 100644 meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0-CVE-2012-0870.patch create mode 100644 meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0.37-CVE-2012-1182.patch create mode 100644 meta-openvuplus/recipes-base/samba/samba-3.0.37/uclibc-strlcpy-strlcat.patch create mode 100644 meta-openvuplus/recipes-base/samba/samba/01samba-kill create mode 100644 meta-openvuplus/recipes-base/samba/samba/01samba-start create mode 100644 meta-openvuplus/recipes-base/samba/samba/config-lfs.patch create mode 100644 meta-openvuplus/recipes-base/samba/samba/init create mode 100644 meta-openvuplus/recipes-base/samba/samba/quota.patch create mode 100644 meta-openvuplus/recipes-base/samba/samba/smb.conf create mode 100644 meta-openvuplus/recipes-base/samba/samba/tdb.pc create mode 100644 meta-openvuplus/recipes-base/samba/samba/volatiles.03_samba create mode 100644 meta-openvuplus/recipes-base/samba/samba_3.0.37.bb create mode 100644 meta-openvuplus/recipes-base/samba/samba_3.0.37.bbappend create mode 100644 meta-openvuplus/recipes-base/smartmontools/smartmontools.inc create mode 100644 meta-openvuplus/recipes-base/smartmontools/smartmontools_5.42.bb create mode 100644 meta-openvuplus/recipes-base/tasks/task-vuplus-base.bb create mode 100644 meta-openvuplus/recipes-base/tasks/task-vuplus-base.inc create mode 100644 meta-openvuplus/recipes-base/timezones/files/GPL-1.0 create mode 100644 meta-openvuplus/recipes-base/timezones/files/zoneinfo.tar.bz2 create mode 100644 meta-openvuplus/recipes-base/timezones/timezones-alternative.bb create mode 100644 meta-openvuplus/recipes-base/tuxbox/tuxbox-common_0.1.bb create mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp.bb create mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/32bpp.diff create mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/add_e2_plugin.diff create mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/add_font.diff create mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/fix_smstext.diff create mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/largefile.diff create mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/makefiles.diff create mode 100644 meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/support_newer_freetype.diff create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt.bb create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/32bpp.diff create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/acinclude.m4 create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/allow_different_demux.diff create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/ignorelibs.patch create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/libz.patch create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/resize_framebuffer.diff create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/videodev2.patch create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp.bb create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/32bpp.diff create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_advanced_rc.diff create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_new_default_conf.diff create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/allow_different_demux.diff create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/makefiles.diff create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/nonblocking.diff create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/plugin.py create mode 100644 meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/vuplus/tuxtxt_vuplus.patch create mode 100644 meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper.bb create mode 100644 meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/GPL-2.0 create mode 100644 meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/usbtunerhelper.sh create mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/01-builddefs.patch create mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/02-config.patch create mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/03-db-doc.patch create mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/04-link-local.patch create mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/05-whitespaces.patch create mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/06-greedy.patch create mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/07-utf8.patch create mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/08-manpage.patch create mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/09-s390.patch create mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/10-remote-dos.patch create mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.conf create mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.socket create mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.xinetd.in create mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd@.service create mode 100644 meta-openvuplus/recipes-base/vsftpd/vsftpd_2.3.5.bb create mode 100644 meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd.bb create mode 100644 meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/Proprietary create mode 100755 meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/vucamd create mode 100644 meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/vucamd.sh create mode 100644 meta-openvuplus/recipes-base/zeroconf/zeroconf_0.9.bbappend create mode 100644 meta-openvuplus/recipes-vuplus/tasks/task-vuplus-base.bb create mode 100644 meta-openvuplus/recipes-vuplus/tasks/task-vuplus-base.inc create mode 100644 meta-openvuplus/smartmontools/smartmontools.inc create mode 100644 meta-openvuplus/smartmontools/smartmontools_5.42.bb diff --git a/meta-openvuplus/classes/git-project.bbclass b/meta-openvuplus/classes/git-project.bbclass new file mode 100644 index 0000000..57c1331 --- /dev/null +++ b/meta-openvuplus/classes/git-project.bbclass @@ -0,0 +1,7 @@ +S = "${WORKDIR}/git" + +inherit gitpkgv + +RECIPE_PV := "${PV}" +PV = "${RECIPE_PV}+git${SRCPV}" +PKGV = "${RECIPE_PV}+git${GITPKGV}" diff --git a/meta-openvuplus/classes/opendreambox-git.bbclass b/meta-openvuplus/classes/opendreambox-git.bbclass new file mode 100644 index 0000000..ac25009 --- /dev/null +++ b/meta-openvuplus/classes/opendreambox-git.bbclass @@ -0,0 +1,5 @@ +OPENDREAMBOX_PROJECT ?= "${BPN}" + +SRC_URI += "git://git.opendreambox.org/git/${OPENDREAMBOX_PROJECT}.git;protocol=git" + +inherit git-project diff --git a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps.bb b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps.bb new file mode 100644 index 0000000..4ab2603 --- /dev/null +++ b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps.bb @@ -0,0 +1,18 @@ +DESCRIPTION = "Dreambox Keyboard Keymap files" +LICENSE = "GPL" +LIC_FILES_CHKSUM = "file://${THISDIR}/${PN}/GPL-1.0;md5=e9e36a9de734199567a4d769498f743d" +MAINTAINER = "Felix Domke " + +SRC_URI = "file://dream-de.info file://dream-de.kmap file://eng.info file://eng.kmap" + +PR = "r1" + +FILES_${PN} = "/" +PACKAGE_ARCH = "all" + +do_install() { + install -d ${D}/usr/share/keymaps + for x in dream-de.info dream-de.kmap eng.info eng.kmap; do + install -m 0644 ${WORKDIR}/$x ${D}/usr/share/keymaps/$x + done +} diff --git a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/GPL-1.0 b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/GPL-1.0 new file mode 100644 index 0000000..9d4ef93 --- /dev/null +++ b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/GPL-1.0 @@ -0,0 +1,252 @@ + +GNU General Public License, version 1 + + GNU GENERAL PUBLIC LICENSE + Version 1, February 1989 + + Copyright (C) 1989 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The license agreements of most software companies try to keep users +at the mercy of those companies. By contrast, our General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. The +General Public License applies to the Free Software Foundation`s +software and to any other program whose authors commit to using it. +You can use it for your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Specifically, the General Public License is designed to make +sure that you have the freedom to give away or sell copies of free +software, that you receive source code or can get it if you want it, +that you can change the software or use pieces of it in new free +programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of a such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must tell them their rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author`s protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors` reputations. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any program or other work which +contains a notice placed by the copyright holder saying it may be +distributed under the terms of this General Public License. The +"Program", below, refers to any such program or work, and a "work based +on the Program" means either the Program or any work containing the +Program or a portion of it, either verbatim or with modifications. Each +licensee is addressed as "you". + + 1. You may copy and distribute verbatim copies of the Program`s source +code as you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this +General Public License and to the absence of any warranty; and give any +other recipients of the Program a copy of this General Public License +along with the Program. You may charge a fee for the physical act of +transferring a copy. + + 2. You may modify your copy or copies of the Program or any portion of +it, and copy and distribute such modifications under the terms of Paragraph +1 above, provided that you also do the following: + + a) cause the modified files to carry prominent notices stating that + you changed the files and the date of any change; and + + b) cause the whole of any work that you distribute or publish, that + in whole or in part contains the Program or any part thereof, either + with or without modifications, to be licensed at no charge to all + third parties under the terms of this General Public License (except + that you may choose to grant warranty protection to some or all + third parties, at your option). + + c) If the modified program normally reads commands interactively when + run, you must cause it, when started running for such interactive use + in the simplest and most usual way, to print or display an + announcement including an appropriate copyright notice and a notice + that there is no warranty (or else, saying that you provide a + warranty) and that users may redistribute the program under these + conditions, and telling the user how to view a copy of this General + Public License. + + d) You may charge a fee for the physical act of transferring a + copy, and you may at your option offer warranty protection in + exchange for a fee. + +Mere aggregation of another independent work with the Program (or its +derivative) on a volume of a storage or distribution medium does not bring +the other work under the scope of these terms. + + 3. You may copy and distribute the Program (or a portion or derivative of +it, under Paragraph 2) in object code or executable form under the terms of +Paragraphs 1 and 2 above provided that you also do one of the following: + + a) accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of + Paragraphs 1 and 2 above; or, + + b) accompany it with a written offer, valid for at least three + years, to give any third party free (except for a nominal charge + for the cost of distribution) a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of + Paragraphs 1 and 2 above; or, + + c) accompany it with the information you received as to where the + corresponding source code may be obtained. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form alone.) + +Source code for a work means the preferred form of the work for making +modifications to it. For an executable file, complete source code means +all the source code for all modules it contains; but, as a special +exception, it need not include source code for modules which are standard +libraries that accompany the operating system on which the executable +file runs, or for standard header files or definitions files that +accompany that operating system. + + 4. You may not copy, modify, sublicense, distribute or transfer the +Program except as expressly provided under this General Public License. +Any attempt otherwise to copy, modify, sublicense, distribute or transfer +the Program is void, and will automatically terminate your rights to use +the Program under this License. However, parties who have received +copies, or rights to use copies, from you under this General Public +License will not have their licenses terminated so long as such parties +remain in full compliance. + + 5. By copying, distributing or modifying the Program (or any work based +on the Program) you indicate your acceptance of this license to do so, +and all its terms and conditions. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the original +licensor to copy, distribute or modify the Program subject to these +terms and conditions. You may not impose any further restrictions on the +recipients` exercise of the rights granted herein. + + 7. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of the license which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +the license, you may choose any version ever published by the Free Software +Foundation. + + 8. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to humanity, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + + To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively convey +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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; either version 1, or (at your option) + any later version. + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19xx name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w`. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c` for details. + +The hypothetical commands `show w` and `show c` should show the +appropriate parts of the General Public License. Of course, the +commands you use may be called something other than `show w` and `show +c`; they could even be mouse-clicks or menu items--whatever suits your +program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + program `Gnomovision` (a program to direct compilers to make passes + at assemblers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +That`s all there is to it! + diff --git a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/dream-de.info b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/dream-de.info new file mode 100644 index 0000000..d7f5b07 --- /dev/null +++ b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/dream-de.info @@ -0,0 +1,2 @@ +kmap=dream-de.kmap +name=Dreambox Keyboard Deutsch diff --git a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/dream-de.kmap b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/dream-de.kmap new file mode 100644 index 0000000000000000000000000000000000000000..693317a781145b060e19509cb4b353d69b7a58d7 GIT binary patch literal 2823 zcmd^>*-{%v6o&uPt=9alBLQOHf(@9>;C;6--uHdqV#i?P4P)aKV`Ka-sZ`}QmE{fc z47o~GZt@Jd%0*fui9#Su2)>J^q?w+XbEd!k&-q6qW1~~!!xJKc*)RTo9|N>t6E)tCBO-|HKFtj~2q|3<%&$mp=X();>AAL=80qGS40 z|I$A(7y+F+rSJ5fzSR+ZrsEjEdaR3J(~-q$6X8z0>Q)lsBq@ zHf6;cYb|W0NrssYN=npV?q(|@V>4)t#5k!CrRN1V2 zH8(bY9QfPOf$y;fUFgOJ^r8=Yu@84+{tJ3dkLX3ctT*+Fp3rl8UVq2hnE!xY(!+XG zkLhtesi*X`{-(cTDDd~_4ZW_1^r{}zvw8-5up8gZ;r}6?Ri#u(R;r~&+GJJWw@dI3 z$!cjYC791|w8(E#|BgSG4?p6k!fJfLE!@UOd|ept*GYU=s(-kDro8@fuIVUb%;}GB z^ZMhL+<6B5eSHu(=+8SY?J};?Rk^IIb~Ucn)%jXueAZX{8sFe6e5J4Qjb44)XMC!l z|Fo-j4f%N$e|=MAeBDa)kLMh^Al|nX^A`8Wq5%%os6{jC;8BUH_*$rc2x^c(5)p_L z6zP0ajvq~EghhQgtU#uCKCXX+`frmC>69+%mLBPqK3OaMLI1?(^$!mmkafkG<@fXT zUw-|U=9@qIa{O48umA9buykcM8Z5=XFlxp8GYfMfxCC1B=f51k31yPgKjd9Dze(r( zuiW-|{t#CZRnGs|!cE-FE!@g&+|C``$z9wS`t@giqUQ@va+ELmn(z6BkNKPv;aWd4 zk>N03@jf5$As_Jx$M`h=w9pQnoZ>s)<6DmK8OJ%m^|}7f@#p&A!HI#hF5#R@y2#PR z{_i7CAN=1Zyz{~TeRwT+>kIzRL6>r6{htN@H`UT;s!Vnn{y!7=+u0GA*077++`wM; zaWD7rZp?py*LZ{%d6_qPg(rB9=fl0R|MLJZ@i33_7?1NLPx16De-Cf)IuG$G5ArO} za1VF0;Qu-PQdJ70CF`F<3*++o7x@>y|4Jju=s&Oi`GL21n;%*5f9@}*f5;mAZ*l#@ z3YF-epT&Q#|GfWmx|Ak2S}}jz9|U9nUznd+Hqfz}wQOcx=!Z(q`agv=OfboaWQxi; l{?8^h(z2e06)f?8hW=lq{ulMXV*f8y|MT@X>81Yv`~zCTk&^%b literal 0 HcmV?d00001 diff --git a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/eng.info b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/eng.info new file mode 100644 index 0000000..d73372c --- /dev/null +++ b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/eng.info @@ -0,0 +1,2 @@ +kmap=eng.kmap +name=Keyboard English diff --git a/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/eng.kmap b/meta-openvuplus/dreambox-keymaps/dreambox-keymaps/eng.kmap new file mode 100644 index 0000000000000000000000000000000000000000..15a722f164e16e74b016786d85e82a94ecdda36f GIT binary patch literal 2823 zcmd^>`F9jW6ov1rn(DqaZ}v5-D4>7>vM&-41qIwt7C{M00$~e*Kp>C=n17wBo{R)= z5;-1zN>^8%Is_7JdpLqExRwIrx~R|ey3XsQ z-q#sy$4-2i!WL4Ck4>7bxe+Tlagsz{gAPw4OZt^T4vV+_ae^$PyLkv&&Q%2JW4)TD0e0d;l$WBvFIdi+Lv{3ie3_~R?*G6YOd}Yt{L<6ypDn QLBIXq@B3#8YyJPc0_5grSpWb4 literal 0 HcmV?d00001 diff --git a/meta-openvuplus/recipes-base/hddtemp/hddtemp/hddtemp-no-nls-support.patch b/meta-openvuplus/recipes-base/hddtemp/hddtemp/hddtemp-no-nls-support.patch new file mode 100644 index 0000000..8f6b9c3 --- /dev/null +++ b/meta-openvuplus/recipes-base/hddtemp/hddtemp/hddtemp-no-nls-support.patch @@ -0,0 +1,66 @@ +diff -ru hddtemp-0.3-beta15.orig/configure.in hddtemp-0.3-beta15/configure.in +--- hddtemp-0.3-beta15.orig/configure.in 2005-10-17 20:14:19.000000000 +0100 ++++ hddtemp-0.3-beta15/configure.in 2008-06-27 00:00:46.000000000 +0100 +@@ -17,6 +17,7 @@ + # append the host alias to the tools for cross compiling + AC_HEADER_STDC + AC_CHECK_HEADERS(fcntl.h) ++AC_CHECK_HEADERS(iconv.h) + AC_CHECK_HEADERS(netinet/in.h) + AC_CHECK_TYPE(in_addr_t, ,[AC_DEFINE_UNQUOTED([in_addr_t], [uint32_t], [Define to 'uint32_t' if does not define.])], [#include ]) + +@@ -29,6 +30,8 @@ + AM_GNU_GETTEXT + #AM_GNU_GETTEXT([external]) + ++AC_CHECK_FUNCS([bindtextdomain textdomain iconv]) ++ + dnl reasonable guesses for where stuff is installed + dnl if we don't do that now, the config.h will use ${prefix} + dnl for DEFAULT_DATABASE_PATH. +diff -ru hddtemp-0.3-beta15.orig/src/hddtemp.c hddtemp-0.3-beta15/src/hddtemp.c +--- hddtemp-0.3-beta15.orig/src/hddtemp.c 2006-04-19 03:37:35.000000000 +0100 ++++ hddtemp-0.3-beta15/src/hddtemp.c 2008-06-26 23:59:40.000000000 +0100 +@@ -276,8 +276,12 @@ + backtrace_sigbus(); + + setlocale (LC_ALL, ""); ++#ifdef HAVE_BINDTEXTDOMAIN + bindtextdomain (PACKAGE, LOCALEDIR); ++#endif ++#ifdef HAVE_TEXTDOMAIN + textdomain (PACKAGE); ++#endif + + show_db = debug = numeric = quiet = wakeup = af_hint = syslog_interval = 0; + unit = DEFAULT; +diff -ru hddtemp-0.3-beta15.orig/src/utf8.c hddtemp-0.3-beta15/src/utf8.c +--- hddtemp-0.3-beta15.orig/src/utf8.c 2006-04-19 03:37:02.000000000 +0100 ++++ hddtemp-0.3-beta15/src/utf8.c 2008-06-27 00:02:15.000000000 +0100 +@@ -23,7 +23,9 @@ + + // Standard includes + #include ++#ifdef HAVE_ICONV_H + #include ++#endif + #include + #include + #include +@@ -34,6 +36,7 @@ + + static char *iconv_from_utf8_to_locale(const char *string, const char* fallback_string) + { ++#ifdef HAVE_ICONV + const size_t buffer_inc = 80; // Increment buffer size in 80 bytes step + const char *charset; + iconv_t cd; +@@ -93,6 +96,8 @@ + if (dest_buffer != NULL) + free(dest_buffer); // free buffer + free(src_buffer); // free string ++#endif ++ + return strdup(fallback_string); // and return fallback string + } + diff --git a/meta-openvuplus/recipes-base/hddtemp/hddtemp_0.3-beta15.bb b/meta-openvuplus/recipes-base/hddtemp/hddtemp_0.3-beta15.bb new file mode 100644 index 0000000..8ef9a2c --- /dev/null +++ b/meta-openvuplus/recipes-base/hddtemp/hddtemp_0.3-beta15.bb @@ -0,0 +1,22 @@ +SUMMARY = "Hard disk temperature monitor daemon" +SECTION = "console/network" +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://GPL-2;md5=eb723b61539feef013de476e68b5c50a" +PR = "r1" + +SRC_URI = "http://download.savannah.nongnu.org/releases/${PN}/${PN}-${PV}.tar.bz2;name=tar \ + http://download.savannah.nongnu.org/releases/${PN}/hddtemp.db;name=db \ + file://hddtemp-no-nls-support.patch" +SRC_URI[tar.md5sum] = "8b829339e1ae9df701684ec239021bb8" +SRC_URI[tar.sha256sum] = "618541584054093d53be8a2d9e81c97174f30f00af91cb8700a97e442d79ef5b" +SRC_URI[db.md5sum] = "5321858f8c028d4b1a91a8a5f951f2f8" +SRC_URI[db.sha256sum] = "8b19e70228214562eb10a46bd73b6ea8601e996f2d6527907b560d35b33f5240" + +inherit autotools gettext + +FILES_${PN} += "/usr/share/misc/hddtemp.db" + +do_install_append() { + install -d ${D}/usr/share/misc/ + install -m 0644 ${WORKDIR}/hddtemp.db ${D}/usr/share/misc/hddtemp.db +} diff --git a/meta-openvuplus/recipes-base/joe/joe_3.7.bb b/meta-openvuplus/recipes-base/joe/joe_3.7.bb new file mode 100644 index 0000000..436fd07 --- /dev/null +++ b/meta-openvuplus/recipes-base/joe/joe_3.7.bb @@ -0,0 +1,14 @@ +SUMMARY = "Console text editor with good functionality, good choice for vi-haters." +HOMEPAGE = "http://joe-editor.sourceforge.net/" +SECTION = "console/utils" +LICENSE = "GPL-1.0" +LIC_FILES_CHKSUM = "file://COPYING;md5=da10ed7cf8038981c580e11c1d3e8fb6" +PR = "r2" + +SRC_URI = "${SOURCEFORGE_MIRROR}/joe-editor/joe-${PV}.tar.gz" +SRC_URI[md5sum] = "66de1b073e869ba12abbfcde3885c577" +SRC_URI[sha256sum] = "cae456e1ad5a8c1d3c94920a3416c2347277739b260e3494d3bc0f2b9b73106f" + +inherit autotools + +RDEPENDS_${PN} = "ncurses-terminfo" diff --git a/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-extfs-dir.patch b/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-extfs-dir.patch new file mode 100644 index 0000000..aebb31e --- /dev/null +++ b/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-extfs-dir.patch @@ -0,0 +1,18 @@ +Upstream-Status: Inappropriate [Configuration] + +Don't show "Warning: cannot open /usr/libexec/mc/extfs.d directory", +because it's packaged separately. + +Signed-off-by: Andreas Oberritter + +--- mc-4.8.1/src/vfs/extfs/extfs.c.orig 2012-05-10 15:50:04.633833530 +0200 ++++ mc-4.8.1/src/vfs/extfs/extfs.c 2012-05-10 15:50:20.349833289 +0200 +@@ -1558,8 +1558,6 @@ + * appear on screen. */ + if (dir == NULL) + { +- if (!silent) +- fprintf (stderr, _("Warning: cannot open %s directory\n"), dirname); + g_free (dirname); + return FALSE; + } diff --git a/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-hints.patch b/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-hints.patch new file mode 100644 index 0000000..a0ccdcd --- /dev/null +++ b/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-hints.patch @@ -0,0 +1,17 @@ +Upstream-Status: Pending + +Fixes a text drawing issue if hints are unavailable. + +Signed-off-by: Andreas Oberritter + +--- mc-4.8.1/src/filemanager/midnight.c.orig 2012-05-10 15:30:56.645804130 +0200 ++++ mc-4.8.1/src/filemanager/midnight.c 2012-05-10 15:31:27.601804920 +0200 +@@ -1587,7 +1587,7 @@ + { + char text[BUF_SMALL]; + +- g_snprintf (text, sizeof (text), _("GNU Midnight Commander %s\n"), VERSION); ++ g_snprintf (text, sizeof (text), _("GNU Midnight Commander %s"), VERSION); + set_hintbar (text); + } + } diff --git a/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-sfs-ini.patch b/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-sfs-ini.patch new file mode 100644 index 0000000..fd5afd3 --- /dev/null +++ b/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-sfs-ini.patch @@ -0,0 +1,17 @@ +Upstream-Status: Inappropriate [Configuration] + +Don't show "sfs_init(): Warning: file /etc/mc/sfs.ini not found", +because it's packaged separately. + +Signed-off-by: Andreas Oberritter + +--- mc-4.8.1/src/vfs/sfs/sfs.c.orig 2012-05-10 15:48:05.405830465 +0200 ++++ mc-4.8.1/src/vfs/sfs/sfs.c 2012-05-10 15:48:24.389830919 +0200 +@@ -419,7 +419,6 @@ + + if (cfg == NULL) + { +- fprintf (stderr, _("%s: Warning: file %s not found\n"), "sfs_init()", mc_sfsini); + g_free (mc_sfsini); + return 0; + } diff --git a/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-syntax-file.patch b/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-syntax-file.patch new file mode 100644 index 0000000..ee0ee46 --- /dev/null +++ b/meta-openvuplus/recipes-base/mc/mc-4.8.1/optional-syntax-file.patch @@ -0,0 +1,18 @@ +Upstream-Status: Inappropriate [Configuration] + +Don't show an error message if the syntax file can't +be opened, because it's packaged separately. + +Signed-off-by: Andreas Oberritter + +--- mc-4.8.1/src/editor/syntax.c.orig 2011-12-12 10:15:38.000000000 +0100 ++++ mc-4.8.1/src/editor/syntax.c 2012-05-10 15:07:56.517768788 +0200 +@@ -1522,8 +1522,6 @@ + if (r == -1) + { + edit_free_syntax_rules (edit); +- message (D_ERROR, _("Load syntax file"), +- _("Cannot open file %s\n%s"), f, unix_error_string (errno)); + } + else if (r != 0) + { diff --git a/meta-openvuplus/recipes-base/mc/mc_4.8.1.bbappend b/meta-openvuplus/recipes-base/mc/mc_4.8.1.bbappend new file mode 100644 index 0000000..73b41c6 --- /dev/null +++ b/meta-openvuplus/recipes-base/mc/mc_4.8.1.bbappend @@ -0,0 +1,26 @@ +PR .= "-vuplus0" + +SRC_URI += "file://optional-extfs-dir.patch \ + file://optional-hints.patch \ + file://optional-sfs-ini.patch \ + file://optional-syntax-file.patch" + +PACKAGES += "${PN}-full" + +RDEPENDS_${PN} = "" +RDEPENDS_${PN}-full = "ncurses-terminfo" + +RSUGGESTS_${PN} = "${PN}-full" + +FILES_${PN} = " \ + ${bindir}/* \ + ${sysconfdir}/mc/filehighlight.ini \ + ${sysconfdir}/mc/*.ext \ + ${sysconfdir}/mc/*.keymap \ + ${sysconfdir}/mc/*.menu \ + ${datadir}/${BPN}/mc.* \ + ${datadir}/${BPN}/skins/default.ini \ +" +FILES_${PN}-full = "${libexecdir}/* ${sysconfdir} ${datadir}/${BPN}" + +FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:" diff --git a/meta-openvuplus/recipes-base/mtd/mtd-utils-1.4.9/disable-ubi.patch b/meta-openvuplus/recipes-base/mtd/mtd-utils-1.4.9/disable-ubi.patch new file mode 100644 index 0000000..d9384d9 --- /dev/null +++ b/meta-openvuplus/recipes-base/mtd/mtd-utils-1.4.9/disable-ubi.patch @@ -0,0 +1,19 @@ +--- mtd-utils-1.4.9.org/Makefile 2012-04-02 11:41:10.339446661 +0200 ++++ mtd-utils-1.4.9/Makefile 2012-04-02 11:40:33.659447111 +0200 +@@ -30,13 +30,13 @@ + ubidetach ubinize ubiformat ubirename mtdinfo ubirsvol + + BINS = $(MTD_BINS) +-BINS += mkfs.ubifs/mkfs.ubifs +-BINS += $(addprefix ubi-utils/,$(UBI_BINS)) ++#BINS += mkfs.ubifs/mkfs.ubifs ++#BINS += $(addprefix ubi-utils/,$(UBI_BINS)) + SCRIPTS = flash_eraseall + + TARGETS = $(BINS) + TARGETS += lib/libmtd.a +-TARGETS += ubi-utils/libubi.a ++#TARGETS += ubi-utils/libubi.a + + OBJDEPS = $(BUILDDIR)/include/version.h + diff --git a/meta-openvuplus/recipes-base/mtd/mtd-utils_1.4.9.bbappend b/meta-openvuplus/recipes-base/mtd/mtd-utils_1.4.9.bbappend new file mode 100644 index 0000000..6eb3342 --- /dev/null +++ b/meta-openvuplus/recipes-base/mtd/mtd-utils_1.4.9.bbappend @@ -0,0 +1,7 @@ +PR .= "-vuplus0" + +FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:" + +DREAMBOX_KERNEL_VERSION = "3.2" + +SRC_URI += "${@base_version_less_or_equal('DREAMBOX_KERNEL_VERSION', '2.6.18', 'file://disable-ubi.patch', '', d)}" diff --git a/meta-openvuplus/recipes-base/ncdu/ncdu_1.8.bb b/meta-openvuplus/recipes-base/ncdu/ncdu_1.8.bb new file mode 100644 index 0000000..75e0641 --- /dev/null +++ b/meta-openvuplus/recipes-base/ncdu/ncdu_1.8.bb @@ -0,0 +1,11 @@ +SUMMARY = "NCurses Disk Usage" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://COPYING;md5=321d4ec4e1e7746028446d003a975868" +DEPENDS = "ncurses" +PR = "r1" + +SRC_URI = "http://dev.yorhel.nl/download/ncdu-${PV}.tar.gz" +SRC_URI[md5sum] = "94d7a821f8a0d7ba8ef3dd926226f7d5" +SRC_URI[sha256sum] = "42aaf0418c05e725b39b220166a9c604a9c54c0fbf7692c9c119b36d0ed5d099" + +inherit autotools diff --git a/meta-openvuplus/recipes-base/ppp/ppp_2.4.5.bbappend b/meta-openvuplus/recipes-base/ppp/ppp_2.4.5.bbappend new file mode 100644 index 0000000..e6587d2 --- /dev/null +++ b/meta-openvuplus/recipes-base/ppp/ppp_2.4.5.bbappend @@ -0,0 +1,8 @@ +PR .= "-vuplus0" + +do_install_append() { + rm ${D}/${sysconfdir}/ppp/options + rm ${D}/${sysconfdir}/ppp/pap-secrets +} + +CONFFILES_${PN} = "${sysconfdir}/ppp/chap-secrets" diff --git a/meta-openvuplus/recipes-base/samba/samba-3.0.37/0001-s3-schannel-client-Push-the-domain-and-netbios-name-.patch b/meta-openvuplus/recipes-base/samba/samba-3.0.37/0001-s3-schannel-client-Push-the-domain-and-netbios-name-.patch new file mode 100644 index 0000000..832ce9d --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba-3.0.37/0001-s3-schannel-client-Push-the-domain-and-netbios-name-.patch @@ -0,0 +1,31 @@ +From 51aaf9c6812430975dcd2cf9a632eb8d241ec41e Mon Sep 17 00:00:00 2001 +From: Andrew Bartlett +Date: Thu, 3 Jun 2010 09:35:31 +1000 +Subject: [PATCH] s3:schannel client Push the domain and netbios name into the DOS charset + +If the netbios name is not just ASCII, then we have to get it into the +right character set. + +Andrew Bartlett +--- + source/rpc_parse/parse_rpc.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git source/rpc_parse/parse_rpc.c source/rpc_parse/parse_rpc.c +index 2d166c7..7b4b8e8 100644 +--- source/rpc_parse/parse_rpc.c ++++ source/rpc_parse/parse_rpc.c +@@ -786,8 +786,8 @@ void init_rpc_auth_schannel_neg(RPC_AUTH_SCHANNEL_NEG *neg, + { + neg->type1 = 0; + neg->type2 = 0x3; +- fstrcpy(neg->domain, domain); +- fstrcpy(neg->myname, myname); ++ push_ascii_fstring(neg->domain, domain); ++ push_ascii_fstring(neg->myname, myname); + } + + /******************************************************************* +-- +1.7.0.1 + diff --git a/meta-openvuplus/recipes-base/samba/samba-3.0.37/configure.patch b/meta-openvuplus/recipes-base/samba/samba-3.0.37/configure.patch new file mode 100644 index 0000000..ddcb9e9 --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba-3.0.37/configure.patch @@ -0,0 +1,213 @@ +diff -urN source.old//aclocal.m4 source//aclocal.m4 +--- source.old//aclocal.m4 2008-08-25 22:09:21.000000000 +0100 ++++ source//aclocal.m4 2008-11-23 17:44:58.050646210 +0000 +@@ -1,5 +1,5 @@ + dnl test whether dirent has a d_off member +-AC_DEFUN(AC_DIRENT_D_OFF, ++AC_DEFUN([AC_DIRENT_D_OFF], + [AC_CACHE_CHECK([for d_off in dirent], ac_cv_dirent_d_off, + [AC_TRY_COMPILE([ + #include +@@ -13,7 +13,7 @@ + + dnl Mark specified module as shared + dnl SMB_MODULE(name,static_files,shared_files,subsystem,whatif-static,whatif-shared) +-AC_DEFUN(SMB_MODULE, ++AC_DEFUN([SMB_MODULE], + [ + AC_MSG_CHECKING([how to build $1]) + if test "$[MODULE_][$1]"; then +@@ -44,7 +44,7 @@ + fi + ]) + +-AC_DEFUN(SMB_SUBSYSTEM, ++AC_DEFUN([SMB_SUBSYSTEM], + [ + AC_SUBST($1_STATIC) + AC_SUBST($1_MODULES) +@@ -229,7 +229,7 @@ + + dnl Define an AC_DEFINE with ifndef guard. + dnl AC_N_DEFINE(VARIABLE [, VALUE]) +-define(AC_N_DEFINE, ++define([AC_N_DEFINE], + [cat >> confdefs.h <<\EOF + [#ifndef] $1 + [#define] $1 ifelse($#, 2, [$2], $#, 3, [$2], 1) +@@ -239,14 +239,14 @@ + + dnl Add an #include + dnl AC_ADD_INCLUDE(VARIABLE) +-define(AC_ADD_INCLUDE, ++define([AC_ADD_INCLUDE], + [cat >> confdefs.h <<\EOF + [#include] $1 + EOF + ]) + + dnl Copied from libtool.m4 +-AC_DEFUN(AC_PROG_LD_GNU, ++AC_DEFUN([AC_PROG_LD_GNU], + [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, + [# I'd rather use --version here, but apparently some GNU ld's only accept -v. + if $LD -v 2>&1 &5; then +@@ -257,7 +257,7 @@ + ]) + + dnl Removes -I/usr/include/? from given variable +-AC_DEFUN(CFLAGS_REMOVE_USR_INCLUDE,[ ++AC_DEFUN([CFLAGS_REMOVE_USR_INCLUDE],[ + ac_new_flags="" + for i in [$]$1; do + case [$]i in +@@ -270,7 +270,7 @@ + + dnl Removes '-L/usr/lib[/]', '-Wl,-rpath,/usr/lib[/]' + dnl and '-Wl,-rpath -Wl,/usr/lib[/]' from given variable +-AC_DEFUN(LIB_REMOVE_USR_LIB,[ ++AC_DEFUN([LIB_REMOVE_USR_LIB],[ + ac_new_flags="" + l="" + for i in [$]$1; do +@@ -301,7 +301,7 @@ + + dnl From Bruno Haible. + +-AC_DEFUN(jm_ICONV, ++AC_DEFUN([jm_ICONV], + [ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable libiconv installed). +@@ -387,7 +387,7 @@ + fi + ]) + +-AC_DEFUN(rjs_CHARSET,[ ++AC_DEFUN([rjs_CHARSET],[ + dnl Find out if we can convert from $1 to UCS2-LE + AC_MSG_CHECKING([can we convert from $1 to UCS2-LE?]) + AC_TRY_RUN([ +@@ -405,7 +405,7 @@ + + dnl CFLAGS_ADD_DIR(CFLAGS, $INCDIR) + dnl This function doesn't add -I/usr/include into CFLAGS +-AC_DEFUN(CFLAGS_ADD_DIR,[ ++AC_DEFUN([CFLAGS_ADD_DIR],[ + if test "$2" != "/usr/include" ; then + $1="$$1 -I$2" + fi +@@ -413,7 +413,7 @@ + + dnl LIB_ADD_DIR(LDFLAGS, $LIBDIR) + dnl This function doesn't add -L/usr/lib into LDFLAGS +-AC_DEFUN(LIB_ADD_DIR,[ ++AC_DEFUN([LIB_ADD_DIR],[ + if test "$2" != "/usr/lib" ; then + $1="$$1 -L$2" + fi +@@ -486,7 +486,7 @@ + dnl AC_TRY_RUN_STRICT(PROGRAM,CFLAGS,CPPFLAGS,LDFLAGS, + dnl [ACTION-IF-TRUE],[ACTION-IF-FALSE], + dnl [ACTION-IF-CROSS-COMPILING = RUNTIME-ERROR]) +-AC_DEFUN( [AC_TRY_RUN_STRICT], ++AC_DEFUN([AC_TRY_RUN_STRICT], + [ + old_CFLAGS="$CFLAGS"; + CFLAGS="$2"; +diff -urN source.old//configure.in source//configure.in +--- source.old//configure.in 2008-08-25 22:09:21.000000000 +0100 ++++ source//configure.in 2008-11-23 17:22:17.108791515 +0000 +@@ -1402,7 +1402,7 @@ + #endif + exit(0); + } +-], [linux_getgrouplist_ok=yes], [linux_getgrouplist_ok=no]) ++], [linux_getgrouplist_ok=yes], [linux_getgrouplist_ok=no], [linux_getgrouplist_ok=cross]) + if test x"$linux_getgrouplist_ok" = x"yes"; then + AC_DEFINE(HAVE_GETGROUPLIST, 1, [Have good getgrouplist]) + fi +diff -urN source.old//lib/replace/libreplace.m4 source//lib/replace/libreplace.m4 +--- source.old//lib/replace/libreplace.m4 2008-08-25 22:09:21.000000000 +0100 ++++ source//lib/replace/libreplace.m4 2008-11-23 17:54:27.942153096 +0000 +@@ -1,4 +1,4 @@ +-AC_DEFUN_ONCE(AC_LIBREPLACE_LOCATION_CHECKS, ++AC_DEFUN_ONCE([AC_LIBREPLACE_LOCATION_CHECKS], + [ + echo "LIBREPLACE_LOCATION_CHECKS: START" + +@@ -27,7 +27,7 @@ + ]) dnl end AC_LIBREPLACE_LOCATION_CHECKS + + +-AC_DEFUN_ONCE(AC_LIBREPLACE_BROKEN_CHECKS, ++AC_DEFUN_ONCE([AC_LIBREPLACE_BROKEN_CHECKS], + [ + echo "LIBREPLACE_BROKEN_CHECKS: START" + +@@ -325,25 +325,25 @@ + AC_DEFINE(HAVE_VOLATILE, 1, [Whether the C compiler understands volatile]) + fi + +-m4_include(system/config.m4) ++m4_include(lib/replace/system/config.m4) + +-m4_include(dlfcn.m4) +-m4_include(getpass.m4) +-m4_include(strptime.m4) +-m4_include(win32.m4) +-m4_include(timegm.m4) +-m4_include(repdir.m4) ++m4_include(lib/replace/dlfcn.m4) ++m4_include(lib/replace/getpass.m4) ++m4_include(lib/replace/strptime.m4) ++m4_include(lib/replace/win32.m4) ++m4_include(lib/replace/timegm.m4) ++m4_include(lib/replace/repdir.m4) + + AC_CHECK_FUNCS([syslog memset memcpy],,[AC_MSG_ERROR([Required function not found])]) + + echo "LIBREPLACE_BROKEN_CHECKS: END" + ]) dnl end AC_LIBREPLACE_BROKEN_CHECKS + +-AC_DEFUN_ONCE(AC__LIBREPLACE_ALL_CHECKS_START, ++AC_DEFUN_ONCE([AC__LIBREPLACE_ALL_CHECKS_START], + [ + #LIBREPLACE_ALL_CHECKS: START" + ]) +-AC_DEFUN_ONCE(AC__LIBREPLACE_ALL_CHECKS_END, ++AC_DEFUN_ONCE([AC__LIBREPLACE_ALL_CHECKS_END], + [ + #LIBREPLACE_ALL_CHECKS: END" + ]) +@@ -356,6 +356,6 @@ + AC__LIBREPLACE_ALL_CHECKS_END + ]) + +-m4_include(libreplace_cc.m4) +-m4_include(libreplace_macros.m4) +-m4_include(autoconf-2.60.m4) ++m4_include(lib/replace/libreplace_cc.m4) ++m4_include(lib/replace/libreplace_macros.m4) ++m4_include(lib/replace/autoconf-2.60.m4) +diff -urN source.old//lib/replace/libreplace_macros.m4 source//lib/replace/libreplace_macros.m4 +--- source.old//lib/replace/libreplace_macros.m4 2008-08-25 22:09:21.000000000 +0100 ++++ source//lib/replace/libreplace_macros.m4 2008-11-23 17:31:08.269791372 +0000 +@@ -76,7 +76,7 @@ + ]) + + dnl AC_PROG_CC_FLAG(flag) +-AC_DEFUN(AC_PROG_CC_FLAG, ++AC_DEFUN([AC_PROG_CC_FLAG], + [AC_CACHE_CHECK(whether ${CC-cc} accepts -$1, ac_cv_prog_cc_$1, + [echo 'void f(){}' > conftest.c + if test -z "`${CC-cc} -$1 -c conftest.c 2>&1`"; then +@@ -103,7 +103,7 @@ + dnl see if a declaration exists for a function or variable + dnl defines HAVE_function_DECL if it exists + dnl AC_HAVE_DECL(var, includes) +-AC_DEFUN(AC_HAVE_DECL, ++AC_DEFUN([AC_HAVE_DECL], + [ + AC_CACHE_CHECK([for $1 declaration],ac_cv_have_$1_decl,[ + AC_TRY_COMPILE([$2],[int i = (int)$1], diff --git a/meta-openvuplus/recipes-base/samba/samba-3.0.37/kernel-oplocks.patch b/meta-openvuplus/recipes-base/samba/samba-3.0.37/kernel-oplocks.patch new file mode 100644 index 0000000..bee0f1d --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba-3.0.37/kernel-oplocks.patch @@ -0,0 +1,20 @@ +Linux oplock support is conditional on HAVE_KERNEL_OPLOCKS_LINUX, +not plain old LINUX. + +http://websvn.samba.org/cgi-bin/viewcvs.cgi?rev=23962&view=rev +--- source/modules/vfs_default.c.orig 2010-09-06 17:37:48.256826182 +0200 ++++ source/modules/vfs_default.c 2010-09-06 17:38:25.300843377 +0200 +@@ -813,10 +813,11 @@ + + START_PROFILE(syscall_linux_setlease); + +-#ifdef LINUX ++#ifdef HAVE_KERNEL_OPLOCKS_LINUX + /* first set the signal handler */ +- if(linux_set_lease_sighandler(fd) == -1) ++ if(linux_set_lease_sighandler(fd) == -1) { + return -1; ++ } + + result = linux_setlease(fd, leasetype); + #else diff --git a/meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0-CVE-2012-0870.patch b/meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0-CVE-2012-0870.patch new file mode 100644 index 0000000..4144a9e --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0-CVE-2012-0870.patch @@ -0,0 +1,91 @@ +From f781c9c693462b89b60a3662d2a1224c9387a725 Mon Sep 17 00:00:00 2001 +From: Volker Lendecke +Date: Fri, 10 Feb 2012 08:10:39 +0100 +Subject: [PATCH 1/2] v3-3: AndX offsets are increasing strictly monotonically + +--- + source/smbd/process.c | 10 +++++++++- + 1 files changed, 9 insertions(+), 1 deletions(-) + +diff --git source/smbd/process.c source/smbd/process.c +index e861e16..f64e1ce 100644 +--- source/smbd/process.c ++++ source/smbd/process.c +@@ -1160,7 +1160,7 @@ int chain_reply(char *inbuf,char *outbuf,int size,int bufsize) + static char *orig_inbuf; + static char *orig_outbuf; + int smb_com1, smb_com2 = CVAL(inbuf,smb_vwv0); +- unsigned smb_off2 = SVAL(inbuf,smb_vwv1); ++ static unsigned smb_off2; + char *inbuf2, *outbuf2; + int outsize2; + int new_size; +@@ -1178,8 +1178,16 @@ int chain_reply(char *inbuf,char *outbuf,int size,int bufsize) + /* this is the first part of the chain */ + orig_inbuf = inbuf; + orig_outbuf = outbuf; ++ smb_off2 = 0; + } + ++ if (SVAL(inbuf,smb_vwv1) <= smb_off2) { ++ DEBUG(1, ("AndX offset not increasing\n")); ++ SCVAL(outbuf, smb_vwv0, 0xFF); ++ return outsize; ++ } ++ smb_off2 = SVAL(inbuf, smb_vwv1); ++ + /* + * The original Win95 redirector dies on a reply to + * a lockingX and read chain unless the chain reply is +-- +1.7.3.4 + + +From 009bb0be7383777a650a3bc6af1c0d3ab7476ebc Mon Sep 17 00:00:00 2001 +From: Volker Lendecke +Date: Fri, 10 Feb 2012 08:39:33 +0100 +Subject: [PATCH 2/2] v3-0-test: Port back some packet consistency checks + +--- + source/smbd/process.c | 18 ++++++++++++++++++ + 1 files changed, 18 insertions(+), 0 deletions(-) + +diff --git source/smbd/process.c source/smbd/process.c +index f64e1ce..8aabef8 100644 +--- source/smbd/process.c ++++ source/smbd/process.c +@@ -1025,6 +1025,7 @@ static int construct_reply(char *inbuf,char *outbuf,int size,int bufsize) + int outsize = 0; + int msg_type = CVAL(inbuf,0); + uint16_t mid = SVAL(inbuf, smb_mid); ++ uint8_t wct = CVAL(inbuf, smb_wct); + + chain_size = 0; + file_chain_reset(); +@@ -1033,6 +1034,23 @@ static int construct_reply(char *inbuf,char *outbuf,int size,int bufsize) + if (msg_type != 0) + return(reply_special(inbuf,outbuf)); + ++ /* Ensure we have at least wct words and 2 bytes of bcc. */ ++ if (smb_size + wct*2 > size) { ++ DEBUG(0,("init_smb_request: invalid wct number %u (size %u)\n", ++ (unsigned int)wct, ++ (unsigned int)size)); ++ exit_server_cleanly("Invalid SMB request"); ++ } ++ /* Ensure bcc is correct. */ ++ if (((uint8 *)smb_buf(inbuf)) + smb_buflen(inbuf) > inbuf + size) { ++ DEBUG(0,("init_smb_request: invalid bcc number %u " ++ "(wct = %u, size %u)\n", ++ (unsigned int)smb_buflen(inbuf), ++ (unsigned int)wct, ++ (unsigned int)size)); ++ exit_server_cleanly("Invalid SMB request"); ++ } ++ + construct_reply_common(inbuf, outbuf); + + outsize = switch_message(type,inbuf,outbuf,size,bufsize); +-- +1.7.3.4 + diff --git a/meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0.37-CVE-2012-1182.patch b/meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0.37-CVE-2012-1182.patch new file mode 100644 index 0000000..bbe38e4 --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba-3.0.37/samba-3.0.37-CVE-2012-1182.patch @@ -0,0 +1,59 @@ +From e11637c2c89c2d38963311416c34a4767b19e175 Mon Sep 17 00:00:00 2001 +From: Stefan Metzmacher +Date: Sat, 17 Mar 2012 01:22:27 +0100 +Subject: [PATCH] s3:librpc/gen_ndr: fix array checks (bug #8815 / CVE-2012-1182) + +An Anonymous researcher working with HP's Zero Day Initiative program +has found this and notified us. + +metze +--- + source/librpc/gen_ndr/ndr_wkssvc.c | 12 ++++++------ + 1 files changed, 6 insertions(+), 6 deletions(-) + +diff --git source/librpc/gen_ndr/ndr_wkssvc.c source/librpc/gen_ndr/ndr_wkssvc.c +index 2af3587..07cf1a1 100644 +--- source/librpc/gen_ndr/ndr_wkssvc.c ++++ source/librpc/gen_ndr/ndr_wkssvc.c +@@ -1385,10 +1385,10 @@ NTSTATUS ndr_pull_USER_INFO_0_CONTAINER(struct ndr_pull *ndr, int ndr_flags, str + NDR_PULL_ALLOC_N(ndr, r->user0, ndr_get_array_size(ndr, &r->user0)); + _mem_save_user0_1 = NDR_PULL_GET_MEM_CTX(ndr); + NDR_PULL_SET_MEM_CTX(ndr, r->user0, 0); +- for (cntr_user0_1 = 0; cntr_user0_1 < r->entries_read; cntr_user0_1++) { ++ for (cntr_user0_1 = 0; cntr_user0_1 < ndr_get_array_size(ndr, &r->user0); cntr_user0_1++) { + NDR_CHECK(ndr_pull_USER_INFO_0(ndr, NDR_SCALARS, &r->user0[cntr_user0_1])); + } +- for (cntr_user0_1 = 0; cntr_user0_1 < r->entries_read; cntr_user0_1++) { ++ for (cntr_user0_1 = 0; cntr_user0_1 < ndr_get_array_size(ndr, &r->user0); cntr_user0_1++) { + NDR_CHECK(ndr_pull_USER_INFO_0(ndr, NDR_BUFFERS, &r->user0[cntr_user0_1])); + } + NDR_PULL_SET_MEM_CTX(ndr, _mem_save_user0_1, 0); +@@ -1631,10 +1631,10 @@ NTSTATUS ndr_pull_USER_INFO_1_CONTAINER(struct ndr_pull *ndr, int ndr_flags, str + NDR_PULL_ALLOC_N(ndr, r->user1, ndr_get_array_size(ndr, &r->user1)); + _mem_save_user1_1 = NDR_PULL_GET_MEM_CTX(ndr); + NDR_PULL_SET_MEM_CTX(ndr, r->user1, 0); +- for (cntr_user1_1 = 0; cntr_user1_1 < r->entries_read; cntr_user1_1++) { ++ for (cntr_user1_1 = 0; cntr_user1_1 < ndr_get_array_size(ndr, &r->user1); cntr_user1_1++) { + NDR_CHECK(ndr_pull_USER_INFO_1(ndr, NDR_SCALARS, &r->user1[cntr_user1_1])); + } +- for (cntr_user1_1 = 0; cntr_user1_1 < r->entries_read; cntr_user1_1++) { ++ for (cntr_user1_1 = 0; cntr_user1_1 < ndr_get_array_size(ndr, &r->user1); cntr_user1_1++) { + NDR_CHECK(ndr_pull_USER_INFO_1(ndr, NDR_BUFFERS, &r->user1[cntr_user1_1])); + } + NDR_PULL_SET_MEM_CTX(ndr, _mem_save_user1_1, 0); +@@ -1953,10 +1953,10 @@ NTSTATUS ndr_pull_wkssvc_NetWkstaTransportCtr0(struct ndr_pull *ndr, int ndr_fla + NDR_PULL_ALLOC_N(ndr, r->array, ndr_get_array_size(ndr, &r->array)); + _mem_save_array_1 = NDR_PULL_GET_MEM_CTX(ndr); + NDR_PULL_SET_MEM_CTX(ndr, r->array, 0); +- for (cntr_array_1 = 0; cntr_array_1 < r->count; cntr_array_1++) { ++ for (cntr_array_1 = 0; cntr_array_1 < ndr_get_array_size(ndr, &r->array); cntr_array_1++) { + NDR_CHECK(ndr_pull_wkssvc_NetWkstaTransportInfo0(ndr, NDR_SCALARS, &r->array[cntr_array_1])); + } +- for (cntr_array_1 = 0; cntr_array_1 < r->count; cntr_array_1++) { ++ for (cntr_array_1 = 0; cntr_array_1 < ndr_get_array_size(ndr, &r->array); cntr_array_1++) { + NDR_CHECK(ndr_pull_wkssvc_NetWkstaTransportInfo0(ndr, NDR_BUFFERS, &r->array[cntr_array_1])); + } + NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_1, 0); +-- +1.7.4.1 + diff --git a/meta-openvuplus/recipes-base/samba/samba-3.0.37/uclibc-strlcpy-strlcat.patch b/meta-openvuplus/recipes-base/samba/samba-3.0.37/uclibc-strlcpy-strlcat.patch new file mode 100644 index 0000000..b10a1b1 --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba-3.0.37/uclibc-strlcpy-strlcat.patch @@ -0,0 +1,46 @@ +diff --git source.old/client/mount.cifs.c source/client/mount.cifs.c +index 3b56e5f..b7a76c6 100644 +--- source.old/client/mount.cifs.c ++++ source/client/mount.cifs.c +@@ -56,6 +56,10 @@ + #endif /* _SAMBA_BUILD_ */ + #endif /* MOUNT_CIFS_VENDOR_SUFFIX */ + ++#ifdef _SAMBA_BUILD_ ++#include "include/config.h" ++#endif ++ + #ifndef MS_MOVE + #define MS_MOVE 8192 + #endif +@@ -94,6 +98,8 @@ char * prefixpath = NULL; + + /* like strncpy but does not 0 fill the buffer and always null + * terminates. bufsize is the size of the destination buffer */ ++ ++#ifndef HAVE_STRLCPY + static size_t strlcpy(char *d, const char *s, size_t bufsize) + { + size_t len = strlen(s); +@@ -104,10 +110,13 @@ static size_t strlcpy(char *d, const char *s, size_t bufsize) + d[len] = 0; + return ret; + } ++#endif + + /* like strncat but does not 0 fill the buffer and always null + * terminates. bufsize is the length of the buffer, which should + * be one more than the maximum resulting string length */ ++ ++#ifndef HAVE_STRLCAT + static size_t strlcat(char *d, const char *s, size_t bufsize) + { + size_t len1 = strlen(d); +@@ -126,6 +135,7 @@ static size_t strlcat(char *d, const char *s, size_t bufsize) + } + return ret; + } ++#endif + + /* BB finish BB + diff --git a/meta-openvuplus/recipes-base/samba/samba/01samba-kill b/meta-openvuplus/recipes-base/samba/samba/01samba-kill new file mode 100644 index 0000000..41f7781 --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba/01samba-kill @@ -0,0 +1,5 @@ +#!/bin/sh +killall -9 smbd +rm -rf /var/log/log.smbd +killall -9 nmbd +rm -rf /var/log/log.nmbd diff --git a/meta-openvuplus/recipes-base/samba/samba/01samba-start b/meta-openvuplus/recipes-base/samba/samba/01samba-start new file mode 100644 index 0000000..ce397ad --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba/01samba-start @@ -0,0 +1,3 @@ +#!/bin/sh +nmbd -D +smbd -D diff --git a/meta-openvuplus/recipes-base/samba/samba/config-lfs.patch b/meta-openvuplus/recipes-base/samba/samba/config-lfs.patch new file mode 100644 index 0000000..b37ed69 --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba/config-lfs.patch @@ -0,0 +1,47 @@ +Cache the check for Linux LFS support, so it can be prepopulated from +the site cache for configure variables for cross-compiling. Without this, +samba gets the idea that it can use dirent64 and friends without defining +the flags it needs to get it, such as _GNU_SOURCE and _LARGEFILE64_SOURCE. + +Symptoms of getting the configuration wrong on cross-compile inculde +warnings such as + + smbd/trans2.c: In function `get_lanman2_dir_entry': + smbd/trans2.c:1065: warning: right shift count >= width of type + +and errors like + + smbd/vfs.c:630: error: dereferencing pointer to incomplete type + +(when trying to dereference dirent64.) + +--- source/configure.in.orig 2005-05-29 14:46:18.000000000 -0700 ++++ source/configure.in 2005-05-29 14:51:57.000000000 -0700 +@@ -588,7 +588,7 @@ + # Tests for linux LFS support. Need kernel 2.4 and glibc2.2 or greater support. + # + *linux*) +- AC_MSG_CHECKING([for LFS support]) ++ AC_CACHE_CHECK([for LFS support], samba_cv_LINUX_LFS_SUPPORT,[ + old_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE $CPPFLAGS" + AC_TRY_RUN([ +@@ -627,15 +627,14 @@ + exit(1); + #endif + } +-], [LINUX_LFS_SUPPORT=yes], [LINUX_LFS_SUPPORT=no], [LINUX_LFS_SUPPORT=cross]) +- CPPFLAGS="$old_CPPFLAGS" +- if test x$LINUX_LFS_SUPPORT = xyes ; then ++], [samba_cv_LINUX_LFS_SUPPORT=yes], [samba_cv_LINUX_LFS_SUPPORT=no], [samba_cv_LINUX_LFS_SUPPORT=cross]) ++ CPPFLAGS="$old_CPPFLAGS"]) ++ if test x"$samba_cv_LINUX_LFS_SUPPORT" = x"yes" ; then + CPPFLAGS="-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE $CPPFLAGS" + AC_DEFINE(_LARGEFILE64_SOURCE, 1, [Whether to enable large file support]) + AC_DEFINE(_FILE_OFFSET_BITS, 64, [File offset bits]) + AC_DEFINE(_GNU_SOURCE, 1, [Whether to use GNU libc extensions]) + fi +- AC_MSG_RESULT([$LINUX_LFS_SUPPORT]) + ;; + + # diff --git a/meta-openvuplus/recipes-base/samba/samba/init b/meta-openvuplus/recipes-base/samba/samba/init new file mode 100644 index 0000000..cb57b17 --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba/init @@ -0,0 +1,58 @@ +#! /bin/sh +# +# This is an init script for openembedded +# Copy it to /etc/init.d/samba and type +# > update-rc.d samba defaults 60 +# + + +smbd=/usr/sbin/smbd +test -x "$smbd" || exit 0 +nmbd=/usr/sbin/nmbd +test -x "$nmbd" || exit 0 + + +case "$1" in + start) + echo -n "Starting Samba: smbd" + start-stop-daemon --start --quiet --exec $smbd + echo -n " nmbd" + start-stop-daemon --start --quiet --exec $nmbd + echo "." + ;; + stop) + echo -n "Stopping Samba: smbd" + start-stop-daemon --stop --quiet --pidfile /var/run/smbd.pid + echo -n " nmbd" + start-stop-daemon --stop --quiet --pidfile /var/run/nmbd.pid + echo "." + ;; + reload|force-reload) + start-stop-daemon --stop --quiet --signal 1 --exec $smbd + start-stop-daemon --stop --quiet --signal 1 --exec $nmbd + ;; + restart) + echo -n "Stopping Samba: smbd" + start-stop-daemon --stop --quiet --pidfile /var/run/smbd.pid + echo -n " nmbd" + start-stop-daemon --stop --quiet --pidfile /var/run/nmbd.pid + echo "" + echo -n "Waiting for samba processes to die off" + for i in 1 2 3 ; + do + sleep 1 + echo -n "." + done + echo "" + echo -n "Starting Samba: smbd" + start-stop-daemon --start --quiet --exec $smbd + echo -n " nmbd" + start-stop-daemon --start --quiet --exec $nmbd + echo "." + ;; + *) + echo "Usage: /etc/init.d/samba {start|stop|reload|restart|force-reload}" + exit 1 +esac + +exit 0 \ No newline at end of file diff --git a/meta-openvuplus/recipes-base/samba/samba/quota.patch b/meta-openvuplus/recipes-base/samba/samba/quota.patch new file mode 100644 index 0000000..6f42ff8 --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba/quota.patch @@ -0,0 +1,11 @@ +--- lib/sysquotas_4A.c.old 2005-07-03 17:16:00.000000000 +0200 ++++ lib/sysquotas_4A.c 2005-07-03 17:10:09.000000000 +0200 +@@ -28,6 +28,8 @@ + /* long quotactl(int cmd, char *special, qid_t id, caddr_t addr) */ + /* this is used by: HPUX,IRIX */ + ++ #define _LINUX_QUOTA_VERSION 1 ++ + #ifdef HAVE_SYS_TYPES_H + #include + #endif diff --git a/meta-openvuplus/recipes-base/samba/samba/smb.conf b/meta-openvuplus/recipes-base/samba/samba/smb.conf new file mode 100644 index 0000000..83ac00d --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba/smb.conf @@ -0,0 +1,29 @@ +[global] + load printers = no + guest account = root + log file = /tmp/smb.log + log level = 1 + security = share + server string = Dreambox %h network services + workgroup = Dream + netbios name = %h + case sensitive=yes + preserve case=yes + short preserve case=yes + socket options = TCP_NODELAY + preferred master = no ;(These stop the machine being master browser, which means that it doesn't waste time there.) + oplocks = no + +[Configuration] + comment = Configuration files - take care! + path = /var + read only = no + public = yes + guest ok = yes + +[Harddisk] + comment = The harddisk + path = /media/hdd + read only = no + public = yes + guest ok = yes diff --git a/meta-openvuplus/recipes-base/samba/samba/tdb.pc b/meta-openvuplus/recipes-base/samba/samba/tdb.pc new file mode 100644 index 0000000..6307a20 --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba/tdb.pc @@ -0,0 +1,11 @@ +prefix=/usr +exec_prefix=/usr +libdir=/usr/lib +includedir=/usr/include + +Name: tdb +Description: A trivial database +Version: 1.1.2 +Libs: -L${libdir} -ltdb +Cflags: -I${includedir} +URL: http://tdb.samba.org/ diff --git a/meta-openvuplus/recipes-base/samba/samba/volatiles.03_samba b/meta-openvuplus/recipes-base/samba/samba/volatiles.03_samba new file mode 100644 index 0000000..469bc9e --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba/volatiles.03_samba @@ -0,0 +1,2 @@ +# +d root root 0755 /var/log/samba none diff --git a/meta-openvuplus/recipes-base/samba/samba_3.0.37.bb b/meta-openvuplus/recipes-base/samba/samba_3.0.37.bb new file mode 100644 index 0000000..eb05c71 --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba_3.0.37.bb @@ -0,0 +1,20 @@ +require recipes-connectivity/samba/samba.inc +require recipes-connectivity/samba/samba-basic.inc +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://../COPYING;md5=8ca43cbc842c2336e835926c2166c28b" +PR = "r2" + +SRC_URI += "file://configure.patch \ + file://kernel-oplocks.patch \ + file://0001-s3-schannel-client-Push-the-domain-and-netbios-name-.patch \ + file://samba-3.0-CVE-2012-0870.patch \ + file://samba-3.0.37-CVE-2012-1182.patch" +SRC_URI_append_linux-uclibc = "file://uclibc-strlcpy-strlcat.patch" +SRC_URI_append_linux-uclibceabi = "file://uclibc-strlcpy-strlcat.patch" + +EXTRA_OECONF += "\ + SMB_BUILD_CC_NEGATIVE_ENUM_VALUES=yes \ + " + +SRC_URI[md5sum] = "11ed2bfef4090bd5736b194b43f67289" +SRC_URI[sha256sum] = "bb67c0e13d4ccbd84b9200c8739393fdd9b3145b5aad216934dc670f0fcea266" diff --git a/meta-openvuplus/recipes-base/samba/samba_3.0.37.bbappend b/meta-openvuplus/recipes-base/samba/samba_3.0.37.bbappend new file mode 100644 index 0000000..c6512c2 --- /dev/null +++ b/meta-openvuplus/recipes-base/samba/samba_3.0.37.bbappend @@ -0,0 +1,31 @@ +PR .= "-vuplus0" + +SRC_URI += " \ + file://01samba-kill \ + file://01samba-start \ +" + +PACKAGES =+ "smbfs smbfs-doc sambaserver libpopt libtalloc" + +FILES_smbfs = "${bindir}/smbmount ${bindir}/smbumount ${bindir}/smbmnt ${base_sbindir}/mount.smbfs ${base_sbindir}/mount.smb" +FILES_smbfs-doc = "${mandir}/man8/smbmount.8 ${mandir}/man8/smbumount.8 ${mandir}/man8/smbmnt.8" +FILES_sambaserver = "${sbindir}/smbd ${sbindir}/nmbd ${libdir}/charset/*.so ${libdir}/*.dat \ + ${sysconfdir}/samba/smb.conf ${sysconfdir}/samba/private \ + ${sysconfdir}/network/if-up.d/01samba-start ${sysconfdir}/network/if-down.d/01samba-kill" +FILES_libpopt = "${libdir}/libpopt.so.*" +FILES_libtalloc = "${libdir}/libtalloc.so.*" + +CONFFILES_${PN} = "" +CONFFILES_sambaserver = "${sysconfdir}/samba/smb.conf" + +do_install_prepend() { + install -c -m 644 ${WORKDIR}/smb.conf ../examples/smb.conf.default +} + +do_install_append() { + install -d ${D}${sysconfdir}/samba/private + install -d ${D}${sysconfdir}/network/if-down.d + install -m 0755 ${WORKDIR}/01samba-kill ${D}${sysconfdir}/network/if-down.d + install -d ${D}${sysconfdir}/network/if-up.d + install -m 0755 ${WORKDIR}/01samba-start ${D}${sysconfdir}/network/if-up.d +} diff --git a/meta-openvuplus/recipes-base/smartmontools/smartmontools.inc b/meta-openvuplus/recipes-base/smartmontools/smartmontools.inc new file mode 100644 index 0000000..c1ded3a --- /dev/null +++ b/meta-openvuplus/recipes-base/smartmontools/smartmontools.inc @@ -0,0 +1,10 @@ +SECTION = "console/utils" +SUMMARY = "Control and monitor storage systems using S.M.A.R.T." +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f" +INC_PR = "r1" + +SRC_URI = "${SOURCEFORGE_MIRROR}/smartmontools/smartmontools-${PV}.tar.gz" +S = "${WORKDIR}/smartmontools-${PV}" + +inherit autotools diff --git a/meta-openvuplus/recipes-base/smartmontools/smartmontools_5.42.bb b/meta-openvuplus/recipes-base/smartmontools/smartmontools_5.42.bb new file mode 100644 index 0000000..98ebb37 --- /dev/null +++ b/meta-openvuplus/recipes-base/smartmontools/smartmontools_5.42.bb @@ -0,0 +1,6 @@ +PR = "${INC_PR}.0" + +SRC_URI[md5sum] = "4460bf9a79a1252ff5c00ba52cf76b2a" +SRC_URI[sha256sum] = "b664d11e814e114ce3a32a4fa918c9e649c684e2897c007b2a8b92574decc374" + +require smartmontools.inc diff --git a/meta-openvuplus/recipes-base/tasks/task-vuplus-base.bb b/meta-openvuplus/recipes-base/tasks/task-vuplus-base.bb new file mode 100644 index 0000000..248b97d --- /dev/null +++ b/meta-openvuplus/recipes-base/tasks/task-vuplus-base.bb @@ -0,0 +1,8 @@ +PR = "${INC_PR}.0" + +RDEPENDS_${PN} = " \ + dropbear-xinetd \ + vsftpd-xinetd \ +" + +require task-vuplus-base.inc diff --git a/meta-openvuplus/recipes-base/tasks/task-vuplus-base.inc b/meta-openvuplus/recipes-base/tasks/task-vuplus-base.inc new file mode 100644 index 0000000..3f27c99 --- /dev/null +++ b/meta-openvuplus/recipes-base/tasks/task-vuplus-base.inc @@ -0,0 +1,76 @@ +SUMMARY = "Vuplus: Base Task for Vuplus." +SECTION = "vuplus/base" +LICENSE = "CLOSED" +INC_PR = "r0" + +inherit task + +VUPLUS_BASE_ESSENTIAL = "\ + autofs \ + vuplus-compat \ + dreambox-keymaps \ + e2fsprogs-e2fsck \ + e2fsprogs-mke2fs \ + fakelocale \ + opkg \ + timezones-alternative \ + tuxbox-common \ + util-linux-sfdisk \ + vsftpd \ + mtd-utils \ + hdparm \ + usbtunerhelper \ + ${VUPLUS_FIRMWARE_DVB} \ +" + +VUPLUS_FIRMWARE_DVB = " \ + firmware-dvb-af9005 \ + firmware-dvb-fe-af9013 \ + firmware-dvb-usb-af9015 \ + firmware-dvb-usb-af9035 \ + firmware-dvb-usb-avertv-a800 \ + firmware-dvb-usb-dib0700 \ + firmware-dvb-usb-dibusb \ + firmware-dvb-usb-digitv \ + firmware-dvb-usb-nova-t-usb2 \ + firmware-dvb-usb-sms1xxx-nova-dvbt \ + firmware-dvb-usb-sms1xxx-hcw-dvbt \ + firmware-dvb-usb-ttusb-budget \ + firmware-dvb-usb-umt-010 \ + firmware-dvb-usb-xc5000 \ + firmware-dvb-usb-wt220u-zl0353 \ + firmware-drxd-a2 \ +" + +# chang : use xinetd instead of netkit-base. +# chang : mkfs-ubifs and mkfs-jffs2 are included in mtd-utils. + +VUPLUS_BASE_RECOMMENDS = "\ + dropbear \ + vuplus-vucamd \ + sambaserver \ + openvpn \ + zeroconf \ +" + +#VUPLUS_BASE_RECOMMENDS_append_vuuno = " vuplus-fpga-update" +#VUPLUS_BASE_RECOMMENDS_append_vuultimo = " vuplus-fpga-update" + +VUPLUS_BASE_OPTIONAL_RECOMMENDS = "\ + hddtemp \ + joe \ + mc \ + ncdu \ + ppp \ + smartmontools \ + avahi-daemon \ +" + +RDEPENDS_${PN} += "\ + ${VUPLUS_BASE_ESSENTIAL} \ +" + +RRECOMMENDS_${PN} += "\ + ${VUPLUS_BASE_RECOMMENDS} \ + ${VUPLUS_BASE_OPTIONAL_RECOMMENDS} \ +" diff --git a/meta-openvuplus/recipes-base/timezones/files/GPL-1.0 b/meta-openvuplus/recipes-base/timezones/files/GPL-1.0 new file mode 100644 index 0000000..9d4ef93 --- /dev/null +++ b/meta-openvuplus/recipes-base/timezones/files/GPL-1.0 @@ -0,0 +1,252 @@ + +GNU General Public License, version 1 + + GNU GENERAL PUBLIC LICENSE + Version 1, February 1989 + + Copyright (C) 1989 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The license agreements of most software companies try to keep users +at the mercy of those companies. By contrast, our General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. The +General Public License applies to the Free Software Foundation`s +software and to any other program whose authors commit to using it. +You can use it for your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Specifically, the General Public License is designed to make +sure that you have the freedom to give away or sell copies of free +software, that you receive source code or can get it if you want it, +that you can change the software or use pieces of it in new free +programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of a such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must tell them their rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author`s protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors` reputations. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any program or other work which +contains a notice placed by the copyright holder saying it may be +distributed under the terms of this General Public License. The +"Program", below, refers to any such program or work, and a "work based +on the Program" means either the Program or any work containing the +Program or a portion of it, either verbatim or with modifications. Each +licensee is addressed as "you". + + 1. You may copy and distribute verbatim copies of the Program`s source +code as you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this +General Public License and to the absence of any warranty; and give any +other recipients of the Program a copy of this General Public License +along with the Program. You may charge a fee for the physical act of +transferring a copy. + + 2. You may modify your copy or copies of the Program or any portion of +it, and copy and distribute such modifications under the terms of Paragraph +1 above, provided that you also do the following: + + a) cause the modified files to carry prominent notices stating that + you changed the files and the date of any change; and + + b) cause the whole of any work that you distribute or publish, that + in whole or in part contains the Program or any part thereof, either + with or without modifications, to be licensed at no charge to all + third parties under the terms of this General Public License (except + that you may choose to grant warranty protection to some or all + third parties, at your option). + + c) If the modified program normally reads commands interactively when + run, you must cause it, when started running for such interactive use + in the simplest and most usual way, to print or display an + announcement including an appropriate copyright notice and a notice + that there is no warranty (or else, saying that you provide a + warranty) and that users may redistribute the program under these + conditions, and telling the user how to view a copy of this General + Public License. + + d) You may charge a fee for the physical act of transferring a + copy, and you may at your option offer warranty protection in + exchange for a fee. + +Mere aggregation of another independent work with the Program (or its +derivative) on a volume of a storage or distribution medium does not bring +the other work under the scope of these terms. + + 3. You may copy and distribute the Program (or a portion or derivative of +it, under Paragraph 2) in object code or executable form under the terms of +Paragraphs 1 and 2 above provided that you also do one of the following: + + a) accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of + Paragraphs 1 and 2 above; or, + + b) accompany it with a written offer, valid for at least three + years, to give any third party free (except for a nominal charge + for the cost of distribution) a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of + Paragraphs 1 and 2 above; or, + + c) accompany it with the information you received as to where the + corresponding source code may be obtained. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form alone.) + +Source code for a work means the preferred form of the work for making +modifications to it. For an executable file, complete source code means +all the source code for all modules it contains; but, as a special +exception, it need not include source code for modules which are standard +libraries that accompany the operating system on which the executable +file runs, or for standard header files or definitions files that +accompany that operating system. + + 4. You may not copy, modify, sublicense, distribute or transfer the +Program except as expressly provided under this General Public License. +Any attempt otherwise to copy, modify, sublicense, distribute or transfer +the Program is void, and will automatically terminate your rights to use +the Program under this License. However, parties who have received +copies, or rights to use copies, from you under this General Public +License will not have their licenses terminated so long as such parties +remain in full compliance. + + 5. By copying, distributing or modifying the Program (or any work based +on the Program) you indicate your acceptance of this license to do so, +and all its terms and conditions. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the original +licensor to copy, distribute or modify the Program subject to these +terms and conditions. You may not impose any further restrictions on the +recipients` exercise of the rights granted herein. + + 7. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of the license which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +the license, you may choose any version ever published by the Free Software +Foundation. + + 8. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to humanity, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + + To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively convey +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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; either version 1, or (at your option) + any later version. + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19xx name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w`. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c` for details. + +The hypothetical commands `show w` and `show c` should show the +appropriate parts of the General Public License. Of course, the +commands you use may be called something other than `show w` and `show +c`; they could even be mouse-clicks or menu items--whatever suits your +program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + program `Gnomovision` (a program to direct compilers to make passes + at assemblers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +That`s all there is to it! + diff --git a/meta-openvuplus/recipes-base/timezones/files/zoneinfo.tar.bz2 b/meta-openvuplus/recipes-base/timezones/files/zoneinfo.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..19fa9288a79ad1615c587d728e988f970e57c0b8 GIT binary patch literal 38585 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 FYi1d7toi@| literal 0 HcmV?d00001 diff --git a/meta-openvuplus/recipes-base/timezones/timezones-alternative.bb b/meta-openvuplus/recipes-base/timezones/timezones-alternative.bb new file mode 100644 index 0000000..0fb50f3 --- /dev/null +++ b/meta-openvuplus/recipes-base/timezones/timezones-alternative.bb @@ -0,0 +1,25 @@ +DESCRIPTION = "Timezone data, alternative" +SECTION = "base" +PRIORITY = "optional" +MAINTAINER = "Felix Domke " +LICENSE = "GPL" +LIC_FILES_CHKSUM = "file://${THISDIR}/files/GPL-1.0;md5=e9e36a9de734199567a4d769498f743d" + +PV = "2008i" +PR = "r0" + +SRC_URI = "file://zoneinfo.tar.bz2" +S = "${WORKDIR}/zoneinfo" + +FILES_${PN} = "usr/share/zoneinfo/[A-Z]*" +PACKAGE_ARCH = "all" + +do_install() { + install -d ${D}/usr/share/zoneinfo/ + + for file in ${S}/* + do + [ -f $file ] && install -m 644 "$file" ${D}/usr/share/zoneinfo/ + done; + true; +} diff --git a/meta-openvuplus/recipes-base/tuxbox/tuxbox-common_0.1.bb b/meta-openvuplus/recipes-base/tuxbox/tuxbox-common_0.1.bb new file mode 100644 index 0000000..b3d6998 --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxbox/tuxbox-common_0.1.bb @@ -0,0 +1,18 @@ +SUMMARY = "Tuxbox common files" +LICENSE = "CLOSED" +SRCREV = "77ff3efbac5eb01c2fc914ba8fb99374d0970ff5" +PR = "r1" + +inherit opendreambox-git + +do_install() { + install -d ${D}${sysconfdir} + install -d ${D}${sysconfdir}/tuxbox + install -m 0644 timezone.xml ${D}${sysconfdir} + install -m 0644 satellites.xml ${D}${sysconfdir}/tuxbox + install -m 0644 terrestrial.xml ${D}${sysconfdir}/tuxbox +} + +FILES_${PN} = "${sysconfdir}" + +OPENDREAMBOX_PROJECT = "obi/enigma2-xml-data" diff --git a/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp.bb b/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp.bb new file mode 100644 index 0000000..cd08ee9 --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp.bb @@ -0,0 +1,32 @@ +SUMMARY = "TuxCom for 800/7025/8000/32bit framebuffer HD Autosize" +LICENSE = "Proprietary" +LIC_FILES_CHKSUM = "file://tuxcom.c;endline=23;md5=33c69eb2b4a436ea9e00355b66c21dd9" +DEPENDS = "freetype" +RDEPENDS_${PN} = "enigma2" +SRCDATE = "20070410" +PV = "1.16+cvs${SRCDATE}" +PR = "r0" + +SRC_URI = "cvs://anoncvs@cvs.tuxbox.org/cvs/tuxbox;module=apps/tuxbox/plugins/tuxcom;method=ext \ + file://makefiles.diff \ + file://add_font.diff \ + file://32bpp.diff \ + file://add_e2_plugin.diff \ + file://largefile.diff \ + file://support_newer_freetype.diff \ + file://fix_smstext.diff \ +" + +S = "${WORKDIR}/tuxcom" + +inherit autotools + +EXTRA_OECONF = "--with-target=native" + +do_configure_prepend() { + touch ${S}/python/__init__.py +} + +FILES_${PN} = "${bindir}/tuxcom ${libdir}/enigma2 /etc/tuxcom ${datadir}/fonts/pakenham.ttf" + +CPPFLAGS += "-DHAVE_DREAMBOX_HARDWARE -DDREAMBOX" diff --git a/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/32bpp.diff b/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/32bpp.diff new file mode 100644 index 0000000..474df99 --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/32bpp.diff @@ -0,0 +1,1136 @@ +diff -Naur tuxcom.ori/tuxcom.c tuxcom/tuxcom.c +--- tuxcom.ori/tuxcom.c 2009-01-06 00:12:19.000000000 +0100 ++++ tuxcom/tuxcom.c 2009-01-05 21:10:35.000000000 +0100 +@@ -27,7 +27,7 @@ + * GetRCCode (Code from Tuxmail) + ******************************************************************************/ + +-#ifndef HAVE_DREAMBOX_HARDWARE ++ + + int GetRCCode(int mode) + { +@@ -36,7 +36,8 @@ + struct input_event ev; + static __u16 rc_last_key = KEY_RESERVED; + static __u16 rc_last_code = KEY_RESERVED; +- if(read(rc, &ev, sizeof(ev)) == sizeof(ev)) ++ if ((read(rc[0], &ev, sizeof(ev)) == sizeof(ev)) || ++ (rc[1] != -1 && read(rc[1], &ev, sizeof(ev)) == sizeof(ev))) + { + if(ev.value) + { +@@ -63,9 +64,9 @@ + case KEY_GREEN: rccode = RC_GREEN; break; + case KEY_YELLOW: rccode = RC_YELLOW; break; + case KEY_BLUE: rccode = RC_BLUE; break; +- case KEY_HELP: rccode = RC_HELP; break; +- case KEY_SETUP: rccode = RC_DBOX; break; +- case KEY_HOME: rccode = RC_HOME; break; ++ case KEY_INFO: rccode = RC_HELP; break; ++ case KEY_MENU: rccode = RC_DBOX; break; ++ case KEY_EXIT: rccode = RC_HOME; break; + case KEY_POWER: rccode = RC_STANDBY; break; + default: + if( ev.code > 0x7F ) +@@ -118,176 +119,94 @@ + } + } + +- rccode = -1; +- usleep(1000000/100); +- return 0; +-} +- +-#else +- +-int GetRCCode(int mode) +-{ +- static int count = 0; +- //get code +- static unsigned short LastKey = -1; +- static char LastKBCode = 0x00; +- rccode = -1; +- int bytesavail = 0; +- int bytesread = read(rc, &rccode, 2); +- unsigned short tmprc; +- kbcode = 0; +- +- if (bytesread == 2) +- { +- if (read(rc, &tmprc, 2) == 2) +- { +- if (rccode == tmprc && count >= 0) +- count++; +- } +- } +- +- +- // Tastaturabfrage +- ioctl(kb, FIONREAD, &bytesavail); +- if (bytesavail>0) +- { +- char tch[100]; +- if (bytesavail > 99) bytesavail = 99; +- read(kb,tch,bytesavail); +- tch[bytesavail] = 0x00; +- kbcode = tch[0]; +- LastKBCode = kbcode; +- if (bytesavail == 1 && kbcode == 0x1b) { LastKey = RC_HOME ; rccode = -1 ; count = -1; return 1;} // ESC-Taste +- if (bytesavail == 1 && kbcode == '\n') { LastKey = RC_OK ; rccode = -1 ; count = -1; return 1;} // Enter-Taste +- if (bytesavail == 1 && kbcode == '+' ) { LastKey = RC_PLUS ; rccode = -1 ; count = -1; return 1;} +- if (bytesavail == 1 && kbcode == '-' ) { LastKey = RC_MINUS; rccode = -1 ; count = -1; return 1;} +- if (bytesavail >= 3 && tch[0] == 0x1b && tch[1] == 0x5b) +- { +- if (tch[2] == 0x41 ) { kbcode = LastKBCode = 0x00; rccode = RC_UP ; LastKey = rccode; count = -1; return 1; }// Cursortasten +- if (tch[2] == 0x42 ) { kbcode = LastKBCode = 0x00; rccode = RC_DOWN ; LastKey = rccode; count = -1; return 1; }// Cursortasten +- if (tch[2] == 0x43 ) { kbcode = LastKBCode = 0x00; rccode = RC_RIGHT ; LastKey = rccode; count = -1; return 1; }// Cursortasten +- if (tch[2] == 0x44 ) { kbcode = LastKBCode = 0x00; rccode = RC_LEFT ; LastKey = rccode; count = -1; return 1; }// Cursortasten +- if (tch[2] == 0x33 && tch[3] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_MINUS ; LastKey = rccode; count = -1; return 1; }// entf-Taste +- if (tch[2] == 0x32 && tch[3] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_PLUS ; LastKey = rccode; count = -1; return 1; }// einf-Taste +- if (tch[2] == 0x35 && tch[3] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_PLUS ; LastKey = rccode; count = -1; return 1; }// PgUp-Taste +- if (tch[2] == 0x36 && tch[3] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_MINUS ; LastKey = rccode; count = -1; return 1; }// PgDn-Taste +- if (tch[2] == 0x5b && tch[3] == 0x45) { kbcode = LastKBCode = 0x00; rccode = RC_RED ; LastKey = rccode; count = -1; return 1; }// F5-Taste +- if (tch[2] == 0x31 && tch[3] == 0x37 && tch[4] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_GREEN ; LastKey = rccode; count = -1; return 1; }// F6-Taste +- if (tch[2] == 0x31 && tch[3] == 0x38 && tch[4] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_YELLOW ; LastKey = rccode; count = -1; return 1; }// F7-Taste +- if (tch[2] == 0x31 && tch[3] == 0x39 && tch[4] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_BLUE ; LastKey = rccode; count = -1; return 1; }// F8-Taste +- if (tch[2] == 0x32 && tch[3] == 0x30 && tch[4] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_DBOX ; LastKey = rccode; count = -1; return 1; }// F9-Taste +- if (tch[2] == 0x32 && tch[3] == 0x31 && tch[4] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_HELP ; LastKey = rccode; count = -1; return 1; }// F10-Taste +- if (tch[2] == 0x32 && tch[3] == 0x33 && tch[4] == 0x7e) { kbcode = LastKBCode = 0x00; rccode = RC_MUTE ; LastKey = rccode; count = -1; return 1; }// F11-Taste +- } +- if (mode == RC_EDIT) +- { +-/* +- char tmsg[100]; +- int i; +- sprintf(tmsg,"KeyboardCode:avail:%d, char:%c, rccode:%x ",bytesavail,(kbcode == 0x00 ? '*' : kbcode ),rccode); +- for (i = 0; i < bytesavail; i++) sprintf(tmsg,"%s%x",tmsg,tch[i]); +- MessageBox(tmsg,"",NOBUTTON); +-*/ +- LastKey = rccode; +- count = -1; +- switch (rccode) +- { +- case KEY_0: +- case KEY_1: +- case KEY_2: +- case KEY_3: +- case KEY_4: +- case KEY_5: +- case KEY_6: +- case KEY_7: +- case KEY_8: +- case KEY_9: +- // SMS-Style verhindern +- rccode = -1; +- break; +- } +- return 1; +- } +- else if (bytesread <= 0) +- { +- if (kbcode == '0') { kbcode = 0x00;rccode = RC_0 ; LastKey = rccode; return 1;} +- if (kbcode == '1') { kbcode = 0x00;rccode = RC_1 ; LastKey = rccode; return 1;} +- if (kbcode == '2') { kbcode = 0x00;rccode = RC_2 ; LastKey = rccode; return 1;} +- if (kbcode == '3') { kbcode = 0x00;rccode = RC_3 ; LastKey = rccode; return 1;} +- if (kbcode == '4') { kbcode = 0x00;rccode = RC_4 ; LastKey = rccode; return 1;} +- if (kbcode == '5') { kbcode = 0x00;rccode = RC_5 ; LastKey = rccode; return 1;} +- if (kbcode == '6') { kbcode = 0x00;rccode = RC_6 ; LastKey = rccode; return 1;} +- if (kbcode == '7') { kbcode = 0x00;rccode = RC_7 ; LastKey = rccode; return 1;} +- if (kbcode == '8') { kbcode = 0x00;rccode = RC_8 ; LastKey = rccode; return 1;} +- if (kbcode == '9') { kbcode = 0x00;rccode = RC_9 ; LastKey = rccode; return 1;} +- } +- } +- if (bytesread == 2) ++ count=0; ++ if(read(kb, &ev, sizeof(ev)) == sizeof(ev)) + { +- if (rccode == LastKey && LastKBCode != 0x00 && LastKBCode == kbcode) +- { +- return 1; +- } +- LastKBCode = 0x00; +- if (rccode == LastKey) ++ if(ev.value) + { +- if (count < REPEAT_TIMER) ++ if(ev.code == rc_last_key) + { +- if (count >= 0) ++ if (count < REPEAT_TIMER) ++ { + count++; +- rccode = -1; +- return 1; ++ rccode = -1; ++ return 1; ++ } + } +- } +- else +- count = 0; +- LastKey = rccode; +- if ((rccode & 0xFF00) == 0x5C00) +- { +- kbcode = 0; +- switch(rccode) ++ else ++ count = 0; ++ rc_last_key = ev.code; ++ switch(ev.code) + { + case KEY_UP: rccode = RC_UP; break; + case KEY_DOWN: rccode = RC_DOWN; break; + case KEY_LEFT: rccode = RC_LEFT; break; + case KEY_RIGHT: rccode = RC_RIGHT; break; + case KEY_OK: rccode = RC_OK; break; +- case KEY_0: rccode = RC_0; break; +- case KEY_1: rccode = RC_1; break; +- case KEY_2: rccode = RC_2; break; +- case KEY_3: rccode = RC_3; break; +- case KEY_4: rccode = RC_4; break; +- case KEY_5: rccode = RC_5; break; +- case KEY_6: rccode = RC_6; break; +- case KEY_7: rccode = RC_7; break; +- case KEY_8: rccode = RC_8; break; +- case KEY_9: rccode = RC_9; break; + case KEY_RED: rccode = RC_RED; break; + case KEY_GREEN: rccode = RC_GREEN; break; + case KEY_YELLOW: rccode = RC_YELLOW; break; + case KEY_BLUE: rccode = RC_BLUE; break; +- case KEY_VOLUMEUP: rccode = RC_PLUS; break; +- case KEY_VOLUMEDOWN:rccode = RC_MINUS; break; +- case KEY_MUTE: rccode = RC_MUTE; break; +- case KEY_HELP: rccode = RC_HELP; break; +- case KEY_SETUP: rccode = RC_DBOX; break; +- case KEY_HOME: rccode = RC_HOME; break; ++ case KEY_INFO: rccode = RC_HELP; break; ++ case KEY_MENU: rccode = RC_DBOX; break; ++ case KEY_EXIT: rccode = RC_HOME; break; + case KEY_POWER: rccode = RC_STANDBY; break; ++ default: ++ if( ev.code > 0x7F ) ++ { ++ rccode = 0; ++ if( ev.code == 0x110 ) ++ { ++ rccode = RC_ON; ++ } ++ } ++ else ++ { ++ rccode = rctable[ev.code & 0x7F]; ++ } ++ if( rc_last_code == RC_LSHIFT ) ++ { ++ if( ev.code <= 0x56 ) //(sizeof(rcshifttable)/sizeof(int)-1) ++ { ++ rccode = rcshifttable[ev.code]; ++ } ++ } ++ else if( rc_last_code == RC_ALTGR ) ++ { ++ if( ev.code <= 0x56 ) //(sizeof(rcaltgrtable)/sizeof(int)-1) ++ { ++ rccode = rcaltgrtable[ev.code]; ++ } ++ } ++ else if( rc_last_code == RC_ALT ) ++ { ++ if((ev.code >=2) && ( ev.code <= 11 )) ++ { ++ rccode = (ev.code-1) | 0x0200; ++ } ++ } ++// if( !rccode ) ++ { ++// rccode = -1; ++ } ++ + } ++ rc_last_code = rccode; + return 1; + } + else + { +- rccode &= 0x003F; ++ rccode = -1; ++ rc_last_key = KEY_RESERVED; ++ rc_last_code = KEY_RESERVED; + } +- return 0; + } + + rccode = -1; + usleep(1000000/100); + return 0; + } +-#endif ++ + + /****************************************************************************** + * MyFaceRequester +@@ -316,6 +235,8 @@ + FT_Vector kerning; + FT_Error error; + ++ currentchar=currentchar & 0xFF; ++ + if (currentchar == '\r') // display \r in windows edited files + { + if(color != -1) +@@ -331,19 +252,15 @@ + } + //load char + +- if(!(glyphindex = FT_Get_Char_Index(face, currentchar))) ++ if(!(glyphindex = FT_Get_Char_Index(face, (int)currentchar))) + { + printf("TuxCom \n", (int)currentchar, error); + return 0; +@@ -376,7 +293,7 @@ + { + if(pitch*8 + 7-bit >= sbit->width) break; /* render needed bits only */ + +- if((sbit->buffer[row * sbit->pitch + pitch]) & 1<left + kerning.x + x + var_screeninfo.xres*(StartY + sy - sbit->top + y)) = color; ++ if((sbit->buffer[row * sbit->pitch + pitch]) & 1<left + kerning.x + x)*4 + fix_screeninfo.line_length*(StartY + sy - sbit->top + y),bgra[color],4); + + x++; + } +@@ -481,38 +398,36 @@ + void RenderBox(int sx, int sy, int ex, int ey, int mode, int color) + { + int loop; ++ int tx; + if(mode == FILL) + { + for(; sy <= ey; sy++) + { +- memset(lbb + StartX + sx + var_screeninfo.xres*(StartY + sy), color, ex-sx + 1); ++ for(tx=0; tx <= (ex-sx); tx++) ++ { ++ memcpy(lbb + StartX*4 + sx*4 + (tx*4) + fix_screeninfo.line_length*(StartY + sy),bgra[color],4); ++ } + } + } + else + { +- //hor lines +- +- for(loop = sx; loop <= ex; loop++) +- { +- *(lbb + StartX+loop + var_screeninfo.xres*(sy+StartY)) = color; +- *(lbb + StartX+loop + var_screeninfo.xres*(sy+1+StartY)) = color; +- +- *(lbb + StartX+loop + var_screeninfo.xres*(ey-1+StartY)) = color; +- *(lbb + StartX+loop + var_screeninfo.xres*(ey+StartY)) = color; +- } +- +- //ver lines +- +- for(loop = sy; loop <= ey; loop++) +- { +- *(lbb + StartX+sx + var_screeninfo.xres*(loop+StartY)) = color; +- *(lbb + StartX+sx+1 + var_screeninfo.xres*(loop+StartY)) = color; +- +- *(lbb + StartX+ex-1 + var_screeninfo.xres*(loop+StartY)) = color; +- *(lbb + StartX+ex + var_screeninfo.xres*(loop+StartY)) = color; +- } ++ for(loop = sx; loop <= ex; loop++) ++ { ++ memcpy(lbb + StartX*4+loop*4 + fix_screeninfo.line_length*(sy+StartY), bgra[color], 4); ++ memcpy(lbb + StartX*4+loop*4 + fix_screeninfo.line_length*(sy+1+StartY), bgra[color], 4); ++ memcpy(lbb + StartX*4+loop*4 + fix_screeninfo.line_length*(ey-1+StartY), bgra[color], 4); ++ memcpy(lbb + StartX*4+loop*4 + fix_screeninfo.line_length*(ey+StartY), bgra[color], 4); ++ } ++ for(loop = sy; loop <= ey; loop++) ++ { ++ memcpy(lbb + StartX*4+sx*4 + fix_screeninfo.line_length*(loop+StartY), bgra[color], 4); ++ memcpy(lbb + StartX*4+(sx+1)*4 + fix_screeninfo.line_length*(loop+StartY), bgra[color], 4); ++ memcpy(lbb + StartX*4+(ex-1)*4 + fix_screeninfo.line_length*(loop+StartY), bgra[color], 4); ++ memcpy(lbb + StartX*4+ex*4 + fix_screeninfo.line_length*(loop+StartY), bgra[color], 4); ++ } + } + } ++ + void SetLanguage() + { + if (langselect == BTN_AUTO) +@@ -540,7 +455,7 @@ + * plugin_exec * + ******************************************************************************/ + +-void plugin_exec(PluginParam *par) ++int main() + { + FT_Error error; + +@@ -552,9 +467,69 @@ + //get params + + +- fb = rc = sx = ex = sy = ey = -1; ++ kb = fb = sx = ex = sy = ey = -1; + +- for(; par; par = par->next) ++ /* open Framebuffer */ ++ fb=open("/dev/fb0", O_RDWR); ++ ++ /* open Remote Control */ ++ int cnt=0, rc_num=0; ++ rc[0]=rc[1]=-1; ++ ++ while(rc_num < 2) ++ { ++ struct stat s; ++ char tmp[128]; ++ sprintf(tmp, "/dev/input/event%d", cnt); ++ if (stat(tmp, &s)) ++ break; ++ /* open Remote Control */ ++ if ((rc[rc_num]=open(tmp, O_RDONLY | O_EXCL | O_NONBLOCK)) == -1) ++ { ++ perror("TuxCom "); ++ return 0; ++ } ++ if (ioctl(rc[rc_num], EVIOCGNAME(128), tmp) < 0) ++ perror("EVIOCGNAME failed"); ++ if (!strstr(tmp, "remote control")) ++ close(rc[rc_num]); ++ else ++ ++rc_num; ++ ++cnt; ++ } ++// fcntl(rc, F_SETFL, fcntl(rc, F_GETFL) | O_EXCL | O_NONBLOCK); ++ ++ /* open dream ir keyboard */ ++ cnt=0; ++ while(1) ++ { ++ struct stat s; ++ char tmp[128]; ++ sprintf(tmp, "/dev/input/event%d", cnt); ++ if (stat(tmp, &s)) ++ break; ++ /* open keyboard */ ++ if ((kb=open(tmp, O_RDONLY)) == -1) ++ { ++ perror("TuxCom "); ++ return 0; ++ } ++ if (ioctl(kb, EVIOCGNAME(128), tmp) < 0) ++ perror("EVIOCGNAME failed"); ++ if (strstr(tmp, "dreambox ir keyboard")) ++ break; ++ close(kb); ++ kb=-1; ++ ++cnt; ++ } ++ fcntl(kb, F_SETFL, fcntl(kb, F_GETFL) | O_EXCL | O_NONBLOCK); ++ ++ sx = 50; ++ ex = 670; ++ sy = 50; ++ ey = 526; ++ ++/* for(; par; par = par->next) + { + if (!strcmp(par->id, P_ID_FBUFFER)) fb = atoi(par->val); + else if (!strcmp(par->id, P_ID_RCINPUT)) rc = atoi(par->val); +@@ -563,9 +538,7 @@ + else if (!strcmp(par->id, P_ID_OFF_Y)) sy = atoi(par->val); + else if (!strcmp(par->id, P_ID_END_Y)) ey = atoi(par->val); + } +-#ifdef HAVE_DREAMBOX_HARDWARE +- kb=open("/dev/vc/0", O_RDONLY); +-#endif ++*/ + + if(fb == -1 || rc == -1 || sx == -1 || ex == -1 || sy == -1 || ey == -1) + { +@@ -574,18 +547,27 @@ + } + //init framebuffer + +- if(ioctl(fb, FBIOGET_FSCREENINFO, &fix_screeninfo) == -1) ++ ++ if(ioctl(fb, FBIOGET_VSCREENINFO, &var_screeninfo) == -1) + { +- printf("TuxCom \n"); ++ printf("TuxCom \n"); + return; + } + +- if(ioctl(fb, FBIOGET_VSCREENINFO, &var_screeninfo) == -1) ++ if (var_screeninfo.xres != 720) + { +- printf("TuxCom \n"); ++ printf("TuxCom \n"); + return; + } + ++ + if(ioctl(fb, FBIOPUTCMAP, &colormap) == -1) + { + printf("TuxCom \n"); +@@ -643,17 +625,14 @@ + + use_kerning = FT_HAS_KERNING(face); + +-#if FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 0 ++ + desc.image_type = ftc_image_mono; +-#else +- desc.flags = FT_LOAD_MONOCHROME; +-#endif + + + + //init backbuffer + +- if(!(lbb = malloc(var_screeninfo.xres*var_screeninfo.yres))) ++ if(!(lbb = malloc(3*fix_screeninfo.line_length*var_screeninfo.yres))) + { + printf("TuxCom \n"); + FTC_Manager_Done(manager); +@@ -661,11 +640,11 @@ + munmap(lfb, fix_screeninfo.smem_len); + return; + } +- memset(lbb, 0, var_screeninfo.xres*var_screeninfo.yres); ++ memset(lbb, 0, 3*fix_screeninfo.line_length*var_screeninfo.yres); + RenderBox(0,0,var_screeninfo.xres,var_screeninfo.yres,FILL,BLACK); + + //open avs +- if((avs = open(AVS, O_RDWR)) == -1) ++/* if((avs = open(AVS, O_RDWR)) == -1) + { + printf("TuxCom "); + return; +@@ -678,7 +657,7 @@ + printf("TuxCom "); + return; + } +- ++*/ + + + //init data +@@ -687,8 +666,8 @@ + curvisibility = 0; + singleview = 0; + textuppercase = 0; +- screenmode=0; + filesize_in_byte = BTN_NO; // show human readable filesize ++ screenmode=0; + langselect = BTN_AUTO; // automatic + autosave = BTN_ASK; // ask on exit + +@@ -725,22 +704,18 @@ + + SetLanguage(); + +- ioctl(saa, SAAIOGWSS, &saa_old); +- ioctl(saa, SAAIOSWSS, &saamodes[screenmode]); ++// ioctl(saa, SAAIOGWSS, &saa_old); ++// ioctl(saa, SAAIOSWSS, &saamodes[screenmode]); + // setup screen + RenderFrame(LEFTFRAME); + RenderFrame(RIGHTFRAME); +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + printf("TuxCom init successful\n"); + + // lock keyboard-conversions, this is done by the plugin itself + fclose(fopen(KBLCKFILE,"w")); + +-#ifdef HAVE_DREAMBOX_HARDWARE +- fcntl(rc, F_SETFL, O_NONBLOCK); +-#else +- fcntl(rc, F_SETFL, fcntl(rc, F_GETFL) &~ O_NONBLOCK); +-#endif ++// fcntl(rc, F_SETFL, fcntl(rc, F_GETFL) &~ O_NONBLOCK); + + int dosave = autosave; + int firstentry = 1; +@@ -767,20 +742,11 @@ + if (strcmp(szP,szPass) != 0) break; + RenderFrame(LEFTFRAME); + RenderFrame(RIGHTFRAME); +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + } + } + firstentry = 0; + +-#ifdef HAVE_DREAMBOX_HARDWARE +- if (kbcode != 0) +- { +- if (kbcode == 0x09) // tab +- { +- rccode = (curframe == 1 ? RC_LEFT : RC_RIGHT); +- } +- } +-#endif + switch(rccode) + { + case RC_HELP: +@@ -868,13 +834,13 @@ + break; + } + else +- { ++ { + char scriptfile[FILENAME_MAX]; + char* expos = strrchr(pfe->name,'.'); + if (expos && strlen(expos) > 0) + { + struct stat st; +- sprintf(scriptfile,"%s%s%s",CONFIGDIR, "/tuxcom/",expos+1); ++ sprintf(scriptfile,"%s%s%s","/etc/tuxbox/",expos+1); + if (lstat(scriptfile,&st) != -1) + { + char szCmd[4000]; +@@ -1361,7 +1327,7 @@ + finfo[curframe].first = finfo[curframe].selected - framerows+1; + RenderFrame(LEFTFRAME); + RenderFrame(RIGHTFRAME); +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + + }while(rccode != RC_HOME); + +@@ -1380,12 +1346,17 @@ + unlink(KBLCKFILE); + + //restore videoformat +- ioctl(avs, AVSIOSSCARTPIN8, &fnc_old); +- ioctl(saa, SAAIOSWSS, &saa_old); +- close(avs); +- close(saa); +- +- fcntl(rc, F_SETFL, O_NONBLOCK); ++// ioctl(avs, AVSIOSSCARTPIN8, &fnc_old); ++// ioctl(saa, SAAIOSWSS, &saa_old); ++// close(avs); ++// close(saa); ++ ++// fcntl(rc, F_SETFL, O_NONBLOCK); ++ if (rc[0] != -1) ++ close(rc[0]); ++ if (rc[1] != -1) ++ close(rc[1]); ++ close(kb); + + ClearEntries (LEFTFRAME ); + ClearEntries (RIGHTFRAME); +@@ -1393,9 +1364,6 @@ + ClearMarker (RIGHTFRAME); + ClearZipEntries(LEFTFRAME ); + ClearZipEntries(RIGHTFRAME); +-#ifdef HAVE_DREAMBOX_HARDWARE +- if (kb != -1) close(kb); +-#endif + return; + } + +@@ -1447,7 +1415,7 @@ + RenderString(colorline[colortool[i]*NUM_LANG+language], (viewx/COLORBUTTONS) *i , viewy- FONT_OFFSET_BIG , viewx/COLORBUTTONS, CENTER, SMALL , (i == 2 ? BLACK : WHITE)); + } + if (refresh == YES) +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + + } + +@@ -1458,7 +1426,7 @@ + + void RenderFrame(int frame) + { +- if (singleview && curframe != frame) ++ if (singleview && curframe != frame) + return; + + int row = 0; +@@ -1742,7 +1710,7 @@ + + RenderBox(viewx/2 + 2* BORDERSIZE , viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT , viewx/2 + 2* BORDERSIZE +BUTTONWIDTH ,viewy-(viewy-he)/2- 2* BORDERSIZE , GRID, (sel == 1 ? WHITE : GREEN)); + RenderBox(viewx/2 + 2* BORDERSIZE +1, viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT+1, viewx/2 + 2* BORDERSIZE +BUTTONWIDTH -1,viewy-(viewy-he)/2- 2* BORDERSIZE-1, GRID, (sel == 1 ? WHITE : GREEN)); +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + break; + case 2: + RenderBox(viewx/2 - 4* BORDERSIZE - BUTTONWIDTH - BUTTONWIDTH/2 , viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT , viewx/2 - 4* BORDERSIZE - BUTTONWIDTH/2 ,viewy-(viewy-he)/2- 2* BORDERSIZE , GRID, (sel == 0 ? WHITE : RED )); +@@ -1753,7 +1721,7 @@ + + RenderBox(viewx/2 + 4* BORDERSIZE + BUTTONWIDTH/2 , viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT , viewx/2 + 4* BORDERSIZE +BUTTONWIDTH + BUTTONWIDTH/2 ,viewy-(viewy-he)/2- 2* BORDERSIZE , GRID, (sel == 2 ? BLACK : YELLOW )); + RenderBox(viewx/2 + 4* BORDERSIZE + BUTTONWIDTH/2 +1, viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT+1, viewx/2 + 4* BORDERSIZE +BUTTONWIDTH + BUTTONWIDTH/2-1,viewy-(viewy-he)/2- 2* BORDERSIZE-1, GRID, (sel == 2 ? BLACK : YELLOW )); +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + break; + case 4: + RenderBox(viewx/2 - 4* BORDERSIZE - BUTTONWIDTH - BUTTONWIDTH/2 , viewy-(viewy-he)/2 - 4*BORDERSIZE - 2*BUTTONHEIGHT , viewx/2 - 4* BORDERSIZE - BUTTONWIDTH/2 ,viewy-(viewy-he)/2- 4* BORDERSIZE - BUTTONHEIGHT , GRID, (sel == 0 ? WHITE : RED )); +@@ -1770,7 +1738,7 @@ + + RenderBox(viewx/2 + 2* BORDERSIZE , viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT , viewx/2 + 4* BORDERSIZE +BUTTONWIDTH + BUTTONWIDTH/2 ,viewy-(viewy-he)/2- 2* BORDERSIZE , GRID, (sel == 4 ? WHITE : BLUE2 )); + RenderBox(viewx/2 + 2* BORDERSIZE +1, viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT+1, viewx/2 + 4* BORDERSIZE +BUTTONWIDTH + BUTTONWIDTH/2-1,viewy-(viewy-he)/2- 2* BORDERSIZE -1, GRID, (sel == 4 ? WHITE : BLUE2 )); +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + break; + } + drawsel = 0; +@@ -1853,7 +1821,7 @@ + RenderBox((viewx-BUTTONWIDTH)/2 , viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT, viewx - (viewx-BUTTONWIDTH)/2,viewy-(viewy-he)/2 - 2*BORDERSIZE , GRID, WHITE); + break; + } +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + } + + /****************************************************************************** +@@ -1882,15 +1850,9 @@ + RenderBox((viewx-wi)/2 , (viewy-he) /2, viewx-(viewx-wi)/2, viewy-(viewy-he)/2, GRID, WHITE); + RenderString(pfe->name,(viewx-wi)/2+ 2* BORDERSIZE , (viewy-he)/2 + 2*BORDERSIZE + FONTHEIGHT_BIG-FONT_OFFSET , wi, CENTER, BIG, WHITE); + +- char sizeString[200]; +- GetSizeString(sizeString,pfe->fentry.st_size,1); +- sprintf(sizeString,"%s byte(s)",sizeString); +- +- RenderString(sizeString,(viewx-wi)/2+ 2* BORDERSIZE , (viewy-he)/2 + 2*BORDERSIZE + 2*FONTHEIGHT_BIG-FONT_OFFSET , wi, CENTER, BIG, WHITE); +- +- RenderString(info[INFO_ACCESSED*NUM_LANG+language],(viewx-wi)/2+ 3* BORDERSIZE , (viewy-he)/2 + 6*BORDERSIZE + (3)*FONTHEIGHT_BIG-FONT_OFFSET , wi, LEFT, BIG, WHITE); +- RenderString(info[INFO_MODIFIED*NUM_LANG+language],(viewx-wi)/2+ 3* BORDERSIZE , (viewy-he)/2 + 6*BORDERSIZE + (4)*FONTHEIGHT_BIG-FONT_OFFSET , wi, LEFT, BIG, WHITE); +- RenderString(info[INFO_CREATED *NUM_LANG+language],(viewx-wi)/2+ 3* BORDERSIZE , (viewy-he)/2 + 6*BORDERSIZE + (5)*FONTHEIGHT_BIG-FONT_OFFSET , wi, LEFT, BIG, WHITE); ++ RenderString(info[INFO_ACCESSED*NUM_LANG+language],(viewx-wi)/2+ 3* BORDERSIZE , (viewy-he)/2 + 6*BORDERSIZE + (2)*FONTHEIGHT_BIG-FONT_OFFSET , wi, LEFT, BIG, WHITE); ++ RenderString(info[INFO_MODIFIED*NUM_LANG+language],(viewx-wi)/2+ 3* BORDERSIZE , (viewy-he)/2 + 6*BORDERSIZE + (3)*FONTHEIGHT_BIG-FONT_OFFSET , wi, LEFT, BIG, WHITE); ++ RenderString(info[INFO_CREATED *NUM_LANG+language],(viewx-wi)/2+ 3* BORDERSIZE , (viewy-he)/2 + 6*BORDERSIZE + (4)*FONTHEIGHT_BIG-FONT_OFFSET , wi, LEFT, BIG, WHITE); + char tm[100]; + strftime(tm,100,info[INFO_DATETIME *NUM_LANG+language],localtime(&pfe->fentry.st_atime)); + RenderString(tm,viewx/2- 2* BORDERSIZE , (viewy-he)/2 + 6*BORDERSIZE + (3)*FONTHEIGHT_BIG-FONT_OFFSET , wi/2, RIGHT, BIG, WHITE); +@@ -2000,7 +1962,7 @@ + RenderBox(viewx/2 - 2* BORDERSIZE -BUTTONWIDTH+1, viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT+1, viewx/2 - 2* BORDERSIZE -1,viewy-(viewy-he)/2- 2* BORDERSIZE-1, GRID, (sel == YES ? WHITE : RED )); + RenderBox(viewx/2 + 2* BORDERSIZE , viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT , viewx/2 + 2* BORDERSIZE +BUTTONWIDTH ,viewy-(viewy-he)/2- 2* BORDERSIZE , GRID, (sel == NO ? WHITE : GREEN)); + RenderBox(viewx/2 + 2* BORDERSIZE +1, viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT+1, viewx/2 + 2* BORDERSIZE +BUTTONWIDTH-1,viewy-(viewy-he)/2- 2* BORDERSIZE-1, GRID, (sel == NO ? WHITE : GREEN)); +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + drawsel = 0; + } + +@@ -2041,7 +2003,7 @@ + continue; + *p=0; + p++; +- p1=strchr(p,'\r'); // für Windows-Nutzer: '\r' überlesen ++ p1=strchr(p,'\r'); // für Windows-Nutzer: '\r' überlesen + if (p1 != NULL) *p1 = 0x00; + if ( !strcmp(line,"host") ) strcpy(entries[0], p); + else if ( !strcmp(line,"port") ) strcpy(entries[1], p); +@@ -2144,7 +2106,7 @@ + RenderBox(viewx/2 - 2* BORDERSIZE -BUTTONWIDTH+1, viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT+1, viewx/2 - 2* BORDERSIZE -1,viewy-(viewy-he)/2- 2* BORDERSIZE-1, GRID, (sel == YES ? WHITE : RED )); + RenderBox(viewx/2 + 2* BORDERSIZE , viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT , viewx/2 + 2* BORDERSIZE +BUTTONWIDTH ,viewy-(viewy-he)/2- 2* BORDERSIZE , GRID, (sel == NO ? WHITE : GREEN)); + RenderBox(viewx/2 + 2* BORDERSIZE +1, viewy-(viewy-he)/2 - 2*BORDERSIZE - BUTTONHEIGHT+1, viewx/2 + 2* BORDERSIZE +BUTTONWIDTH-1,viewy-(viewy-he)/2- 2* BORDERSIZE-1, GRID, (sel == NO ? WHITE : GREEN)); +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + drawsel = 0; + } + if (end == YES) +@@ -2195,10 +2157,10 @@ + sprintf(szEntry,mainmenu[i*NUM_LANG+language],mbox[filesize_in_byte*NUM_LANG+language]); + break; + case 5: // set language +- sprintf(szEntry,mainmenu[i*NUM_LANG+language],mbox[langselect *NUM_LANG+language]); ++ sprintf(szEntry,mainmenu[i*NUM_LANG+language],mbox[langselect*NUM_LANG+language]); + break; + case 6: // save settings +- sprintf(szEntry,mainmenu[i*NUM_LANG+language],mbox[autosave *NUM_LANG+language]); ++ sprintf(szEntry,mainmenu[i*NUM_LANG+language],mbox[autosave *NUM_LANG+language]); + break; + default: + strcpy(szEntry,mainmenu[i*NUM_LANG+language]); +@@ -2206,7 +2168,7 @@ + } + RenderString(szEntry,(viewx-wi)/2+ BORDERSIZE , (viewy-he)/2 + BORDERSIZE + (i+1)*FONTHEIGHT_BIG-FONT_OFFSET , wi, CENTER, BIG, WHITE); + } +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + int drawsel = 0; + do{ + GetRCCode(RC_NORMAL); +@@ -2225,8 +2187,8 @@ + return; + case 2: + screenmode = 1-screenmode; +- ioctl(avs, AVSIOSSCARTPIN8, &fncmodes[screenmode]); +- ioctl(saa, SAAIOSWSS, &saamodes[screenmode]); ++ //ioctl(avs, AVSIOSSCARTPIN8, &fncmodes[screenmode]); ++ //ioctl(saa, SAAIOSWSS, &saamodes[screenmode]); + return; + case 3: + SetPassword(); +@@ -2342,7 +2304,7 @@ + } + RenderString(szEntry,(viewx-wi)/2+ BORDERSIZE , (viewy-he)/2 + BORDERSIZE + (i+1)*FONTHEIGHT_BIG-FONT_OFFSET , wi, CENTER, BIG, WHITE); + } +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + drawsel = 0; + } + }while(1); +@@ -2439,7 +2401,7 @@ + colortool[3] = (pass == NO ? ACTION_INSTEXT : ACTION_NOACTION); + RenderMenuLine(-1, EDIT); + +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + + do{ + while (GetRCCode(RC_EDIT) == 0); +@@ -2755,7 +2717,7 @@ + colortool[3] = ACTION_NOACTION; + } + RenderMenuLine(-1, EDIT); +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + }while(1); + + rccode = -1; +@@ -3808,7 +3770,7 @@ + p = p1+1; + } + pStop = p; +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + while (GetRCCode(RC_NORMAL) == 0); + switch (rccode) + { +@@ -4227,7 +4189,7 @@ + } + RenderBox( viewx/6 +3*BORDERSIZE, BORDERSIZE+FONTHEIGHT_BIG , viewx/6 + 4*BORDERSIZE, viewy-MENUSIZE , FILL, WHITE); + RenderBox( viewx/3 -2*BORDERSIZE, BORDERSIZE+FONTHEIGHT_BIG , viewx/3 - BORDERSIZE, viewy-MENUSIZE , FILL, WHITE); +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + while (GetRCCode(RC_NORMAL) == 0); + switch (rccode) + { +@@ -4470,7 +4432,7 @@ + continue; + *p=0; + p++; +- p1=strchr(p,'\r'); // für Windows-Nutzer: '\r' überlesen ++ p1=strchr(p,'\r'); // für Windows-Nutzer: '\r' überlesen + if (p1 != NULL) *p1 = 0x00; + if ( !strcmp(line,"host") ) strcpy(finfo[curframe].ftphost, p); + else if ( !strcmp(line,"port") ) finfo[curframe].ftpport = atoi(p); +@@ -4733,7 +4695,7 @@ + + if (row > framerows - 2) + { +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + while (1) + { + GetRCCode(RC_NORMAL); +@@ -4754,7 +4716,7 @@ + } + if (row>0) + { +- memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); ++ memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + while (1) + { + GetRCCode(RC_NORMAL); +@@ -4812,7 +4774,7 @@ + + if (filesize_in_byte == BTN_NO && !forcebytes) + { +- if (size >= (unsigned long long)1024*1024*1024) // we use "real" GigaBytes ;) ++ if (size >= (unsigned long long )1024*1024*1024) // we use "real" GigaBytes ;) + { + sprintf(sizeString,"%.2f GB",((double)size)/(double)(1024*1024*1024)); + return; +@@ -4827,7 +4789,7 @@ + { + sprintf(sizeString,".%03lu%s",(unsigned long)(tmp % (unsigned long long)1000), sztmp); + strcpy(sztmp,sizeString); +- tmp /= (unsigned long long)1000; ++ tmp /= (unsigned long long )1000; + } + sprintf(sizeString,"%lu%s",(unsigned long)tmp,sztmp); + +@@ -4852,10 +4814,10 @@ + finfo[LEFTFRAME].sort = SORT_UP; + finfo[RIGHTFRAME].sort = SORT_UP; + +- fp = fopen( CONFIGDIR "/tuxcom.conf", "r" ); ++ fp = fopen( "/etc/tuxbox/tuxcom.conf", "r" ); + if ( !fp ) + { +- printf("tuxcom: could not open " CONFIGDIR "/tuxcom.conf !!!\n"); ++ printf("tuxcom: could not open /etc/tuxbox/tuxcom.conf !!!\n"); + } + else + { +@@ -4979,10 +4941,10 @@ + FILE *fp; + + +- fp = fopen( CONFIGDIR "/tuxcom.conf", "w" ); ++ fp = fopen( "/etc/tuxbox/tuxcom.conf", "w" ); + if ( !fp ) + { +- printf("tuxcom: could not open " CONFIGDIR "/tuxcom.conf !!!\n"); ++ printf("tuxcom: could not open /etc/tuxbox/tuxcom.conf !!!\n"); + } + else + { +diff -Naur tuxcom.ori/tuxcom.h tuxcom/tuxcom.h +--- tuxcom.ori/tuxcom.h 2009-01-06 00:12:19.000000000 +0100 ++++ tuxcom/tuxcom.h 2009-01-05 18:31:06.000000000 +0100 +@@ -22,7 +22,7 @@ + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA + */ + +-#include ++//#include + #include + #include + #include +@@ -37,10 +37,10 @@ + #include + #include + #include +-#include ++//#include + +-#include +-#include ++//#include ++//#include + + #include + #include +@@ -53,16 +53,14 @@ + #include FT_CACHE_SMALL_BITMAPS_H + + +-#ifndef HAVE_DREAMBOX_HARDWARE + #include +-#endif + +-#define AVS "/dev/dbox/avs0" +-#define SAA "/dev/dbox/saa0" ++//#define AVS "/dev/dbox/avs0" ++//#define SAA "/dev/dbox/saa0" + + #define MENUROWS 10 + #define MENUITEMS 10 +-#define MENUSIZE 59 ++#define MENUSIZE 63 + #define MINBOX 380 + #define BUTTONWIDTH 114 + #define BUTTONHEIGHT 30 +@@ -72,72 +70,15 @@ + #define RIGHTFRAME 1 + + #define DEFAULT_PATH "/" +-#define charset " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789#!$%&?*()@\\/=<>+-_,.;:" ++#define charset " aäbcdefghijklmnoöpqrstuüvwxyzAÄBCDEFGHIJKLMNOÖPQRSTUÜVWXYZ0123456789#!$%&?*()@\\/=<>+-_,.;:¤^°][}{'`µ|" + ++#define _FILE_OFFSET_BITS 64 + #define FILEBUFFER_SIZE (100 * 1024) // Edit files up to 100k + #define FTPBUFFER_SIZE (200 * 1024) // FTP Download Buffer size + +-#define MSG_VERSION "Tuxbox Commander Version 1.16" ++#define MSG_VERSION "Tuxbox Commander E2 Ver. 1.16\n" + #define MSG_COPYRIGHT "© dbluelle 2004-2007" + +-#ifdef HAVE_DREAMBOX_HARDWARE +- +-//rc codes +-#define KEY_0 0x5C00 +-#define KEY_1 0x5C01 +-#define KEY_2 0x5C02 +-#define KEY_3 0x5C03 +-#define KEY_4 0x5C04 +-#define KEY_5 0x5C05 +-#define KEY_6 0x5C06 +-#define KEY_7 0x5C07 +-#define KEY_8 0x5C08 +-#define KEY_9 0x5C09 +-#define KEY_POWER 0x5C0C +-#define KEY_UP 0x5C0E +-#define KEY_DOWN 0x5C0F +-#define KEY_VOLUMEUP 0x5C16 +-#define KEY_VOLUMEDOWN 0x5C17 +-#define KEY_HOME 0x5C20 +-#define KEY_SETUP 0x5C27 +-#define KEY_MUTE 0x5C28 +-#define KEY_RED 0x5C2D +-#define KEY_RIGHT 0x5C2E +-#define KEY_LEFT 0x5C2F +-#define KEY_OK 0x5C30 +-#define KEY_BLUE 0x5C3B +-#define KEY_YELLOW 0x5C52 +-#define KEY_GREEN 0x5C55 +-#define KEY_HELP 0x5C82 +- +-#define RC_0 0x00 +-#define RC_1 0x01 +-#define RC_2 0x02 +-#define RC_3 0x03 +-#define RC_4 0x04 +-#define RC_5 0x05 +-#define RC_6 0x06 +-#define RC_7 0x07 +-#define RC_8 0x08 +-#define RC_9 0x09 +-#define RC_RIGHT 0x0A +-#define RC_LEFT 0x0B +-#define RC_UP 0x0C +-#define RC_DOWN 0x0D +-#define RC_OK 0x0E +-#define RC_MUTE 0x0F +-#define RC_STANDBY 0x10 +-#define RC_GREEN 0x11 +-#define RC_YELLOW 0x12 +-#define RC_RED 0x13 +-#define RC_BLUE 0x14 +-#define RC_PLUS 0x15 +-#define RC_MINUS 0x16 +-#define RC_HELP 0x17 +-#define RC_DBOX 0x18 +-#define RC_HOME 0x1F +- +-#else + // rc codes + #define RC_0 '0' + #define RC_1 '1' +@@ -225,7 +166,7 @@ + int rcaltgrtable[] = + { + 0x00, RC_ESC, 0x00, '²', '³', 0x00, 0x00, 0x00, '{', '[', ']', '}', '\\', 0x00, 0x00, 0x00, +- '@', 0x00, '€', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, '~', RC_RET1, RC_STRG, 0x00, 0x00, ++ '@', 0x00, '¤', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, '~', RC_RET1, RC_STRG, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, RC_LSHIFT, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 'µ', 0x00, 0x00, 0x00, RC_RSHIFT, 0x00, RC_ALT, 0x20, RC_CAPSLOCK,RC_F1,RC_F2,RC_F3,RC_F4,RC_F5, + RC_F6,RC_F7,RC_F8,RC_F9,RC_F10,RC_NUM,RC_ROLLEN,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +@@ -247,13 +188,13 @@ + #define KBC_PAGEDOWN 0x0C + #define KBC_RETURN 0x0D + +-#endif + #define KBLCKFILE "/tmp/keyboard.lck" //! file to lock keyboard-conversion + + + //freetype stuff + +-#define FONT FONTDIR "/pakenham.ttf" ++//#define FONT "/usr/share/fonts/md_khmurabi_10.ttf" ++#define FONT "/usr/share/fonts/pakenham.ttf" + // if font is not in usual place, we look here: + #define FONT2 "/var/tuxbox/config/enigma/fonts/pakenham.ttf" + +@@ -266,11 +207,7 @@ + FTC_Manager manager; + FTC_SBitCache cache; + FTC_SBit sbit; +-#if FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 0 + FTC_Image_Desc desc; +-#else +-FTC_ImageTypeRec desc; +-#endif + FT_Face face; + FT_UInt prev_glyphindex; + FT_Bool use_kerning; +@@ -297,6 +234,14 @@ + struct fb_fix_screeninfo fix_screeninfo; + struct fb_var_screeninfo var_screeninfo; + ++unsigned char bgra[][4] = { ++"\x00\x00\x00\x00", "\xFF\xFF\xFF\xFF", "\x00\x00\x00\xFF", "\x80\x00\x00\xFF", ++"\xFF\x80\x00\xFF", "\x00\xC0\xFF\xFF", "\x00\xD0\x00\xFF", "\x00\xE8\xE8\xFF", ++"\x00\x00\xFF\xFF", "\xB0\xB0\xB0\xFF", "\x00\xFF\x00\xFF", "\x50\x50\x50\xFF", ++"\x80\x00\x00\xC0", "\x50\x50\x50\xC0", "\xFF\x40\x00\xFf" }; ++ ++ ++ + unsigned short rd[] = {0xFF<<8, 0x00<<8, 0x00<<8, 0x00<<8, 0xFF<<8, 0x00<<8, 0xE8<<8, 0xFF<<8, 0xb0<<8, 0x00<<8, 0x50<<8, 0x00<<8, 0x50<<8, 0x00<<8}; + unsigned short gn[] = {0xFF<<8, 0x00<<8, 0x00<<8, 0x80<<8, 0xC0<<8, 0xd0<<8, 0xE8<<8, 0x00<<8, 0xb0<<8, 0xff<<8, 0x50<<8, 0x00<<8, 0x50<<8, 0x40<<8}; + unsigned short bl[] = {0xFF<<8, 0x00<<8, 0x80<<8, 0xFF<<8, 0x00<<8, 0x00<<8, 0x00<<8, 0x00<<8, 0xb0<<8, 0x00<<8, 0x50<<8, 0x80<<8, 0x50<<8, 0xff<<8}; +@@ -307,9 +252,7 @@ + int trans_map [] = {BLUE1,BLUE_TRANSP,TRANSP}; + int trans_map_mark[] = {GRAY2,GRAY_TRANSP,GRAY_TRANSP}; + +-#ifndef HAVE_DREAMBOX_HARDWARE + struct input_event ev; +-#endif + + unsigned short rccode; + char kbcode; +@@ -317,7 +260,7 @@ + //some data + + int avs, saa, fnc_old, saa_old, screenmode; +-int rc, fb, kb; ++int rc[2], fb, kb; + int sx, ex, sy, ey; + int PosX, PosY, StartX, StartY, FrameWidth, NameWidth, SizeWidth; + int curframe, cursort, curvisibility, singleview; +@@ -339,8 +282,8 @@ + char szPass[20]; + long commandsize; + +-int fncmodes[] = {AVS_FNCOUT_EXT43, AVS_FNCOUT_EXT169}; +-int saamodes[] = {SAA_WSS_43F, SAA_WSS_169F}; ++//int fncmodes[] = {AVS_FNCOUT_EXT43, AVS_FNCOUT_EXT169}; ++//int saamodes[] = {SAA_WSS_43F, SAA_WSS_169F}; + + FILE *conf; + int language, langselect, autosave, filesize_in_byte; +@@ -466,13 +409,13 @@ + + char *numberchars[] = { "0#!$%&?*()@\\", + "1/=<>+-_,.;:" , +- "abc2", +- "def3", ++ "aäbc2", ++ "de¤f3", + "ghi4", + "jkl5", +- "mno6", ++ "mnoö6", + "pqrs7", +- "tuv8", ++ "tuüv8", + "wxyz9" }; + + char *info[] = { "(select 'hidden' to copy in background)" ,"('versteckt' wählen zum Kopieren im Hintergrund)" ,"(Seleziona 'nascosto' per copiare in background)" ,"(välj 'gömd' för att kopiera i bakgrunden)" ,"(Seleccionar 'Escondido' para copiar em background)" , +@@ -599,7 +542,7 @@ + "toggle 16:9 mode" , "16:9-Modus setzen" ,"Passa a modalità 16:9" ,"växla 16:9 läge" ,"Mudar para 16:9" , + "set password" , "Passwort setzen" ,"Imposta password" ,"sätt lösenord" ,"Por password" , + "show filesizes in byte <%s>" , "Dateigrössen in Byte anzeigen <%s>" ,"show filesizes in byte <%s>" ,"show filesizes in byte <%s>" ,"show filesizes in byte <%s>" , +- "language/Sprache/Lingua/Språk: <%s>", "Sprache/language/Lingua/Språk: <%s>" ,"Lingua/language/Sprache/Språk: <%s>" ,"Lingua/language/Sprache/Språk: <%s>" ,"Lingua/language/Sprache/Språk: <%s>", ++ "Language/Sprache/Lingua/Språk: <%s>", "Sprache/Language/Lingua/Språk: <%s>" ,"Lingua/Language/Sprache/Språk: <%s>" ,"Lingua/Language/Sprache/Språk: <%s>" ,"Lingua/Language/Sprache/Språk: <%s>", + "save settings on exit: <%s>" , "Einstellungen beim Beenden speichern: <%s>","Salvare le impostazioni in uscita: <%s>" ,"spara inställningar vid avslut: <%s>","Gravar e sair: <%s>" , + "save settings now" , "Einstellungen jetzt speichern" ,"Salvare le impostazioni adesso" ,"spara inställningar nu" ,"Gravar configuracoes agora" }; + diff --git a/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/add_e2_plugin.diff b/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/add_e2_plugin.diff new file mode 100644 index 0000000..d01e7a8 --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/add_e2_plugin.diff @@ -0,0 +1,48 @@ +diff -Naur tuxcom_cvs/python/Makefile.am tuxcom/python/Makefile.am +--- tuxcom_cvs/python/Makefile.am 1970-01-01 01:00:00.000000000 +0100 ++++ tuxcom/python/Makefile.am 2008-11-03 13:56:54.425916639 +0100 +@@ -0,0 +1,5 @@ ++installdir = $(LIBDIR)/enigma2/python/Plugins/Extensions/Tuxcom ++ ++install_DATA = \ ++ plugin.py \ ++ __init__.py +diff -Naur tuxcom_cvs/python/plugin.py tuxcom/python/plugin.py +--- tuxcom_cvs/python/plugin.py 1970-01-01 01:00:00.000000000 +0100 ++++ tuxcom/python/plugin.py 2008-11-03 14:22:15.705918505 +0100 +@@ -0,0 +1,35 @@ ++from enigma import * ++from Screens.Screen import Screen ++from Plugins.Plugin import PluginDescriptor ++ ++class TuxComStarter(Screen): ++ skin = """ ++ ++ """ ++ ++ def __init__(self, session, args = None): ++ self.skin = TuxComStarter.skin ++ Screen.__init__(self, session) ++ self.container=eConsoleAppContainer() ++ self.container.appClosed.append(self.finished) ++ self.runapp() ++ ++ def runapp(self): ++ eDBoxLCD.getInstance().lock() ++ eRCInput.getInstance().lock() ++ fbClass.getInstance().lock() ++ if self.container.execute("/usr/bin/tuxcom"): ++ self.finished(-1) ++ ++ def finished(self,retval): ++ fbClass.getInstance().unlock() ++ eRCInput.getInstance().unlock() ++ eDBoxLCD.getInstance().unlock() ++ self.close() ++ ++def main(session, **kwargs): ++ session.open(TuxComStarter) ++ ++def Plugins(**kwargs): ++ return PluginDescriptor(name="TuxCom", description="TuxBox Commander", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main) ++ diff --git a/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/add_font.diff b/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/add_font.diff new file mode 100644 index 0000000000000000000000000000000000000000..b04e441dd0ced5ef64d5bae47a864d8455ba1fbd GIT binary patch literal 67589 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 ++version DVB_API_VERSION ++ ]])]) ++ DVB_API_VERSION=`(eval "$ac_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | $EGREP "^version" | sed "s,version\ ,,"` ++ rm -f conftest* ++ ++ AC_MSG_NOTICE([found dvb version $DVB_API_VERSION]) ++]) ++fi ++ ++if test "$DVB_API_VERSION"; then ++ AC_DEFINE(HAVE_DVB,1,[Define to 1 if you have the dvb includes]) ++ AC_DEFINE_UNQUOTED(HAVE_DVB_API_VERSION,$DVB_API_VERSION,[Define to the version of the dvb api]) ++else ++ AC_MSG_ERROR([can't find dvb headers]) ++fi ++]) ++ ++AC_DEFUN(_TUXBOX_APPS_LIB_CONFIG,[ ++AC_PATH_PROG($1_CONFIG,$2,no) ++if test "$$1_CONFIG" != "no"; then ++ if test "$TARGET" = "cdk" && check_path "$$1_CONFIG"; then ++ AC_MSG_$3([could not find a suitable version of $2]); ++ else ++ $1_CFLAGS=$($$1_CONFIG --cflags) ++ $1_LIBS=$($$1_CONFIG --libs) ++ fi ++fi ++ ++AC_SUBST($1_CFLAGS) ++AC_SUBST($1_LIBS) ++]) ++ ++AC_DEFUN(TUXBOX_APPS_LIB_CONFIG,[ ++_TUXBOX_APPS_LIB_CONFIG($1,$2,ERROR) ++if test "$$1_CONFIG" = "no"; then ++ AC_MSG_ERROR([could not find $2]); ++fi ++]) ++ ++AC_DEFUN(TUXBOX_APPS_LIB_CONFIG_CHECK,[ ++_TUXBOX_APPS_LIB_CONFIG($1,$2,WARN) ++]) ++ ++AC_DEFUN(TUXBOX_APPS_PKGCONFIG,[ ++AC_PATH_PROG(PKG_CONFIG, pkg-config,no) ++if test "$PKG_CONFIG" = "no" ; then ++ AC_MSG_ERROR([could not find pkg-config]); ++fi ++]) ++ ++AC_DEFUN(_TUXBOX_APPS_LIB_PKGCONFIG,[ ++PKG_CHECK_MODULES($1,$2) ++AC_SUBST($1_CFLAGS) ++AC_SUBST($1_LIBS) ++]) ++ ++AC_DEFUN(TUXBOX_APPS_LIB_PKGCONFIG,[ ++_TUXBOX_APPS_LIB_PKGCONFIG($1,$2) ++if test -z "$$1_CFLAGS" ; then ++ AC_MSG_ERROR([could not find package $2]); ++fi ++]) ++ ++AC_DEFUN(TUXBOX_APPS_LIB_PKGCONFIG_CHECK,[ ++_TUXBOX_APPS_LIB_PKGCONFIG($1,$2) ++]) ++ ++AC_DEFUN(_TUXBOX_APPS_LIB_SYMBOL,[ ++AC_CHECK_LIB($2,$3,HAVE_$1="yes",HAVE_$1="no") ++if test "$HAVE_$1" = "yes"; then ++ $1_LIBS=-l$2 ++fi ++ ++AC_SUBST($1_LIBS) ++]) ++ ++AC_DEFUN(TUXBOX_APPS_LIB_SYMBOL,[ ++_TUXBOX_APPS_LIB_SYMBOL($1,$2,$3,ERROR) ++if test "$HAVE_$1" = "no"; then ++ AC_MSG_ERROR([could not find $2]); ++fi ++]) ++ ++AC_DEFUN(TUXBOX_APPS_LIB_CONFIG_SYMBOL,[ ++_TUXBOX_APPS_LIB_SYMBOL($1,$2,$3,WARN) ++]) ++ ++AC_DEFUN(TUXBOX_APPS_GETTEXT,[ ++AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, ++ [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && ++ (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], ++ :) ++AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) ++ ++AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, ++ [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && ++ (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], ++ :) ++ ++AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,[$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1],:) ++ ++AC_MSG_CHECKING([whether NLS is requested]) ++AC_ARG_ENABLE(nls, ++ [ --disable-nls do not use Native Language Support], ++ USE_NLS=$enableval, USE_NLS=yes) ++AC_MSG_RESULT($USE_NLS) ++AC_SUBST(USE_NLS) ++ ++if test "$USE_NLS" = "yes"; then ++ AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,[ ++ AC_TRY_LINK([ ++ #include ++ #ifndef __GNU_GETTEXT_SUPPORTED_REVISION ++ #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) ++ #endif ++ extern int _nl_msg_cat_cntr; ++ extern int *_nl_domain_bindings; ++ ],[ ++ bindtextdomain ("", ""); ++ return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings; ++ ], gt_cv_func_gnugettext_libc=yes, gt_cv_func_gnugettext_libc=no ++ )] ++ ) ++ ++ if test "$gt_cv_func_gnugettext_libc" = "yes"; then ++ AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) ++ gt_use_preinstalled_gnugettext=yes ++ else ++ USE_NLS=no ++ fi ++fi ++ ++if test -f "$srcdir/po/LINGUAS"; then ++ ALL_LINGUAS=$(sed -e "/^#/d" "$srcdir/po/LINGUAS") ++fi ++ ++POFILES= ++GMOFILES= ++UPDATEPOFILES= ++DUMMYPOFILES= ++for lang in $ALL_LINGUAS; do ++ POFILES="$POFILES $srcdirpre$lang.po" ++ GMOFILES="$GMOFILES $srcdirpre$lang.gmo" ++ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" ++ DUMMYPOFILES="$DUMMYPOFILES $lang.nop" ++done ++INST_LINGUAS= ++if test -n "$ALL_LINGUAS"; then ++ for presentlang in $ALL_LINGUAS; do ++ useit=no ++ if test -n "$LINGUAS"; then ++ desiredlanguages="$LINGUAS" ++ else ++ desiredlanguages="$ALL_LINGUAS" ++ fi ++ for desiredlang in $desiredlanguages; do ++ case "$desiredlang" in ++ "$presentlang"*) useit=yes;; ++ esac ++ done ++ if test $useit = yes; then ++ INST_LINGUAS="$INST_LINGUAS $presentlang" ++ fi ++ done ++fi ++CATALOGS= ++if test -n "$INST_LINGUAS"; then ++ for lang in $INST_LINGUAS; do ++ CATALOGS="$CATALOGS $lang.gmo" ++ done ++fi ++AC_SUBST(POFILES) ++AC_SUBST(GMOFILES) ++AC_SUBST(UPDATEPOFILES) ++AC_SUBST(DUMMYPOFILES) ++AC_SUBST(CATALOGS) ++]) ++ ++dnl backward compatiblity ++AC_DEFUN([AC_GNU_SOURCE], ++[AH_VERBATIM([_GNU_SOURCE], ++[/* Enable GNU extensions on systems that have them. */ ++#ifndef _GNU_SOURCE ++# undef _GNU_SOURCE ++#endif])dnl ++AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl ++AC_BEFORE([$0], [AC_RUN_IFELSE])dnl ++AC_DEFINE([_GNU_SOURCE]) ++]) ++ ++AC_DEFUN([AC_PROG_EGREP], ++[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], ++ [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 ++ then ac_cv_prog_egrep='grep -E' ++ else ac_cv_prog_egrep='egrep' ++ fi]) ++ EGREP=$ac_cv_prog_egrep ++ AC_SUBST([EGREP]) ++]) ++ ++AC_DEFUN([AC_PYTHON_DEVEL],[ ++ # ++ # should allow for checking of python version here... ++ # ++ AC_REQUIRE([AM_PATH_PYTHON]) ++ ++ # Check for Python include path ++ AC_MSG_CHECKING([for Python include path]) ++ python_path=`echo $PYTHON | sed "s,/bin.*$,,"` ++ for i in "$python_path/include/python$PYTHON_VERSION/" "$python_path/include/python/" "$python_path/" ; do ++ python_path=`find $i -type f -name Python.h -print | sed "1q"` ++ if test -n "$python_path" ; then ++ break ++ fi ++ done ++ python_path=`echo $python_path | sed "s,/Python.h$,,"` ++ AC_MSG_RESULT([$python_path]) ++ if test -z "$python_path" ; then ++ AC_MSG_ERROR([cannot find Python include path]) ++ fi ++ AC_SUBST([PYTHON_CPPFLAGS],[-I$python_path]) ++ ++ # Check for Python library path ++ AC_MSG_CHECKING([for Python library path]) ++ python_path=`echo $PYTHON | sed "s,/bin.*$,,"` ++ for i in "$python_path/lib/python$PYTHON_VERSION/config/" "$python_path/lib/python$PYTHON_VERSION/" "$python_path/lib/python/config/" "$python_path/lib/python/" "$python_path/" ; do ++ python_path=`find $i -type f -name libpython$PYTHON_VERSION.* -print | sed "1q"` ++ if test -n "$python_path" ; then ++ break ++ fi ++ done ++ python_path=`echo $python_path | sed "s,/libpython.*$,,"` ++ AC_MSG_RESULT([$python_path]) ++ if test -z "$python_path" ; then ++ AC_MSG_ERROR([cannot find Python library path]) ++ fi ++ AC_SUBST([PYTHON_LDFLAGS],["-L$python_path -lpython$PYTHON_VERSION"]) ++ # ++ python_site=`echo $python_path | sed "s/config/site-packages/"` ++ AC_SUBST([PYTHON_SITE_PKG],[$python_site]) ++]) +diff -Naur tuxcom.ori/configure.ac tuxcom/configure.ac +--- tuxcom.ori/configure.ac 1970-01-01 01:00:00.000000000 +0100 ++++ tuxcom/configure.ac 2008-12-28 18:33:12.000000000 +0100 +@@ -0,0 +1,19 @@ ++# -*- Autoconf -*- ++# Process this file with autoconf to produce a configure script. ++ ++AC_INIT(tuxbox-tuxcom-32bpp,1.13) ++AM_INIT_AUTOMAKE(tuxbox-tuxcom-32bpp,1.13) ++ ++TUXBOX_APPS ++TUXBOX_APPS_DIRECTORY ++TUXBOX_APPS_DVB ++ ++# Checks for programs. ++AC_PROG_CXX ++AC_PROG_CC ++ ++TUXBOX_APPS_LIB_CONFIG(FREETYPE,freetype-config) ++ ++AC_OUTPUT(Makefile) ++AC_OUTPUT(font/Makefile) ++AC_OUTPUT(python/Makefile) +diff -Naur tuxcom_cvs/font/Makefile.am tuxcom/font/Makefile.am +--- tuxcom_cvs/font/Makefile.am 1970-01-01 01:00:00.000000000 +0100 ++++ tuxcom/font/Makefile.am 2008-11-03 13:56:11.917916738 +0100 +@@ -0,0 +1,4 @@ ++installdir = $(FONTDIR) ++ ++install_DATA = \ ++ pakenham.ttf diff --git a/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/support_newer_freetype.diff b/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/support_newer_freetype.diff new file mode 100644 index 0000000..5ed9eca --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxcom/tuxbox-tuxcom-32bpp/support_newer_freetype.diff @@ -0,0 +1,78 @@ +diff -Naur tuxcom/tuxcom.c tuxcom.freetype/tuxcom.c +--- tuxcom/tuxcom.c 2009-01-06 01:21:26.000000000 +0100 ++++ tuxcom.freetype/tuxcom.c 2009-01-07 13:21:16.000000000 +0100 +@@ -322,9 +322,15 @@ + + switch (size) + { ++#if ((defined(FREETYPE_MAJOR)) && (((FREETYPE_MAJOR == 2) && (((FREETYPE_MINOR == 1) && (FREETYPE_PATCH >= 9)) || (FREETYPE_MINOR > 1))) || (FREETYPE_MAJOR > 2))) ++ case VERY_SMALL: desc.width = desc.height = FONTHEIGHT_VERY_SMALL; break; ++ case SMALL : desc.width = desc.height = FONTHEIGHT_SMALL ; break; ++ case BIG : desc.width = desc.height = FONTHEIGHT_BIG ; break; ++#else + case VERY_SMALL: desc.font.pix_width = desc.font.pix_height = FONTHEIGHT_VERY_SMALL; break; + case SMALL : desc.font.pix_width = desc.font.pix_height = FONTHEIGHT_SMALL ; break; + case BIG : desc.font.pix_width = desc.font.pix_height = FONTHEIGHT_BIG ; break; ++#endif + } + + //reset kerning +@@ -354,9 +360,15 @@ + + switch (size) + { ++#if ((defined(FREETYPE_MAJOR)) && (((FREETYPE_MAJOR == 2) && (((FREETYPE_MINOR == 1) && (FREETYPE_PATCH >= 9)) || (FREETYPE_MINOR > 1))) || (FREETYPE_MAJOR > 2))) ++ case VERY_SMALL: desc.width = desc.height = FONTHEIGHT_VERY_SMALL; break; ++ case SMALL : desc.width = desc.height = FONTHEIGHT_SMALL ; break; ++ case BIG : desc.width = desc.height = FONTHEIGHT_BIG ; break; ++#else + case VERY_SMALL: desc.font.pix_width = desc.font.pix_height = FONTHEIGHT_VERY_SMALL; break; + case SMALL : desc.font.pix_width = desc.font.pix_height = FONTHEIGHT_SMALL ; break; + case BIG : desc.font.pix_width = desc.font.pix_height = FONTHEIGHT_BIG ; break; ++#endif + } + + //set alignment +@@ -617,17 +629,26 @@ + return; + } + else ++#if ((defined(FREETYPE_MAJOR)) && (((FREETYPE_MAJOR == 2) && (((FREETYPE_MINOR == 1) && (FREETYPE_PATCH >= 9)) || (FREETYPE_MINOR > 1))) || (FREETYPE_MAJOR > 2))) ++ desc.face_id = FONT2; ++#else + desc.font.face_id = FONT2; ++#endif + } + else ++#if ((defined(FREETYPE_MAJOR)) && (((FREETYPE_MAJOR == 2) && (((FREETYPE_MINOR == 1) && (FREETYPE_PATCH >= 9)) || (FREETYPE_MINOR > 1))) || (FREETYPE_MAJOR > 2))) ++ desc.face_id = FONT; ++#else + desc.font.face_id = FONT; +- ++#endif + + use_kerning = FT_HAS_KERNING(face); + +- ++#if ((defined(FREETYPE_MAJOR)) && (((FREETYPE_MAJOR == 2) && (((FREETYPE_MINOR == 1) && (FREETYPE_PATCH >= 9)) || (FREETYPE_MINOR > 1))) || (FREETYPE_MAJOR > 2))) ++ desc.flags = FT_LOAD_MONOCHROME; ++#else + desc.image_type = ftc_image_mono; +- ++#endif + + + //init backbuffer +diff -Naur tuxcom/tuxcom.h tuxcom.freetype/tuxcom.h +--- tuxcom/tuxcom.h 2009-01-06 01:21:26.000000000 +0100 ++++ tuxcom.freetype/tuxcom.h 2009-01-07 13:21:16.000000000 +0100 +@@ -192,6 +192,9 @@ + + + //freetype stuff ++#if ((defined(FREETYPE_MAJOR)) && (((FREETYPE_MAJOR == 2) && (((FREETYPE_MINOR == 1) && (FREETYPE_PATCH >= 9)) || (FREETYPE_MINOR > 1))) || (FREETYPE_MAJOR > 2))) ++typedef FTC_ImageTypeRec FTC_Image_Desc; ++#endif + + //#define FONT "/usr/share/fonts/md_khmurabi_10.ttf" + #define FONT "/usr/share/fonts/pakenham.ttf" diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt.bb b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt.bb new file mode 100644 index 0000000..8aa881e --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt.bb @@ -0,0 +1,28 @@ +SUMMARY = "tuxbox libtuxtxt" +LICENSE = "Proprietary" +LIC_FILES_CHKSUM = "file://libtuxtxt/libtuxtxt.c;endline=19;md5=75fd12b0664044ec3b3182337e21e98f" +DEPENDS = "dreambox-dvbincludes libpng freetype" +SRCDATE = "20090130" +PV = "0.0+cvs${SRCDATE}" +PR = "r1" + +SRC_URI = "cvs://anoncvs@cvs.tuxbox.org/cvs/tuxbox;module=apps/tuxbox/libs;method=ext \ + file://acinclude.m4 \ + file://ignorelibs.patch \ + file://32bpp.diff \ + file://resize_framebuffer.diff \ + file://allow_different_demux.diff \ + file://videodev2.patch \ + file://libz.patch \ +" + +S = "${WORKDIR}/libs" + +inherit autotools pkgconfig + +do_configure_prepend() { + install ${WORKDIR}/acinclude.m4 ${S}/acinclude.m4 + sed -i -e s:@LIBTUXBOX_LIBS@::g ${S}/libtuxtxt/tuxbox-tuxtxt.pc.in +} + +CPPFLAGS += "-DHAVE_DREAMBOX_HARDWARE -DDREAMBOX" diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/32bpp.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/32bpp.diff new file mode 100644 index 0000000..3c6c11c --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/32bpp.diff @@ -0,0 +1,738 @@ +diff -Naur libs-org/libtuxtxt/libtuxtxt.c libs/libtuxtxt/libtuxtxt.c +--- libs-org/libtuxtxt/libtuxtxt.c 2010-03-06 10:51:52.000000000 +0100 ++++ libs/libtuxtxt/libtuxtxt.c 2010-03-06 10:55:25.000000000 +0100 +@@ -7,6 +7,15 @@ + * Info entnommen aus videotext-0.6.19991029, * + * Copyright (c) 1994-96 Martin Buck * + * * ++ * ported 2006 to Dreambox 7025 / 32Bit framebuffer * ++ * by Seddi * ++ * * ++ * ported 32Bit framebuffer to Tuxtxt v1.99 (2008) * ++ * by the PLi team (Sat-Turner) * ++ * * ++ * ported to 20090130 * ++ * by the PLi team (pieterg) * ++ * * + ******************************************************************************/ + + #ifdef DEBUG +diff -Naur libs-org/libtuxtxt/tuxtxt_common.h libs/libtuxtxt/tuxtxt_common.h +--- libs-org/libtuxtxt/tuxtxt_common.h 2010-03-06 10:51:52.000000000 +0100 ++++ libs/libtuxtxt/tuxtxt_common.h 2010-03-06 10:56:26.000000000 +0100 +@@ -627,6 +627,19 @@ + aG3_70, aG3_71, aG3_72, aG3_73, aG3_74, aG3_75, aG3_76, aG3_77, aG3_78, aG3_79, aG3_7a, aG3_7b, aG3_7c, aG3_7d, aG3_7e + }; + ++/* 32bit colortable */ ++unsigned char bgra[][4] = { ++"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", ++"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", ++"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", ++"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", ++"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", ++"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", ++"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", ++"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xFF", ++"\0\0\0\xFF", "\0\0\0\xFF", "\0\0\0\xC0", "\0\0\0\x00", ++"\0\0\0\x33" }; ++ + tuxtxt_cache_struct tuxtxt_cache; + static pthread_mutex_t tuxtxt_cache_lock = PTHREAD_MUTEX_INITIALIZER; + int tuxtxt_get_zipsize(int p,int sp) +@@ -3294,14 +3307,21 @@ + void tuxtxt_FillRect(unsigned char *lfb, int xres, int x, int y, int w, int h, int color) + { + if (!lfb) return; +- unsigned char *p = lfb + x + y * xres; ++ unsigned char *p = lfb + x*4 + y * xres; ++ unsigned char linebuf[w*4]; ++ int xtmp; + + if (w > 0) ++ { ++ for (xtmp=0; xtmp 0 ; h--) + { +- memset(p, color, w); ++ memcpy(p,linebuf,w*4); + p += xres; + } ++ } + } + + void tuxtxt_RenderDRCS(int xres, +@@ -3311,7 +3331,7 @@ + unsigned char fgcolor, unsigned char bgcolor) + { + if (d == NULL) return; +- int bit, x, y; ++ int bit, x, y, ltmp; + unsigned char *ay = ax + 13; /* array[0..10] of y-offsets for each pixel */ + + for (y = 0; y < 10; y++) /* 10*2 bytes a 6 pixels per char definition */ +@@ -3335,9 +3355,21 @@ + for (i = 0; i < h; i++) + { + if (ax[x+1] > ax[x]) +- memset(d + ax[x], f1, ax[x+1] - ax[x]); ++ { ++// memset(d + ax[x], f1, ax[x+1] - ax[x]); ++ for (ltmp=0 ; ltmp < (ax[x+1]-ax[x]); ltmp++) ++ { ++ memcpy(d + ax[x]*4 +ltmp*4,bgra[f1],4); ++ } ++ } + if (ax[x+7] > ax[x+6]) +- memset(d + ax[x+6], f2, ax[x+7] - ax[x+6]); /* 2nd byte 6 pixels to the right */ ++ { ++// memset(d + ax[x+6], f2, ax[x+7] - ax[x+6]); /* 2nd byte 6 pixels to the right */ ++ for (ltmp=0 ; ltmp < (ax[x+7]-ax[x+6]); ltmp++) ++ { ++ memcpy(d + ax[x+6]*4 +ltmp*4,bgra[f2],4); ++ } ++ } + d += xres; + } + d -= h * xres; +@@ -3350,20 +3382,26 @@ + void tuxtxt_DrawVLine(unsigned char *lfb, int xres, int x, int y, int l, int color) + { + if (!lfb) return; +- unsigned char *p = lfb + x + y * xres; ++ unsigned char *p = lfb + 4*x + y * xres; + + for ( ; l > 0 ; l--) + { +- *p = color; ++ memcpy(p,bgra[color],4); + p += xres; + } + } + + void tuxtxt_DrawHLine(unsigned char* lfb,int xres,int x, int y, int l, int color) + { ++ int ltmp; + if (!lfb) return; + if (l > 0) +- memset(lfb + x + y * xres, color, l); ++ { ++ for (ltmp=0; ltmp < l; ltmp++) ++ { ++ memcpy(lfb + x*4 + ltmp*4 + y * xres, bgra[color], 4); ++ } ++ } + } + + void tuxtxt_FillRectMosaicSeparated(unsigned char *lfb, int xres,int x, int y, int w, int h, int fgcolor, int bgcolor, int set) +@@ -3378,48 +3416,54 @@ + + void tuxtxt_FillTrapez(unsigned char *lfb, int xres,int x0, int y0, int l0, int xoffset1, int h, int l1, int color) + { +- unsigned char *p = lfb + x0 + y0 * xres; ++ unsigned char *p = lfb + x0*4 + y0 * xres; + int xoffset, l; + int yoffset; ++ int ltmp; + + for (yoffset = 0; yoffset < h; yoffset++) + { + l = l0 + ((l1-l0) * yoffset + h/2) / h; + xoffset = (xoffset1 * yoffset + h/2) / h; + if (l > 0) +- memset(p + xoffset, color, l); ++ { ++ for (ltmp=0; ltmp < l; ltmp++) ++ { ++ memcpy(p + xoffset*4 +ltmp*4, bgra[color], 4); ++ } ++ } + p += xres; + } + } + void tuxtxt_FlipHorz(unsigned char *lfb, int xres,int x, int y, int w, int h) + { +- unsigned char buf[w]; +- unsigned char *p = lfb + x + y * xres; ++ unsigned char buf[w*4]; ++ unsigned char *p = lfb + x*4 + y * xres; + int w1,h1; + + for (h1 = 0 ; h1 < h ; h1++) + { +- memcpy(buf,p,w); ++ memcpy(buf,p,w*4); + for (w1 = 0 ; w1 < w ; w1++) + { +- *(p+w1) = buf[w-(w1+1)]; ++ memcpy(p+w1*4,buf+((w-w1)*4)-4,4); + } + p += xres; + } + } + void tuxtxt_FlipVert(unsigned char *lfb, int xres,int x, int y, int w, int h) + { +- unsigned char buf[w]; +- unsigned char *p = lfb + x + y * xres, *p1, *p2; ++ unsigned char buf[w*4]; ++ unsigned char *p = lfb + x*4 + y * xres, *p1, *p2; + int h1; + + for (h1 = 0 ; h1 < h/2 ; h1++) + { + p1 = (p+(h1*xres)); + p2 = (p+(h-(h1+1))*xres); +- memcpy(buf,p1,w); +- memcpy(p1,p2,w); +- memcpy(p2,buf,w); ++ memcpy(buf,p1,w*4); ++ memcpy(p1,p2,w*4); ++ memcpy(p2,buf,w*4); + } + } + +@@ -3683,7 +3727,7 @@ + if (lfb) + { + int x,y,f,c; +- unsigned char* p = lfb + *pPosX + PosY* xres; ++ unsigned char* p = lfb + (*pPosX)*4 + PosY* xres; + for (y=0; yvar_screeninfo.yres-renderinfo->var_screeninfo.yoffset; +- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,0 , ys ,renderinfo->StartX ,renderinfo->var_screeninfo.yres ,color); +- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->StartX, ys ,renderinfo->displaywidth,renderinfo->StartY ,color); +- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->StartX, ys+renderinfo->StartY+25*renderinfo->fontheight,renderinfo->displaywidth,renderinfo->var_screeninfo.yres-(renderinfo->StartY+25*renderinfo->fontheight),color); ++ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,0 , ys ,renderinfo->StartX ,renderinfo->var_screeninfo.yres ,color); ++ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->StartX, ys ,renderinfo->displaywidth,renderinfo->StartY ,color); ++ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->StartX, ys+renderinfo->StartY+25*renderinfo->fontheight,renderinfo->displaywidth,renderinfo->var_screeninfo.yres-(renderinfo->StartY+25*renderinfo->fontheight),color); + + if (renderinfo->screenmode == 0 ) +- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->StartX+renderinfo->displaywidth, ys,renderinfo->var_screeninfo.xres-(renderinfo->StartX+renderinfo->displaywidth),renderinfo->var_screeninfo.yres ,color); ++ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->StartX+renderinfo->displaywidth, ys,renderinfo->var_screeninfo.xres-(renderinfo->StartX+renderinfo->displaywidth),renderinfo->var_screeninfo.yres ,color); + } + + +@@ -4037,12 +4081,12 @@ + } + void tuxtxt_ClearBB(tstRenderInfo* renderinfo,int color) + { +- memset(renderinfo->lfb + (renderinfo->var_screeninfo.yres-renderinfo->var_screeninfo.yoffset )*renderinfo->var_screeninfo.xres, color, renderinfo->var_screeninfo.xres*renderinfo->var_screeninfo.yres); ++ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,0, renderinfo->var_screeninfo.yres - renderinfo->var_screeninfo.yoffset, renderinfo->var_screeninfo.xres, renderinfo->var_screeninfo.yres, color); + } + + void tuxtxt_ClearFB(tstRenderInfo* renderinfo,int color) + { +- memset(renderinfo->lfb + renderinfo->var_screeninfo.xres*renderinfo->var_screeninfo.yoffset, color, renderinfo->var_screeninfo.xres*renderinfo->var_screeninfo.yres); ++ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,0, renderinfo->var_screeninfo.yoffset, renderinfo->var_screeninfo.xres, renderinfo->var_screeninfo.yres, color); + } + + int tuxtxt_GetCurFontWidth(tstRenderInfo* renderinfo) +@@ -4079,7 +4123,7 @@ + renderinfo->PosX += t; + int curfontwidth2 = tuxtxt_GetCurFontWidth(renderinfo); + renderinfo->PosX -= t; +- int alphachar = tuxtxt_RenderChar(renderinfo->lfb+(yoffset+renderinfo->StartY)*renderinfo->var_screeninfo.xres, renderinfo->var_screeninfo.xres,Char, &renderinfo->PosX, renderinfo->PosY-renderinfo->StartY, Attribute, zoom, curfontwidth, curfontwidth2, renderinfo->fontheight, renderinfo->transpmode,renderinfo->axdrcs, renderinfo->ascender); ++ int alphachar = tuxtxt_RenderChar(renderinfo->lfb+(yoffset+renderinfo->StartY)*renderinfo->fix_screeninfo.line_length, renderinfo->fix_screeninfo.line_length, Char, &renderinfo->PosX, renderinfo->PosY-renderinfo->StartY, Attribute, zoom, curfontwidth, curfontwidth2, renderinfo->fontheight, renderinfo->transpmode,renderinfo->axdrcs, renderinfo->ascender); + if (alphachar <= 0) return; + + if (zoom && Attribute->doubleh) +@@ -4112,7 +4156,7 @@ + #if TUXTXT_DEBUG + printf("TuxTxt lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY + yoffset, curfontwidth, factor*renderinfo->fontheight, bgcolor); ++ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY + yoffset, curfontwidth, factor*renderinfo->fontheight, bgcolor); + renderinfo->PosX += curfontwidth; + return; + } +@@ -4127,7 +4171,7 @@ + printf("TuxTxt c%x a%x g%x w%d h%d x%d y%d\n", + error, alphachar, Attribute, glyph, curfontwidth, renderinfo->fontheight, renderinfo->PosX, renderinfo->PosY); + #endif +- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY + yoffset, curfontwidth, renderinfo->fontheight, bgcolor); ++ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY + yoffset, curfontwidth, renderinfo->fontheight, bgcolor); + renderinfo->PosX += curfontwidth; + return; + } +@@ -4188,13 +4232,13 @@ + Row = 0; + } + else +- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY + yoffset, curfontwidth, Row, bgcolor); /* fill upper margin */ ++ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY + yoffset, curfontwidth, Row, bgcolor); /* fill upper margin */ + + if (renderinfo->ascender - renderinfo->sbit->top + renderinfo->TTFShiftY + he > renderinfo->fontheight) + he = renderinfo->fontheight - renderinfo->ascender + renderinfo->sbit->top - renderinfo->TTFShiftY; /* limit char height to defined/calculated fontheight */ + if (he < 0) he = renderinfo->fontheight; + +- p = renderinfo->lfb + renderinfo->PosX + (yoffset + renderinfo->PosY + Row) * renderinfo->var_screeninfo.xres; /* running pointer into framebuffer */ ++ p = renderinfo->lfb + renderinfo->PosX*4 + (yoffset + renderinfo->PosY + Row) * renderinfo->fix_screeninfo.line_length; /* running pointer into framebuffer */ + for (Row = he; Row; Row--) /* row counts up, but down may be a little faster :) */ + { + int pixtodo = (renderinfo->usettf ? renderinfo->sbit->width : curfontwidth); +@@ -4203,8 +4247,8 @@ + for (Bit = xfactor * (renderinfo->sbit->left + renderinfo->TTFShiftX); Bit > 0; Bit--) /* fill left margin */ + { + for (f = factor-1; f >= 0; f--) +- *(p + f*renderinfo->var_screeninfo.xres) = bgcolor; +- p++; ++ memcpy((p + f*renderinfo->fix_screeninfo.line_length),bgra[bgcolor],4);/*bgcolor*/ ++ p+=4; + if (!renderinfo->usettf) + pixtodo--; + } +@@ -4224,14 +4268,14 @@ + color = bgcolor; + + for (f = factor-1; f >= 0; f--) +- *(p + f*renderinfo->var_screeninfo.xres) = color; +- p++; ++ memcpy((p + f*renderinfo->fix_screeninfo.line_length),bgra[color],4); ++ p+=4; + + if (xfactor > 1) /* double width */ + { + for (f = factor-1; f >= 0; f--) +- *(p + f*renderinfo->var_screeninfo.xres) = color; +- p++; ++ memcpy((p + f*renderinfo->fix_screeninfo.line_length),bgra[color],4); ++ p+=4; + if (!renderinfo->usettf) + pixtodo--; + } +@@ -4242,17 +4286,17 @@ + Bit > 0; Bit--) /* fill rest of char width */ + { + for (f = factor-1; f >= 0; f--) +- *(p + f*renderinfo->var_screeninfo.xres) = bgcolor; +- p++; ++ memcpy((p + f*renderinfo->fix_screeninfo.line_length),bgra[bgcolor],4); ++ p+=4; + } + +- p = pstart + factor*renderinfo->var_screeninfo.xres; ++ p = pstart + factor*renderinfo->fix_screeninfo.line_length; + } + + Row = renderinfo->ascender - renderinfo->sbit->top + he + renderinfo->TTFShiftY; +- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY + yoffset + Row*factor, curfontwidth, (renderinfo->fontheight - Row) * factor, bgcolor); /* fill lower margin */ ++ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY + yoffset + Row*factor, curfontwidth, (renderinfo->fontheight - Row) * factor, bgcolor); /* fill lower margin */ + if (Attribute->underline) +- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY + yoffset + (renderinfo->fontheight-2)* factor, curfontwidth,2*factor, fgcolor); /* underline char */ ++ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY + yoffset + (renderinfo->fontheight-2)* factor, curfontwidth,2*factor, fgcolor); /* underline char */ + + renderinfo->PosX += curfontwidth; + renderinfo->TTFShiftY = backupTTFshiftY; // restore TTFShiftY +@@ -4300,9 +4344,8 @@ + + void tuxtxt_SwitchScreenMode(tstRenderInfo* renderinfo,int newscreenmode) + { +-#if HAVE_DVB_API_VERSION >= 3 + struct v4l2_format format; +-#endif ++ + /* reset transparency mode */ + if (renderinfo->transpmode) + renderinfo->transpmode = 0; +@@ -4370,42 +4413,53 @@ + + tuxtxt_setfontwidth(renderinfo,fw); + +-#if HAVE_DVB_API_VERSION < 3 +- avia_pig_hide(renderinfo->pig); +- avia_pig_set_pos(renderinfo->pig, tx, ty); +- avia_pig_set_size(renderinfo->pig, tw, th); +- avia_pig_set_stack(renderinfo->pig, 2); +- avia_pig_show(renderinfo->pig); +-#else +- int sm = 0; +- ioctl(renderinfo->pig, VIDIOC_OVERLAY, &sm); +- sm = 1; +- ioctl(renderinfo->pig, VIDIOC_G_FMT, &format); +- format.type = V4L2_BUF_TYPE_VIDEO_OVERLAY; +- format.fmt.win.w.left = tx; +- format.fmt.win.w.top = ty; +- format.fmt.win.w.width = tw; +- format.fmt.win.w.height = th; +- ioctl(renderinfo->pig, VIDIOC_S_FMT, &format); +- ioctl(renderinfo->pig, VIDIOC_OVERLAY, &sm); +-#endif +- ioctl(renderinfo->avs, AVSIOSSCARTPIN8, &fncmodes[renderinfo->screen_mode2]); +- ioctl(renderinfo->saa, SAAIOSWSS, &saamodes[renderinfo->screen_mode2]); ++ // Video picture scale/pos for e2 ++ int i; ++ for (i=0; i<4; ++i) ++ { ++ char *targets[]={"left", "top", "width", "height"}; ++ char filename[128]; ++ snprintf(filename, 128, "/proc/stb/vmpeg/%d/dst_%s", 0, targets[i]); ++ FILE *f = fopen(filename, "w"); ++ if (!f) ++ break; ++ int val = 0; ++ switch (i) ++ { ++ case 0: val = tx; break; ++ case 1: val = ty; break; ++ case 2: val = tw; break; ++ case 3: val = th; break; ++ } ++ fprintf(f, "%08x\n", val); ++ fclose(f); ++ } ++ ++ writeproc("/proc/stb/avs/0/sb", fncmodes[renderinfo->screen_mode2]); ++ writeproc("/proc/stb/denc/0/wss", saamodes[renderinfo->screen_mode2]); + } + else /* not split */ + { +-#if HAVE_DVB_API_VERSION < 3 +- avia_pig_hide(renderinfo->pig); +-#else +- ioctl(renderinfo->pig, VIDIOC_OVERLAY, &renderinfo->screenmode); +-#endif ++ // Video picture scale/pos for e2 ++ int i; ++ for (i=0; i<4; ++i) ++ { ++ char *targets[]={"left", "top", "width", "height"}; ++ char filename[128]; ++ snprintf(filename, 128, "/proc/stb/vmpeg/%d/dst_%s", 0, targets[i]); ++ FILE *f = fopen(filename, "w"); ++ if (!f) ++ break; ++ fprintf(f, "%08x\n", 0); ++ fclose(f); ++ } + + tuxtxt_setfontwidth(renderinfo,renderinfo->fontwidth_normal); + renderinfo->displaywidth= (renderinfo->ex-renderinfo->sx); + renderinfo->StartX = renderinfo->sx; //+ (ex-sx - 40*fontwidth) / 2; /* center screen */ + +- ioctl(renderinfo->avs, AVSIOSSCARTPIN8, &fncmodes[renderinfo->screen_mode1]); +- ioctl(renderinfo->saa, SAAIOSWSS, &saamodes[renderinfo->screen_mode1]); ++ writeproc("/proc/stb/avs/0/sb", fncmodes[renderinfo->screen_mode1]); ++ writeproc("/proc/stb/denc/0/wss", saamodes[renderinfo->screen_mode1]); + } + } + +@@ -4431,7 +4485,7 @@ + if (renderinfo->boxed) + { + renderinfo->PosX = renderinfo->StartX + column*width; +- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY+yoffset, renderinfo->displaywidth, renderinfo->fontheight, tuxtxt_color_transp); ++ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY+yoffset, renderinfo->displaywidth, renderinfo->fontheight, tuxtxt_color_transp); + return; + } + +@@ -4442,7 +4496,7 @@ + + if (l > 9) /* smaller font, if no space for one half space at front and end */ + tuxtxt_setfontwidth(renderinfo,oldfontwidth * 10 / (l+1)); +- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY+yoffset, width+(renderinfo->displaywidth%4), renderinfo->fontheight, tuxtxt_atrtable[ATR_L250 + column].bg); ++ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY+yoffset, width+(renderinfo->displaywidth%4), renderinfo->fontheight, tuxtxt_atrtable[ATR_L250 + column].bg); + renderinfo->PosX += ((width) - (l*renderinfo->fontwidth+l*renderinfo->fontwidth/abx))/2; /* center */ + for (p = tuxtxt_cache.adip[linkpage]; *p; p++) + tuxtxt_RenderCharBB(renderinfo,*p, &tuxtxt_atrtable[ATR_L250 + column]); +@@ -4451,7 +4505,7 @@ + else /* display number */ + { + renderinfo->PosX = renderinfo->StartX + column*width; +- tuxtxt_FillRect(renderinfo->lfb,renderinfo->var_screeninfo.xres,renderinfo->PosX, renderinfo->PosY+yoffset, renderinfo->displaywidth+renderinfo->sx-renderinfo->PosX, renderinfo->fontheight, tuxtxt_atrtable[ATR_L250 + column].bg); ++ tuxtxt_FillRect(renderinfo->lfb,renderinfo->fix_screeninfo.line_length,renderinfo->PosX, renderinfo->PosY+yoffset, renderinfo->displaywidth+renderinfo->sx-renderinfo->PosX, renderinfo->fontheight, tuxtxt_atrtable[ATR_L250 + column].bg); + if (linkpage < tuxtxt_cache.page) + { + line[6] = '<'; +@@ -4620,7 +4674,7 @@ + void tuxtxt_CopyBB2FB(tstRenderInfo* renderinfo) + { + unsigned char *src, *dst, *topsrc; +- int fillcolor, i, screenwidth; ++ int fillcolor, i, screenwidth, swtmp; + + /* line 25 */ + if (!renderinfo->pagecatching) +@@ -4636,8 +4690,8 @@ + if (ioctl(renderinfo->fb, FBIOPAN_DISPLAY, &renderinfo->var_screeninfo) == -1) + perror("TuxTxt "); + +- if (renderinfo->StartX > 0 && *renderinfo->lfb != *(renderinfo->lfb + renderinfo->var_screeninfo.xres * renderinfo->var_screeninfo.yres)) /* adapt background of backbuffer if changed */ +- tuxtxt_FillBorder(renderinfo,*(renderinfo->lfb + renderinfo->var_screeninfo.xres * renderinfo->var_screeninfo.yoffset)); ++ if (renderinfo->StartX > 0 && *renderinfo->lfb != *(renderinfo->lfb + renderinfo->fix_screeninfo.line_length * renderinfo->var_screeninfo.yres)) /* adapt background of backbuffer if changed */ ++ tuxtxt_FillBorder(renderinfo,*(renderinfo->lfb + renderinfo->fix_screeninfo.line_length * renderinfo->var_screeninfo.yoffset)); + // ClearBB(*(lfb + renderinfo->var_screeninfo.xres * renderinfo->var_screeninfo.yoffset)); + + if (renderinfo->clearbbcolor >= 0) +@@ -4648,18 +4702,18 @@ + return; + } + +- src = dst = topsrc = renderinfo->lfb + renderinfo->StartY*renderinfo->var_screeninfo.xres; ++ src = dst = topsrc = renderinfo->lfb + renderinfo->StartY*renderinfo->fix_screeninfo.line_length; + + + if (renderinfo->var_screeninfo.yoffset) +- dst += renderinfo->var_screeninfo.xres * renderinfo->var_screeninfo.yres; ++ dst += renderinfo->fix_screeninfo.line_length * renderinfo->var_screeninfo.yres; + else + { +- src += renderinfo->var_screeninfo.xres * renderinfo->var_screeninfo.yres; +- topsrc += renderinfo->var_screeninfo.xres * renderinfo->var_screeninfo.yres; ++ src += renderinfo->fix_screeninfo.line_length * renderinfo->var_screeninfo.yres; ++ topsrc += renderinfo->fix_screeninfo.line_length * renderinfo->var_screeninfo.yres; + } + if (!renderinfo->pagecatching ) +- memcpy(dst+(24*renderinfo->fontheight)*renderinfo->var_screeninfo.xres, src + (24*renderinfo->fontheight)*renderinfo->var_screeninfo.xres, renderinfo->var_screeninfo.xres*renderinfo->fontheight); /* copy line25 in normal height */ ++ memcpy(dst+(24*renderinfo->fontheight)*renderinfo->fix_screeninfo.line_length, src + (24*renderinfo->fontheight)*renderinfo->fix_screeninfo.line_length, renderinfo->fix_screeninfo.line_length*renderinfo->fontheight); /* copy line25 in normal height */ + + if (renderinfo->transpmode) + fillcolor = tuxtxt_color_transp; +@@ -4667,94 +4721,81 @@ + fillcolor = tuxtxt_cache.FullScrColor; + + if (renderinfo->zoommode == 2) +- src += 12*renderinfo->fontheight*renderinfo->var_screeninfo.xres; ++ src += 12*renderinfo->fontheight*renderinfo->fix_screeninfo.line_length; + + if (renderinfo->screenmode == 1) /* copy topmenu in normal height (since PIG also keeps dimensions) */ + { + unsigned char *topdst = dst; + +- screenwidth = TV43STARTX; ++ screenwidth = (TV43STARTX) * 4; + + topsrc += screenwidth; + topdst += screenwidth; + for (i=0; i < 24*renderinfo->fontheight; i++) + { + memcpy(topdst, topsrc,renderinfo->ex-screenwidth); +- topdst += renderinfo->var_screeninfo.xres; +- topsrc += renderinfo->var_screeninfo.xres; ++ topdst += renderinfo->fix_screeninfo.line_length; ++ topsrc += renderinfo->fix_screeninfo.line_length; + } + } + else if (renderinfo->screenmode == 2) +- screenwidth = TV169FULLSTARTX; ++ screenwidth = (TV169FULLSTARTX) * 4; + else +- screenwidth = renderinfo->var_screeninfo.xres; ++ screenwidth = renderinfo->fix_screeninfo.line_length; + + for (i = renderinfo->StartY; i>0;i--) + { +- memset(dst - i*renderinfo->var_screeninfo.xres, fillcolor, screenwidth); ++ for (swtmp=0; swtmpfix_screeninfo.line_length+swtmp*4, bgra[fillcolor], 4); ++ } + } + + for (i = 12*renderinfo->fontheight; i; i--) + { + memcpy(dst, src, screenwidth); +- dst += renderinfo->var_screeninfo.xres; ++ dst += renderinfo->fix_screeninfo.line_length; + memcpy(dst, src, screenwidth); +- dst += renderinfo->var_screeninfo.xres; +- src += renderinfo->var_screeninfo.xres; ++ dst += renderinfo->fix_screeninfo.line_length; ++ src += renderinfo->fix_screeninfo.line_length; + } + + // if (!pagecatching ) + // memcpy(dst, lfb + (StartY+24*fontheight)*renderinfo->var_screeninfo.xres, renderinfo->var_screeninfo.xres*fontheight); /* copy line25 in normal height */ +- for (i = renderinfo->var_screeninfo.yres - renderinfo->StartY - 25*renderinfo->fontheight; i >= 0;i--) +- { +- memset(dst + renderinfo->var_screeninfo.xres*(renderinfo->fontheight+i), fillcolor, screenwidth); +- } ++ dst -= renderinfo->fix_screeninfo.line_length; ++ ++ unsigned char linebuf[screenwidth]; ++ for (swtmp=0; swtmp < screenwidth/4;swtmp++) ++ memcpy(linebuf+swtmp*4, bgra[fillcolor], 4); ++ for (i = renderinfo->var_screeninfo.yres - renderinfo->StartY - 25 * renderinfo->fontheight; i >= 0;i--) ++ memcpy(dst + renderinfo->fix_screeninfo.line_length*(renderinfo->fontheight+i), linebuf, screenwidth); + } + + void tuxtxt_setcolors(tstRenderInfo* renderinfo,unsigned short *pcolormap, int offset, int number) + { +- struct fb_cmap colormap_0 = {0, tuxtxt_color_SIZECOLTABLE, renderinfo->rd0, renderinfo->gn0, renderinfo->bl0, renderinfo->tr0}; +- int i, changed=0; ++ int i,trans_tmp; + int j = offset; /* index in global color table */ + +- unsigned short t = renderinfo->tr0[tuxtxt_color_transp2]; +- renderinfo->tr0[tuxtxt_color_transp2] = (renderinfo->trans_mode+7)<<11 | 0x7FF; +-#ifndef HAVE_DREAMBOX_HARDWARE +- /* "correct" semi-transparent for Nokia (GTX only allows 2(?) levels of transparency) */ +- if (tuxbox_get_vendor() == TUXBOX_VENDOR_NOKIA) +- renderinfo->tr0[tuxtxt_color_transp2] = 0xFFFF; +-#endif +- if (t != renderinfo->tr0[tuxtxt_color_transp2]) changed = 1; ++ trans_tmp=25-renderinfo->trans_mode; ++ ++ bgra[tuxtxt_color_transp2][3]=((trans_tmp+7)<<11 | 0x7FF)>>8; ++ + for (i = 0; i < number; i++) + { +- int r = (pcolormap[i] << 12) & 0xf000; +- int g = (pcolormap[i] << 8) & 0xf000; +- int b = (pcolormap[i] << 4) & 0xf000; +- ++ int r = (pcolormap[i] << 12 & 0xF000) >> 8; ++ int g = (pcolormap[i] << 8 & 0xF000) >> 8; ++ int b = (pcolormap[i] << 4 & 0xF000) >> 8; + + r = (r * (0x3f+(renderinfo->color_mode<<3))) >> 8; + g = (g * (0x3f+(renderinfo->color_mode<<3))) >> 8; + b = (b * (0x3f+(renderinfo->color_mode<<3))) >> 8; +- if (renderinfo->rd0[j] != r) +- { +- renderinfo->rd0[j] = r; +- changed = 1; +- } +- if (renderinfo->gn0[j] != g) +- { +- renderinfo->gn0[j] = g; +- changed = 1; +- } +- if (renderinfo->bl0[j] != b) +- { +- renderinfo->bl0[j] = b; +- changed = 1; +- } ++ ++ bgra[j][2]=r; ++ bgra[j][1]=g; ++ bgra[j][0]=b; ++ + j++; + } +- if (changed) +- if (ioctl(renderinfo->fb, FBIOPUTCMAP, &colormap_0) == -1) +- perror("TuxTxt "); + } + + /****************************************************************************** +@@ -4968,11 +5009,11 @@ + + for (row = 0; row < DRCSROWS; row++) + for (col = 0; col < DRCSCOLS; col++) +- tuxtxt_RenderDRCS(renderinfo->var_screeninfo.xres, ++ tuxtxt_RenderDRCS(renderinfo->fix_screeninfo.line_length, + renderinfo->page_char + 20 * (DRCSCOLS * row + col + 2), + renderinfo->lfb +- + (renderinfo->StartY + renderinfo->fontheight + DRCSYSPC * row + renderinfo->var_screeninfo.yres - renderinfo->var_screeninfo.yoffset) * renderinfo->var_screeninfo.xres +- + renderinfo->StartX + DRCSXSPC * col, ++ + (renderinfo->StartY + renderinfo->fontheight + DRCSYSPC * row + renderinfo->var_screeninfo.yres - renderinfo->var_screeninfo.yoffset) * renderinfo->fix_screeninfo.line_length ++ + (renderinfo->StartX + DRCSXSPC * col)*4, + ax, tuxtxt_color_white, tuxtxt_color_black); + + memset(renderinfo->page_char + 40, 0xff, 24*40); /* don't render any char below row 0 */ +@@ -5062,13 +5103,13 @@ + renderinfo->pageinfo = p; + renderinfo->boxed = p->boxed; + } ++ if (tuxtxt_cache.colortable) /* as late as possible to shorten the time the old page is displayed with the new colors */ ++ tuxtxt_setcolors(renderinfo,tuxtxt_cache.colortable, 16, 16); /* set colors for CLUTs 2+3 */ + if (renderinfo->boxed || renderinfo->transpmode) + // tuxtxt_cache.FullScrColor = tuxtxt_color_transp; + tuxtxt_FillBorder(renderinfo,tuxtxt_color_transp); + else + tuxtxt_FillBorder(renderinfo,tuxtxt_cache.FullScrColor); +- if (tuxtxt_cache.colortable) /* as late as possible to shorten the time the old page is displayed with the new colors */ +- tuxtxt_setcolors(renderinfo,tuxtxt_cache.colortable, 16, 16); /* set colors for CLUTs 2+3 */ + } + else + startrow = 1; +@@ -5408,39 +5449,6 @@ + renderinfo->page_atrb[i].doublew = 0; + renderinfo->page_atrb[i].IgnoreAtBlackBgSubst = 0; + } +- if (setTVFormat) +- { +- /* open avs */ +- if ((renderinfo->avs = open(AVS, O_RDWR)) == -1) +- { +- perror("TuxTxt "); +- FTC_Manager_Done(renderinfo->manager); +- FT_Done_FreeType(renderinfo->library); +- return 0; +- } +- +- ioctl(renderinfo->avs, AVSIOGSCARTPIN8, &renderinfo->fnc_old); +- ioctl(renderinfo->avs, AVSIOSSCARTPIN8, &fncmodes[renderinfo->screen_mode1]); +- /* open saa */ +- if ((renderinfo->saa = open(SAA, O_RDWR)) == -1) +- { +- perror("TuxTxt "); +- FTC_Manager_Done(renderinfo->manager); +- FT_Done_FreeType(renderinfo->library); +- return 0; +- } +- +- ioctl(renderinfo->saa, SAAIOGWSS, &renderinfo->saa_old); +- ioctl(renderinfo->saa, SAAIOSWSS, &saamodes[renderinfo->screen_mode1]); +- } +- /* open pig */ +- if ((renderinfo->pig = open(PIG, O_RDWR)) == -1) +- { +- perror("TuxTxt "); +- FTC_Manager_Done(renderinfo->manager); +- FT_Done_FreeType(renderinfo->library); +- return 0; +- } + return 1; + } + /****************************************************************************** +@@ -5489,7 +5497,7 @@ + FT_Done_FreeType(renderinfo->library); + renderinfo->manager = 0; + renderinfo->library = 0; +- tuxtxt_ClearFB(renderinfo,renderinfo->previousbackcolor); ++ memset(renderinfo->lfb, 0, renderinfo->fix_screeninfo.smem_len); + /* unmap framebuffer */ + munmap(renderinfo->lfb, renderinfo->fix_screeninfo.smem_len); + printf("[TTX] Rendering ended\n"); +diff -Naur libs-org/libtuxtxt/tuxtxt_def.h libs/libtuxtxt/tuxtxt_def.h +--- libs-org/libtuxtxt/tuxtxt_def.h 2010-03-06 10:51:52.000000000 +0100 ++++ libs/libtuxtxt/tuxtxt_def.h 2010-03-06 10:55:25.000000000 +0100 +@@ -72,8 +72,10 @@ + #define hold_mosaic 0x1E + #define release_mosaic 0x1F + +-const int fncmodes[] = {AVS_FNCOUT_EXT43, AVS_FNCOUT_EXT169}; +-const int saamodes[] = {SAA_WSS_43F, SAA_WSS_169F}; ++extern unsigned char bgra[][4]; ++ ++const char * fncmodes[] = {"12", "6"}; ++const char * saamodes[] = {"4:3_full_format", "16:9_full_format"}; + + typedef enum /* object type */ + { diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/acinclude.m4 b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/acinclude.m4 new file mode 100644 index 0000000..3c26669 --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/acinclude.m4 @@ -0,0 +1,385 @@ +AC_DEFUN(TUXBOX_APPS,[ +AM_CONFIG_HEADER(config.h) +AM_MAINTAINER_MODE + +INSTALL="$INSTALL -p" + +AC_GNU_SOURCE +AC_SYS_LARGEFILE + +AC_ARG_WITH(target, + [ --with-target=TARGET target for compilation [[native,cdk]]], + [TARGET="$withval"],[TARGET="native"]) + +AC_ARG_WITH(targetprefix, + [ --with-targetprefix=PATH prefix relative to target root (only applicable in cdk mode)], + [targetprefix="$withval"],[targetprefix="NONE"]) + +AC_ARG_WITH(debug, + [ --without-debug disable debugging code], + [DEBUG="$withval"],[DEBUG="yes"]) + +if test "$DEBUG" = "yes"; then + DEBUG_CFLAGS="-g3 -ggdb" + AC_DEFINE(DEBUG,1,[Enable debug messages]) +fi + +AC_MSG_CHECKING(target) + +if test "$TARGET" = "native"; then + AC_MSG_RESULT(native) + + if test "$CFLAGS" = "" -a "$CXXFLAGS" = ""; then + CFLAGS="-Wall -O2 -pipe $DEBUG_CFLAGS" + CXXFLAGS="-Wall -O2 -pipe $DEBUG_CFLAGS" + fi + if test "$prefix" = "NONE"; then + prefix=/usr/local + fi + targetprefix=$prefix +elif test "$TARGET" = "cdk"; then + AC_MSG_RESULT(cdk) + + if test "$CC" = "" -a "$CXX" = ""; then + CC=powerpc-tuxbox-linux-gnu-gcc CXX=powerpc-tuxbox-linux-gnu-g++ + fi + if test "$CFLAGS" = "" -a "$CXXFLAGS" = ""; then + CFLAGS="-Wall -Os -mcpu=823 -pipe $DEBUG_CFLAGS" + CXXFLAGS="-Wall -Os -mcpu=823 -pipe $DEBUG_CFLAGS" + fi + if test "$prefix" = "NONE"; then + AC_MSG_ERROR(invalid prefix, you need to specify one in cdk mode) + fi + if test "$targetprefix" = "NONE"; then + targetprefix="" + fi + if test "$host_alias" = ""; then + cross_compiling=yes + host_alias=powerpc-tuxbox-linux-gnu + fi +else + AC_MSG_RESULT(none) + AC_MSG_ERROR([invalid target $TARGET, choose on from native,cdk]); +fi + +AC_CANONICAL_BUILD +AC_CANONICAL_HOST + +check_path () { + return $(perl -e "if(\"$1\"=~m#^/usr/(local/)?bin#){print \"0\"}else{print \"1\";}") +} + +]) + +AC_DEFUN(TUXBOX_APPS_DIRECTORY_ONE,[ +AC_ARG_WITH($1,[ $6$7 [[PREFIX$4$5]]],[ + _$2=$withval + if test "$TARGET" = "cdk"; then + $2=`eval echo "${targetprefix}$withval"` + else + $2=$withval + fi +],[ + $2="\${$3}$5" + if test "$TARGET" = "cdk"; then + _$2=`eval echo "${target$3}$5"` + else + _$2=`eval echo "${$3}$5"` + fi +]) + +dnl automake <= 1.6 don't support this +dnl AC_SUBST($2) +AC_DEFINE_UNQUOTED($2,"$_$2",$7) +]) + +AC_DEFUN(TUXBOX_APPS_DIRECTORY,[ +AC_REQUIRE([TUXBOX_APPS]) + +if test "$TARGET" = "cdk"; then + datadir="\${prefix}/share" + sysconfdir="\${prefix}/etc" + localstatedir="\${prefix}/var" + libdir="\${prefix}/lib" + targetdatadir="\${targetprefix}/share" + targetsysconfdir="\${targetprefix}/etc" + targetlocalstatedir="\${targetprefix}/var" + targetlibdir="\${targetprefix}/lib" +fi + +TUXBOX_APPS_DIRECTORY_ONE(configdir,CONFIGDIR,sysconfdir,/etc,/tuxbox, + [--with-configdir=PATH ],[where to find the config files]) + +TUXBOX_APPS_DIRECTORY_ONE(datadir,DATADIR,datadir,/share,/tuxbox, + [--with-datadir=PATH ],[where to find data]) + +TUXBOX_APPS_DIRECTORY_ONE(fontdir,FONTDIR,datadir,/share,/fonts, + [--with-fontdir=PATH ],[where to find the fonts]) + +TUXBOX_APPS_DIRECTORY_ONE(gamesdir,GAMESDIR,localstatedir,/etc,/tuxbox/games, + [--with-gamesdir=PATH ],[where games data is stored]) + +TUXBOX_APPS_DIRECTORY_ONE(libdir,LIBDIR,libdir,/lib,/tuxbox, + [--with-libdir=PATH ],[where to find the internal libs]) + +TUXBOX_APPS_DIRECTORY_ONE(plugindir,PLUGINDIR,libdir,/lib,/tuxbox/plugins, + [--with-plugindir=PATH ],[where to find the plugins]) + +TUXBOX_APPS_DIRECTORY_ONE(ucodedir,UCODEDIR,localstatedir,/var,/tuxbox/ucodes, + [--with-ucodedir=PATH ],[where to find the ucodes]) +]) + +dnl automake <= 1.6 needs this specifications +AC_SUBST(CONFIGDIR) +AC_SUBST(DATADIR) +AC_SUBST(FONTDIR) +AC_SUBST(GAMESDIR) +AC_SUBST(LIBDIR) +AC_SUBST(PLUGINDIR) +AC_SUBST(UCODEDIR) +dnl end workaround + +AC_DEFUN(TUXBOX_APPS_ENDIAN,[ +AC_CHECK_HEADERS(endian.h) +AC_C_BIGENDIAN +]) + +AC_DEFUN(TUXBOX_APPS_DRIVER,[ +AC_ARG_WITH(driver, + [ --with-driver=PATH path for driver sources [[NONE]]], + [DRIVER="$withval"],[DRIVER=""]) + +if test "$DRIVER"; then + if test -d "$DRIVER/include"; then + AC_DEFINE(HAVE_DBOX2_DRIVER,1,[Define to 1 if you have the dbox2 driver sources]) + #else + # AC_MSG_ERROR([can't find driver sources]) + fi + + AC_SUBST(DRIVER) + + CPPFLAGS="$CPPFLAGS -I$DRIVER/include" +fi +]) + +AC_DEFUN([TUXBOX_APPS_DVB],[ +AC_ARG_WITH(dvbincludes, + [ --with-dvbincludes=PATH path for dvb includes [[NONE]]], + [DVBINCLUDES="$withval"],[DVBINCLUDES=""]) + +if test "$DVBINCLUDES"; then + CPPFLAGS="$CPPFLAGS -I$DVBINCLUDES" +fi + +AC_CHECK_HEADERS(ost/dmx.h,[ + DVB_API_VERSION=1 + AC_MSG_NOTICE([found dvb version 1]) +]) + +if test -z "$DVB_API_VERSION"; then +AC_CHECK_HEADERS(linux/dvb/version.h,[ + AC_LANG_PREPROC_REQUIRE() + AC_REQUIRE([AC_PROG_EGREP]) + AC_LANG_CONFTEST([AC_LANG_SOURCE([[ +#include +version DVB_API_VERSION + ]])]) + DVB_API_VERSION=`(eval "$ac_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | $EGREP "^version" | sed "s,version\ ,,"` + rm -f conftest* + + AC_MSG_NOTICE([found dvb version $DVB_API_VERSION]) +]) +fi + +if test "$DVB_API_VERSION"; then + AC_DEFINE(HAVE_DVB,1,[Define to 1 if you have the dvb includes]) + AC_DEFINE_UNQUOTED(HAVE_DVB_API_VERSION,$DVB_API_VERSION,[Define to the version of the dvb api]) +else + AC_MSG_ERROR([can't find dvb headers]) +fi +]) + +AC_DEFUN(_TUXBOX_APPS_LIB_CONFIG,[ +AC_PATH_PROG($1_CONFIG,$2,no) +if test "$$1_CONFIG" != "no"; then + if test "$TARGET" = "cdk" && check_path "$$1_CONFIG"; then + AC_MSG_$3([could not find a suitable version of $2]); + else + $1_CFLAGS=$($$1_CONFIG --cflags) + $1_LIBS=$($$1_CONFIG --libs) + fi +fi + +AC_SUBST($1_CFLAGS) +AC_SUBST($1_LIBS) +]) + +AC_DEFUN(TUXBOX_APPS_LIB_CONFIG,[ +_TUXBOX_APPS_LIB_CONFIG($1,$2,ERROR) +if test "$$1_CONFIG" = "no"; then + AC_MSG_ERROR([could not find $2]); +fi +]) + +AC_DEFUN(TUXBOX_APPS_LIB_CONFIG_CHECK,[ +_TUXBOX_APPS_LIB_CONFIG($1,$2,WARN) +]) + +AC_DEFUN(TUXBOX_APPS_PKGCONFIG,[ +AC_PATH_PROG(PKG_CONFIG, pkg-config,no) +if test "$PKG_CONFIG" = "no" ; then + AC_MSG_ERROR([could not find pkg-config]); +fi +]) + +AC_DEFUN(_TUXBOX_APPS_LIB_PKGCONFIG,[ +AC_REQUIRE([TUXBOX_APPS_PKGCONFIG]) +PKG_CHECK_MODULES($1,$2) +AC_SUBST($1_CFLAGS) +AC_SUBST($1_LIBS) +]) + +AC_DEFUN(TUXBOX_APPS_LIB_PKGCONFIG,[ +_TUXBOX_APPS_LIB_PKGCONFIG($1,$2) +if test -z "$$1_CFLAGS" ; then + AC_MSG_ERROR([could not find package $2]); +fi +]) + +AC_DEFUN(TUXBOX_APPS_LIB_PKGCONFIG_CHECK,[ +_TUXBOX_APPS_LIB_PKGCONFIG($1,$2) +]) + +AC_DEFUN(_TUXBOX_APPS_LIB_SYMBOL,[ +AC_CHECK_LIB($2,$3,HAVE_$1="yes",HAVE_$1="no") +if test "$HAVE_$1" = "yes"; then + $1_LIBS=-l$2 +fi + +AC_SUBST($1_LIBS) +]) + +AC_DEFUN(TUXBOX_APPS_LIB_SYMBOL,[ +_TUXBOX_APPS_LIB_SYMBOL($1,$2,$3,ERROR) +if test "$HAVE_$1" = "no"; then + AC_MSG_ERROR([could not find $2]); +fi +]) + +AC_DEFUN(TUXBOX_APPS_LIB_CONFIG_SYMBOL,[ +_TUXBOX_APPS_LIB_SYMBOL($1,$2,$3,WARN) +]) + +AC_DEFUN(TUXBOX_APPS_GETTEXT,[ +AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) +AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + +AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + +AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,[$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1],:) + +AC_MSG_CHECKING([whether NLS is requested]) +AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) +AC_MSG_RESULT($USE_NLS) +AC_SUBST(USE_NLS) + +if test "$USE_NLS" = "yes"; then + AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,[ + AC_TRY_LINK([ + #include + #ifndef __GNU_GETTEXT_SUPPORTED_REVISION + #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) + #endif + extern int _nl_msg_cat_cntr; + extern int *_nl_domain_bindings; + ],[ + bindtextdomain ("", ""); + return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings; + ], gt_cv_func_gnugettext_libc=yes, gt_cv_func_gnugettext_libc=no + )] + ) + + if test "$gt_cv_func_gnugettext_libc" = "yes"; then + AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) + gt_use_preinstalled_gnugettext=yes + else + USE_NLS=no + fi +fi + +if test -f "$srcdir/po/LINGUAS"; then + ALL_LINGUAS=$(sed -e "/^#/d" "$srcdir/po/LINGUAS") +fi + +POFILES= +GMOFILES= +UPDATEPOFILES= +DUMMYPOFILES= +for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" +done +INST_LINGUAS= +if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test -n "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done +fi +CATALOGS= +if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done +fi +AC_SUBST(POFILES) +AC_SUBST(GMOFILES) +AC_SUBST(UPDATEPOFILES) +AC_SUBST(DUMMYPOFILES) +AC_SUBST(CATALOGS) +]) + +dnl backward compatiblity +AC_DEFUN([AC_GNU_SOURCE], +[AH_VERBATIM([_GNU_SOURCE], +[/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif])dnl +AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl +AC_BEFORE([$0], [AC_RUN_IFELSE])dnl +AC_DEFINE([_GNU_SOURCE]) +]) + +AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +]) + diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/allow_different_demux.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/allow_different_demux.diff new file mode 100644 index 0000000..d5aac5b --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/allow_different_demux.diff @@ -0,0 +1,95 @@ +diff -u libs/libtuxtxt_orig/libtuxtxt.c libs/libtuxtxt/libtuxtxt.c +--- libs/libtuxtxt_orig/libtuxtxt.c 2009-01-29 21:21:08.000000000 +0100 ++++ libs/libtuxtxt/libtuxtxt.c 2009-01-29 21:26:49.000000000 +0100 +@@ -65,6 +65,13 @@ + tuxtxt_cache.thread_id = 0; + tuxtxt_cache.dmx = -1; + pthread_mutex_unlock(&tuxtxt_control_lock); ++ ++#if HAVE_DVB_API_VERSION < 3 ++ strcpy(tuxtxt_cache.demux, "/dev/dvb/card0/demux0"); ++#else ++ strcpy(tuxtxt_cache.demux, "/dev/dvb/adapter0/demux0"); ++#endif ++ + return 1;//tuxtxt_init_demuxer(); + } + +@@ -82,7 +89,7 @@ + pthread_mutex_unlock(&tuxtxt_control_lock); + return res; + } +-int tuxtxt_start(int tpid) ++int tuxtxt_start(int tpid, int demux) + { + int ret = 1; + pthread_mutex_lock(&tuxtxt_control_lock); +@@ -92,10 +99,26 @@ + tuxtxt_clear_cache(); + tuxtxt_cache.page = 0x100; + tuxtxt_cache.vtxtpid = tpid; ++ if (demux >= 0) ++ { ++#if HAVE_DVB_API_VERSION < 3 ++ snprintf(tuxtxt_cache.demux, 64, "/dev/dvb/card0/demux%d", demux); ++#else ++ snprintf(tuxtxt_cache.demux, 64, "/dev/dvb/adapter0/demux%d", demux); ++#endif ++ } + ret = tuxtxt_start_thread(); + } + else if (!tuxtxt_cache.thread_starting && !tuxtxt_cache.receiving) + { ++ if (demux >= 0) ++ { ++#if HAVE_DVB_API_VERSION < 3 ++ snprintf(tuxtxt_cache.demux, 64, "/dev/dvb/card0/demux%d", demux); ++#else ++ snprintf(tuxtxt_cache.demux, 64, "/dev/dvb/adapter0/demux%d", demux); ++#endif ++ } + ret = tuxtxt_start_thread(); + } + pthread_mutex_unlock(&tuxtxt_control_lock); +diff -u libs/libtuxtxt_orig/tuxtxt_common.h libs/libtuxtxt/tuxtxt_common.h +--- libs/libtuxtxt_orig/tuxtxt_common.h 2009-01-29 21:24:32.000000000 +0100 ++++ libs/libtuxtxt/tuxtxt_common.h 2009-01-29 21:26:49.000000000 +0100 +@@ -1751,9 +1751,9 @@ + if (tuxtxt_cache.dmx != -1) + { + ioctl(tuxtxt_cache.dmx, DMX_STOP); +-// close(tuxtxt_cache.dmx); +- } +-// tuxtxt_cache.dmx = -1; ++ close(tuxtxt_cache.dmx); ++ } ++ tuxtxt_cache.dmx = -1; + #if 1//DEBUG + printf("TuxTxt stopped service %x\n", tuxtxt_cache.vtxtpid); + #endif +diff -u libs/libtuxtxt_orig/tuxtxt_def.h libs/libtuxtxt/tuxtxt_def.h +--- libs/libtuxtxt_orig/tuxtxt_def.h 2009-01-29 21:19:23.000000000 +0100 ++++ libs/libtuxtxt/tuxtxt_def.h 2009-01-29 21:26:49.000000000 +0100 +@@ -19,12 +19,12 @@ + #define pes_type pesType + #define dmx_sct_filter_params dmxSctFilterParams + #include +- #define DMX "/dev/dvb/card0/demux0" + #else + #include +- #define DMX "/dev/dvb/adapter0/demux0" + #endif + ++#define DMX tuxtxt_cache.demux ++ + #include + #include FT_FREETYPE_H + #include FT_CACHE_H +@@ -325,6 +325,7 @@ + short flofpages[0x900][FLOFSIZE]; + unsigned char adip[0x900][13]; + unsigned char subpagetable[0x900]; ++ char demux[64]; + int dmx; + int vtxtpid; + int cached_pages, page, subpage, pageupdate,page_receiving, current_page[9], current_subpage[9]; diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/ignorelibs.patch b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/ignorelibs.patch new file mode 100644 index 0000000..11253b0 --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/ignorelibs.patch @@ -0,0 +1,11 @@ +--- ~/Makefile.am~ 2005-06-26 17:19:00.000000000 +0200 ++++ ~/Makefile.am 2008-09-03 19:59:00.000000000 +0200 +@@ -1,8 +1,5 @@ + AUTOMAKE_OPTIONS = gnu + + SUBDIRS = \ +- libavs \ +- liblcddisplay \ +- liblircdclient \ + libtuxtxt + diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/libz.patch b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/libz.patch new file mode 100644 index 0000000..6b74a28 --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/libz.patch @@ -0,0 +1,10 @@ +--- libs/libtuxtxt/Makefile.am 2012-02-17 00:44:38.933059300 +0100 ++++ libs/libtuxtxt/Makefile.am 2012-02-17 01:31:00.077032773 +0100 +@@ -4,6 +4,7 @@ + pkginclude_HEADERS = tuxtxt_def.h tuxtxt_common.h + + libtuxtxt_la_SOURCES = libtuxtxt.c ++libtuxtxt_la_LIBADD = -lz + + AM_CPPFLAGS = \ + @FREETYPE_CFLAGS@ diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/resize_framebuffer.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/resize_framebuffer.diff new file mode 100644 index 0000000..a5f6007 --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/resize_framebuffer.diff @@ -0,0 +1,48 @@ +diff -u libs/libtuxtxt_orig/tuxtxt_common.h libs/libtuxtxt/tuxtxt_common.h +--- libs/libtuxtxt_orig/tuxtxt_common.h 2009-01-29 21:19:23.000000000 +0100 ++++ libs/libtuxtxt/tuxtxt_common.h 2009-01-29 21:24:32.000000000 +0100 +@@ -5375,15 +5375,6 @@ + ymosaic[0], ymosaic[1], ymosaic[2], renderinfo->StartX, renderinfo->StartY, renderinfo->ascender); + #endif + +- /* get fixed screeninfo */ +- if (ioctl(renderinfo->fb, FBIOGET_FSCREENINFO, &renderinfo->fix_screeninfo) == -1) +- { +- perror("TuxTxt "); +- FTC_Manager_Done(renderinfo->manager); +- FT_Done_FreeType(renderinfo->library); +- return 0; +- } +- + /* get variable screeninfo */ + if (ioctl(renderinfo->fb, FBIOGET_VSCREENINFO, &renderinfo->var_screeninfo) == -1) + { +@@ -5393,6 +5384,12 @@ + return 0; + } + ++ /* change to PAL resolution */ ++ if (renderinfo->var_screeninfo.xres != 720) ++ { ++ renderinfo->var_screeninfo.xres_virtual = renderinfo->var_screeninfo.xres = 720; ++ renderinfo->var_screeninfo.yres_virtual = renderinfo->var_screeninfo.yres = 576; ++ } + + /* set variable screeninfo for double buffering */ + renderinfo->var_screeninfo.yres_virtual = 2*renderinfo->var_screeninfo.yres; +@@ -5407,6 +5404,15 @@ + return 0; + } + ++ /* get fixed screeninfo */ ++ if (ioctl(renderinfo->fb, FBIOGET_FSCREENINFO, &renderinfo->fix_screeninfo) == -1) ++ { ++ perror("TuxTxt "); ++ FTC_Manager_Done(renderinfo->manager); ++ FT_Done_FreeType(renderinfo->library); ++ return 0; ++ } ++ + #if TUXTXT_DEBUG + if (ioctl(fb, FBIOGET_VSCREENINFO, &renderinfo->var_screeninfo) == -1) + { diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/videodev2.patch b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/videodev2.patch new file mode 100644 index 0000000..5b94e96 --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-libtuxtxt/videodev2.patch @@ -0,0 +1,11 @@ +--- libs/libtuxtxt/tuxtxt_common.h.orig 2012-02-10 22:37:29.736849856 +0100 ++++ libs/libtuxtxt/tuxtxt_common.h 2012-02-10 22:38:01.344849000 +0100 +@@ -25,7 +25,7 @@ + #include + #else + #include +-#include ++#include + #endif + + const char *ObjectSource[] = diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp.bb b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp.bb new file mode 100644 index 0000000..891abc7 --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp.bb @@ -0,0 +1,32 @@ +SUMMARY = "tuxbox tuxtxt for 32bit framebuffer" +LICENSE = "Proprietary" +LIC_FILES_CHKSUM = "file://tuxtxt.c;endline=19;md5=4f3fd30feb71f556493f38c7a8b3ca4d" +DEPENDS = "freetype tuxbox-libtuxtxt" +RDEPENDS_${PN} = "enigma2" +SRCDATE = "20090130" +PV = "0.0+cvs${SRCDATE}" +PR = "r5" + +SRC_URI = "cvs://anoncvs@cvs.tuxbox.org/cvs/tuxbox;module=apps/tuxbox/plugins/tuxtxt;method=ext \ + file://makefiles.diff \ + file://nonblocking.diff \ + file://32bpp.diff \ + file://add_new_default_conf.diff \ + file://add_advanced_rc.diff \ + file://allow_different_demux.diff \ + file://plugin.py \ + file://tuxtxt_vuplus.patch;patch=1;pnum=1 \ +" + +S = "${WORKDIR}/tuxtxt" + +inherit autotools + +do_configure_prepend() { + touch ${S}/python/__init__.py + install -m 0644 ${WORKDIR}/plugin.py ${S}/python +} + +FILES_${PN} += "${datadir}/fonts/tuxtxt.otb ${libdir}/enigma2 /etc/tuxtxt" + +CPPFLAGS += "-DHAVE_DREAMBOX_HARDWARE -DDREAMBOX -I${STAGING_INCDIR}/tuxbox/tuxtxt" diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/32bpp.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/32bpp.diff new file mode 100644 index 0000000..76bbebd --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/32bpp.diff @@ -0,0 +1,388 @@ +diff -u tuxtxt_orig/tuxtxt.c tuxtxt/tuxtxt.c +--- tuxtxt_orig/tuxtxt.c 2009-01-29 21:36:31.000000000 +0100 ++++ tuxtxt/tuxtxt.c 2009-01-29 21:38:42.000000000 +0100 +@@ -7,12 +7,43 @@ + * and DBLuelle * + * russian and arabic support by Leonid Protasov * + * * ++ * ported 2006 to Dreambox 7025 / 32Bit framebuffer * ++ * by Seddi * ++ * * ++ * ported 32Bit framebuffer to Tuxtxt v1.99 (2008) * ++ * by the PLi team (Sat-Turner) * ++ * * ++ * ported to 20090130 * ++ * by the PLi team (pieterg) * ++ * * + ******************************************************************************/ + + + + #include "tuxtxt.h" + ++static char saved_wss[32]; ++static char saved_pin8[32]; ++ ++void readproc(const char* source, char *dest) ++{ ++ FILE *f=fopen(source, "rt"); ++ if(f) ++ { ++ fgets(dest, 255, f); ++ fclose(f); ++ } ++} ++ ++void writeproc(const char* dest, const char *value) ++{ ++ FILE *f=fopen(dest, "w"); ++ if (f) ++ { ++ fwrite(value, strlen(value), 1, f); ++ fclose(f); ++ } ++} + + int getIndexOfPageInHotlist() + { +@@ -137,10 +168,11 @@ + * plugin_exec * + ******************************************************************************/ + +-void plugin_exec(PluginParam *par) ++int main(int argc, char **argv) + { + char cvs_revision[] = "$Revision: 1.108 $"; + ++ int cnt=0; + #if !TUXTXT_CFG_STANDALONE + int initialized = tuxtxt_init(); + if ( initialized ) +@@ -150,31 +182,71 @@ + /* show versioninfo */ + sscanf(cvs_revision, "%*s %s", versioninfo); + printf("TuxTxt %s\n", versioninfo); ++ printf("for 32bpp framebuffer\n"); + + tuxtxt_SetRenderingDefaults(&renderinfo); + /* get params */ + tuxtxt_cache.vtxtpid = renderinfo.fb = lcd = rc = renderinfo.sx = renderinfo.ex = renderinfo.sy = renderinfo.ey = -1; ++ if (argc==1) ++ { ++ printf("\nUSAGE: tuxtxt vtpid\n"); ++ printf("No PID given, so scanning for PIDs ...\n\n"); ++ tuxtxt_cache.vtxtpid=0; ++ } ++ else ++ { ++ tuxtxt_cache.vtxtpid = atoi(argv[1]); ++ } ++ ++ /* open Framebuffer */ ++ if ((renderinfo.fb=open("/dev/fb0", O_RDWR)) == -1) ++ { ++ perror("TuxTxt "); ++ return 0; ++ } ++ rc=-1; ++ while(1) ++ { ++ struct stat s; ++ char tmp[128]; ++ sprintf(tmp, "/dev/input/event%d", cnt); ++ if (stat(tmp, &s)) ++ break; ++ /* open Remote Control */ ++ if ((rc=open(tmp, O_RDONLY)) == -1) ++ { ++ perror("TuxTxt "); ++ return 0; ++ } ++ if (ioctl(rc, EVIOCGNAME(128), tmp) < 0) ++ perror("EVIOCGNAME failed"); ++ if (strstr(tmp, "remote control")) ++ break; ++ close(rc); ++ rc=-1; ++ ++cnt; ++ } ++ ++ if (rc == -1) ++ { ++ printf("couldnt find correct input device!!!\n"); ++ return -1; ++ } + +- for (; par; par = par->next) ++ /* open LCD */ ++ if ((lcd=open("/dev/dbox/lcd0", O_RDWR)) == -1) + { +- if (!strcmp(par->id, P_ID_VTXTPID)) +- tuxtxt_cache.vtxtpid = atoi(par->val); +- else if (!strcmp(par->id, P_ID_FBUFFER)) +- renderinfo.fb = atoi(par->val); +- else if (!strcmp(par->id, P_ID_LCD)) +- lcd = atoi(par->val); +- else if (!strcmp(par->id, P_ID_RCINPUT)) +- rc = atoi(par->val); +- else if (!strcmp(par->id, P_ID_OFF_X)) +- renderinfo.sx = atoi(par->val); +- else if (!strcmp(par->id, P_ID_END_X)) +- renderinfo.ex = atoi(par->val); +- else if (!strcmp(par->id, P_ID_OFF_Y)) +- renderinfo.sy = atoi(par->val); +- else if (!strcmp(par->id, P_ID_END_Y)) +- renderinfo.ey = atoi(par->val); ++ perror("TuxTxt "); ++ return 0; + } + ++ renderinfo.previousbackcolor = tuxtxt_color_transp; ++ renderinfo.zoommode = 0; ++ renderinfo.sx = 80; ++ renderinfo.ex = 620; ++ renderinfo.sy = 30; ++ renderinfo.ey = 555; ++ + if (tuxtxt_cache.vtxtpid == -1 || renderinfo.fb == -1 || rc == -1 || renderinfo.sx == -1 || renderinfo.ex == -1 || renderinfo.sy == -1 || renderinfo.ey == -1) + { + printf("TuxTxt \n"); +@@ -242,6 +314,7 @@ + int vendor = 3; /* values unknown, rely on requested values */ + #endif + ++#if 0 + if (vendor < 3) /* scart-parameters only known for 3 dboxes, FIXME: order must be like in info.h */ + { + for (i = 0; i < 6; i++) /* FIXME: FBLK seems to cause troubles */ +@@ -274,6 +347,7 @@ + perror("TuxTxt "); + } + } ++#endif + continue; /* otherwise ignore exit key */ + } + default: +@@ -487,6 +561,14 @@ + dumpl25 = ival & 1; + else if (1 == sscanf(line, "UseTTF %i", &ival)) + renderinfo.usettf = ival & 1; ++ else if (1 == sscanf(line, "StartX %i", &ival)) ++ renderinfo.sx = ival; ++ else if (1 == sscanf(line, "EndX %i", &ival)) ++ renderinfo.ex = ival; ++ else if (1 == sscanf(line, "StartY %i", &ival)) ++ renderinfo.sy = ival; ++ else if (1 == sscanf(line, "EndY %i", &ival)) ++ renderinfo.ey = ival; + } + fclose(conf); + } +@@ -534,6 +616,12 @@ + #endif + + ++ readproc("/proc/stb/denc/0/wss", saved_wss); ++ writeproc("/proc/stb/denc/0/wss", saamodes[renderinfo.screen_mode1]); ++ ++ readproc("/proc/stb/avs/0/sb", saved_pin8); ++ writeproc("/proc/stb/avs/0/sb", fncmodes[renderinfo.screen_mode1]); ++ + /* setup rc */ + ioctl(rc, RC_IOCTL_BCODES, 1); + +@@ -568,8 +656,6 @@ + if (tuxtxt_cache.dmx != -1) + close(tuxtxt_cache.dmx); + tuxtxt_cache.dmx = -1; +-#else +- tuxtxt_stop(); + #endif + + if (restoreaudio) +@@ -579,6 +665,7 @@ + #else + int vendor = 3; /* values unknown, rely on requested values */ + #endif ++#if 0 + if (vendor < 3) /* scart-parameters only known for 3 dboxes, FIXME: order must be like in info.h */ + { + for (i = 1; i < 6; i += 2) /* restore dvb audio */ +@@ -588,9 +675,17 @@ + perror("TuxTxt "); + } + } ++#endif + } + ++ /* close lcd */ ++ close(lcd); ++ ++ /* close rc */ ++ close(rc); + ++ lcd = rc = -1; ++ + if (hotlistchanged) + savehotlist(); + +@@ -623,10 +718,20 @@ + fprintf(conf, "ShowLevel2p5 %d\n", renderinfo.showl25); + fprintf(conf, "DumpLevel2p5 %d\n", dumpl25); + fprintf(conf, "UseTTF %d\n", renderinfo.usettf); ++ fprintf(conf, "StartX %d\n", renderinfo.sx); ++ fprintf(conf, "EndX %d\n", renderinfo.ex); ++ fprintf(conf, "StartY %d\n", renderinfo.sy); ++ fprintf(conf, "EndY %d\n", renderinfo.ey); + fclose(conf); + } + } + tuxtxt_EndRendering(&renderinfo); ++ ++ /* close framebuffer */ ++ close(renderinfo.fb); ++ ++ writeproc("/proc/stb/avs/0/sb", saved_pin8); ++ writeproc("/proc/stb/denc/0/wss", saved_wss); + } + /****************************************************************************** + * GetTeletextPIDs * +@@ -1308,6 +1413,7 @@ + memset(&menu[Menu_Width*MenuLine[M_COL] + 3+renderinfo.color_mode ], 0x20,24-renderinfo.color_mode); + Menu_HighlightLine(menu, MenuLine[menuitem], 1); + tuxtxt_setcolors(&renderinfo,(unsigned short *)tuxtxt_defaultcolors, 0, tuxtxt_color_SIZECOLTABLE); ++ Menu_Init(menu, current_pid, menuitem, hotindex); + break; + case M_TRA: + saveconfig = 1; +@@ -1319,6 +1425,7 @@ + memset(&menu[Menu_Width*MenuLine[M_TRA] + 3+renderinfo.trans_mode ], 0x20,24-renderinfo.trans_mode); + Menu_HighlightLine(menu, MenuLine[menuitem], 1); + tuxtxt_setcolors(&renderinfo,(unsigned short *)tuxtxt_defaultcolors, 0, tuxtxt_color_SIZECOLTABLE); ++ Menu_Init(menu, current_pid, menuitem, hotindex); + break; + case M_PID: + { +@@ -1421,6 +1528,7 @@ + memset(&menu[Menu_Width*MenuLine[M_COL] + 3+renderinfo.color_mode ], 0x20,24-renderinfo.color_mode); + Menu_HighlightLine(menu, MenuLine[menuitem], 1); + tuxtxt_setcolors(&renderinfo,(unsigned short *)tuxtxt_defaultcolors, 0, tuxtxt_color_SIZECOLTABLE); ++ Menu_Init(menu, current_pid, menuitem, hotindex); + break; + case M_TRA: + saveconfig = 1; +@@ -1432,6 +1540,7 @@ + memset(&menu[Menu_Width*MenuLine[M_TRA] + 3+renderinfo.trans_mode ], 0x20,24-renderinfo.trans_mode); + Menu_HighlightLine(menu, MenuLine[menuitem], 1); + tuxtxt_setcolors(&renderinfo,(unsigned short *)tuxtxt_defaultcolors, 0, tuxtxt_color_SIZECOLTABLE); ++ Menu_Init(menu, current_pid, menuitem, hotindex); + break; + case M_PID: + if (!getpidsdone) +@@ -1731,8 +1840,8 @@ + memcpy(&menu[Menu_Width*MenuLine[M_SC1] + Menu_Width - 5], &configonoff[menulanguage][renderinfo.screen_mode1 ? 3 : 0], 3); + Menu_HighlightLine(menu, MenuLine[menuitem], 1); + +- ioctl(renderinfo.avs, AVSIOSSCARTPIN8, &fncmodes[renderinfo.screen_mode1]); +- ioctl(renderinfo.saa, SAAIOSWSS, &saamodes[renderinfo.screen_mode1]); ++ writeproc("/proc/stb/avs/0/sb", fncmodes[renderinfo.screen_mode1]); ++ writeproc("/proc/stb/denc/0/wss", saamodes[renderinfo.screen_mode1]); + + break; + +@@ -1857,7 +1966,8 @@ + } + + /* generate pagenumber */ +- temp_page |= Number << renderinfo.inputcounter*4; ++ if (renderinfo.inputcounter >= 0) ++ temp_page |= Number << renderinfo.inputcounter*4; + + renderinfo.inputcounter--; + +@@ -2318,8 +2428,8 @@ + else if (renderinfo.transpmode == 1) /* semi-transparent BG with FG text */ + { + /* restore videoformat */ +- ioctl(renderinfo.avs, AVSIOSSCARTPIN8, &renderinfo.fnc_old); +- ioctl(renderinfo.saa, SAAIOSWSS, &renderinfo.saa_old); ++ writeproc("/proc/stb/avs/0/sb", saved_pin8); ++ writeproc("/proc/stb/denc/0/wss", saved_wss); + + tuxtxt_ClearBB(&renderinfo,tuxtxt_color_transp); + tuxtxt_cache.pageupdate = 1; +@@ -2327,8 +2437,8 @@ + else /* TV mode */ + { + /* restore videoformat */ +- ioctl(renderinfo.avs, AVSIOSSCARTPIN8, &renderinfo.fnc_old); +- ioctl(renderinfo.saa, SAAIOSWSS, &renderinfo.saa_old); ++ writeproc("/proc/stb/avs/0/sb", saved_pin8); ++ writeproc("/proc/stb/denc/0/wss", saved_wss); + + tuxtxt_ClearFB(&renderinfo,tuxtxt_color_transp); + renderinfo.clearbbcolor = tuxtxt_cache.FullScrColor; +@@ -2765,8 +2875,8 @@ + case KEY_VOLUMEDOWN: RCCode = RC_MINUS; break; + case KEY_MUTE: RCCode = RC_MUTE; break; + case KEY_HELP: RCCode = RC_HELP; break; +- case KEY_SETUP: RCCode = RC_DBOX; break; +- case KEY_HOME: RCCode = RC_HOME; break; ++ case KEY_MENU: RCCode = RC_DBOX; break; ++ case KEY_EXIT: RCCode = RC_HOME; break; + case KEY_POWER: RCCode = RC_STANDBY; break; + } + return 1; +@@ -2794,10 +2904,3 @@ + + return 0; + } +-/* Local Variables: */ +-/* indent-tabs-mode:t */ +-/* tab-width:3 */ +-/* c-basic-offset:3 */ +-/* comment-column:0 */ +-/* fill-column:120 */ +-/* End: */ +diff -u tuxtxt_orig/tuxtxt.h tuxtxt/tuxtxt.h +--- tuxtxt_orig/tuxtxt.h 2008-12-26 19:41:28.000000000 +0100 ++++ tuxtxt/tuxtxt.h 2009-01-29 21:38:18.000000000 +0100 +@@ -1,3 +1,6 @@ ++#ifndef __tuxtxt_h__ ++#define __tuxtxt_h__ ++ + /****************************************************************************** + * <<< TuxTxt - Teletext Plugin >>> * + * * +@@ -7,7 +10,16 @@ + * and DBLuelle * + * russian and arabic support by Leonid Protasov * + * * +- ******************************************************************************/ ++ * ported 2006 to Dreambox 7025 / 32Bit framebuffer * ++ * by Seddi * ++ * * ++ * ported 32Bit framebuffer to Tuxtxt v1.99 (2008) * ++ * by the PLi team (Sat-Turner) * ++ * * ++ * ported to 1.106 (2008) * ++ * by the PLi team (pieterg) * ++ * * ++******************************************************************************/ + + #define TUXTXT_CFG_STANDALONE 0 // 1:plugin only 0:use library + #define TUXTXT_DEBUG 0 +@@ -37,7 +49,6 @@ + #include + + #include +-#include + #include + + +@@ -1091,3 +1102,5 @@ + /* comment-column:0 */ + /* fill-column:120 */ + /* End: */ ++ ++#endif diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_advanced_rc.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_advanced_rc.diff new file mode 100644 index 0000000..1ebef99 --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_advanced_rc.diff @@ -0,0 +1,161 @@ +diff -u tuxtxt_orig/tuxtxt.c tuxtxt/tuxtxt.c +--- tuxtxt_orig/tuxtxt.c 2009-01-29 21:38:42.000000000 +0100 ++++ tuxtxt/tuxtxt.c 2009-01-29 21:44:29.000000000 +0100 +@@ -173,6 +173,7 @@ + char cvs_revision[] = "$Revision: 1.108 $"; + + int cnt=0; ++ int rc_num = 0; + #if !TUXTXT_CFG_STANDALONE + int initialized = tuxtxt_init(); + if ( initialized ) +@@ -186,7 +187,7 @@ + + tuxtxt_SetRenderingDefaults(&renderinfo); + /* get params */ +- tuxtxt_cache.vtxtpid = renderinfo.fb = lcd = rc = renderinfo.sx = renderinfo.ex = renderinfo.sy = renderinfo.ey = -1; ++ tuxtxt_cache.vtxtpid = renderinfo.fb = lcd = renderinfo.sx = renderinfo.ex = renderinfo.sy = renderinfo.ey = -1; + if (argc==1) + { + printf("\nUSAGE: tuxtxt vtpid\n"); +@@ -204,8 +205,8 @@ + perror("TuxTxt "); + return 0; + } +- rc=-1; +- while(1) ++ rc[0] = rc[1] =-1; ++ while(rc_num < 2) + { + struct stat s; + char tmp[128]; +@@ -213,23 +214,26 @@ + if (stat(tmp, &s)) + break; + /* open Remote Control */ +- if ((rc=open(tmp, O_RDONLY)) == -1) ++ if ((rc[rc_num]=open(tmp, O_RDONLY)) == -1) + { + perror("TuxTxt "); + return 0; + } +- if (ioctl(rc, EVIOCGNAME(128), tmp) < 0) ++ if (ioctl(rc[rc_num], EVIOCGNAME(128), tmp) < 0) + perror("EVIOCGNAME failed"); +- if (strstr(tmp, "remote control")) +- break; +- close(rc); +- rc=-1; ++ if (!strstr(tmp, "remote control")) ++ { ++ close(rc[rc_num]); ++ rc[rc_num] = -1; ++ } ++ else ++ ++rc_num; + ++cnt; + } + +- if (rc == -1) ++ if (rc[0] == -1) + { +- printf("couldnt find correct input device!!!\n"); ++ printf("couldnt find usable input device!!!\n"); + return -1; + } + +@@ -247,7 +251,7 @@ + renderinfo.sy = 30; + renderinfo.ey = 555; + +- if (tuxtxt_cache.vtxtpid == -1 || renderinfo.fb == -1 || rc == -1 || renderinfo.sx == -1 || renderinfo.ex == -1 || renderinfo.sy == -1 || renderinfo.ey == -1) ++ if (tuxtxt_cache.vtxtpid == -1 || renderinfo.fb == -1 || renderinfo.sx == -1 || renderinfo.ex == -1 || renderinfo.sy == -1 || renderinfo.ey == -1) + { + printf("TuxTxt \n"); + return; +@@ -623,7 +627,8 @@ + writeproc("/proc/stb/avs/0/sb", fncmodes[renderinfo.screen_mode1]); + + /* setup rc */ +- ioctl(rc, RC_IOCTL_BCODES, 1); ++ if (rc[0] >= 0) ioctl(rc[0], RC_IOCTL_BCODES, 1); ++ if (rc[1] >= 0) ioctl(rc[1], RC_IOCTL_BCODES, 1); + + + +@@ -682,9 +687,12 @@ + close(lcd); + + /* close rc */ +- close(rc); ++ if (rc[0] >= 0) ++ close(rc[0]); ++ if (rc[1] >= 0) ++ close(rc[1]); + +- lcd = rc = -1; ++ lcd = rc[0] = rc[1] = -1; + + if (hotlistchanged) + savehotlist(); +@@ -2819,20 +2827,28 @@ + timeout.tv_sec = 0; + timeout.tv_usec = 100000; + /* get code */ +- if (rc >= 0) ++ if (rc[0] >= 0) ++ { ++ FD_SET(rc[0], &rset); ++ if (rc[0] > maxfd) ++ { ++ maxfd = rc[0]; ++ } ++ } ++ if (rc[1] >= 0) + { +- FD_SET(rc, &rset); +- if (rc > maxfd) ++ FD_SET(rc[1], &rset); ++ if (rc[1] > maxfd) + { +- maxfd = rc; ++ maxfd = rc[1]; + } + } + if (select(maxfd + 1, &rset, NULL, NULL, &timeout) > 0) + { +- if (rc >= 0 && FD_ISSET(rc, &rset)) ++ if (rc[0] >= 0 && FD_ISSET(rc[0], &rset)) + { + #if HAVE_DVB_API_VERSION < 3 +- read(rc, &RCCode, 2); ++ read(rc[0], &RCCode, 2); + } + if (RCCode != LastKey) + { +@@ -2842,7 +2858,11 @@ + { + switch (RCCode) + #else +- read(rc, &ev, sizeof(ev)); ++ read(rc[0], &ev, sizeof(ev)); ++ } ++ else if (rc[1] >= 0 && FD_ISSET(rc[1], &rset)) ++ { ++ read(rc[1], &ev, sizeof(ev)); + } + if (ev.value) + { +Only in tuxtxt_orig/: tuxtxt.c.orig +diff -u tuxtxt_orig/tuxtxt.h tuxtxt/tuxtxt.h +--- tuxtxt_orig/tuxtxt.h 2009-01-29 21:38:18.000000000 +0100 ++++ tuxtxt/tuxtxt.h 2009-01-29 21:44:29.000000000 +0100 +@@ -209,7 +209,7 @@ + int hotlist[10]; + int maxhotlist; + +-int rc, lcd; ++int rc[2], lcd; + int lastpage; + int savedscreenmode; + char dumpl25; diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_new_default_conf.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_new_default_conf.diff new file mode 100644 index 0000000..3cb476d --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/add_new_default_conf.diff @@ -0,0 +1,36 @@ +diff -Naur tuxtxt_org/tuxtxt2.conf tuxtxt_32bpp/tuxtxt2.conf +--- tuxtxt/tuxtxt2.conf 1970-01-01 01:00:00.000000000 +0100 ++++ tuxtxt/tuxtxt2.conf 2006-03-10 22:07:15.000000000 +0100 +@@ -0,0 +1,23 @@ ++ScreenMode16x9Normal 1 ++ScreenMode16x9Divided 1 ++Brightness 16 ++MenuLanguage 1 ++AutoNational 1 ++NationalSubset 5 ++SwapUpDown 0 ++ShowHexPages 0 ++Transparency 0xA ++TTFWidthFactor16 28 ++TTFHeightFactor16 16 ++TTFShiftX 0 ++TTFShiftY 0 ++Screenmode 0 ++ShowFLOF 1 ++Show39 1 ++ShowLevel2p5 1 ++DumpLevel2p5 0 ++UseTTF 0 ++StartX 50 ++EndX 670 ++StartY 30 ++EndY 555 +diff -Naur tuxtxt_org/tuxtxt.conf tuxtxt_32bpp/tuxtxt.conf +--- tuxtxt/tuxtxt.conf 2006-03-10 22:13:26.000000000 +0100 ++++ tuxtxt/tuxtxt.conf 1970-01-01 01:00:00.000000000 +0100 +@@ -1,5 +0,0 @@ +-ScreenMode16x9Normal 0 +-ScreenMode16x9Divided 0 +-ColorDimmed 1 +-AutoNational 1 +-NationalSubset 4 diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/allow_different_demux.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/allow_different_demux.diff new file mode 100644 index 0000000..b2881f7 --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/allow_different_demux.diff @@ -0,0 +1,77 @@ +--- tuxtxt-org/tuxtxt.c 2010-02-10 20:48:39.000000000 +0100 ++++ tuxtxt/tuxtxt.c 2010-02-10 20:52:39.000000000 +0100 +@@ -172,6 +172,7 @@ + { + char cvs_revision[] = "$Revision: 1.108 $"; + ++ int demux = 0; + int cnt=0; + int rc_num = 0; + #if !TUXTXT_CFG_STANDALONE +@@ -187,18 +188,31 @@ + + tuxtxt_SetRenderingDefaults(&renderinfo); + /* get params */ +- tuxtxt_cache.vtxtpid = renderinfo.fb = lcd = renderinfo.sx = renderinfo.ex = renderinfo.sy = renderinfo.ey = -1; ++ tuxtxt_cache.vtxtpid = 0; ++ renderinfo.fb = lcd = renderinfo.sx = renderinfo.ex = renderinfo.sy = renderinfo.ey = -1; + if (argc==1) + { +- printf("\nUSAGE: tuxtxt vtpid\n"); +- printf("No PID given, so scanning for PIDs ...\n\n"); +- tuxtxt_cache.vtxtpid=0; ++ printf("\nUSAGE: tuxtxt [demux] [vtpid]\n"); ++ printf("No Demux and PID given, so using demux0 and scanning for PIDs ...\n\n"); + } +- else ++ else + { +- tuxtxt_cache.vtxtpid = atoi(argv[1]); ++ demux = atoi(argv[1]); ++ if (argc > 2) ++ tuxtxt_cache.vtxtpid = atoi(argv[2]); ++ else ++ { ++ printf("\nUSAGE: tuxtxt [demux] [vtpid]\n"); ++ printf("No PID given, so scanning for PIDs ...\n\n"); ++ } + } + ++#if HAVE_DVB_API_VERSION < 3 ++ snprintf(tuxtxt_cache.demux, 64, "/dev/dvb/card0/demux%d", demux); ++#else ++ snprintf(tuxtxt_cache.demux, 64, "/dev/dvb/adapter0/demux%d", demux); ++#endif ++ + /* open Framebuffer */ + if ((renderinfo.fb=open("/dev/fb/0", O_RDWR)) == -1) + { +@@ -616,7 +630,7 @@ + tuxtxt_init_demuxer(); + tuxtxt_start_thread(); + #else +- tuxtxt_start(tuxtxt_cache.vtxtpid); ++ tuxtxt_start(tuxtxt_cache.vtxtpid, -1); + #endif + + +@@ -1821,7 +1835,7 @@ + tuxtxt_cache.vtxtpid = pid_table[current_pid].vtxt_pid; + tuxtxt_start_thread(); + #else +- tuxtxt_start(pid_table[current_pid].vtxt_pid); ++ tuxtxt_start(pid_table[current_pid].vtxt_pid, -1); + #endif + } + // tuxtxt_cache.pageupdate = 1; +--- tuxtxt-org/tuxtxt.h 2010-02-10 20:48:39.000000000 +0100 ++++ tuxtxt/tuxtxt.h 2010-02-10 20:49:07.000000000 +0100 +@@ -63,7 +63,7 @@ + extern tstPageAttr tuxtxt_atrtable[]; + extern int tuxtxt_init(); + extern void tuxtxt_close(); +-extern int tuxtxt_start(int tpid); // Start caching ++extern int tuxtxt_start(int tpid, int demux); // Start caching + extern int tuxtxt_stop(); // Stop caching + extern void tuxtxt_next_dec(int *i); /* skip to next decimal */ + extern void tuxtxt_prev_dec(int *i); /* counting down */ diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/makefiles.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/makefiles.diff new file mode 100644 index 0000000..da3b517 --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/makefiles.diff @@ -0,0 +1,548 @@ +diff -Naur tuxtxt_org/AUTHORS tuxtxt/AUTHORS +--- tuxtxt_org/AUTHORS 1970-01-01 01:00:00.000000000 +0100 ++++ tuxtxt/AUTHORS 2006-12-28 12:08:57.000000000 +0100 +@@ -0,0 +1,25 @@ ++In order of appearance in cvs: ++------------------------------------------------ ++Felix Domke ++Andreas Oberritter ++Steffen Hehn ++Andreas Monzner ++Florian Roks ++Ronny Strutz ++Bastian Blank ++Henning Heinold ++Rainer Scherg ++Steffen Buehl ++Wolfram Joost ++Thomas Herold ++Stefan Pluecken ++Florian Schirmer ++Christoph Ketzler ++Bernhard Roth ++Roland Meier ++DBLuelle ++ ++ ++Also many thanks to everyone who supported development ++without having cvs write access ++ +diff -Naur tuxtxt_org/Makefile.am tuxtxt/Makefile.am +--- tuxtxt_org/Makefile.am 2006-12-28 12:10:01.000000000 +0100 ++++ tuxtxt/Makefile.am 2006-12-28 12:10:27.000000000 +0100 +@@ -1,37 +1,18 @@ +-SUBDIRS = font ++installdir = $(CONFIGDIR)/tuxtxt + +-if BOXTYPE_DREAMBOX +-AM_CPPFLAGS = \ +- @FREETYPE_CFLAGS@ \ +- -I$(top_srcdir)/include \ +- -I$(includedir)/tuxbox/tuxtxt ++SUBDIRS = font python + +-tuxtxt_la_LIBADD = \ +- @FREETYPE_LIBS@ \ +- @TUXTXT_LIBS@ +-else + AM_CPPFLAGS = \ +- @TUXBOX_CFLAGS@ \ + @FREETYPE_CFLAGS@ \ ++ -funsigned-char \ + -I$(top_srcdir)/include \ +- -I$(includedir)/tuxbox/tuxtxt ++ -I$(prefix)/$(includedir)/tuxbox/tuxtxt + +-tuxtxt_la_LIBADD = \ +- @TUXBOX_LIBS@ \ ++bin_PROGRAMS = tuxtxt ++tuxtxt_LDADD = -lpthread -lz \ + @FREETYPE_LIBS@ \ +- @TUXTXT_LIBS@ +-endif +- +-noinst_LTLIBRARIES = tuxtxt.la +- +-tuxtxt_la_SOURCES = tuxtxt.c ++ @TUXTXT_LIBS@ + +-tuxtxt_la_LDFLAGS = -rpath $(PLUGINDIR) -module -avoid-version ++tuxtxt_SOURCES = tuxtxt.c + +-install-exec-local: +- install -d $(DESTDIR)$(PLUGINDIR) +- install -d $(DESTDIR)$(CONFIGDIR) +- install -d $(DESTDIR)$(CONFIGDIR)/tuxtxt +- $(LIBTOOL) --mode=install install tuxtxt.la $(DESTDIR)$(PLUGINDIR) +- install -m 0644 $(srcdir)/tuxtxt.cfg $(DESTDIR)$(PLUGINDIR) +- install -m 0644 $(srcdir)/tuxtxt.conf $(DESTDIR)$(CONFIGDIR)/tuxtxt ++install_DATA = tuxtxt2.conf +diff -Naur tuxtxt_org/acinclude.m4 tuxtxt/acinclude.m4 +--- tuxtxt_org/acinclude.m4 1970-01-01 01:00:00.000000000 +0100 ++++ tuxtxt/acinclude.m4 2006-12-28 12:08:57.000000000 +0100 +@@ -0,0 +1,434 @@ ++AC_DEFUN(TUXBOX_APPS,[ ++AM_CONFIG_HEADER(config.h) ++AM_MAINTAINER_MODE ++ ++INSTALL="$INSTALL -p" ++ ++AC_GNU_SOURCE ++AC_SYS_LARGEFILE ++ ++AC_ARG_WITH(target, ++ [ --with-target=TARGET target for compilation [[native,cdk]]], ++ [TARGET="$withval"],[TARGET="native"]) ++ ++AC_ARG_WITH(targetprefix, ++ [ --with-targetprefix=PATH prefix relative to target root (only applicable in cdk mode)], ++ [targetprefix="$withval"],[targetprefix="NONE"]) ++ ++AC_ARG_WITH(debug, ++ [ --without-debug disable debugging code], ++ [DEBUG="$withval"],[DEBUG="yes"]) ++ ++if test "$DEBUG" = "yes"; then ++ DEBUG_CFLAGS="-g3 -ggdb" ++ AC_DEFINE(DEBUG,1,[Enable debug messages]) ++fi ++ ++AC_MSG_CHECKING(target) ++ ++if test "$TARGET" = "native"; then ++ AC_MSG_RESULT(native) ++ ++ if test "$CFLAGS" = "" -a "$CXXFLAGS" = ""; then ++ CFLAGS="-Wall -O2 -pipe $DEBUG_CFLAGS" ++ CXXFLAGS="-Wall -O2 -pipe $DEBUG_CFLAGS" ++ fi ++ if test "$prefix" = "NONE"; then ++ prefix=/usr/local ++ fi ++ targetprefix=$prefix ++elif test "$TARGET" = "cdk"; then ++ AC_MSG_RESULT(cdk) ++ ++ if test "$CC" = "" -a "$CXX" = ""; then ++ CC=powerpc-tuxbox-linux-gnu-gcc CXX=powerpc-tuxbox-linux-gnu-g++ ++ fi ++ if test "$CFLAGS" = "" -a "$CXXFLAGS" = ""; then ++ CFLAGS="-Wall -Os -mcpu=823 -pipe $DEBUG_CFLAGS" ++ CXXFLAGS="-Wall -Os -mcpu=823 -pipe $DEBUG_CFLAGS" ++ fi ++ if test "$prefix" = "NONE"; then ++ AC_MSG_ERROR(invalid prefix, you need to specify one in cdk mode) ++ fi ++ if test "$targetprefix" = "NONE"; then ++ targetprefix="" ++ fi ++ if test "$host_alias" = ""; then ++ cross_compiling=yes ++ host_alias=powerpc-tuxbox-linux-gnu ++ fi ++else ++ AC_MSG_RESULT(none) ++ AC_MSG_ERROR([invalid target $TARGET, choose on from native,cdk]); ++fi ++ ++AC_CANONICAL_BUILD ++AC_CANONICAL_HOST ++ ++check_path () { ++ return $(perl -e "if(\"$1\"=~m#^/usr/(local/)?bin#){print \"0\"}else{print \"1\";}") ++} ++ ++]) ++ ++AC_DEFUN(TUXBOX_APPS_DIRECTORY_ONE,[ ++AC_ARG_WITH($1,[ $6$7 [[PREFIX$4$5]]],[ ++ _$2=$withval ++ if test "$TARGET" = "cdk"; then ++ $2=`eval echo "${targetprefix}$withval"` ++ else ++ $2=$withval ++ fi ++],[ ++ $2="\${$3}$5" ++ if test "$TARGET" = "cdk"; then ++ _$2=`eval echo "${target$3}$5"` ++ else ++ _$2=`eval echo "${$3}$5"` ++ fi ++]) ++ ++dnl automake <= 1.6 don't support this ++dnl AC_SUBST($2) ++AC_DEFINE_UNQUOTED($2,"$_$2",$7) ++]) ++ ++AC_DEFUN(TUXBOX_APPS_DIRECTORY,[ ++AC_REQUIRE([TUXBOX_APPS]) ++ ++if test "$TARGET" = "cdk"; then ++ datadir="\${prefix}/share" ++ tuxboxdatadir="\${prefix}/share/tuxbox" ++ zoneinfodir="\${datadir}/zoneinfo" ++ sysconfdir="\${prefix}/etc" ++ localstatedir="\${prefix}/var" ++ localedir="\${prefix}/var" ++ libdir="\${prefix}/lib" ++ targetdatadir="\${targetprefix}/share" ++ targetsysconfdir="\${targetprefix}/etc" ++ targetlocalstatedir="\${targetprefix}/var" ++ targetlibdir="\${targetprefix}/lib" ++fi ++ ++TUXBOX_APPS_DIRECTORY_ONE(configdir,CONFIGDIR,sysconfdir,/etc,, ++ [--with-configdir=PATH ],[where to find the config files]) ++ ++TUXBOX_APPS_DIRECTORY_ONE(datadir,DATADIR,datadir,/share,, ++ [--with-datadir=PATH ],[where to find data]) ++ ++TUXBOX_APPS_DIRECTORY_ONE(localedir,LOCALEDIR,datadir,/share,/locale, ++ [--with-localedir=PATH ],[where to find locales]) ++ ++TUXBOX_APPS_DIRECTORY_ONE(fontdir,FONTDIR,datadir,/share,/fonts, ++ [--with-fontdir=PATH ],[where to find the fonts]) ++ ++TUXBOX_APPS_DIRECTORY_ONE(gamesdir,GAMESDIR,localstatedir,/var,/tuxbox/games, ++ [--with-gamesdir=PATH ],[where games data is stored]) ++ ++TUXBOX_APPS_DIRECTORY_ONE(libdir,LIBDIR,libdir,/lib,, ++ [--with-libdir=PATH ],[where to find the internal libs]) ++ ++TUXBOX_APPS_DIRECTORY_ONE(plugindir,PLUGINDIR,libdir,/lib,/tuxbox/plugins, ++ [--with-plugindir=PATH ],[where to find the plugins]) ++ ++TUXBOX_APPS_DIRECTORY_ONE(tuxboxdatadir,TUXBOXDATADIR,datadir,/share,, ++ [--with-tuxboxdatadir=PATH],[where to find tuxbox data]) ++ ++TUXBOX_APPS_DIRECTORY_ONE(zoneinfodir,ZONEINFODIR,datadir,/share,/zoneinfo, ++ [--with-zoneinfodir=PATH ],[where to find zoneinfo db]) ++]) ++ ++dnl automake <= 1.6 needs this specifications ++AC_SUBST(CONFIGDIR) ++AC_SUBST(DATADIR) ++AC_SUBST(ZONEINFODIR) ++AC_SUBST(FONTDIR) ++AC_SUBST(GAMESDIR) ++AC_SUBST(LIBDIR) ++AC_SUBST(LOCALEDIR) ++AC_SUBST(PLUGINDIR) ++AC_SUBST(TUXBOXDATADIR) ++dnl end workaround ++ ++AC_DEFUN(TUXBOX_APPS_ENDIAN,[ ++AC_CHECK_HEADERS(endian.h) ++AC_C_BIGENDIAN ++]) ++ ++AC_DEFUN(TUXBOX_APPS_DRIVER,[ ++#AC_ARG_WITH(driver, ++# [ --with-driver=PATH path for driver sources [[NONE]]], ++# [DRIVER="$withval"],[DRIVER=""]) ++# ++#if test -d "$DRIVER/include"; then ++# AC_DEFINE(HAVE_DBOX2_DRIVER,1,[Define to 1 if you have the dbox2 driver sources]) ++#else ++# AC_MSG_ERROR([can't find driver sources]) ++#fi ++ ++#AC_SUBST(DRIVER) ++ ++#CPPFLAGS="$CPPFLAGS -I$DRIVER/include" ++]) ++ ++AC_DEFUN([TUXBOX_APPS_DVB],[ ++AC_ARG_WITH(dvbincludes, ++ [ --with-dvbincludes=PATH path for dvb includes [[NONE]]], ++ [DVBINCLUDES="$withval"],[DVBINCLUDES=""]) ++ ++if test "$DVBINCLUDES"; then ++ CPPFLAGS="$CPPFLAGS -I$DVBINCLUDES" ++fi ++ ++AC_CHECK_HEADERS(ost/dmx.h,[ ++ DVB_API_VERSION=1 ++ AC_MSG_NOTICE([found dvb version 1]) ++]) ++ ++if test -z "$DVB_API_VERSION"; then ++AC_CHECK_HEADERS(linux/dvb/version.h,[ ++ AC_LANG_PREPROC_REQUIRE() ++ AC_REQUIRE([AC_PROG_EGREP]) ++ AC_LANG_CONFTEST([AC_LANG_SOURCE([[ ++#include ++version DVB_API_VERSION ++ ]])]) ++ DVB_API_VERSION=`(eval "$ac_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | $EGREP "^version" | sed "s,version\ ,,"` ++ rm -f conftest* ++ ++ AC_MSG_NOTICE([found dvb version $DVB_API_VERSION]) ++]) ++fi ++ ++if test "$DVB_API_VERSION"; then ++ AC_DEFINE(HAVE_DVB,1,[Define to 1 if you have the dvb includes]) ++ AC_DEFINE_UNQUOTED(HAVE_DVB_API_VERSION,$DVB_API_VERSION,[Define to the version of the dvb api]) ++else ++ AC_MSG_ERROR([can't find dvb headers]) ++fi ++]) ++ ++AC_DEFUN(_TUXBOX_APPS_LIB_CONFIG,[ ++AC_PATH_PROG($1_CONFIG,$2,no) ++if test "$$1_CONFIG" != "no"; then ++ if test "$TARGET" = "cdk" && check_path "$$1_CONFIG"; then ++ AC_MSG_$3([could not find a suitable version of $2]); ++ else ++ $1_CFLAGS=$($$1_CONFIG --cflags) ++ $1_LIBS=$($$1_CONFIG --libs) ++ fi ++fi ++ ++AC_SUBST($1_CFLAGS) ++AC_SUBST($1_LIBS) ++]) ++ ++AC_DEFUN(TUXBOX_APPS_LIB_CONFIG,[ ++_TUXBOX_APPS_LIB_CONFIG($1,$2,ERROR) ++if test "$$1_CONFIG" = "no"; then ++ AC_MSG_ERROR([could not find $2]); ++fi ++]) ++ ++AC_DEFUN(TUXBOX_APPS_LIB_CONFIG_CHECK,[ ++_TUXBOX_APPS_LIB_CONFIG($1,$2,WARN) ++]) ++ ++AC_DEFUN(TUXBOX_APPS_PKGCONFIG,[ ++AC_PATH_PROG(PKG_CONFIG, pkg-config,no) ++if test "$PKG_CONFIG" = "no" ; then ++ AC_MSG_ERROR([could not find pkg-config]); ++fi ++]) ++ ++AC_DEFUN(_TUXBOX_APPS_LIB_PKGCONFIG,[ ++PKG_CHECK_MODULES($1,$2) ++AC_SUBST($1_CFLAGS) ++AC_SUBST($1_LIBS) ++]) ++ ++AC_DEFUN(TUXBOX_APPS_LIB_PKGCONFIG,[ ++_TUXBOX_APPS_LIB_PKGCONFIG($1,$2) ++if test -z "$$1_CFLAGS" ; then ++ AC_MSG_ERROR([could not find package $2]); ++fi ++]) ++ ++AC_DEFUN(TUXBOX_APPS_LIB_PKGCONFIG_CHECK,[ ++_TUXBOX_APPS_LIB_PKGCONFIG($1,$2) ++]) ++ ++AC_DEFUN(_TUXBOX_APPS_LIB_SYMBOL,[ ++AC_CHECK_LIB($2,$3,HAVE_$1="yes",HAVE_$1="no") ++if test "$HAVE_$1" = "yes"; then ++ $1_LIBS=-l$2 ++fi ++ ++AC_SUBST($1_LIBS) ++]) ++ ++AC_DEFUN(TUXBOX_APPS_LIB_SYMBOL,[ ++_TUXBOX_APPS_LIB_SYMBOL($1,$2,$3,ERROR) ++if test "$HAVE_$1" = "no"; then ++ AC_MSG_ERROR([could not find $2]); ++fi ++]) ++ ++AC_DEFUN(TUXBOX_APPS_LIB_CONFIG_SYMBOL,[ ++_TUXBOX_APPS_LIB_SYMBOL($1,$2,$3,WARN) ++]) ++ ++AC_DEFUN(TUXBOX_APPS_GETTEXT,[ ++AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, ++ [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && ++ (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], ++ :) ++AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) ++ ++AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, ++ [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && ++ (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], ++ :) ++ ++AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,[$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1],:) ++ ++AC_MSG_CHECKING([whether NLS is requested]) ++AC_ARG_ENABLE(nls, ++ [ --disable-nls do not use Native Language Support], ++ USE_NLS=$enableval, USE_NLS=yes) ++AC_MSG_RESULT($USE_NLS) ++AC_SUBST(USE_NLS) ++ ++if test "$USE_NLS" = "yes"; then ++ AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,[ ++ AC_TRY_LINK([ ++ #include ++ #ifndef __GNU_GETTEXT_SUPPORTED_REVISION ++ #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) ++ #endif ++ extern int _nl_msg_cat_cntr; ++ extern int *_nl_domain_bindings; ++ ],[ ++ bindtextdomain ("", ""); ++ return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings; ++ ], gt_cv_func_gnugettext_libc=yes, gt_cv_func_gnugettext_libc=no ++ )] ++ ) ++ ++ if test "$gt_cv_func_gnugettext_libc" = "yes"; then ++ AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) ++ gt_use_preinstalled_gnugettext=yes ++ else ++ USE_NLS=no ++ fi ++fi ++ ++if test -f "$srcdir/po/LINGUAS"; then ++ ALL_LINGUAS=$(sed -e "/^#/d" "$srcdir/po/LINGUAS") ++fi ++ ++POFILES= ++GMOFILES= ++UPDATEPOFILES= ++DUMMYPOFILES= ++for lang in $ALL_LINGUAS; do ++ POFILES="$POFILES $srcdirpre$lang.po" ++ GMOFILES="$GMOFILES $srcdirpre$lang.gmo" ++ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" ++ DUMMYPOFILES="$DUMMYPOFILES $lang.nop" ++done ++INST_LINGUAS= ++if test -n "$ALL_LINGUAS"; then ++ for presentlang in $ALL_LINGUAS; do ++ useit=no ++ if test -n "$LINGUAS"; then ++ desiredlanguages="$LINGUAS" ++ else ++ desiredlanguages="$ALL_LINGUAS" ++ fi ++ for desiredlang in $desiredlanguages; do ++ case "$desiredlang" in ++ "$presentlang"*) useit=yes;; ++ esac ++ done ++ if test $useit = yes; then ++ INST_LINGUAS="$INST_LINGUAS $presentlang" ++ fi ++ done ++fi ++CATALOGS= ++if test -n "$INST_LINGUAS"; then ++ for lang in $INST_LINGUAS; do ++ CATALOGS="$CATALOGS $lang.gmo" ++ done ++fi ++AC_SUBST(POFILES) ++AC_SUBST(GMOFILES) ++AC_SUBST(UPDATEPOFILES) ++AC_SUBST(DUMMYPOFILES) ++AC_SUBST(CATALOGS) ++]) ++ ++dnl backward compatiblity ++AC_DEFUN([AC_GNU_SOURCE], ++[AH_VERBATIM([_GNU_SOURCE], ++[/* Enable GNU extensions on systems that have them. */ ++#ifndef _GNU_SOURCE ++# undef _GNU_SOURCE ++#endif])dnl ++AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl ++AC_BEFORE([$0], [AC_RUN_IFELSE])dnl ++AC_DEFINE([_GNU_SOURCE]) ++]) ++ ++AC_DEFUN([AC_PROG_EGREP], ++[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], ++ [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 ++ then ac_cv_prog_egrep='grep -E' ++ else ac_cv_prog_egrep='egrep' ++ fi]) ++ EGREP=$ac_cv_prog_egrep ++ AC_SUBST([EGREP]) ++]) ++ ++AC_DEFUN([AC_PYTHON_DEVEL],[ ++ # ++ # should allow for checking of python version here... ++ # ++ AC_REQUIRE([AM_PATH_PYTHON]) ++ ++ # Check for Python include path ++ AC_MSG_CHECKING([for Python include path]) ++ python_path=`echo $PYTHON | sed "s,/bin.*$,,"` ++ for i in "$python_path/include/python$PYTHON_VERSION/" "$python_path/include/python/" "$python_path/" ; do ++ python_path=`find $i -type f -name Python.h -print | sed "1q"` ++ if test -n "$python_path" ; then ++ break ++ fi ++ done ++ python_path=`echo $python_path | sed "s,/Python.h$,,"` ++ AC_MSG_RESULT([$python_path]) ++ if test -z "$python_path" ; then ++ AC_MSG_ERROR([cannot find Python include path]) ++ fi ++ AC_SUBST([PYTHON_CPPFLAGS],[-I$python_path]) ++ ++ # Check for Python library path ++ AC_MSG_CHECKING([for Python library path]) ++ python_path=`echo $PYTHON | sed "s,/bin.*$,,"` ++ for i in "$python_path/lib/python$PYTHON_VERSION/config/" "$python_path/lib/python$PYTHON_VERSION/" "$python_path/lib/python/config/" "$python_path/lib/python/" "$python_path/" ; do ++ python_path=`find $i -type f -name libpython$PYTHON_VERSION.* -print | sed "1q"` ++ if test -n "$python_path" ; then ++ break ++ fi ++ done ++ python_path=`echo $python_path | sed "s,/libpython.*$,,"` ++ AC_MSG_RESULT([$python_path]) ++ if test -z "$python_path" ; then ++ AC_MSG_ERROR([cannot find Python library path]) ++ fi ++ AC_SUBST([PYTHON_LDFLAGS],["-L$python_path -lpython$PYTHON_VERSION"]) ++ # ++ python_site=`echo $python_path | sed "s/config/site-packages/"` ++ AC_SUBST([PYTHON_SITE_PKG],[$python_site]) ++]) +diff -Naur tuxtxt_org/configure.ac tuxtxt/configure.ac +--- tuxtxt_org/configure.ac 1970-01-01 01:00:00.000000000 +0100 ++++ tuxtxt/configure.ac 2006-12-28 12:08:58.000000000 +0100 +@@ -0,0 +1,18 @@ ++AC_INIT(tuxbox-tuxtxt-32bpp,1.96) ++AM_INIT_AUTOMAKE(tuxbox-tuxtxt-32bpp,1.96) ++ ++TUXBOX_APPS ++TUXBOX_APPS_DIRECTORY ++TUXBOX_APPS_DVB ++TUXBOX_APPS_DRIVER ++ ++# Checks for programs. ++AC_PROG_CC ++AM_PATH_PYTHON ++ ++TUXBOX_APPS_LIB_CONFIG(FREETYPE,freetype-config) ++TUXBOX_APPS_LIB_PKGCONFIG(TUXTXT,tuxbox-tuxtxt) ++ ++AC_OUTPUT(Makefile) ++AC_OUTPUT(font/Makefile) ++AC_OUTPUT(python/Makefile) +diff -Naur tuxtxt_32bpp/python/Makefile.am tuxtxt/python/Makefile.am +--- tuxtxt/python/Makefile.am 1970-01-01 01:00:00.000000000 +0100 ++++ tuxtxt/python/Makefile.am 2006-03-10 21:43:45.000000000 +0100 +@@ -0,0 +1,5 @@ ++installdir = $(LIBDIR)/enigma2/python/Plugins/Extensions/Tuxtxt ++ ++install_PYTHON = \ ++ plugin.py \ ++ __init__.py diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/nonblocking.diff b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/nonblocking.diff new file mode 100644 index 0000000..6867e6c --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/nonblocking.diff @@ -0,0 +1,142 @@ +diff -u tuxtxt_orig/tuxtxt.c tuxtxt/tuxtxt.c +--- tuxtxt_orig/tuxtxt.c 2008-12-26 19:41:28.000000000 +0100 ++++ tuxtxt/tuxtxt.c 2009-01-29 21:36:31.000000000 +0100 +@@ -535,7 +535,6 @@ + + + /* setup rc */ +- fcntl(rc, F_SETFL, O_NONBLOCK); + ioctl(rc, RC_IOCTL_BCODES, 1); + + +@@ -1214,7 +1213,7 @@ + + void ConfigMenu(int Init) + { +- int val, menuitem = M_Start; ++ int menuitem = M_Start; + int current_pid = 0; + int hotindex; + int oldscreenmode; +@@ -1257,10 +1256,6 @@ + renderinfo.clearbbcolor = tuxtxt_color_black; + Menu_Init(menu, current_pid, menuitem, hotindex); + +- /* set blocking mode */ +- val = fcntl(rc, F_GETFL); +- fcntl(rc, F_SETFL, val &~ O_NONBLOCK); +- + /* loop */ + do { + if (GetRCCode() == 1) +@@ -1721,7 +1716,6 @@ + current_service = current_pid; + // RenderMessage(ShowServiceName); + +- fcntl(rc, F_SETFL, O_NONBLOCK); + RCCode = -1; + if (oldscreenmode) + tuxtxt_SwitchScreenMode(&renderinfo,oldscreenmode); /* restore divided screen */ +@@ -1792,8 +1786,6 @@ + UpdateLCD(); /* update number of cached pages */ + } while ((RCCode != RC_HOME) && (RCCode != RC_DBOX) && (RCCode != RC_MUTE)); + +- /* reset to nonblocking mode */ +- fcntl(rc, F_SETFL, O_NONBLOCK); + tuxtxt_cache.pageupdate = 1; + RCCode = -1; + if (oldscreenmode) +@@ -2013,7 +2005,7 @@ + void PageCatching() + { + int active_national_subset=tuxtxt_cache.national_subset; +- int val, byte; ++ int byte; + int oldzoommode = renderinfo.zoommode; + + renderinfo.pagecatching = 1; +@@ -2046,10 +2038,6 @@ + return; + } + +- /* set blocking mode */ +- val = fcntl(rc, F_GETFL); +- fcntl(rc, F_SETFL, val &~ O_NONBLOCK); +- + /* loop */ + do { + GetRCCode(); +@@ -2088,7 +2076,6 @@ + case RC_HOME: + case RC_HELP: + case RC_MUTE: +- fcntl(rc, F_SETFL, O_NONBLOCK); + tuxtxt_cache.pageupdate = 1; + renderinfo.pagecatching = 0; + RCCode = -1; +@@ -2112,9 +2099,6 @@ + tuxtxt_cache.subpage = subp; + else + tuxtxt_cache.subpage = 0; +- +- /* reset to nonblocking mode */ +- fcntl(rc, F_SETFL, O_NONBLOCK); + } + + /****************************************************************************** +@@ -2712,16 +2696,34 @@ + + int GetRCCode() + { ++ int maxfd = 0; ++ fd_set rset; ++ struct timeval timeout; + #if HAVE_DVB_API_VERSION < 3 + static unsigned short LastKey = -1; + #else + struct input_event ev; + static __u16 rc_last_key = KEY_RESERVED; + #endif ++ FD_ZERO(&rset); ++ timeout.tv_sec = 0; ++ timeout.tv_usec = 100000; + /* get code */ +-#if HAVE_DVB_API_VERSION < 3 +- if (read(rc, &RCCode, 2) == 2) ++ if (rc >= 0) ++ { ++ FD_SET(rc, &rset); ++ if (rc > maxfd) ++ { ++ maxfd = rc; ++ } ++ } ++ if (select(maxfd + 1, &rset, NULL, NULL, &timeout) > 0) + { ++ if (rc >= 0 && FD_ISSET(rc, &rset)) ++ { ++#if HAVE_DVB_API_VERSION < 3 ++ read(rc, &RCCode, 2); ++ } + if (RCCode != LastKey) + { + LastKey = RCCode; +@@ -2730,8 +2732,8 @@ + { + switch (RCCode) + #else +- if (read(rc, &ev, sizeof(ev)) == sizeof(ev)) +- { ++ read(rc, &ev, sizeof(ev)); ++ } + if (ev.value) + { + if (ev.code != rc_last_key) +@@ -2789,7 +2791,6 @@ + } + + RCCode = -1; +- usleep(1000000/100); + + return 0; + } diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/plugin.py b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/plugin.py new file mode 100644 index 0000000..dad428b --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/plugin.py @@ -0,0 +1,60 @@ +from enigma import eConsoleAppContainer, iServiceInformation, fbClass, eRCInput, eDBoxLCD, getDesktop +from Screens.Screen import Screen +from Plugins.Plugin import PluginDescriptor +from os import symlink, mkdir, remove, rmdir, path + +class ShellStarter(Screen): + skin = """ + + """ + faked_lcd = False + + def __init__(self, session, args = None): + self.skin = ShellStarter.skin + Screen.__init__(self, session) + self.container=eConsoleAppContainer() + self.container.appClosed.append(self.finished) + self.runapp() + + def runapp(self): + service = self.session.nav.getCurrentService() + info = service and service.info() + txtpid = info and "%d" %(info.getInfo(iServiceInformation.sTXTPID)) or "" + + stream = service and service.stream() + demux = stream and stream.getStreamingData() + demux = demux and demux.get("demux", -1) + demux = demux > -1 and "%d" %(demux) or "" + + eDBoxLCD.getInstance().lock() + eRCInput.getInstance().lock() + fbClass.getInstance().lock() + + self.faked_lcd = not path.exists("/dev/dbox") + if self.faked_lcd: + mkdir("/dev/dbox") + symlink("/dev/null", "/dev/dbox/lcd0") + + if self.container.execute("/usr/bin/tuxtxt " + demux + " " + txtpid): + self.finished(-1) + + def finished(self,retval): + fbClass.getInstance().unlock() + eRCInput.getInstance().unlock() + eDBoxLCD.getInstance().unlock() + + if self.faked_lcd: + remove("/dev/dbox/lcd0") + rmdir("/dev/dbox") + + #force redraw + dsk = getDesktop(0) + dsk.resize(dsk.size()) + + self.close() + +def main(session, **kwargs): + session.open(ShellStarter) + +def Plugins(**kwargs): + return PluginDescriptor(name="TuxTXT", description="Videotext", where = PluginDescriptor.WHERE_TELETEXT, fnc=main) diff --git a/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/vuplus/tuxtxt_vuplus.patch b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/vuplus/tuxtxt_vuplus.patch new file mode 100644 index 0000000..4c2a950 --- /dev/null +++ b/meta-openvuplus/recipes-base/tuxtxt/tuxbox-tuxtxt-32bpp/vuplus/tuxtxt_vuplus.patch @@ -0,0 +1,12 @@ +--- tuxtxt_org/tuxtxt.c 2010-04-01 13:18:13.000000000 +0900 ++++ tuxtxt/tuxtxt.c 2010-04-01 13:21:57.000000000 +0900 +@@ -2664,7 +2664,8 @@ + static int init_lcd = 1, old_cached_pages = -1, old_page = -1, old_subpage = -1, old_subpage_max = -1, old_hintmode = -1; + int x, y, subpage_max = 0, update_lcd = 0; + +- if (lcd == -1) return; // for Dreamboxes without LCD-Display (5xxx) ++// if (lcd == -1) ++ return; // for Dreamboxes without LCD-Display (5xxx) + /* init or update lcd */ + if (init_lcd) + { diff --git a/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper.bb b/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper.bb new file mode 100644 index 0000000..dbbf4d5 --- /dev/null +++ b/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper.bb @@ -0,0 +1,23 @@ +DESCIPTION = "helper tool to use usb dvb frontends" +MAINTAINER = "PLi team" +LICENSE = "GPLv2" +LIC_FILES_CHKSUM = "file://${THISDIR}/${PN}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" + +PV = "1.0+git${SRCPV}" +PR = "r1" +SRC_REV = "" + +SRC_URI = "git://openpli.git.sourceforge.net/gitroot/openpli/vtuner;protocol=git;tag=${SRC_REV} \ + file://${PN}.sh " + +S = "${WORKDIR}/git" + +inherit autotools update-rc.d + +INITSCRIPT_NAME = "${PN}" +INITSCRIPT_PARAMS = "defaults" + +do_install_append() { + install -d ${D}/etc/init.d + install -m 0755 ${WORKDIR}/${PN}.sh ${D}/etc/init.d/${PN} +} diff --git a/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/GPL-2.0 b/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/GPL-2.0 new file mode 100644 index 0000000..7f5abbc --- /dev/null +++ b/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/GPL-2.0 @@ -0,0 +1,132 @@ + +GNU GENERAL PUBLIC LICENSE + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation`s software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author`s protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors` reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone`s free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program`s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. +b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. +c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, +b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, +c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients` exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + +one line to give the program`s name and an idea of what it does. +Copyright (C) yyyy name of author + +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; either version 2 +of the License, or (at your option) any later version. + +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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details +type `show w`. This is free software, and you are welcome +to redistribute it under certain conditions; type `show c` +for details. +The hypothetical commands `show w` and `show c` should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w` and `show c`; they could even be mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright +interest in the program `Gnomovision` +(which makes passes at compilers) written +by James Hacker. + +signature of Ty Coon, 1 April 1989 +Ty Coon, President of Vice +This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. + diff --git a/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/usbtunerhelper.sh b/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/usbtunerhelper.sh new file mode 100644 index 0000000..424cf3d --- /dev/null +++ b/meta-openvuplus/recipes-base/usbtunerhelper/usbtunerhelper/usbtunerhelper.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +if ! [ -x /usr/bin/usbtunerhelper ]; then + exit 0 +fi + +case "$1" in + start) + start-stop-daemon -S -x /usr/bin/usbtunerhelper + ;; + stop) + start-stop-daemon -K -x /usr/bin/usbtunerhelper + ;; + restart|reload) + $0 stop + $0 start + ;; + *) + echo "Usage: $0 {start|stop|restart}" + exit 1 + ;; +esac + +exit 0 diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/01-builddefs.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/01-builddefs.patch new file mode 100644 index 0000000..a757d99 --- /dev/null +++ b/meta-openvuplus/recipes-base/vsftpd/vsftpd/01-builddefs.patch @@ -0,0 +1,18 @@ +Author: Daniel Jacobowitz +Description: Build with tcpwrapper and SSL support. + +diff -Naurp vsftpd.orig/builddefs.h vsftpd/builddefs.h +--- vsftpd.orig/builddefs.h 2009-01-31 00:02:36.000000000 +0000 ++++ vsftpd/builddefs.h 2009-01-31 00:26:34.000000000 +0000 +@@ -1,9 +1,9 @@ + #ifndef VSF_BUILDDEFS_H + #define VSF_BUILDDEFS_H + +-#undef VSF_BUILD_TCPWRAPPERS ++#define VSF_BUILD_TCPWRAPPERS 1 + #define VSF_BUILD_PAM +-#undef VSF_BUILD_SSL ++#define VSF_BUILD_SSL + + #endif /* VSF_BUILDDEFS_H */ + diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/02-config.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/02-config.patch new file mode 100644 index 0000000..6d7965d --- /dev/null +++ b/meta-openvuplus/recipes-base/vsftpd/vsftpd/02-config.patch @@ -0,0 +1,120 @@ +Author: Daniel Jacobowitz +Description: Set default configuration. + +diff -Naurp vsftpd.orig/tunables.c vsftpd/tunables.c +--- vsftpd.orig/tunables.c 2009-07-15 22:08:27.000000000 +0200 ++++ vsftpd/tunables.c 2009-11-06 13:33:34.000000000 +0100 +@@ -246,7 +246,7 @@ tunables_load_defaults() + /* -rw------- */ + tunable_chown_upload_mode = 0600; + +- install_str_setting("/usr/share/empty", &tunable_secure_chroot_dir); ++ install_str_setting("/var/run/vsftpd/empty", &tunable_secure_chroot_dir); + install_str_setting("ftp", &tunable_ftp_username); + install_str_setting("root", &tunable_chown_username); + install_str_setting("/var/log/xferlog", &tunable_xferlog_file); +@@ -256,7 +256,7 @@ tunables_load_defaults() + install_str_setting(0, &tunable_ftpd_banner); + install_str_setting("/etc/vsftpd.banned_emails", &tunable_banned_email_file); + install_str_setting("/etc/vsftpd.chroot_list", &tunable_chroot_list_file); +- install_str_setting("ftp", &tunable_pam_service_name); ++ install_str_setting("vsftpd", &tunable_pam_service_name); + install_str_setting("ftp", &tunable_guest_username); + install_str_setting("/etc/vsftpd.user_list", &tunable_userlist_file); + install_str_setting(0, &tunable_anon_root); +diff -Naurp vsftpd.orig/vsftpd.conf vsftpd/vsftpd.conf +--- vsftpd.orig/vsftpd.conf 2009-11-06 08:41:11.000000000 +0100 ++++ vsftpd/vsftpd.conf 2009-11-06 13:35:37.000000000 +0100 +@@ -8,6 +8,17 @@ + # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's + # capabilities. + # ++# ++# Run standalone? vsftpd can run either from an inetd or as a standalone ++# daemon started from an initscript. ++listen=YES ++# ++# Run standalone with IPv6? ++# Like the listen parameter, except vsftpd will listen on an IPv6 socket ++# instead of an IPv4 one. This parameter and the listen parameter are mutually ++# exclusive. ++#listen_ipv6=YES ++# + # Allow anonymous FTP? (Beware - allowed by default if you comment this out). + anonymous_enable=YES + # +@@ -34,6 +45,12 @@ anonymous_enable=YES + # go into a certain directory. + dirmessage_enable=YES + # ++# If enabled, vsftpd will display directory listings with the time ++# in your local time zone. The default is to display GMT. The ++# times returned by the MDTM FTP command are also affected by this ++# option. ++use_localtime=YES ++# + # Activate logging of uploads/downloads. + xferlog_enable=YES + # +@@ -89,6 +106,11 @@ connect_from_port_20=YES + # (default follows) + #banned_email_file=/etc/vsftpd.banned_emails + # ++# You may restrict local users to their home directories. See the FAQ for ++# the possible risks in this before using chroot_local_user or ++# chroot_list_enable below. ++#chroot_local_user=YES ++# + # You may specify an explicit list of local users to chroot() to their home + # directory. If chroot_local_user is YES, then this list becomes a list of + # users to NOT chroot(). +@@ -103,12 +125,20 @@ connect_from_port_20=YES + # the presence of the "-R" option, so there is a strong case for enabling it. + #ls_recurse_enable=YES + # +-# When "listen" directive is enabled, vsftpd runs in standalone mode and +-# listens on IPv4 sockets. This directive cannot be used in conjunction +-# with the listen_ipv6 directive. +-listen=YES ++# Customization + # +-# This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6 +-# sockets, you must run two copies of vsftpd with two configuration files. +-# Make sure, that one of the listen options is commented !! +-#listen_ipv6=YES ++# Some of vsftpd's settings don't fit the filesystem layout by ++# default. ++# ++# This option should be the name of a directory which is empty. Also, the ++# directory should not be writable by the ftp user. This directory is used ++# as a secure chroot() jail at times vsftpd does not require filesystem ++# access. ++secure_chroot_dir=/var/run/vsftpd/empty ++# ++# This string is the name of the PAM service vsftpd will use. ++pam_service_name=vsftpd ++# ++# This option specifies the location of the RSA certificate to use for SSL ++# encrypted connections. ++rsa_cert_file=/etc/ssl/private/vsftpd.pem +diff -Naurp vsftpd.orig/vsftpd.conf.5 vsftpd/vsftpd.conf.5 +--- vsftpd.orig/vsftpd.conf.5 2009-11-06 08:41:11.000000000 +0100 ++++ vsftpd/vsftpd.conf.5 2009-11-06 13:37:10.000000000 +0100 +@@ -940,7 +940,7 @@ Default: nobody + .B pam_service_name + This string is the name of the PAM service vsftpd will use. + +-Default: ftp ++Default: vsftpd + .TP + .B pasv_address + Use this option to override the IP address that vsftpd will advertise in +@@ -969,7 +969,7 @@ This option should be the name of a dire + directory should not be writable by the ftp user. This directory is used + as a secure chroot() jail at times vsftpd does not require filesystem access. + +-Default: /usr/share/empty ++Default: /var/run/vsftpd/empty + .TP + .B ssl_ciphers + This option can be used to select which SSL ciphers vsftpd will allow for diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/03-db-doc.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/03-db-doc.patch new file mode 100644 index 0000000..d544ef0 --- /dev/null +++ b/meta-openvuplus/recipes-base/vsftpd/vsftpd/03-db-doc.patch @@ -0,0 +1,19 @@ +Author: shaul Karl +Description: + A short explanation how to find out the right db version (Closes: #478282). + +diff -Naurp vsftpd.orig/EXAMPLE/VIRTUAL_USERS/README vsftpd/EXAMPLE/VIRTUAL_USERS/README +--- vsftpd.orig/EXAMPLE/VIRTUAL_USERS/README 2009-01-31 00:02:36.000000000 +0000 ++++ vsftpd/EXAMPLE/VIRTUAL_USERS/README 2009-01-31 01:38:11.000000000 +0000 +@@ -21,7 +21,10 @@ NOTE: Many systems have multiple version + need to use e.g. db3_load for correct operation. This is known to affect + some Debian systems. The core issue is that pam_userdb expects its login + database to be a specific db version (often db3, whereas db4 may be installed +-on your system). ++on your system). You might check ahead what specific db version you'll need ++by looking at the dependcies of the pam module. Some methods to do that is to ++run ldd on the pam_userdb.so or look at the dependencies of the package with ++the pam modules. + + This will create /etc/vsftpd_login.db. Obviously, you may want to make sure + the permissions are restricted: diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/04-link-local.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/04-link-local.patch new file mode 100644 index 0000000..53b3735 --- /dev/null +++ b/meta-openvuplus/recipes-base/vsftpd/vsftpd/04-link-local.patch @@ -0,0 +1,91 @@ +Author: Michael Stapelberg +Description: + vsftpd does not accept IPv6 scope identifier in listen_address6 + (Closes: #544993). + . + When specifying a link-local address, you need a scope identifier (tha name of + the index usually), thus you cannot use the following: + listen_address6=fe80::21f:16ff:fe06:3aab + but you have to use: + listen_address6=fe80::21f:16ff:fe06:3aab%eth0 + so that it is clear on which interface this link-local address should be used. + . + Unfortunately, vsftpd does not correctly parse the address mentioned above and + thus fails to be useful in link-local-only environments. + . + This patch fixes it. + +diff -Naurp vsftpd.orig/standalone.c vsftpd/standalone.c +--- vsftpd.orig/standalone.c 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/standalone.c 2009-10-17 17:10:02.000000000 +0200 +@@ -7,6 +7,8 @@ + * Code to listen on the network and launch children servants. + */ + ++#include ++ + #include "standalone.h" + + #include "parseconf.h" +@@ -111,8 +113,17 @@ vsf_standalone_main(void) + else + { + struct mystr addr_str = INIT_MYSTR; ++ struct mystr scope_id = INIT_MYSTR; + const unsigned char* p_raw_addr; ++ unsigned int if_index = 0; ++ ++ /* See if we got a scope id */ + str_alloc_text(&addr_str, tunable_listen_address6); ++ str_split_char(&addr_str, &scope_id, '%'); ++ if (str_getlen(&scope_id) > 0) { ++ if_index = if_nametoindex(str_getbuf(&scope_id)); ++ str_free(&scope_id); ++ } + p_raw_addr = vsf_sysutil_parse_ipv6(&addr_str); + str_free(&addr_str); + if (!p_raw_addr) +@@ -120,6 +131,7 @@ vsf_standalone_main(void) + die2("bad listen_address6: ", tunable_listen_address6); + } + vsf_sysutil_sockaddr_set_ipv6addr(p_sockaddr, p_raw_addr); ++ vsf_sysutil_sockaddr_set_ipv6scope(p_sockaddr, if_index); + } + retval = vsf_sysutil_bind(listen_sock, p_sockaddr); + vsf_sysutil_free(p_sockaddr); +diff -Naurp vsftpd.orig/sysutil.c vsftpd/sysutil.c +--- vsftpd.orig/sysutil.c 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/sysutil.c 2009-10-17 17:10:02.000000000 +0200 +@@ -2039,6 +2039,19 @@ vsf_sysutil_sockaddr_set_ipv6addr(struct + } + } + ++int ++vsf_sysutil_sockaddr_get_ipv6scope(struct vsf_sysutil_sockaddr* p_sockptr) ++{ ++ return p_sockptr->u.u_sockaddr_in6.sin6_scope_id; ++} ++ ++void ++vsf_sysutil_sockaddr_set_ipv6scope(struct vsf_sysutil_sockaddr* p_sockptr, ++ const int scope_id) ++{ ++ p_sockptr->u.u_sockaddr_in6.sin6_scope_id = scope_id; ++} ++ + const void* + vsf_sysutil_sockaddr_ipv6_v4(const struct vsf_sysutil_sockaddr* p_addr) + { +diff -Naurp vsftpd.orig/sysutil.h vsftpd/sysutil.h +--- vsftpd.orig/sysutil.h 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/sysutil.h 2009-10-17 17:10:02.000000000 +0200 +@@ -228,6 +228,9 @@ void vsf_sysutil_sockaddr_set_ipv4addr(s + const unsigned char* p_raw); + void vsf_sysutil_sockaddr_set_ipv6addr(struct vsf_sysutil_sockaddr* p_sockptr, + const unsigned char* p_raw); ++void vsf_sysutil_sockaddr_set_ipv6scope(struct vsf_sysutil_sockaddr* p_sockptr, ++ const int scope_id); ++int vsf_sysutil_sockaddr_get_ipv6scope(struct vsf_sysutil_sockaddr* p_sockptr); + void vsf_sysutil_sockaddr_set_any(struct vsf_sysutil_sockaddr* p_sockaddr); + unsigned short vsf_sysutil_sockaddr_get_port( + const struct vsf_sysutil_sockaddr* p_sockptr); diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/05-whitespaces.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/05-whitespaces.patch new file mode 100644 index 0000000..569ce38 --- /dev/null +++ b/meta-openvuplus/recipes-base/vsftpd/vsftpd/05-whitespaces.patch @@ -0,0 +1,81 @@ +Author: Jiri Skala +Description: trim white spaces from option values (Closes: #419857, #536803). + +diff -Naurp vsftpd.orig/parseconf.c vsftpd/parseconf.c +--- vsftpd.orig/parseconf.c 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/parseconf.c 2009-10-18 11:28:31.000000000 +0200 +@@ -275,7 +275,7 @@ vsf_parseconf_load_setting(const char* p + } + else + { +- *p_curr_setting = str_strdup(&s_value_str); ++ *p_curr_setting = str_strdup_trimmed(&s_value_str); + } + return; + } +diff -Naurp vsftpd.orig/str.c vsftpd/str.c +--- vsftpd.orig/str.c 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/str.c 2009-10-18 11:28:31.000000000 +0200 +@@ -89,6 +89,18 @@ str_strdup(const struct mystr* p_str) + return vsf_sysutil_strdup(str_getbuf(p_str)); + } + ++const char* ++str_strdup_trimmed(const struct mystr* p_str) ++{ ++ const char* p_trimmed = str_getbuf(p_str); ++ int h, t, newlen; ++ ++ for (h = 0; h < (int)str_getlen(p_str) && vsf_sysutil_isspace(p_trimmed[h]); h++) ; ++ for (t = str_getlen(p_str) - 1; t >= 0 && vsf_sysutil_isspace(p_trimmed[t]); t--) ; ++ newlen = t - h + 1; ++ return newlen ? vsf_sysutil_strndup(p_trimmed+h, (unsigned int)newlen) : 0L; ++} ++ + void + str_alloc_alt_term(struct mystr* p_str, const char* p_src, char term) + { +diff -Naurp vsftpd.orig/str.h vsftpd/str.h +--- vsftpd.orig/str.h 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/str.h 2009-10-18 11:28:31.000000000 +0200 +@@ -31,6 +31,7 @@ void str_alloc_ulong(struct mystr* p_str + void str_alloc_filesize_t(struct mystr* p_str, filesize_t the_filesize); + void str_copy(struct mystr* p_dest, const struct mystr* p_src); + const char* str_strdup(const struct mystr* p_str); ++const char* str_strdup_trimmed(const struct mystr* p_str); + void str_empty(struct mystr* p_str); + void str_free(struct mystr* p_str); + void str_trunc(struct mystr* p_str, unsigned int trunc_len); +diff -Naurp vsftpd.orig/sysutil.c vsftpd/sysutil.c +--- vsftpd.orig/sysutil.c 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/sysutil.c 2009-10-18 11:28:31.000000000 +0200 +@@ -1033,6 +1033,18 @@ vsf_sysutil_strdup(const char* p_str) + return strdup(p_str); + } + ++char* ++vsf_sysutil_strndup(const char* p_str, unsigned int p_len) ++{ ++ char *new = (char *)malloc(p_len+1); ++ ++ if (new == NULL) ++ return NULL; ++ ++ new[p_len]='\0'; ++ return (char *)memcpy(new, p_str, p_len); ++} ++ + void + vsf_sysutil_memclr(void* p_dest, unsigned int size) + { +diff -Naurp vsftpd.orig/sysutil.h vsftpd/sysutil.h +--- vsftpd.orig/sysutil.h 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/sysutil.h 2009-10-18 11:28:31.000000000 +0200 +@@ -186,6 +186,7 @@ int vsf_sysutil_wait_get_exitcode( + /* Various string functions */ + unsigned int vsf_sysutil_strlen(const char* p_text); + char* vsf_sysutil_strdup(const char* p_str); ++char* vsf_sysutil_strndup(const char* p_str, unsigned int p_len); + void vsf_sysutil_memclr(void* p_dest, unsigned int size); + void vsf_sysutil_memcpy(void* p_dest, const void* p_src, + const unsigned int size); diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/06-greedy.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/06-greedy.patch new file mode 100644 index 0000000..ff73c9c --- /dev/null +++ b/meta-openvuplus/recipes-base/vsftpd/vsftpd/06-greedy.patch @@ -0,0 +1,32 @@ +Author: Martin Nagy +Description: Fix file listing issue with wildcard (Bugzilla: #392181). + +diff -Naurp vsftpd.orig/ls.c vsftpd/ls.c +--- vsftpd.orig/ls.c 2009-10-02 14:15:18.000000000 +0200 ++++ vsftpd/ls.c 2009-10-18 11:48:29.000000000 +0200 +@@ -281,6 +281,25 @@ vsf_filename_passes_filter(const struct + { + goto out; + } ++ if (!must_match_at_current_pos) ++ { ++ struct mystr scan_fwd = INIT_MYSTR; ++ ++ str_mid_to_end(&name_remain_str, &scan_fwd, ++ indexx + str_getlen(&s_match_needed_str)); ++ /* We're allowed to be greedy, test if it match further along ++ * keep advancing indexx while we can still match. ++ */ ++ while( (locate_result = str_locate_str(&scan_fwd, &s_match_needed_str)), ++ locate_result.found ) ++ { ++ indexx += locate_result.index + str_getlen(&s_match_needed_str); ++ str_mid_to_end(&scan_fwd, &temp_str, ++ locate_result.index + str_getlen(&s_match_needed_str)); ++ str_copy(&scan_fwd, &temp_str); ++ } ++ str_free(&scan_fwd); ++ } + /* Chop matched string out of remainder */ + str_mid_to_end(&name_remain_str, &temp_str, + indexx + str_getlen(&s_match_needed_str)); diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/07-utf8.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/07-utf8.patch new file mode 100644 index 0000000..cf03e08 --- /dev/null +++ b/meta-openvuplus/recipes-base/vsftpd/vsftpd/07-utf8.patch @@ -0,0 +1,58 @@ +Author: Chuck Short +Description: Adding support for UTF8. + +diff -Naurp vsftpd.orig/features.c vsftpd/features.c +--- vsftpd.orig/features.c 2008-12-04 06:00:47.000000000 +0000 ++++ vsftpd/features.c 2010-02-25 13:28:06.000000000 +0000 +@@ -21,6 +21,10 @@ handle_feat(struct vsf_session* p_sess) + vsf_cmdio_write_raw(p_sess, " AUTH SSL\r\n"); + vsf_cmdio_write_raw(p_sess, " AUTH TLS\r\n"); + } ++ if (tunable_utf8_filesystem) ++ { ++ vsf_cmdio_write_raw(p_sess, " UTF8\r\n"); ++ } + if (tunable_port_enable) + { + vsf_cmdio_write_raw(p_sess, " EPRT\r\n"); +diff -Naurp vsftpd.orig/parseconf.c vsftpd/parseconf.c +--- vsftpd.orig/parseconf.c 2009-08-07 18:46:40.000000000 +0000 ++++ vsftpd/parseconf.c 2010-02-25 13:28:06.000000000 +0000 +@@ -28,6 +28,7 @@ static struct parseconf_bool_setting + parseconf_bool_array[] = + { + { "anonymous_enable", &tunable_anonymous_enable }, ++ { "utf8_filesystem", &tunable_utf8_filesystem }, + { "local_enable", &tunable_local_enable }, + { "pasv_enable", &tunable_pasv_enable }, + { "port_enable", &tunable_port_enable }, +diff -Naurp vsftpd.orig/tunables.c vsftpd/tunables.c +--- vsftpd.orig/tunables.c 2009-07-15 20:08:27.000000000 +0000 ++++ vsftpd/tunables.c 2010-02-25 13:28:06.000000000 +0000 +@@ -10,6 +10,7 @@ + + int tunable_anonymous_enable; + int tunable_local_enable; ++int tunable_utf8_filesystem; + int tunable_pasv_enable; + int tunable_port_enable; + int tunable_chroot_local_user; +@@ -146,6 +147,7 @@ tunables_load_defaults() + { + tunable_anonymous_enable = 1; + tunable_local_enable = 0; ++ tunable_utf8_filesystem = 0; + tunable_pasv_enable = 1; + tunable_port_enable = 1; + tunable_chroot_local_user = 0; +diff -Naurp vsftpd.orig/tunables.h vsftpd/tunables.h +--- vsftpd.orig/tunables.h 2009-07-07 01:37:28.000000000 +0000 ++++ vsftpd/tunables.h 2010-02-25 13:28:06.000000000 +0000 +@@ -11,6 +11,7 @@ void tunables_load_defaults(); + /* Booleans */ + extern int tunable_anonymous_enable; /* Allow anon logins */ + extern int tunable_local_enable; /* Allow local logins */ ++extern int tunable_utf8_filesystem; /* Server uses UTF8 Filesystem */ + extern int tunable_pasv_enable; /* Allow PASV */ + extern int tunable_port_enable; /* Allow PORT */ + extern int tunable_chroot_local_user; /* Restrict local to home dir */ diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/08-manpage.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/08-manpage.patch new file mode 100644 index 0000000..3a4f962 --- /dev/null +++ b/meta-openvuplus/recipes-base/vsftpd/vsftpd/08-manpage.patch @@ -0,0 +1,23 @@ +Author: Daniel Baumann +Description: Fixing manpage formating. + +diff -Naurp vsftpd.orig/vsftpd.8 vsftpd/vsftpd.8 +--- vsftpd.orig/vsftpd.8 2009-07-17 20:56:23.000000000 +0000 ++++ vsftpd/vsftpd.8 2010-04-08 05:18:00.000000000 +0000 +@@ -57,4 +57,3 @@ setting and any identical setting that w + .Pa /etc/vsftpd.conf + .Sh SEE ALSO + .Xr vsftpd.conf 5 +-.end +diff -Naurp vsftpd.orig/vsftpd.conf.5 vsftpd/vsftpd.conf.5 +--- vsftpd.orig/vsftpd.conf.5 2009-10-19 02:46:30.000000000 +0000 ++++ vsftpd/vsftpd.conf.5 2010-04-08 05:18:08.000000000 +0000 +@@ -404,7 +404,7 @@ reuse (which proves that they know the s + channel). Although this is a secure default, it may break many FTP clients, + so you may want to disable it. For a discussion of the consequences, see + http://scarybeastsecurity.blogspot.com/2009/02/vsftpd-210-released.html +-(Added in v2.1.0). ++ (Added in v2.1.0). + + Default: YES + .TP diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/09-s390.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/09-s390.patch new file mode 100644 index 0000000..4711f9b --- /dev/null +++ b/meta-openvuplus/recipes-base/vsftpd/vsftpd/09-s390.patch @@ -0,0 +1,15 @@ +Author: Philipp Kern +Description: Fix vsftpd on s390 (Closes: #602726). + +diff -Naurp vsftpd.orig/sysdeputil.c vsftpd/sysdeputil.c +--- vsftpd.orig/sysdeputil.c 2011-09-05 16:03:18.728857644 +0200 ++++ vsftpd/sysdeputil.c 2011-09-05 16:05:12.909423834 +0200 +@@ -64,7 +64,7 @@ + #include + + /* BEGIN config */ +-#if defined(__linux__) ++#if defined(__linux__) && !defined(__s390__) + #include + #include + #define VSF_SYSDEP_HAVE_LINUX_CLONE diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/10-remote-dos.patch b/meta-openvuplus/recipes-base/vsftpd/vsftpd/10-remote-dos.patch new file mode 100644 index 0000000..fee3ebe --- /dev/null +++ b/meta-openvuplus/recipes-base/vsftpd/vsftpd/10-remote-dos.patch @@ -0,0 +1,69 @@ +Author: Ben Hutchings +Description: Remote DoS on Linux 2.6.32 (Closes: #629373). + +diff -Naurp vsftpd.orig/sysdeputil.c vsftpd/sysdeputil.c +--- vsftpd.orig/sysdeputil.c 2010-03-26 04:25:33.000000000 +0100 ++++ vsftpd/sysdeputil.c 2011-09-05 15:16:05.347070790 +0200 +@@ -25,6 +25,11 @@ + #define _LARGEFILE64_SOURCE 1 + #endif + ++#ifdef __linux__ ++ #include ++ #include ++#endif ++ + /* For INT_MAX */ + #include + +@@ -1259,11 +1264,36 @@ vsf_set_term_if_parent_dies() + #endif + } + ++#ifdef VSF_SYSDEP_HAVE_LINUX_CLONE ++/* On Linux versions <2.6.35, netns cleanup may be so slow that ++ * creating a netns per connection allows a remote denial-of-service. ++ * We therefore do not use CLONE_NEWNET on these versions. ++ */ ++static int ++vsf_sysutil_netns_cleanup_is_fast(void) ++{ ++#ifdef __linux__ ++ struct utsname utsname; ++ int r1, r2, r3 = 0; ++ return (uname(&utsname) == 0 && ++ sscanf(utsname.release, "%d.%d.%d", &r1, &r2, &r3) >= 2 && ++ ((r1 << 16) | (r2 << 8) | r3) >= ((2 << 16) | (6 << 8) | 35)); ++#else ++ /* Assume any other kernel that has the feature don't have this problem */ ++ return 1; ++#endif ++} ++#endif ++ + int + vsf_sysutil_fork_isolate_all_failok() + { + #ifdef VSF_SYSDEP_HAVE_LINUX_CLONE +- static int cloneflags_work = 1; ++ static int cloneflags_work = -1; ++ if (cloneflags_work < 0) ++ { ++ cloneflags_work = vsf_sysutil_netns_cleanup_is_fast(); ++ } + if (cloneflags_work) + { + int ret = syscall(__NR_clone, +@@ -1309,7 +1339,11 @@ int + vsf_sysutil_fork_newnet() + { + #ifdef VSF_SYSDEP_HAVE_LINUX_CLONE +- static int cloneflags_work = 1; ++ static int cloneflags_work = -1; ++ if (cloneflags_work < 0) ++ { ++ cloneflags_work = vsf_sysutil_netns_cleanup_is_fast(); ++ } + if (cloneflags_work) + { + int ret = syscall(__NR_clone, CLONE_NEWNET | SIGCHLD, NULL); diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.conf b/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.conf new file mode 100644 index 0000000..28ad4e0 --- /dev/null +++ b/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.conf @@ -0,0 +1,105 @@ +# Opendreambox /etc/vsftpd.conf +# +# Please see vsftpd.conf.5 for all compiled in defaults. +# +# READ THIS: This example file is NOT an exhaustive list of vsftpd options. +# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's +# capabilities. +# +# Allow anonymous FTP? (Beware - allowed by default if you comment this out). +anonymous_enable=NO +# +# Uncomment this to allow local users to log in. +local_enable=YES +# +# Uncomment this to enable any form of FTP write command. +write_enable=YES +# +# Default umask for local users is 077. You may wish to change this to 022, +# if your users expect that (022 is used by most other ftpd's) +#local_umask=022 +# +# Uncomment this to allow the anonymous FTP user to upload files. This only +# has an effect if the above global write enable is activated. Also, you will +# obviously need to create a directory writable by the FTP user. +#anon_upload_enable=YES +# +# Uncomment this if you want the anonymous FTP user to be able to create +# new directories. +#anon_mkdir_write_enable=YES +# +# Activate directory messages - messages given to remote users when they +# go into a certain directory. +dirmessage_enable=YES +# +# Activate logging of uploads/downloads. +#xferlog_enable=YES +# +# Make sure PORT transfer connections originate from port 20 (ftp-data). +connect_from_port_20=YES +# +# If you want, you can arrange for uploaded anonymous files to be owned by +# a different user. Note! Using "root" for uploaded files is not +# recommended! +#chown_uploads=YES +#chown_username=whoever +# +# You may override where the log file goes if you like. The default is shown +# below. +#xferlog_file=/var/log/vsftpd.log +# +# If you want, you can have your log file in standard ftpd xferlog format +#xferlog_std_format=YES +# +# You may change the default value for timing out an idle session. +#idle_session_timeout=600 +# +# You may change the default value for timing out a data connection. +#data_connection_timeout=120 +# +# It is recommended that you define on your system a unique user which the +# ftp server can use as a totally isolated and unprivileged user. +#nopriv_user=ftpsecure +# +# Enable this and the server will recognise asynchronous ABOR requests. Not +# recommended for security (the code is non-trivial). Not enabling it, +# however, may confuse older FTP clients. +async_abor_enable=YES +# +# By default the server will pretend to allow ASCII mode but in fact ignore +# the request. Turn on the below options to have the server actually do ASCII +# mangling on files when in ASCII mode. +# Beware that turning on ascii_download_enable enables malicious remote parties +# to consume your I/O resources, by issuing the command "SIZE /big/file" in +# ASCII mode. +# These ASCII options are split into upload and download because you may wish +# to enable ASCII uploads (to prevent uploaded scripts etc. from breaking), +# without the DoS risk of SIZE and ASCII downloads. ASCII mangling should be +# on the client anyway.. +#ascii_upload_enable=YES +#ascii_download_enable=YES +# +# You may fully customise the login banner string: +ftpd_banner=Welcome to the OpenDreambox FTP service. +# +# You may specify a file of disallowed anonymous e-mail addresses. Apparently +# useful for combatting certain DoS attacks. +#deny_email_enable=YES +# (default follows) +#banned_email_file=/etc/vsftpd.banned_emails +# +# You may specify an explicit list of local users to chroot() to their home +# directory. If chroot_local_user is YES, then this list becomes a list of +# users to NOT chroot(). +#chroot_list_enable=YES +# (default follows) +#chroot_list_file=/etc/vsftpd.chroot_list +# +# You may activate the "-R" option to the builtin ls. This is disabled by +# default to avoid remote users being able to cause excessive I/O on large +# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume +# the presence of the "-R" option, so there is a strong case for enabling it. +ls_recurse_enable=YES +# +secure_chroot_dir=/dev/shm +local_root=/ diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.socket b/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.socket new file mode 100644 index 0000000..4505235 --- /dev/null +++ b/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.socket @@ -0,0 +1,8 @@ +[Unit] + +[Socket] +ListenStream=21 +Accept=yes + +[Install] +WantedBy=sockets.target diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.xinetd.in b/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.xinetd.in new file mode 100644 index 0000000..000f62a --- /dev/null +++ b/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd.xinetd.in @@ -0,0 +1,7 @@ +service ftp +{ + socket_type = stream + user = root + server = @SBINDIR@/vsftpd + wait = no +} diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd@.service b/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd@.service new file mode 100644 index 0000000..68e89d1 --- /dev/null +++ b/meta-openvuplus/recipes-base/vsftpd/vsftpd/vsftpd@.service @@ -0,0 +1,5 @@ +[Unit] + +[Service] +ExecStart=-/usr/sbin/vsftpd +StandardInput=socket diff --git a/meta-openvuplus/recipes-base/vsftpd/vsftpd_2.3.5.bb b/meta-openvuplus/recipes-base/vsftpd/vsftpd_2.3.5.bb new file mode 100644 index 0000000..5125843 --- /dev/null +++ b/meta-openvuplus/recipes-base/vsftpd/vsftpd_2.3.5.bb @@ -0,0 +1,100 @@ +SUMMARY = "lightweight, efficient FTP server written for security" +HOMEPAGE = "https://security.appspot.com/vsftpd.html" +SECTION = "console/network" +LICENSE = "GPL-2.0-with-OpenSSL-exception" +LIC_FILES_CHKSUM = "file://COPYING;md5=a6067ad950b28336613aed9dd47b1271" +DEPENDS = "libcap openssl" +DEPENDS += "${@base_contains('DISTRO_FEATURES', 'pam', 'libpam', '', d)}" +PR = "r3" + +SRC_URI = " \ + https://security.appspot.com/downloads/${BP}.tar.gz \ + file://vsftpd@.service \ + file://vsftpd.socket \ + file://vsftpd.xinetd.in \ + file://01-builddefs.patch \ + file://02-config.patch \ + file://03-db-doc.patch \ + file://04-link-local.patch \ + file://05-whitespaces.patch \ + file://06-greedy.patch \ + file://07-utf8.patch \ + file://08-manpage.patch \ + file://09-s390.patch \ + file://10-remote-dos.patch \ +" +SRC_URI[md5sum] = "01398a5bef8e85b6cf2c213a4b011eca" +SRC_URI[sha256sum] = "d87ee2987df8f03e1dbe294905f7907b2798deb89c67ca965f6e2f60879e54f1" + +S = "${WORKDIR}/${BP}" + +inherit systemd useradd xinetd + +CFLAGS = "${TARGET_CFLAGS}" +CFLAGS += "-DVSF_BUILD_SSL=1" +CFLAGS += "${@base_contains('DISTRO_FEATURES', 'pam', '-DVSF_BUILD_PAM=1', '', d)}" + +LIBS = "-lcap -lcrypt -lssl -lcrypto" +LIBS += "${@base_contains('DISTRO_FEATURES', 'pam', '-lpam', '', d)}" + +LINK = "${TARGET_LDFLAGS}" + +SECURE_CHROOT_DIR = "${datadir}/${BPN}/chroot" +RSA_CERT_FILE = "${sysconfdir}/ssl/private/${BPN}.pem" + +do_configure() { + rm -f builddefs.h + touch builddefs.h + set_default() { + NAME=$1 + VALUE=$2 + sed -e "s,^#\?${NAME}=.*,${NAME}=${VALUE}," -i vsftpd.conf + } + set_default listen NO + set_default listen_ipv6 NO + set_default anonymous_enable NO + set_default local_enable YES + set_default write_enable YES + set_default anon_upload_enable NO + set_default anon_mkdir_write_enable NO + set_default dirmessage_enable NO + set_default use_localtime YES + set_default xferlog_enable NO + set_default connect_from_port_20 YES + set_default chown_uploads NO + set_default nopriv_user vsftpd + set_default async_abor_enable YES + set_default ascii_upload_enable NO + set_default ascii_download_enable NO + set_default ftpd_banner "Welcome to the ${DISTRO_NAME} FTP service!" + set_default chroot_local_user NO + set_default chroot_list_enable NO + set_default ls_recurse_enable YES + set_default secure_chroot_dir "${SECURE_CHROOT_DIR}" + set_default rsa_cert_file "${RSA_CERT_FILE}" +} +do_compile() { + oe_runmake 'CFLAGS=${CFLAGS}' 'LIBS=${LIBS}' 'LINK=${LINK}' +} +do_install() { + install -d ${D}${sysconfdir} + install -m 644 vsftpd.conf ${D}${sysconfdir} + install -d ${D}${sbindir} + install -m 755 vsftpd ${D}${sbindir}/vsftpd + install -d ${D}${mandir}/man8 + install -m 644 vsftpd.8 ${D}${mandir}/man8/vsftpd.8 + install -d ${D}${mandir}/man5 + install -m 644 vsftpd.conf.5 ${D}${mandir}/man5/vsftpd.conf.5 + install -d ${D}${SECURE_CHROOT_DIR} + install -d ${D}${systemd_unitdir}/system + ln -sf /dev/null ${D}${systemd_unitdir}/system/vsftpd.service +} + +SYSTEMD_PACKAGES = "${PN}-systemd" +SYSTEMD_SERVICE_${PN}-systemd = "vsftpd.socket" + +USERADD_PACKAGES = "${PN}" +USERADD_PARAM_${PN} = "--home-dir ${SECURE_CHROOT_DIR} --no-create-home --system --shell /bin/false --user-group vsftpd" + +XINETD_PACKAGES = "${PN}-xinetd" +XINETD_SERVICE_${PN}-xinetd = "vsftpd" diff --git a/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd.bb b/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd.bb new file mode 100644 index 0000000..8fdaa42 --- /dev/null +++ b/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd.bb @@ -0,0 +1,25 @@ +DESCRIPTION = "Xcrypt/Cnx daemon" +SECTION = "base" +PRIORITY = "required" +LICENSE = "proprietary" +LIC_FILES_CHKSUM = "file://${THISDIR}/${PN}/Proprietary;md5=0557f9d92cf58f2ccdd50f62f8ac0b28" + +PV = "1.1" +PR = "r1" + +SRC_URI = "file://vucamd \ + file://vucamd.sh \ +" + +S = "${WORKDIR}" + +INHIBIT_PACKAGE_STRIP = "1" + +do_install() { + install -d ${D}/usr/bin + install -d ${D}/etc/init.d + install -m 0755 ${WORKDIR}/vucamd ${D}/usr/bin/vucamd +} + +PACKAGE_ARCH := "${MACHINE_ARCH}" +FILES_${PN} = "/" diff --git a/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/Proprietary b/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/Proprietary new file mode 100644 index 0000000..6618758 --- /dev/null +++ b/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/Proprietary @@ -0,0 +1 @@ +Proprietary license. diff --git a/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/vucamd b/meta-openvuplus/recipes-base/vuplus-vucamd/vuplus-vucamd/vucamd new file mode 100755 index 0000000000000000000000000000000000000000..8a434b2284ce2ce0996b2766c46b8de5c307f66b GIT binary patch literal 70300 zcmeIb4|H6`l_z}rk1QD*+_r^jh=BL3mfW_5X&VKEM+wi8Y|F$DVLQQ0oYB8-OA4|i zq_#0b0&Q7Luo*JrOxS$v zgmHhrU%h(LQ_BYO?dF_s&*^vk{9e_qx^?T`TeoiAs@A)I_4+j)k4K!#D+R)oHQ$nQ zJPR-JNPa-@Zb-g_|TI zsn4!=D+)8c1<%=drsi3SC)N&2;osu5RR8wRwp2fc^DMat<&L2IEIir%0+FsRj|48o zJ1?M?1k!U=N@SjXf)$XWY7fN~-@3>X$gPV!1>P?50`0`ci`rA zv;7dZ!)pWX>(rY_F`lM=Z@`nhB;VU`ufhFA+?U{9jr&U62JRZ%Gja1`zj?LdCNJx7 zFTw4;$g@J+Z(-s~pa9@Qxf}7WkxNlK!BG=>Dfx7~CmCoa%68E*P^k?zjtkXBS^7*>T zmHq>~SL61$@;2iAYdT$v=VtxBNk5%O3traaZo(banO^<8(Brl&!0%_JnfwawubwC0 zowe1S_}_e=3n9_I5Y2q~W#-pVR)-%<=MxUQK=@o}%T}b*+Rn^{)<28F2GR!L)XPEK zbx;`#&$-ZOXAB{!#^Q3+k91ga2F#l0oh2(!KY;pUfV2LcNH=V-!g^F8>{*PlLYGfRp}z!aas`N~ixEqogRlpj;|VN+3l{{;Vn@>!I(t_41g|0j4BEuL)e$4EDzez|V%uTZ`YX{Uex z9r*g9mJA@D{Y#^q1-MN=Yy;q1B9;tm{ELt-tG49p3g0Zb0)&tD+J3=Y?Om{z5#e#m4_`x{xS6TkfsOd zXb$OVhIi&$AapzmQM; zeidmUT(yTei1@>hze>-NKgScgq{l;{)S-Msl_i@rd>+cLpP=tD8DxE2WE1C*LG&** zUjmd5+gk~Mh5pqd&GGyjJZoL`tB~eZgnJ?G65!i(t0k3am;L(^jV4jB%XChlWwN-0k@DY)9JSX2dxwK^(CYufRpbm{|myA9@A-O z&T`~g5BQs3nH--lv3-~Pj)Cr|E1g970PuaN@%<~FuwAs^oO&dqvF=z)TTeXJUB9)vaa# zZ;_Vz=EnN1Q9PruZQFP9wY_nBM{{d^*S2_lytO;l7?ryl+v4bEPYg`y*#_1$H+Dy* zJB9}88#|))EquniWoL8uJzXpb&H}Cd?CfaVX}@moX^+LaFhRt7B(@V}cJy?0w{^s~ zN>3bI?Ut=N3F=y7JEPmTbpg`N4z_hR$J?={Xm6M1_RgM|;^I2Av!=Uq+p6yF#(Siz zu^aj5k7^M8xVyV89+T?USo575o8#-z>#nwr=FVtLAq8$S4-a-`N32`WBzoA^*e*Sd z0!pIN(be6#Lz-5w)kdTpu_tTYZ-cvy(>M4)%L{M|)exozm0Ud?$q2Qopqgx&~l7dehX_0bx-S z(KB08_05nMI^AVA+}PY4>xx5A%{v6*+|~$w#+pf7ef6rkTQ&h98*FZE>}Wx6lrD5{ z@0jcsM2#Bls543OMCU1eFgxDe*zKr=zi+=I*wxI2b$GnN1P{*cJzP(xmypg?2>hYwoyp)h+9)>({Tl z^$Y86T?#SXbzg)^MB6&*xA%ap^-BBe8>ywX9hsUHgBaJYUsqLK zzhc>niMI$$7%s*n7>_1OUyEU(hVbE5yv-8^8;Faddw_xL$7f@-x3?a>nbr|a) z%)o8KeN*6!fe_BihI=RAV{?is$2%ThWR8E!H=g_qdr16=UEZNhGt4{zzmAqgm=I67J5N1ModWLz+vW-$7Y~G{$0r^eOP4ofClFxV<&|1+5bA#1J|ajA5`G-?pvvddfqdfA2{y-GH7q$(nEBJH%v zy3RXku-hC9-bkjVS7Rs%K^oUB25qVhjavi@1GTK zPoxVq>?-t$Fn9kQI{qzV*K_C~&;CBE{x5YI=!N2I1Iko`-Zyl)a^23)bh!x1{gs9} zb*@I8Q#y~jTK+X#S5L!Mg<-2g^2~@KqsnHP{bP`II$$OepxGO$)4ceq=0#ZZz{1lb zGeW4JMExY{C(Xc^l4}Gy+Ul|kLD&+Gqsx?hy`i9tJ{rMTP9y?iCcNH$HRk+#92;U9 z7UbdG!#cN!Z#pSwONSC`@4m=v%wL3{YHv`q^XU%|LRu7z1bwfwpb+6EMmHwiQptf&gJ9-CB z?${06w(#hGL_NP0A9eaLias1WPamGveZYu4x<}P9P=~f3u`b|yQR90^1buaMl{A=%G{)VNYQ8kFn5B#^1|93gTM1owG?>_(q%AS-ZVoy8rOiX6 z;V5t^y`?P*LuaioRFy;TCh{HINEqq(XlwSkc@DHZJ5q%41D#gm2X;4QrV^?Td9piY z_NOt9h9>M>6>Y`fn3%zYkY29@V3(Q(JaP~=8!#i{Es&-ZmYSs^y|5!qYR+k=BzTYn4`2iA`Ghv$MVH=xAgfFLo@zCw--Gzv5B^`=SJeL(YRBZ9>?b(EUaPFEd#pc zmSv?X-#1`}A+LViiE(8!X!odR*e_w|0#``!##-l>u?Qp;_CpU3M#e7pOI3wmPFTp3 z#mfzOHBu6JMM{EgQnlC*Tlq7TE?8a?Y>|@4Dd@t%$O#ixE*L}lB%WJkQIKv?@d3~_ z!DB~XNq=k9=G$@5UjzCr`N2q~yf9KB-yJEJ=SL!PY@|${8wo>C-FBY#!AwI3N7F*y zn#a*U_Ok+UwIbVJ^~-~$>}MQ0zF-PKLJ=u;g};{gyiRkGID9?eMubkdwP!|_5%Bz##lO#q%Umk z<<9P!QZw?Pmw0Q7Y(Ll3IBx|`dtP67^dH1~y(M45yxddDx&fyi=sI8Bn{?em*vywu zx7<}X_z86*x-Q!)LjC(u|3=g|P>*dZdN0tfsp}dN*%v}x@?j}P!CCRGfIU3ASQ^kL z^g)J_`QY)T(iAXcd8r3u6nP{6g0^1BdFG=W268e&az9gY9N$5)w`jUjcxaRc+$YI=9i!p5m zHo>8^4hLm8>G$m3-pl2wM>+4zk)KAW_kL+Q06TRwPg)MVFAd<)gGuk)eBqqb zaQ8{fNj1P(t!zAHyflb#5%>xJ!izOps04g8E$&4(1>kcZeo5Xb&!GJqkS;{J2>1Ou z??#MEYc9`1EH5 zE*C&KtR*M<^_M6IhPe7*Y~b$K4}yox#EXOR-D zg-VQvFm9V8Cl==cUXAnvc-F`w=#ocnE_pX|^8)yQPfY6IJE%+jYgYQ#0RB-2p>HYj z_&sSp;E}g6mo^BUB$%xoW^4KsnnlMO;SH?SmfjY8tQ>H(XksWiWVdCaa` z`U$jzCTJPgJUBls#e04NJ3yS&13t;4x}8zw>s=%M$}v~|*sFcz+fR<}d{^=RgUqG{X8(1H4)gUfRc-?v#@n){si76@WNh0ejdBs zw{ExFJ@xP3Ulj4aG*adT-@V|w7ku|(o$SRr*=y5M<3+oN5~5;w{b}JmO<7YH;Tx*) zdX*Sgm^cQU3dZ@h8g~M^{dMT} zPUvzRy4(eSwH^LytM*sjcAqwzIRBH&R-XbL*>>Nb2q^mK%TgB$dh)JUGKeJ9`hqy_ zgU?6VWRLx?>#@yx?4!q37wa0;exA$=6+w1}9C(Ur>ojCWxxDAIWyQIGZMgBT0L_Pi zJCoT^n#p)WE2L`PMTiqDl!Fhs<-1T0{4r_rz=NVqdJnepq@FW~k9bKN*YP1asA5Ex zUb}P7a{6;x*D({5dhghyIXLn-J`HDsm;Ly-KAg_1QhmTa#{$yMJ&NC;FaE^*%1mZn zi2Sno9h=~{!-oRkCjIOy_1n>pd0Gw`__hC%nFn7FXP{hViBI(z(t@5Op(j|oKZkks z*(CHN2|ZD|n}D78Wkwc!1bRNHoWmoBp8ep3L+AP0{zuFM=YZGYpHr`0*W;R$GUb># zywM&rDd=@8^g0TA-2i*N1@?L~bbJ$Zybe0P9(q%&bzEfMfa2Yuv~X-OZsEb$!gzwd z>Nw!&xJ>F_0Qz?faYIK3pVc~;n5Ki|E9vGqSv;YG-cYG{=dmAd{iE)Y57a&C7u)BW zjXG#%+o672*Eqjn>=$P1(|^}QMO^jY*~YEN$@QR zz9qr8B>0vD->@!u7QW~+SeJ}~Mth#^g522;vo0Z+vw~dDnzcw9xZ%T^!8VU~fggus zaZ5BME3wX~Sc~<`Nm**G0X!e4?iZKPc72dpcPV4w&RWL|rYG^}^$+tnKQJapdB1p@ zo|hnR_ya0lnlBIZ`{coXzdSG~^57us#3K5F`LgXc6rJqq1)x!tPHwyA%6~gnkxRlm`$GarDh^d@_Ffv zpw4-HCr2lW5_^@79Lp=-Q=Rb2uQI-QA7!3Zc8vWgM}O3~ga0#As+Lf9evVkxvAoF9 z0>o+Zp-wZUko&Fsyi#0h_E*aiV}*OkcJFef_vN?&G^2g}<7XjO>d9<@rUlMbN`NW;l%)nY})8;?rAV zDxF37^^h;i{#fa{y^bcn0WEjOPx)aMJnHC0#8R~UXAP$uUtd2dNBHuedQI~9u0O)Q zRzil+zR2(%#_01V`Yfs)#HDDYaTX>|#nUb9aWgHR!U>%{?9c}OvTumDm)iW@r`9LO z^KK8B{pvR+;Dz<1YAgI>J-^uPT&dd$d8!^W`w_PdU=if0LfPoPw^sa}vJ=IKpAkR( zC-Regdl79T-Wzo5l`0dyLHT26GGhx&#NgPb+t$1bzlq%dzdqI4$JuY9E|K>f3*>#> z7i`|2!Wb$C?>}iB`1r2Jpm)%<3BI4)1D*_<@H5DJ*fET!{VLwz2Om8$uXHwsF8SxC zACcxgl$#m;>=Zs?&ld5Q2>Kg?ylTL^ZZ1ZUlYsDzmiVdD0jBN3|FtXY6-H}b6=SS*1 zh>d#?8}}eK?m=u^uO%6m;=WJn-rCUMy)9Vh&iJNJ-tAA_yJm3k-q@gD-cI3s)?P!N zeEK8UB#g@u?2&)32>bJ<4B_~-9aC!c4AT!tF7w#&sf^S`UPO7!^`(WdH?5w7h}9b2 zV$>;-;YIMfhS-;oq=#4!zVSpq0mHHUKxvt0XasBAA^#utL2ibUL&S4HwNvI92Hg)O zBfx81|Gz>-TBhU&@r67OJVyIN-W|^iAdWt&>`ErHHgztuCdIacz8Jo5ljU}+@*z*te%3peslnX;$9S{b^~qfU+V8*B z@%1+{@c$CT|4_2k^POZN;@cv>8W7Lo66$pY`g1*K^h&XKH8rzF^tCOpm-Ky zPhbsfV{FhTHHSd=ar%>NmuF*aUlO$GK5;MXBH0bPE=7DMANjum->MaT-H?}gXk0AN z*QsSzqjdj)QC1&(H6dqo`{aOX=N8HcvVTO|LFygb^hr|%)^laBgGt!IBeU=C_h3?_CR<`3}}SKTVyy zw|daH{zk;NV7C(cl+18$N!d5r5XK~JdlXAuDbFmT9q5BT;T&4vcwU#9?2qLKF4ueQu%98%n#ZUkrga+n z=iAG&KZCxo9jxW|(q5bJXWyo5w7n$`$2Mh;g+Wbc$g}pb|Egucx#;m~Jr`llZor&< zp*TQLovnQcJn6^%&E)ZW^Gee9E-V?l_Z{%`YgkV{je9-xW2k@Z-k%R1zjqdn{tgYM z?=AZl>_Go4S=&EHYWwHQI`Dt>V1cY1oGrD30a=Ij=bw#)N*^HQ&V0lAK%egkO1 zIbb#4Vec~S;3F*#K8{u5BF-|^5V!1f9Q*H^Ekx|U4Pm2dO!7Ia{wMLc%pTglA zJ@*(-L)&`Q*#1>!y|N!Xd&RR@KJh)lx;W4IM0R~tdg3hX95!d4IE8i8G00~p&g*W0 zeaA0=kBZdoXP;&WV{qtq#FBFfO(J*zIz^K+XMVpZLq}9ag?0+f;O6%#n7d z9lwiSRS$L6-`h7)$Dv^feE9}1S|F%RN=@$)uL zXOF;r)~pD6!nMaGz|Av*Q*i5cO$=1}!rUWp&f8rBI-EUhcRp>svwu*d+nwA$_%8Mj zp2z;dG3*~ahy8#<+y^;ryaQA9-ma z_Q}0(=%dQ7)ON2Du{xfYW^8OJ=*0N(GDf`_drb@FxuF$uY{-zY1y%CA^66n;pHlds z*X^KzvNMC&SB4(i`rqKi8DiL#gxVh~g8ir8crw4~@K}D}NC15zU4@7t6OSF+{w`wR z&m#tY3^DNM5CeY}@zQ6K=<7r*oM*fL0eV2X%u@|h`Uc-|V5e&gQ@%Eh)^y#{@XZH#@MZ!dDWyd5?N$MH86;GbYFX_PU)*)=9FcU>Z8*DD^g>m*Fo z$-N#qu~*9c_=64bjSNA254Y6|pXo35E{*s-X6+Eh&`BHsI%aNR{)+k<(4O}?JWtf_Ly}wVm8e1n44p=G*ab}mH9G*c#O5k`%4usUb?g2 zV@7&CX1L9>H1II$uNHIXFFZ>dUKdGtE6s|e$Fv^A4rx{S(je)1NpRb@+xTq&YkNkXDt8R zxr61D`RgmsV?)57mq8DCW8$1=C~`tRLpfVf^zH4?%UE&22W9NE>>}`m=ft?qW}Auo zC(kf5Z5oeDfh71kO&8w;Z8l9j2mKOgtAd>v_t6$*GOvbIAJI0?;Ckd$*hI#E1^DbT zU*~u>#KV44KZq;aripl=i~hZ`z>5V2e~py~o%8MGnKl!@=a4IWps@-3#{N3iW5t2B zcz-8yDf%@7za8P(s7$7+Boyeyn3`%YiQ5a@n0xjLya#noPUFL`rKjNg1?F(#Q~FZ( zw!-;O=oj(YGy(_W;ige7Jo^wpeaffoMq55|+h= zqXqj|3Hw;#>_O31BPLg1$A!R~e2n!+m9JzTPbgk-&qi1dybGcn)|Gb5@{lzReg)up z4m>>_el_6ui$-?+)O5H3xZi>I+wc(b*#2zflLpeGWSP+Q&*E<-K(7v|wX8EoHVlhc z!z>s0hOIx`Z_1uSLldy+>)e_NSYleeEfX+n8mxT+W=wj(Y!=`P)+J?#nWE*$g?Wd>pq=7Pyc56em zCq#yeZJEe-WKSLOY1tqSt>PDM_$#%8X>W(8@ z?2Rcn{+iXKY&8v(SxCbXYg0VJZ*|ms7`ks*@t{cOvo9=PabJzf$9c{vJY9cZROMsO z9Q{8(zr$H|qWATwI>dcQ+bj5Q`UfA8@{)L!tyxw1CjH`-APrx@lv7}GOE?^_Dzxo60ufC9k zjlllu^VnZKhI60KC1E3yun~w^+kQm@?5u$`l)W!lGw_i17ZDF##I{fAIJeUua)mU0 z9r{T480-}DxcAQ|<94$^H|*;^rq_V>n~^?^{2$|qb&kq^9cjYhckRnV9)J5q+sE^w z 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 fY4>fUojL@CE_SCTVa(OCWieImta`Kmb87v+M$