diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0456995 --- /dev/null +++ b/.gitignore @@ -0,0 +1,51 @@ +*.o +*.lo +*.la +.*.swp +.deps +.libs +.dirstamp +Makefile +Makefile.in +aclocal.m4 +config.guess +config.h +config.h.in +config.log +config.status +config.sub +configure +cscope.out +depcomp +compile +install-sh +libtool +ltmain.sh +missing +stamp-h1 +tags +autom4te.cache + +debian/*.log +debian/libiphb0 +build-stamp +configure-stamp +debian/files +debian/hbtest-dbg.substvars +debian/hbtest-dbg/ +debian/hbtest.substvars +debian/hbtest/ +debian/libiphb-dev.substvars +debian/libiphb-dev/ +debian/libiphb0-dbg.substvars +debian/libiphb0-dbg/ +debian/libiphb0.substvars +debian/libiphb0.postinst.debhelper +debian/libiphb0.postrm.debhelper +debian/tmp/ + +iphbd/hbtest +iphbd/libiphb.pc +iphbd/libiphb-uninstalled.pc + +m4/ diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..e69de29 diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..e69de29 diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..54caf7c --- /dev/null +++ b/INSTALL @@ -0,0 +1,229 @@ +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the `--target=TYPE' option to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..10f54b2 --- /dev/null +++ b/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = iphbd diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/README b/README new file mode 100644 index 0000000..e69de29 diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..126ca41 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Bootstrap autotools environment +libtoolize +aclocal +automake -ac +autoconf +echo 'Ready to rock!' diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..a23063f --- /dev/null +++ b/configure.ac @@ -0,0 +1,82 @@ +# Package name and version +AC_INIT(libiphb, 0.6.25) + +AM_INIT_AUTOMAKE + +AC_PREREQ([2.61]) +AC_CONFIG_SRCDIR([iphbd/libiphb.c]) + +# +# CONFIG OPTIONS +# + +# +# Compiler and linker flags +# +AC_DEFINE_UNQUOTED([PRG_VERSION],[$VERSION],[Version for libiphb]) +# FIXME: DSME_LOG_ENABLE should be proper&working configure option +#AC_DEFINE([DSME_LOG_ENABLE], [1]) + +AC_SUBST(C_GENFLAGS, ["-pthread -g -std=c99 -Wall -Wwrite-strings -Wmissing-prototypes -Werror"]) +AC_SUBST(C_OPTFLAGS, ["-O2 -s"]) +AC_SUBST(C_DBGFLAGS, ["-g -DDEBUG -DDSME_LOG_ENABLE"]) + +# Checks for programs. +AC_PROG_CC +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET +AC_PROG_LIBTOOL +PKG_PROG_PKG_CONFIG + +# Specify dir for local macros +AC_CONFIG_MACRO_DIR([m4]) + +# Enable per-target compiler options +AM_PROG_CC_C_O() + +# Pkgconf checks +PKG_CHECK_MODULES(GLIB, glib-2.0) +PKG_CHECK_MODULES(DBUS, dbus-1) +PKG_CHECK_MODULES(DBUSGLIB, dbus-glib-1) + +# Check libs (that are not yet checked) +# Whitespaces in 'action-if-found' fields in order to not (auto)update LIBS variable +AC_CHECK_LIB([rt], [clock_nanosleep], [AC_MSG_NOTICE([got librt])], AC_MSG_FAILURE([librt required!])) +AC_CHECK_LIB([dsme], [dsmesock_init], [AC_MSG_NOTICE([got libdsme])], AC_MSG_FAILURE([libdsme required!]), [$GLIB_LIBS]) + +# Check headers +AC_CHECK_HEADERS([arpa/inet.h fcntl.h inttypes.h limits.h stdint.h stdlib.h \ + string.h strings.h sys/ioctl.h sys/socket.h sys/time.h \ + syslog.h unistd.h utmpx.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_STDBOOL +AC_TYPE_UID_T +AC_C_INLINE +AC_TYPE_INT16_T +AC_TYPE_INT32_T +AC_TYPE_PID_T +AC_TYPE_SIZE_T +AC_TYPE_SSIZE_T +AC_TYPE_UINT16_T +AC_TYPE_UINT32_T +AC_TYPE_UINT8_T + +# Check common library functions +AC_FUNC_ALLOCA +AC_FUNC_FORK +AC_FUNC_MALLOC +AC_FUNC_REALLOC +AC_FUNC_STRTOD +AC_CHECK_FUNCS([atexit clock_gettime dup2 gettimeofday inet_ntoa memmove \ + memset realpath select setenv socket strcasecmp strdup strerror \ + strndup strpbrk strrchr strstr strtoul uname utmpxname]) + +# Create files +AC_CONFIG_FILES([Makefile + iphbd/Makefile + iphbd/libiphb-uninstalled.pc + iphbd/libiphb.pc]) + +AC_OUTPUT diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..8ecc5d7 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,5 @@ +libiphb (0.61.25) unstable; urgency=low + + * Move libiphb to its own source package (Fixes: NB#188832). + + -- Matias Muhonen Wed, 20 Oct 2010 12:32:13 +0300 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +4 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..4d54e18 --- /dev/null +++ b/debian/control @@ -0,0 +1,50 @@ +Source: libiphb +Section: misc +Priority: optional +Maintainer: Semi Malinen +Uploaders: Matias Muhonen +Build-Depends: debhelper (>= 4.1.0), + libdsme0.2.0-dev (>= 0.61.4), + pkg-config, + libglib2.0-dev, + libdbus-1-dev (>= 1.0), + libdbus-glib-1-dev, + libtool, + autoconf, + automake +Standards-Version: 3.7.2 + +Package: hbtest +Architecture: any +Depends: libiphb0 (>= 0.61.6) +Description: Test tool for IP Heartbeat service + Command line utility to test IP Heartbeat functionality. + +Package: hbtest-dbg +Priority: extra +Architecture: any +Depends: hbtest (= ${Source-Version}) +Description: Debug symbols for hbtest + This package provides debug symbols for the IP Heartbeat test tool. + +Package: libiphb0 +Section: libs +Architecture: any +Depends: ${shlibs:Depends} +Description: API for IP Heartbeat service + This package contains C API for using IP Heartbeat service. + +Package: libiphb0-dbg +Section: libdevel +Priority: extra +Architecture: any +Depends: libiphb0 (= ${Source-Version}) +Description: Debug symbols for libiphb0 + This package provides debug symbols for the IP Heartbeat API. + +Package: libiphb-dev +Section: libdevel +Architecture: any +Depends: libiphb0 (= ${Source-Version}), ${shlibs:Depends} +Description: Development files for IP Heartbeat service + This package contains C headers for the IP Heartbeat API. diff --git a/debian/hbtest.dirs b/debian/hbtest.dirs new file mode 100644 index 0000000..e772481 --- /dev/null +++ b/debian/hbtest.dirs @@ -0,0 +1 @@ +usr/bin diff --git a/debian/hbtest.install b/debian/hbtest.install new file mode 100644 index 0000000..c91c9a3 --- /dev/null +++ b/debian/hbtest.install @@ -0,0 +1 @@ +debian/tmp/usr/bin/hbtest diff --git a/debian/libiphb-dev.dirs b/debian/libiphb-dev.dirs new file mode 100644 index 0000000..85de790 --- /dev/null +++ b/debian/libiphb-dev.dirs @@ -0,0 +1,2 @@ +usr/include/iphbd +usr/lib/pkgconfig diff --git a/debian/libiphb-dev.install b/debian/libiphb-dev.install new file mode 100644 index 0000000..887c60f --- /dev/null +++ b/debian/libiphb-dev.install @@ -0,0 +1,2 @@ +debian/tmp/usr/include/iphbd/*.h +debian/tmp/usr/lib/pkgconfig/*.pc diff --git a/debian/libiphb0.dirs b/debian/libiphb0.dirs new file mode 100644 index 0000000..6845771 --- /dev/null +++ b/debian/libiphb0.dirs @@ -0,0 +1 @@ +usr/lib diff --git a/debian/libiphb0.install b/debian/libiphb0.install new file mode 100644 index 0000000..6793313 --- /dev/null +++ b/debian/libiphb0.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/libiphb.so.* diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..f331364 --- /dev/null +++ b/debian/rules @@ -0,0 +1,104 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# GNU copyright 1997 to 1999 by Joey Hess. +# +# Modified to make a template file for a multi-binary package with separated +# build-arch and build-indep targets by Bill Allombert 2001 + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# This has to be exported to make some magic below work. +export DH_OPTIONS + +CFLAGS = -Wall -g + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +# To build testcases as well, add "testcases" to DEB_BUILD_OPTIONS +ifneq (,$(findstring testcases,$(DEB_BUILD_OPTIONS))) + DH_OPTIONS= +else + DH_OPTIONS=-Ndsme-testcases +endif + +configure: configure-stamp +configure-stamp: + dh_testdir + # Add here commands to configure the package. + ./autogen.sh + + touch configure-stamp + +#Architecture +build: build-stamp + +build-stamp: configure-stamp + +# To build testcases as well, add "testcases" to DEB_BUILD_OPTIONS +ifneq (,$(findstring testcases,$(DEB_BUILD_OPTIONS))) + $(MAKE) tests +else + dh_auto_configure -- --disable-static + dh_auto_build +endif + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + + # Add here commands to clean up after the build process. + if [ -e Makefile ]; then $(MAKE) distclean; fi + rm -rf Makefile.in aclocal.m4 compile config.guess config.sub \ + configure depcomp install-sh iphbd/Makefile.in ltmain.sh \ + missing modules/Makefile.in test/Makefile test/Makefile.in \ + util/Makefile.in m4 + + dh_clean + +install: + dh_testdir + dh_testroot + dh_clean -k -s + dh_installdirs + + # Add here commands to install the package into + # debian/tmp. + $(MAKE) install DESTDIR=$(CURDIR)/debian/tmp + + dh_install -s + +# Must not depend on anything. This is to be called by +# binary-arch/binary-indep +# in another 'make' thread. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs -XREADME + dh_installexamples + dh_installman + dh_link + dh_strip --dbg-package=hbtest \ + --dbg-package=libiphb0 + dh_compress + dh_fixperms + dh_makeshlibs --exclude=/usr/lib/dsme/ + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb +# Build architecture independant packages using the common target. +binary-indep: build install + +binary: binary-arch binary-indep +.PHONY: build clean binary-indep binary-arch binary install install-indep install-arch configure diff --git a/iphbd/Makefile.am b/iphbd/Makefile.am new file mode 100644 index 0000000..8639c28 --- /dev/null +++ b/iphbd/Makefile.am @@ -0,0 +1,31 @@ +# +# Generic options +# +AM_CFLAGS = -Wall -Wmissing-prototypes -std=c99 -Os -g -fPIC +AM_CPPFLAGS = -I$(top_srcdir)/modules -D_GNU_SOURCE +AM_LDFLAGS = -g -Wl,--as-needed + +ACLOCAL_AMFLAGS = -I m4 + +# +# Additional dirs +# +iphbdincludedir = @includedir@/iphbd + +# +# Build targets +# +bin_PROGRAMS = hbtest +lib_LTLIBRARIES = libiphb.la + +hbtest_SOURCES = hbtest.c +hbtest_LDADD = libiphb.la + +libiphb_la_SOURCES = libiphb.c +libiphb_la_LDFLAGS = $(AM_LDFLAGS) -shared + +iphbdinclude_HEADERS = libiphb.h \ + iphb_internal.h + +pkgconfigdir = ${libdir}/pkgconfig +pkgconfig_DATA = libiphb.pc diff --git a/iphbd/depend_filter.py b/iphbd/depend_filter.py new file mode 100755 index 0000000..9e379f7 --- /dev/null +++ b/iphbd/depend_filter.py @@ -0,0 +1,78 @@ +#! /usr/bin/env python + +# ============================================================================= +# File: depend_filter.py +# +# Copyright (C) 2007-2010 Nokia. +# +# Author: Simo Piiroinen +# +# This file is part of Dsme. +# +# Dsme is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License +# version 2.1 as published by the Free Software Foundation. +# +# Dsme 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. +# +# You should have received a copy of the GNU Lesser General Public +# License along with Dsme. If not, see . +# +# ----------------------------------------------------------------------------- +# +# History: +# +# 05-Dec-2007 Simo Piiroinen +# - initial version +# ============================================================================= + +# gcc -MM filters out only standard includes, which +# does not cover glib etc headers ... so we filter +# out all dependencies with absolute path + +import sys,os + +DEST = None + +args = sys.argv[1:] +args.reverse() +while args: + a = args.pop() + k,v = a[:2],a[2:] + if k in "-d": + DEST = v or args.pop() + else: + print>>sys.stderr, "Unknown option: %s" % a + sys.exit(1) + +def dep_compare(a,b): + return cmp(a.count("/"),b.count("/")) or cmp(a,b) + +def dep_filter(deps): + src, hdr = [], {} + + for dep in deps: + if dep.endswith(".c"): + src.append(dep) + elif dep.startswith("/"): + continue + elif not dep in hdr: + hdr[dep] = None + hdr = hdr.keys() + hdr.sort(dep_compare) + return src + hdr + +for line in sys.stdin.read().replace("\\\n", " ").split("\n"): + if not ':' in line: + continue + dest,srce = line.split(":",1) + + if DEST: + dest = os.path.basename(dest) + dest = os.path.join(DEST, dest) + + srce = dep_filter(srce.split()) + print '%s: %s\n' % (dest, " \\\n ".join(srce)) diff --git a/iphbd/hbtest.c b/iphbd/hbtest.c new file mode 100644 index 0000000..a1544b4 --- /dev/null +++ b/iphbd/hbtest.c @@ -0,0 +1,346 @@ +/** + @brief Test utility for IP Heartbeat service + + @file hbtest.c + + This is the test utility for IP Heartbeat service. + It tries to emulate applications that use IP (UDP or TCP) and + go to sleep to wait for timeout to send "keepalive" message or some input. + + + This test pgm creates a TCP connection to a remote peer and runs in the following loop: + + @code + while (1) { + send 4 segments of 128 bytes to the server within 40 msecs + sleep pseudorandom 30-90 msecs (to get randomness to TCP keepalive scheduling) + send 1 segment of 128 bytes to the server + + wait IP heartbeat for 60 secs, or data from test server + (in this test the server never sends) + } + @endcode + + See tests/TEST script for more information. + + + +

+ Copyright (C) 2008-2010 Nokia Corporation. + + @author Raimo Vuonnala + + This file is part of Dsme. + + Dsme is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License + version 2.1 as published by the Free Software Foundation. + + Dsme 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. + + You should have received a copy of the GNU Lesser General Public + License along with Dsme. If not, see . +*/ + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +/* socket transport */ +#include +#include +#include +#include + +#include "libiphb.h" + +static volatile int run = 1; + +#define ME "hbtest: " + + +#define SLEEP_TIME 60 + +static int debugmode = 0; + +static void +sig_handler(int signo) +{ + switch (signo) { + case SIGQUIT: + case SIGTERM: + case SIGINT: + run = 0; + break; + default: + fprintf(stderr, ME "\aERROR, unknown signal %d\n", signo); + } +} + + +#define BUFLEN 128 + +int +main (int argc, char *argv[]) +{ + iphb_t hb = 0; + int sock = -1; + struct sockaddr_in addr; + char buf_data; + int hbsock; + unsigned long packets_sent = 0; + int randomsleep = 0; + int first = 1; + + + if (argc < 4) { + printf("Usage: %s IPAddress port TCP_keepalive_period [-d]\n", argv[0]); + exit(1); + } + if (argc >= 5 && strcmp(argv[4], "-d") == 0) + debugmode = 1; + + + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + signal(SIGPIPE, SIG_IGN); + + + /* We open TCP socket where we send data to emulate real life app */ + sock = socket(PF_INET, SOCK_STREAM, 0); + if (sock == -1) { + perror(ME "socket()"); + run = 0; + } + else { + int optval; + + memset(&addr, 0, (size_t)sizeof(struct sockaddr_in)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = INADDR_ANY; + addr.sin_port = htons(atoi(argv[2])); + if (inet_aton(argv[1], &addr.sin_addr) == 0) { + fprintf(stderr, ME "\nERROR invalid address '%s'\n", argv[1]); + goto close_sock_and_exit; + } + + if (debugmode) printf(ME "connecting to %s:%d, TCP keepalive period is %d\n", + inet_ntoa(addr.sin_addr), + (int)ntohs(addr.sin_port), + atoi(argv[3])); + + if (connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) { + perror(ME "connect()"); + run = 0; + } + else { + + optval = 1; + setsockopt(sock, + IPPROTO_TCP, + TCP_NODELAY, + (char *)&optval, sizeof(int)); + + + optval = 1; + setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof(int)); + + + /* grace period before sending first keepalive */ + optval = atoi(argv[3]); + + if (optval > 0) { + + printf(ME "setting TCP keepalive timers to %d secs\n", optval); + + setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, (char *)&optval, sizeof(int)); + + /* we can loose this many keepalives before connection is reset */ + optval = 10; + setsockopt(sock, SOL_TCP, TCP_KEEPCNT, (char *)&optval, sizeof(int)); + + /* time between keepalives */ + optval = atoi(argv[3]); + setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, (char *)&optval, sizeof(int)); + } + } + } + + if (run) { + printf(ME "running\n"); + if (!hb) { + hb = iphb_open(0); + if (!hb) + perror(ME "\aERROR, iphb_open()"); + else { + struct iphb_stats stats; + + printf(ME "iphb service opened\n"); + + if (iphb_get_stats(hb, &stats) == -1) + fprintf(stderr, ME "\aERROR, iphb_get_stats() failed %s\n", strerror(errno)); + else + printf(ME "iphb_get_stats(): clients=%u, waiting=%u, next hb=%u secs\n", stats.clients, stats.waiting, stats.next_hb); + + + } + } + } + + + buf_data = '!' + getpid() % (126 - '!'); + + srand(time(0)); + + hbsock = iphb_get_fd(hb); + + + /* Generate data, sleep */ + for (;run;) { + fd_set readfds; + struct timeval timeout; + int st, i; + time_t now; + time_t then; + time_t went_to_sleep; + char buf[BUFLEN]; + + + if (debugmode) printf(ME "sending data to server and sleep %d msecs...\n", + randomsleep*30); + + for (i = 0; i < BUFLEN; i++) + buf[i] = buf_data; + + + for (i = 0; i < 4; i++) { + usleep(10*1000); /* sleep 10 millisecs */ + if (send(sock, buf, BUFLEN, 0) < 0) { + perror(ME "send()"); + run = 0; + break; + } + packets_sent++; + } + + /* sleep 30 - 90 msecs secs to get randomness to TCP keep-alives + (not in the first round, though) */ + if (!randomsleep) + randomsleep = (rand() % 3) + 1; /* get random value 1..3 */ + else { + randomsleep++; + if (randomsleep > 3) + randomsleep = 1; + + usleep(randomsleep*30*1000); /* 30-90 msecs */ + + randomsleep = (rand() % 3) + 1; /* get random value 1..3 */ + + } + if (send(sock, buf, BUFLEN, 0) < 0) { + perror(ME "send()"); + run = 0; + continue; + } + packets_sent++; + + + + + then = went_to_sleep = time(0); + + + /* indicate iphbd that I want a wakeup */ + if (hb) { + if (iphb_wait(hb, first ? 0 : SLEEP_TIME - 15, SLEEP_TIME, 0) != 0) { + perror(ME "\aERROR, iphb_wait()"); + hb = iphb_close(hb); + } + first = 0; + } + + if (debugmode) printf(ME "waiting for iphbd wakeup or server data...\n"); + + timeout.tv_sec = SLEEP_TIME; + timeout.tv_usec = 0; + + /* Wait events from "server" and iphbd */ + FD_ZERO(&readfds); + if (hbsock != -1) + FD_SET(hbsock, &readfds); + FD_SET(sock, &readfds); + + + st = select(sock > hbsock ? sock + 1 : hbsock + 1, &readfds, NULL, NULL, &timeout); + + if (hb) { + int st; + if (iphb_I_woke_up(hb) == -1) + fprintf(stderr, ME "\aERROR, iphb_I_woke_up() %s\n", strerror(errno)); + st = iphb_discard_wakeups(hb); + if (st == -1) + fprintf(stderr, ME "\aERROR, iphb_discard_wakeups() %s\n", strerror(errno)); + else + if (debugmode) printf(ME "discarded %d bytes\n", st); + + } + + now = time(0); + if (st == -1) { + if (errno == EINTR) + continue; + else { + perror(ME "\aERROR, select()"); + run = 0; + } + } + else + if (st >= 0) { + if (now - then > SLEEP_TIME + 1) /* allow 1 sec slippage */ + fprintf(stderr, ME "\aERROR, select() did not fire as expected, took %d secs\n", + (int)(now - then)); + + if (debugmode) printf(ME "slept %d secs\n", (int)(now - then)); + + if (hbsock != -1 && FD_ISSET(hbsock, &readfds)) { + if (debugmode) printf(ME "select() woken by iphbd, waited %d secs\n", + (int)(now - then)); + } + + if (FD_ISSET(sock, &readfds)) { + if (debugmode) printf(ME "got data from server\n"); + if (recv(sock, buf, sizeof(buf), 0) < 0) { + perror(ME "\aERROR, recv()"); + run = 0; + continue; + } + + + } + + if (debugmode) + printf(ME "has to wake up, cause time since last keep-alive happened %d secs ago\n", + (int)(now - went_to_sleep)); + } + } + printf(ME "bye, sent %lu packets!\n", packets_sent); + + if (hb) + iphb_close(hb); + +close_sock_and_exit: + if (sock != -1) + close(sock); + return 0; +} + diff --git a/iphbd/iphb_internal.h b/iphbd/iphb_internal.h new file mode 100644 index 0000000..c904e37 --- /dev/null +++ b/iphbd/iphb_internal.h @@ -0,0 +1,101 @@ +/** + @brief Internal iphb service definitions + + @file iphb_internal.h + + Internal iphb service definitions + +

+ Copyright (C) 2008-2010 Nokia. All rights reserved. + + @author Raimo Vuonnala + @author Semi Malinen + + This file is part of Dsme. + + Dsme is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License + version 2.1 as published by the Free Software Foundation. + + Dsme 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. + + You should have received a copy of the GNU Lesser General Public + License along with Dsme. If not, see . +*/ +#ifndef IPHB_INTERNAL_H +#define IPHB_INTERNAL_H + +#include + +#define HB_SOCKET_PATH "/dev/shm/iphb" /**@brief IPC path between client and iphbd */ +#define HB_KERNEL_DEVICE "/dev/iphb" /**@brief Device between kernel module and iphbd */ +#define HB_KERNEL_DEVICE_TEST "/tmp/iphb" /**@brief Test device between kernel module and iphbd */ + +#if 0 +#define HB_MINTIME(__interval) (__interval - __interval/3) /* Default minimum heartbeat wait time */ +#define HB_MAXTIME(__interval) (__interval + __interval/3) /* Default maximum heartbeat wait time */ +#endif +#define HB_LKM_KICK_ME_PERIOD "30" /**@brief Period (seconds) the kernel sends messages to iphbd when IP traffic is seen */ + + +/**@brief Message from client to iphbd ("wake me up") */ +struct _iphb_wait_req_t { + unsigned short mintime; /*!< minimum wait time in seconds, zero means use default */ + unsigned short maxtime; /*!< maximum wait time in seconds, zero means use default */ + pid_t pid; /*!< client process ID (PID) */ +}; + +/**@brief Message from iphbd to client ("wake up!") */ +struct _iphb_wait_resp_t { + time_t waited; /*!< time in secs client really waited */ +}; + + + +/**@brief Command code */ +enum _iphb_cmd_t { + IPHB_WAIT = 0, /*!< wait heartbeat */ + IPHB_STAT = 1, /*!< get statistics */ +}; + + + +/**@brief Request */ +struct _iphb_req_t { + enum _iphb_cmd_t cmd; /*!< command code */ + union { + struct _iphb_wait_req_t wait; /*!< wait request */ + char dummy[64]; + } + u; +}; + + +#include "dsme/messages.h" + +enum { + DSME_MSG_ENUM(DSM_MSGTYPE_WAIT, 0x00000600), + DSME_MSG_ENUM(DSM_MSGTYPE_WAKEUP, 0x00000601), +}; + +typedef struct { + DSMEMSG_PRIVATE_FIELDS + struct _iphb_wait_req_t req; + void* data; +} DSM_MSGTYPE_WAIT; + +typedef struct { + DSMEMSG_PRIVATE_FIELDS + struct _iphb_wait_resp_t resp; + void* data; +} DSM_MSGTYPE_WAKEUP; + + + + + +#endif /* IPHB_INTERNAL_H */ + diff --git a/iphbd/libiphb-uninstalled.pc.in b/iphbd/libiphb-uninstalled.pc.in new file mode 100644 index 0000000..4eb1519 --- /dev/null +++ b/iphbd/libiphb-uninstalled.pc.in @@ -0,0 +1,8 @@ +abs_top_srcdir=@abs_top_srcdir@ +abs_top_builddir=@abs_top_builddir@ + +Name: libiphb (uninstalled copy) +Description: Interface to IP heartbeat service +Version: @VERSION@ +Libs: ${abs_top_builddir}/libiphb/libiphb.la +Cflags: -I${abs_top_srcdir} diff --git a/iphbd/libiphb.c b/iphbd/libiphb.c new file mode 100644 index 0000000..4426cae --- /dev/null +++ b/iphbd/libiphb.c @@ -0,0 +1,281 @@ +/** + @brief Implementation of libiphb + + @file libiphb.c + + Implementation of libiphb (see libiphb.h) + +

+ Copyright (C) 2008-2010 Nokia Corporation. + + @author Raimo Vuonnala + @author Semi Malinen + + This file is part of Dsme. + + Dsme is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License + version 2.1 as published by the Free Software Foundation. + + Dsme 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. + + You should have received a copy of the GNU Lesser General Public + License along with Dsme. If not, see . +*/ + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +/* socket transport */ +#include +#include +/* --- */ + +#include "libiphb.h" +#include "iphb_internal.h" + + +/**@brief Allocated structure for handle to iphbd */ +struct _iphb_t { + int fd; /*!< Unix domain socket handle */ +}; + +#define HB_INST(x) ((struct _iphb_t *) (x)) + + + +static int +suck_data(int fd) +{ + int bytes = -1; + int st; + + + /* suck away unread messages */ + + st = ioctl(fd, FIONREAD, &bytes); + + if (st != -1 && bytes >= 0) { + if (bytes) { + char *b = malloc(bytes); + if (!b) { + errno = ENOMEM; + return -1; + } + (void)recv(fd, b, bytes, MSG_WAITALL); + free(b); + } + return bytes; + + } + else + return -1; +} + + +int +iphb_I_woke_up(iphb_t iphbh) +{ + int st; + struct _iphb_req_t req = {IPHB_WAIT}; + + if (!iphbh) { + errno = EINVAL; + return -1; + } + + st = suck_data(HB_INST(iphbh)->fd); + + req.u.wait.pid = getpid(); + req.u.wait.mintime = 0; + req.u.wait.maxtime = 0; + + if (send(HB_INST(iphbh)->fd, &req, sizeof(req), MSG_DONTWAIT|MSG_NOSIGNAL) == -1) + return -1; + + return st; + +} + + + + +iphb_t +iphb_open(int *dummy) +{ + int fd; + struct sockaddr_un addr; + iphb_t *iphbh; + + iphbh = (iphb_t) malloc(sizeof(struct _iphb_t)); + if (iphbh == NULL) { + errno = ENOMEM; + return 0; + } + fd = socket(PF_UNIX, SOCK_STREAM, 0); + if (fd < 0) { + free(iphbh); + return 0; + } + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, HB_SOCKET_PATH); + if (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) != 0) { + close(fd); + free(iphbh); + return 0; + } + else { + HB_INST(iphbh)->fd = fd; + if (iphb_I_woke_up(iphbh)) { + close(fd); + free(iphbh); + return 0; + } + else { + if (dummy) + *dummy = 30; // for compatibility + return iphbh; + } + } +} + + +int +iphb_get_fd(iphb_t iphbh) +{ + if (iphbh) + return HB_INST(iphbh)->fd; + else { + errno = EINVAL; + return -1; + } +} + + + + +time_t +iphb_wait(iphb_t iphbh, unsigned short mintime, unsigned short maxtime, int must_wait) +{ + struct _iphb_req_t req = {IPHB_WAIT}; + struct _iphb_wait_resp_t resp = {0}; + + if (!iphbh || mintime > maxtime || maxtime == 0) { + errno = EINVAL; + return (time_t)-1; + } + + (void)suck_data(HB_INST(iphbh)->fd); + + req.u.wait.mintime = mintime; + req.u.wait.maxtime = maxtime; + req.u.wait.pid = getpid(); + + if (send(HB_INST(iphbh)->fd, &req, sizeof(req), MSG_DONTWAIT|MSG_NOSIGNAL) <= 0) + return (time_t)-1; + + if (!must_wait) + return (time_t)0; + + if (maxtime) { + fd_set readfds; + struct timeval timeout; + time_t then = time(0); + time_t now; + int st; + + timeout.tv_sec = maxtime; + timeout.tv_usec = 0; + + for (;;) { + FD_ZERO(&readfds); + FD_SET(HB_INST(iphbh)->fd, &readfds); + st = select(HB_INST(iphbh)->fd + 1, &readfds, NULL, NULL, &timeout); + now = time(0); + if (st == -1 && errno == EINTR) { + if (now - then < maxtime) { + timeout.tv_sec = maxtime - (now - then); + continue; + } + } + break; + } + if (st == 0) /* timeout */ + return now - then; + } + + if (recv(HB_INST(iphbh)->fd, &resp, sizeof(resp), MSG_WAITALL) > 0) + return resp.waited; + else + return (time_t)-1; +} + + +int +iphb_discard_wakeups(iphb_t iphbh) +{ + if (!iphbh) { + errno = EINVAL; + return (time_t)-1; + } + + return suck_data(HB_INST(iphbh)->fd); +} + + + +int iphb_get_stats(iphb_t iphbh, struct iphb_stats *stats) +{ + struct _iphb_req_t req = {IPHB_STAT}; + int bytes = -1; + + if (!iphbh) { + errno = EINVAL; + return -1; + } + + /* suck away unread messages */ + if (ioctl(HB_INST(iphbh)->fd, FIONREAD, &bytes) != -1 && bytes > 0) { + char *b = malloc(bytes); + if (!b) { + errno = ENOMEM; + return (time_t)-1; + } + (void)recv(HB_INST(iphbh)->fd, b, bytes, MSG_WAITALL); + free(b); + + } + + if (send(HB_INST(iphbh)->fd, &req, sizeof(req), MSG_DONTWAIT|MSG_NOSIGNAL) <= 0) + return -1; + + if (recv(HB_INST(iphbh)->fd, stats, sizeof(*stats), MSG_WAITALL) > 0) + return 0; + else + return (time_t)-1; +} + + + +iphb_t +iphb_close(iphb_t iphbh) +{ + if (iphbh) { + close(HB_INST(iphbh)->fd); + HB_INST(iphbh)->fd = 0; + free(iphbh); + } + return 0; +} + diff --git a/iphbd/libiphb.h b/iphbd/libiphb.h new file mode 100644 index 0000000..7ee3ca6 --- /dev/null +++ b/iphbd/libiphb.h @@ -0,0 +1,179 @@ +/** + @brief This is the interface to IP heartbeat service (via libiphb). + + @file libiphb.h + + This is the interface to IP heartbeat service (via libiphb). + +

+ Copyright (C) 2008-2010 Nokia Corporation. + + @author Raimo Vuonnala + @author Semi Malinen + + This file is part of Dsme. + + Dsme is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License + version 2.1 as published by the Free Software Foundation. + + Dsme 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. + + You should have received a copy of the GNU Lesser General Public + License along with Dsme. If not, see . +*/ +#ifndef IPHB_H +#define IPHB_H + +#include + + +/** + Handle to IP heartbeat service (NULL is invalid handle) +*/ +typedef void * iphb_t; + + + + +/** + Open iphb service. + + @param dummy (for compatibility), can be NULL + + @return handle for iphb, NULL if error (check errno). + If error, behave just like before (i.e. no heartbeat service) + +*/ + +iphb_t iphb_open(int *dummy); + + + + + + + + + +/** + Wait for the next heartbeat. + + + @param iphbh Handle got from iphb_open + @param mintime Time in seconds that MUST be waited before heartbeat is reacted to. + Value 0 means 'wake me up when someboy else is woken' + @param maxtime Time in seconds when the wait MUST end. It is wise to have maxtime-mintime quite big so all users of this service get synced. + @param must_wait 1 if this functions waits for heartbeat, 0 if you are going to use select/poll (see iphb_get_fd) + + @return Time waited, (time_t)-1 if error (check errno) + + +*/ +time_t +iphb_wait(iphb_t iphbh, unsigned short mintime, unsigned short maxtime, int must_wait); + + + + +/** + This function should be called if the application + has woken up by some other method than via iphb. + + @param iphbh Handle got from iphb_open + + @return >=0 if OK (number of bytes wakeup bytes discarded), -1 if error (check errno) + + +*/ +int +iphb_I_woke_up(iphb_t iphbh); + + + + +/** + This function is private for Qt wrapper. + has woken up by some other method than via iphb. + + @param iphbh Handle got from iphb_open + + @return >=0 if OK (number of bytes discarded), -1 if error (check errno) + + +*/ +int +iphb_discard_wakeups(iphb_t iphbh); + + + + + + + + + + + +/** + Get file descriptor for iphb (for use with select()/poll()) + + @param iphbh Handle got from iphb_open + + @return Descriptor that can be used for select/poll, -1 if error (check errno) +*/ + +int iphb_get_fd(iphb_t iphbh); + + + + + +/** iphbd statistics + - unsigned int clients: number of active IPHB clients + - unsigned int waiting: number of IPHB clients that are waiting for heartbeat + - unsigned int next_hb: number of seconds after the next heartbeat shall occur, 0 if there are nobody waiting +*/ + +struct iphb_stats { + unsigned int clients; + unsigned int waiting; + unsigned int next_hb; +}; + + +/** + Get statistics. Struct iphb_stats is filled as follows:
+ - unsigned int clients: number of active IPHB clients + - unsigned int waiting: number of IPHB clients that are waiting for heartbeat + - unsigned int next_hb: number of seconds after the next heartbeat shall occur, 0 if there are nobody waiting + + + @param iphbh Handle got from iphb_open + @param stats Statistics placeholder (filled when success) + + @return 0 if OK, -1 if error (check errno) +*/ + +int iphb_get_stats(iphb_t iphbh, struct iphb_stats *stats); + + + + + +/** + Close iphb service. + + @param iphbh Handle got from iphb_subscribe + + @return NULL always (so it is nice to set local handle to NULL) +*/ +iphb_t iphb_close(iphb_t iphbh); + + + +#endif /* IPHB_H */ + diff --git a/iphbd/libiphb.pc.in b/iphbd/libiphb.pc.in new file mode 100644 index 0000000..ffdc243 --- /dev/null +++ b/iphbd/libiphb.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libiphb +Description: Interface to IP heartbeat service +Version: @VERSION@ +Libs: -L${libdir} -liphb +Cflags: -I${includedir}