uphpmvault-0.8build1/0000775000000000000000000000000011604127521011556 5ustar uphpmvault-0.8build1/debian/0000775000000000000000000000000013260674071013007 5ustar uphpmvault-0.8build1/debian/rules0000775000000000000000000000003511030347502014052 0ustar #!/usr/bin/make -f %: dh $@ uphpmvault-0.8build1/debian/changelog0000664000000000000000000000232613260674071014664 0ustar uphpmvault (0.8build1) bionic; urgency=high * No change rebuild to pick up -fPIE compiler default -- Balint Reczey Tue, 03 Apr 2018 12:48:57 +0000 uphpmvault (0.8) unstable; urgency=low * Added stddef.h s.t. offsetof macro is available. Required by GCC 4.6. (closes: bug#632569) -- Marc Singer Sun, 03 Jul 2011 11:02:58 -0700 uphpmvault (0.7) unstable; urgency=low * Releasing a second time to remove git control files from source archive. -- Marc Singer Mon, 02 May 2011 10:31:16 -0700 uphpmvault (0.6) unstable; urgency=low * GCC 4.6 changes (exposes) a missing prototype for ::fstat. Including the proscribed headers solves issue. (closes: bug#624912) * Fixed type-pun warnings. * Fixed sizeof in printf warning exposed on 64 bit host. -- Marc Singer Mon, 02 May 2011 10:12:31 -0700 uphpmvault (0.5) unstable; urgency=low * Added 'install' target to Makefile. Package not much good without it. * Added man page. -- Marc Singer Fri, 04 Jul 2008 14:39:30 -0700 uphpmvault (0.4) unstable; urgency=low * First release of package. -- Marc Singer Tue, 24 Jun 2008 22:03:45 -0700 uphpmvault-0.8build1/debian/manpages0000664000000000000000000000001511033556201014507 0ustar uphpmvault.8 uphpmvault-0.8build1/debian/control0000664000000000000000000000167213260674071014420 0ustar Source: uphpmvault Section: utils Priority: optional Build-Depends: debhelper (>= 7) Maintainer: Ubuntu Developers XSBC-Original-Maintainer: Marc Singer Standards-Version: 3.7.3 Vcs-Git: git://scarlet.buici.com/uphpmvault Package: uphpmvault Architecture: any Section: utils Depends: ${shlibs:Depends}, ${misc:Depends} Description: upload recovery images to HP MediaVault2 via Ethernet The HP MediaVault--generation 2 a.k.a MV2--implements a custom recovery protocol for rescuing a device when the operating system image is corrupt. The uphpmvault application listens for broadcast Ethernet packets from an MV2 devices waiting for recovery. On receipt of one of these 'beacon' packets, uphpmvault transmits a recovery image to the waiting device which will automatically boot the recovery image. . The primary purpose of this application is for installing Debian GNU/Linux on an MV2. uphpmvault-0.8build1/debian/compat0000664000000000000000000000000211030350466014175 0ustar 7 uphpmvault-0.8build1/debian/copyright0000664000000000000000000000205211027074507014736 0ustar This program is written, maintained, and packaged for Debian by Marc Singer . The upstream source may be found on this web site http://scarlet.buici.com/git. Copyright (C) 2008 Marc Singer 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 St, Fifth Floor, Boston, MA 02110-1301, USA. The full text of the GPL copyright may be found in the original source tarball in the COPYING file file, or on your Debian system here: file:///usr/share/common-licenses/GPL uphpmvault-0.8build1/uphpmvault.80000664000000000000000000000210211033555540014051 0ustar .TH uphpmvault 8 4-July-2008 "Debian GNU/Linux" .SH NAME uphpmvault \- upload recovery images to HP MediaVault2 via Ethernet .SH SYNOPSIS .B uphpmvault [\fIOPTION\fR...] \fIIMAGE_FILE\fR .SH DESCRIPTION .PP Transmit the recovery file IMAGE to an HP MediaVault2 waiting for recovery. .TP \fB\-q\fR, \fB\-\-quiet\fR suppress program output .PP The HP MediaVault--generation 2 a.k.a MV2--implements a custom recovery protocol for rescuing a device when the operating system image is corrupt. The \fBuphpmvault\fR application listens for broadcast Ethernet packets from an MV2 devices that is waiting for recovery. On receipt of one of these \fIbeacon\fR packets, \fBuphpmvault\fR transmits the recovery file \fIIMAGE\fR to the waiting device which will automatically boot the recovery image. .SH AUTHOR Written by Marc Singer .SH COPYRIGHT Copyright \(co 2008 Marc Singer .PP License GPLv2: GNU GPL version 2 .br This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. uphpmvault-0.8build1/COPYING0000664000000000000000000004310311025655276012624 0ustar 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. GNU GENERAL PUBLIC LICENSE 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. Copyright (C) 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. , 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. uphpmvault-0.8build1/uphpmvault.cc0000664000000000000000000003501007414221726014277 0ustar /** @file uphpmvault.cc written by Marc Singer 8 Jun 2008 Copyright (C) 2008 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Please refer to the file debian/copyright for further details. @brief Upload recovery firmware to an HP Media Vault (MV2). The U-BOOT boot loader on the Media Vault will enter a recovery mode if the firmware fails to load or if the device is powered on while the reset button is pressed. This program watches for 'beacon' broadcast message UDP packets from Media Vault devices on the local Ethernet network. It will upload a firmware image using TFTP [1] to the first found MediaVault. [1] http://www.faqs.org/rfcs/rfc1350.html NOTES ----- o The address received from the beacon packet is not the address we use to send the TFTP commands. Instead, we use the address in the UDP header since that will be most reliable. Still, we require that the IP address in the beacon be non-zero. o The main loop should wait for beacon packets for a little more than 5 seconds before initiating a recovery. If there are several devices waiting for recovery, we'll have seen them all. If there is more than one, a command line switch will distinguish between them. o poll vs. epoll. We're using poll because we aren't a high performance application and the semantics of poll are simpler for our application. With epoll, we'd have to read from the beacon socket until we saw an EWOULDBLOCK before entering epoll. With poll, we can simply call poll and wait. o Need to add a check for an application timeout if we don't receive ACKs or when there are no Beacons. o Note that the number of blocks sent will include an empty block if the file is an even multiple 512 bytes, per the RFC. o There is no real retry logic. We should at least be able to cope with dropped acknowledgements. o alloca is used in favor of stack arrays of characters to guarantee alignment. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "dumpw.h" #include "exception.h" #include "oprintf.h" const char* argp_program_version = "uphpmvault 0.5"; struct arguments { arguments () : szImageFile (NULL), verbose (false), quiet (false) {} const char* szImageFile; bool verbose;; bool quiet; }; struct argp_option options[] = { // { "verbose", 'v', 0, 0, "Verbose output, when available" }, { "quiet", 'q', 0, 0, "Suppress output" }, { 0 } }; error_t arg_parser (int key, char* arg, struct argp_state* state); struct argp argp = { options, arg_parser, "FILE", " Upload recovery firmware to HP MediaVault (MV2) devices awaiting recovery.\n" "\v" "This program listens for broadcast beacon packets on any network\n" "interface from HP MediaVault devices in recovery mode. On receipt of\n" "a valid beacon message, the application will upload the specified\n" "firmware image file to the device and then terminate.\n" "\n" "The format of the recovery image is a pair of U-BOOT image files,\n" "concatenated with padding between them such that the second image\n" "starts exactly 2MiB from the beginning of the combined image file.\n" "The first U-BOOT image is a Linux kernel and the second is an initrd\n" "or initramfs.\n" }; error_t arg_parser (int key, char* arg, struct argp_state* state) { struct arguments& args = *(struct arguments*) state->input; switch (key) { case 'v': args.verbose = true; break; case 'q': args.quiet = true; break; case ARGP_KEY_ARG: if (args.szImageFile) argp_error (state, "only one image file is permitted"); args.szImageFile = arg; break; case ARGP_KEY_END: if (!args.szImageFile) argp_error (state, "you must specify an image file"); break; default: return ARGP_ERR_UNKNOWN; } return 0; }; /** Enumeration of the system state. */ enum { Idle = 0, ///< Waiting for a beacon BeaconReceived, ///< Beacon detected WRQSent, ///< TFTP Write RQ sent Acked, ///< ACK received to last command DataSent, ///< Data packet sent Done, ///< Upload complete }; #define PACKET_TYPE_RECOVERY_MODE (0xde) #define PORT_BEACON (8488) #define VERSION_BEACON (1) ///< Only one version of Beacon recognized #define STATE_RECOVERY (1) ///< Only one state exists /** Payload of a Beacon message. */ struct Beacon { // header uint8_t packet_type; ///< Beacon packet type uint8_t version; // payload uint16_t state; uint8_t ip_addr[4]; ///< IP address of device (redundant) uint8_t mac_addr[6]; ///< MAC address of device (redundant) uint8_t szName[16]; ///< Name of device manufacturer uint8_t szModel[50]; ///< Model name of device Beacon () { bzero (this, sizeof (*this)); } bool is (void) { return version == VERSION_BEACON && packet_type == PACKET_TYPE_RECOVERY_MODE && state == STATE_RECOVERY; } bool is_mediavault2 (void) { return strcasecmp ((const char*) szName, "HP P2 NAS") == 0; } bool is_valid (void) { return ip_addr[0] | ip_addr[1] | ip_addr[2] | ip_addr[3]; } } __attribute__((packed)); std::ostream& operator<< (std::ostream& o, const Beacon& b) { o << oprintf ("%-16.16s %02x:%02x:%02x:%02x:%02x:%02x (%d.%d.%d.%d)", b.szName, b.mac_addr[0], b.mac_addr[1], b.mac_addr[2], b.mac_addr[3], b.mac_addr[4], b.mac_addr[5], b.ip_addr[0], b.ip_addr[1], b.ip_addr[2], b.ip_addr[3]); return o; } #define PORT_TFTP (69) #define TFTP_OP_RRQ 1 #define TFTP_OP_WRQ 2 #define TFTP_OP_DATA 3 #define TFTP_OP_ACK 4 #define TFTP_OP_ERROR 5 #define TFTP_OP_OACK 6 #define TFTP_ERROR_NONE 0 #define TFTP_ERROR_FILENOTFOUND 1 #define TFTP_ERROR_ACCESSERROR 2 #define TFTP_ERROR_DISKFULL 3 #define TFTP_ERROR_ILLEGALOP 4 #define TFTP_ERROR_UNKNOWNID 5 #define TFTP_ERROR_FILEEXISTS 6 #define TFTP_ERROR_NOUSER 7 #define TFTP_ERROR_OPTIONTERMINATE 8 #define US_BETWEEN_RETRIES (100*1000) #define C_RETRIES (5) #define CB_DATA_PAYLOAD (512) // Default DATA payload size #define MS_TIMEOUT_POLL (200) struct message_tftp { uint16_t opcode; uint8_t data[]; } __attribute__((packed)); /** Berkeley UDP socket wrapper class. It can open a listening socket for either a specific port, or an OS selected port. */ struct Socket { int m_port; int m_s; Socket () : m_port (0), m_s (-1) {} Socket (int port) : m_port (port), m_s (-1) {} void open_udp (void) { struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl (INADDR_ANY); addr.sin_port = htons (m_port); m_s = ::socket (AF_INET, SOCK_DGRAM, 0); if (m_s == -1) throw Exception ("unable to create socket"); int options = ::fcntl (m_s, F_GETFL, 0); if (::fcntl (m_s, F_SETFL, options | O_NONBLOCK) != 0) throw Exception ("unable to make socket non-blocking"); if (::bind (m_s, (struct sockaddr*) &addr, sizeof (addr)) != 0) throw Exception ("unable to bind socket"); // printf ("m_port %d m_s %d\n", m_port, m_s); // Recover port if we've asked OS to pick one if (m_port == 0) { socklen_t cbAddr = sizeof (addr); if (::getsockname (m_s, (struct sockaddr*) &addr, &cbAddr) != 0) throw Exception ("unable to get socket address"); m_port = ntohs (addr.sin_port); }} }; /** Simple TFTP serving class. The base class is the UDP socket class to handle opening the listening socket. There are methods to send the important TFTP protocol elements. */ struct TFTP : Socket { struct sockaddr m_addr; TFTP () { } TFTP (int port) : Socket (port) { } void bind (struct sockaddr addr) { m_addr = addr; ((struct sockaddr_in*) &m_addr)->sin_port = htons (PORT_TFTP); } void set_port (int port) { ((struct sockaddr_in*) &m_addr)->sin_port = htons (port); } /** Send write request for named file. The file type will be 'octet'. */ void wrq (const char* szFile) { static const char szMode[] = "octet"; int cbMessage = sizeof (struct message_tftp) + strlen (szFile) + 1 + strlen (szMode) + 1; char* rgb = (char*) alloca (cbMessage); ssize_t cb; struct message_tftp& m = *(struct message_tftp*) rgb; m.opcode = htons (TFTP_OP_WRQ); cb = sizeof (m); cb += snprintf (rgb + cb, cbMessage - cb, "%s", szFile) + 1; cb += snprintf (rgb + cb, cbMessage - cb, "%s", szMode) + 1; // dumpw (rgb, cb, 0, 0); for (int retries = C_RETRIES; retries--; ) { ssize_t cbSent = sendto (m_s, rgb, cb, 0, &m_addr, sizeof (m_addr)); // printf ("sendto: %d -> %d\n", cb, cbSent); if (cb == cbSent) break; if (retries) { usleep (US_BETWEEN_RETRIES); continue; } throw ResultException (errno, "error sending WRQ on %d (%s)", m_s, strerror (errno)); } } /** Send write data. The block index starts with 1. The size of the buffer to send may reference all of the data remaining in the file. This function will only send messages of the negotiated size, probably 512 bytes. The return value is the number of bytes transmited. */ size_t wdata (int block, const char* rgb, size_t cb) { size_t cbSend = cb; if (cbSend > CB_DATA_PAYLOAD) cbSend = CB_DATA_PAYLOAD; size_t cbPacket = sizeof (message_tftp) + 2 + cbSend; char* rgbPacket = (char*) alloca (cbPacket); message_tftp& msg = *(message_tftp*) rgbPacket; msg.opcode = htons (TFTP_OP_DATA); { unsigned short s = htons (block); memcpy (msg.data, &s, sizeof (s)); } memcpy (msg.data + 2, rgb, cbSend); // printf ("sending data block %d %d bytes\n", block, cbSend); // dumpw (rgbPacket, 16, 0, 0); for (int retries = C_RETRIES; retries--; ) { ssize_t cbSent = sendto (m_s, rgbPacket, cbPacket, 0, &m_addr, sizeof (m_addr)); // printf ("sendto: %d %d\n", sizeof (rgbPacket), cbSent); if (cbSent == (ssize_t) cbPacket) break; if (retries) { usleep (US_BETWEEN_RETRIES); continue; } throw ResultException (errno, "error sending %d DATA on %d (%d '%s')", cbSend, m_s, errno, strerror (errno)); } return cbSend; } }; /** UDP/TFTP server loop and state machine. It waits for broadcast beacon messages and uploads the recovery image when it finds receives a valid beacon. The cBlocks calculation rounds up and may add a full extra block if the file to send is an even multiple of the block size, per the RFC. */ void server (struct arguments& args, void* pvFile, size_t cbFile) { Socket sBeacon = Socket (PORT_BEACON); sBeacon.open_udp (); TFTP tftp; Beacon b; tftp.open_udp (); struct pollfd fds[] = { { sBeacon.m_s, POLLIN, 0 }, { tftp.m_s, POLLIN, 0 }, }; int result; int state = Idle; int block = 0; int cBlocks = (cbFile + CB_DATA_PAYLOAD)/CB_DATA_PAYLOAD; size_t ibFile = 0; struct sockaddr addr; socklen_t cbAddr = sizeof (addr); while (state != Done) { char rgb[1500]; int cb; switch (state) { // Read from our sockets case Idle: case WRQSent: case DataSent: if ((result = poll (fds, sizeof (fds)/sizeof (*fds), MS_TIMEOUT_POLL)) > 0) { // Read Beacon if (fds[0].revents & POLLIN) { cb = recvfrom (sBeacon.m_s, rgb, sizeof (rgb), 0, &addr, &cbAddr); if (cb > 0 && !b.is ()) { memcpy (&b, rgb, sizeof (b)); bool recover = state == Idle && b.is_mediavault2 () && b.is_valid (); if (!args.quiet) std::cout << b << (recover ? "" : " [ignoring]") << std::endl; if (state == Idle && b.is_mediavault2 () && b.is_valid ()) { if (!args.quiet) { printf ("Recovering %02x:%02x:%02x:%02x:%02x:%02x\n", b.mac_addr[0], b.mac_addr[1], b.mac_addr[2], b.mac_addr[3], b.mac_addr[4], b.mac_addr[5]); printf ("Sending file of %d bytes in %d blocks of %d bytes\n", int (cbFile), cBlocks, CB_DATA_PAYLOAD); } tftp.bind (addr); state = BeaconReceived; } } } // Read ACKs if (fds[1].revents & POLLIN) { if ((cb = recvfrom (tftp.m_s, rgb, sizeof (rgb), 0, &addr, &cbAddr) > 0)) { uint16_t opcode; memcpy (&opcode, rgb + offsetof (message_tftp, opcode), sizeof (opcode)); opcode = ntohs (opcode); uint16_t blockAck; memcpy (&blockAck, rgb + offsetof (message_tftp, data), sizeof (blockAck)); blockAck = ntohs (blockAck); if (opcode == TFTP_OP_ACK && blockAck == block) { if (state == WRQSent) tftp.set_port (ntohs (((sockaddr_in*)&addr)->sin_port)); state = Acked; ++block; } } } } break; // We've seen a beacon, send the write request case BeaconReceived: tftp.wrq ("uImage"); // The name, itself, is unimportant state = WRQSent; break; // We've been ACKd, send another block or terminate case Acked: if (block - 1 >= cBlocks) { state = Done; break; } ibFile += tftp.wdata (block, (const char*) pvFile + ibFile, cbFile - ibFile); state = DataSent; break; } } } int main (int argc, char** argv) { struct arguments args; argp_parse (&argp, argc, argv, 0, 0, &args); int fh = ::open (args.szImageFile, O_RDONLY); if (fh == -1) { printf ("unable to open file %s\n", args.szImageFile); exit (2); } struct stat stat; ::fstat (fh, &stat); size_t cb = stat.st_size; void* pv = ::mmap (0, cb, PROT_READ, MAP_FILE | MAP_SHARED, fh, 0); if (!args.quiet) { printf ("Recovery image %s is %d bytes\n", args.szImageFile, int (cb)); printf ("Waiting for broadcast beacon packets.\n"); printf ("Press ^C to cancel\n"); } try { server (args, pv, cb); } catch (const Exception& e) { printf ("exception: %s\n", e.sz); } catch (...) { printf ("exception: \n"); } return 0; } uphpmvault-0.8build1/dumpw.h0000664000000000000000000000112711025655516013073 0ustar /** @file dumpw.h written by Marc Singer 4 Jun 2008 Copyright (C) 2008 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Please refer to the file debian/copyright for further details. */ #if !defined (__DUMPW_H__) # define __DUMPW_H__ /* ----- Includes */ /* ----- Types */ /* ----- Globals */ /* ----- Prototypes */ void dumpw (const char *rgb, int cb, unsigned long index, int width); #endif /* __DUMPW_H__ */ uphpmvault-0.8build1/.git/0000775000000000000000000000000011604127336012423 5ustar uphpmvault-0.8build1/.git/config0000664000000000000000000000013411025616626013613 0ustar [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true uphpmvault-0.8build1/.git/info/0000775000000000000000000000000011025616626013360 5ustar uphpmvault-0.8build1/.git/info/exclude0000664000000000000000000000036011025616626014733 0ustar # git-ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ uphpmvault-0.8build1/.git/hooks/0000775000000000000000000000000011025616626013550 5ustar uphpmvault-0.8build1/.git/hooks/pre-commit0000664000000000000000000000325211025616626015551 0ustar #!/bin/sh # # An example hook script to verify what is about to be committed. # Called by git-commit with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, make this file executable. # This is slightly modified from Andrew Morton's Perfect Patch. # Lines you introduce should not have trailing whitespace. # Also check for an indentation that has SP before a TAB. if git-rev-parse --verify HEAD 2>/dev/null then git-diff-index -p -M --cached HEAD -- else # NEEDSWORK: we should produce a diff with an empty tree here # if we want to do the same verification for the initial import. : fi | perl -e ' my $found_bad = 0; my $filename; my $reported_filename = ""; my $lineno; sub bad_line { my ($why, $line) = @_; if (!$found_bad) { print STDERR "*\n"; print STDERR "* You have some suspicious patch lines:\n"; print STDERR "*\n"; $found_bad = 1; } if ($reported_filename ne $filename) { print STDERR "* In $filename\n"; $reported_filename = $filename; } print STDERR "* $why (line $lineno)\n"; print STDERR "$filename:$lineno:$line\n"; } while (<>) { if (m|^diff --git a/(.*) b/\1$|) { $filename = $1; next; } if (/^@@ -\S+ \+(\d+)/) { $lineno = $1 - 1; next; } if (/^ /) { $lineno++; next; } if (s/^\+//) { $lineno++; chomp; if (/\s$/) { bad_line("trailing whitespace", $_); } if (/^\s* \t/) { bad_line("indent SP followed by a TAB", $_); } if (/^([<>])\1{6} |^={7}$/) { bad_line("unresolved merge conflict", $_); } } } exit($found_bad); ' uphpmvault-0.8build1/.git/hooks/applypatch-msg0000664000000000000000000000067111025616626016430 0ustar #!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, make this file executable. . git-sh-setup test -x "$GIT_DIR/hooks/commit-msg" && exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} : uphpmvault-0.8build1/.git/hooks/prepare-commit-msg0000664000000000000000000000223411025616626017204 0ustar #!/bin/sh # # An example hook script to prepare the commit log message. # Called by git-commit with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, make this file executable. # This hook includes three examples. The first comments out the # "Conflicts:" part of a merge commit. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. case "$2 $3" in merge) sed -i '/^Conflicts:/,/#/!b;s/^/# &/;s/^# #/#/' "$1" ;; # ""|template) # perl -i -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$1" ;; *) ;; esac # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" uphpmvault-0.8build1/.git/hooks/post-commit0000664000000000000000000000023011025616626015741 0ustar #!/bin/sh # # An example hook script that is called after a successful # commit is made. # # To enable this hook, make this file executable. : Nothing uphpmvault-0.8build1/.git/hooks/post-update0000664000000000000000000000031711025616626015741 0ustar #!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, make this file executable by "chmod +x post-update". exec git-update-server-info uphpmvault-0.8build1/.git/hooks/commit-msg0000664000000000000000000000156711025616626015560 0ustar #!/bin/sh # # An example hook script to check the commit log message. # Called by git-commit with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, make this file executable. # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } uphpmvault-0.8build1/.git/hooks/update0000664000000000000000000000553611025616626014766 0ustar #!/bin/sh # # An example hook script to blocks unannotated tags from entering. # Called by git-receive-pack with arguments: refname sha1-old sha1-new # # To enable this hook, make this file executable by "chmod +x update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") if [ -z "$projectdesc" -o "$projectdesc" = "Unnamed repository; edit this file to name it for gitweb." ]; then echo "*** Project description file hasn't been set" >&2 exit 1 fi # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. if [ "$newrev" = "0000000000000000000000000000000000000000" ]; then newrev_type=delete else newrev_type=$(git-cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag ;; refs/heads/*,commit) # branch ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 uphpmvault-0.8build1/.git/hooks/pre-rebase0000664000000000000000000001024611025616626015523 0ustar #!/bin/sh # # Copyright (c) 2006 Junio C Hamano # publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` fi case "$basebranch,$topic" in master,refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Is topic fully merged to master? not_in_master=`git-rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git-rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git-rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git-rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up-to-date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git-rev-list --pretty=oneline ^${publish} "$topic"` perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi exit 0 ################################################################ This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git-rev-list ^master ^topic next git-rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git-rev-list master..topic if this is empty, it is fully merged to "master". uphpmvault-0.8build1/.git/hooks/pre-applypatch0000664000000000000000000000060311025616626016423 0ustar #!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, make this file executable. . git-sh-setup test -x "$GIT_DIR/hooks/pre-commit" && exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} : uphpmvault-0.8build1/.git/hooks/post-receive0000664000000000000000000000077611025616626016112 0ustar #!/bin/sh # # An example hook script for the post-receive event # # This script is run after receive-pack has accepted a pack and the # repository has been updated. It is passed arguments in through stdin # in the form # # For example: # aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master # # see contrib/hooks/ for an sample, or uncomment the next line (on debian) # #. /usr/share/doc/git-core/contrib/hooks/post-receive-email uphpmvault-0.8build1/.git/refs/0000775000000000000000000000000011025616626013364 5ustar uphpmvault-0.8build1/.git/refs/tags/0000775000000000000000000000000011033561136014314 5ustar uphpmvault-0.8build1/.git/refs/tags/0.40000664000000000000000000000005111030361225014526 0ustar 10b097320e8d3e26d29d4cc1bd32adca9b78ed6d uphpmvault-0.8build1/.git/refs/tags/0.50000664000000000000000000000005111033561136014535 0ustar e42d1a5252aff0012ec05d7ca17f7ac0fc79f7dc uphpmvault-0.8build1/.git/refs/heads/0000775000000000000000000000000011557565173014462 5ustar uphpmvault-0.8build1/.git/refs/heads/master0000664000000000000000000000005111557565173015674 0ustar b7d262efbdf02b036ffe9f744819bc10d78e4b75 uphpmvault-0.8build1/.git/COMMIT_EDITMSG0000664000000000000000000000110611557565173014524 0ustar Lame release to fix source archive inclusion of git control files. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # modified: debian/changelog # # Untracked files: # (use "git add ..." to include in what will be committed) # # debian/files # debian/uphpmvault.debhelper.log # debian/uphpmvault.substvars # debian/uphpmvault/ # dumpw.o # uphpmvault # uphpmvault.o # uphpmvault_unstripped uphpmvault-0.8build1/.git/index0000664000000000000000000000213011557565156013466 0ustar DIRCJL)HWZ FC\G Y0z%1COPYINGMM mR4/H֠MakefileMgMg O[f=Ԍ)Idebian/changelogJL)Ha6 P=`C۝,( debian/compatJL)HnD QfQ`~mA:r]debian/controlJL)H\yG R*fՇ`"S8mdebian/copyrightJL)Hn܁ T _HנQ-debian/manpagesJL)HaB U%Xq1aY0L` debian/rulesJL)HW[Z s*8D2mN)dumpw.ccJL)HW[N WЅM]mndumpw.hJL)HW[- P7g+2$ZF exception.hJL)HW[ aox-勳? xF' oprintf.hJL)Hn` BA)B"/TI6lm uphpmvault.8MM 9QW4j!]ՆCGqȳt uphpmvault.ccORsVX3Ї ,uphpmvault-0.8build1/.git/description0000664000000000000000000000007211025616626014672 0ustar Unnamed repository; edit this file to name it for gitweb. uphpmvault-0.8build1/.git/HEAD0000664000000000000000000000002711025616626013050 0ustar ref: refs/heads/master uphpmvault-0.8build1/.git/logs/0000775000000000000000000000000011025616751013370 5ustar uphpmvault-0.8build1/.git/logs/refs/0000775000000000000000000000000011025616751014327 5ustar uphpmvault-0.8build1/.git/logs/refs/heads/0000775000000000000000000000000011025616751015413 5ustar uphpmvault-0.8build1/.git/logs/refs/heads/master0000664000000000000000000000340511557565173016646 0ustar 0000000000000000000000000000000000000000 e22ca0169000e8b82d5d11ad3adc6eed30a6ae74 Marc Singer 1213668841 -0700 commit (initial): Initia repository for HP Media Vault recovery program e22ca0169000e8b82d5d11ad3adc6eed30a6ae74 e999884c15287c43ec797711ecfc8421903a931b Marc Singer 1213684653 -0700 commit: Added copyright messages e999884c15287c43ec797711ecfc8421903a931b 07ab8fc5572281f1db8de4dc0efdde002b3cec87 Marc Singer 1214019749 -0700 commit: Ignoring beacons with empty IP addresses. 07ab8fc5572281f1db8de4dc0efdde002b3cec87 78f42f905849b16f8818337b2dbeb28dc9c2f10a Marc Singer 1214117333 -0700 commit: Changed from reading input file to mmap'ing it. 78f42f905849b16f8818337b2dbeb28dc9c2f10a 92d7bd7ba468bf6b5ce4dd07e8cb3156baf81dc0 Marc Singer 1214289556 -0700 commit: Added argp support. 92d7bd7ba468bf6b5ce4dd07e8cb3156baf81dc0 bf708f4765d3f1c9b4cc8472d12d9a60e2357925 Marc Singer 1214374089 -0700 commit: Preparing initial release for Debian. bf708f4765d3f1c9b4cc8472d12d9a60e2357925 2494d64c179fa7bfca25f9993a6b389578d967b3 Marc Singer 1215225726 -0700 commit: Fixed package build for Debian. 2494d64c179fa7bfca25f9993a6b389578d967b3 21f1015e603ec04fe7dd26157cef44f9d3428614 Marc Singer 1215226419 -0700 commit: Added build target to Makefile to document how to build within git 21f1015e603ec04fe7dd26157cef44f9d3428614 2828f9e8e880eb468c110b078ea52660b1bf3844 Marc Singer 1304356635 -0700 commit: Fixing bug opened on package due to GCC 4.6 2828f9e8e880eb468c110b078ea52660b1bf3844 b7d262efbdf02b036ffe9f744819bc10d78e4b75 Marc Singer 1304357486 -0700 commit: Lame release to fix source archive inclusion of git control files. uphpmvault-0.8build1/.git/logs/HEAD0000664000000000000000000000340511557565173014031 0ustar 0000000000000000000000000000000000000000 e22ca0169000e8b82d5d11ad3adc6eed30a6ae74 Marc Singer 1213668841 -0700 commit (initial): Initia repository for HP Media Vault recovery program e22ca0169000e8b82d5d11ad3adc6eed30a6ae74 e999884c15287c43ec797711ecfc8421903a931b Marc Singer 1213684653 -0700 commit: Added copyright messages e999884c15287c43ec797711ecfc8421903a931b 07ab8fc5572281f1db8de4dc0efdde002b3cec87 Marc Singer 1214019749 -0700 commit: Ignoring beacons with empty IP addresses. 07ab8fc5572281f1db8de4dc0efdde002b3cec87 78f42f905849b16f8818337b2dbeb28dc9c2f10a Marc Singer 1214117333 -0700 commit: Changed from reading input file to mmap'ing it. 78f42f905849b16f8818337b2dbeb28dc9c2f10a 92d7bd7ba468bf6b5ce4dd07e8cb3156baf81dc0 Marc Singer 1214289556 -0700 commit: Added argp support. 92d7bd7ba468bf6b5ce4dd07e8cb3156baf81dc0 bf708f4765d3f1c9b4cc8472d12d9a60e2357925 Marc Singer 1214374089 -0700 commit: Preparing initial release for Debian. bf708f4765d3f1c9b4cc8472d12d9a60e2357925 2494d64c179fa7bfca25f9993a6b389578d967b3 Marc Singer 1215225726 -0700 commit: Fixed package build for Debian. 2494d64c179fa7bfca25f9993a6b389578d967b3 21f1015e603ec04fe7dd26157cef44f9d3428614 Marc Singer 1215226419 -0700 commit: Added build target to Makefile to document how to build within git 21f1015e603ec04fe7dd26157cef44f9d3428614 2828f9e8e880eb468c110b078ea52660b1bf3844 Marc Singer 1304356635 -0700 commit: Fixing bug opened on package due to GCC 4.6 2828f9e8e880eb468c110b078ea52660b1bf3844 b7d262efbdf02b036ffe9f744819bc10d78e4b75 Marc Singer 1304357486 -0700 commit: Lame release to fix source archive inclusion of git control files. uphpmvault-0.8build1/.git/branches/0000775000000000000000000000000011025616626014212 5ustar uphpmvault-0.8build1/.git/objects/0000775000000000000000000000000011557565173014070 5ustar uphpmvault-0.8build1/.git/objects/5d/0000775000000000000000000000000011557565156014401 5ustar uphpmvault-0.8build1/.git/objects/5d/f4c91aed1b70ac34ba298e94025d669b0e186f0000664000000000000000000000067611025616714021611 0ustar xSn09_q^˦"X7^JƘ!!rvSvI#^S{fe㻳7'\VV*]F'- ߸q/BhWp%2NOz("3~f*/W0 c Sz[L_ I̗\`cgx]RI+y)q^)cv5gK^'0epcgēogzmTsf;!!=/s*Zqsq?ԥi*ڌX-yLMB븣 yy/TRXR$;NUiۆsԫyǢ#<=7ŮB:o ¹l xqݯ-?%IBV_?juphpmvault-0.8build1/.git/objects/5d/5b59eb7f338c4e08be717969e8ff69433a32480000664000000000000000000000032211557565156021435 0ustar x+)JMU024b040031QHHKOOgH#㩶^^ңt~O܂~F Ηݞ# 8u'7= ݖp]Up%E% vo~?AKX UWZ I ~>@]7jMMJs NTQhxM{HNE_uphpmvault-0.8build1/.git/objects/81/0000775000000000000000000000000011033557552014307 5ustar uphpmvault-0.8build1/.git/objects/81/9ad5427c28a0e990753834e9044da739bf85670000664000000000000000000001115511027074204021166 0ustar xZkSXޯWa bc00YRCd؀Mc3ٮ,咥c,y$B2<9GC[T7A$J&RVl1Q54sɃR_ VJ2V{d񐆷\5[^"wF0S4MŸTk%Kk,*Ai8YZ`'1XIN|Uy<_:֩$ }u:δPp,L@@ !G&8Q2Ҟ)1'rE$I;~!i2T:(1mzQjsNh`{Ԃjzʖۓ$  tW/݇Qt ( 7RD$ SFB6@F%-{ v#ՙI<N4Y{/g*$snd1 p%>>I?(`DX^zL9 |+pTGK(FPYLD^+Sw4M"yÊZxgUb<4 -3Dd>#ugvqЈRp :g^D Eg9Boikscb[@{B1ğyɤ)lu, %l~/Uwڇn}Cg,ҙ>M$kv`h #X!BEbP#(I*%(Ppdu`,SluX04^@k]y']wZ2 W:$GQ}3M#tʋ"'0$u$m*q>ψ- D_jI/Q?% MX$8!¶Ű)؁M®Sx:C_dveaP r̐%2 xRrPu,ZcDȼ{ɻF xd0nNR)^"> @|#Ya ,Ϣ 7*:키 m`h?@>)¥ѿ"xz'Dd8_ 7^' S5Al"~-n@9`و-F3w@GDAluGQ7( Vvy>V"%ڴk&3fF*կC')#JB~CGpѠ8w ^zlT/j 'Ka,*[(1uElkH6SK`ƣ.{j~ t<8FūW. rR"A1jjFm~-ѨX)&Ov/SuMi,h]fQ/mQ;;6%L8Ӥ_uiT[~^p CPm!\Y|zq] vi&Dqު\{_ܾ8:׳}o?u|`EBZNQ,S@ -T\ΘhEl)5D5st+md,6jVyxڼKC]qa/n\ǟͪАzpnh$fr#c/xlYdBAL7oTseCV7#Q8kjolw;Lm}9/:z*('+'v K߽Am)ǽ~Q|e'p= hA{2V4ŲKK{h\.WW6[Fh4-_#z7/-WGB^[cN{NU͉pho ?^2av{̘cd%Mzu6 O\_\F>ҏ(z6GWg!R-qh,SiˣG'0Ԑ-NT<8f2db8]ףBk41%lf3XI4Fl;ɂ=e5`}q4NH^ONj$ ֎֜(9OY![ˢ,?@|n!'fp\1UjziT=l.l=W]Kduxkp*VSI(*M5U[N-(@yǤ;zQ6\ r94vA?)VZj[72Ď ?\0*22K t(ni-b-x-&,noVNUrB@aa&TXg)*9`0~KI?!+S(C֘ }62Xf,l14ZJ-Ca)t\%m H2G(9͍f"EromL$&PWܘuZIw(~gf׵4qs}E2&( 2DrTOBl2jk.c_fZ̃0^-yX NPf΄)v^TB?Qm LÈjPaړ@6NU ejv"©$V¶8{#c @)b+b^ _& +l)zYCى5pGqg̛(/BY T5BsGrFe17 l>>@YŶ\kݗaXTsdUWG$)hpdRAh߉TVNqfT S }N֎->=2MAnSc\#C hM 5 '/ZK˸5#+ L(sD=׶î30L$՜|#H4`[A0Ϲ$Z=q)__1ߝ DUFͻ1'͗]GUIr37h,ezNQ07-PT"HW.\Cn'ɄP*A>8K1iH[r4*fc,Ƽ}}RzE`-]CȖZ sڿi|hVDnvF:m(ȱTրǵx mC\8 a/g91|څ EDlj `>a.2QsI}ܮÜǽGG mD7{QI۰n,t7Q7p;~Qc)UzW a=`){*'jZ]j?ri-j\{XB%}.EQܲ DK=t'͝j(h5^KH+<` ?Hx FCՈIH-V `/i %Jht5wG<m'#) Wn 1YOgۧh@OF87#s HM[BQ79*.>+SDCt[;X-PO?G#ք! iZn(>6\.7mIuphpmvault-0.8build1/.git/objects/d5/0000775000000000000000000000000011025655314014363 5ustar uphpmvault-0.8build1/.git/objects/d5/11905c1647a1e311e8b20d5930a37a9c2531cd0000664000000000000000000001704711025655314021257 0ustar xmsƵSMڍۇĝe%]!P/@Zѷ9()I$y=o_?]gl2ӣ$hڲw}U6Q}hۻ]xyȾ 'MQy}ϛ"j`( |˚.0߱z7 '.uOwo~}.,LC eE)wbvuXBNȫUX)"7,,7awǓrYTmVr)*g}XmY݆rz/Vo2ah|s.@Xi6M@wh~Um/EPWFwZ+۽ tW&ooY*|.0FF vEn9ޡ~(}%_lPCW۰o.jဴH˷5&^ %YoHI!҄mS6&h/EJplߺ 񱃳Oe \C}Z0~jwEz*zy-&Hp=r҄|՛laEˢ0̊-$tK4{V:DoUy#(N9l(xvv yMduWpBa;6"*77y+DŲDDn>RXqʌ ҳ#f`j( ^|>cJGG{$X#v0TC0ɒjd )J=!lwNwŶ!| (.cF^]ܱ0 Lw%BZr]- 5̞yG"{n#+ 2nD倿5rI;{E „vǢp( Wu +=ؑ'jX" ǽT_FZBT!m㏡Ȍ>E!KBFAhP :FeG,) ";'6jt2,ht*'5 p,oX,qr@T$c0# rs^B:d[}SwA%^V$-=`F"f'Z_^Dҥ3X| vOP˛Zi DߠD \w)ʡ.MR`ZrI*h5e)7n+ PYG>Eg銥J7Scdigx/gFx:_̦/-t~<=2oX\hO~ cP^o\QݮWa:wZ%bC;̬ذ" h>]H1ܹ@nR Ex^+׹v6a.7B7WF]u~ _|m[Dsu#x.1"]!އ!`%Gмli[ŮqDL@,z]GT"뒄QYVp/P9'a~7_ $ؼ /r/D%LI%'cwRn,[P,of_UE2+8f7(^@5?GmeCmQVu[h<ǎAp(:`اh,{# R)-QSX\C[.In̩Z ŖjDf=xNHM7 c̐w=rx!reN#nj-[73`떘p:3͵]%o,vd{הhooH :pa U_,s:)7!%s(󎐳=Ȱv\-\w1mxEO0l*>'[XEhYŧkHmCzc(=9mF5b{()0KJ2ƲYu@ D/_̽= d$xCuf7셰~hqU*RBVTQEz]qC Beݬ ^''H)$Jr}I^Ut'Z1QX#'y<32+R%|AttS%| wv::oʼ-ޚyAVO6u~`01kz VkI'.Iͤ+`EYvmƕ(USBBz7 z=3 )F'nRR9; 7{*&TJ֑!|4Zy&Cծ)s@ZZcGr/Z’:!&YWR[`r4:@2UAĔr06b𘃥F|$% j;7C >@X~x#218Û!niVD<luw"_H#5I[^zrA;o{OI ^3HXpCwţM"IL]k|(AT7dsk2R5vv8&?&r^Gyk YŵwБä^SZ"ų_[)aN8CzbX1G;hoIHy&f6 1Is(fAņOKBV ^4Q&{tƋ׊"|*KT7"Ym53DbŶ9d;\o-o vZ;?Đ)g(%ړ5YGkgf5%6Y*uǔ=ТíSntlvTjScr{b?d UTE#JQp+m[ĨCn_#8 : +|{ EXZµd'A#<XVGe cAJ䟺PVՕQyJn{9 EE6{OmSk"ϱ:d+{*Z/ݘcbfbN] Il,lا=,̐]&K<upM~d,؟EC*܍E ݚohZɻ7&ənʺ^b]6喔̝l+iJ7P=s&>xZvd\Ʃ=:QH >؎].g@xFRjWƝ jټ&7߉+ӗΡ( .$,'ݐ#4nPzLrPƒ+[ v!(=M/{*Hm2:e쮔 ̙߲5G04XڴC\fxFu–f<HGJ[.vBK46[j&xl[4 ۧ $@dWT6ArJ o3t8 ⥈:Tt2KqbOWsrTrE7ZDbW6Ij  ;%_ev#V& Ojs(@o J)JTݨUhfN)MutEZSF%kMTow܍~Utc@ː>։Oo.@YN_ &'wN?^dfm#7l5.OI[/VUw@zkk@yEo9vqȅZOjsEaNuݒL78>v; vFi'p.VV99^M(ZBG= Avn 10i~XfGcjnPYyoIq<+ [@z NLohx\ZLXޯn@Ϡ8mnTzEb5ᥤcoxٶ}5RnP(.]J" /iHbʩ"񳄄j9{WpNjaNظ~LG{QXlYႌZĿ, "Oe pco2ԖY¯xJ]z7ihőXO,F~%gbS"ۓ:0T H J%1xs!w|&Cf\^<iB:'C\Bΐ4k'HK*Y4cuEdQ{;˭ CK$6Gn`T(@vyJ>em*tW@GYy- LQֆk[(t/k7eØFSi:j;-zܩ*ʼ'MOʄᱺ?tܶ8]qKo+ ]@ŞV aH PxePv)B|2=5=QQžjLv33~Q~Ov#^R>%qvs]$@2*B7H2@kNdu;YoytOP~USh (ďgZƝ$8qH؅^]c$tG|WkV=ށV5]piX6YtaB ;>ttV%(E(ʙ(:$7`}!9,La#n &^kLØwhZAe7M ;5\3j|u,Xgk\fZ1s@ڋ_轮WѠ]Lkp ]/^0GG'5LCC#.ucY1T+kO؛f;$YgFBEUwnf(d6Xs 0b\@|OO"z V67jU|7t\뢑fns#&L)@2|$spTR0|͓_x{a -gDB{;uSTyj{QE!YӁuX.$t_?I X0pI rjG $L4[{xw{Fj Fv%2N${}go0,#kvU2.Rʀsf0ضH" 4.~[3#6U; Wg Sd}>RZ~;tߩ07E)bDe ?y.Fu`<LJL!E<]|<(17> „o'3hMqOP_NOzdz0~Ilr1"~ Hf} m(L~.NlKy cIg. =V^W Medvcۇ=:)̩B$xia2e(/&GS \RZ䃸INė O* kg #._g?Ÿpqz|xk+D3a,fN㣣z/1)%|8'{p2^Hp'#BmiXL! ds@phtep [OphMWXfz4o3mnhaJ,V1qu]oʷH4t99gYKTafTE&A ^z[Z }\skGx0xTW44~׽oyh;Fxόȧ)1ZY7bMwOۮbf$f4vt/ WfOy8[~;]X^GjfW¿貁TLJHtj@t]8 uF! {'٢xsҬoJܪŭ/:*,FW! Ox󣟻1F2ߥޡ= CSy?+cD=J6#'/QƾK%nl( #!sC A>J "(Vaws;dʹ0+ɫ7SlJ.}xEVEK8~q&e!/WĬֆK7y?uL ullvzD+F-0GT$j vqNW@ɗ 5uU.͸9?ԫ`\s$@ėJ 1e?lu$O;鲮T*rluuhRqG~1 Bg͎\GM+j8j'"onfRCGUUZA>J7CB{تγkb'}*#v4gmw]|r~jMEOZo+(KQCՉ{90QOZ^Ҽb4WvYT\hr޾~-_JI"DflK_<vjM4J~KM֪g,8EhXb:~#dV-_R0{ة* y :~U!~g]a 킩[r_+&p=fXyOt9:đ= %1Hs$K#dk aYbDIz'r}[}ŻPVGc%$mxõ&5b݈lThthO=ZIՑR {wx⠯]Z6w2Ѥj: jJBvlE8Q8@ %a.sb~?ˏzuphpmvault-0.8build1/.git/objects/24/0000775000000000000000000000000011033557576014312 5ustar uphpmvault-0.8build1/.git/objects/24/94d64c179fa7bfca25f9993a6b389578d967b30000664000000000000000000000027111033557576021440 0ustar xKj0D)cBCvYV3?BjY*> @_Fmc`9F%\ dA] ޕN2G,\:EsvݎM:ʽg𹿁A]@VӝDUSW ݖ0bZ}(j2ڧ_h+xɇb[r>NYUZZP4F*]Dmz ,(3$ 7+tvoZ|:TQiAFAnYbiN ]n[Hy&rc }|+uphpmvault-0.8build1/.git/objects/d6/0000775000000000000000000000000011027372706014367 5ustar uphpmvault-0.8build1/.git/objects/d6/d866777f384f448cc064e45614dedeb1c611800000664000000000000000000001111211025655646021403 0ustar xZkSH>_ͯTM̄͒Z&l63rR"K^Il>ݺ9U!/.Md/kw{[uFZ[Ey76~0uK}5  U^'> ojdvEairz ?g*Kf>Y)ߋU0pʵ snb. sq:U\\L%3yxۿVouS/RWi"uiVYngs?B:#=#K:KqU= #3bNH.ЋwB$UU tQ1b4 L]/ ,L߮%x?ռovI+>x ^ HBQ$'`^AnHgm[JZ&w!9F3 Vy-jXԫLBwEw^5TSI,08`=bf P2J|(5]~Q 2J @6VΨXu 9WP@ƽ Wo!Y,DO%^x#h0Zg ZbF2H) !Kd!¡,VY"nƈ~yw 7wNȤa܂RE(G( pG*a_DX*v_?gRgבpn׽taQE`Xu曕%K)-j23`aփI +p@}؜뎢5P9­:R{FJD(JiX&3fF*TY%V_$c1\4(3Ep˽H.g JL](  z׫d;7ur98@ʃxw|27?xQ|/-%3Vf_Z1H2K*јҟaDjʻ7U ƂhEUks?^T^Lr+ Me],N4D v̇?:W¡]b2%s*on/O~K[6+XV3T/T29r%|D׮3&Z7[EJM4QJm>Z/7^A!16o0pFWi\ёgk2c5),XJ(e']Xfe}vK)&Z}?mHٞMM&^n;ɤ CH$-p^NqԈ-Q8kjn>tz{TIq6VNF=X) r#JNح?| lq vO{Z~+&hZVrBc2_Z&pK-λeFc:lp86l 9r|{^:;;\O׉6'ONzF9pz>zwv}q΄==\3cu6h,Pi_/ǧ0z-NLfVIɒ_5?`J}a\62%=ZLIyQF0R# C{bໃ$] l!MiK3߭UD53 螩%GT<58Xf@$Dft qlCZm cZ=W(.iE p ܟ+-#KO2Ď ?\0*22K t(^i-bx)c!,TNUѲ'0B0cH [灀 aXj2o$֟mhL>y} InHku@6`ƘٰCaVI2_B!7̉#iAyI^ "9 vm76[&n4knJ:;E̎<33p}8dq̾"m2wUZx圑H\N@h^Őm]F 4UI`is&(o2@Z]E+CQN@9Ty'O gC7 eH2U=09TN;0bt[ hLF? #vRC~߲Fe@KyWAfdEc ev{FI?al|-9$_kq8e-)SdyD_g? R={c%3#qr`\LvX؀Dy6XpIՙmZv?ńTD&*P1ԙ>Y}CLU S c0 4O6j BӚ)|AuM{@%P )ȶ#ekFA䓗2$%#:k>fclEKY,,rBli2U ~Џ( eԳgBn}ܮmÜqƽFFN6K(6첁.9P`1L2o j9|!{ʏwA|%${r x?k c]$H};^y#Ao8Z}zd'O1a0ܛJ@JpPea.Z voJQmlHv.%laCTu~yPgEL`~=ҶO?k^(`Gw0/%;*^c-I7>7%lQAboͲ `@fs8 +R9za<&R^_@̘;S|K2j/OT$FLH6MzS9&J9oRa!!sFcNG j4l WQiM~D3|fb rC5 H}WF`x !,Pn7zuphpmvault-0.8build1/.git/objects/d6/2250d08e25c39016aec05f3d899a0317bdeaa80000664000000000000000000001127011027372706021507 0ustar xZSH__UMdˑ!,;`3T.咥6VE !@OK0AZqk/h{ O;,|Jd0Pt(f6g8!w/zQxLzLxea*4}W/[#8tfϯcyOڴ "VeQZ_z?J: ԝ9Y T[]&1VE1 ZqtaɁtC|LÕ`,IϑhTS8»Ed0ɱ 6I+u0c 3"bK"0@~Z%} s lOb Cg,O]abX&aWj)PfiC_d veaP r%2 xRrPu,ZcDȼ;ۋ/NȤa܂RE(G( pG*@DX*-%V4[1H2&%hLp8<{ݛnfA$n4Z{UoK V|S.m7aw_PClGRK[6Q2V>}xK[s+{=GN%9//J\Pq8C}%^NhcZ}u6 wzƅqvv*S]C.O޺钵4R{,˕j6Qm7Qar[mӹ:TxEnQ*v&rQKnNvi)@[[HGG(;BIϪCVw#Qkjn?t_fR'An[cEț>wT|a'p= hA{z2V,0h-eW c/Utx5~m4~|h>X>MzލOphxb(^n#ۧhϘWg}g&fG? _ή/.60o/.zëMf/&K5x2n|5wë Rפ?< (L|hq2:vAN)6v1 P:sp` tr~^OWC0 VdpSY%$+ă)#qBش$xj9]%iNX)CDQ!I߂H~N 6SD=d﯌`K];LVt VL)fK"A;8{DZMkdQgOPh&^]F">ebcutDz0#iZ|m5F6=}7]Ձ݌^qXA8B1;4S}W"b`#nP4D-n좎rslq0t}8[/WN+ޓ=jA%x=:hxsGli sz(>8 ?ԓ@lI6͌s0Qs( &nx r5W^hQÊ APRQj`# W_I"r)~O<;LGZ\mAvvLY̚4VMҧ9 7x !A6J؋`&"P$'fė$N+eQ?O =MuAuެ66-hLl sNJ$P.o@hȶ.:e%`iw -IxCڼ̸/r׀{Zƨ`\\Uzq$ag b"(]JL5f'1o`R,׷>΄)v7^TBž[GJ>ՠ°u(mn@@n@n혉E]ߍI6q)c @<)b+bd_݃h $ طQe$@ ŇrA I?L,8(lQ1F1H9&;nJZ &Ÿ@=}=:cR ?{8ÜUL)evGŗ3X#7[J!fbvu{,5$[`H@Z}3Î xm0GmdRjӡn|R\v%oǨt"Gjœ%ub|>{kn`EAوP5BsFr?0w8l>n@=~=/\-  z۰,֜)YA(IAg#9$2rlGW3KDFK&Yz;ZwpHӴƸ,GNʛF$kN^ԕĸ%5#+2 L sD=30L#yG43`kA0찃Z=s%)c_׻KV*Z#kR > GeXm:LJߛPƟbL%+7C.NCx11 }cy JƤ!mUۖ*BbuK +|t ![k6/D!iZ] q pچQc{,x mC\l8 a/g91|څLCDlQf `>a.u(Ȥ\Kv imÜ^]##HOS!uvAX)_aeτ_`Y7×|6.T-Eo+_wȞ3$h߮ ㇏"~4,i:if7hlJcnӖ5Mo% 1U-=!LA*Ü^5%ɞ\uAMapkKBNsSmysTV_.l[FQBC:]uwAMqhYXGw7`og7<>2ouwAmKآ&ӡqK:!/QrE5+o?q8b`M.l"/%VĜE@Y=p!Zݖ0bZ}(j2ڧ_h+xɇb[r>NYUZZP4F*]Dmz ,(3$ 7+tvoZ|:TQiAFAnYbiN ]ה. @m,fV}{Muphpmvault-0.8build1/.git/objects/info/0000775000000000000000000000000011025616626015011 5ustar uphpmvault-0.8build1/.git/objects/87/0000775000000000000000000000000011025655646014321 5ustar uphpmvault-0.8build1/.git/objects/87/97d085d64d10e3a4f993c25d846d86f194ac6e0000664000000000000000000000056611025655646021433 0ustar x]QMk0Y\vM\ )ٶ$e! 9^iIGÒd.Ҽ7ofѷTW~Z &͠c$vz%&~X]g]ʜ0pA|/zBmBCnS$pvK׽7l&gHB$x;;ؒ##v-w I:+)|ȔJUn|ck ![:9e]ݝV`&51lj!.]5ͯǻSil| T]k1qݘ Z'a:|z}<?{6˽ ݠn~ w}F _#8T\ Q]$n,uphpmvault-0.8build1/.git/objects/e9/0000775000000000000000000000000011025655655014400 5ustar uphpmvault-0.8build1/.git/objects/e9/99884c15287c43ec797711ecfc8421903a931b0000664000000000000000000000025011025655655021255 0ustar xK0 Egq> ,+pmS"Q0`t L9Gs@4z3cLTYB(cbaL=7{v0"aVBtX%i@lCt>'kgi|WYC.1{ݶn):;̶<~$G,uphpmvault-0.8build1/.git/objects/9e/0000775000000000000000000000000011025616714014371 5ustar uphpmvault-0.8build1/.git/objects/9e/bdc52bb58d5057800c27586f2fb0f6ccef972d0000664000000000000000000000034311025616714021673 0ustar x]OMK0_16/ + *Cۤi 4ߛlaYw.IfոߔWض*n;1y"3onH+6x weXw]@ˏ VŵT!% ?|!rJ-RI7 xƎR HN_RϱVe/| '3r)q44]0i0:td],vR$c-"Ҟu ߉S]߻'n9m*&>kS\I؄@=+`언Ob6~ro\g-76~iIx춬vf"xÓbcʂ0>4`-&ksllAPr{ dUULo&'멝g1I"K*₱2σ*Hz *R} &;V(;Oh KMFAAʧI2$Ʌx]6Vz}ͲarE@9I2mpg)ȣݰPMkq':]utR1ٟA-<|xi[2S̪#X'ʰ^ 9'Ա:xM WWodVq=8^,92F7N=pS/DU'V ')XHd] uphpmvault-0.8build1/.git/objects/92/0000775000000000000000000000000011030113224014266 5ustar uphpmvault-0.8build1/.git/objects/92/d7bd7ba468bf6b5ce4dd07e8cb3156baf81dc00000664000000000000000000000024511030113224022060 0ustar xK0 YU⦍-!` āJޟ^uxjUpHV$dIlHFdg1[4T<y>p!rA0 RN8M{5sZ^Zᢟr}JS GalXsP=gkmkmt%E<uphpmvault-0.8build1/.git/objects/66/0000775000000000000000000000000011557565156014324 5ustar uphpmvault-0.8build1/.git/objects/66/bc12e1cfe3953de6e9d21bd48c29e5b51abf490000664000000000000000000000067511557565156021772 0ustar xj@{E IX%}HZc}Z&rg|3Zwͻ8Qvh|##=f5It$i@'t*g5ZɣuvIb @8٫=%\bGdErHRG%U"Ys4#4ː*6MgˋQ$%d/xǜG/ˠl8ZPU-'H<9='t=gzϺ,̥+Ա{_&_M[c48gX']zl ex2}™5( vo},|=,6 [RSSBܔ0`'h!DG06`Ggm JVy-NNq+ |[!+զZ;).:*w53ob y^X uphpmvault-0.8build1/.git/objects/7a/0000775000000000000000000000000011557563433014374 5ustar uphpmvault-0.8build1/.git/objects/7a/61c153b4c9893ff81057a94190dafa7f9dbf2f0000664000000000000000000000046011557563433021626 0ustar x+)JMU066b040031Qpsg*8!F}cx# WQ5< U⛘ʰ%hQgk>zڂ&@ÕBxnQ:5$4\/9U .nK1-]M5 /^xC-mɃ*IHN-(``]p@lm#iw6=hxU_PWTnO7s->QvD ,4Dς<ͧC<ךHTts`}YW~;\uphpmvault-0.8build1/.git/objects/78/0000775000000000000000000000000011027372725014315 5ustar uphpmvault-0.8build1/.git/objects/78/f42f905849b16f8818337b2dbeb28dc9c2f10a0000664000000000000000000000026711027372725021466 0ustar xKj!E3vo֣4>j-hB ㌲}ЖXo2=˹j-jFڠ.d_n)n 5zڈ#uؐrTZ\DEΑeab˞b0;uJ<3ʕZt =`tS|= 0ho$=(q jMy4Ouphpmvault-0.8build1/.git/objects/ba/0000775000000000000000000000000011557563433014447 5ustar uphpmvault-0.8build1/.git/objects/ba/8452be1d342fc548e6ac008af3baebebd6a0f70000664000000000000000000000106711557563433022151 0ustar xS]o0k+h")e]V$Z;iZdC@`Ze}אuOC\߯s|| 4`8p3"62&{wGev!'{\8gAs]!o0v7c(BAmcΣw`Ml[@Ggq X %c"dݖ0bZ}(j2ڧ_h+xɇb[r>NYUZZP4F*]Dmz ,(3$ 7+tvoZ|:TQiAFAnYbiN ]:h,x9%ru{)uphpmvault-0.8build1/.git/objects/b1/0000775000000000000000000000000011030360277014352 5ustar uphpmvault-0.8build1/.git/objects/b1/5a25deed3db2115a47760936be9e0c96c32b0f0000664000000000000000000000026111030360277021556 0ustar x+)JMU047c040031QHHKOOghh9݃'VMxf歾. ܂~F Ηݞ# 8u'8j!QQ/ԕJ *23Jv~ҽ_ye2T4'K'޴'N4I80/AJ3uphpmvault-0.8build1/.git/objects/f2/0000775000000000000000000000000011030360277014357 5ustar uphpmvault-0.8build1/.git/objects/f2/e85c41bc18941ac9aa936bd140725a729859890000664000000000000000000001352011030360277021314 0ustar x[ksFݯԯpP#+Gޑ%ʣD*$oe@SD`xxP3U%qEH s2p2CRBcQ 㢖T\aN"WVe7gbQ20ca""PwLRcQ!O-Ne:u vcBw0aM1 3dUr:F848k呷`[s𥁏8RyE׮R, :$߅0 Q;؇W@&П߹ F%1\51-l! ETuE[P568PK`qVĖi/* p,,+GII Y£B ͶdXf1xm"řwG\_(XFaedOR-0`d¾jkVpUN$*ZkU'?K)h%(z-`?Vάhgj A"kh*d"I~oF}-&ׁnq-v^Kzg묣 e8(P!}M"9A̲A( |LGB7zSGD.(c@y`NL{2WEdwY ,›k ۻr<1˃0_UV (aNX6wGޤ4Zaaa}K}ؚ':{lԾLwõe4Шרnқ-%;juJDZs`Ȍc7> )$M\ueO/76|MzMP!V*휎g}q(,:W4G S}BY%Kt!"E^ ˍ/5’I,GW{u2wwvfغ=Xr ݻEDh/鲣LXND<]S_ hXNmK3m P}A6㸛L`?ަ]?K!u6Im_f JZE9F\W-G,x2[sޅnv5ʃNGmd M:Lr]S.HVQ/2퇳Pv"b6`1| X:RHM2*cYfmR,JlG Xp.XR`ݚ;4j䠲BHrvQH[/eX&".jiE3%&`!r0Z}V#B_@.`F_8-uloo9dyX6I)ڤd0zvXΫ0L, @ ] /:P;R[MTP~%̄ 1xjS ~1!hn۲L[ fAC+|jD?hKTgM MiIw(TڽhBY$:1)6!~Y*zSOJ۽gK=D^:u߅G]Bc^nhV" 1Цp-M+5B!)D-,Z DD72;gTfS >r$\Ƞcx*[zs->O`*+Oƿ^&ധZ{(ɠh^<}ä_v﷕c!U& '{j= 6NCg E|5σߜC}G';ݗ}a[~x/Ӫl 4*`{md8/ƻfFAA;лxq0l4=ȄkI5{9*g:fIo42o~:C~{~q{s|1Z?NtH|45?F~p ~op5} '3¨F!UKPjj6.WXΎM"4"b/c-69Dҿk0oQ3 EYaIgLN +|rzFV7ָ3MzN) l?̣o̕<֩a$%D~hn`[a5̇fT `Vd6-vkebptX3Ӆn,F|&qgĸ/C+uN5r]/VY_1sen+ߊ捂? pݨ,GfA͈͡8 0I0P[O* Uྣ,~ 3x+ _Jh| _bUjZ[WUxr"|(6񯽈d.վ/a= gI@ِKV@f PWyL"Rl`EtcIv|"i#S tq;U*eWO Іܙ-lhlcpE`A%iɱ>CEVL7wg/zyi!_N _* V pn/ZV'[ƟSڻk kOhȂ!]zY$$lvފ)*y;zBbg{hsdz=p׷2Un;5>n#)ȋ[.ls(:re !,#1Z ,]zXZ!W&巕<3eOd4 ¦U /[yhѪ)86G$>p*+ Q& ռsd8jx`%uEnO5U[B1k\W:HsmޭOzeλu˽'۔oK5՛ET[TbofoBH#w2W(:jX߶} f:J% [h\.G$u$DvݒZԛq'8b#o !k.3e,,e2"eϒ ֧JQP[ =29ATͥFWǵ˗ST(<!xhcP(#8GgeIѥ\3E"aP"cT3P6*6ݹ-B!A !?bv#:a} )k6JhaPZOLi1T%-5K_< u7@p.THk TgcKr X,[OWxxPutп0p/Wfֵ) =$玵wzx[a9`cKp_&߭WnjS~Ec7'lȹ0@`əE(A ,8^1蹩8mpZ#T UݮfgkW5my7 >juphpmvault-0.8build1/.git/objects/bf/0000775000000000000000000000000011030360311014424 5ustar uphpmvault-0.8build1/.git/objects/bf/708f4765d3f1c9b4cc8472d12d9a60e23579250000664000000000000000000000026111030360311021354 0ustar xKJE1DgNt' ܏ļ-5*P\'8§9Tl/A TEi&p2?ݖ0bZ}(j2ڧ_h+xɇb[r>NYUZZP4F*]Dmz ,(3$ 7+tvoZ|:TQiAFAnYbiN ]G oxlv/6rFq|zuphpmvault-0.8build1/.git/objects/bc/0000775000000000000000000000000011025616714014440 5ustar uphpmvault-0.8build1/.git/objects/bc/da31bf0499c7ccca7fe42518f5f732fef36e920000664000000000000000000000056211025616714022035 0ustar x]RN@_1PR -BbPތivnRvݭ^ڧ9srNwIu&ߒiM9Ndc* r;<`XVDv,N4tgvn1 e3[{\G^߲:,ːF\vmuT >Ze(x!UP"(g49&CVs݈?p ~1n %C|.h\׵KS%$32VHTdΉbנ#U"2o\`\&GlIfxhTxRI vj#TfoIu.9@\U ^G"i%ɄZ蓔h,.V3.1uphpmvault-0.8build1/.git/objects/dc/0000775000000000000000000000000011027372706014444 5ustar uphpmvault-0.8build1/.git/objects/dc/9dffcc9eee2b7fa1c6e8c676d6414b1d0c53630000664000000000000000000000006611027372706022114 0ustar x+)JMU06g040031QH/,L(ax{ J~X|\yQuphpmvault-0.8build1/.git/objects/85/0000775000000000000000000000000011030360277014304 5ustar uphpmvault-0.8build1/.git/objects/85/2b12d13997480d354c5d1686139969da8e8a380000664000000000000000000000021311030360277021102 0ustar x M0P=ŷT#d ĕ Wz0oolHM=9o#aœjdl=$wG)`́H-^Ew;8phVK x+\%BuCڢHZ/+Uuphpmvault-0.8build1/.git/objects/f0/0000775000000000000000000000000011033557552014364 5ustar uphpmvault-0.8build1/.git/objects/f0/d9c6e251bb8660a0c37e6d413a720fff87cd5d0000664000000000000000000000100111033557552021651 0ustar x]M09Wai@R'δc[cZߙ"%2vfq**0yf:4.6bY2dA8b_GgvbF|PSՐ$Lޙ9zLaba~ɭ?nF_l"m𷧾w$dAZ\84m;vSdѹ=T!(E zzm;A ڥ}ا]{[x{}GZJ-7uphpmvault-0.8build1/.git/objects/32/0000775000000000000000000000000011025616714014300 5ustar uphpmvault-0.8build1/.git/objects/32/5b5688468b88166f1af417d2b4f51647d1b8240000664000000000000000000001070311025616714021156 0ustar xZkSH>_ͯ&f͒ZNfٜKX] ajLuL$[88Zb9ׁYzy s54:bndqCCRߋT4q*4WF^%0d#Ywpr\6`,D,"}/ũ[bHް D+F B Q+?c0CZgI^h/g O/'dhֹ^pʹ蕇veaP)v%2 x2rPu<ZcDȽ;;F xd0nN-^PzH"K>"K5L83I4\FaS.H R!\+ǩ7 YZXpU~jo=_gkd߳葝 QhΏ bd'Q量be/7`}.\21&#!Y-5h NJnfҹl](1"5d_BҐe+ꜳe XFܘPPINx"͆]wU/ Q g,CCVr:GoSm;$wkjQO/mÅ-jY#*78fD$Dt qlC鶊AՎs} Ps3tVϵ2ʆKV/A.*aveis+GnÕ? &#d@Mk(HK aqwr<"SGbb:dRt5~K,%hLMlFk [^HrkGZ#?241JҦ̗#_ȍ$srkPً`t!P$'fMbFr͍YIYt(ПّgEnnv&6$Yc>#@MƊi.&c9B"(u2W1d[WQ|2z)?*{ ؽ1,I9JG!i]̸r'{JƐ`TP,UyIcIvg b"(]J?K5f'1o`R,׷>΄)vYTB?Q R} " Aa@"8U?߀5 \ X[ iw/񦈭e":{Ry)54ZZ5 72nvʡ%*$κj=09TN;Q+ŀ?lz Q AAD'[z3!5oW W3=Z mXn KKMWm!dz } kdYJI6aFSHp?GRӡϦlR_ 鋼?&cm`iFڑ5p1霽1/`L f-Pux fU'߀FeJz\kaX+OsdUWkB[$)hpd#Mah_]VNqfT XSn }VNΞ>=6MAn;Nc\#C 5 '/ZKr #gT2Gԃm;=s$AR0DO6K@=s)_oI1ߝ DuFȏ+,'8)vLEߚ(#rL o %Tk0łKo(*wx1! ~ uOx} c|&rr'b\![i Dk nҚa@7 ێDS9O^ʸVH\a/g51 A] DV=C?|3ܔRO ^cHsѳ s-+vF:\D.Ihڰº>6Wgn C-x&63.ju4ǿ· 11xi)r|[:A@KH_s8L ʊv#a} ~F#;yڬ tTR8`'. vMk|SĈocC*#w)܈dSvk_auVדh9a>~W;>^(`Gw0/%{*^c}[>Hn|ȇoRwUmGآ*xe@pVrWyG@ <$|+yc|1g" dՒ!@ [I<'"l<r-Le˕r ߤ CBƜRhk/\jħg6f[d)k s Ps񱛯V |BAXOrg!uphpmvault-0.8build1/.git/objects/07/0000775000000000000000000000000011027074245014301 5ustar uphpmvault-0.8build1/.git/objects/07/ab8fc5572281f1db8de4dc0efdde002b3cec870000664000000000000000000000027011027074245022066 0ustar xM1F]u_'ٺ*2SL>^k[tr% xiaPQK [9Rc3X-|2?Z8] qp"gLYMl6qӑ,sEy|c ʇ7IW",-ugɧ"V[4FhμE[WiʮBgv=ZCL9mzA !_Ԧݲn4Pؘɱ{lP[Kyޢ2hvs}jeD26MnB Ƣ(b Yǩh34N;|}9y{7/f'<|t*В5F*P f-K "\ ,(QFLFSRӟ!rϒ%g_HPEAJ#Ùp8IW{!"YcHq!tTLxQ %;!O/Jj!zVX-uȡv1'[Z Rmb r)/ ]b{5pek'alɜsLefy ld7&j} tkX8'zAh>ٳrFg~9R>0x#:( .9qw\R,ĔGҽLJObA۲H֚ڢ ଟm .K[qޞZp!?@CLXCpvJCmM5D9m^z}=۳}o]e5CٷJ%uwhh9v7_vNcAq6?[T,Գygё+Wjk*2eUr+),7)> D5Q@ {yfpC;~ScqPxAUM&^n{dI)ĂCU[Ȅ Ƈ I#VXkB|4S>~|tܟ*ԈgEdSv M@_<͏>fp} hAzAU!ttpcO*'86\N_bFh4 tFqxF{a@6<]#GO~ث1SL;\O։6+ǽ]#,899E~3{v~{=\L v~$3Mz}6OE~pr5 /? =l'ë"mGhz#m+q1h> PhAj⻥\ԉIh!N@}1.zr5hCl4n"]8:\zl;qf\5omd,"f9I $1ϡ]U~xDoTp(R Tݮmzh f2e3@O"\ MuQfB5!RbDu8!ݮI!AԴj{.f.#ƷjqxYGMEH pS2CBҬmu:yQ/%oj@ӗZKxGH[zaE;ҦB׭g=<(x6#蘓ʦ-ʡ50+hA @aI5(E 1EdA2гeE!!W $Dˈ(9eT|P@+\#2K\$=l1) Zmqqs1c0s2Ұb:~M~Gd1S?ɤT G:7WQu1Z4(. PK{X7{±K>;.̺oQG(y6V&OJ/^iqlPÕ3FPa2(UmoU9rB淸,R3צ4zH sVQU+jxiG=t&l=RQqJ DBmFC1Tn%*z-)@eDŽ;rQ#h pZ:#Ԏ m>;*gÖ? #㰤/@يDR[D1`⦘5K;;ϕPB0cH܆/5@K+SFvFáYHrc-F|gdj6k7ZB) z_Eyt c-0*(UM͒sLZE13)k$K4ȾVt5oHܻ-kh@'9)pr֥@<[EU|F7,y C|z1EqW^ Y]-Vr1Fy'+$t-(CQnE˾% \ui.D J\8F,P/q=v}筡ZGt)7͈S:@OU!eנj"z>پհ*pNq~;¶— 5v@oaukPPWذ͸P$s*' +^[#sD30L#ly#KA0׹谅pP=u))m_V؝_T>X%?-'~7Qua־G[%6zTflQ.} b6]) Yp\KY I:{.ruHD9%Tu؅Q%l[13FJ/N3 o 6.Ts[#~)VBx+${x˧+ޠ GxG(l^cjӦ5ӛJ@Z6{PC Y='j8fSP&$ YG^JO@|3b7o4y٤[NoLF]@lŝ&aheOs'^6d ӳEX{_cXgu_bL\^|/H篲ftNO8-.s "hr9q=iD^B&0L,l m~'?-]$^T8."WVe=XGt[58! !UKN6-ϽEX+,O=A5|+||:{d,}-tfׯ"!xOUA(lR+Dl']m.8Q<^-uGVFS=/qc(,t8c-<(V9Ld& MvM48ĶasRCVK-`lQ+Pam[ ^q[`T RFo  K'h6vmK9ܿŐہnC?$G*VK4/~[ f2^YG m'%a>7d "86QaU9cF쿾hNc8[d>aPY OU6P'X6̿{u,|Vvfؾn}A&Nn"QA7j_}tP8^'f&>vɷ*YLs!ki&[:-鵅MgMS2(պ䔇EWKɑ #ۗMcy m+"=q:eD&d!zMaB24TP0# hrsPh1e;[1X^4 A@\꽝Y $))d@M& T-mG &bpɒ;׽dmlB *0US럖4gb\dY!ʔ9,/>cAd!p7N^_o ~}X pѹ*^:G:%<(IΑkbp _ԛJz!XV-uȃf!'yZ Ob ">MƔM0˽Hu0 Ud޾e2;x2~{՛ {'z÷iO5?QL Ǔɠh4iF~}u)aGt Q \r(FX)*ؠt;SғXж0j_}sl+8ߦ0H?v|SoCa<@0(|{Rz-ַ5Qkjxfbe~VF~Q~dl`33-D2!8Ƈ$+1nG0&`II~<|tOKRjD"xQ?NQؗ]>.v 7ݓ란DG%xZrq;JwIg7o&pkqPwÈh<7h|oq0l4{1Oȑk4k+&ah ^O׉63'']#L8=:C {1Zߌymkxx5 ׯ\ƽyGdz6~!ie;)^6+/&b=rn)uj .x,P_&xr5MڡE67N.=ĝ8aCx޽r~OH62d$q=eIsdg"e@r E*u3US۵X@oMVl5>Xlf8$ 0uФ̼eXu&x'sh`/T?=N.%vH}XTJMF*MN_-dX9BB!ƷjqxY8M?DH pS26Ҭmu6y]Qէw5K~B#-0K JhTی8cNr((2;SS K1 0*؃@tA’jFQA$byD.d,]mVr5LBOBS6AX@aODٗ@XZ\ iԏسe:40kN4JQϡ$KLKÊI#g5!KL$2OTS kY0ϜxbFAA ,k `/@u2S[fi .82*[plXFCOX*=hqlP<1YJm(!mb,njΉ 2Łg=xi}m M?4oUzHCaCu`#*>085T]Ahb(8*-UE Pr1s+iue99w ܟ#-+C2Oè8,˪&!/[Hj(&L33cpwr򯲖nJf|L5rxVȑ3}KI?%Kmd{(z8<} Inֈ,l@w1!:CK6AH2qN@7dE!F)Y2qQkfL K;$IR?3sbq`SQ_[+ar{MN&32[Q s@<BsPmW!P5V/=-9ґ6 >t񽀔kqd_\Blɓm%*)kZOx5[Zq*4k`I L|߯<\2Bx@7Epe(ݑ! U /ZJbefMɊ8Q:zFf~-{D1m|.<j.q8 SEUcr'zUm{UH[k3(}w,MeƦҗ? 6`* ~&DMf…Si<^|g/' 7ѾA Hg*f;dTܖ#,S~abA!FFsWZ g-M5]k!Z!q ms; ښRpv3SʹEI 96wftY ͪAٺA!¶J+d0h)ouWUB|()u|1GMbvqOl9TgH_i=</L |iېYx.fLdRc~a("lI~1qz _eL/ ,pK\.-A4Db{j8p{Vݫ܄]0L,l oY~KaHП .[)'[ 1`:N 5&Wef;JUJ8,mZȸǤ~Rv=Ō\(2}GhUZ$0hI xJrXB GS2yfy]9t} aO0ۼ_F71SzHُx&*LQ<,)Ϭ )j6w1^\}z>GCbVF>;G,0` %F !q;;r] 6ʹIGs` JB/6ٻutFy%˟L3ؐe%Jϣ4V{0hFl`V8uKS J쌰 {w*m<ˑͥ+wS>kȳ6Xުqòڸq!\K0@ՈVxoMIrڬi E[uphpmvault-0.8build1/.git/objects/05/0000775000000000000000000000000011025655646014307 5ustar uphpmvault-0.8build1/.git/objects/05/a550c437c0679b2b32248a96dc5ab2e080ec460000664000000000000000000000110611025655646021345 0ustar xTak0g7 ]VFAHBׅ5Fϱ$MJw$ :t޽{8t7~_ Y1Ie##todjI&F#(Czct'*'$-JiQ4b>VAcdBP.32mA:uvsYlcr2p%YY"\nqE0oJf)K1`&>nK`zDWP;)B 6(5 rrBVvEaos*qLNk/{Q8}UV59Y5>Z MX&sOIV ӇݎZJ:)*%ęV0;Z$oeh¨0z1J-=_Y}^[U\nO9{\ogbO0oon? Z{]kX' T]^9MUu?=PNWYEA>\v0/z=9N}8iFp0r b;x;ONDqgҹN$8_&euphpmvault-0.8build1/.git/objects/02/0000775000000000000000000000000011033561034014266 5ustar uphpmvault-0.8build1/.git/objects/02/9d18b5f2b897791bf832584b84a614221b4c190000664000000000000000000000046011033561034021140 0ustar x+)JMU066b040031Qpsg*8!F}cx# WQ5< U⛘ʰrŊA6__q* PHIMLcЬTx|b$ݬܡ%'3*um #Źk&}k|(%5yP%ɩ%yz KHm5NԦ oܠ 2JҀ}#y8Bif{'*܎Cd%Y08>Ǡt~sZ;h6EDљqn';uphpmvault-0.8build1/.git/objects/39/0000775000000000000000000000000011025616751014310 5ustar uphpmvault-0.8build1/.git/objects/39/54a5da0a1ed57d33a8b68a82e511a4e838ba310000664000000000000000000000032511025616751021503 0ustar x+)JMU022a040031QMNMIeغDyϗ6 Kff;w&4\/9qv@ϕu FQ0oQ <y?]$"9$3?O/!IkLviMaM'U_PWT~Ϝ*ѿyJ 2 rKsJ@2p˗"~iW1;T{]3uphpmvault-0.8build1/.git/objects/99/0000775000000000000000000000000011033557552014320 5ustar uphpmvault-0.8build1/.git/objects/99/690136941080c88d42c5995e4638c9948e3c1f0000664000000000000000000001352011033557552021053 0ustar x[ksFݯԯpP#+Gޑ%ʣD*$oe@SD`xxP3U%qEH s2p2CRBcQ 㢖T\aN"WVe7gbQ20ca""PwLRcQ!O-Ne:u vcBw0aM1 3dUr:F848k呷`[s𥁏8RyE׮R, :$߅0 Q;؇W@&П߹ F%1\51-l! ETuE[P568PK`qVĖi/* p,,+GII Y£B ͶdXf1xm"řwG\_(XFaedOR-0`d¾jkVpUN$*ZkU'?K)h%(z-`?Vάhgj A"kh*d"I~oF}-&ׁnq-v^Kzg묣 e8(P!}M"9A̲A( |LGB7zSGD.(c@y`NL{2WEdwY ,›k ۻr<1˃0_UV (aNX6wGޤ4Zaaa}K}ؚ':{lԾLwõe4Шרnқ-%;juJDZs`Ȍc7> )$M\ueϚ/76|MzMP!V*휎g}q(,:W4G S}BY%Kt!"E^ ˍ/5’I,GW{u2wwvfغ=Xr ݻEDh/鲣LXND<]S_ hXNmK3m P}A6㸛L`?ަ]?K!u6Im_f JZE9F\W-G,x2[sޅnv5ʃNGmd M:Lr]S.HVQ/2퇳Pv"b6`1| X:RHM2*cYfmR,JlG Xp.XR`ݚ;4j䠲BHrvQH[/eX&".jiE3%&`!r0Z}V#B_@.`F_8-uloo9dyX6I)ڤd0zvXΫ0L, @ ] /:P;R[MTP~%̄ 1xjS ~1!hn۲L[ fAC+|jD?hKTgM MiIw(TڽhBY$:1)6!~Y*zSOJ۽gK=D^:u߅G]Bc^nhV" 1Цp-M+5B!)D-,Z DD72;gTfS >r$\Ƞcx*[zs->O`*+Oƿ^&ധZ{(ɠh^<}ä_v﷕c!U& '{j= 6NCg E|5σߜC}G';ݗ}a[~x/Ӫl 4*`{md8/ƻfFAA;лxq0l4=ȄkI5{9*g:fIo42o~:C~{~q{s|1Z?NtH|45?F~p ~op5} '3¨F!UKPjj6.WXΎM"4"b/c-69Dҿk0oQ3 EYaIgLN +|rzFV7ָ3MzN) l?̣o̕<֩a$%D~hn`[a5̇fT `Vd6-vkebptX3Ӆn,F|&qgĸ/C+uN5r]/VY_1sen+ߊ捂? pݨ,GfA͈͡8 0I0P[O* Uྣ,~ 3x+ _Jh| _bUjZ[WUxr"|(6񯽈d.վ/a= gI@ِKV@f PWyL"Rl`EtcIv|"i#S tq;U*eWO Іܙ-lhlcpE`A%iɱ>CEVL7wg/zyi!_N _* V pn/ZV'[ƟSڻk kOhȂ!]zY$$lvފ)*y;zBbg{hsdz=p׷2Un;5>n#)ȋ[.ls(:re !,#1Z ,]zXZ!W&巕<3eOd4 ¦U /[yhѪ)86G$>p*+ Q& ռsd8jx`%uEnO5U[B1k\W:HsmޭOzeλu˽'۔oK5՛ET[TbofoBH#w2W(:jX߶} f:J% [h\.G$u$DvݒZԛq'8b#o !k.3e,,e2"eϒ ֧JQP[ =29ATͥFWǵ˗ST(<!xhcP(#8GgeIѥ\3E"aP"cT3P6*6ݹ-B!A !?bv#:a} )k6JhaPZOLi1T%-5K_< u7@p.THk TgcKr X,[OWxxPutп0p/Wfֵ) =$玵wzx[a9`cKp_&߭WnjS~Ec7'lȹ0@`əE(A ,8^1蹩8mpZ#T UݮfgkW5my7 n?juphpmvault-0.8build1/.git/objects/35/0000775000000000000000000000000011025616714014303 5ustar uphpmvault-0.8build1/.git/objects/35/e36b74b55106f3799fdd8c665e8bfe7d0c51130000664000000000000000000000111611025616714021460 0ustar xS]o@k+FTP—R!T)J~<g|99{@BHٽݙ%LΠ^m,SX,W-=[iiP7hRͅv>> v{PNFybO1;[em%+T&R8 H: u=O",PXıQRr2l%ǘN!e1n6Ka!!Q93|܀'F]&+} ˹L ĺ dd&Al9e wZѣcNJOOxcjRy>#I#/`c: LSU>|N}flH0V>qi ]ALN_bW\hR4< qPf<:|vwm+?)irJz ZX,}R'GH̠ 2y猽_%c^nV{< \xgc Dޫxݪ vկ*yNCҸ8w߉l֪1ya?эInl&Ymk[ȢSc%[܂~F Ηݞ# 8u'7= ݖp]Up%E% vo~?AKX UWZ I ~>@]7jMMJs NTQhxM{HN_Juphpmvault-0.8build1/.git/objects/a5/0000775000000000000000000000000011025655314014360 5ustar uphpmvault-0.8build1/.git/objects/a5/2625d4f74ab80f8e00681a4663dc05ca3ed2b90000664000000000000000000000121711025655314021505 0ustar xSj0޵\N`4c͚4&v(}ʒ~9J c1e}Lѧ:@OF8* U\UZ )Y& |CYƭ6A; x{S"M@Xy',q Óxa{ԼB3a 84pE_GLpGA$$;q3t%Q1X )0)ڰVW KqhZ p I_HQZ,olCTߞ]n; Pо#Kk\. ٯ &HN#M>~Ujƺ# M#b'!X2R=.x8MMїѽǠt~sZ;h6EDљqn'8uphpmvault-0.8build1/.git/objects/73/0000775000000000000000000000000011033557552014310 5ustar uphpmvault-0.8build1/.git/objects/73/240316000465fd7de16250642715f820c13db10000664000000000000000000000033711033557552020753 0ustar xJ0a׽iMnf!@~m|MJ8xfA7} 'iM'8bs䖨[k03E EDx{-|Ĕ̈G"l?&0X+źn6Yc v Y11*)pQ7j(R^JY>ٰDb Y5 UHԛoli{uphpmvault-0.8build1/.git/objects/e2/0000775000000000000000000000000011025616751014363 5ustar uphpmvault-0.8build1/.git/objects/e2/2ca0169000e8b82d5d11ad3adc6eed30a6ae740000664000000000000000000000023611025616751021703 0ustar xA 0E]s%iv(i2)c*x{sicJ. 3أd86XK7HX3jF=Yh˯$БxxedOåߢ3ئA u*ruS%H wI0ŸMX>\*irDDuphpmvault-0.8build1/.git/objects/a9/0000775000000000000000000000000011033561034014356 5ustar uphpmvault-0.8build1/.git/objects/a9/942d9d67c573212852d6b3d30faab1ac2fd77a0000664000000000000000000000105011033561034021557 0ustar xSn@+#H$R"A718ԦRU^/Nԗ~{fm.OEb˙g?N} ?\m:!Y.am +ゐZ9.{E7X~^@׺6s;0fX .#8,BFBA\b0Df3|n=\}zC?7iBJ{u (d2XMT% IAs'GTI}4G;X\20Ƴ9ZI^(DTGEZ{ hby?7e.o(is8Q}//8 iދ2 LǏ|w\H%#Ѝ3!sP>&!ȶ!2Ʒ,@'fN" nCZ'|~&Xf{ӧTZ]߼%hHz>V5$Y SnS>on.`Z)59g:pT<, ʋ"w/:V%No`}A8d]369!O= uphpmvault-0.8build1/.git/objects/23/0000775000000000000000000000000011030360277014274 5ustar uphpmvault-0.8build1/.git/objects/23/f612e81034443c5e6259bd3960dffe84265ba70000664000000000000000000000042611030360277021302 0ustar x+)JMU04b040031Qpsg*8!F}cx# WQ5< U⛘ʰu/'mw,Iﶉ(&e&1lRv`{پy<kC I)-(KNfxU[HkڝM޸Ae敤Fp~\OTQ**-(-K,)Ӌ=SN}ѡ(hFd'-wxuphpmvault-0.8build1/.git/objects/25/0000775000000000000000000000000011030113211014256 5ustar uphpmvault-0.8build1/.git/objects/25/c0bb8baebd119299a4d66a8b07cb162947e39b0000664000000000000000000000042611030113211021552 0ustar x+)JMU04b040031Qpsg*8!F}cx# WQ5< U⛘ʰu/'mw,Iﶉ(&e&1ܙ̼w 8Vv['8jHJinA^r2ëZ,\>ݖ0bZ}(j2ڧ_h+xɇb[r>NYUZZP4F*]Dmz ,(3$ 7+tvoZ|:TQiAFAnYbiN ]?|ai?5WqFQB7{iuphpmvault-0.8build1/.git/objects/a1/0000775000000000000000000000000011557563433014366 5ustar uphpmvault-0.8build1/.git/objects/a1/c09652c5f38b38fb5661b2d330979928a90eed0000664000000000000000000000060011557563433021377 0ustar xj0{O1Ћ얬(ii li!Ph_@mY2f=H\kQk}|qU kQ4dj- >~Zu@ G(L&F'3RLKi;N0 H#-ɨiH}d.2񝵶 ^jWdovc0{NCS5 -U, %nѦ~{wQqJ%J!JJlťտ[^嗮 gfY3$k'$]'LYp0i9-'Ԥ*d 7=[n"Prw-wMWM ,H[D~e:GHUIųuphpmvault-0.8build1/.git/objects/pack/0000775000000000000000000000000011025616626014774 5ustar uphpmvault-0.8build1/.git/objects/b7/0000775000000000000000000000000011557565173014400 5ustar uphpmvault-0.8build1/.git/objects/b7/d262efbdf02b036ffe9f744819bc10d78e4b750000664000000000000000000000030411557565173021702 0ustar xm0Dsfۀ D#H)M@2R~B0m [oy`89 ȸdv&ذ- f1:'N&eޫxgmwhtÚ?Y\ndn=Yk51_aE<@R.tԳ h? TvYϣԝjx@[]⸪?Vuphpmvault-0.8build1/.git/objects/e4/0000775000000000000000000000000011033561136014360 5ustar uphpmvault-0.8build1/.git/objects/e4/2d1a5252aff0012ec05d7ca17f7ac0fc79f7dc0000664000000000000000000000043211033561136021771 0ustar xmQS@{OqĻk .Px3ok;;;;?MB%Ē66NYRXcui2: C)A4H>a}-[x[VnSBJ,JmLccr+݀/ Mxœ!x&Gloݜ1a%+? I;* Wy.6ʼQbFݾ6c ea;+к{$kR1B#=auphpmvault-0.8build1/.git/objects/28/0000775000000000000000000000000011557563446014322 5ustar uphpmvault-0.8build1/.git/objects/28/28f9e8e880eb468c110b078ea52660b1bf38440000664000000000000000000000027011557563446021324 0ustar xAj0E) k$YPJ!Ь di-#d+dySݶa"w|tКRQ[a9J"#6އ-;m8i9OO,D64Ių?j}+YR}M:g,i8(rP9CW|2 ?9MLHuphpmvault-0.8build1/.git/objects/80/0000775000000000000000000000000011025655655014312 5ustar uphpmvault-0.8build1/.git/objects/80/26e0676a8ec7a00cb78edfd795d8b39d8ab00d0000664000000000000000000000006611025655655021700 0ustar x+)JMU06g040031QH/,L(aXz> );.J\uphpmvault-0.8build1/.git/objects/19/0000775000000000000000000000000011033557552014310 5ustar uphpmvault-0.8build1/.git/objects/19/d4266bc22133e5d3ad1c29c5606a234095328c0000664000000000000000000000073111033557552021202 0ustar xRj@+E*n*nDmh fZۢ$tIK=rH*23g.0g86%j֨Hap˅s4@8$$xnqz/yVl8׽_ ] h)7U%x"%|+A.853:`'d;puW{p0B0̻J"Jt cN(BǤb߲->F͝oiJPɮ,&?\2'h( IORTYN-! j\]ME j3~ss|ja5zoxhshP~XU -/K ᑛB7Տr k3HL4iNGc!1gV8ڹ6Yy' ŗ_wZ;y&d .p=} h琖/D8Ad=  ,yG DڰF Nsh -Q].E Qֿܲ5H3{zf^V@Ah,=vpl@%ArI+$-Ѩi; )=Ū)V &^f }j9戦ȑ+fx>]H=K}l&KEv^dHN9} mJJKTwd%HL,PRZbtk1& *PC=нq@01ճ$S:<a&6i41x<M4GGF8|qqSߴl-(z1Miy{Z*!i<-C(]CΝuo}wǨ&5$>6Z]Q}m4_/oŏuuphpmvault-0.8build1/.git/objects/14/0000775000000000000000000000000011030351301014260 5ustar uphpmvault-0.8build1/.git/objects/14/b9be08a3f283d1881878704f1bb88bcf95a9b10000664000000000000000000000077411030351301021444 0ustar x]k0 ݠv etl#{X@%>*K$% eNN&OI-|xf3l > [mRK4-jҾv .6aۣ ܽSsM.ɋ\%,D,I^-v.V+8[2zF>I4-d6~U m26=%IY97p oj}mL%i|zKg*g>^)ߋT0pʵ sEnlV]A8UTsr.3MZёNZM.B_Gnu1V8lbUj=K#3\fqf4S Y׈/43u,b/N,ݫY.)z.!OBu/m01]\ jǹ"=qYwbt(\ 4DB#b6`NC7\nrTg:WPWObe:+rvߚjϏ-1M rDF+xJemc#\,(]~9R 2ԻfS04EV7pw;>f8Mg~ƿ>h?F1 2*HlR5bX#&p2 V9@%<',^)>  \|YNZH7]h0* s8r*EqNc+P#q8NT6W@ypuKMƄ<:qXґz2Y ۍ<'G7O\0gi#L<༕[ނoͽ[>bK-]K ;$߅p Q;؇W@&9kB?aoKTmE[P56b;0(K`qVԖi|C_@Up,,+GI ["¨ ˶lXf1xk"ǙwG\_(XFe[2&?{Q1*a_A@̵Avu+Ry*'t[OR <4V`l ƭ^ 9؏U?F0+<#Z-D홚>d0:n Heߛv]u`[s! :(hY9<;)=> AdrDE|bH xu0o,r0,9H$Q|^b!2 f-]g9f8S^̟{#T1ٕnVxMDƟ~ WW">xbm̏ENhmOׇe.>א$a> HkĽ4R xM7ju+׉d;qBL3$m&\nҪ#,H}|Tnқ؇ O:To gC[닋vG4f"x*K"/ pyY"/7K&l]wUjZNuQ{r1EEi/0鲢LXND⾙]S_ ]NDlK3xs P}TA䤛LhSzΕv}/ٔrD,Jo,m<;5;M妕Դ .Tv5IoO@2\ %t!|ITEn18`2W:Lr`[ Jkv:E2퇳PNGRCmm+,a1B:3 -)6`(:" {OlģH&eRBҁȿ' ^\R7aihĚpLkLv.h V}U #"ԉC,tlJW2@I4ۭOme;0D[6oPh8yYׁڑj 0>V'᛫O_',$Eλ@lJD2lQ,q"9hN8) ,)6P ` zӒSl,W0hb e9|lR,fFJ O>9?l!gsh#uAD#Fz[)<$XǤC[a 6opvMANʷhh5Y2C :FCwLȚ-,0˽Ip$SMa9lC$FZbП T(WX7M/ᯓiO>Q  Ǔ׽Ahŋ&~[<қXn7H-1K.21KA^y1|ZҶ`4k~ :?n^ ~Ą˺./v?:K sN٭&~xT $-4aؚrz|3y1(oz[[wl>HnW,)ݲoweBEC+_$|1pj "XkKx*I0кͳHՍK+YU°r9X Lo D$j**H@G69۫/`R6LdrhFՇE_d嶥:Zb<8Fc>|b>δq|r̺k磟Po|=9\o|At}K3hq1fӕjOO.-wȤ}HPz5Burfx|A&)G8V(N\HlgPHV qS"KKoMwMo|vQ_>dd8Pt;1&Gn5\b(\˚+PmRe§΁.EÞ!(ăb[OX̨J17DUO L?z ^ QEN/2*4AIٌ E* `#dj\%2O $ItHx6 A'Ʒ tNi89l5B cf?3 sޅ-aS-["' :p:rÿ<2!騩L M)4HGXfRJZ!Jw3Id0sgIE}LY6zPƺI]e` f5Zhk]Ӏ0yEZEd\>wYGf\Xk ٜ(h;o)J fl⼉-(Q(9 㾭5xe]QUv$K;b[eZ,gzMEԎ?GڥYMTt[}O3avվIվq)7kf|z3ZA$]Z3zxj BE"ee+]'K[6rGƿP[ڑ HX/1앳\մ-{1S븧Yn/7˝<*.2L`಺u2XWچJX0D+-aXv LSG؉|h-1aܲMl5Ri+H6`8jrmI,#Cdr4Zִ2 of֓ZL$ɆjlVKkͩZȍ /П9agZz;vut57uțZzP!h90 E0(0c|iYtM ar zvvob:5Ȧ}yHk9!Vhbw¹Ut@J>ƹbDt\uJ"H{wP9Bܤ+E/]b`e9 <sQXn50lRQ,y+<ǑYw)sH)e^C GY#uY'ڻ _kMC1^21.# h}76Q8yҒÿoRFfdx^#8k;.`4`F\;tQybk\,D<=uaح)'Lj$9z\~ؾ66;|IKg9cy(SeVfu}SCatE!sj\-ׅgHU^.w\shef9b&`'8PǑÝ5%6> Oq'?z<5W #;{$(kS WE>. ?m; Zջy_e̋JZs%~پ^Aҧ@cqWBMU{4}j5N:(~l揫ޙ{Uc6yquphpmvault-0.8build1/.git/objects/10/0000775000000000000000000000000011030361225014262 5ustar uphpmvault-0.8build1/.git/objects/10/b097320e8d3e26d29d4cc1bd32adca9b78ed6d0000664000000000000000000000021511030361225021711 0ustar x9 S@,%+J.U^bcW3h$L`l$}F߹fCCDMƦ!tm`߇e)xON\*<{*XGkԣ]ag F-uphpmvault-0.8build1/.git/objects/4e/0000775000000000000000000000000011557565156014401 5ustar uphpmvault-0.8build1/.git/objects/4e/721e5c584c3c597bd9ee6c16efedbbeb2403160000664000000000000000000000045711557565156021767 0ustar x+)JMU066b040031Qpsg*8!F}cx# WQ5< U⛘ʰ%hQgk>zڂ&@޸Ǐc_aeVFPCRJs ^:`鶄5DQ>B5_K~N>ےqʚ<ԊԂ< ֥G6Rv'jӃ7nPeEy%i@E澑<_{=nGԡJ 2 rKsJ,c|:II9sY\Lu@7և1{{%؇|uphpmvault-0.8build1/exception.h0000664000000000000000000000221111025655455013732 0ustar /** @file exception.h written by Marc Singer 22 Feb 2008 Copyright (C) 2008 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Please refer to the file debian/copyright for further details. */ #if !defined (__EXCEPTION_H__) # define __EXCEPTION_H__ /* ----- Includes */ #include /* ----- Types */ struct Exception { char* sz; void initialize (const char* szFmt, va_list ap) { size_t cb = 256; sz = new char[cb]; vsnprintf (sz, cb, szFmt, ap); } Exception () : sz (NULL) {} Exception (const char* szFmt, ...) { va_list ap; va_start (ap, szFmt); initialize (szFmt, ap); va_end (ap); } ~Exception () { delete sz; } }; struct ResultException : public Exception { int result; ResultException (int _result, const char* szFmt ...) { result = _result; va_list ap; va_start (ap, szFmt); initialize (szFmt, ap); va_end (ap); } }; /* ----- Globals */ /* ----- Prototypes */ #endif /* __EXCEPTION_H__ */ uphpmvault-0.8build1/Makefile0000664000000000000000000000215511557562346013240 0ustar # Makefile TARGETS:=uphpmvault uphpmvault_SRCS:=uphpmvault.cc dumpw.cc OBJ = $(patsubst %.c,$O%.o,$(patsubst %.cc,$O%.o,$1)) uphpmvault_OBJS := $(uphpmvault_SRCS) uphpmvault_OBJS := $(call OBJ,$(uphpmvault_OBJS)) CC:=gcc CXX:=g++ CFLAGS:=-O2 -g LFLAGS:=-g CFLAGS += -Wall -Wformat -Wstrict-aliasing .PHONY: all all: $(TARGETS) # --- Target Rules uphpmvault: $(uphpmvault_OBJS) @echo "LINK " $@ @$(CXX) -o $@ $^ $(LFLAGS) @cp $@ $@_unstripped @strip $@ .PHONY: install install: install -d $(DESTDIR)/usr/bin install -s uphpmvault $(DESTDIR)/usr/bin .PHONY: build build: # Override MAKELEVEL or the debian-helpers get mad MAKELEVEL= dpkg-buildpackage -I.git # --- Inference Rules $O%.o: %.c @printf "COMPILE %-30.30s %s\n" "$@" "$(CFLAGS) $(CFLAGS_C)" @$(CXX) -c $(CFLAGS) $(CFLAGS_C) -o $@ $< $O%.o: %.cc @printf "COMPILE %-30.30s %s\n" "$@" "$(CFLAGS) $(CFLAGS_CXX)" @$(CXX) -c $(CFLAGS) $(CFLAGS_CXX) -o $@ $< # --- Maintenance Rules .PHONY: tidy tidy: -rm *~ .PHONY: clean distclean clean distclean: @echo "CLEAN" @touch _clean @-rm _clean $(wildcard *.o *~ $(TARGETS) *_unstripped) uphpmvault-0.8build1/oprintf.h0000664000000000000000000000154111025655421013413 0ustar /** @file oprintf.h written by Marc Singer 30 Aug 2007 Copyright (C) 2007 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Please refer to the file debian/copyright for further details. */ #if !defined (__OPRINTF_H__) # define __OPRINTF_H__ /* ----- Includes */ #include #include /* ----- Types */ struct oprintf { char sz[512]; oprintf (const char* szFormat, ...) { va_list ap; va_start (ap, szFormat); vsnprintf (sz, sizeof (sz), szFormat, ap); va_end (ap); } friend std::ostream& operator<< (std::ostream& o, const oprintf& op) { return o << op.sz; } }; /* ----- Globals */ /* ----- Prototypes */ #endif /* __OPRINTF_H__ */ uphpmvault-0.8build1/dumpw.cc0000664000000000000000000000264311025655532013233 0ustar /** @file dumpw.cc written by Marc Singer 4 Jun 2008 Copyright (C) 2008 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Please refer to the file debian/copyright for further details. @brief Routine to perform a hexadecimal dump (hd) of a buffer. */ #include #include #include #include void dumpw (const char *rgb, int cb, unsigned long index, int width) { int i; if ((width == 2 && ((unsigned long) rgb & 1)) || (width == 4 && ((unsigned long) rgb & 3))) { printf ("%s: unable to display unaligned data\n", __FUNCTION__); return; } while (cb > 0) { printf ("%08lx: ", index); for (i = 0; i < 16; ++i) { if (i < cb) { switch (width) { default: case 1: printf ("%02x ", (unsigned char) rgb[i]); break; case 2: printf ("%04x ", *((uint16_t *) & rgb[i])); ++i; break; case 4: printf ("%08x ", *((uint32_t *) & rgb[i])); i += 3; break; } } else printf (" "); if (i % 8 == 7) putchar (' '); } for (i = 0; i < 16; ++i) { if (i == 8) putchar (' '); putchar ((i < cb) ? (isprint (rgb[i]) ? rgb[i] : '.') : ' '); } printf ("\n"); cb -= 16; index += 16; rgb += 16; } }