<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-hnodeb/+/25874">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add project skeleton<br><br>This commit contains all the relevant project structure to build the<br>osmo-hnodeb binary, its doc, tests, packaging, etc.<br><br>The osmo-hnodeb binary itself is still just an empty main().<br><br>Related: SYS#5516<br>Change-Id: I6ae3215ae4b956689d2adc88db7c3ead5df14f37<br>---<br>A .gitignore<br>A .gitreview<br>A AUTHORS<br>A COPYING<br>A Makefile.am<br>M README.md<br>A TODO-RELEASE<br>A configure.ac<br>A contrib/Makefile.am<br>A contrib/jenkins.sh<br>A contrib/osmo-hnodeb.spec.in<br>A contrib/systemd/Makefile.am<br>A contrib/systemd/osmo-hnodeb.service<br>A debian/changelog<br>A debian/compat<br>A debian/control<br>A debian/copyright<br>A debian/osmo-hnodeb.install<br>A debian/rules<br>A debian/source/format<br>A doc/Makefile.am<br>A doc/examples/Makefile.am<br>A doc/examples/osmo-hnodeb/osmo-hnodeb.cfg<br>A doc/manuals/Makefile.am<br>A doc/manuals/chapters/overview.adoc<br>A doc/manuals/osmohnodeb-usermanual-docinfo.xml<br>A doc/manuals/osmohnodeb-usermanual.adoc<br>A doc/manuals/osmohnodeb-vty-reference.xml<br>A doc/manuals/regen_doc.sh<br>A doc/manuals/vty/hnodeb_vty_additions.xml<br>A git-version-gen<br>A include/Makefile.am<br>A include/osmocom/Makefile.am<br>A include/osmocom/hnodeb/Makefile.am<br>A include/osmocom/hnodeb/hnodeb.h<br>A osmoappdesc.py<br>A src/Makefile.am<br>A src/osmo-hnodeb/Makefile.am<br>A src/osmo-hnodeb/main.c<br>A tests/Makefile.am<br>A tests/atlocal.in<br>A tests/ctrl_test_runner.py<br>A tests/osmo-hnodeb.vty<br>A tests/testsuite.at<br>44 files changed, 2,152 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/.gitignore b/.gitignore</span><br><span>new file mode 100644</span><br><span>index 0000000..0518b6f</span><br><span>--- /dev/null</span><br><span>+++ b/.gitignore</span><br><span>@@ -0,0 +1,71 @@</span><br><span style="color: hsl(120, 100%, 40%);">+debian/*.log</span><br><span style="color: hsl(120, 100%, 40%);">+*.o</span><br><span style="color: hsl(120, 100%, 40%);">+*.lo</span><br><span style="color: hsl(120, 100%, 40%);">+*.a</span><br><span style="color: hsl(120, 100%, 40%);">+.deps</span><br><span style="color: hsl(120, 100%, 40%);">+Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+Makefile.in</span><br><span style="color: hsl(120, 100%, 40%);">+config.h</span><br><span style="color: hsl(120, 100%, 40%);">+config.h.in</span><br><span style="color: hsl(120, 100%, 40%);">+*.pc</span><br><span style="color: hsl(120, 100%, 40%);">+*~</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+*.*~</span><br><span style="color: hsl(120, 100%, 40%);">+*.sw?</span><br><span style="color: hsl(120, 100%, 40%);">+.libs</span><br><span style="color: hsl(120, 100%, 40%);">+*.pyc</span><br><span style="color: hsl(120, 100%, 40%);">+*.gcda</span><br><span style="color: hsl(120, 100%, 40%);">+*.gcno</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+**/TAGS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#configure</span><br><span style="color: hsl(120, 100%, 40%);">+aclocal.m4</span><br><span style="color: hsl(120, 100%, 40%);">+autom4te.cache/</span><br><span style="color: hsl(120, 100%, 40%);">+config.log</span><br><span style="color: hsl(120, 100%, 40%);">+config.status</span><br><span style="color: hsl(120, 100%, 40%);">+config.guess</span><br><span style="color: hsl(120, 100%, 40%);">+config.sub</span><br><span style="color: hsl(120, 100%, 40%);">+configure</span><br><span style="color: hsl(120, 100%, 40%);">+compile</span><br><span style="color: hsl(120, 100%, 40%);">+depcomp</span><br><span style="color: hsl(120, 100%, 40%);">+install-sh</span><br><span style="color: hsl(120, 100%, 40%);">+missing</span><br><span style="color: hsl(120, 100%, 40%);">+stamp-h1</span><br><span style="color: hsl(120, 100%, 40%);">+libtool</span><br><span style="color: hsl(120, 100%, 40%);">+ltmain.sh</span><br><span style="color: hsl(120, 100%, 40%);">+m4/*.m4</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# git-version-gen magic</span><br><span style="color: hsl(120, 100%, 40%);">+.tarball-version</span><br><span style="color: hsl(120, 100%, 40%);">+.version</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-hnodeb-*.tar.bz2</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-hnodeb-*.tar.gz</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+tags</span><br><span style="color: hsl(120, 100%, 40%);">+/deps</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#tests</span><br><span style="color: hsl(120, 100%, 40%);">+tests/testsuite.dir</span><br><span style="color: hsl(120, 100%, 40%);">+tests/*/*_test</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+tests/atconfig</span><br><span style="color: hsl(120, 100%, 40%);">+tests/atlocal</span><br><span style="color: hsl(120, 100%, 40%);">+tests/package.m4</span><br><span style="color: hsl(120, 100%, 40%);">+tests/testsuite</span><br><span style="color: hsl(120, 100%, 40%);">+tests/testsuite.log</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+writtenconfig/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# manuals</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/*.html</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/*.svg</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/*.pdf</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/*__*.png</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/*.check</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/generated/</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/osmohnodeb-usermanual.xml</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/common</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/build</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+contrib/osmo-hnodeb.spec</span><br><span>diff --git a/.gitreview b/.gitreview</span><br><span>new file mode 100644</span><br><span>index 0000000..b08b10a</span><br><span>--- /dev/null</span><br><span>+++ b/.gitreview</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[gerrit]</span><br><span style="color: hsl(120, 100%, 40%);">+host=gerrit.osmocom.org</span><br><span style="color: hsl(120, 100%, 40%);">+project=osmo-hnodeb</span><br><span>diff --git a/AUTHORS b/AUTHORS</span><br><span>new file mode 100644</span><br><span>index 0000000..f621811</span><br><span>--- /dev/null</span><br><span>+++ b/AUTHORS</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Pau Espin Pedrol <pespin@sysmocom.de></span><br><span>diff --git a/COPYING b/COPYING</span><br><span>new file mode 100644</span><br><span>index 0000000..dba13ed</span><br><span>--- /dev/null</span><br><span>+++ b/COPYING</span><br><span>@@ -0,0 +1,661 @@</span><br><span style="color: hsl(120, 100%, 40%);">+                    GNU AFFERO GENERAL PUBLIC LICENSE</span><br><span style="color: hsl(120, 100%, 40%);">+                       Version 3, 19 November 2007</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/></span><br><span style="color: hsl(120, 100%, 40%);">+ Everyone is permitted to copy and distribute verbatim copies</span><br><span style="color: hsl(120, 100%, 40%);">+ of this license document, but changing it is not allowed.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                            Preamble</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The GNU Affero General Public License is a free, copyleft license for</span><br><span style="color: hsl(120, 100%, 40%);">+software and other kinds of works, specifically designed to ensure</span><br><span style="color: hsl(120, 100%, 40%);">+cooperation with the community in the case of network server software.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The licenses for most software and other practical works are designed</span><br><span style="color: hsl(120, 100%, 40%);">+to take away your freedom to share and change the works.  By contrast,</span><br><span style="color: hsl(120, 100%, 40%);">+our General Public Licenses are intended to guarantee your freedom to</span><br><span style="color: hsl(120, 100%, 40%);">+share and change all versions of a program--to make sure it remains free</span><br><span style="color: hsl(120, 100%, 40%);">+software for all its users.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  When we speak of free software, we are referring to freedom, not</span><br><span style="color: hsl(120, 100%, 40%);">+price.  Our General Public Licenses are designed to make sure that you</span><br><span style="color: hsl(120, 100%, 40%);">+have the freedom to distribute copies of free software (and charge for</span><br><span style="color: hsl(120, 100%, 40%);">+them if you wish), that you receive source code or can get it if you</span><br><span style="color: hsl(120, 100%, 40%);">+want it, that you can change the software or use pieces of it in new</span><br><span style="color: hsl(120, 100%, 40%);">+free programs, and that you know you can do these things.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Developers that use our General Public Licenses protect your rights</span><br><span style="color: hsl(120, 100%, 40%);">+with two steps: (1) assert copyright on the software, and (2) offer</span><br><span style="color: hsl(120, 100%, 40%);">+you this License which gives you legal permission to copy, distribute</span><br><span style="color: hsl(120, 100%, 40%);">+and/or modify the software.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A secondary benefit of defending all users' freedom is that</span><br><span style="color: hsl(120, 100%, 40%);">+improvements made in alternate versions of the program, if they</span><br><span style="color: hsl(120, 100%, 40%);">+receive widespread use, become available for other developers to</span><br><span style="color: hsl(120, 100%, 40%);">+incorporate.  Many developers of free software are heartened and</span><br><span style="color: hsl(120, 100%, 40%);">+encouraged by the resulting cooperation.  However, in the case of</span><br><span style="color: hsl(120, 100%, 40%);">+software used on network servers, this result may fail to come about.</span><br><span style="color: hsl(120, 100%, 40%);">+The GNU General Public License permits making a modified version and</span><br><span style="color: hsl(120, 100%, 40%);">+letting the public access it on a server without ever releasing its</span><br><span style="color: hsl(120, 100%, 40%);">+source code to the public.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The GNU Affero General Public License is designed specifically to</span><br><span style="color: hsl(120, 100%, 40%);">+ensure that, in such cases, the modified source code becomes available</span><br><span style="color: hsl(120, 100%, 40%);">+to the community.  It requires the operator of a network server to</span><br><span style="color: hsl(120, 100%, 40%);">+provide the source code of the modified version running there to the</span><br><span style="color: hsl(120, 100%, 40%);">+users of that server.  Therefore, public use of a modified version, on</span><br><span style="color: hsl(120, 100%, 40%);">+a publicly accessible server, gives the public access to the source</span><br><span style="color: hsl(120, 100%, 40%);">+code of the modified version.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  An older license, called the Affero General Public License and</span><br><span style="color: hsl(120, 100%, 40%);">+published by Affero, was designed to accomplish similar goals.  This is</span><br><span style="color: hsl(120, 100%, 40%);">+a different license, not a version of the Affero GPL, but Affero has</span><br><span style="color: hsl(120, 100%, 40%);">+released a new version of the Affero GPL which permits relicensing under</span><br><span style="color: hsl(120, 100%, 40%);">+this license.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The precise terms and conditions for copying, distribution and</span><br><span style="color: hsl(120, 100%, 40%);">+modification follow.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       TERMS AND CONDITIONS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  0. Definitions.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  "This License" refers to version 3 of the GNU Affero General Public License.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  "Copyright" also means copyright-like laws that apply to other kinds of</span><br><span style="color: hsl(120, 100%, 40%);">+works, such as semiconductor masks.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  "The Program" refers to any copyrightable work licensed under this</span><br><span style="color: hsl(120, 100%, 40%);">+License.  Each licensee is addressed as "you".  "Licensees" and</span><br><span style="color: hsl(120, 100%, 40%);">+"recipients" may be individuals or organizations.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  To "modify" a work means to copy from or adapt all or part of the work</span><br><span style="color: hsl(120, 100%, 40%);">+in a fashion requiring copyright permission, other than the making of an</span><br><span style="color: hsl(120, 100%, 40%);">+exact copy.  The resulting work is called a "modified version" of the</span><br><span style="color: hsl(120, 100%, 40%);">+earlier work or a work "based on" the earlier work.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A "covered work" means either the unmodified Program or a work based</span><br><span style="color: hsl(120, 100%, 40%);">+on the Program.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  To "propagate" a work means to do anything with it that, without</span><br><span style="color: hsl(120, 100%, 40%);">+permission, would make you directly or secondarily liable for</span><br><span style="color: hsl(120, 100%, 40%);">+infringement under applicable copyright law, except executing it on a</span><br><span style="color: hsl(120, 100%, 40%);">+computer or modifying a private copy.  Propagation includes copying,</span><br><span style="color: hsl(120, 100%, 40%);">+distribution (with or without modification), making available to the</span><br><span style="color: hsl(120, 100%, 40%);">+public, and in some countries other activities as well.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  To "convey" a work means any kind of propagation that enables other</span><br><span style="color: hsl(120, 100%, 40%);">+parties to make or receive copies.  Mere interaction with a user through</span><br><span style="color: hsl(120, 100%, 40%);">+a computer network, with no transfer of a copy, is not conveying.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  An interactive user interface displays "Appropriate Legal Notices"</span><br><span style="color: hsl(120, 100%, 40%);">+to the extent that it includes a convenient and prominently visible</span><br><span style="color: hsl(120, 100%, 40%);">+feature that (1) displays an appropriate copyright notice, and (2)</span><br><span style="color: hsl(120, 100%, 40%);">+tells the user that there is no warranty for the work (except to the</span><br><span style="color: hsl(120, 100%, 40%);">+extent that warranties are provided), that licensees may convey the</span><br><span style="color: hsl(120, 100%, 40%);">+work under this License, and how to view a copy of this License.  If</span><br><span style="color: hsl(120, 100%, 40%);">+the interface presents a list of user commands or options, such as a</span><br><span style="color: hsl(120, 100%, 40%);">+menu, a prominent item in the list meets this criterion.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  1. Source Code.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The "source code" for a work means the preferred form of the work</span><br><span style="color: hsl(120, 100%, 40%);">+for making modifications to it.  "Object code" means any non-source</span><br><span style="color: hsl(120, 100%, 40%);">+form of a work.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A "Standard Interface" means an interface that either is an official</span><br><span style="color: hsl(120, 100%, 40%);">+standard defined by a recognized standards body, or, in the case of</span><br><span style="color: hsl(120, 100%, 40%);">+interfaces specified for a particular programming language, one that</span><br><span style="color: hsl(120, 100%, 40%);">+is widely used among developers working in that language.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The "System Libraries" of an executable work include anything, other</span><br><span style="color: hsl(120, 100%, 40%);">+than the work as a whole, that (a) is included in the normal form of</span><br><span style="color: hsl(120, 100%, 40%);">+packaging a Major Component, but which is not part of that Major</span><br><span style="color: hsl(120, 100%, 40%);">+Component, and (b) serves only to enable use of the work with that</span><br><span style="color: hsl(120, 100%, 40%);">+Major Component, or to implement a Standard Interface for which an</span><br><span style="color: hsl(120, 100%, 40%);">+implementation is available to the public in source code form.  A</span><br><span style="color: hsl(120, 100%, 40%);">+"Major Component", in this context, means a major essential component</span><br><span style="color: hsl(120, 100%, 40%);">+(kernel, window system, and so on) of the specific operating system</span><br><span style="color: hsl(120, 100%, 40%);">+(if any) on which the executable work runs, or a compiler used to</span><br><span style="color: hsl(120, 100%, 40%);">+produce the work, or an object code interpreter used to run it.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The "Corresponding Source" for a work in object code form means all</span><br><span style="color: hsl(120, 100%, 40%);">+the source code needed to generate, install, and (for an executable</span><br><span style="color: hsl(120, 100%, 40%);">+work) run the object code and to modify the work, including scripts to</span><br><span style="color: hsl(120, 100%, 40%);">+control those activities.  However, it does not include the work's</span><br><span style="color: hsl(120, 100%, 40%);">+System Libraries, or general-purpose tools or generally available free</span><br><span style="color: hsl(120, 100%, 40%);">+programs which are used unmodified in performing those activities but</span><br><span style="color: hsl(120, 100%, 40%);">+which are not part of the work.  For example, Corresponding Source</span><br><span style="color: hsl(120, 100%, 40%);">+includes interface definition files associated with source files for</span><br><span style="color: hsl(120, 100%, 40%);">+the work, and the source code for shared libraries and dynamically</span><br><span style="color: hsl(120, 100%, 40%);">+linked subprograms that the work is specifically designed to require,</span><br><span style="color: hsl(120, 100%, 40%);">+such as by intimate data communication or control flow between those</span><br><span style="color: hsl(120, 100%, 40%);">+subprograms and other parts of the work.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The Corresponding Source need not include anything that users</span><br><span style="color: hsl(120, 100%, 40%);">+can regenerate automatically from other parts of the Corresponding</span><br><span style="color: hsl(120, 100%, 40%);">+Source.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The Corresponding Source for a work in source code form is that</span><br><span style="color: hsl(120, 100%, 40%);">+same work.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  2. Basic Permissions.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  All rights granted under this License are granted for the term of</span><br><span style="color: hsl(120, 100%, 40%);">+copyright on the Program, and are irrevocable provided the stated</span><br><span style="color: hsl(120, 100%, 40%);">+conditions are met.  This License explicitly affirms your unlimited</span><br><span style="color: hsl(120, 100%, 40%);">+permission to run the unmodified Program.  The output from running a</span><br><span style="color: hsl(120, 100%, 40%);">+covered work is covered by this License only if the output, given its</span><br><span style="color: hsl(120, 100%, 40%);">+content, constitutes a covered work.  This License acknowledges your</span><br><span style="color: hsl(120, 100%, 40%);">+rights of fair use or other equivalent, as provided by copyright law.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You may make, run and propagate covered works that you do not</span><br><span style="color: hsl(120, 100%, 40%);">+convey, without conditions so long as your license otherwise remains</span><br><span style="color: hsl(120, 100%, 40%);">+in force.  You may convey covered works to others for the sole purpose</span><br><span style="color: hsl(120, 100%, 40%);">+of having them make modifications exclusively for you, or provide you</span><br><span style="color: hsl(120, 100%, 40%);">+with facilities for running those works, provided that you comply with</span><br><span style="color: hsl(120, 100%, 40%);">+the terms of this License in conveying all material for which you do</span><br><span style="color: hsl(120, 100%, 40%);">+not control copyright.  Those thus making or running the covered works</span><br><span style="color: hsl(120, 100%, 40%);">+for you must do so exclusively on your behalf, under your direction</span><br><span style="color: hsl(120, 100%, 40%);">+and control, on terms that prohibit them from making any copies of</span><br><span style="color: hsl(120, 100%, 40%);">+your copyrighted material outside their relationship with you.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Conveying under any other circumstances is permitted solely under</span><br><span style="color: hsl(120, 100%, 40%);">+the conditions stated below.  Sublicensing is not allowed; section 10</span><br><span style="color: hsl(120, 100%, 40%);">+makes it unnecessary.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  No covered work shall be deemed part of an effective technological</span><br><span style="color: hsl(120, 100%, 40%);">+measure under any applicable law fulfilling obligations under article</span><br><span style="color: hsl(120, 100%, 40%);">+11 of the WIPO copyright treaty adopted on 20 December 1996, or</span><br><span style="color: hsl(120, 100%, 40%);">+similar laws prohibiting or restricting circumvention of such</span><br><span style="color: hsl(120, 100%, 40%);">+measures.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  When you convey a covered work, you waive any legal power to forbid</span><br><span style="color: hsl(120, 100%, 40%);">+circumvention of technological measures to the extent such circumvention</span><br><span style="color: hsl(120, 100%, 40%);">+is effected by exercising rights under this License with respect to</span><br><span style="color: hsl(120, 100%, 40%);">+the covered work, and you disclaim any intention to limit operation or</span><br><span style="color: hsl(120, 100%, 40%);">+modification of the work as a means of enforcing, against the work's</span><br><span style="color: hsl(120, 100%, 40%);">+users, your or third parties' legal rights to forbid circumvention of</span><br><span style="color: hsl(120, 100%, 40%);">+technological measures.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  4. Conveying Verbatim Copies.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You may convey verbatim copies of the Program's source code as you</span><br><span style="color: hsl(120, 100%, 40%);">+receive it, in any medium, provided that you conspicuously and</span><br><span style="color: hsl(120, 100%, 40%);">+appropriately publish on each copy an appropriate copyright notice;</span><br><span style="color: hsl(120, 100%, 40%);">+keep intact all notices stating that this License and any</span><br><span style="color: hsl(120, 100%, 40%);">+non-permissive terms added in accord with section 7 apply to the code;</span><br><span style="color: hsl(120, 100%, 40%);">+keep intact all notices of the absence of any warranty; and give all</span><br><span style="color: hsl(120, 100%, 40%);">+recipients a copy of this License along with the Program.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You may charge any price or no price for each copy that you convey,</span><br><span style="color: hsl(120, 100%, 40%);">+and you may offer support or warranty protection for a fee.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  5. Conveying Modified Source Versions.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You may convey a work based on the Program, or the modifications to</span><br><span style="color: hsl(120, 100%, 40%);">+produce it from the Program, in the form of source code under the</span><br><span style="color: hsl(120, 100%, 40%);">+terms of section 4, provided that you also meet all of these conditions:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    a) The work must carry prominent notices stating that you modified</span><br><span style="color: hsl(120, 100%, 40%);">+    it, and giving a relevant date.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    b) The work must carry prominent notices stating that it is</span><br><span style="color: hsl(120, 100%, 40%);">+    released under this License and any conditions added under section</span><br><span style="color: hsl(120, 100%, 40%);">+    7.  This requirement modifies the requirement in section 4 to</span><br><span style="color: hsl(120, 100%, 40%);">+    "keep intact all notices".</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    c) You must license the entire work, as a whole, under this</span><br><span style="color: hsl(120, 100%, 40%);">+    License to anyone who comes into possession of a copy.  This</span><br><span style="color: hsl(120, 100%, 40%);">+    License will therefore apply, along with any applicable section 7</span><br><span style="color: hsl(120, 100%, 40%);">+    additional terms, to the whole of the work, and all its parts,</span><br><span style="color: hsl(120, 100%, 40%);">+    regardless of how they are packaged.  This License gives no</span><br><span style="color: hsl(120, 100%, 40%);">+    permission to license the work in any other way, but it does not</span><br><span style="color: hsl(120, 100%, 40%);">+    invalidate such permission if you have separately received it.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    d) If the work has interactive user interfaces, each must display</span><br><span style="color: hsl(120, 100%, 40%);">+    Appropriate Legal Notices; however, if the Program has interactive</span><br><span style="color: hsl(120, 100%, 40%);">+    interfaces that do not display Appropriate Legal Notices, your</span><br><span style="color: hsl(120, 100%, 40%);">+    work need not make them do so.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A compilation of a covered work with other separate and independent</span><br><span style="color: hsl(120, 100%, 40%);">+works, which are not by their nature extensions of the covered work,</span><br><span style="color: hsl(120, 100%, 40%);">+and which are not combined with it such as to form a larger program,</span><br><span style="color: hsl(120, 100%, 40%);">+in or on a volume of a storage or distribution medium, is called an</span><br><span style="color: hsl(120, 100%, 40%);">+"aggregate" if the compilation and its resulting copyright are not</span><br><span style="color: hsl(120, 100%, 40%);">+used to limit the access or legal rights of the compilation's users</span><br><span style="color: hsl(120, 100%, 40%);">+beyond what the individual works permit.  Inclusion of a covered work</span><br><span style="color: hsl(120, 100%, 40%);">+in an aggregate does not cause this License to apply to the other</span><br><span style="color: hsl(120, 100%, 40%);">+parts of the aggregate.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  6. Conveying Non-Source Forms.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You may convey a covered work in object code form under the terms</span><br><span style="color: hsl(120, 100%, 40%);">+of sections 4 and 5, provided that you also convey the</span><br><span style="color: hsl(120, 100%, 40%);">+machine-readable Corresponding Source under the terms of this License,</span><br><span style="color: hsl(120, 100%, 40%);">+in one of these ways:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    a) Convey the object code in, or embodied in, a physical product</span><br><span style="color: hsl(120, 100%, 40%);">+    (including a physical distribution medium), accompanied by the</span><br><span style="color: hsl(120, 100%, 40%);">+    Corresponding Source fixed on a durable physical medium</span><br><span style="color: hsl(120, 100%, 40%);">+    customarily used for software interchange.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    b) Convey the object code in, or embodied in, a physical product</span><br><span style="color: hsl(120, 100%, 40%);">+    (including a physical distribution medium), accompanied by a</span><br><span style="color: hsl(120, 100%, 40%);">+    written offer, valid for at least three years and valid for as</span><br><span style="color: hsl(120, 100%, 40%);">+    long as you offer spare parts or customer support for that product</span><br><span style="color: hsl(120, 100%, 40%);">+    model, to give anyone who possesses the object code either (1) a</span><br><span style="color: hsl(120, 100%, 40%);">+    copy of the Corresponding Source for all the software in the</span><br><span style="color: hsl(120, 100%, 40%);">+    product that is covered by this License, on a durable physical</span><br><span style="color: hsl(120, 100%, 40%);">+    medium customarily used for software interchange, for a price no</span><br><span style="color: hsl(120, 100%, 40%);">+    more than your reasonable cost of physically performing this</span><br><span style="color: hsl(120, 100%, 40%);">+    conveying of source, or (2) access to copy the</span><br><span style="color: hsl(120, 100%, 40%);">+    Corresponding Source from a network server at no charge.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    c) Convey individual copies of the object code with a copy of the</span><br><span style="color: hsl(120, 100%, 40%);">+    written offer to provide the Corresponding Source.  This</span><br><span style="color: hsl(120, 100%, 40%);">+    alternative is allowed only occasionally and noncommercially, and</span><br><span style="color: hsl(120, 100%, 40%);">+    only if you received the object code with such an offer, in accord</span><br><span style="color: hsl(120, 100%, 40%);">+    with subsection 6b.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    d) Convey the object code by offering access from a designated</span><br><span style="color: hsl(120, 100%, 40%);">+    place (gratis or for a charge), and offer equivalent access to the</span><br><span style="color: hsl(120, 100%, 40%);">+    Corresponding Source in the same way through the same place at no</span><br><span style="color: hsl(120, 100%, 40%);">+    further charge.  You need not require recipients to copy the</span><br><span style="color: hsl(120, 100%, 40%);">+    Corresponding Source along with the object code.  If the place to</span><br><span style="color: hsl(120, 100%, 40%);">+    copy the object code is a network server, the Corresponding Source</span><br><span style="color: hsl(120, 100%, 40%);">+    may be on a different server (operated by you or a third party)</span><br><span style="color: hsl(120, 100%, 40%);">+    that supports equivalent copying facilities, provided you maintain</span><br><span style="color: hsl(120, 100%, 40%);">+    clear directions next to the object code saying where to find the</span><br><span style="color: hsl(120, 100%, 40%);">+    Corresponding Source.  Regardless of what server hosts the</span><br><span style="color: hsl(120, 100%, 40%);">+    Corresponding Source, you remain obligated to ensure that it is</span><br><span style="color: hsl(120, 100%, 40%);">+    available for as long as needed to satisfy these requirements.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    e) Convey the object code using peer-to-peer transmission, provided</span><br><span style="color: hsl(120, 100%, 40%);">+    you inform other peers where the object code and Corresponding</span><br><span style="color: hsl(120, 100%, 40%);">+    Source of the work are being offered to the general public at no</span><br><span style="color: hsl(120, 100%, 40%);">+    charge under subsection 6d.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A separable portion of the object code, whose source code is excluded</span><br><span style="color: hsl(120, 100%, 40%);">+from the Corresponding Source as a System Library, need not be</span><br><span style="color: hsl(120, 100%, 40%);">+included in conveying the object code work.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A "User Product" is either (1) a "consumer product", which means any</span><br><span style="color: hsl(120, 100%, 40%);">+tangible personal property which is normally used for personal, family,</span><br><span style="color: hsl(120, 100%, 40%);">+or household purposes, or (2) anything designed or sold for incorporation</span><br><span style="color: hsl(120, 100%, 40%);">+into a dwelling.  In determining whether a product is a consumer product,</span><br><span style="color: hsl(120, 100%, 40%);">+doubtful cases shall be resolved in favor of coverage.  For a particular</span><br><span style="color: hsl(120, 100%, 40%);">+product received by a particular user, "normally used" refers to a</span><br><span style="color: hsl(120, 100%, 40%);">+typical or common use of that class of product, regardless of the status</span><br><span style="color: hsl(120, 100%, 40%);">+of the particular user or of the way in which the particular user</span><br><span style="color: hsl(120, 100%, 40%);">+actually uses, or expects or is expected to use, the product.  A product</span><br><span style="color: hsl(120, 100%, 40%);">+is a consumer product regardless of whether the product has substantial</span><br><span style="color: hsl(120, 100%, 40%);">+commercial, industrial or non-consumer uses, unless such uses represent</span><br><span style="color: hsl(120, 100%, 40%);">+the only significant mode of use of the product.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  "Installation Information" for a User Product means any methods,</span><br><span style="color: hsl(120, 100%, 40%);">+procedures, authorization keys, or other information required to install</span><br><span style="color: hsl(120, 100%, 40%);">+and execute modified versions of a covered work in that User Product from</span><br><span style="color: hsl(120, 100%, 40%);">+a modified version of its Corresponding Source.  The information must</span><br><span style="color: hsl(120, 100%, 40%);">+suffice to ensure that the continued functioning of the modified object</span><br><span style="color: hsl(120, 100%, 40%);">+code is in no case prevented or interfered with solely because</span><br><span style="color: hsl(120, 100%, 40%);">+modification has been made.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If you convey an object code work under this section in, or with, or</span><br><span style="color: hsl(120, 100%, 40%);">+specifically for use in, a User Product, and the conveying occurs as</span><br><span style="color: hsl(120, 100%, 40%);">+part of a transaction in which the right of possession and use of the</span><br><span style="color: hsl(120, 100%, 40%);">+User Product is transferred to the recipient in perpetuity or for a</span><br><span style="color: hsl(120, 100%, 40%);">+fixed term (regardless of how the transaction is characterized), the</span><br><span style="color: hsl(120, 100%, 40%);">+Corresponding Source conveyed under this section must be accompanied</span><br><span style="color: hsl(120, 100%, 40%);">+by the Installation Information.  But this requirement does not apply</span><br><span style="color: hsl(120, 100%, 40%);">+if neither you nor any third party retains the ability to install</span><br><span style="color: hsl(120, 100%, 40%);">+modified object code on the User Product (for example, the work has</span><br><span style="color: hsl(120, 100%, 40%);">+been installed in ROM).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The requirement to provide Installation Information does not include a</span><br><span style="color: hsl(120, 100%, 40%);">+requirement to continue to provide support service, warranty, or updates</span><br><span style="color: hsl(120, 100%, 40%);">+for a work that has been modified or installed by the recipient, or for</span><br><span style="color: hsl(120, 100%, 40%);">+the User Product in which it has been modified or installed.  Access to a</span><br><span style="color: hsl(120, 100%, 40%);">+network may be denied when the modification itself materially and</span><br><span style="color: hsl(120, 100%, 40%);">+adversely affects the operation of the network or violates the rules and</span><br><span style="color: hsl(120, 100%, 40%);">+protocols for communication across the network.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Corresponding Source conveyed, and Installation Information provided,</span><br><span style="color: hsl(120, 100%, 40%);">+in accord with this section must be in a format that is publicly</span><br><span style="color: hsl(120, 100%, 40%);">+documented (and with an implementation available to the public in</span><br><span style="color: hsl(120, 100%, 40%);">+source code form), and must require no special password or key for</span><br><span style="color: hsl(120, 100%, 40%);">+unpacking, reading or copying.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  7. Additional Terms.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  "Additional permissions" are terms that supplement the terms of this</span><br><span style="color: hsl(120, 100%, 40%);">+License by making exceptions from one or more of its conditions.</span><br><span style="color: hsl(120, 100%, 40%);">+Additional permissions that are applicable to the entire Program shall</span><br><span style="color: hsl(120, 100%, 40%);">+be treated as though they were included in this License, to the extent</span><br><span style="color: hsl(120, 100%, 40%);">+that they are valid under applicable law.  If additional permissions</span><br><span style="color: hsl(120, 100%, 40%);">+apply only to part of the Program, that part may be used separately</span><br><span style="color: hsl(120, 100%, 40%);">+under those permissions, but the entire Program remains governed by</span><br><span style="color: hsl(120, 100%, 40%);">+this License without regard to the additional permissions.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  When you convey a copy of a covered work, you may at your option</span><br><span style="color: hsl(120, 100%, 40%);">+remove any additional permissions from that copy, or from any part of</span><br><span style="color: hsl(120, 100%, 40%);">+it.  (Additional permissions may be written to require their own</span><br><span style="color: hsl(120, 100%, 40%);">+removal in certain cases when you modify the work.)  You may place</span><br><span style="color: hsl(120, 100%, 40%);">+additional permissions on material, added by you to a covered work,</span><br><span style="color: hsl(120, 100%, 40%);">+for which you have or can give appropriate copyright permission.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Notwithstanding any other provision of this License, for material you</span><br><span style="color: hsl(120, 100%, 40%);">+add to a covered work, you may (if authorized by the copyright holders of</span><br><span style="color: hsl(120, 100%, 40%);">+that material) supplement the terms of this License with terms:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    a) Disclaiming warranty or limiting liability differently from the</span><br><span style="color: hsl(120, 100%, 40%);">+    terms of sections 15 and 16 of this License; or</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    b) Requiring preservation of specified reasonable legal notices or</span><br><span style="color: hsl(120, 100%, 40%);">+    author attributions in that material or in the Appropriate Legal</span><br><span style="color: hsl(120, 100%, 40%);">+    Notices displayed by works containing it; or</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    c) Prohibiting misrepresentation of the origin of that material, or</span><br><span style="color: hsl(120, 100%, 40%);">+    requiring that modified versions of such material be marked in</span><br><span style="color: hsl(120, 100%, 40%);">+    reasonable ways as different from the original version; or</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    d) Limiting the use for publicity purposes of names of licensors or</span><br><span style="color: hsl(120, 100%, 40%);">+    authors of the material; or</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    e) Declining to grant rights under trademark law for use of some</span><br><span style="color: hsl(120, 100%, 40%);">+    trade names, trademarks, or service marks; or</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f) Requiring indemnification of licensors and authors of that</span><br><span style="color: hsl(120, 100%, 40%);">+    material by anyone who conveys the material (or modified versions of</span><br><span style="color: hsl(120, 100%, 40%);">+    it) with contractual assumptions of liability to the recipient, for</span><br><span style="color: hsl(120, 100%, 40%);">+    any liability that these contractual assumptions directly impose on</span><br><span style="color: hsl(120, 100%, 40%);">+    those licensors and authors.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  All other non-permissive additional terms are considered "further</span><br><span style="color: hsl(120, 100%, 40%);">+restrictions" within the meaning of section 10.  If the Program as you</span><br><span style="color: hsl(120, 100%, 40%);">+received it, or any part of it, contains a notice stating that it is</span><br><span style="color: hsl(120, 100%, 40%);">+governed by this License along with a term that is a further</span><br><span style="color: hsl(120, 100%, 40%);">+restriction, you may remove that term.  If a license document contains</span><br><span style="color: hsl(120, 100%, 40%);">+a further restriction but permits relicensing or conveying under this</span><br><span style="color: hsl(120, 100%, 40%);">+License, you may add to a covered work material governed by the terms</span><br><span style="color: hsl(120, 100%, 40%);">+of that license document, provided that the further restriction does</span><br><span style="color: hsl(120, 100%, 40%);">+not survive such relicensing or conveying.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If you add terms to a covered work in accord with this section, you</span><br><span style="color: hsl(120, 100%, 40%);">+must place, in the relevant source files, a statement of the</span><br><span style="color: hsl(120, 100%, 40%);">+additional terms that apply to those files, or a notice indicating</span><br><span style="color: hsl(120, 100%, 40%);">+where to find the applicable terms.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Additional terms, permissive or non-permissive, may be stated in the</span><br><span style="color: hsl(120, 100%, 40%);">+form of a separately written license, or stated as exceptions;</span><br><span style="color: hsl(120, 100%, 40%);">+the above requirements apply either way.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  8. Termination.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You may not propagate or modify a covered work except as expressly</span><br><span style="color: hsl(120, 100%, 40%);">+provided under this License.  Any attempt otherwise to propagate or</span><br><span style="color: hsl(120, 100%, 40%);">+modify it is void, and will automatically terminate your rights under</span><br><span style="color: hsl(120, 100%, 40%);">+this License (including any patent licenses granted under the third</span><br><span style="color: hsl(120, 100%, 40%);">+paragraph of section 11).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  However, if you cease all violation of this License, then your</span><br><span style="color: hsl(120, 100%, 40%);">+license from a particular copyright holder is reinstated (a)</span><br><span style="color: hsl(120, 100%, 40%);">+provisionally, unless and until the copyright holder explicitly and</span><br><span style="color: hsl(120, 100%, 40%);">+finally terminates your license, and (b) permanently, if the copyright</span><br><span style="color: hsl(120, 100%, 40%);">+holder fails to notify you of the violation by some reasonable means</span><br><span style="color: hsl(120, 100%, 40%);">+prior to 60 days after the cessation.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Moreover, your license from a particular copyright holder is</span><br><span style="color: hsl(120, 100%, 40%);">+reinstated permanently if the copyright holder notifies you of the</span><br><span style="color: hsl(120, 100%, 40%);">+violation by some reasonable means, this is the first time you have</span><br><span style="color: hsl(120, 100%, 40%);">+received notice of violation of this License (for any work) from that</span><br><span style="color: hsl(120, 100%, 40%);">+copyright holder, and you cure the violation prior to 30 days after</span><br><span style="color: hsl(120, 100%, 40%);">+your receipt of the notice.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Termination of your rights under this section does not terminate the</span><br><span style="color: hsl(120, 100%, 40%);">+licenses of parties who have received copies or rights from you under</span><br><span style="color: hsl(120, 100%, 40%);">+this License.  If your rights have been terminated and not permanently</span><br><span style="color: hsl(120, 100%, 40%);">+reinstated, you do not qualify to receive new licenses for the same</span><br><span style="color: hsl(120, 100%, 40%);">+material under section 10.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  9. Acceptance Not Required for Having Copies.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You are not required to accept this License in order to receive or</span><br><span style="color: hsl(120, 100%, 40%);">+run a copy of the Program.  Ancillary propagation of a covered work</span><br><span style="color: hsl(120, 100%, 40%);">+occurring solely as a consequence of using peer-to-peer transmission</span><br><span style="color: hsl(120, 100%, 40%);">+to receive a copy likewise does not require acceptance.  However,</span><br><span style="color: hsl(120, 100%, 40%);">+nothing other than this License grants you permission to propagate or</span><br><span style="color: hsl(120, 100%, 40%);">+modify any covered work.  These actions infringe copyright if you do</span><br><span style="color: hsl(120, 100%, 40%);">+not accept this License.  Therefore, by modifying or propagating a</span><br><span style="color: hsl(120, 100%, 40%);">+covered work, you indicate your acceptance of this License to do so.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  10. Automatic Licensing of Downstream Recipients.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Each time you convey a covered work, the recipient automatically</span><br><span style="color: hsl(120, 100%, 40%);">+receives a license from the original licensors, to run, modify and</span><br><span style="color: hsl(120, 100%, 40%);">+propagate that work, subject to this License.  You are not responsible</span><br><span style="color: hsl(120, 100%, 40%);">+for enforcing compliance by third parties with this License.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  An "entity transaction" is a transaction transferring control of an</span><br><span style="color: hsl(120, 100%, 40%);">+organization, or substantially all assets of one, or subdividing an</span><br><span style="color: hsl(120, 100%, 40%);">+organization, or merging organizations.  If propagation of a covered</span><br><span style="color: hsl(120, 100%, 40%);">+work results from an entity transaction, each party to that</span><br><span style="color: hsl(120, 100%, 40%);">+transaction who receives a copy of the work also receives whatever</span><br><span style="color: hsl(120, 100%, 40%);">+licenses to the work the party's predecessor in interest had or could</span><br><span style="color: hsl(120, 100%, 40%);">+give under the previous paragraph, plus a right to possession of the</span><br><span style="color: hsl(120, 100%, 40%);">+Corresponding Source of the work from the predecessor in interest, if</span><br><span style="color: hsl(120, 100%, 40%);">+the predecessor has it or can get it with reasonable efforts.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You may not impose any further restrictions on the exercise of the</span><br><span style="color: hsl(120, 100%, 40%);">+rights granted or affirmed under this License.  For example, you may</span><br><span style="color: hsl(120, 100%, 40%);">+not impose a license fee, royalty, or other charge for exercise of</span><br><span style="color: hsl(120, 100%, 40%);">+rights granted under this License, and you may not initiate litigation</span><br><span style="color: hsl(120, 100%, 40%);">+(including a cross-claim or counterclaim in a lawsuit) alleging that</span><br><span style="color: hsl(120, 100%, 40%);">+any patent claim is infringed by making, using, selling, offering for</span><br><span style="color: hsl(120, 100%, 40%);">+sale, or importing the Program or any portion of it.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  11. Patents.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A "contributor" is a copyright holder who authorizes use under this</span><br><span style="color: hsl(120, 100%, 40%);">+License of the Program or a work on which the Program is based.  The</span><br><span style="color: hsl(120, 100%, 40%);">+work thus licensed is called the contributor's "contributor version".</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A contributor's "essential patent claims" are all patent claims</span><br><span style="color: hsl(120, 100%, 40%);">+owned or controlled by the contributor, whether already acquired or</span><br><span style="color: hsl(120, 100%, 40%);">+hereafter acquired, that would be infringed by some manner, permitted</span><br><span style="color: hsl(120, 100%, 40%);">+by this License, of making, using, or selling its contributor version,</span><br><span style="color: hsl(120, 100%, 40%);">+but do not include claims that would be infringed only as a</span><br><span style="color: hsl(120, 100%, 40%);">+consequence of further modification of the contributor version.  For</span><br><span style="color: hsl(120, 100%, 40%);">+purposes of this definition, "control" includes the right to grant</span><br><span style="color: hsl(120, 100%, 40%);">+patent sublicenses in a manner consistent with the requirements of</span><br><span style="color: hsl(120, 100%, 40%);">+this License.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Each contributor grants you a non-exclusive, worldwide, royalty-free</span><br><span style="color: hsl(120, 100%, 40%);">+patent license under the contributor's essential patent claims, to</span><br><span style="color: hsl(120, 100%, 40%);">+make, use, sell, offer for sale, import and otherwise run, modify and</span><br><span style="color: hsl(120, 100%, 40%);">+propagate the contents of its contributor version.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  In the following three paragraphs, a "patent license" is any express</span><br><span style="color: hsl(120, 100%, 40%);">+agreement or commitment, however denominated, not to enforce a patent</span><br><span style="color: hsl(120, 100%, 40%);">+(such as an express permission to practice a patent or covenant not to</span><br><span style="color: hsl(120, 100%, 40%);">+sue for patent infringement).  To "grant" such a patent license to a</span><br><span style="color: hsl(120, 100%, 40%);">+party means to make such an agreement or commitment not to enforce a</span><br><span style="color: hsl(120, 100%, 40%);">+patent against the party.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If you convey a covered work, knowingly relying on a patent license,</span><br><span style="color: hsl(120, 100%, 40%);">+and the Corresponding Source of the work is not available for anyone</span><br><span style="color: hsl(120, 100%, 40%);">+to copy, free of charge and under the terms of this License, through a</span><br><span style="color: hsl(120, 100%, 40%);">+publicly available network server or other readily accessible means,</span><br><span style="color: hsl(120, 100%, 40%);">+then you must either (1) cause the Corresponding Source to be so</span><br><span style="color: hsl(120, 100%, 40%);">+available, or (2) arrange to deprive yourself of the benefit of the</span><br><span style="color: hsl(120, 100%, 40%);">+patent license for this particular work, or (3) arrange, in a manner</span><br><span style="color: hsl(120, 100%, 40%);">+consistent with the requirements of this License, to extend the patent</span><br><span style="color: hsl(120, 100%, 40%);">+license to downstream recipients.  "Knowingly relying" means you have</span><br><span style="color: hsl(120, 100%, 40%);">+actual knowledge that, but for the patent license, your conveying the</span><br><span style="color: hsl(120, 100%, 40%);">+covered work in a country, or your recipient's use of the covered work</span><br><span style="color: hsl(120, 100%, 40%);">+in a country, would infringe one or more identifiable patents in that</span><br><span style="color: hsl(120, 100%, 40%);">+country that you have reason to believe are valid.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If, pursuant to or in connection with a single transaction or</span><br><span style="color: hsl(120, 100%, 40%);">+arrangement, you convey, or propagate by procuring conveyance of, a</span><br><span style="color: hsl(120, 100%, 40%);">+covered work, and grant a patent license to some of the parties</span><br><span style="color: hsl(120, 100%, 40%);">+receiving the covered work authorizing them to use, propagate, modify</span><br><span style="color: hsl(120, 100%, 40%);">+or convey a specific copy of the covered work, then the patent license</span><br><span style="color: hsl(120, 100%, 40%);">+you grant is automatically extended to all recipients of the covered</span><br><span style="color: hsl(120, 100%, 40%);">+work and works based on it.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A patent license is "discriminatory" if it does not include within</span><br><span style="color: hsl(120, 100%, 40%);">+the scope of its coverage, prohibits the exercise of, or is</span><br><span style="color: hsl(120, 100%, 40%);">+conditioned on the non-exercise of one or more of the rights that are</span><br><span style="color: hsl(120, 100%, 40%);">+specifically granted under this License.  You may not convey a covered</span><br><span style="color: hsl(120, 100%, 40%);">+work if you are a party to an arrangement with a third party that is</span><br><span style="color: hsl(120, 100%, 40%);">+in the business of distributing software, under which you make payment</span><br><span style="color: hsl(120, 100%, 40%);">+to the third party based on the extent of your activity of conveying</span><br><span style="color: hsl(120, 100%, 40%);">+the work, and under which the third party grants, to any of the</span><br><span style="color: hsl(120, 100%, 40%);">+parties who would receive the covered work from you, a discriminatory</span><br><span style="color: hsl(120, 100%, 40%);">+patent license (a) in connection with copies of the covered work</span><br><span style="color: hsl(120, 100%, 40%);">+conveyed by you (or copies made from those copies), or (b) primarily</span><br><span style="color: hsl(120, 100%, 40%);">+for and in connection with specific products or compilations that</span><br><span style="color: hsl(120, 100%, 40%);">+contain the covered work, unless you entered into that arrangement,</span><br><span style="color: hsl(120, 100%, 40%);">+or that patent license was granted, prior to 28 March 2007.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Nothing in this License shall be construed as excluding or limiting</span><br><span style="color: hsl(120, 100%, 40%);">+any implied license or other defenses to infringement that may</span><br><span style="color: hsl(120, 100%, 40%);">+otherwise be available to you under applicable patent law.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  12. No Surrender of Others' Freedom.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If conditions are imposed on you (whether by court order, agreement or</span><br><span style="color: hsl(120, 100%, 40%);">+otherwise) that contradict the conditions of this License, they do not</span><br><span style="color: hsl(120, 100%, 40%);">+excuse you from the conditions of this License.  If you cannot convey a</span><br><span style="color: hsl(120, 100%, 40%);">+covered work so as to satisfy simultaneously your obligations under this</span><br><span style="color: hsl(120, 100%, 40%);">+License and any other pertinent obligations, then as a consequence you may</span><br><span style="color: hsl(120, 100%, 40%);">+not convey it at all.  For example, if you agree to terms that obligate you</span><br><span style="color: hsl(120, 100%, 40%);">+to collect a royalty for further conveying from those to whom you convey</span><br><span style="color: hsl(120, 100%, 40%);">+the Program, the only way you could satisfy both those terms and this</span><br><span style="color: hsl(120, 100%, 40%);">+License would be to refrain entirely from conveying the Program.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  13. Remote Network Interaction; Use with the GNU General Public License.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Notwithstanding any other provision of this License, if you modify the</span><br><span style="color: hsl(120, 100%, 40%);">+Program, your modified version must prominently offer all users</span><br><span style="color: hsl(120, 100%, 40%);">+interacting with it remotely through a computer network (if your version</span><br><span style="color: hsl(120, 100%, 40%);">+supports such interaction) an opportunity to receive the Corresponding</span><br><span style="color: hsl(120, 100%, 40%);">+Source of your version by providing access to the Corresponding Source</span><br><span style="color: hsl(120, 100%, 40%);">+from a network server at no charge, through some standard or customary</span><br><span style="color: hsl(120, 100%, 40%);">+means of facilitating copying of software.  This Corresponding Source</span><br><span style="color: hsl(120, 100%, 40%);">+shall include the Corresponding Source for any work covered by version 3</span><br><span style="color: hsl(120, 100%, 40%);">+of the GNU General Public License that is incorporated pursuant to the</span><br><span style="color: hsl(120, 100%, 40%);">+following paragraph.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Notwithstanding any other provision of this License, you have</span><br><span style="color: hsl(120, 100%, 40%);">+permission to link or combine any covered work with a work licensed</span><br><span style="color: hsl(120, 100%, 40%);">+under version 3 of the GNU General Public License into a single</span><br><span style="color: hsl(120, 100%, 40%);">+combined work, and to convey the resulting work.  The terms of this</span><br><span style="color: hsl(120, 100%, 40%);">+License will continue to apply to the part which is the covered work,</span><br><span style="color: hsl(120, 100%, 40%);">+but the work with which it is combined will remain governed by version</span><br><span style="color: hsl(120, 100%, 40%);">+3 of the GNU General Public License.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  14. Revised Versions of this License.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The Free Software Foundation may publish revised and/or new versions of</span><br><span style="color: hsl(120, 100%, 40%);">+the GNU Affero General Public License from time to time.  Such new versions</span><br><span style="color: hsl(120, 100%, 40%);">+will be similar in spirit to the present version, but may differ in detail to</span><br><span style="color: hsl(120, 100%, 40%);">+address new problems or concerns.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Each version is given a distinguishing version number.  If the</span><br><span style="color: hsl(120, 100%, 40%);">+Program specifies that a certain numbered version of the GNU Affero General</span><br><span style="color: hsl(120, 100%, 40%);">+Public License "or any later version" applies to it, you have the</span><br><span style="color: hsl(120, 100%, 40%);">+option of following the terms and conditions either of that numbered</span><br><span style="color: hsl(120, 100%, 40%);">+version or of any later version published by the Free Software</span><br><span style="color: hsl(120, 100%, 40%);">+Foundation.  If the Program does not specify a version number of the</span><br><span style="color: hsl(120, 100%, 40%);">+GNU Affero General Public License, you may choose any version ever published</span><br><span style="color: hsl(120, 100%, 40%);">+by the Free Software Foundation.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If the Program specifies that a proxy can decide which future</span><br><span style="color: hsl(120, 100%, 40%);">+versions of the GNU Affero General Public License can be used, that proxy's</span><br><span style="color: hsl(120, 100%, 40%);">+public statement of acceptance of a version permanently authorizes you</span><br><span style="color: hsl(120, 100%, 40%);">+to choose that version for the Program.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Later license versions may give you additional or different</span><br><span style="color: hsl(120, 100%, 40%);">+permissions.  However, no additional obligations are imposed on any</span><br><span style="color: hsl(120, 100%, 40%);">+author or copyright holder as a result of your choosing to follow a</span><br><span style="color: hsl(120, 100%, 40%);">+later version.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  15. Disclaimer of Warranty.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY</span><br><span style="color: hsl(120, 100%, 40%);">+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT</span><br><span style="color: hsl(120, 100%, 40%);">+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY</span><br><span style="color: hsl(120, 100%, 40%);">+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,</span><br><span style="color: hsl(120, 100%, 40%);">+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR</span><br><span style="color: hsl(120, 100%, 40%);">+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM</span><br><span style="color: hsl(120, 100%, 40%);">+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF</span><br><span style="color: hsl(120, 100%, 40%);">+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  16. Limitation of Liability.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING</span><br><span style="color: hsl(120, 100%, 40%);">+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS</span><br><span style="color: hsl(120, 100%, 40%);">+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY</span><br><span style="color: hsl(120, 100%, 40%);">+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE</span><br><span style="color: hsl(120, 100%, 40%);">+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF</span><br><span style="color: hsl(120, 100%, 40%);">+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD</span><br><span style="color: hsl(120, 100%, 40%);">+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),</span><br><span style="color: hsl(120, 100%, 40%);">+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF</span><br><span style="color: hsl(120, 100%, 40%);">+SUCH DAMAGES.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  17. Interpretation of Sections 15 and 16.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If the disclaimer of warranty and limitation of liability provided</span><br><span style="color: hsl(120, 100%, 40%);">+above cannot be given local legal effect according to their terms,</span><br><span style="color: hsl(120, 100%, 40%);">+reviewing courts shall apply local law that most closely approximates</span><br><span style="color: hsl(120, 100%, 40%);">+an absolute waiver of all civil liability in connection with the</span><br><span style="color: hsl(120, 100%, 40%);">+Program, unless a warranty or assumption of liability accompanies a</span><br><span style="color: hsl(120, 100%, 40%);">+copy of the Program in return for a fee.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                     END OF TERMS AND CONDITIONS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            How to Apply These Terms to Your New Programs</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If you develop a new program, and you want it to be of the greatest</span><br><span style="color: hsl(120, 100%, 40%);">+possible use to the public, the best way to achieve this is to make it</span><br><span style="color: hsl(120, 100%, 40%);">+free software which everyone can redistribute and change under these terms.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  To do so, attach the following notices to the program.  It is safest</span><br><span style="color: hsl(120, 100%, 40%);">+to attach them to the start of each source file to most effectively</span><br><span style="color: hsl(120, 100%, 40%);">+state the exclusion of warranty; and each file should have at least</span><br><span style="color: hsl(120, 100%, 40%);">+the "copyright" line and a pointer to where the full notice is found.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    <one line to give the program's name and a brief idea of what it does.></span><br><span style="color: hsl(120, 100%, 40%);">+    Copyright (C) <year>  <name of author></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+    it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+    the Free Software Foundation, either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+    (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+    but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+    GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+    along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Also add information on how to contact you by electronic and paper mail.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If your software can interact with users remotely through a computer</span><br><span style="color: hsl(120, 100%, 40%);">+network, you should also make sure that it provides a way for users to</span><br><span style="color: hsl(120, 100%, 40%);">+get its source.  For example, if your program is a web application, its</span><br><span style="color: hsl(120, 100%, 40%);">+interface could display a "Source" link that leads users to an archive</span><br><span style="color: hsl(120, 100%, 40%);">+of the code.  There are many ways you could offer source, and different</span><br><span style="color: hsl(120, 100%, 40%);">+solutions will be better for different programs; see section 13 for the</span><br><span style="color: hsl(120, 100%, 40%);">+specific requirements.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You should also get your employer (if you work as a programmer) or school,</span><br><span style="color: hsl(120, 100%, 40%);">+if any, to sign a "copyright disclaimer" for the program, if necessary.</span><br><span style="color: hsl(120, 100%, 40%);">+For more information on this, and how to apply and follow the GNU AGPL, see</span><br><span style="color: hsl(120, 100%, 40%);">+<http://www.gnu.org/licenses/>.</span><br><span>diff --git a/Makefile.am b/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..3fdc737</span><br><span>--- /dev/null</span><br><span>+++ b/Makefile.am</span><br><span>@@ -0,0 +1,36 @@</span><br><span style="color: hsl(120, 100%, 40%);">+AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## FIXME: automake >= 1.13 or autoconf >= 2.70 provide better suited AC_CONFIG_MACRO_DIRS for configure.ac</span><br><span style="color: hsl(120, 100%, 40%);">+## remove line below when OE toolchain is updated to version which include those</span><br><span style="color: hsl(120, 100%, 40%);">+ACLOCAL_AMFLAGS = -I m4</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CPPFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(all_includes) \</span><br><span style="color: hsl(120, 100%, 40%);">+     -I$(top_srcdir)/include \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = \</span><br><span style="color: hsl(120, 100%, 40%);">+        include \</span><br><span style="color: hsl(120, 100%, 40%);">+     src \</span><br><span style="color: hsl(120, 100%, 40%);">+ tests \</span><br><span style="color: hsl(120, 100%, 40%);">+       doc \</span><br><span style="color: hsl(120, 100%, 40%);">+ contrib \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+BUILT_SOURCES = $(top_srcdir)/.version</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = \</span><br><span style="color: hsl(120, 100%, 40%);">+          .version \</span><br><span style="color: hsl(120, 100%, 40%);">+            contrib/osmo-hnodeb.spec.in \</span><br><span style="color: hsl(120, 100%, 40%);">+         debian \</span><br><span style="color: hsl(120, 100%, 40%);">+      git-version-gen \</span><br><span style="color: hsl(120, 100%, 40%);">+             osmoappdesc.py \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_DISTCHECK_CONFIGURE_FLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+      --with-systemdsystemunitdir=$$dc_install_base/$(systemdsystemunitdir)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+@RELMAKE@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+$(top_srcdir)/.version:</span><br><span style="color: hsl(120, 100%, 40%);">+ echo $(VERSION) > $@-t && mv $@-t $@</span><br><span style="color: hsl(120, 100%, 40%);">+dist-hook:</span><br><span style="color: hsl(120, 100%, 40%);">+   echo $(VERSION) > $(distdir)/.tarball-version</span><br><span>diff --git a/README.md b/README.md</span><br><span>index 8b13789..2f09148 100644</span><br><span>--- a/README.md</span><br><span>+++ b/README.md</span><br><span>@@ -1 +1,64 @@</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-hnodeb - Osmocom hNodeB Implementation</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+This repository contains a C-language implementation of a 3G Home NodeB (hNodeB).</span><br><span style="color: hsl(120, 100%, 40%);">+It is part of the [Osmocom](https://osmocom.org/) Open Source Mobile Communications</span><br><span style="color: hsl(120, 100%, 40%);">+project.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+You can use it to interface Iuh-speaking Home NodeB Gateway (HNB-GW), such as osmo-hnbgw.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+IMPORTANT: This is a first step towards implementing a minimal hNodeB upper</span><br><span style="color: hsl(120, 100%, 40%);">+layer part, mainly handling HNBAP/RUA/RANAP messages on the Iuh interface.  This</span><br><span style="color: hsl(120, 100%, 40%);">+is not expected to be a full / usable hNodeB anytime soon [if ever].</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Homepage</span><br><span style="color: hsl(120, 100%, 40%);">+--------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The official homepage of the project is</span><br><span style="color: hsl(120, 100%, 40%);">+https://osmocom.org/projects/osmohnodeb/wiki</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+GIT Repository</span><br><span style="color: hsl(120, 100%, 40%);">+--------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+You can clone from the official osmo-hnodeb.git repository using</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ git clone git://git.osmocom.org/osmo-hnodeb.git</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+There is a cgit interface at https://git.osmocom.org/osmo-hnodeb/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Documentation</span><br><span style="color: hsl(120, 100%, 40%);">+-------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+User Manuals and VTY reference manuals are [optionally] built in PDF form</span><br><span style="color: hsl(120, 100%, 40%);">+as part of the build process.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Pre-rendered PDF version of the current "master" can be found at</span><br><span style="color: hsl(120, 100%, 40%);">+[User Manual](https://ftp.osmocom.org/docs/latest/osmohnodeb-usermanual.pdf)</span><br><span style="color: hsl(120, 100%, 40%);">+as well as the [VTY Reference Manual](https://ftp.osmocom.org/docs/latest/osmohnodeb-vty-reference.pdf)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Mailing List</span><br><span style="color: hsl(120, 100%, 40%);">+------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Discussions related to osmo-bts are happening on the</span><br><span style="color: hsl(120, 100%, 40%);">+openbsc@lists.osmocom.org mailing list, please see</span><br><span style="color: hsl(120, 100%, 40%);">+https://lists.osmocom.org/mailman/listinfo/openbsc for subscription</span><br><span style="color: hsl(120, 100%, 40%);">+options and the list archive.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Please observe the [Osmocom Mailing List</span><br><span style="color: hsl(120, 100%, 40%);">+Rules](https://osmocom.org/projects/cellular-infrastructure/wiki/Mailing_List_Rules)</span><br><span style="color: hsl(120, 100%, 40%);">+when posting.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Contributing</span><br><span style="color: hsl(120, 100%, 40%);">+------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Our coding standards are described at</span><br><span style="color: hsl(120, 100%, 40%);">+https://osmocom.org/projects/cellular-infrastructure/wiki/Coding_standards</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+We us a gerrit based patch submission/review process for managing</span><br><span style="color: hsl(120, 100%, 40%);">+contributions.  Please see</span><br><span style="color: hsl(120, 100%, 40%);">+https://osmocom.org/projects/cellular-infrastructure/wiki/Gerrit for</span><br><span style="color: hsl(120, 100%, 40%);">+more details</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The current patch queue for osmo-bts can be seen at</span><br><span style="color: hsl(120, 100%, 40%);">+https://gerrit.osmocom.org/#/q/project:osmo-hnodeb+status:open</span><br><span>diff --git a/TODO-RELEASE b/TODO-RELEASE</span><br><span>new file mode 100644</span><br><span>index 0000000..d0852fc</span><br><span>--- /dev/null</span><br><span>+++ b/TODO-RELEASE</span><br><span>@@ -0,0 +1,9 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# When cleaning up this file: bump API version in corresponding Makefile.am and rename corresponding debian/lib*.install</span><br><span style="color: hsl(120, 100%, 40%);">+# according to https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info</span><br><span style="color: hsl(120, 100%, 40%);">+# In short:</span><br><span style="color: hsl(120, 100%, 40%);">+# LIBVERSION=c:r:a</span><br><span style="color: hsl(120, 100%, 40%);">+# If the library source code has changed at all since the last update, then increment revision: c:r + 1:a.</span><br><span style="color: hsl(120, 100%, 40%);">+# If any interfaces have been added, removed, or changed since the last update: c + 1:0:0.</span><br><span style="color: hsl(120, 100%, 40%);">+# If any interfaces have been added since the last public release: c:r:a + 1.</span><br><span style="color: hsl(120, 100%, 40%);">+# If any interfaces have been removed or changed since the last public release: c:r:0.</span><br><span style="color: hsl(120, 100%, 40%);">+#library      what            description / commit summary line</span><br><span>diff --git a/configure.ac b/configure.ac</span><br><span>new file mode 100644</span><br><span>index 0000000..649cf55</span><br><span>--- /dev/null</span><br><span>+++ b/configure.ac</span><br><span>@@ -0,0 +1,228 @@</span><br><span style="color: hsl(120, 100%, 40%);">+dnl Process this file with autoconf to produce a configure script</span><br><span style="color: hsl(120, 100%, 40%);">+AC_INIT([osmo-hnodeb],</span><br><span style="color: hsl(120, 100%, 40%);">+      m4_esyscmd([./git-version-gen .tarball-version]),</span><br><span style="color: hsl(120, 100%, 40%);">+     [openbsc@lists.osmocom.org])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl *This* is the root dir, even if an install-sh exists in ../ or ../../</span><br><span style="color: hsl(120, 100%, 40%);">+AC_CONFIG_AUX_DIR([.])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_INIT_AUTOMAKE([dist-bzip2])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_CONFIG_TESTDIR(tests)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+CFLAGS="$CFLAGS -std=gnu11"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl kernel style compile messages</span><br><span style="color: hsl(120, 100%, 40%);">+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl include release helper</span><br><span style="color: hsl(120, 100%, 40%);">+RELMAKE='-include osmo-release.mk'</span><br><span style="color: hsl(120, 100%, 40%);">+AC_SUBST([RELMAKE])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl checks for programs</span><br><span style="color: hsl(120, 100%, 40%);">+AC_PROG_MAKE_SET</span><br><span style="color: hsl(120, 100%, 40%);">+AC_PROG_CC</span><br><span style="color: hsl(120, 100%, 40%);">+AC_PROG_INSTALL</span><br><span style="color: hsl(120, 100%, 40%);">+LT_INIT</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl patching ${archive_cmds} to affect generation of file "libtool" to fix linking with clang</span><br><span style="color: hsl(120, 100%, 40%);">+AS_CASE(["$LD"],[*clang*],</span><br><span style="color: hsl(120, 100%, 40%);">+  [AS_CASE(["${host_os}"],</span><br><span style="color: hsl(120, 100%, 40%);">+     [*linux*],[archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'])])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl check for pkg-config (explained in detail in libosmocore/configure.ac)</span><br><span style="color: hsl(120, 100%, 40%);">+AC_PATH_PROG(PKG_CONFIG_INSTALLED, pkg-config, no)</span><br><span style="color: hsl(120, 100%, 40%);">+if test "x$PKG_CONFIG_INSTALLED" = "xno"; then</span><br><span style="color: hsl(120, 100%, 40%);">+        AC_MSG_WARN([You need to install pkg-config])</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_PROG_PKG_CONFIG([0.20])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl check for AX_CHECK_COMPILE_FLAG</span><br><span style="color: hsl(120, 100%, 40%);">+m4_ifdef([AX_CHECK_COMPILE_FLAG], [], [</span><br><span style="color: hsl(120, 100%, 40%);">+   AC_MSG_ERROR([Please install autoconf-archive; re-run 'autoreconf -fi' for it to take effect.])</span><br><span style="color: hsl(120, 100%, 40%);">+       ])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl checks for libraries</span><br><span style="color: hsl(120, 100%, 40%);">+AC_SEARCH_LIBS([dlopen], [dl dld], [LIBRARY_DL="$LIBS";LIBS=""])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_SUBST(LIBRARY_DL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.5.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.5.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.5.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.5.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 1.1.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 1.1.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOSIGTRAN, libosmo-sigtran >= 1.4.0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl checks for header files</span><br><span style="color: hsl(120, 100%, 40%);">+AC_HEADER_STDC</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl Checks for typedefs, structures and compiler characteristics</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE(sanitize,</span><br><span style="color: hsl(120, 100%, 40%);">+       [AS_HELP_STRING(</span><br><span style="color: hsl(120, 100%, 40%);">+              [--enable-sanitize],</span><br><span style="color: hsl(120, 100%, 40%);">+          [Compile with address sanitizer enabled],</span><br><span style="color: hsl(120, 100%, 40%);">+     )],</span><br><span style="color: hsl(120, 100%, 40%);">+   [sanitize=$enableval], [sanitize="no"])</span><br><span style="color: hsl(120, 100%, 40%);">+if test x"$sanitize" = x"yes"</span><br><span style="color: hsl(120, 100%, 40%);">+then</span><br><span style="color: hsl(120, 100%, 40%);">+    CFLAGS="$CFLAGS -fsanitize=address -fsanitize=undefined"</span><br><span style="color: hsl(120, 100%, 40%);">+    CPPFLAGS="$CPPFLAGS -fsanitize=address -fsanitize=undefined"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE(werror,</span><br><span style="color: hsl(120, 100%, 40%);">+   [AS_HELP_STRING(</span><br><span style="color: hsl(120, 100%, 40%);">+              [--enable-werror],</span><br><span style="color: hsl(120, 100%, 40%);">+            [Turn all compiler warnings into errors, with exceptions:</span><br><span style="color: hsl(120, 100%, 40%);">+              a) deprecation (allow upstream to mark deprecation without breaking builds);</span><br><span style="color: hsl(120, 100%, 40%);">+          b) "#warning" pragmas (allow to remind ourselves of errors without breaking builds)</span><br><span style="color: hsl(120, 100%, 40%);">+                ]</span><br><span style="color: hsl(120, 100%, 40%);">+     )],</span><br><span style="color: hsl(120, 100%, 40%);">+   [werror=$enableval], [werror="no"])</span><br><span style="color: hsl(120, 100%, 40%);">+if test x"$werror" = x"yes"</span><br><span style="color: hsl(120, 100%, 40%);">+then</span><br><span style="color: hsl(120, 100%, 40%);">+  WERROR_FLAGS="-Werror"</span><br><span style="color: hsl(120, 100%, 40%);">+      WERROR_FLAGS+=" -Wno-error=deprecated -Wno-error=deprecated-declarations"</span><br><span style="color: hsl(120, 100%, 40%);">+   WERROR_FLAGS+=" -Wno-error=cpp" # "#warning"</span><br><span style="color: hsl(120, 100%, 40%);">+      CFLAGS="$CFLAGS $WERROR_FLAGS"</span><br><span style="color: hsl(120, 100%, 40%);">+      CPPFLAGS="$CPPFLAGS $WERROR_FLAGS"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# The following test is taken from WebKit's webkit.m4</span><br><span style="color: hsl(120, 100%, 40%);">+saved_CFLAGS="$CFLAGS"</span><br><span style="color: hsl(120, 100%, 40%);">+CFLAGS="$CFLAGS -fvisibility=hidden "</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])],</span><br><span style="color: hsl(120, 100%, 40%);">+      [ AC_MSG_RESULT([yes])</span><br><span style="color: hsl(120, 100%, 40%);">+        SYMBOL_VISIBILITY="-fvisibility=hidden"],</span><br><span style="color: hsl(120, 100%, 40%);">+        AC_MSG_RESULT([no]))</span><br><span style="color: hsl(120, 100%, 40%);">+CFLAGS="$saved_CFLAGS"</span><br><span style="color: hsl(120, 100%, 40%);">+AC_SUBST(SYMBOL_VISIBILITY)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AX_CHECK_COMPILE_FLAG([-Werror=implicit], [CFLAGS="$CFLAGS -Werror=implicit"])</span><br><span style="color: hsl(120, 100%, 40%);">+AX_CHECK_COMPILE_FLAG([-Werror=maybe-uninitialized], [CFLAGS="$CFLAGS -Werror=maybe-uninitialized"])</span><br><span style="color: hsl(120, 100%, 40%);">+AX_CHECK_COMPILE_FLAG([-Werror=memset-transposed-args], [CFLAGS="$CFLAGS -Werror=memset-transposed-args"])</span><br><span style="color: hsl(120, 100%, 40%);">+AX_CHECK_COMPILE_FLAG([-Wnull-dereference], [CFLAGS="$CFLAGS -Wnull-dereference"])</span><br><span style="color: hsl(120, 100%, 40%);">+AX_CHECK_COMPILE_FLAG([-Werror=sizeof-array-argument], [CFLAGS="$CFLAGS -Werror=sizeof-array-argument"])</span><br><span style="color: hsl(120, 100%, 40%);">+AX_CHECK_COMPILE_FLAG([-Werror=sizeof-pointer-memaccess], [CFLAGS="$CFLAGS -Werror=sizeof-pointer-memaccess"])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Coverage build taken from WebKit's configure.in</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_CHECKING([whether to enable code coverage support])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE(coverage,</span><br><span style="color: hsl(120, 100%, 40%);">+              AC_HELP_STRING([--enable-coverage],</span><br><span style="color: hsl(120, 100%, 40%);">+                             [enable code coverage support [default=no]]),</span><br><span style="color: hsl(120, 100%, 40%);">+              [],[enable_coverage="no"])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_RESULT([$enable_coverage])</span><br><span style="color: hsl(120, 100%, 40%);">+if test "$enable_coverage" = "yes"; then</span><br><span style="color: hsl(120, 100%, 40%);">+   COVERAGE_CFLAGS="-ftest-coverage -fprofile-arcs"</span><br><span style="color: hsl(120, 100%, 40%);">+   COVERAGE_LDFLAGS="-ftest-coverage -fprofile-arcs"</span><br><span style="color: hsl(120, 100%, 40%);">+   AC_SUBST([COVERAGE_CFLAGS])</span><br><span style="color: hsl(120, 100%, 40%);">+   AC_SUBST([COVERAGE_LDFLAGS])</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE(profile,</span><br><span style="color: hsl(120, 100%, 40%);">+            [AS_HELP_STRING([--enable-profile], [Compile with profiling support enabled], )],</span><br><span style="color: hsl(120, 100%, 40%);">+             [profile=$enableval], [profile="no"])</span><br><span style="color: hsl(120, 100%, 40%);">+if test x"$profile" = x"yes"</span><br><span style="color: hsl(120, 100%, 40%);">+then</span><br><span style="color: hsl(120, 100%, 40%);">+       CFLAGS="$CFLAGS -pg"</span><br><span style="color: hsl(120, 100%, 40%);">+        CPPFLAGS="$CPPFLAGS -pg"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE([external_tests],</span><br><span style="color: hsl(120, 100%, 40%);">+             AC_HELP_STRING([--enable-external-tests],</span><br><span style="color: hsl(120, 100%, 40%);">+                             [Include the VTY/CTRL tests in make check [default=no]]),</span><br><span style="color: hsl(120, 100%, 40%);">+             [enable_ext_tests="$enableval"],[enable_ext_tests="no"])</span><br><span style="color: hsl(120, 100%, 40%);">+if test "x$enable_ext_tests" = "xyes" ; then</span><br><span style="color: hsl(120, 100%, 40%);">+        AC_CHECK_PROG(PYTHON3_AVAIL,python3,yes)</span><br><span style="color: hsl(120, 100%, 40%);">+       if test "x$PYTHON3_AVAIL" != "xyes" ; then</span><br><span style="color: hsl(120, 100%, 40%);">+               AC_MSG_ERROR([Please install python3 to run the VTY/CTRL tests.])</span><br><span style="color: hsl(120, 100%, 40%);">+     fi</span><br><span style="color: hsl(120, 100%, 40%);">+    AC_CHECK_PROG(OSMOTESTEXT_CHECK,osmotestvty.py,yes)</span><br><span style="color: hsl(120, 100%, 40%);">+    if test "x$OSMOTESTEXT_CHECK" != "xyes" ; then</span><br><span style="color: hsl(120, 100%, 40%);">+           AC_MSG_ERROR([Please install git://osmocom.org/python/osmo-python-tests to run the VTY/CTRL tests.])</span><br><span style="color: hsl(120, 100%, 40%);">+  fi</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_CHECKING([whether to enable VTY/CTRL tests])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_RESULT([$enable_ext_tests])</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CONDITIONAL(ENABLE_EXT_TESTS, test "x$enable_ext_tests" = "xyes")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Generate manuals</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE(manuals,</span><br><span style="color: hsl(120, 100%, 40%);">+       [AS_HELP_STRING(</span><br><span style="color: hsl(120, 100%, 40%);">+              [--enable-manuals],</span><br><span style="color: hsl(120, 100%, 40%);">+           [Generate manual PDFs [default=no]],</span><br><span style="color: hsl(120, 100%, 40%);">+  )],</span><br><span style="color: hsl(120, 100%, 40%);">+   [osmo_ac_build_manuals=$enableval], [osmo_ac_build_manuals="no"])</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CONDITIONAL([BUILD_MANUALS], [test x"$osmo_ac_build_manuals" = x"yes"])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_VAR(OSMO_GSM_MANUALS_DIR, [path to common osmo-gsm-manuals files, overriding pkg-config and "../osmo-gsm-manuals"</span><br><span style="color: hsl(120, 100%, 40%);">+       fallback])</span><br><span style="color: hsl(120, 100%, 40%);">+if test x"$osmo_ac_build_manuals" = x"yes"</span><br><span style="color: hsl(120, 100%, 40%);">+then</span><br><span style="color: hsl(120, 100%, 40%);">+      # Find OSMO_GSM_MANUALS_DIR (env, pkg-conf, fallback)</span><br><span style="color: hsl(120, 100%, 40%);">+ if test -n "$OSMO_GSM_MANUALS_DIR"; then</span><br><span style="color: hsl(120, 100%, 40%);">+            echo "checking for OSMO_GSM_MANUALS_DIR... $OSMO_GSM_MANUALS_DIR (from env)"</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          OSMO_GSM_MANUALS_DIR="$($PKG_CONFIG osmo-gsm-manuals --variable=osmogsmmanualsdir 2>/dev/null)"</span><br><span style="color: hsl(120, 100%, 40%);">+          if test -n "$OSMO_GSM_MANUALS_DIR"; then</span><br><span style="color: hsl(120, 100%, 40%);">+                    echo "checking for OSMO_GSM_MANUALS_DIR... $OSMO_GSM_MANUALS_DIR (from pkg-conf)"</span><br><span style="color: hsl(120, 100%, 40%);">+           else</span><br><span style="color: hsl(120, 100%, 40%);">+                  OSMO_GSM_MANUALS_DIR="../osmo-gsm-manuals"</span><br><span style="color: hsl(120, 100%, 40%);">+                  echo "checking for OSMO_GSM_MANUALS_DIR... $OSMO_GSM_MANUALS_DIR (fallback)"</span><br><span style="color: hsl(120, 100%, 40%);">+                fi</span><br><span style="color: hsl(120, 100%, 40%);">+    fi</span><br><span style="color: hsl(120, 100%, 40%);">+    if ! test -d "$OSMO_GSM_MANUALS_DIR"; then</span><br><span style="color: hsl(120, 100%, 40%);">+          AC_MSG_ERROR("OSMO_GSM_MANUALS_DIR does not exist! Install osmo-gsm-manuals or set OSMO_GSM_MANUALS_DIR.")</span><br><span style="color: hsl(120, 100%, 40%);">+  fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # Find and run check-depends</span><br><span style="color: hsl(120, 100%, 40%);">+  CHECK_DEPENDS="$OSMO_GSM_MANUALS_DIR/check-depends.sh"</span><br><span style="color: hsl(120, 100%, 40%);">+      if ! test -x "$CHECK_DEPENDS"; then</span><br><span style="color: hsl(120, 100%, 40%);">+         CHECK_DEPENDS="osmo-gsm-manuals-check-depends"</span><br><span style="color: hsl(120, 100%, 40%);">+      fi</span><br><span style="color: hsl(120, 100%, 40%);">+    if ! $CHECK_DEPENDS; then</span><br><span style="color: hsl(120, 100%, 40%);">+             AC_MSG_ERROR("missing dependencies for --enable-manuals")</span><br><span style="color: hsl(120, 100%, 40%);">+   fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # Put in Makefile with absolute path</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_GSM_MANUALS_DIR="$(realpath "$OSMO_GSM_MANUALS_DIR")"</span><br><span style="color: hsl(120, 100%, 40%);">+        AC_SUBST([OSMO_GSM_MANUALS_DIR])</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# https://www.freedesktop.org/software/systemd/man/daemon.html</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_WITH([systemdsystemunitdir],</span><br><span style="color: hsl(120, 100%, 40%);">+     [AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files])],,</span><br><span style="color: hsl(120, 100%, 40%);">+     [with_systemdsystemunitdir=auto])</span><br><span style="color: hsl(120, 100%, 40%);">+AS_IF([test "x$with_systemdsystemunitdir" = "xyes" -o "x$with_systemdsystemunitdir" = "xauto"], [</span><br><span style="color: hsl(120, 100%, 40%);">+     def_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     AS_IF([test "x$def_systemdsystemunitdir" = "x"],</span><br><span style="color: hsl(120, 100%, 40%);">+   [AS_IF([test "x$with_systemdsystemunitdir" = "xyes"],</span><br><span style="color: hsl(120, 100%, 40%);">+    [AC_MSG_ERROR([systemd support requested but pkg-config unable to query systemd package])])</span><br><span style="color: hsl(120, 100%, 40%);">+    with_systemdsystemunitdir=no],</span><br><span style="color: hsl(120, 100%, 40%);">+   [with_systemdsystemunitdir="$def_systemdsystemunitdir"])])</span><br><span style="color: hsl(120, 100%, 40%);">+AS_IF([test "x$with_systemdsystemunitdir" != "xno"],</span><br><span style="color: hsl(120, 100%, 40%);">+      [AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])])</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CONDITIONAL([HAVE_SYSTEMD], [test "x$with_systemdsystemunitdir" != "xno"])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_RESULT([CFLAGS="$CFLAGS"])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_RESULT([CPPFLAGS="$CPPFLAGS"])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl Generate the output</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CONFIG_HEADER(config.h)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AC_OUTPUT(</span><br><span style="color: hsl(120, 100%, 40%);">+    include/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    include/osmocom/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    include/osmocom/hnodeb/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    src/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    src/osmo-hnodeb/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    tests/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    tests/atlocal</span><br><span style="color: hsl(120, 100%, 40%);">+    doc/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    doc/examples/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    doc/manuals/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    contrib/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    contrib/systemd/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    contrib/osmo-hnodeb.spec</span><br><span style="color: hsl(120, 100%, 40%);">+    Makefile)</span><br><span>diff --git a/contrib/Makefile.am b/contrib/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..3439c97</span><br><span>--- /dev/null</span><br><span>+++ b/contrib/Makefile.am</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = systemd</span><br><span>diff --git a/contrib/jenkins.sh b/contrib/jenkins.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..85042d8</span><br><span>--- /dev/null</span><br><span>+++ b/contrib/jenkins.sh</span><br><span>@@ -0,0 +1,68 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env bash</span><br><span style="color: hsl(120, 100%, 40%);">+# jenkins build helper script for osmo-hnodeb.  This is how we build on jenkins.osmocom.org</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# environment variables:</span><br><span style="color: hsl(120, 100%, 40%);">+# * WITH_MANUALS: build manual PDFs if set to "1"</span><br><span style="color: hsl(120, 100%, 40%);">+# * PUBLISH: upload manuals after building if set to "1" (ignored without WITH_MANUALS = "1")</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if ! [ -x "$(command -v osmo-build-dep.sh)" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+   echo "Error: We need to have scripts/osmo-deps.sh from http://git.osmocom.org/osmo-ci/ in PATH !"</span><br><span style="color: hsl(120, 100%, 40%);">+   exit 2</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+set -ex</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+base="$PWD"</span><br><span style="color: hsl(120, 100%, 40%);">+deps="$base/deps"</span><br><span style="color: hsl(120, 100%, 40%);">+inst="$deps/install"</span><br><span style="color: hsl(120, 100%, 40%);">+export deps inst</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-clean-workspace.sh</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+mkdir "$deps" || true</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+verify_value_string_arrays_are_terminated.py $(find . -name "*.[hc]")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"</span><br><span style="color: hsl(120, 100%, 40%);">+export LD_LIBRARY_PATH="$inst/lib"</span><br><span style="color: hsl(120, 100%, 40%);">+export PATH="$inst/bin:$PATH"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-build-dep.sh libosmocore "" --disable-doxygen</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-build-dep.sh libosmo-abis</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-build-dep.sh libosmo-netif</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-build-dep.sh libosmo-sccp</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-build-dep.sh libasn1c</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Additional configure options and depends</span><br><span style="color: hsl(120, 100%, 40%);">+CONFIG=""</span><br><span style="color: hsl(120, 100%, 40%);">+if [ "$WITH_MANUALS" = "1" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+    CONFIG="--enable-manuals"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+set +x</span><br><span style="color: hsl(120, 100%, 40%);">+echo</span><br><span style="color: hsl(120, 100%, 40%);">+echo</span><br><span style="color: hsl(120, 100%, 40%);">+echo</span><br><span style="color: hsl(120, 100%, 40%);">+echo " =============================== osmo-hnodeb ==============================="</span><br><span style="color: hsl(120, 100%, 40%);">+echo</span><br><span style="color: hsl(120, 100%, 40%);">+set -x</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+cd "$base"</span><br><span style="color: hsl(120, 100%, 40%);">+autoreconf --install --force</span><br><span style="color: hsl(120, 100%, 40%);">+./configure --enable-sanitize --enable-external-tests --enable-werror $CONFIG</span><br><span style="color: hsl(120, 100%, 40%);">+$MAKE $PARALLEL_MAKE</span><br><span style="color: hsl(120, 100%, 40%);">+LD_LIBRARY_PATH="$inst/lib" $MAKE check \</span><br><span style="color: hsl(120, 100%, 40%);">+  || cat-testlogs.sh</span><br><span style="color: hsl(120, 100%, 40%);">+LD_LIBRARY_PATH="$inst/lib" \</span><br><span style="color: hsl(120, 100%, 40%);">+  DISTCHECK_CONFIGURE_FLAGS="--enable-vty-tests --enable-external-tests --enable-werror $CONFIG" \</span><br><span style="color: hsl(120, 100%, 40%);">+  $MAKE $PARALLEL_MAKE distcheck \</span><br><span style="color: hsl(120, 100%, 40%);">+  || cat-testlogs.sh</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if [ "$WITH_MANUALS" = "1" ] && [ "$PUBLISH" = "1" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+ make -C "$base/doc/manuals" publish</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+$MAKE $PARALLEL_MAKE maintainer-clean</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-clean-workspace.sh</span><br><span>diff --git a/contrib/osmo-hnodeb.spec.in b/contrib/osmo-hnodeb.spec.in</span><br><span>new file mode 100644</span><br><span>index 0000000..4dbb670</span><br><span>--- /dev/null</span><br><span>+++ b/contrib/osmo-hnodeb.spec.in</span><br><span>@@ -0,0 +1,91 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# spec file for package osmo-hnodeb</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Copyright (c) 2017, Martin Hauke <mardnh@gmx.de></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# All modifications and additions to the file contributed by third parties</span><br><span style="color: hsl(120, 100%, 40%);">+# remain the property of their copyright owners, unless otherwise agreed</span><br><span style="color: hsl(120, 100%, 40%);">+# upon. The license for this file, and modifications and additions to the</span><br><span style="color: hsl(120, 100%, 40%);">+# file, is the same license as for the pristine package itself (unless the</span><br><span style="color: hsl(120, 100%, 40%);">+# license for the pristine package is not an Open Source License, in which</span><br><span style="color: hsl(120, 100%, 40%);">+# case the license is the MIT License). An "Open Source License" is a</span><br><span style="color: hsl(120, 100%, 40%);">+# license that conforms to the Open Source Definition (Version 1.9)</span><br><span style="color: hsl(120, 100%, 40%);">+# published by the Open Source Initiative.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Disable LTO for now since it breaks compilation of the tests</span><br><span style="color: hsl(120, 100%, 40%);">+## https://osmocom.org/issues/4113</span><br><span style="color: hsl(120, 100%, 40%);">+%define _lto_cflags %{nil}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Name:           osmo-hnodeb</span><br><span style="color: hsl(120, 100%, 40%);">+Version:        @VERSION@</span><br><span style="color: hsl(120, 100%, 40%);">+Release:        0</span><br><span style="color: hsl(120, 100%, 40%);">+Summary:        Osmohnodeb: Osmocom's Base Station Controller for 2G CS mobile networks</span><br><span style="color: hsl(120, 100%, 40%);">+License:        AGPL-3.0-or-later AND GPL-2.0-or-later</span><br><span style="color: hsl(120, 100%, 40%);">+Group:          Hardware/Mobile</span><br><span style="color: hsl(120, 100%, 40%);">+URL:            https://osmocom.org/projects/osmohnodeb</span><br><span style="color: hsl(120, 100%, 40%);">+Source:         %{name}-%{version}.tar.xz</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  automake >= 1.9</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  libtool >= 2</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig >= 0.20</span><br><span style="color: hsl(120, 100%, 40%);">+%if 0%{?suse_version}</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  systemd-rpm-macros</span><br><span style="color: hsl(120, 100%, 40%);">+%endif</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libcrypto) >= 0.9.5</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmo-netif) >= 1.1.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmo-sigtran) >= 1.4.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmoabis) >= 1.1.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmocore) >= 1.5.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmoctrl) >= 1.5.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmogb) >= 1.5.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmogsm) >= 1.5.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmovty) >= 1.5.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(talloc)</span><br><span style="color: hsl(120, 100%, 40%);">+%{?systemd_requires}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%description</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHNodeB: Osmocom's Home NodeB for 3G mobile networks.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%prep</span><br><span style="color: hsl(120, 100%, 40%);">+%setup -q</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%build</span><br><span style="color: hsl(120, 100%, 40%);">+echo "%{version}" >.tarball-version</span><br><span style="color: hsl(120, 100%, 40%);">+autoreconf -fi</span><br><span style="color: hsl(120, 100%, 40%);">+%configure \</span><br><span style="color: hsl(120, 100%, 40%);">+  --docdir=%{_docdir}/%{name} \</span><br><span style="color: hsl(120, 100%, 40%);">+  --with-systemdsystemunitdir=%{_unitdir}</span><br><span style="color: hsl(120, 100%, 40%);">+make %{?_smp_mflags}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%install</span><br><span style="color: hsl(120, 100%, 40%);">+%make_install</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%if 0%{?suse_version}</span><br><span style="color: hsl(120, 100%, 40%);">+%preun</span><br><span style="color: hsl(120, 100%, 40%);">+%service_del_preun %{name}.service</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%postun</span><br><span style="color: hsl(120, 100%, 40%);">+%service_del_postun %{name}.service</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%pre</span><br><span style="color: hsl(120, 100%, 40%);">+%service_add_pre %{name}.service</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%post</span><br><span style="color: hsl(120, 100%, 40%);">+%service_add_post %{name}.service</span><br><span style="color: hsl(120, 100%, 40%);">+%endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%check</span><br><span style="color: hsl(120, 100%, 40%);">+make %{?_smp_mflags} check || (find . -name testsuite.log -exec cat {} +)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%files</span><br><span style="color: hsl(120, 100%, 40%);">+%license COPYING</span><br><span style="color: hsl(120, 100%, 40%);">+%doc AUTHORS README</span><br><span style="color: hsl(120, 100%, 40%);">+%{_bindir}/osmo-hnodeb</span><br><span style="color: hsl(120, 100%, 40%);">+%dir %{_docdir}/%{name}/examples</span><br><span style="color: hsl(120, 100%, 40%);">+%dir %{_docdir}/%{name}/examples/osmo-hnodeb</span><br><span style="color: hsl(120, 100%, 40%);">+%{_docdir}/%{name}/examples/osmo-hnodeb/osmo-hnodeb.cfg</span><br><span style="color: hsl(120, 100%, 40%);">+%{_docdir}/%{name}/examples/osmo-hnodeb/*/osmo-hnodeb*.cfg</span><br><span style="color: hsl(120, 100%, 40%);">+%dir %{_sysconfdir}/osmocom</span><br><span style="color: hsl(120, 100%, 40%);">+%config(noreplace) %{_sysconfdir}/osmocom/osmo-hnodeb.cfg</span><br><span style="color: hsl(120, 100%, 40%);">+%{_unitdir}/%{name}.service</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%changelog</span><br><span>diff --git a/contrib/systemd/Makefile.am b/contrib/systemd/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..b20cf20</span><br><span>--- /dev/null</span><br><span>+++ b/contrib/systemd/Makefile.am</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = osmo-hnodeb.service</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if HAVE_SYSTEMD</span><br><span style="color: hsl(120, 100%, 40%);">+systemdsystemunit_DATA = \</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo-hnodeb.service</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span>diff --git a/contrib/systemd/osmo-hnodeb.service b/contrib/systemd/osmo-hnodeb.service</span><br><span>new file mode 100644</span><br><span>index 0000000..037e0e8</span><br><span>--- /dev/null</span><br><span>+++ b/contrib/systemd/osmo-hnodeb.service</span><br><span>@@ -0,0 +1,11 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[Unit]</span><br><span style="color: hsl(120, 100%, 40%);">+Description=Osmocom Home NodeB (hNodeB)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[Service]</span><br><span style="color: hsl(120, 100%, 40%);">+Type=simple</span><br><span style="color: hsl(120, 100%, 40%);">+Restart=always</span><br><span style="color: hsl(120, 100%, 40%);">+ExecStart=/usr/bin/osmo-hnodeb -c /etc/osmocom/osmo-hnodeb.cfg</span><br><span style="color: hsl(120, 100%, 40%);">+RestartSec=2</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[Install]</span><br><span style="color: hsl(120, 100%, 40%);">+WantedBy=multi-user.target</span><br><span>diff --git a/debian/changelog b/debian/changelog</span><br><span>new file mode 100644</span><br><span>index 0000000..e69de29</span><br><span>--- /dev/null</span><br><span>+++ b/debian/changelog</span><br><span>diff --git a/debian/compat b/debian/compat</span><br><span>new file mode 100644</span><br><span>index 0000000..ec63514</span><br><span>--- /dev/null</span><br><span>+++ b/debian/compat</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+9</span><br><span>diff --git a/debian/control b/debian/control</span><br><span>new file mode 100644</span><br><span>index 0000000..a7316db</span><br><span>--- /dev/null</span><br><span>+++ b/debian/control</span><br><span>@@ -0,0 +1,46 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Source: osmo-hnodeb</span><br><span style="color: hsl(120, 100%, 40%);">+Section: net</span><br><span style="color: hsl(120, 100%, 40%);">+Priority: extra</span><br><span style="color: hsl(120, 100%, 40%);">+Maintainer: Osmocom team <openbsc@lists.osmocom.org></span><br><span style="color: hsl(120, 100%, 40%);">+Build-Depends: debhelper (>=9),</span><br><span style="color: hsl(120, 100%, 40%);">+               dh-autoreconf,</span><br><span style="color: hsl(120, 100%, 40%);">+               autotools-dev,</span><br><span style="color: hsl(120, 100%, 40%);">+               autoconf,</span><br><span style="color: hsl(120, 100%, 40%);">+               automake,</span><br><span style="color: hsl(120, 100%, 40%);">+               libtool,</span><br><span style="color: hsl(120, 100%, 40%);">+               pkg-config,</span><br><span style="color: hsl(120, 100%, 40%);">+               python3-minimal,</span><br><span style="color: hsl(120, 100%, 40%);">+               libtalloc-dev,</span><br><span style="color: hsl(120, 100%, 40%);">+               libasn1c-dev,</span><br><span style="color: hsl(120, 100%, 40%);">+               libosmocore-dev (>= 1.5.0),</span><br><span style="color: hsl(120, 100%, 40%);">+               libosmo-sigtran-dev (>= 1.4.0),</span><br><span style="color: hsl(120, 100%, 40%);">+               libosmo-abis-dev (>= 1.1.0),</span><br><span style="color: hsl(120, 100%, 40%);">+               libosmo-netif-dev (>= 1.1.0),</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo-gsm-manuals-dev (>= 1.1.0)</span><br><span style="color: hsl(120, 100%, 40%);">+Standards-Version: 3.9.8</span><br><span style="color: hsl(120, 100%, 40%);">+Vcs-Git: git://git.osmocom.org/osmo-hnodeb.git</span><br><span style="color: hsl(120, 100%, 40%);">+Vcs-Browser: https://git.osmocom.org/osmo-hnodeb/</span><br><span style="color: hsl(120, 100%, 40%);">+Homepage: https://projects.osmocom.org/projects/osmo-hnodeb</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Package: osmo-hnodeb</span><br><span style="color: hsl(120, 100%, 40%);">+Architecture: any</span><br><span style="color: hsl(120, 100%, 40%);">+Multi-Arch: foreign</span><br><span style="color: hsl(120, 100%, 40%);">+Depends: ${misc:Depends}, ${shlibs:Depends}</span><br><span style="color: hsl(120, 100%, 40%);">+Recommends: osmo-mgw</span><br><span style="color: hsl(120, 100%, 40%);">+Description: OsmoHNodeB: Osmocom's Home NodeB for 3G mobile networks</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Package: osmo-hnodeb-dbg</span><br><span style="color: hsl(120, 100%, 40%);">+Section: debug</span><br><span style="color: hsl(120, 100%, 40%);">+Architecture: any</span><br><span style="color: hsl(120, 100%, 40%);">+Multi-Arch: same</span><br><span style="color: hsl(120, 100%, 40%);">+Depends: osmo-hnodeb (= ${binary:Version}), ${misc:Depends}</span><br><span style="color: hsl(120, 100%, 40%);">+Description: OsmoHNodeB: Osmocom's Home NodeB for 3G mobile networks</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Package: osmo-hnodeb-doc</span><br><span style="color: hsl(120, 100%, 40%);">+Architecture: all</span><br><span style="color: hsl(120, 100%, 40%);">+Section: doc</span><br><span style="color: hsl(120, 100%, 40%);">+Priority: optional</span><br><span style="color: hsl(120, 100%, 40%);">+Depends: ${misc:Depends}</span><br><span style="color: hsl(120, 100%, 40%);">+Description: ${misc:Package} PDF documentation</span><br><span style="color: hsl(120, 100%, 40%);">+ Various manuals: user manual, VTY reference manual and/or</span><br><span style="color: hsl(120, 100%, 40%);">+ protocol/interface manuals.</span><br><span>diff --git a/debian/copyright b/debian/copyright</span><br><span>new file mode 100644</span><br><span>index 0000000..8321a0e</span><br><span>--- /dev/null</span><br><span>+++ b/debian/copyright</span><br><span>@@ -0,0 +1,19 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/</span><br><span style="color: hsl(120, 100%, 40%);">+Upstream-Name: osmo-hnodeb</span><br><span style="color: hsl(120, 100%, 40%);">+Source: git://git.osmocom.org/osmo-hnodeb</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Files:     *</span><br><span style="color: hsl(120, 100%, 40%);">+Copyright: 2021 sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+License:   AGPL-3.0+</span><br><span style="color: hsl(120, 100%, 40%);">+ This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ .</span><br><span style="color: hsl(120, 100%, 40%);">+ This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ .</span><br><span style="color: hsl(120, 100%, 40%);">+ You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span>diff --git a/debian/osmo-hnodeb.install b/debian/osmo-hnodeb.install</span><br><span>new file mode 100644</span><br><span>index 0000000..e875d68</span><br><span>--- /dev/null</span><br><span>+++ b/debian/osmo-hnodeb.install</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+etc/osmocom/osmo-hnodeb.cfg</span><br><span style="color: hsl(120, 100%, 40%);">+lib/systemd/system/osmo-hnodeb.service</span><br><span style="color: hsl(120, 100%, 40%);">+usr/bin/osmo-hnodeb</span><br><span style="color: hsl(120, 100%, 40%);">+usr/share/doc/osmo-hnodeb/examples/osmo-hnodeb/osmo-hnodeb.cfg usr/share/doc/osmo-hnodeb/examples</span><br><span>diff --git a/debian/rules b/debian/rules</span><br><span>new file mode 100755</span><br><span>index 0000000..a6bcd45</span><br><span>--- /dev/null</span><br><span>+++ b/debian/rules</span><br><span>@@ -0,0 +1,66 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/make -f</span><br><span style="color: hsl(120, 100%, 40%);">+# You must remove unused comment lines for the released package.</span><br><span style="color: hsl(120, 100%, 40%);">+# See debhelper(7) (uncomment to enable)</span><br><span style="color: hsl(120, 100%, 40%);">+# This is an autogenerated template for debian/rules.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Output every command that modifies files on the build system.</span><br><span style="color: hsl(120, 100%, 40%);">+#export DH_VERBOSE = 1</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Copy some variable definitions from pkg-info.mk and vendor.mk</span><br><span style="color: hsl(120, 100%, 40%);">+# under /usr/share/dpkg/ to here if they are useful.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# See FEATURE AREAS/ENVIRONMENT in dpkg-buildflags(1)</span><br><span style="color: hsl(120, 100%, 40%);">+# Apply all hardening options</span><br><span style="color: hsl(120, 100%, 40%);">+#export DEB_BUILD_MAINT_OPTIONS = hardening=+all</span><br><span style="color: hsl(120, 100%, 40%);">+# Package maintainers to append CFLAGS</span><br><span style="color: hsl(120, 100%, 40%);">+#export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic</span><br><span style="color: hsl(120, 100%, 40%);">+# Package maintainers to append LDFLAGS</span><br><span style="color: hsl(120, 100%, 40%);">+#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# With debhelper version 9 or newer, the dh command exports</span><br><span style="color: hsl(120, 100%, 40%);">+# all buildflags.  So there is no need to include the</span><br><span style="color: hsl(120, 100%, 40%);">+# /usr/share/dpkg/buildflags.mk file here if compat is 9 or newer.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# These are rarely used code. (START)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# The following include for *.mk magically sets miscellaneous</span><br><span style="color: hsl(120, 100%, 40%);">+# variables while honoring existing values of pertinent</span><br><span style="color: hsl(120, 100%, 40%);">+# environment variables:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Architecture-related variables such as DEB_TARGET_MULTIARCH:</span><br><span style="color: hsl(120, 100%, 40%);">+#include /usr/share/dpkg/architecture.mk</span><br><span style="color: hsl(120, 100%, 40%);">+# Vendor-related variables such as DEB_VENDOR:</span><br><span style="color: hsl(120, 100%, 40%);">+#include /usr/share/dpkg/vendor.mk</span><br><span style="color: hsl(120, 100%, 40%);">+# Package-related variables such as DEB_DISTRIBUTION</span><br><span style="color: hsl(120, 100%, 40%);">+#include /usr/share/dpkg/pkg-info.mk</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You may alternatively set them susing a simple script such as:</span><br><span style="color: hsl(120, 100%, 40%);">+# DEB_VENDOR ?= $(shell dpkg-vendor --query  Vendor)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# These are rarely used code. (END)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# main packaging script based on dh7 syntax</span><br><span style="color: hsl(120, 100%, 40%);">+%:</span><br><span style="color: hsl(120, 100%, 40%);">+   dh $@ --with autoreconf</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# debmake generated override targets</span><br><span style="color: hsl(120, 100%, 40%);">+CONFIGURE_FLAGS += --with-systemdsystemunitdir=/lib/systemd/system --enable-manuals</span><br><span style="color: hsl(120, 100%, 40%);">+override_dh_auto_configure:</span><br><span style="color: hsl(120, 100%, 40%);">+     dh_auto_configure -- $(CONFIGURE_FLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Do not install libtool archive, python .pyc .pyo</span><br><span style="color: hsl(120, 100%, 40%);">+#override_dh_install:</span><br><span style="color: hsl(120, 100%, 40%);">+#        dh_install --list-missing -X.la -X.pyc -X.pyo</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# See https://www.debian.org/doc/manuals/developers-reference/best-pkging-practices.html#bpp-dbg</span><br><span style="color: hsl(120, 100%, 40%);">+override_dh_strip:</span><br><span style="color: hsl(120, 100%, 40%);">+ dh_strip -posmo-hnodeb --dbg-package=osmo-hnodeb-dbg</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Print test results in case of a failure</span><br><span style="color: hsl(120, 100%, 40%);">+override_dh_auto_test:</span><br><span style="color: hsl(120, 100%, 40%);">+     dh_auto_test || (find . -name testsuite.log -exec cat {} \; ; false)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Don't create .pdf.gz files (barely saves space and they can't be opened directly by most pdf readers)</span><br><span style="color: hsl(120, 100%, 40%);">+override_dh_compress:</span><br><span style="color: hsl(120, 100%, 40%);">+        dh_compress -X.pdf</span><br><span>diff --git a/debian/source/format b/debian/source/format</span><br><span>new file mode 100644</span><br><span>index 0000000..89ae9db</span><br><span>--- /dev/null</span><br><span>+++ b/debian/source/format</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+3.0 (native)</span><br><span>diff --git a/doc/Makefile.am b/doc/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..15f36b7</span><br><span>--- /dev/null</span><br><span>+++ b/doc/Makefile.am</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = \</span><br><span style="color: hsl(120, 100%, 40%);">+      examples \</span><br><span style="color: hsl(120, 100%, 40%);">+    manuals \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(NULL)</span><br><span>diff --git a/doc/examples/Makefile.am b/doc/examples/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..c533e4e</span><br><span>--- /dev/null</span><br><span>+++ b/doc/examples/Makefile.am</span><br><span>@@ -0,0 +1,30 @@</span><br><span style="color: hsl(120, 100%, 40%);">+OSMOCONF_FILES = \</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo-hnodeb/osmo-hnodeb.cfg</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+osmoconfdir = $(sysconfdir)/osmocom</span><br><span style="color: hsl(120, 100%, 40%);">+osmoconf_DATA = $(OSMOCONF_FILES)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = $(OSMOCONF_FILES)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+CFG_FILES = find $(srcdir) -name '*.cfg*' | sed -e 's,^$(srcdir),,'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dist-hook:</span><br><span style="color: hsl(120, 100%, 40%);">+  for f in $$($(CFG_FILES)); do \</span><br><span style="color: hsl(120, 100%, 40%);">+               j="$(distdir)/$$f" && \</span><br><span style="color: hsl(120, 100%, 40%);">+             mkdir -p "$$(dirname $$j)" && \</span><br><span style="color: hsl(120, 100%, 40%);">+             $(INSTALL_DATA) $(srcdir)/$$f $$j; \</span><br><span style="color: hsl(120, 100%, 40%);">+  done</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+install-data-hook:</span><br><span style="color: hsl(120, 100%, 40%);">+    for f in $$($(CFG_FILES)); do \</span><br><span style="color: hsl(120, 100%, 40%);">+               j="$(DESTDIR)$(docdir)/examples/$$f" && \</span><br><span style="color: hsl(120, 100%, 40%);">+           mkdir -p "$$(dirname $$j)" && \</span><br><span style="color: hsl(120, 100%, 40%);">+             $(INSTALL_DATA) $(srcdir)/$$f $$j; \</span><br><span style="color: hsl(120, 100%, 40%);">+  done</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+uninstall-hook:</span><br><span style="color: hsl(120, 100%, 40%);">+       @$(PRE_UNINSTALL)</span><br><span style="color: hsl(120, 100%, 40%);">+     for f in $$($(CFG_FILES)); do \</span><br><span style="color: hsl(120, 100%, 40%);">+               j="$(DESTDIR)$(docdir)/examples/$$f" && \</span><br><span style="color: hsl(120, 100%, 40%);">+           $(RM) $$j; \</span><br><span style="color: hsl(120, 100%, 40%);">+  done</span><br><span>diff --git a/doc/examples/osmo-hnodeb/osmo-hnodeb.cfg b/doc/examples/osmo-hnodeb/osmo-hnodeb.cfg</span><br><span>new file mode 100644</span><br><span>index 0000000..e69de29</span><br><span>--- /dev/null</span><br><span>+++ b/doc/examples/osmo-hnodeb/osmo-hnodeb.cfg</span><br><span>diff --git a/doc/manuals/Makefile.am b/doc/manuals/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..8fb3ed4</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/Makefile.am</span><br><span>@@ -0,0 +1,26 @@</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = \</span><br><span style="color: hsl(120, 100%, 40%);">+    osmohnodeb-usermanual.adoc \</span><br><span style="color: hsl(120, 100%, 40%);">+    osmohnodeb-usermanual-docinfo.xml \</span><br><span style="color: hsl(120, 100%, 40%);">+    osmohnodeb-vty-reference.xml \</span><br><span style="color: hsl(120, 100%, 40%);">+    chapters \</span><br><span style="color: hsl(120, 100%, 40%);">+    regen_doc.sh \</span><br><span style="color: hsl(120, 100%, 40%);">+    vty</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if BUILD_MANUALS</span><br><span style="color: hsl(120, 100%, 40%);">+  ASCIIDOC = osmohnodeb-usermanual.adoc</span><br><span style="color: hsl(120, 100%, 40%);">+  include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.asciidoc.inc</span><br><span style="color: hsl(120, 100%, 40%);">+  osmohnodeb-usermanual.pdf: $(srcdir)/chapters/*.adoc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TODO: enable once we have VTY available in osmo-hnodeb</span><br><span style="color: hsl(120, 100%, 40%);">+#  VTY_REFERENCE = osmohnodeb-vty-reference.xml</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#  BUILT_REFERENCE_XML = $(builddir)/vty/hnodeb_vty_reference.xml</span><br><span style="color: hsl(120, 100%, 40%);">+#  $(builddir)/vty/hnodeb_vty_reference.xml: $(top_builddir)/src/osmo-hnodeb/osmo-hnodeb</span><br><span style="color: hsl(120, 100%, 40%);">+#     mkdir -p $(builddir)/vty</span><br><span style="color: hsl(120, 100%, 40%);">+#     $(top_builddir)/src/osmo-hnodeb/osmo-hnodeb --vty-ref-xml > $@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#  include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.vty-reference.inc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_REPOSITORY = osmo-hnodeb</span><br><span style="color: hsl(120, 100%, 40%);">+  include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.common.inc</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span>diff --git a/doc/manuals/chapters/overview.adoc b/doc/manuals/chapters/overview.adoc</span><br><span>new file mode 100644</span><br><span>index 0000000..d5fda70</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/chapters/overview.adoc</span><br><span>@@ -0,0 +1,14 @@</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHNodeB[[overview]]</span><br><span style="color: hsl(120, 100%, 40%);">+== Overview</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+This manual should help you getting started with OsmoHNodeB. It will cover</span><br><span style="color: hsl(120, 100%, 40%);">+aspects of configuring and running the OsmoHNodeB.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[[intro_overview]]</span><br><span style="color: hsl(120, 100%, 40%);">+=== About OsmoHNodeB</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHNodeB is the Osmocom implementation of a 3G Home NodeB. It</span><br><span style="color: hsl(120, 100%, 40%);">+implements:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+- An L2 Uu radio interface towards 3G UEs</span><br><span style="color: hsl(120, 100%, 40%);">+- an Iuh interface towards Home Node BG Gateway HNBGW</span><br><span>diff --git a/doc/manuals/osmohnodeb-usermanual-docinfo.xml b/doc/manuals/osmohnodeb-usermanual-docinfo.xml</span><br><span>new file mode 100644</span><br><span>index 0000000..d3ddc8c</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/osmohnodeb-usermanual-docinfo.xml</span><br><span>@@ -0,0 +1,47 @@</span><br><span style="color: hsl(120, 100%, 40%);">+<revhistory></span><br><span style="color: hsl(120, 100%, 40%);">+  <revision></span><br><span style="color: hsl(120, 100%, 40%);">+    <revnumber>1</revnumber></span><br><span style="color: hsl(120, 100%, 40%);">+    <date>October 2016</date></span><br><span style="color: hsl(120, 100%, 40%);">+    <authorinitials>PEP</authorinitials></span><br><span style="color: hsl(120, 100%, 40%);">+    <revremark></span><br><span style="color: hsl(120, 100%, 40%);">+      Initial OsmoHnodeB manual</span><br><span style="color: hsl(120, 100%, 40%);">+    </revremark></span><br><span style="color: hsl(120, 100%, 40%);">+  </revision></span><br><span style="color: hsl(120, 100%, 40%);">+</revhistory></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<authorgroup></span><br><span style="color: hsl(120, 100%, 40%);">+  <author></span><br><span style="color: hsl(120, 100%, 40%);">+    <firstname>Pau</firstname></span><br><span style="color: hsl(120, 100%, 40%);">+    <surname>Espin Pedrol</surname></span><br><span style="color: hsl(120, 100%, 40%);">+    <email>pespin@sysmocom.de</email></span><br><span style="color: hsl(120, 100%, 40%);">+    <authorinitials>PE</authorinitials></span><br><span style="color: hsl(120, 100%, 40%);">+    <affiliation></span><br><span style="color: hsl(120, 100%, 40%);">+      <shortaffil>sysmocom</shortaffil></span><br><span style="color: hsl(120, 100%, 40%);">+      <orgname>sysmocom - s.f.m.c. GmbH</orgname></span><br><span style="color: hsl(120, 100%, 40%);">+      <jobtitle>Software Developer</jobtitle></span><br><span style="color: hsl(120, 100%, 40%);">+    </affiliation></span><br><span style="color: hsl(120, 100%, 40%);">+  </author></span><br><span style="color: hsl(120, 100%, 40%);">+</authorgroup></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<copyright></span><br><span style="color: hsl(120, 100%, 40%);">+  <year>2021</year></span><br><span style="color: hsl(120, 100%, 40%);">+  <holder>sysmocom - s.f.m.c. GmbH</holder></span><br><span style="color: hsl(120, 100%, 40%);">+</copyright></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<legalnotice></span><br><span style="color: hsl(120, 100%, 40%);">+  <para></span><br><span style="color: hsl(120, 100%, 40%);">+     Permission is granted to copy, distribute and/or modify this</span><br><span style="color: hsl(120, 100%, 40%);">+  document under the terms of the GNU Free Documentation License,</span><br><span style="color: hsl(120, 100%, 40%);">+       Version 1.3 or any later version published by the Free Software</span><br><span style="color: hsl(120, 100%, 40%);">+       Foundation; with the Invariant Sections being just 'Foreword',</span><br><span style="color: hsl(120, 100%, 40%);">+        'Acknowledgements' and 'Preface', with no Front-Cover Texts,</span><br><span style="color: hsl(120, 100%, 40%);">+  and no Back-Cover Texts.  A copy of the license is included in</span><br><span style="color: hsl(120, 100%, 40%);">+        the section entitled "GNU Free Documentation License".</span><br><span style="color: hsl(120, 100%, 40%);">+  </para></span><br><span style="color: hsl(120, 100%, 40%);">+  <para></span><br><span style="color: hsl(120, 100%, 40%);">+     The Asciidoc source code of this manual can be found at</span><br><span style="color: hsl(120, 100%, 40%);">+       <ulink url="http://git.osmocom.org/osmo-gsm-manuals/"></span><br><span style="color: hsl(120, 100%, 40%);">+                http://git.osmocom.org/osmo-gsm-manuals/</span><br><span style="color: hsl(120, 100%, 40%);">+      </ulink></span><br><span style="color: hsl(120, 100%, 40%);">+  </para></span><br><span style="color: hsl(120, 100%, 40%);">+</legalnotice></span><br><span>diff --git a/doc/manuals/osmohnodeb-usermanual.adoc b/doc/manuals/osmohnodeb-usermanual.adoc</span><br><span>new file mode 100644</span><br><span>index 0000000..578c0b9</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/osmohnodeb-usermanual.adoc</span><br><span>@@ -0,0 +1,31 @@</span><br><span style="color: hsl(120, 100%, 40%);">+:gfdl-enabled:</span><br><span style="color: hsl(120, 100%, 40%);">+:program-name: OsmoHNodeB</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHNodeB User Manual</span><br><span style="color: hsl(120, 100%, 40%);">+======================</span><br><span style="color: hsl(120, 100%, 40%);">+Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/preface.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::{srcdir}/chapters/overview.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/vty.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/logging.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/cs7-config.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/counters-overview.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/control_if.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/vty_cpu_sched.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/port_numbers.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/bibliography.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/glossary.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/gfdl.adoc[]</span><br><span>diff --git a/doc/manuals/osmohnodeb-vty-reference.xml b/doc/manuals/osmohnodeb-vty-reference.xml</span><br><span>new file mode 100644</span><br><span>index 0000000..d642ce5</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/osmohnodeb-vty-reference.xml</span><br><span>@@ -0,0 +1,37 @@</span><br><span style="color: hsl(120, 100%, 40%);">+<?xml version="1.0" encoding="UTF-8"?></span><br><span style="color: hsl(120, 100%, 40%);">+<!--</span><br><span style="color: hsl(120, 100%, 40%);">+  ex:ts=2:sw=42sts=2:et</span><br><span style="color: hsl(120, 100%, 40%);">+  -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-</span><br><span style="color: hsl(120, 100%, 40%);">+--></span><br><span style="color: hsl(120, 100%, 40%);">+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML 5.0//EN"</span><br><span style="color: hsl(120, 100%, 40%);">+"http://docbook.org/xml/5.0/dtd/docbook.dtd" [</span><br><span style="color: hsl(120, 100%, 40%);">+<!ENTITY chapter-vty      SYSTEM      "./common/chapters/vty.xml" ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ENTITY sections-vty     SYSTEM      "generated/docbook_vty.xml"  ></span><br><span style="color: hsl(120, 100%, 40%);">+]></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<book></span><br><span style="color: hsl(120, 100%, 40%);">+  <info></span><br><span style="color: hsl(120, 100%, 40%);">+    <revhistory></span><br><span style="color: hsl(120, 100%, 40%);">+        <revision></span><br><span style="color: hsl(120, 100%, 40%);">+            <revnumber>v1</revnumber></span><br><span style="color: hsl(120, 100%, 40%);">+            <date>20th October 2021</date></span><br><span style="color: hsl(120, 100%, 40%);">+            <authorinitials>PEP</authorinitials></span><br><span style="color: hsl(120, 100%, 40%);">+            <revremark>Initial</revremark></span><br><span style="color: hsl(120, 100%, 40%);">+        </revision></span><br><span style="color: hsl(120, 100%, 40%);">+    </revhistory></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    <title>OsmoHNodeB VTY Reference</title></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    <copyright></span><br><span style="color: hsl(120, 100%, 40%);">+      <year>2021</year></span><br><span style="color: hsl(120, 100%, 40%);">+    </copyright></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    <legalnotice></span><br><span style="color: hsl(120, 100%, 40%);">+      <para>This work is copyright by <orgname>sysmocom - s.f.m.c. GmbH</orgname>. All rights reserved.</span><br><span style="color: hsl(120, 100%, 40%);">+      </para></span><br><span style="color: hsl(120, 100%, 40%);">+    </legalnotice></span><br><span style="color: hsl(120, 100%, 40%);">+  </info></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  <!-- Main chapters--></span><br><span style="color: hsl(120, 100%, 40%);">+  &chapter-vty;</span><br><span style="color: hsl(120, 100%, 40%);">+</book></span><br><span>diff --git a/doc/manuals/regen_doc.sh b/doc/manuals/regen_doc.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..81636ea</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/regen_doc.sh</span><br><span>@@ -0,0 +1,17 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/sh -x</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if [ -z "$DOCKER_PLAYGROUND" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+  echo "You need to set DOCKER_PLAYGROUND"</span><br><span style="color: hsl(120, 100%, 40%);">+    exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+SCRIPT=$(realpath "$0")</span><br><span style="color: hsl(120, 100%, 40%);">+MANUAL_DIR=$(dirname "$SCRIPT")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+COMMIT=${COMMIT:-$(git log -1 --format=format:%H)}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+cd "$DOCKER_PLAYGROUND/scripts" || exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OSMO_HNODEB_BRANCH=$COMMIT ./regen_doc.sh osmo-hnodeb 4273 \</span><br><span style="color: hsl(120, 100%, 40%);">+       "$MANUAL_DIR/chapters/counters_generated.adoc" \</span><br><span style="color: hsl(120, 100%, 40%);">+    "$MANUAL_DIR/vty/hnodeb_vty_reference.xml"</span><br><span>diff --git a/doc/manuals/vty/hnodeb_vty_additions.xml b/doc/manuals/vty/hnodeb_vty_additions.xml</span><br><span>new file mode 100644</span><br><span>index 0000000..a4c675e</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/vty/hnodeb_vty_additions.xml</span><br><span>@@ -0,0 +1,2 @@</span><br><span style="color: hsl(120, 100%, 40%);">+<vtydoc xmlns='urn:osmocom:xml:libosmocore:vty:doc:1.0'></span><br><span style="color: hsl(120, 100%, 40%);">+</vtydoc></span><br><span>diff --git a/git-version-gen b/git-version-gen</span><br><span>new file mode 100755</span><br><span>index 0000000..42cf3d2</span><br><span>--- /dev/null</span><br><span>+++ b/git-version-gen</span><br><span>@@ -0,0 +1,151 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/sh</span><br><span style="color: hsl(120, 100%, 40%);">+# Print a version string.</span><br><span style="color: hsl(120, 100%, 40%);">+scriptversion=2010-01-28.01</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Copyright (C) 2007-2010 Free Software Foundation, Inc.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+# the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+# (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# This script is derived from GIT-VERSION-GEN from GIT: http://git.or.cz/.</span><br><span style="color: hsl(120, 100%, 40%);">+# It may be run two ways:</span><br><span style="color: hsl(120, 100%, 40%);">+# - from a git repository in which the "git describe" command below</span><br><span style="color: hsl(120, 100%, 40%);">+#   produces useful output (thus requiring at least one signed tag)</span><br><span style="color: hsl(120, 100%, 40%);">+# - from a non-git-repo directory containing a .tarball-version file, which</span><br><span style="color: hsl(120, 100%, 40%);">+#   presumes this script is invoked like "./git-version-gen .tarball-version".</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# In order to use intra-version strings in your project, you will need two</span><br><span style="color: hsl(120, 100%, 40%);">+# separate generated version string files:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# .tarball-version - present only in a distribution tarball, and not in</span><br><span style="color: hsl(120, 100%, 40%);">+#   a checked-out repository.  Created with contents that were learned at</span><br><span style="color: hsl(120, 100%, 40%);">+#   the last time autoconf was run, and used by git-version-gen.  Must not</span><br><span style="color: hsl(120, 100%, 40%);">+#   be present in either $(srcdir) or $(builddir) for git-version-gen to</span><br><span style="color: hsl(120, 100%, 40%);">+#   give accurate answers during normal development with a checked out tree,</span><br><span style="color: hsl(120, 100%, 40%);">+#   but must be present in a tarball when there is no version control system.</span><br><span style="color: hsl(120, 100%, 40%);">+#   Therefore, it cannot be used in any dependencies.  GNUmakefile has</span><br><span style="color: hsl(120, 100%, 40%);">+#   hooks to force a reconfigure at distribution time to get the value</span><br><span style="color: hsl(120, 100%, 40%);">+#   correct, without penalizing normal development with extra reconfigures.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# .version - present in a checked-out repository and in a distribution</span><br><span style="color: hsl(120, 100%, 40%);">+#   tarball.  Usable in dependencies, particularly for files that don't</span><br><span style="color: hsl(120, 100%, 40%);">+#   want to depend on config.h but do want to track version changes.</span><br><span style="color: hsl(120, 100%, 40%);">+#   Delete this file prior to any autoconf run where you want to rebuild</span><br><span style="color: hsl(120, 100%, 40%);">+#   files to pick up a version string change; and leave it stale to</span><br><span style="color: hsl(120, 100%, 40%);">+#   minimize rebuild time after unrelated changes to configure sources.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# It is probably wise to add these two files to .gitignore, so that you</span><br><span style="color: hsl(120, 100%, 40%);">+# don't accidentally commit either generated file.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Use the following line in your configure.ac, so that $(VERSION) will</span><br><span style="color: hsl(120, 100%, 40%);">+# automatically be up-to-date each time configure is run (and note that</span><br><span style="color: hsl(120, 100%, 40%);">+# since configure.ac no longer includes a version string, Makefile rules</span><br><span style="color: hsl(120, 100%, 40%);">+# should not depend on configure.ac for version updates).</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# AC_INIT([GNU project],</span><br><span style="color: hsl(120, 100%, 40%);">+#         m4_esyscmd([build-aux/git-version-gen .tarball-version]),</span><br><span style="color: hsl(120, 100%, 40%);">+#         [bug-project@example])</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Then use the following lines in your Makefile.am, so that .version</span><br><span style="color: hsl(120, 100%, 40%);">+# will be present for dependencies, and so that .tarball-version will</span><br><span style="color: hsl(120, 100%, 40%);">+# exist in distribution tarballs.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# BUILT_SOURCES = $(top_srcdir)/.version</span><br><span style="color: hsl(120, 100%, 40%);">+# $(top_srcdir)/.version:</span><br><span style="color: hsl(120, 100%, 40%);">+#        echo $(VERSION) > $@-t && mv $@-t $@</span><br><span style="color: hsl(120, 100%, 40%);">+# dist-hook:</span><br><span style="color: hsl(120, 100%, 40%);">+#        echo $(VERSION) > $(distdir)/.tarball-version</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+case $# in</span><br><span style="color: hsl(120, 100%, 40%);">+    1) ;;</span><br><span style="color: hsl(120, 100%, 40%);">+    *) echo 1>&2 "Usage: $0 \$srcdir/.tarball-version"; exit 1;;</span><br><span style="color: hsl(120, 100%, 40%);">+esac</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+tarball_version_file=$1</span><br><span style="color: hsl(120, 100%, 40%);">+nl='</span><br><span style="color: hsl(120, 100%, 40%);">+'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# First see if there is a tarball-only version file.</span><br><span style="color: hsl(120, 100%, 40%);">+# then try "git describe", then default.</span><br><span style="color: hsl(120, 100%, 40%);">+if test -f $tarball_version_file</span><br><span style="color: hsl(120, 100%, 40%);">+then</span><br><span style="color: hsl(120, 100%, 40%);">+    v=`cat $tarball_version_file` || exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+    case $v in</span><br><span style="color: hsl(120, 100%, 40%);">+       *$nl*) v= ;; # reject multi-line output</span><br><span style="color: hsl(120, 100%, 40%);">+       [0-9]*) ;;</span><br><span style="color: hsl(120, 100%, 40%);">+    *) v= ;;</span><br><span style="color: hsl(120, 100%, 40%);">+    esac</span><br><span style="color: hsl(120, 100%, 40%);">+    test -z "$v" \</span><br><span style="color: hsl(120, 100%, 40%);">+      && echo "$0: WARNING: $tarball_version_file seems to be damaged" 1>&2</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if test -n "$v"</span><br><span style="color: hsl(120, 100%, 40%);">+then</span><br><span style="color: hsl(120, 100%, 40%);">+    : # use $v</span><br><span style="color: hsl(120, 100%, 40%);">+elif</span><br><span style="color: hsl(120, 100%, 40%);">+       v=`git describe --abbrev=4 --match='v*' HEAD 2>/dev/null \</span><br><span style="color: hsl(120, 100%, 40%);">+       || git describe --abbrev=4 HEAD 2>/dev/null` \</span><br><span style="color: hsl(120, 100%, 40%);">+    && case $v in</span><br><span style="color: hsl(120, 100%, 40%);">+         [0-9]*) ;;</span><br><span style="color: hsl(120, 100%, 40%);">+    v[0-9]*) ;;</span><br><span style="color: hsl(120, 100%, 40%);">+   *) (exit 1) ;;</span><br><span style="color: hsl(120, 100%, 40%);">+       esac</span><br><span style="color: hsl(120, 100%, 40%);">+then</span><br><span style="color: hsl(120, 100%, 40%);">+    # Is this a new git that lists number of commits since the last</span><br><span style="color: hsl(120, 100%, 40%);">+    # tag or the previous older version that did not?</span><br><span style="color: hsl(120, 100%, 40%);">+    #   Newer: v6.10-77-g0f8faeb</span><br><span style="color: hsl(120, 100%, 40%);">+    #   Older: v6.10-g0f8faeb</span><br><span style="color: hsl(120, 100%, 40%);">+    case $v in</span><br><span style="color: hsl(120, 100%, 40%);">+       *-*-*) : git describe is okay three part flavor ;;</span><br><span style="color: hsl(120, 100%, 40%);">+    *-*)</span><br><span style="color: hsl(120, 100%, 40%);">+      : git describe is older two part flavor</span><br><span style="color: hsl(120, 100%, 40%);">+       # Recreate the number of commits and rewrite such that the</span><br><span style="color: hsl(120, 100%, 40%);">+            # result is the same as if we were using the newer version</span><br><span style="color: hsl(120, 100%, 40%);">+            # of git describe.</span><br><span style="color: hsl(120, 100%, 40%);">+            vtag=`echo "$v" | sed 's/-.*//'`</span><br><span style="color: hsl(120, 100%, 40%);">+            numcommits=`git rev-list "$vtag"..HEAD | wc -l`</span><br><span style="color: hsl(120, 100%, 40%);">+     v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`;</span><br><span style="color: hsl(120, 100%, 40%);">+         ;;</span><br><span style="color: hsl(120, 100%, 40%);">+    esac</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    # Change the first '-' to a '.', so version-comparing tools work properly.</span><br><span style="color: hsl(120, 100%, 40%);">+    # Remove the "g" in git describe's output string, to save a byte.</span><br><span style="color: hsl(120, 100%, 40%);">+    v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`;</span><br><span style="color: hsl(120, 100%, 40%);">+else</span><br><span style="color: hsl(120, 100%, 40%);">+    v=UNKNOWN</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+v=`echo "$v" |sed 's/^v//'`</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Don't declare a version "dirty" merely because a time stamp has changed.</span><br><span style="color: hsl(120, 100%, 40%);">+git status > /dev/null 2>&1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dirty=`sh -c 'git diff-index --name-only HEAD' 2>/dev/null` || dirty=</span><br><span style="color: hsl(120, 100%, 40%);">+case "$dirty" in</span><br><span style="color: hsl(120, 100%, 40%);">+    '') ;;</span><br><span style="color: hsl(120, 100%, 40%);">+    *) # Append the suffix only if there isn't one already.</span><br><span style="color: hsl(120, 100%, 40%);">+        case $v in</span><br><span style="color: hsl(120, 100%, 40%);">+      *-dirty) ;;</span><br><span style="color: hsl(120, 100%, 40%);">+   *) v="$v-dirty" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+        esac ;;</span><br><span style="color: hsl(120, 100%, 40%);">+esac</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Omit the trailing newline, so that m4_esyscmd can use the result directly.</span><br><span style="color: hsl(120, 100%, 40%);">+echo "$v" | tr -d '\012'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Local variables:</span><br><span style="color: hsl(120, 100%, 40%);">+# eval: (add-hook 'write-file-hooks 'time-stamp)</span><br><span style="color: hsl(120, 100%, 40%);">+# time-stamp-start: "scriptversion="</span><br><span style="color: hsl(120, 100%, 40%);">+# time-stamp-format: "%:y-%02m-%02d.%02H"</span><br><span style="color: hsl(120, 100%, 40%);">+# time-stamp-end: "$"</span><br><span style="color: hsl(120, 100%, 40%);">+# End:</span><br><span>diff --git a/include/Makefile.am b/include/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..9d963a0</span><br><span>--- /dev/null</span><br><span>+++ b/include/Makefile.am</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = \</span><br><span style="color: hsl(120, 100%, 40%);">+   osmocom \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(NULL)</span><br><span>diff --git a/include/osmocom/Makefile.am b/include/osmocom/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..19b6348</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/Makefile.am</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = \</span><br><span style="color: hsl(120, 100%, 40%);">+   hnodeb \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(NULL)</span><br><span>diff --git a/include/osmocom/hnodeb/Makefile.am b/include/osmocom/hnodeb/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..189ef37</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/hnodeb/Makefile.am</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+noinst_HEADERS = \</span><br><span style="color: hsl(120, 100%, 40%);">+       hnodeb.h \</span><br><span style="color: hsl(120, 100%, 40%);">+    $(NULL)</span><br><span>diff --git a/include/osmocom/hnodeb/hnodeb.h b/include/osmocom/hnodeb/hnodeb.h</span><br><span>new file mode 100644</span><br><span>index 0000000..6f70f09</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/hnodeb/hnodeb.h</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span>diff --git a/osmoappdesc.py b/osmoappdesc.py</span><br><span>new file mode 100644</span><br><span>index 0000000..3456fca</span><br><span>--- /dev/null</span><br><span>+++ b/osmoappdesc.py</span><br><span>@@ -0,0 +1,27 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env python3</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 2021 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+# the Free Software Foundation, either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+# (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with this program.  If not, see <http://www.gnu.org/licenses/></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+app_configs = {</span><br><span style="color: hsl(120, 100%, 40%);">+    "osmo-hnodeb": ["doc/examples/osmo-hnodeb/osmo-hnodeb.cfg"]</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+apps = [(4273, "src/osmo-hnodeb/osmo-hnodeb", "OsmoHNodeB", "osmo-hnodeb")</span><br><span style="color: hsl(120, 100%, 40%);">+        ]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_command = ["./src/osmo-hnodeb/osmo-hnodeb", "-c",</span><br><span style="color: hsl(120, 100%, 40%);">+               "doc/examples/osmo-hnodeb/osmo-hnodeb.cfg"]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_app = apps[0]</span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..ba68ce8</span><br><span>--- /dev/null</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = \</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo-hnodeb \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span>diff --git a/src/osmo-hnodeb/Makefile.am b/src/osmo-hnodeb/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..2ec8b24</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-hnodeb/Makefile.am</span><br><span>@@ -0,0 +1,40 @@</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CPPFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(all_includes) \</span><br><span style="color: hsl(120, 100%, 40%);">+     -I$(top_srcdir)/include \</span><br><span style="color: hsl(120, 100%, 40%);">+     -I$(top_builddir) \</span><br><span style="color: hsl(120, 100%, 40%);">+   $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+      -Wall \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(LIBOSMOGSM_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(LIBOSMOVTY_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(LIBOSMOCTRL_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(LIBOSMONETIF_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(COVERAGE_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(LIBOSMOABIS_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(LIBOSMOSIGTRAN_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+    $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_LDFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(COVERAGE_LDFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bin_PROGRAMS = \</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo-hnodeb \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_hnodeb_SOURCES = \</span><br><span style="color: hsl(120, 100%, 40%);">+    main.c \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_hnodeb_LDADD = \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(LIBOSMOCORE_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOGSM_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(LIBOSMOVTY_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(LIBOSMOCTRL_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMONETIF_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(COVERAGE_LDFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOABIS_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOSIGTRAN_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(NULL)</span><br><span>diff --git a/src/osmo-hnodeb/main.c b/src/osmo-hnodeb/main.c</span><br><span>new file mode 100644</span><br><span>index 0000000..96d9136</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-hnodeb/main.c</span><br><span>@@ -0,0 +1,25 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/lienses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "config.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int main(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..ed101ae</span><br><span>--- /dev/null</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -0,0 +1,77 @@</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = \</span><br><span style="color: hsl(120, 100%, 40%);">+   $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# The `:;' works around a Bash 3.2 bug when the output is not writeable.</span><br><span style="color: hsl(120, 100%, 40%);">+$(srcdir)/package.m4: $(top_srcdir)/configure.ac</span><br><span style="color: hsl(120, 100%, 40%);">+     :;{ \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo '# Signature of the current package.' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo 'm4_define([AT_PACKAGE_NAME],' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo '  [$(PACKAGE_NAME)])' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo 'm4_define([AT_PACKAGE_TARNAME],' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo '  [$(PACKAGE_TARNAME)])' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo 'm4_define([AT_PACKAGE_VERSION],' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo '  [$(PACKAGE_VERSION)])' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo 'm4_define([AT_PACKAGE_STRING],' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo '  [$(PACKAGE_STRING)])' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo 'm4_define([AT_PACKAGE_BUGREPORT],' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo '  [$(PACKAGE_BUGREPORT)])'; \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo 'm4_define([AT_PACKAGE_URL],' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo '  [$(PACKAGE_URL)])'; \</span><br><span style="color: hsl(120, 100%, 40%);">+             } >'$(srcdir)/package.m4'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = \</span><br><span style="color: hsl(120, 100%, 40%);">+    testsuite.at \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(srcdir)/package.m4 \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(TESTSUITE) \</span><br><span style="color: hsl(120, 100%, 40%);">+        ctrl_test_runner.py \</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo-hnodeb.vty \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+TESTSUITE = $(srcdir)/testsuite</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DISTCLEANFILES = \</span><br><span style="color: hsl(120, 100%, 40%);">+      atconfig \</span><br><span style="color: hsl(120, 100%, 40%);">+    $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if ENABLE_EXT_TESTS</span><br><span style="color: hsl(120, 100%, 40%);">+python-tests: $(BUILT_SOURCES)</span><br><span style="color: hsl(120, 100%, 40%);">+        echo ""</span><br><span style="color: hsl(120, 100%, 40%);">+#    TODO: Enable once we have a VTY/CTRL interface:</span><br><span style="color: hsl(120, 100%, 40%);">+#      $(MAKE) vty-test</span><br><span style="color: hsl(120, 100%, 40%);">+#     osmotestvty.py -p $(abs_top_srcdir) -w $(abs_top_builddir) -v</span><br><span style="color: hsl(120, 100%, 40%);">+#        osmotestconfig.py -p $(abs_top_srcdir) -w $(abs_top_builddir) -v</span><br><span style="color: hsl(120, 100%, 40%);">+#     $(srcdir)/ctrl_test_runner.py -w $(abs_top_builddir) -v</span><br><span style="color: hsl(120, 100%, 40%);">+else</span><br><span style="color: hsl(120, 100%, 40%);">+python-tests: $(BUILT_SOURCES)</span><br><span style="color: hsl(120, 100%, 40%);">+ echo "Not running python-based tests (determined at configure-time)"</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Run a specific test with: 'make vty-test VTY_TEST=osmo-hnodeb.vty'</span><br><span style="color: hsl(120, 100%, 40%);">+VTY_TEST ?= *.vty</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# To update the VTY script from current application behavior,</span><br><span style="color: hsl(120, 100%, 40%);">+# pass -u to vty_script_runner.py by doing:</span><br><span style="color: hsl(120, 100%, 40%);">+#   make vty-test U=-u</span><br><span style="color: hsl(120, 100%, 40%);">+vty-test:</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_verify_transcript_vty.py -v \</span><br><span style="color: hsl(120, 100%, 40%);">+            -n OsmoHNodeB -p 4273 \</span><br><span style="color: hsl(120, 100%, 40%);">+               -r "$(top_builddir)/src/osmo-hnodeb/osmo-hnodeb -c $(top_srcdir)/doc/examples/osmo-hnodeb/osmo-hnodeb.cfg" \</span><br><span style="color: hsl(120, 100%, 40%);">+                $(U) $(srcdir)/$(VTY_TEST)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+check-local: atconfig $(TESTSUITE)</span><br><span style="color: hsl(120, 100%, 40%);">+      $(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+     $(MAKE) $(AM_MAKEFLAGS) python-tests</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+installcheck-local: atconfig $(TESTSUITE)</span><br><span style="color: hsl(120, 100%, 40%);">+     $(SHELL) '$(TESTSUITE)' AUTOTEST_PATH='$(bindir)' \</span><br><span style="color: hsl(120, 100%, 40%);">+           $(TESTSUITEFLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+clean-local:</span><br><span style="color: hsl(120, 100%, 40%);">+     test ! -f '$(TESTSUITE)' || \</span><br><span style="color: hsl(120, 100%, 40%);">+         $(SHELL) '$(TESTSUITE)' --clean</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AUTOM4TE = $(SHELL) $(top_srcdir)/missing --run autom4te</span><br><span style="color: hsl(120, 100%, 40%);">+AUTOTEST = $(AUTOM4TE) --language=autotest</span><br><span style="color: hsl(120, 100%, 40%);">+$(TESTSUITE): $(srcdir)/testsuite.at $(srcdir)/package.m4</span><br><span style="color: hsl(120, 100%, 40%);">+    $(AUTOTEST) -I '$(srcdir)' -o $@.tmp $@.at</span><br><span style="color: hsl(120, 100%, 40%);">+    mv $@.tmp $@</span><br><span>diff --git a/tests/atlocal.in b/tests/atlocal.in</span><br><span>new file mode 100644</span><br><span>index 0000000..e69de29</span><br><span>--- /dev/null</span><br><span>+++ b/tests/atlocal.in</span><br><span>diff --git a/tests/ctrl_test_runner.py b/tests/ctrl_test_runner.py</span><br><span>new file mode 100755</span><br><span>index 0000000..8908a65</span><br><span>--- /dev/null</span><br><span>+++ b/tests/ctrl_test_runner.py</span><br><span>@@ -0,0 +1,215 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env python3</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 2013 by Jacob Erlbeck <jerlbeck@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 2014 by Holger Hans Peter Freyther</span><br><span style="color: hsl(120, 100%, 40%);">+# based on vty_test_runner.py:</span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 2013 by Katerina Barone-Adesi <kat.obsc@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 2013 by Holger Hans Peter Freyther</span><br><span style="color: hsl(120, 100%, 40%);">+# based on bsc_control.py.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+# the Free Software Foundation, either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+# (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import os</span><br><span style="color: hsl(120, 100%, 40%);">+import time</span><br><span style="color: hsl(120, 100%, 40%);">+import unittest</span><br><span style="color: hsl(120, 100%, 40%);">+import socket</span><br><span style="color: hsl(120, 100%, 40%);">+import sys</span><br><span style="color: hsl(120, 100%, 40%);">+import struct</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import osmopy.obscvty as obscvty</span><br><span style="color: hsl(120, 100%, 40%);">+import osmopy.osmoutil as osmoutil</span><br><span style="color: hsl(120, 100%, 40%);">+from osmopy.osmo_ipa import Ctrl, IPA</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# to be able to find $top_srcdir/doc/...</span><br><span style="color: hsl(120, 100%, 40%);">+confpath = os.path.join(sys.path[0], '..')</span><br><span style="color: hsl(120, 100%, 40%);">+verbose = False</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class TestCtrlBase(unittest.TestCase):</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def ctrl_command(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        raise Exception("Needs to be implemented by a subclass")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def ctrl_app(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        raise Exception("Needs to be implemented by a subclass")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def setUp(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_ctrl_cmd = self.ctrl_command()[:]</span><br><span style="color: hsl(120, 100%, 40%);">+        config_index = osmo_ctrl_cmd.index('-c')</span><br><span style="color: hsl(120, 100%, 40%);">+        if config_index:</span><br><span style="color: hsl(120, 100%, 40%);">+            cfi = config_index + 1</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_ctrl_cmd[cfi] = os.path.join(confpath, osmo_ctrl_cmd[cfi])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        try:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.proc = osmoutil.popen_devnull(osmo_ctrl_cmd)</span><br><span style="color: hsl(120, 100%, 40%);">+        except OSError:</span><br><span style="color: hsl(120, 100%, 40%);">+            print("Current directory: %s" % os.getcwd(), file=sys.stderr)</span><br><span style="color: hsl(120, 100%, 40%);">+            print("Consider setting -b", file=sys.stderr)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        appstring = self.ctrl_app()[2]</span><br><span style="color: hsl(120, 100%, 40%);">+        appport = self.ctrl_app()[0]</span><br><span style="color: hsl(120, 100%, 40%);">+        self.connect("127.0.0.1", appport)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.next_id = 1000</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def tearDown(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.disconnect()</span><br><span style="color: hsl(120, 100%, 40%);">+        osmoutil.end_proc(self.proc)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def disconnect(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        if not (self.sock is None):</span><br><span style="color: hsl(120, 100%, 40%);">+            self.sock.close()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def connect(self, host, port):</span><br><span style="color: hsl(120, 100%, 40%);">+        if verbose:</span><br><span style="color: hsl(120, 100%, 40%);">+            print("Connecting to host %s:%i" % (host, port))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        retries = 30</span><br><span style="color: hsl(120, 100%, 40%);">+        while True:</span><br><span style="color: hsl(120, 100%, 40%);">+            try:</span><br><span style="color: hsl(120, 100%, 40%);">+                sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)</span><br><span style="color: hsl(120, 100%, 40%);">+                sck.setblocking(1)</span><br><span style="color: hsl(120, 100%, 40%);">+                sck.connect((host, port))</span><br><span style="color: hsl(120, 100%, 40%);">+            except IOError:</span><br><span style="color: hsl(120, 100%, 40%);">+                retries -= 1</span><br><span style="color: hsl(120, 100%, 40%);">+                if retries <= 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                    raise</span><br><span style="color: hsl(120, 100%, 40%);">+                time.sleep(.1)</span><br><span style="color: hsl(120, 100%, 40%);">+                continue</span><br><span style="color: hsl(120, 100%, 40%);">+            break</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sock = sck</span><br><span style="color: hsl(120, 100%, 40%);">+        return sck</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def send(self, data):</span><br><span style="color: hsl(120, 100%, 40%);">+        if verbose:</span><br><span style="color: hsl(120, 100%, 40%);">+            print("Sending \"%s\"" %(data))</span><br><span style="color: hsl(120, 100%, 40%);">+        data = Ctrl().add_header(data)</span><br><span style="color: hsl(120, 100%, 40%);">+        return self.sock.send(data) == len(data)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def send_set(self, var, value, id):</span><br><span style="color: hsl(120, 100%, 40%);">+        setmsg = "SET %s %s %s" %(id, var, value)</span><br><span style="color: hsl(120, 100%, 40%);">+        return self.send(setmsg)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def send_get(self, var, id):</span><br><span style="color: hsl(120, 100%, 40%);">+        getmsg = "GET %s %s" %(id, var)</span><br><span style="color: hsl(120, 100%, 40%);">+        return self.send(getmsg)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def do_set(self, var, value):</span><br><span style="color: hsl(120, 100%, 40%);">+        id = self.next_id</span><br><span style="color: hsl(120, 100%, 40%);">+        self.next_id += 1</span><br><span style="color: hsl(120, 100%, 40%);">+        self.send_set(var, value, id)</span><br><span style="color: hsl(120, 100%, 40%);">+        return self.recv_msgs()[id]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def do_get(self, var):</span><br><span style="color: hsl(120, 100%, 40%);">+        id = self.next_id</span><br><span style="color: hsl(120, 100%, 40%);">+        self.next_id += 1</span><br><span style="color: hsl(120, 100%, 40%);">+        self.send_get(var, id)</span><br><span style="color: hsl(120, 100%, 40%);">+        return self.recv_msgs()[id]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def recv_msgs(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        responses = {}</span><br><span style="color: hsl(120, 100%, 40%);">+        data = self.sock.recv(4096)</span><br><span style="color: hsl(120, 100%, 40%);">+        while (len(data)>0):</span><br><span style="color: hsl(120, 100%, 40%);">+            (head, data) = IPA().split_combined(data)</span><br><span style="color: hsl(120, 100%, 40%);">+            answer = Ctrl().rem_header(head).decode()</span><br><span style="color: hsl(120, 100%, 40%);">+            if verbose:</span><br><span style="color: hsl(120, 100%, 40%);">+                print("Got message:", answer)</span><br><span style="color: hsl(120, 100%, 40%);">+            (mtype, id, msg) = answer.split(None, 2)</span><br><span style="color: hsl(120, 100%, 40%);">+            id = int(id)</span><br><span style="color: hsl(120, 100%, 40%);">+            rsp = {'mtype': mtype, 'id': id}</span><br><span style="color: hsl(120, 100%, 40%);">+            if mtype == "ERROR":</span><br><span style="color: hsl(120, 100%, 40%);">+                rsp['error'] = msg</span><br><span style="color: hsl(120, 100%, 40%);">+            else:</span><br><span style="color: hsl(120, 100%, 40%);">+                split = msg.split(None, 1)</span><br><span style="color: hsl(120, 100%, 40%);">+                rsp['var'] = split[0]</span><br><span style="color: hsl(120, 100%, 40%);">+                if len(split) > 1:</span><br><span style="color: hsl(120, 100%, 40%);">+                    rsp['value'] = split[1]</span><br><span style="color: hsl(120, 100%, 40%);">+                else:</span><br><span style="color: hsl(120, 100%, 40%);">+                    rsp['value'] = None</span><br><span style="color: hsl(120, 100%, 40%);">+            responses[id] = rsp</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if verbose:</span><br><span style="color: hsl(120, 100%, 40%);">+            print("Decoded replies: ", responses)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return responses</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class TestCtrlHNB(TestCtrlBase):</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def tearDown(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        TestCtrlBase.tearDown(self)</span><br><span style="color: hsl(120, 100%, 40%);">+        os.unlink("tmp_dummy_sock")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def ctrl_command(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return ["./src/osmo-hnodeb/osmo-hnodeb", "-r", "tmp_dummy_sock", "-c",</span><br><span style="color: hsl(120, 100%, 40%);">+                "doc/examples/osmo-hnodeb/osmo-hnodeb.cfg"]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def ctrl_app(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return (4249, "./src/osmo-hnodeb/osmo-hnodeb", "OsmoHNodeB", "hnb")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def testCtrlErrs(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        r = self.do_get('invalid')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(r['mtype'], 'ERROR')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(r['error'], 'Command not found')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        r = self.do_set('rf_locked', '999')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(r['mtype'], 'ERROR')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(r['error'], 'Value failed verification.')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        r = self.do_get('bts')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(r['mtype'], 'ERROR')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(r['error'], 'Error while parsing the index.')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        r = self.do_get('bts.999')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(r['mtype'], 'ERROR')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(r['error'], 'Error while resolving object')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def add_hnodeb_test(suite, workdir, klass):</span><br><span style="color: hsl(120, 100%, 40%);">+    if not os.path.isfile(os.path.join(workdir, "src/osmo-hnodeb/osmo-hnodeb")):</span><br><span style="color: hsl(120, 100%, 40%);">+        print("Skipping the hNodeB test")</span><br><span style="color: hsl(120, 100%, 40%);">+        return</span><br><span style="color: hsl(120, 100%, 40%);">+    test = unittest.TestLoader().loadTestsFromTestCase(klass)</span><br><span style="color: hsl(120, 100%, 40%);">+    suite.addTest(test)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if __name__ == '__main__':</span><br><span style="color: hsl(120, 100%, 40%);">+    import argparse</span><br><span style="color: hsl(120, 100%, 40%);">+    import sys</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    workdir = '.'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    parser = argparse.ArgumentParser()</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_argument("-v", "--verbose", dest="verbose",</span><br><span style="color: hsl(120, 100%, 40%);">+                        action="store_true", help="verbose mode")</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_argument("-p", "--pythonconfpath", dest="p",</span><br><span style="color: hsl(120, 100%, 40%);">+                        help="searchpath for config")</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_argument("-w", "--workdir", dest="w",</span><br><span style="color: hsl(120, 100%, 40%);">+                        help="Working directory")</span><br><span style="color: hsl(120, 100%, 40%);">+    args = parser.parse_args()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    verbose_level = 1</span><br><span style="color: hsl(120, 100%, 40%);">+    if args.verbose:</span><br><span style="color: hsl(120, 100%, 40%);">+        verbose_level = 2</span><br><span style="color: hsl(120, 100%, 40%);">+        verbose = True</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if args.w:</span><br><span style="color: hsl(120, 100%, 40%);">+        workdir = args.w</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if args.p:</span><br><span style="color: hsl(120, 100%, 40%);">+        confpath = args.p</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    print("confpath %s, workdir %s" % (confpath, workdir))</span><br><span style="color: hsl(120, 100%, 40%);">+    os.chdir(workdir)</span><br><span style="color: hsl(120, 100%, 40%);">+    print("Running tests for specific control commands")</span><br><span style="color: hsl(120, 100%, 40%);">+    suite = unittest.TestSuite()</span><br><span style="color: hsl(120, 100%, 40%);">+    add_hnodeb_test(suite, workdir, TestCtrlHNB)</span><br><span style="color: hsl(120, 100%, 40%);">+    res = unittest.TextTestRunner(verbosity=verbose_level).run(suite)</span><br><span style="color: hsl(120, 100%, 40%);">+    sys.exit(len(res.errors) + len(res.failures))</span><br><span>diff --git a/tests/osmo-hnodeb.vty b/tests/osmo-hnodeb.vty</span><br><span>new file mode 100644</span><br><span>index 0000000..3791bf9</span><br><span>--- /dev/null</span><br><span>+++ b/tests/osmo-hnodeb.vty</span><br><span>@@ -0,0 +1,2 @@</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHNodeB> enable</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/testsuite.at b/tests/testsuite.at</span><br><span>new file mode 100644</span><br><span>index 0000000..65d1ca0</span><br><span>--- /dev/null</span><br><span>+++ b/tests/testsuite.at</span><br><span>@@ -0,0 +1,8 @@</span><br><span style="color: hsl(120, 100%, 40%);">+AT_INIT</span><br><span style="color: hsl(120, 100%, 40%);">+AT_BANNER([Regression tests.])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#AT_SETUP([foobar])</span><br><span style="color: hsl(120, 100%, 40%);">+#AT_KEYWORDS([foobar])</span><br><span style="color: hsl(120, 100%, 40%);">+#cat $abs_srcdir/foobar/foobar_test.ok > expout</span><br><span style="color: hsl(120, 100%, 40%);">+#AT_CHECK([$abs_top_builddir/tests/foobar/foobar_test], [], [expout], [ignore])</span><br><span style="color: hsl(120, 100%, 40%);">+#AT_CLEANUP</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-hnodeb/+/25874">change 25874</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-hnodeb/+/25874"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-hnodeb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I6ae3215ae4b956689d2adc88db7c3ead5df14f37 </div>
<div style="display:none"> Gerrit-Change-Number: 25874 </div>
<div style="display:none"> Gerrit-PatchSet: 15 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>