From 45f1cff5ce9364e781be5fc0819eeb2e2f6cf62e Mon Sep 17 00:00:00 2001 From: srs5694 Date: Tue, 20 Oct 2015 15:59:36 -0400 Subject: [PATCH] Cleanup for better tracking of copyrights and licenses. --- CREDITS.txt | 22 ++-- EfiLib/gnuefi-helper.c | 15 ++- EfiLib/gnuefi-helper.h | 15 ++- debian/control | 2 +- debian/copyright | 191 ++++++++++++++++++++++++++++++++++- filesystems/crc32c.c | 17 ++++ filesystems/fsw_ntfs.c | 2 +- filesystems/scandisk.c | 15 +++ icons/func_exit.png | Bin 3667 -> 3017 bytes icons/func_firmware.png | Bin 3521 -> 3450 bytes icons/tool_memtest.png | Bin 3349 -> 1869 bytes icons/tool_mok_tool.png | Bin 3472 -> 2908 bytes icons/tool_netboot.png | Bin 1930 -> 1979 bytes icons/tool_part.png | Bin 5423 -> 3014 bytes icons/vol_net.png | Bin 2280 -> 2683 bytes icons/vol_optical.png | Bin 2689 -> 1985 bytes libeg/image.c | 21 +++- libeg/lodepng_xtra.c | 19 +++- libeg/screen.c | 17 +++- mok/COPYING | 8 +- refind/Make.tiano | 2 +- refind/Makefile | 4 +- refind/config.c | 17 +++- refind/gpt.c | 16 ++- refind/legacy.c | 17 +++- refind/lib.c | 17 +++- refind/line_edit.c | 217 ++++++++++++++++++++++++++++++++++++++++ refind/line_edit.h | 38 +++++++ refind/main.c | 17 +++- refind/menu.c | 19 +++- refind/screen.c | 211 ++++---------------------------------- refind/screen.h | 4 +- 32 files changed, 672 insertions(+), 251 deletions(-) create mode 100644 refind/line_edit.c create mode 100644 refind/line_edit.h diff --git a/CREDITS.txt b/CREDITS.txt index 887e892..53011ad 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -75,21 +75,21 @@ Icons and graphics: ------------------- * I replaced many of the original rEFIt icons with icons taken from the - Oxygen Icons project, either from the Oxygen Refit package on its page - (http://deviantdark.deviantart.com/art/Oxygen-Refit-70199755) or from the - oxygen-icons version 4.7.4 package on my Gentoo Linux development system. - These icons are released under the LGPLv3 or GPLv3. If I'm reading the - pages correctly, the original creator was David Vignoni (aka - "deviantdark" on the deviantart site). + Oxygen Icons project, originally from the Oxygen Refit package on its + page (http://deviantdark.deviantart.com/art/Oxygen-Refit-70199755) or + from the oxygen-icons version 4.7.4 package on my Gentoo Linux + development system. As of version 0.9.3, I refreshed these icons with + versions from Ubuntu's oxygen-icon-theme 4.13.0-0ubuntu1 package. These + icons are released under the GPLv3. If I'm reading the pages correctly, + the original creator was David Vignoni (aka "deviantdark" on the + deviantart site). * Erik Kemperman provided the rEFInd icon, which is a combination of the common refresh/reload icon and the search/find icon. -* The keys icon for MOK keys management comes from the - kdeartwork-iconthemes-4.8.5 package on Gentoo. - -* The memtest icon (tool_memtest.icns) was originally memory.png from - the Gentoo kdeartwork-iconthemes-4.10.5 icons package. +* The memtest icon (tool_memtest.icns) was originally memory.png from the + Gentoo kdeartwork-iconthemes-4.10.5 icons package, and was subsequently + updated from the Ubuntu kdeartwork 4:15.08.1-0ubuntu1 package. * The gummiboot icon is taken from the gummiboot Web page (http://freedesktop.org/wiki/Software/gummiboot) and scaled down diff --git a/EfiLib/gnuefi-helper.c b/EfiLib/gnuefi-helper.c index 2c344b1..d4f269d 100644 --- a/EfiLib/gnuefi-helper.c +++ b/EfiLib/gnuefi-helper.c @@ -2,11 +2,16 @@ * EfiLib/gnuefi-helper.c * GNU-EFI support functions * - * Copyright (c) 2014 Roderick W. Smith - * With extensive borrowing from other sources (mostly Tianocore) + * Borrowed from the TianoCore EDK II, with modifications by Rod Smith * - * This software is licensed under the terms of the GNU GPLv3, - * a copy of which should come with this file. + * Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.
+ * This program and the accompanying materials + * are licensed and made available under the terms and conditions of the BSD License + * which accompanies this distribution. The full text of the license may be found at + * http://opensource.org/licenses/bsd-license.php + * + * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. * */ @@ -307,4 +312,4 @@ GetNextDevicePathInstance ( } return ReturnValue; -} \ No newline at end of file +} diff --git a/EfiLib/gnuefi-helper.h b/EfiLib/gnuefi-helper.h index 2a2fe07..694988a 100644 --- a/EfiLib/gnuefi-helper.h +++ b/EfiLib/gnuefi-helper.h @@ -1,12 +1,17 @@ /* - * EfiLib/gnuefi.h + * EfiLib/gnuefi-helper.h * Header file for GNU-EFI support in legacy boot code * - * Copyright (c) 2014 Roderick W. Smith - * With extensive borrowing from other sources (mostly Tianocore) + * Borrowed from the TianoCore EDK II, with modifications by Rod Smith * - * This software is licensed under the terms of the GNU GPLv3, - * a copy of which should come with this file. + * Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.
+ * This program and the accompanying materials + * are licensed and made available under the terms and conditions of the BSD License + * which accompanies this distribution. The full text of the license may be found at + * http://opensource.org/licenses/bsd-license.php + * + * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. * */ /* diff --git a/debian/control b/debian/control index 344ebdb..7820838 100644 --- a/debian/control +++ b/debian/control @@ -6,7 +6,7 @@ Standards-Version: 3.9.5 Build-Depends: debhelper (>= 9), gnu-efi Package: refind -Architecture: any +Architecture: i386, amd64 Depends: ${misc:Depends}, efibootmgr, openssl, sbsigntool, util-linux, parted Description: boot manager for EFI-based computers A graphical boot manager for EFI- and UEFI-based computers, such as all diff --git a/debian/copyright b/debian/copyright index 1ceeff4..a8c0f36 100644 --- a/debian/copyright +++ b/debian/copyright @@ -25,10 +25,195 @@ Upstream Authors: Apple, Inc. Copyright: - Copyright 2012 Roderick W. Smith - Copyright 2006 Christoph Pfisterer -License: +This package builds two EFI application programs and several drivers. +Documentation and icons are also included. + +* The main rEFInd binary (refind_x64.efi or refind_ia32.efi) uses source + code with various licenses, all of which are compatible with the GPL-3, + which is the overarching license. +* The gptsync binary uses source files that all use the BSD 2-clause + license. +* Drivers all rely on a BSD 2-clause base. Beyond that, things diverge: + * The HFS+ and ISO-9660 drivers use GPL-2 source files + * The Btrfs driver uses GPL-2+ and GPL-3+ source files + * The ext2fs, ext4fs, ReiserFS, and NTFS drivers all use GPL-2+ + source files. +* The documentation is licensed under the FDL 1.3 + +File-by-file details are described below. + +Files Used to Create Main rEFInd Binary +--------------------------------------- + +Files: refind/* + libeg/image.c + libeg/screen.c +Copyright: 2006-2010 Christoph Pfisterer + 2012-2015 Roderick W. Smith +License: BSD 3-clause & GPL-3+ + +Files: refind/icns.c + libeg/* +Copyright: 2006-2007 Christoph Pfisterer +License BSD 3-clause + +Files: refind/gpt.[ch] + libeg/lodepng_xtra.c +Copyright: 2014-2015 Roderick W. Smith +License: GPL-3+ + +Files: refind/crc32.[ch] +Copyright: 1986 Gary S. Brown +License: "You may use this program, or code or tables extracted from it, as + desired without restriction." + +Files: refind/driver_support.[ch] +Copyright: 2006-2011 Intel Corporation +License: BSD 2-clause + +Files: refind/line_edit.[ch] +Copyright: 2012 Harald Hoyer + 2012-2013 Kay Sievers +License: LGPL-2.1+ + +Files: EfiLib/* +Copyright: 2004-2011 Intel Corp. +License: BSD 2-clause + +Files: libeg/lodepng.c +Copyright: 2005-2013 Lode Vandevenne +License: zlib + +Files: mok/* +Copyright: 2012 James Bottomley +License: LGPL-2.1 + +Files: mok/mok.[ch] +Copyright: 2012 Red Hat, Inc. + 2009-2012 Intel Corporation +License: BSD 2-clause + +Files: include/* +Copyright: 2006-2010 Intel Corporation +License: BSD 2-clause + +Files: include/syslinux_mbr.h +Copyright: 2003-2004 H. Peter Anvin +License: Expat + +Files: include/RemovableMedia.h +Copyright: 2005 Apple Computer, Inc. +License: See comments in file + +Files Used to Create gptsync Binary +----------------------------------- + +Files: gptsync/* +Copyright: 2006 Christoph Pfisterer +License: BSD 2-clause + +Files: gptsync/gptsync.c +Copyright: 2006 Christoph Pfisterer + 2013 Roderick W. Smith +License: BSD 2-clause + +Base Filesystem Driver Files +---------------------------- + +Files: filesystems/fsw_core.[ch] + filesystems/fsw_efi.[ch] + filesystems/fsw_efi_lib.c + filesystems/fsw_efi_base.h + filesystems/fsw_lib.c +Copyright: 2006 Christoph Pfisterer +License: BSD 3-clause + +Files: filesystems/fsw_efi_edk2_base.h +Copyright: 2012 Stefan Agner +License BSD 3-clause + +Files Used by ext2fs, ext4fs, ReiserFS, NTFS Filesystem Drivers +(Used in addition to Base Filesystem Driver Files) +--------------------------------------------------------------- + +Files: filesystems/fsw_ext2.[ch] + filesystems/fsw_ext2_disk.h + filesystems/fsw_reiserfs.[ch] + filesystems/fsw_reiserfs_disk.h +Copyright: 2006 Christoph Pfisterer +License: GPL-2+ + +Files: filesystems/fsw_ext4.c +Copyright: 2012 Stefan Agner +License: GPL-2+ + +Files: filesystems/fsw_ext4.h +Copyright: 2006 Christoph Pfisterer + 2012 Stefan Agner +License: GPL-2+ + +Files: filesystems/fsw_ext4_disk.h +Copyright: 2006 Christoph Pfisterer + 2012 Stefan Agner + 1991-2012 by various Linux kernel contributors +License: GPL-2+ + +Files: filesystems/fsw_ntfs.c +Copyright: Samuel Liao +License: GPL-2+ + +Files Used by Btrfs Filesystem Driver +(Used in addition to Base Filesystem Driver Files) +-------------------------------------------------- + +Files: filesystems/crc32c.c + filesystems/gzio.c +Copyright: 2008 Free Software Foundation, Inc. +License: GPL-3+ + +Files: filesystems/fsw_btrfs.c +Copyright: 2010 Free Software Foundation, Inc. + 2013 Tencent, Inc. (Samuel Liao) +License: GPL-3+ + +Files: filesystems/minilzo.[ch] +Copyright: 1996-2011 Markus Franz Xaver Johannes Oberhumer +License: GPL-2+ + +Files: filesystems/scandisk.c +Copyright: 2013 Tencent, Inc. (Samuel Liao) +License: GPL-3+ + +Files Used by HFS+ & ISO-9660 Filesystem Drivers +(Used in addition to Base Filesystem Driver Files) +-------------------------------------------------- + +Files: filesystems/fsw_hfs.[ch] +Copyright: 2010 Oracle Corporation +License: GPL-2 + +Files: filesystems/fsw_iso9660.[ch] +Copyright: 2006 Christoph Pfisterer + 2010 Oracle Corporation +License: BSD 3-clause & GPL-2 + +Files Used to Build iPXE (not built by default) +----------------------------------------------- + +Files: net/* +Copyright: 2009 Michael Brown +License: GPL-2+ + +Documentation +------------- + +Files: docs/* +Copyright: 2012-2015 Roderick W. Smith +License: FDL 1.3 + + +License: GPL-3 This package is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/filesystems/crc32c.c b/filesystems/crc32c.c index 343fd21..ec10d25 100644 --- a/filesystems/crc32c.c +++ b/filesystems/crc32c.c @@ -2,6 +2,23 @@ * this file take from grub 2.0 * for btrfs UEFI driver */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2008 Free Software Foundation, Inc. + * + * GRUB 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 3 of the License, or + * (at your option) any later version. + * + * GRUB 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 GRUB. If not, see . + */ static uint32_t crc32c_table [256]; diff --git a/filesystems/fsw_ntfs.c b/filesystems/fsw_ntfs.c index 86db271..2fda530 100644 --- a/filesystems/fsw_ntfs.c +++ b/filesystems/fsw_ntfs.c @@ -1,7 +1,7 @@ /** * \file fsw_ntfs.c * ntfs file system driver code. - * by Samuel Liao + * Copyright (C) 2015 by Samuel Liao */ /*- diff --git a/filesystems/scandisk.c b/filesystems/scandisk.c index 6ae5cf8..d8b862a 100644 --- a/filesystems/scandisk.c +++ b/filesystems/scandisk.c @@ -5,6 +5,21 @@ * * Copyright (c) 2013 Tencent, Inc. */ +/* + * 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 3 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, see . + */ + #include "fsw_efi.h" #ifdef __MAKEWITH_GNUEFI #include "edk2/DriverBinding.h" diff --git a/icons/func_exit.png b/icons/func_exit.png index 2038cfcec423771ded786d1ec6fdb301106cf7bd..9ae1f1fb363260308b2c8bcaa0b215654e3ef1d5 100644 GIT binary patch delta 3012 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 diff --git a/icons/func_firmware.png b/icons/func_firmware.png index f4180822ad9730db878159367f9631508fec0b6e..4ac82cec47b7fd81dc5b5cc5c7cabe6d8bc73119 100644 GIT binary patch delta 3324 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 IM6N<$g6~3YX8-^I diff --git a/icons/tool_memtest.png b/icons/tool_memtest.png index c85bf9e3c4aee056f5915d7974e2e90e45d274d3..d1f80ea1a01c37e41737b600bfb2a06a242c3fc4 100644 GIT binary patch delta 1837 zcmV+|2h#YJ8qE$NiBL{Q4GJ0x0000DNk~Le0000W0000W2nGNE0CReJ^pPPqe+J)4 zL_t(|+QpY?Y!v4mho70*`?Po0Ya4uFf+0W%HkjKucAJC{FwH@sQI9XQY1J<+p{-C= zq|jnolBoFe~_xCgDHclfRIM^e6~s>g0eZhA6iEr$ppm!d1RGF z-rLh#Z9Zdt>Ye1zY1fZ1Mr0;4CLqksxn<5@7Cf3$>U_dghg)9$zY!3CZ2Tm5vF#Nt zdy3MTu%md)FlDx#FY@|*E5fq^JbB=A+y5!f3$la0eQ`& z3yd~5e;O{gyrO0Wff6bq-pJaLV0`B&E2~-q>eBW@qPL_24BqSlk=f8#su%@;K z%2Ty5kBh~gM=4W^xbx9@>`Bl~16fFzy5RJK*XYPG00r!J@-m_f{H?7g`lrMux_%Q z!XfDa>1ROE=MxYTD8^Rbd~KU*_3&8Mx*>sCbYHqmrs9DixGXCqk{ZP!jqsv{ye(hD zFbq~2F%G&~`4*SxZ0yyK7a+zsgAiHoWaj#{V(|SIs)$uYfxK91s$c)!6Qs)nA)P zIjG2doKk;2e++h0=nn9hwG7`th(5iSW7f+I%qZfwpR{nTzmFf4)m>j>Ry1i=5ZD%aRK5NWqgV$uH*P_m5*UA*rWGX*!W1_!MtH z;n@p#wY8ZWdW3K02RT}Dl{?-fP0i>u#T$vI|2Q5T!1C|S2}fS?=!Fmqa6`Gp2i^B@ zV;P?9k}goy7$sA6@=GhI{on*Wkxr^}ZTum>e}xuZ@YFlLRBuE42r<2G1gE5%uR zY#81+0&g0HPej0}f5$|~T3Vx9>p)MZK?wQ`l{4vH;zpW>XDB>Wxtd*nKTA|dJYSke ze|=>uEf$%l>;0*L&zkQB8i6Rl#08oMek`I=hw1Mk=DmhCB(QeHSNQhhHFQKeX*Ta* zOqLa+HCg|AZ!-Fx+CW0z&B#}cFPi`QYZh`mE3eP!wtY8We<)8b z6;J%&VWGBIM8i>8_-gzKoYwuoTEN9fCRYF;XsfYo^!F;?D-_?~Q7QKBw+Zh$kBZCs z7O)C%0(^M_03qA6mgju;!Y|Gc)MO@cDPuODd;x&4^=mA!pTcL^H(v9}7Z^tp$3ORX-@9*rPfy#E(1HXQNq_@l30v6gI*NmF5nyD4i9-{+O_#|u zGo8+~WjbTK)0vLjasRN}c!GhDAta7tJ1I4|W)VVQj3mH-&1R4gAkg;q<-U90y}f7< z9>Qp*M%3Wn%$@uG{C>~*oZmU;e?G}HO}@@Y@O3{{2DqZ zAOy${u7Ssk8|?vosF;e}z;ez=VY%JoWM#<~d&m$^rZRGw?^{4Z^2yE1zc%Mola7 z0}?BIk1)@Cn3-KAFre~-5B`A)PZ2LIc!6ZXper7rdVWYar-`-9b!-620NYn@;E~GJ zmiV`;7Rk;*t&qV!_Kf&raL z=h6s0M}KkvkN}7#B(9{#QnRQ6=S+D$i|j7~Wq|$O8(1*Gf5JxH6#6Fia6F$>#KsGg zpP@i_`Q+FE#_9P;cH5A6>$#Qvw5sFrb+Wo<7SqI3zyuR81v88U<&gxPY9Zt21fh%- zzziVo-Wr(yP?IJ8jpEswD;zB(9dYuL>CaK)sidvFnJOcIu*4%VY~ZH&9A4!T4fB@p zu`k3i{S=roe;6{gxfK7!8Q!v=qE;EC`(y&T=>@6*@4ahe^J5O{_)l;$y8DxCW%}O$O%HTG(VZ70$@of8)_2GEoPAxA0F13Kwlh_ED#l zfGjXEZ^tH+BhSKS>5>Naiz0qL@D94EgK4MUi1SPT1;+Zb>{4tz^QnX07NeVww7ukL z1=@k|=rb^<&cY`BM*fVHGZro-6SpBL&~f<`CH)4IU1el)8m5s00L+`>b==O2ta^MI zd$M`Fe|~8T2m?%oS~JPJ#pkK?WjT76!?~q6&bUf}0tXcjfyR`tXUEB($0fvPQ33isB zqp~o|2bzs#ZBC-Cxh@W8_S_WTGAw>{jqIC~f7e;!Hx<-p>{7A{HR|S(&@6-@@XB5a z^KD$r>!B^)g{f*VEIygV<2}pDrAuj63wZ6^FVGDQ3=11!VN-2k6SA;L*?8`VlZX|0 zKF;jL;J_b>2e93x_$Fat6POxv#`;Pjqp)JaVuEiSW4}{1j6xL5$i3f%L>t~q~DCbhVmu-;_61EK3Wr7w~bCVU+IQm$zyn&s) zUVe7+H)y6xprC^4%sDpJc2HGnMgFSHf75$CL=Nj+w5RrA(0W_sM>WjNnzByHPjB)~ zj@whcMd&dXFU)MhFC6q-`IPY<{Ph=84~e zVdC-@vaZC>mijYPRb|=PBlFxow7{80+}t|$q{GzdI?6-f5i{y zts)@1IeWH^I)5oS$-GspHdCTIF~INj)5MhwNG2Y49(GwGrKQjjO!lPNvEVZ*%2W^iJzp0)~r)Sr=}h00K=*f1?OHS&^nVzn|B>agK@!Du=Gftk`LZKW_GLG`SD> z=r-}A+KJ~*YQ&>%b=3{H)axN~VJCn6#PcVlp9q=NnOe+bR5Ys8(| z=ol9c>U|;1xQ`!wr-@Q;J_lNMQEvBsG28G(hfSt6T%2W|CH_FRh+Vxc3}y$1>Z8V? zv8DJjzw-$GEv}(;Po8k@PFQ;$h4!I2H9*De_hjW;*%p9Pb2GRcy#sx4(LU^dG6O-OZK4&2M-CAw@c14 zyJ(O{ol)dIfqC2#eQ;MIzcY~h29dDfZ=ZUG5`RA1-`Yf( z-9yeaF*NPAsWO!|@Hsx`i6xJ*bI`-)&)&i?R3=tUVU8RACifAOe~L2f*JZx&rNLh0~dzH-@So_4>d~e^hPlz>=DYc26OyMMQm5uBf2=cG3 z8$lQ#6l#9}{y1Ba?BaOYnId z7USB`Eu&iRHg%9byMbhwNN@`qzo(1!&#dCZ{s6DGya_|Ie~m)Dl3>@&vrHSW)0`Hp zJbY7pTVw?BqcI@!PZSM!^s9v=t|?@-Gy}01x}jUY)uC%L8t!9%teXMLgg_#50~_B( zo?X3)gOO5xcKA2gWtpmqDSW%w#rv;x5JIirr>dVnLTwTny%523v*4nv5fTcXX~G(Jyyo6yEkK#B#H~G zSX&)pQ~hyjt5uo@1&s%NT<;K8lZx&cDe|K?(9-=Xo#q>6!fBc*n_=d1rWEQSo=Oq$ z_}Q@Thy2BpPazow;aHf~WGB6)A$DDI@Sn}U!f96sf2T4OL{IX(_jSfpB>C@N!IOLZ z^mp7~K75a`8M%nU}G!Jq8)(|eT59FGn+sr{oDKk_xI0hc)+`44J?14v@AaI0v} z6oWB|f6R><$Rr2_^N7UKAOXT0dJ?HL6WuA^TY7=Y>MVONN<96cpTu#xIU3nLJllNP zd;V@Zu@3am8QWrB;#DmoP^vGXN@+^-2bncd!Ni8&?FQ2T3D9lSdsBR{;yjfTv+TGa zSpI&1#4)qWiu}+TI2vs3b{3L>Ql=OFvzTD4f3fA8A`l;gp0Q&{`2>BQp&37#Oi}Mo z@yo^w)YMwooD!`6z(?OvsheX~4LTKf*vxLDr#*vKU3`q-dS~?v2_+Urz~vV_mMbp3!8)YTKwHCGMzCV_|S*E^l&Yo9;Xs000WvNkl3&26+ZLc z>@&8(7MR6sHV~Vzgx$0>Ar*qsu$8K);zxl$X(ZrJYmf;@NPh%T15*2=EhtolU=dX8 zKtk-8G^G@%*>NG5&42}j&Biv~mw9hyUcYnn-t3D}CJIzI)$%-?``9d+r@O z48x%R=i;Q7RIXpY?k+Dc9~TaXC+oUSFihFQhY!m)ZQ7*8Q$Vj~;P~<5L)+Wib2Uwy z53k|p20HUdC?6)e3e7!3AH zPEIBWAbwXvLxa>HOerZT(q3I%O{Y$ss&lzqo0cwJ`p5sNfTKr`4t6@7pJ3eVzJ2== zyUX3XcZGN)5+R-ehr>aQjg113rmG9*ogm|FUt5-|E%F4<|0|ySw7&B&! z_DTgDJ9g|a`v1h|^NH121doTH=OFzD;1UE}YHMp_;!_YCQ&6u?N=iy*VV5soriBX^ zlE>pAJb(Lq=FFK(UYP)p|1pSu0rzpi@=TCPu!sT#@(0V7EvtXgxLvz;^@W>#4A=S@ z6F-0cJgr~9p6=Ya6UGcJnm&DcN!$gTIB~)Wl8+FOsc-=aN*>pzPoEDLEn4&&>O$GE zW5)&r_LkPxRtfBR^XAdhr%$W#|1`uyxTgY?u77lDYHC`{z}#hXufgMF9NxIQ6i=;-|47un?=MPuvCIOI1MJ z2g@i6YN8$%jBVt1aA|32;nhryw*X57f4OWzTzVlumQgM|t2=k@%gZ$Gv;^=-RbwR@>fLvt}(_vu4fHQKLpJL(|_NA~_xctQhFEh%;x-u=TB__1F3N z`Gt=jJ({p`<;q)cqoDaLL}a{f0)+gPD_1y~vo~)AXwRNKHHQuz8b5dL+)@Y`jeox9 zAYw+3lDR)`U!jdmAEgEYe&z3{%BZ=uog%V!J1F4u(B$zMXSdS1YObWCfkSc$w^F<4G0OiC@v2vs)rn^OX#s6J=8&e+W#e0epgEm9)CQblP6D# zA*`Z8JZAZa;Pek${`BF10Ry&d*s!4jkJhPy9&xFq(vkpsi>%slO6U2Nz={J2+Rbp zYgWU$b?ZJx=K6kKUfw+zVt)pnRd+dv6(tH7CKM8vAaM-=0nrG~!a8Ok)C@F`-cn2L zE%hMYM!FWJ2%bwSu5lbhW9R2#!-g?=5tEjdMrKI@{t9<{%WBxZefuxb=d1bi=Z_$w zVmu3Ua}_cKQFA4NkQlgd<#aj#rwJ8M(AQx>`ZTp^@*Dyf;y#&~nSXqLBqD|m9ZF^y z1pL!}R)EVb8a{mZ1%T7p4M<6PjdO>5HcJpF!aF`d%_&FZ^y$;@PMkRLI>zu}YG*gn=_trB9G&2FsQ@ph z3X`#}Qmm{sRyzQ8w|}5dkvOu87&K^*xDpOIa@rd)VuZXKMFn=@^A5m)d!;tqY~+}< z-bYhzmjqaGZduZfh*d`z5t#uHvrcbfRea_)xR61Ur)En&g?CAt6%R-uL~K=6m54}B zPq$NG(uE*A@&5h$IXuoRzjAghmA2rB!72*F0VoUwoy6)0YJcfR@;R)M9#JXmA4TJ` z-k^r&kdTC5i)hQ0Kw8>xTR~Vl`F-|-&rbzXVqEfM2D*DDu-CAp9rl@u)#0dvnjFI@ zZA6wl$Ay;Mo#IGocO_nyWo7Euub*613i-|)SZo<)aX!ZUwhIE-3WAumqPAeRi?Gj- z6$=K&U${%u)PHVR1f*WRd^t^G(s)#rRHU5dmk9_PF0z2s!#sUBz4pGL)EUK=m7V;QQWtYk*J3BizOT~xt z>H7I%@_60mZmmi`J*vb*00*hS?*Fnu*?}H7wSVbE38SgzSq+nye%Ssk^0Km&e4bA? z&le$e@R8T!7V@epOEk4^Ip;i1c8A0*>BbM&-nX@-y!YwutiHtOKH-iNladL+ugf&-`~7>^BI#&8xyi> z+h=>by{*Lp-luhI2FwABMh6ON)$C`7+r&q(z6a#R@^Bj_ZyY#q;9nqrgtrS55kLpR zfMz0O))8A)-~@bT9RN~5!5U|;1x?@@?$sZA+`4tE=<3z0*|<@tL6)c^RnTtVzI_LG yI7Oy#hrm`$L55jtrsYF+*hK0tB5sN{xcnQ|cc&8-I&pLW0000eSaefwW^{L9a%BKPWN%_+AW3au zXJt}lVPtu6$z?nM01YBZL_t(|+U;3+aMaZu|7`ZmvB{FXa;JAL12Qw1c32Z7lH zd<**)>tb}XtbaLEtod^aFnNjvUDq6Fz0!v6=Jt@Yv$K0J;BMrcYLfUe7C6IaxdVU~ z|D8B6zBs8}V-c810x19zscJys1GW(KS`CzQESVYBytxIKc2f?fPB$QfHqaz+shB~2 zsRRNVcs)Aw^eWNb8bV8h2hBBIDF5J-z@W!7!w7t(z<+lmLF!>@>u3UxkU$ua8UTKo zIX(BcH?O+`(~FXkGFc7ppaUko9ZE|)kU*-jS%A_6`1^pt4nEs~P#0I^J3L%SgXixm zL-ob(m3rV1zC%$_k5C&&6Nn18-@EylTh`wFYym<}4_!O$SmGLtZSwh6^W z24rW&L4U2%M3#(+I33sND+QYWikBY^qxAg1qp`r7_>M(Qy+}P1C9ruEfk(FHuf2PF z9(J6_#b?J8uzJ-U@C^>4t*rx%jg9E;ZihxQfZSX)=FUyRtXYXjOVa|N4m1F5|G*oY z-8gjG|2YYKEZKd7jBqc{c;9J&mKflj5$|~YYkvgP8h8T!51!gqurhCX4u1AlCg#kU z3yV1!216ozz95uJrQFBm>O)J*H4W; z&U5E9a6slVa-gcno8W>&Y*Ry!{d|w~Mbn>}su=DIiFctYRM%SZ`iqt5Y-;~iF$&!K&R6pIoSZUT1C(*gbAXrZvdU0 z4%FATAudjbj?Q-M`{!;v^OI{>evb>lh|@$Ai~u|GU5rPb;m9}yfv|j+ZHEV_aiDvk z7;pTc165~gOG#n_30#!~wvd4Lp{F=02;JT{KkZw(X6e$^cVlv@iGJS;KTSMol7H}X zGxGAXC4rcj7?M##tJOfr$&(l0WYBX6Z|^F>J$F@L&7vmwy$T7AIB2n9fXWz!>qqa zpJl9AdHWrUW;2V_p#ExWC>Zd2Gk-H|2|p;FhO~4Gva-^}ULqbML{zkp4waR4sHO!`Vh~ptDz@JY|?`iLRC@sVOt-ugy`2syjzr*Bx>x4-02-23s(U<83{*D z_?zDz8p@Oe9@z9W5b%TTBBe%qYWcEx@q>dQoH|>H!Lw()XliN=Eto%b^?zfVVKF8m zCnqBcUOuB58>>Tea|h$$GHf<0-am8#hS+`h#r9HKDiR9{YJhr~>ZVSn+9KZ8POXXL zBS9>cnn~@Weg^oun3Hz_Cn`{<16I+6YK93s@VIogU@&yFpdjn^!a^GZ)sM3B3T#N- z1+&tHlBOSG#`4FJn`MO6YJZk)G@1b4Wh^)xZX7;b29s$LN=n|vE6==x6swmABB$L? z?EsoQ3CX{@Pi2n z@w;Zu%w)<;A{af+l~%)MIgM0vKfb74jJ0d-rIq|Jo6RDtZ8wv*9>~zIzV#C(p3mJ z3VNhU%bY)7#p_29XMfI=BHgXpF)o@LjPEGr(f5|x*~HSkA{#RY&heBY#3VIh~hpd1F@5v|5=LzMoLOL6OxZv zrJI%s@>B&l6^uqR5)u+fL}Um7UXZvBoWaa0?ZA~QEu5pn?teXd@X*ZD@SU#1`-jmK z!^2hpE~rUlQKc0KUI`)b@v$WBW`*u#JApN#7oQ$2NAH(qFu1P$UNOn^ zoJ=^*9w?l4D1Z9J5_ zxD!FhHmxMA5pk(7{lA~u!`K-@K|uymm=vFTI(oRE+|AJo>C?p6n92;5!2pd% zl*GV*OSDPQ7>$)E5sn22x*t6~y}T5vP*|A71Bs(sbxW6`Yw`MV3FYM#-asJmXV#G4 z0e|SePGtDLwR7hy;}RhFcr0FgC&Agca3DHp<4NqbS}ivvBxvCEx_Ekaf>bj;G9(!S z=H2Ilw1m-UVGw6?Q_xL1VX>sp1&w?cM1myZ=6nZlv?5h!3V4DDiHfy-Oaf)7t*vWj zR(p{t`Ar$W5urPgihlqu<4YmgRlO1Eln z?_zwMc> z@Lk2&5?QN=ar~5bGsrfhPtB4t&H!(Df?!dJ+`6I>}wY*|SH+CqQBPoR66^ z=Si0!7@4I;3p3U%&h4hQN8^rUZl&q#*w@DP3eMlI*C!P7=cvzONixltk$=sMlm-^g zNT6!Dj)oTKrDgmOggKw@E_pRSbm)^NW~o8|UM3bELO%{3{JZdw@d;2wuyVmX@nm&P zkR%97PW)elMANy4j#^$+lw&X&lcZY_m;lRXEcci~*AQ8&o#a#;S8z;&J$pW2fB!Om zCyrgtJ9g|K-KlXDfpLTZ#(xZxMbqceuTzAdl1NaJp~!b3(Nm!af0yGUg}*mmw%O8t zN(DcY<4n19D=p}HNK4BkXr1_j0gGX?jIpo2x{8X5%GVgwPecNmneQTF*bZ1Z4*EJ19{X6!Ei-7Kvw%pMQJ%ftYptt4B_H z`XmOpRo-^#v3w?rLdLA+#_rwwn>l|5ak^;i)uNf3> znh3q#01AVzRS=TNfD$c~Vwg5kCy}*4$f8Ae@`O_{me4Bq^D4f3!GaqAzt4g@wNCMx#@Q2fQf9wAZPk4*pAE+X*6Rh$l`CcX52E)R% vx|3PRGjh(v|6-aTFhO8~zyyJBC;tXyONaXjhXVBg0000Ce_hp|i0HrOpD&=Q>X%NZ!{~Oq zU;F+3H!v6s!1v*B_%3)3cn|skW z#~b)F)S(`r7c)+$6Df*PmLkw@x2ayQQznz4&1OTp-H!JAJsl1QF2<#P85A|BMPH-Q zpmaJ-tJMnE326eoUXPyJ{<8oAasj?0_~jCB1fItVv*Zh4!S#CmCjszVf$esS86PWv z5ZWVzkmYij;(zhDU_2gcj}Yp)0OrUSST2`XR0!~0C>DzpiA2cn_tVSEiy#~h<34}; zTmbzaD}co-l?vr@IYulNBb`q7E`>sY^7%Zg)gB+rtJP}q1Qv^hkVqsFq}S{J8vgdB z3#h6}^Z8szB$G)p7z_fV(MTqfiOgm*Su7TS|G2NM(|?A?EO`R0R*Pn{nUF}OQX;6; zY9+hfPEMzj+-^6+<#I6`4hPw6Hc_h$k6G1fRgOTj*`(=oDkMs!5(@_q)a&)Kk2n|% zQYaJx?Aqt^k;mgUd2`Gv}lgUI#WV2Zo48a3|0KLBc;H_*{qJ_gKeq}E& zv~m1aGJivd$(aeAhRTqL0co0QF*J*yO^9o+BgDNQx1e|-C!PoXi*CTh*&U9*AN+Zo zLDMuCh5^$wIl8VxQItO-1TNrdtE#GL1iG%nIF3Sst_njD96=Je<2Zaaecy-Yd2n49 zwr#T*2}V&Qz$vsfoj}{R{9_UlMNvSKB*?Oi#eaN;^-{-n;~>8C@R(fT{x-l(bhkY92bWHH_93y#HVG~{= zTz~7_qrL#A(ALjyb>{XG#~Frk4TR)MEog4M2-dAz6}^z$2F!hWqkn+n0Wa2rcJV?N zgXe>8cQ0enMG4};C`z`T4}l035p6*6rl?dJOpS&Tc0t>9-agO3CzGk$may5e1260h z!|d;w@B7|)-{)Id`78or&DS6XYg6e z%gd1!FgQ4vIz2t@!5hAc>^6c{Rl37CkL%-j@gMVuu z1jpRm9M8q$@fZP&g2IOhdU0`)&xxD>!efyt_^Uti|LT|Hi(^s8$jFGSt*segJ}sCK zI3*(@fba_o3qd~A2><+-=i)wc%ez0`$;F?dADX7g&eez`IiJY9D$baq|k?)q|BN5%*-Rm(iF|n5VLWIY>zJi~cni6Cn z@$`Dcwe6CvpSNV?r{ARc2Td0t!Jwc&tIHaxJ@*unzhn-7@btE;P}tgK8{S65|b z{YbtYdasMPL}M{}H)%jnbe^z^Ty zx&|5=8Xn^77gF$S2WfGz#eb`>ucs9l7Jg!4LLi>4p9~BPoWbu&i>kfOd|g{xTUb|D z=N%dv3K5<@joa;(wzf7YEG!fVqzI10b@1$(*ntJp($c<;`u+e4vec%grt{|J<_mc8 z+Su5b4&T|?sYiQzyBY~jr?BuTDJgbKHaK!~bMHdLGk}I@jbo!h`hWWRba+&n($mwU zn^eWc#n-`es(p5NM%d|7RaLbOu(tpU(n+A7gZf7>DmpyRIi-4gd#{C0PEOY6yk!E) z%ggtWLS=MxR3j9jk(H#Rq(odU7vVV~%q}0nLu?>1F)_{ZJu; zr?j-Ra0KWm&;~cdvwvI&Bqb#oQ>A4iaLeIvc$q@!B5))CtkJVUo5<`#!&Sp}Pe{Sz zchun-{|N8%`J|?%MsTjDPE0EeR$maK5W=+!i14CW31Nf+adB}r%ePqxk21grucylV z{QMAnoKvRGyu7@(FkPSFzVpn?%tBdB}8k-YK1rVgDsK|jge`JP-Pw%BTB~tyqDWSsy_7UFvQ^3Cj{2QEes)TZK za<1TSYQz*26x;*+W57EB|2^Pe0{$pFJNw4N>jD5D3wS%=zX7}x@J~^*J8nL_VGRJD z)5s3^#~B$Jk0v6&IHQn-03U0&+wc9K;2D1bdDm{rchag}00000NkvXXu0mjf;b+KW delta 1915 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 Z{{^G-uV*mvGlKvC002ovPDHLkV1i0OKDz(_ diff --git a/icons/vol_net.png b/icons/vol_net.png index 614d53cf368003ae7e58cd2c2937930d86acf436..a9a9d2e9729d71bf9eccbdee4810f12a280f4ca9 100644 GIT binary patch delta 2674 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 g_3;=}d_ao5?*IS*07*qoM6N<$f*t$_bN~PV delta 2268 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 diff --git a/libeg/image.c b/libeg/image.c index 614d312..124c997 100644 --- a/libeg/image.c +++ b/libeg/image.c @@ -35,11 +35,24 @@ */ /* * Modifications copyright (c) 2012-2015 Roderick W. Smith - * + * * Modifications distributed under the terms of the GNU General Public - * License (GPL) version 3 (GPLv3), a copy of which must be distributed - * with this source code or binaries made from it. - * + * License (GPL) version 3 (GPLv3), or (at your option) any later version. + * + */ +/* + * 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 3 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, see . */ #include "libegint.h" diff --git a/libeg/lodepng_xtra.c b/libeg/lodepng_xtra.c index 2116012..343fbff 100644 --- a/libeg/lodepng_xtra.c +++ b/libeg/lodepng_xtra.c @@ -2,11 +2,26 @@ * Additional functions to support LodePNG for use in rEFInd * * copyright (c) 2013 by by Roderick W. Smith, and distributed - * under the terms of the GNU GPL v3. + * under the terms of the GNU GPL v3, or (at your option) any + * later version. * * See http://lodev.org/lodepng/ for the original LodePNG. * */ +/* + * 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 3 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, see . + */ #include "global.h" #include "../refind/screen.h" @@ -110,4 +125,4 @@ EG_IMAGE * egDecodePNG(IN UINT8 *FileData, IN UINTN FileDataLength, IN UINTN Ico lodepng_free(PixelData); return NewImage; -} // EG_IMAGE * egDecodePNG() \ No newline at end of file +} // EG_IMAGE * egDecodePNG() diff --git a/libeg/screen.c b/libeg/screen.c index cdf1506..61df93b 100644 --- a/libeg/screen.c +++ b/libeg/screen.c @@ -37,10 +37,23 @@ * Modifications copyright (c) 2012-2014 Roderick W. Smith * * Modifications distributed under the terms of the GNU General Public - * License (GPL) version 3 (GPLv3), a copy of which must be distributed - * with this source code or binaries made from it. + * License (GPL) version 3 (GPLv3), or (at your option) any later version. * */ +/* + * 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 3 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, see . + */ #include "libegint.h" #include "../refind/screen.h" diff --git a/mok/COPYING b/mok/COPYING index 804e589..e2aa3e6 100644 --- a/mok/COPYING +++ b/mok/COPYING @@ -1,7 +1,9 @@ Below file was part of the efitools package by James Bottomley, from which -most of the source files in this directory were taken. The mok.c and mok.h -files, however, are based on Matthew J. Garrett's shim program; see the -copyright notices in those files for details.... +most of the source files in this directory were taken. The files in this +directory originated in the "lib" directory of the efitools package, and so +fall under the LGPLv2.1. The mok.c and mok.h files, however, are based on +Matthew J. Garrett's shim program; see the copyright notices in those files +for details.... ------------------------------------------------------------------------ diff --git a/refind/Make.tiano b/refind/Make.tiano index f8f60ff..4cc1783 100644 --- a/refind/Make.tiano +++ b/refind/Make.tiano @@ -35,7 +35,7 @@ ALL_EFILIBS = $(EFILIB)/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevel # /usr/local/UDK2010/MyWorkSpace/Build/MdeModule/RELEASE_GCC46/X64/MdeModulePkg/Core/Dxe/DxeMain/OUTPUT/DxeMain/DxeMain.obj -SOURCE_NAMES = config driver_support icns lib main menu screen gpt crc32 legacy AutoGen +SOURCE_NAMES = config line_edit driver_support icns lib main menu screen gpt crc32 legacy AutoGen OBJS = $(SOURCE_NAMES:=.obj) all: $(BUILDME) diff --git a/refind/Makefile b/refind/Makefile index 402e33d..fe5c247 100644 --- a/refind/Makefile +++ b/refind/Makefile @@ -25,8 +25,8 @@ LOCAL_CPPFLAGS = -I$(SRCDIR) -I$(SRCDIR)/../include -I$(SRCDIR)/../libeg -I$(SR LOCAL_LDFLAGS = -L$(SRCDIR)/../libeg/ -L$(SRCDIR)/../mok/ -L$(SRCDIR)/../EfiLib/ LOCAL_LIBS = -leg -lmok -lEfiLib -OBJS = main.o config.o menu.o screen.o icns.o gpt.o crc32.o lib.o driver_support.o legacy.o -#OBJS = main.o config.o menu.o screen.o icns.o lib.o mok.o driver_support.o variables.o sha256.o pecoff.o simple_file.o security_policy.o guid.o +OBJS = main.o line_edit.o config.o menu.o screen.o icns.o gpt.o crc32.o lib.o driver_support.o legacy.o +#OBJS = main.o line_edit.o config.o menu.o screen.o icns.o lib.o mok.o driver_support.o variables.o sha256.o pecoff.o simple_file.o security_policy.o guid.o all: $(TARGET) diff --git a/refind/config.c b/refind/config.c index afededb..194dcb8 100644 --- a/refind/config.c +++ b/refind/config.c @@ -38,10 +38,23 @@ * Modifications copyright (c) 2012-2015 Roderick W. Smith * * Modifications distributed under the terms of the GNU General Public - * License (GPL) version 3 (GPLv3), a copy of which must be distributed - * with this source code or binaries made from it. + * License (GPL) version 3 (GPLv3) or (at your option) any later version. * */ +/* + * 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 3 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, see . +*/ #include "global.h" #include "lib.h" diff --git a/refind/gpt.c b/refind/gpt.c index cc6c70b..6ce2ba0 100644 --- a/refind/gpt.c +++ b/refind/gpt.c @@ -5,11 +5,19 @@ * Copyright (c) 2014-2015 Roderick W. Smith * All rights reserved. * - * This program is distributed under the terms of the GNU General Public - * License (GPL) version 3 (GPLv3), a copy of which must be distributed - * with this source code or binaries made from it. + * 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 3 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, see . +*/ #include "gpt.h" #include "lib.h" diff --git a/refind/legacy.c b/refind/legacy.c index 10dfc5e..3f1ccc7 100644 --- a/refind/legacy.c +++ b/refind/legacy.c @@ -37,10 +37,23 @@ * Modifications copyright (c) 2012-2015 Roderick W. Smith * * Modifications distributed under the terms of the GNU General Public - * License (GPL) version 3 (GPLv3), a copy of which must be distributed - * with this source code or binaries made from it. + * License (GPL) version 3 (GPLv3), or (at your option) any later version. * */ +/* + * 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 3 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, see . +*/ #include "global.h" #include "icns.h" diff --git a/refind/lib.c b/refind/lib.c index 961e89d..33af394 100644 --- a/refind/lib.c +++ b/refind/lib.c @@ -37,10 +37,23 @@ * Modifications copyright (c) 2012-2015 Roderick W. Smith * * Modifications distributed under the terms of the GNU General Public - * License (GPL) version 3 (GPLv3), a copy of which must be distributed - * with this source code or binaries made from it. + * License (GPL) version 3 (GPLv3), or (at your option) any later version. * */ +/* + * 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 3 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, see . + */ #include "global.h" #include "lib.h" diff --git a/refind/line_edit.c b/refind/line_edit.c new file mode 100644 index 0000000..8bb9fb4 --- /dev/null +++ b/refind/line_edit.c @@ -0,0 +1,217 @@ +// Line-editing functions borrowed from gummiboot (cursor_left(), +// cursor_right(), & line_edit()). + +/* + * Simple UEFI boot loader which executes configured EFI images, where the + * default entry is selected by a configured pattern (glob) or an on-screen + * menu. + * + * All gummiboot code is LGPL not GPL, to stay out of politics and to give + * the freedom of copying code from programs to possible future libraries. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 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 + * Lesser General Public License for more details. + * + * Copyright (C) 2012-2013 Kay Sievers + * Copyright (C) 2012 Harald Hoyer + * + * "Any intelligent fool can make things bigger, more complex, and more violent. +" + * -- Albert Einstein + */ + +#include "global.h" +#include "screen.h" +#include "lib.h" +#include "../include/refit_call_wrapper.h" + +static void cursor_left(UINTN *cursor, UINTN *first) +{ + if ((*cursor) > 0) + (*cursor)--; + else if ((*first) > 0) + (*first)--; +} + +static void cursor_right(UINTN *cursor, UINTN *first, UINTN x_max, UINTN len) +{ + if ((*cursor)+2 < x_max) + (*cursor)++; + else if ((*first) + (*cursor) < len) + (*first)++; +} + +BOOLEAN line_edit(CHAR16 *line_in, CHAR16 **line_out, UINTN x_max) { + CHAR16 *line; + UINTN size; + UINTN len; + UINTN first; + UINTN y_pos = 3; + CHAR16 *print; + UINTN cursor; + BOOLEAN exit; + BOOLEAN enter; + + DrawScreenHeader(L"Line Editor"); + refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, (ConWidth - 71) / 2, ConHeight - 1); + refit_call2_wrapper(ST->ConOut->OutputString, ST->ConOut, + L"Use cursor keys to edit, Esc to exit, Enter to boot with edited options"); + + if (!line_in) + line_in = L""; + size = StrLen(line_in) + 1024; + line = AllocatePool(size * sizeof(CHAR16)); + StrCpy(line, line_in); + len = StrLen(line); + print = AllocatePool(x_max * sizeof(CHAR16)); + + refit_call2_wrapper(ST->ConOut->EnableCursor, ST->ConOut, TRUE); + + first = 0; + cursor = 0; + enter = FALSE; + exit = FALSE; + while (!exit) { + UINTN index; + EFI_STATUS err; + EFI_INPUT_KEY key; + UINTN i; + + i = len - first; + if (i >= x_max-2) + i = x_max-2; + CopyMem(print, line + first, i * sizeof(CHAR16)); + print[i++] = ' '; + print[i] = '\0'; + + refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, 0, y_pos); + refit_call2_wrapper(ST->ConOut->OutputString, ST->ConOut, print); + refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, cursor, y_pos); + + refit_call3_wrapper(BS->WaitForEvent, 1, &ST->ConIn->WaitForKey, &index); + err = refit_call2_wrapper(ST->ConIn->ReadKeyStroke, ST->ConIn, &key); + if (EFI_ERROR(err)) + continue; + + switch (key.ScanCode) { + case SCAN_ESC: + exit = TRUE; + break; + case SCAN_HOME: + cursor = 0; + first = 0; + continue; + case SCAN_END: + cursor = len; + if (cursor >= x_max) { + cursor = x_max-2; + first = len - (x_max-2); + } + continue; + case SCAN_UP: + while((first + cursor) && line[first + cursor] == ' ') + cursor_left(&cursor, &first); + while((first + cursor) && line[first + cursor] != ' ') + cursor_left(&cursor, &first); + while((first + cursor) && line[first + cursor] == ' ') + cursor_left(&cursor, &first); + if (first + cursor != len && first + cursor) + cursor_right(&cursor, &first, x_max, len); + refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, cursor, y_pos); + continue; + case SCAN_DOWN: + while(line[first + cursor] && line[first + cursor] == ' ') + cursor_right(&cursor, &first, x_max, len); + while(line[first + cursor] && line[first + cursor] != ' ') + cursor_right(&cursor, &first, x_max, len); + while(line[first + cursor] && line[first + cursor] == ' ') + cursor_right(&cursor, &first, x_max, len); + refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, cursor, y_pos); + continue; + case SCAN_RIGHT: + if (first + cursor == len) + continue; + cursor_right(&cursor, &first, x_max, len); + refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, cursor, y_pos); + continue; + case SCAN_LEFT: + cursor_left(&cursor, &first); + refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, cursor, y_pos); + continue; + case SCAN_DELETE: + if (len == 0) + continue; + if (first + cursor == len) + continue; + for (i = first + cursor; i < len; i++) + line[i] = line[i+1]; + line[len-1] = ' '; + len--; + continue; + } + + switch (key.UnicodeChar) { + case CHAR_LINEFEED: + case CHAR_CARRIAGE_RETURN: + *line_out = line; + line = NULL; + enter = TRUE; + exit = TRUE; + break; + case CHAR_BACKSPACE: + if (len == 0) + continue; + if (first == 0 && cursor == 0) + continue; + for (i = first + cursor-1; i < len; i++) + line[i] = line[i+1]; + len--; + if (cursor > 0) + cursor--; + if (cursor > 0 || first == 0) + continue; + /* show full line if it fits */ + if (len < x_max-2) { + cursor = first; + first = 0; + continue; + } + /* jump left to see what we delete */ + if (first > 10) { + first -= 10; + cursor = 10; + } else { + cursor = first; + first = 0; + } + continue; + case '\t': + case ' ' ... '~': + case 0x80 ... 0xffff: + if (len+1 == size) + continue; + for (i = len; i > first + cursor; i--) + line[i] = line[i-1]; + line[first + cursor] = key.UnicodeChar; + len++; + line[len] = '\0'; + if (cursor+2 < x_max) + cursor++; + else if (first + cursor < len) + first++; + continue; + } + } + + refit_call2_wrapper(ST->ConOut->EnableCursor, ST->ConOut, FALSE); + FreePool(print); + FreePool(line); + return enter; +} /* BOOLEAN line_edit() */ diff --git a/refind/line_edit.h b/refind/line_edit.h new file mode 100644 index 0000000..83338de --- /dev/null +++ b/refind/line_edit.h @@ -0,0 +1,38 @@ +/* + * refind/screen_edit.h + * + * Line-editing functions borrowed from gummiboot + * + */ +/* + * Simple UEFI boot loader which executes configured EFI images, where the + * default entry is selected by a configured pattern (glob) or an on-screen + * menu. + * + * All gummiboot code is LGPL not GPL, to stay out of politics and to give + * the freedom of copying code from programs to possible future libraries. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 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 + * Lesser General Public License for more details. + * + * Copyright (C) 2012-2013 Kay Sievers + * Copyright (C) 2012 Harald Hoyer + * + * "Any intelligent fool can make things bigger, more complex, and more violent. +" + * -- Albert Einstein + */ + +#ifndef __LINE_EDIT_H_ +#define __LINE_EDIT_H_ + +BOOLEAN line_edit(CHAR16 *line_in, CHAR16 **line_out, UINTN x_max); + +#endif diff --git a/refind/main.c b/refind/main.c index 9d19107..ab584f0 100644 --- a/refind/main.c +++ b/refind/main.c @@ -37,10 +37,23 @@ * Modifications copyright (c) 2012-2015 Roderick W. Smith * * Modifications distributed under the terms of the GNU General Public - * License (GPL) version 3 (GPLv3), a copy of which must be distributed - * with this source code or binaries made from it. + * License (GPL) version 3 (GPLv3), or (at your option) any later version. * */ +/* + * 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 3 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, see . + */ #include "global.h" #include "config.h" diff --git a/refind/menu.c b/refind/menu.c index 63bf9fc..8fe0c1e 100644 --- a/refind/menu.c +++ b/refind/menu.c @@ -34,13 +34,26 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* - * Modifications copyright (c) 2012 Roderick W. Smith + * Modifications copyright (c) 2012-2015 Roderick W. Smith * * Modifications distributed under the terms of the GNU General Public - * License (GPL) version 3 (GPLv3), a copy of which must be distributed - * with this source code or binaries made from it. + * License (GPL) version 3 (GPLv3), or (at your option) any later version. * */ +/* + * 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 3 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, see . + */ #include "global.h" #include "screen.h" diff --git a/refind/screen.c b/refind/screen.c index 29d11c8..94c3039 100644 --- a/refind/screen.c +++ b/refind/screen.c @@ -34,13 +34,26 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* - * Modifications copyright (c) 2012-2014 Roderick W. Smith + * Modifications copyright (c) 2012-2015 Roderick W. Smith * * Modifications distributed under the terms of the GNU General Public - * License (GPL) version 3 (GPLv3), a copy of which must be distributed - * with this source code or binaries made from it. + * License (GPL) version 3 (GPLv3), or (at your option) any later version. * */ +/* + * 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 3 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, see . + */ #include "global.h" #include "screen.h" @@ -58,8 +71,6 @@ UINTN ConWidth; UINTN ConHeight; CHAR16 *BlankLine = NULL; -static VOID DrawScreenHeader(IN CHAR16 *Title); - // UGA defines and variables UINTN UGAWidth; @@ -266,7 +277,7 @@ VOID TerminateScreen(VOID) refit_call2_wrapper(ST->ConOut->EnableCursor, ST->ConOut, TRUE); } -static VOID DrawScreenHeader(IN CHAR16 *Title) +VOID DrawScreenHeader(IN CHAR16 *Title) { UINTN y; @@ -581,191 +592,3 @@ VOID BltImageCompositeBadge(IN EG_IMAGE *BaseImage, IN EG_IMAGE *TopImage, IN EG GraphicsScreenDirty = TRUE; } } - -// Line-editing functions borrowed from gummiboot (cursor_left(), cursor_right(), & line_edit()). -// gummiboot is copyright (c) 2012 by Kay Sievers and Harald Hoyer -// and is licensed under the LGPL 2.1. - -static void cursor_left(UINTN *cursor, UINTN *first) -{ - if ((*cursor) > 0) - (*cursor)--; - else if ((*first) > 0) - (*first)--; -} - -static void cursor_right(UINTN *cursor, UINTN *first, UINTN x_max, UINTN len) -{ - if ((*cursor)+2 < x_max) - (*cursor)++; - else if ((*first) + (*cursor) < len) - (*first)++; -} - -BOOLEAN line_edit(CHAR16 *line_in, CHAR16 **line_out, UINTN x_max) { - CHAR16 *line; - UINTN size; - UINTN len; - UINTN first; - UINTN y_pos = 3; - CHAR16 *print; - UINTN cursor; - BOOLEAN exit; - BOOLEAN enter; - - DrawScreenHeader(L"Line Editor"); - refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, (ConWidth - 71) / 2, ConHeight - 1); - refit_call2_wrapper(ST->ConOut->OutputString, ST->ConOut, - L"Use cursor keys to edit, Esc to exit, Enter to boot with edited options"); - - if (!line_in) - line_in = L""; - size = StrLen(line_in) + 1024; - line = AllocatePool(size * sizeof(CHAR16)); - StrCpy(line, line_in); - len = StrLen(line); - print = AllocatePool(x_max * sizeof(CHAR16)); - - refit_call2_wrapper(ST->ConOut->EnableCursor, ST->ConOut, TRUE); - - first = 0; - cursor = 0; - enter = FALSE; - exit = FALSE; - while (!exit) { - UINTN index; - EFI_STATUS err; - EFI_INPUT_KEY key; - UINTN i; - - i = len - first; - if (i >= x_max-2) - i = x_max-2; - CopyMem(print, line + first, i * sizeof(CHAR16)); - print[i++] = ' '; - print[i] = '\0'; - - refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, 0, y_pos); - refit_call2_wrapper(ST->ConOut->OutputString, ST->ConOut, print); - refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, cursor, y_pos); - - refit_call3_wrapper(BS->WaitForEvent, 1, &ST->ConIn->WaitForKey, &index); - err = refit_call2_wrapper(ST->ConIn->ReadKeyStroke, ST->ConIn, &key); - if (EFI_ERROR(err)) - continue; - - switch (key.ScanCode) { - case SCAN_ESC: - exit = TRUE; - break; - case SCAN_HOME: - cursor = 0; - first = 0; - continue; - case SCAN_END: - cursor = len; - if (cursor >= x_max) { - cursor = x_max-2; - first = len - (x_max-2); - } - continue; - case SCAN_UP: - while((first + cursor) && line[first + cursor] == ' ') - cursor_left(&cursor, &first); - while((first + cursor) && line[first + cursor] != ' ') - cursor_left(&cursor, &first); - while((first + cursor) && line[first + cursor] == ' ') - cursor_left(&cursor, &first); - if (first + cursor != len && first + cursor) - cursor_right(&cursor, &first, x_max, len); - refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, cursor, y_pos); - continue; - case SCAN_DOWN: - while(line[first + cursor] && line[first + cursor] == ' ') - cursor_right(&cursor, &first, x_max, len); - while(line[first + cursor] && line[first + cursor] != ' ') - cursor_right(&cursor, &first, x_max, len); - while(line[first + cursor] && line[first + cursor] == ' ') - cursor_right(&cursor, &first, x_max, len); - refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, cursor, y_pos); - continue; - case SCAN_RIGHT: - if (first + cursor == len) - continue; - cursor_right(&cursor, &first, x_max, len); - refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, cursor, y_pos); - continue; - case SCAN_LEFT: - cursor_left(&cursor, &first); - refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, cursor, y_pos); - continue; - case SCAN_DELETE: - if (len == 0) - continue; - if (first + cursor == len) - continue; - for (i = first + cursor; i < len; i++) - line[i] = line[i+1]; - line[len-1] = ' '; - len--; - continue; - } - - switch (key.UnicodeChar) { - case CHAR_LINEFEED: - case CHAR_CARRIAGE_RETURN: - *line_out = line; - line = NULL; - enter = TRUE; - exit = TRUE; - break; - case CHAR_BACKSPACE: - if (len == 0) - continue; - if (first == 0 && cursor == 0) - continue; - for (i = first + cursor-1; i < len; i++) - line[i] = line[i+1]; - len--; - if (cursor > 0) - cursor--; - if (cursor > 0 || first == 0) - continue; - /* show full line if it fits */ - if (len < x_max-2) { - cursor = first; - first = 0; - continue; - } - /* jump left to see what we delete */ - if (first > 10) { - first -= 10; - cursor = 10; - } else { - cursor = first; - first = 0; - } - continue; - case '\t': - case ' ' ... '~': - case 0x80 ... 0xffff: - if (len+1 == size) - continue; - for (i = len; i > first + cursor; i--) - line[i] = line[i-1]; - line[first + cursor] = key.UnicodeChar; - len++; - line[len] = '\0'; - if (cursor+2 < x_max) - cursor++; - else if (first + cursor < len) - first++; - continue; - } - } - - refit_call2_wrapper(ST->ConOut->EnableCursor, ST->ConOut, FALSE); - FreePool(print); - FreePool(line); - return enter; -} /* BOOLEAN line_edit() */ diff --git a/refind/screen.h b/refind/screen.h index 25bdbb9..9a1c911 100644 --- a/refind/screen.h +++ b/refind/screen.h @@ -84,6 +84,8 @@ VOID FinishTextScreen(IN BOOLEAN WaitAlways); VOID BeginExternalScreen(IN BOOLEAN UseGraphicsMode, IN CHAR16 *Title); VOID FinishExternalScreen(VOID); VOID TerminateScreen(VOID); +VOID DrawScreenHeader(IN CHAR16 *Title); + #if REFIT_DEBUG > 0 VOID DebugPause(VOID); #else @@ -106,6 +108,4 @@ VOID BltImageAlpha(IN EG_IMAGE *Image, IN UINTN XPos, IN UINTN YPos, IN EG_PIXEL //VOID BltImageComposite(IN EG_IMAGE *BaseImage, IN EG_IMAGE *TopImage, IN UINTN XPos, IN UINTN YPos); VOID BltImageCompositeBadge(IN EG_IMAGE *BaseImage, IN EG_IMAGE *TopImage, IN EG_IMAGE *BadgeImage, IN UINTN XPos, IN UINTN YPos); -BOOLEAN line_edit(CHAR16 *line_in, CHAR16 **line_out, UINTN x_max); - #endif -- 2.39.2