summaryrefslogtreecommitdiffhomepage
path: root/docs/api
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2019-11-05 10:27:59 +0100
committerJo-Philipp Wich <jo@mein.io>2019-11-05 10:42:54 +0100
commitbaa727de93db009f90d70a80a9861758a24eae77 (patch)
treefd91ac853abc2feef5496720e5284e911ad1b020 /docs/api
parent355a48866d1a43df9443a3b559c8ec8642343f3a (diff)
docs: rename documentation folder to docs
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'docs/api')
-rw-r--r--docs/api/index.html426
-rw-r--r--docs/api/luadoc.css285
-rw-r--r--docs/api/modules/luci.dispatcher.html1145
-rw-r--r--docs/api/modules/luci.http.conditionals.html552
-rw-r--r--docs/api/modules/luci.http.date.html406
-rw-r--r--docs/api/modules/luci.http.html1267
-rw-r--r--docs/api/modules/luci.http.mime.html322
-rw-r--r--docs/api/modules/luci.i18n.html391
-rw-r--r--docs/api/modules/luci.ip.cidr.html1511
-rw-r--r--docs/api/modules/luci.ip.html1217
-rw-r--r--docs/api/modules/luci.json.html594
-rw-r--r--docs/api/modules/luci.jsonc.html393
-rw-r--r--docs/api/modules/luci.jsonc.parser.html491
-rw-r--r--docs/api/modules/luci.model.ipkg.html730
-rw-r--r--docs/api/modules/luci.model.uci.html1631
-rw-r--r--docs/api/modules/luci.rpcc.html324
-rw-r--r--docs/api/modules/luci.rpcc.ruci.html277
-rw-r--r--docs/api/modules/luci.sys.html641
-rw-r--r--docs/api/modules/luci.sys.init.html512
-rw-r--r--docs/api/modules/luci.sys.iptparser.html462
-rw-r--r--docs/api/modules/luci.sys.net.html597
-rw-r--r--docs/api/modules/luci.sys.process.html519
-rw-r--r--docs/api/modules/luci.sys.user.html412
-rw-r--r--docs/api/modules/luci.sys.wifi.html280
-rw-r--r--docs/api/modules/luci.util.html1830
-rw-r--r--docs/api/modules/nixio.CHANGELOG.html286
-rw-r--r--docs/api/modules/nixio.CryptoHash.html312
-rw-r--r--docs/api/modules/nixio.File.html669
-rw-r--r--docs/api/modules/nixio.README.html370
-rw-r--r--docs/api/modules/nixio.Socket.html1029
-rw-r--r--docs/api/modules/nixio.TLSContext.html475
-rw-r--r--docs/api/modules/nixio.TLSSocket.html571
-rw-r--r--docs/api/modules/nixio.UnifiedIO.html763
-rw-r--r--docs/api/modules/nixio.bin.html423
-rw-r--r--docs/api/modules/nixio.bit.html740
-rw-r--r--docs/api/modules/nixio.crypto.html315
-rw-r--r--docs/api/modules/nixio.fs.html1558
-rw-r--r--docs/api/modules/nixio.html2401
38 files changed, 27127 insertions, 0 deletions
diff --git a/docs/api/index.html b/docs/api/index.html
new file mode 100644
index 000000000..5e3f3c211
--- /dev/null
+++ b/docs/api/index.html
@@ -0,0 +1,426 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><strong>Index</strong></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+</div> <!-- id="navigation" -->
+
+<div id="content">
+
+
+
+<h2>Modules</h2>
+<table class="module_list">
+<!--<tr><td colspan="2">Modules</td></tr>-->
+
+ <tr>
+ <td class="name"><a href="modules/luci.dispatcher.html">luci.dispatcher</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.http.html">luci.http</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.http.conditionals.html">luci.http.conditionals</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.http.date.html">luci.http.date</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.http.mime.html">luci.http.mime</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.i18n.html">luci.i18n</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.ip.html">luci.ip</a></td>
+ <td class="summary">
+ LuCI IP calculation and netlink access library.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.ip.cidr.html">luci.ip.cidr</a></td>
+ <td class="summary">
+ IP CIDR Object.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.json.html">luci.json</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.jsonc.html">luci.jsonc</a></td>
+ <td class="summary">
+ LuCI JSON parsing and serialization library.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.jsonc.parser.html">luci.jsonc.parser</a></td>
+ <td class="summary">
+ LuCI JSON parser instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.model.ipkg.html">luci.model.ipkg</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.model.uci.html">luci.model.uci</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.rpcc.html">luci.rpcc</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.sys.html">luci.sys</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.sys.init.html">luci.sys.init</a></td>
+ <td class="summary">
+
+LuCI system utilities / init related functions.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.sys.iptparser.html">luci.sys.iptparser</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.sys.net.html">luci.sys.net</a></td>
+ <td class="summary">
+
+LuCI system utilities / network related functions.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.sys.process.html">luci.sys.process</a></td>
+ <td class="summary">
+
+LuCI system utilities / process related functions.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.sys.user.html">luci.sys.user</a></td>
+ <td class="summary">
+
+LuCI system utilities / user related functions.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.sys.wifi.html">luci.sys.wifi</a></td>
+ <td class="summary">
+
+LuCI system utilities / wifi related functions.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/luci.util.html">luci.util</a></td>
+ <td class="summary"></td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.html">nixio</a></td>
+ <td class="summary">
+ General POSIX IO library.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a></td>
+ <td class="summary">
+ Changes and improvements.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.CryptoHash.html">nixio.CryptoHash</a></td>
+ <td class="summary">
+ Cryptographical Hash and HMAC object.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.File.html">nixio.File</a></td>
+ <td class="summary">
+ Large File Object.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.README.html">nixio.README</a></td>
+ <td class="summary">
+ General Information.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.Socket.html">nixio.Socket</a></td>
+ <td class="summary">
+ Socket Object.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.TLSContext.html">nixio.TLSContext</a></td>
+ <td class="summary">
+ Transport Layer Security Context Object.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.TLSSocket.html">nixio.TLSSocket</a></td>
+ <td class="summary">
+ TLS Socket Object.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a></td>
+ <td class="summary">
+ Unified high-level I/O utility API for Files, Sockets and TLS-Sockets.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.bin.html">nixio.bin</a></td>
+ <td class="summary">
+ Binary operations and conversion.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.bit.html">nixio.bit</a></td>
+ <td class="summary">
+ Bitfield operators and mainpulation functions.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.crypto.html">nixio.crypto</a></td>
+ <td class="summary">
+ Cryptographical library.</td>
+ </tr>
+
+ <tr>
+ <td class="name"><a href="modules/nixio.fs.html">nixio.fs</a></td>
+ <td class="summary">
+ Low-level and high-level filesystem manipulation library.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/luadoc.css b/docs/api/luadoc.css
new file mode 100644
index 000000000..f9f974951
--- /dev/null
+++ b/docs/api/luadoc.css
@@ -0,0 +1,285 @@
+body {
+ margin-left: 1em;
+ margin-right: 1em;
+ font-family: arial, helvetica, geneva, sans-serif;
+ background-color:#ffffff; margin:0px;
+}
+
+code {
+ font-family: "Andale Mono", monospace;
+}
+
+tt {
+ font-family: "Andale Mono", monospace;
+}
+
+body, td, th { font-size: 11pt; }
+
+h1, h2, h3, h4 { margin-left: 0em; }
+
+textarea, pre, tt { font-size:10pt; }
+body, td, th { color:#000000; }
+small { font-size:0.85em; }
+h1 { font-size:1.5em; }
+h2 { font-size:1.25em; }
+h3 { font-size:1.15em; }
+h4 { font-size:1.06em; }
+
+a:link { font-weight:bold; color: #004080; text-decoration: none; }
+a:visited { font-weight:bold; color: #006699; text-decoration: none; }
+a:link:hover { text-decoration:underline; }
+hr { color:#cccccc }
+img { border-width: 0px; }
+
+
+h3 { padding: 1em 0 0.5em; }
+
+p { margin-left: 1em; }
+
+p.name {
+ font-family: "Andale Mono", monospace;
+ padding-top: 1em;
+ margin-left: 0em;
+}
+
+blockquote { margin-left: 3em; }
+
+pre.example {
+ background-color: rgb(245, 245, 245);
+ border-top-width: 1px;
+ border-right-width: 1px;
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+ border-top-style: solid;
+ border-right-style: solid;
+ border-bottom-style: solid;
+ border-left-style: solid;
+ border-top-color: silver;
+ border-right-color: silver;
+ border-bottom-color: silver;
+ border-left-color: silver;
+ padding: 1em;
+ margin-left: 1em;
+ margin-right: 1em;
+ font-family: "Andale Mono", monospace;
+ font-size: smaller;
+}
+
+
+hr {
+ margin-left: 0em;
+ background: #00007f;
+ border: 0px;
+ height: 1px;
+}
+
+ul { list-style-type: disc; }
+
+table.index { border: 1px #00007f; }
+table.index td { text-align: left; vertical-align: top; }
+table.index ul { padding-top: 0em; margin-top: 0em; }
+
+table {
+ border: 1px solid black;
+ border-collapse: collapse;
+ margin: 1em auto;
+}
+th {
+ border: 1px solid black;
+ padding: 0.5em;
+}
+td {
+ border: 1px solid black;
+ padding: 0.5em;
+}
+div.header, div.footer { margin-left: 0em; }
+
+#container
+{
+ margin-left: 1em;
+ margin-right: 1em;
+ background-color: #f0f0f0;
+}
+
+#product
+{
+ text-align: center;
+ border-bottom: 1px solid #cccccc;
+ background-color: #ffffff;
+}
+
+#product big {
+ font-size: 2em;
+}
+
+#product_logo
+{
+}
+
+#product_name
+{
+}
+
+#product_description
+{
+}
+
+#main
+{
+ background-color: #f0f0f0;
+ border-left: 2px solid #cccccc;
+}
+
+#navigation
+{
+ float: left;
+ width: 18em;
+ margin: 0;
+ vertical-align: top;
+ background-color: #f0f0f0;
+ overflow:visible;
+}
+
+#navigation h1 {
+ background-color:#e7e7e7;
+ font-size:1.1em;
+ color:#000000;
+ text-align:left;
+ margin:0px;
+ padding:0.2em;
+ border-top:1px solid #dddddd;
+ border-bottom:1px solid #dddddd;
+}
+
+#navigation ul
+{
+ font-size:1em;
+ list-style-type: none;
+ padding: 0;
+ margin: 1px;
+}
+
+#navigation li
+{
+ text-indent: -1em;
+ margin: 0em 0em 0em 0.5em;
+ display: block;
+ padding: 3px 0px 0px 12px;
+}
+
+#navigation li li a
+{
+ padding: 0px 3px 0px -1em;
+}
+
+#content
+{
+ margin-left: 18em;
+ padding: 1em;
+ border-left: 2px solid #cccccc;
+ border-right: 2px solid #cccccc;
+ background-color: #ffffff;
+}
+
+#about
+{
+ clear: both;
+ margin: 0;
+ padding: 5px;
+ border-top: 2px solid #cccccc;
+ background-color: #ffffff;
+}
+
+@media print {
+ body {
+ font: 12pt "Times New Roman", "TimeNR", Times, serif;
+ }
+ a { font-weight:bold; color: #004080; text-decoration: underline; }
+
+ #main { background-color: #ffffff; border-left: 0px; }
+ #container { margin-left: 2%; margin-right: 2%; background-color: #ffffff; }
+
+ #content { margin-left: 0px; padding: 1em; border-left: 0px; border-right: 0px; background-color: #ffffff; }
+
+ #navigation { display: none;
+ }
+ pre.example {
+ font-family: "Andale Mono", monospace;
+ font-size: 10pt;
+ page-break-inside: avoid;
+ }
+}
+
+table.module_list td
+{
+ border-width: 1px;
+ padding: 3px;
+ border-style: solid;
+ border-color: #cccccc;
+}
+table.module_list td.name { background-color: #f0f0f0; }
+table.module_list td.summary { width: 100%; }
+
+table.file_list
+{
+ border-width: 1px;
+ border-style: solid;
+ border-color: #cccccc;
+ border-collapse: collapse;
+}
+table.file_list td
+{
+ border-width: 1px;
+ padding: 3px;
+ border-style: solid;
+ border-color: #cccccc;
+}
+table.file_list td.name { background-color: #f0f0f0; }
+table.file_list td.summary { width: 100%; }
+
+
+table.function_list
+{
+ border-width: 1px;
+ border-style: solid;
+ border-color: #cccccc;
+ border-collapse: collapse;
+}
+table.function_list td
+{
+ border-width: 1px;
+ padding: 3px;
+ border-style: solid;
+ border-color: #cccccc;
+}
+table.function_list td.name { background-color: #f0f0f0; }
+table.function_list td.summary { width: 100%; }
+
+
+table.table_list
+{
+ border-width: 1px;
+ border-style: solid;
+ border-color: #cccccc;
+ border-collapse: collapse;
+}
+table.table_list td
+{
+ border-width: 1px;
+ padding: 3px;
+ border-style: solid;
+ border-color: #cccccc;
+}
+table.table_list td.name { background-color: #f0f0f0; }
+table.table_list td.summary { width: 100%; }
+
+dl.function dt {border-top: 1px solid #ccc; padding-top: 1em;}
+dl.function dd {padding: 0.5em 0;}
+dl.function h3 {margin: 0; font-size: medium;}
+
+dl.table dt {border-top: 1px solid #ccc; padding-top: 1em;}
+dl.table dd {padding-bottom: 1em;}
+dl.table h3 {padding: 0; margin: 0; font-size: medium;}
+
+#TODO: make module_list, file_list, function_list, table_list inherit from a list
+
diff --git a/docs/api/modules/luci.dispatcher.html b/docs/api/modules/luci.dispatcher.html
new file mode 100644
index 000000000..ea33a5c70
--- /dev/null
+++ b/docs/api/modules/luci.dispatcher.html
@@ -0,0 +1,1145 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li><strong>luci.dispatcher</strong></li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.dispatcher</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#_">_</a>&nbsp;()</td>
+ <td class="summary">
+
+No-op function used to mark translation entries for menu labels.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#alias">alias</a>&nbsp;(...)</td>
+ <td class="summary">
+
+Create a redirect to another dispatching node.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#arcombine">arcombine</a>&nbsp;(trg1, trg2)</td>
+ <td class="summary">
+
+Create a combined dispatching target for non argv and argv requests.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#assign">assign</a>&nbsp;(path, clone, title, order)</td>
+ <td class="summary">
+
+Clone a node of the dispatching tree to another position.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#build_url">build_url</a>&nbsp;(...)</td>
+ <td class="summary">
+
+Build the URL relative to the server webroot from given virtual path.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#call">call</a>&nbsp;(name, ...)</td>
+ <td class="summary">
+
+Create a function-call dispatching target.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cbi">cbi</a>&nbsp;(model)</td>
+ <td class="summary">
+
+Create a CBI model dispatching target.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#createindex">createindex</a>&nbsp;()</td>
+ <td class="summary">
+
+Generate the dispatching index using the native file-cache based strategy.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#createtree">createtree</a>&nbsp;()</td>
+ <td class="summary">
+
+Create the dispatching tree from the index.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#dispatch">dispatch</a>&nbsp;(request)</td>
+ <td class="summary">
+
+Dispatches a LuCI virtual path.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#entry">entry</a>&nbsp;(path, target, title, order)</td>
+ <td class="summary">
+
+Create a new dispatching node and define common parameters.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#error404">error404</a>&nbsp;(message)</td>
+ <td class="summary">
+
+Send a 404 error code and render the "error404" template if available.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#error500">error500</a>&nbsp;(message)</td>
+ <td class="summary">
+
+Send a 500 error code and render the "error500" template if available.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#firstchild">firstchild</a>&nbsp;()</td>
+ <td class="summary">
+
+Alias the first (lowest order) page automatically
+
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#form">form</a>&nbsp;(model)</td>
+ <td class="summary">
+
+Create a CBI form model dispatching target.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#get">get</a>&nbsp;(...)</td>
+ <td class="summary">
+
+Fetch or create a dispatching node without setting the target module or
+enabling the node.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#httpdispatch">httpdispatch</a>&nbsp;(request)</td>
+ <td class="summary">
+
+Dispatch an HTTP request.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#lookup">lookup</a>&nbsp;(...)</td>
+ <td class="summary">
+
+Lookup node in dispatching tree.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#node">node</a>&nbsp;(...)</td>
+ <td class="summary">
+
+Fetch or create a new dispatching node.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#node_childs">node_childs</a>&nbsp;(node)</td>
+ <td class="summary">
+
+Return a sorted table of visible children within a given node
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#node_visible">node_visible</a>&nbsp;(node)</td>
+ <td class="summary">
+
+Check whether a dispatch node shall be visible
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#rewrite">rewrite</a>&nbsp;(n, ...)</td>
+ <td class="summary">
+
+Rewrite the first x path values of the request.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#template">template</a>&nbsp;(name)</td>
+ <td class="summary">
+
+Create a template render dispatching target.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#translate">translate</a>&nbsp;(text)</td>
+ <td class="summary">
+
+Access the luci.i18n translate() api.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="_"></a><strong>_</strong>&nbsp;()</dt>
+<dd>
+
+
+No-op function used to mark translation entries for menu labels.
+
+This function does not actually translate the given argument but
+is used by build/i18n-scan.pl to find translatable entries.
+
+
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="alias"></a><strong>alias</strong>&nbsp;(...)</dt>
+<dd>
+
+
+Create a redirect to another dispatching node.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ...: Virtual path destination
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="arcombine"></a><strong>arcombine</strong>&nbsp;(trg1, trg2)</dt>
+<dd>
+
+
+Create a combined dispatching target for non argv and argv requests.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ trg1: Overview Target
+ </li>
+
+ <li>
+ trg2: Detail Target
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="assign"></a><strong>assign</strong>&nbsp;(path, clone, title, order)</dt>
+<dd>
+
+
+Clone a node of the dispatching tree to another position.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Virtual path destination
+ </li>
+
+ <li>
+ clone: Virtual path source
+ </li>
+
+ <li>
+ title: Destination node title (optional)
+ </li>
+
+ <li>
+ order: Destination node order value (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Dispatching tree node
+
+
+
+</dd>
+
+
+
+
+<dt><a name="build_url"></a><strong>build_url</strong>&nbsp;(...)</dt>
+<dd>
+
+
+Build the URL relative to the server webroot from given virtual path.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ...: Virtual path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Relative URL
+
+
+
+</dd>
+
+
+
+
+<dt><a name="call"></a><strong>call</strong>&nbsp;(name, ...)</dt>
+<dd>
+
+
+Create a function-call dispatching target.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Target function of local controller
+ </li>
+
+ <li>
+ ...: Additional parameters passed to the function
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cbi"></a><strong>cbi</strong>&nbsp;(model)</dt>
+<dd>
+
+
+Create a CBI model dispatching target.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ model: CBI model to be rendered
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="createindex"></a><strong>createindex</strong>&nbsp;()</dt>
+<dd>
+
+
+Generate the dispatching index using the native file-cache based strategy.
+
+
+
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="createtree"></a><strong>createtree</strong>&nbsp;()</dt>
+<dd>
+
+
+Create the dispatching tree from the index.
+
+Build the index before if it does not exist yet.
+
+
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="dispatch"></a><strong>dispatch</strong>&nbsp;(request)</dt>
+<dd>
+
+
+Dispatches a LuCI virtual path.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ request: Virtual path
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="entry"></a><strong>entry</strong>&nbsp;(path, target, title, order)</dt>
+<dd>
+
+
+Create a new dispatching node and define common parameters.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Virtual path
+ </li>
+
+ <li>
+ target: Target function to call when dispatched.
+ </li>
+
+ <li>
+ title: Destination node title
+ </li>
+
+ <li>
+ order: Destination node order value (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Dispatching tree node
+
+
+
+</dd>
+
+
+
+
+<dt><a name="error404"></a><strong>error404</strong>&nbsp;(message)</dt>
+<dd>
+
+
+Send a 404 error code and render the "error404" template if available.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ message: Custom error message (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+false
+
+
+
+</dd>
+
+
+
+
+<dt><a name="error500"></a><strong>error500</strong>&nbsp;(message)</dt>
+<dd>
+
+
+Send a 500 error code and render the "error500" template if available.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ message: Custom error message (optional)#
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+false
+
+
+
+</dd>
+
+
+
+
+<dt><a name="firstchild"></a><strong>firstchild</strong>&nbsp;()</dt>
+<dd>
+
+
+Alias the first (lowest order) page automatically
+
+
+
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="form"></a><strong>form</strong>&nbsp;(model)</dt>
+<dd>
+
+
+Create a CBI form model dispatching target.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ model: CBI form model tpo be rendered
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="get"></a><strong>get</strong>&nbsp;(...)</dt>
+<dd>
+
+
+Fetch or create a dispatching node without setting the target module or
+enabling the node.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ...: Virtual path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Dispatching tree node
+
+
+
+</dd>
+
+
+
+
+<dt><a name="httpdispatch"></a><strong>httpdispatch</strong>&nbsp;(request)</dt>
+<dd>
+
+
+Dispatch an HTTP request.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ request: LuCI HTTP Request object
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="lookup"></a><strong>lookup</strong>&nbsp;(...)</dt>
+<dd>
+
+
+Lookup node in dispatching tree.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ...: Virtual path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Node object, canonical url or nil if the path was not found.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="node"></a><strong>node</strong>&nbsp;(...)</dt>
+<dd>
+
+
+Fetch or create a new dispatching node.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ...: Virtual path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Dispatching tree node
+
+
+
+</dd>
+
+
+
+
+<dt><a name="node_childs"></a><strong>node_childs</strong>&nbsp;(node)</dt>
+<dd>
+
+
+Return a sorted table of visible children within a given node
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ node: Dispatch node
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Ordered table of child node names
+
+
+
+</dd>
+
+
+
+
+<dt><a name="node_visible"></a><strong>node_visible</strong>&nbsp;(node)</dt>
+<dd>
+
+
+Check whether a dispatch node shall be visible
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ node: Dispatch node
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating whether the node should be visible
+
+
+
+</dd>
+
+
+
+
+<dt><a name="rewrite"></a><strong>rewrite</strong>&nbsp;(n, ...)</dt>
+<dd>
+
+
+Rewrite the first x path values of the request.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ n: Number of path values to replace
+ </li>
+
+ <li>
+ ...: Virtual path to replace removed path values with
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="template"></a><strong>template</strong>&nbsp;(name)</dt>
+<dd>
+
+
+Create a template render dispatching target.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Template to be rendered
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="translate"></a><strong>translate</strong>&nbsp;(text)</dt>
+<dd>
+
+
+Access the luci.i18n translate() api.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ text: Text to translate
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.http.conditionals.html b/docs/api/modules/luci.http.conditionals.html
new file mode 100644
index 000000000..8c940bd3f
--- /dev/null
+++ b/docs/api/modules/luci.http.conditionals.html
@@ -0,0 +1,552 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li><strong>luci.http.conditionals</strong></li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.http.conditionals</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#if_match">if_match</a>&nbsp;(req, stat)</td>
+ <td class="summary">
+
+14.24 / If-Match
+
+Test whether the given message object contains an "If-Match" header and
+compare it against the given stat object.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#if_modified_since">if_modified_since</a>&nbsp;(req, stat)</td>
+ <td class="summary">
+
+14.25 / If-Modified-Since
+
+Test whether the given message object contains an "If-Modified-Since" header
+and compare it against the given stat object.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#if_none_match">if_none_match</a>&nbsp;(req, stat)</td>
+ <td class="summary">
+
+14.26 / If-None-Match
+
+Test whether the given message object contains an "If-None-Match" header and
+compare it against the given stat object.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#if_range">if_range</a>&nbsp;(req, stat)</td>
+ <td class="summary">
+
+14.27 / If-Range
+
+The If-Range header is currently not implemented due to the lack of general
+byte range stuff in luci.http.protocol .</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#if_unmodified_since">if_unmodified_since</a>&nbsp;(req, stat)</td>
+ <td class="summary">
+
+14.28 / If-Unmodified-Since
+
+Test whether the given message object contains an "If-Unmodified-Since"
+header and compare it against the given stat object.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#mk_etag">mk_etag</a>&nbsp;(stat)</td>
+ <td class="summary">
+
+Implement 14.19 / ETag.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="if_match"></a><strong>if_match</strong>&nbsp;(req, stat)</dt>
+<dd>
+
+
+14.24 / If-Match
+
+Test whether the given message object contains an "If-Match" header and
+compare it against the given stat object.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ req: HTTP request message object
+ </li>
+
+ <li>
+ stat: A file.stat object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating whether the precondition is ok
+
+ <li>Alternative status code if the precondition failed
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="if_modified_since"></a><strong>if_modified_since</strong>&nbsp;(req, stat)</dt>
+<dd>
+
+
+14.25 / If-Modified-Since
+
+Test whether the given message object contains an "If-Modified-Since" header
+and compare it against the given stat object.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ req: HTTP request message object
+ </li>
+
+ <li>
+ stat: A file.stat object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating whether the precondition is ok
+
+ <li>Alternative status code if the precondition failed
+
+ <li>Table containing extra HTTP headers if the precondition failed
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="if_none_match"></a><strong>if_none_match</strong>&nbsp;(req, stat)</dt>
+<dd>
+
+
+14.26 / If-None-Match
+
+Test whether the given message object contains an "If-None-Match" header and
+compare it against the given stat object.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ req: HTTP request message object
+ </li>
+
+ <li>
+ stat: A file.stat object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating whether the precondition is ok
+
+ <li>Alternative status code if the precondition failed
+
+ <li>Table containing extra HTTP headers if the precondition failed
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="if_range"></a><strong>if_range</strong>&nbsp;(req, stat)</dt>
+<dd>
+
+
+14.27 / If-Range
+
+The If-Range header is currently not implemented due to the lack of general
+byte range stuff in luci.http.protocol . This function will always return
+false, 412 to indicate a failed precondition.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ req: HTTP request message object
+ </li>
+
+ <li>
+ stat: A file.stat object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating whether the precondition is ok
+
+ <li>Alternative status code if the precondition failed
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="if_unmodified_since"></a><strong>if_unmodified_since</strong>&nbsp;(req, stat)</dt>
+<dd>
+
+
+14.28 / If-Unmodified-Since
+
+Test whether the given message object contains an "If-Unmodified-Since"
+header and compare it against the given stat object.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ req: HTTP request message object
+ </li>
+
+ <li>
+ stat: A file.stat object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating whether the precondition is ok
+
+ <li>Alternative status code if the precondition failed
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="mk_etag"></a><strong>mk_etag</strong>&nbsp;(stat)</dt>
+<dd>
+
+
+Implement 14.19 / ETag.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ stat: A file.stat structure
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the generated tag suitable for ETag headers
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.http.date.html b/docs/api/modules/luci.http.date.html
new file mode 100644
index 000000000..1ec5beb8b
--- /dev/null
+++ b/docs/api/modules/luci.http.date.html
@@ -0,0 +1,406 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li><strong>luci.http.date</strong></li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.http.date</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#compare">compare</a>&nbsp;(d1, d2)</td>
+ <td class="summary">
+
+Compare two dates which can either be unix epoch times or HTTP date strings.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#to_http">to_http</a>&nbsp;(time)</td>
+ <td class="summary">
+
+Convert the given unix epoch time to valid HTTP date string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#to_unix">to_unix</a>&nbsp;(data)</td>
+ <td class="summary">
+
+Parse given HTTP date string and convert it to unix epoch time.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#tz_offset">tz_offset</a>&nbsp;(tz)</td>
+ <td class="summary">
+
+Return the time offset in seconds between the UTC and given time zone.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="compare"></a><strong>compare</strong>&nbsp;(d1, d2)</dt>
+<dd>
+
+
+Compare two dates which can either be unix epoch times or HTTP date strings.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ d1: The first date or epoch time to compare
+ </li>
+
+ <li>
+ d2: The first date or epoch time to compare
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>-1 - if d1 is lower then d2
+
+ <li>0 - if both dates are equal
+
+ <li>1 - if d1 is higher then d2
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="to_http"></a><strong>to_http</strong>&nbsp;(time)</dt>
+<dd>
+
+
+Convert the given unix epoch time to valid HTTP date string.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ time: Unix epoch time
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the formatted date
+
+
+
+</dd>
+
+
+
+
+<dt><a name="to_unix"></a><strong>to_unix</strong>&nbsp;(data)</dt>
+<dd>
+
+
+Parse given HTTP date string and convert it to unix epoch time.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ data: String containing the date
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Unix epoch time
+
+
+
+</dd>
+
+
+
+
+<dt><a name="tz_offset"></a><strong>tz_offset</strong>&nbsp;(tz)</dt>
+<dd>
+
+
+Return the time offset in seconds between the UTC and given time zone.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ tz: Symbolic or numeric timezone specifier
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Time offset to UTC in seconds
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.http.html b/docs/api/modules/luci.http.html
new file mode 100644
index 000000000..473172784
--- /dev/null
+++ b/docs/api/modules/luci.http.html
@@ -0,0 +1,1267 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li><strong>luci.http</strong></li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.http</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#build_querystring">build_querystring</a>&nbsp;(table)</td>
+ <td class="summary">
+
+Create a querystring out of a table of key - value pairs.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#close">close</a>&nbsp;()</td>
+ <td class="summary">
+
+Close the HTTP-Connection.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#content">content</a>&nbsp;()</td>
+ <td class="summary">
+
+Return the request content if the request was of unknown type.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#formvalue">formvalue</a>&nbsp;(name, noparse)</td>
+ <td class="summary">
+
+Get a certain HTTP input value or a table of all input values.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#formvaluetable">formvaluetable</a>&nbsp;(prefix)</td>
+ <td class="summary">
+
+Get a table of all HTTP input values with a certain prefix.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#getcookie">getcookie</a>&nbsp;(name)</td>
+ <td class="summary">
+
+Get the value of a certain HTTP-Cookie.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#getenv">getenv</a>&nbsp;(name)</td>
+ <td class="summary">
+
+Get the value of a certain HTTP environment variable
+or the environment table itself.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#header">header</a>&nbsp;(key, value)</td>
+ <td class="summary">
+
+Send a HTTP-Header.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#mimedecode_message_body">mimedecode_message_body</a>&nbsp;(src, msg, filecb)</td>
+ <td class="summary">
+
+Decode a mime encoded http message body with multipart/form-data Content-Type.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#parse_message_body">parse_message_body</a>&nbsp;(src, msg, filecb)</td>
+ <td class="summary">
+
+Try to extract and decode a http message body from the given ltn12 source.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#prepare_content">prepare_content</a>&nbsp;(mime)</td>
+ <td class="summary">
+
+Set the mime type of following content data.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#redirect">redirect</a>&nbsp;(url)</td>
+ <td class="summary">
+
+Redirects the client to a new URL and closes the connection.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#setfilehandler">setfilehandler</a>&nbsp;(callback)</td>
+ <td class="summary">
+
+Set a handler function for incoming user file uploads.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#source">source</a>&nbsp;()</td>
+ <td class="summary">
+
+Get the RAW HTTP input source
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#splice">splice</a>&nbsp;(fp, size)</td>
+ <td class="summary">
+
+Splice data from a filedescriptor to the client.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#status">status</a>&nbsp;(code, message)</td>
+ <td class="summary">
+
+Set the HTTP status code and status message.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#urldecode">urldecode</a>&nbsp;(str, no_plus)</td>
+ <td class="summary">
+
+Return the URL-decoded equivalent of a string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#urldecode_message_body">urldecode_message_body</a>&nbsp;(src, msg)</td>
+ <td class="summary">
+
+Decode an urlencoded http message body with application/x-www-urlencoded
+Content-Type.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#urldecode_params">urldecode_params</a>&nbsp;(url, tbl)</td>
+ <td class="summary">
+
+Extract and split urlencoded data pairs, separated bei either "&" or ";"
+from given url or string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#urlencode">urlencode</a>&nbsp;(str)</td>
+ <td class="summary">
+
+Return the URL-encoded equivalent of a string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#urlencode_params">urlencode_params</a>&nbsp;(tbl)</td>
+ <td class="summary">
+
+Encode each key-value-pair in given table to x-www-urlencoded format,
+separated by "&".</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#write">write</a>&nbsp;(content, src_err)</td>
+ <td class="summary">
+
+Send a chunk of content data to the client.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#write_json">write_json</a>&nbsp;(data)</td>
+ <td class="summary">
+
+Send the given data as JSON encoded string.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="build_querystring"></a><strong>build_querystring</strong>&nbsp;(table)</dt>
+<dd>
+
+
+Create a querystring out of a table of key - value pairs.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ table: Query string source table
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Encoded HTTP query string
+
+
+
+</dd>
+
+
+
+
+<dt><a name="close"></a><strong>close</strong>&nbsp;()</dt>
+<dd>
+
+
+Close the HTTP-Connection.
+
+
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="content"></a><strong>content</strong>&nbsp;()</dt>
+<dd>
+
+
+Return the request content if the request was of unknown type.
+
+
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>HTTP request body
+
+ <li>HTTP request body length
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="formvalue"></a><strong>formvalue</strong>&nbsp;(name, noparse)</dt>
+<dd>
+
+
+Get a certain HTTP input value or a table of all input values.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Name of the GET or POST variable to fetch
+ </li>
+
+ <li>
+ noparse: Don't parse POST data before getting the value
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+HTTP input value or table of all input value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="formvaluetable"></a><strong>formvaluetable</strong>&nbsp;(prefix)</dt>
+<dd>
+
+
+Get a table of all HTTP input values with a certain prefix.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ prefix: Prefix
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of all HTTP input values with given prefix
+
+
+
+</dd>
+
+
+
+
+<dt><a name="getcookie"></a><strong>getcookie</strong>&nbsp;(name)</dt>
+<dd>
+
+
+Get the value of a certain HTTP-Cookie.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Cookie Name
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing cookie data
+
+
+
+</dd>
+
+
+
+
+<dt><a name="getenv"></a><strong>getenv</strong>&nbsp;(name)</dt>
+<dd>
+
+
+Get the value of a certain HTTP environment variable
+or the environment table itself.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Environment variable
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+HTTP environment value or environment table
+
+
+
+</dd>
+
+
+
+
+<dt><a name="header"></a><strong>header</strong>&nbsp;(key, value)</dt>
+<dd>
+
+
+Send a HTTP-Header.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ key: Header key
+ </li>
+
+ <li>
+ value: Header value
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="mimedecode_message_body"></a><strong>mimedecode_message_body</strong>&nbsp;(src, msg, filecb)</dt>
+<dd>
+
+
+Decode a mime encoded http message body with multipart/form-data Content-Type.
+
+Stores all extracted data associated with its parameter name
+in the params table within the given message object. Multiple parameter
+values are stored as tables, ordinary ones as strings.
+
+If an optional file callback function is given then it is fed with the
+file contents chunk by chunk and only the extracted file name is stored
+within the params table. The callback function will be called subsequently
+with three arguments:
+ o Table containing decoded (name, file) and raw (headers) mime header data
+ o String value containing a chunk of the file data
+ o Boolean which indicates whether the current chunk is the last one (eof)
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Ltn12 source function
+ </li>
+
+ <li>
+ msg: HTTP message object
+ </li>
+
+ <li>
+ filecb: File callback function (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Value indicating successful operation (not nil means "ok")
+
+ <li>String containing the error if unsuccessful
+
+</ol>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="">
+ parse_message_header
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="parse_message_body"></a><strong>parse_message_body</strong>&nbsp;(src, msg, filecb)</dt>
+<dd>
+
+
+Try to extract and decode a http message body from the given ltn12 source.
+This function will examine the Content-Type within the given message object
+to select the appropriate content decoder.
+
+Currently the application/x-www-urlencoded and application/form-data
+mime types are supported. If the encountered content encoding can't be
+handled then the whole message body will be stored unaltered as "content"
+property within the given message object.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Ltn12 source function
+ </li>
+
+ <li>
+ msg: HTTP message object
+ </li>
+
+ <li>
+ filecb: File data callback (optional, see mimedecode_message_body())
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Value indicating successful operation (not nil means "ok")
+
+ <li>String containing the error if unsuccessful
+
+</ol>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="">
+ parse_message_header
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="prepare_content"></a><strong>prepare_content</strong>&nbsp;(mime)</dt>
+<dd>
+
+
+Set the mime type of following content data.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mime: Mimetype of following content
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="redirect"></a><strong>redirect</strong>&nbsp;(url)</dt>
+<dd>
+
+
+Redirects the client to a new URL and closes the connection.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ url: Target URL
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="setfilehandler"></a><strong>setfilehandler</strong>&nbsp;(callback)</dt>
+<dd>
+
+
+Set a handler function for incoming user file uploads.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ callback: Handler function
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="source"></a><strong>source</strong>&nbsp;()</dt>
+<dd>
+
+
+Get the RAW HTTP input source
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+HTTP LTN12 source
+
+
+
+</dd>
+
+
+
+
+<dt><a name="splice"></a><strong>splice</strong>&nbsp;(fp, size)</dt>
+<dd>
+
+
+Splice data from a filedescriptor to the client.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ fp: File descriptor
+ </li>
+
+ <li>
+ size: Bytes to splice (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="status"></a><strong>status</strong>&nbsp;(code, message)</dt>
+<dd>
+
+
+Set the HTTP status code and status message.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ code: Status code
+ </li>
+
+ <li>
+ message: Status message
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="urldecode"></a><strong>urldecode</strong>&nbsp;(str, no_plus)</dt>
+<dd>
+
+
+Return the URL-decoded equivalent of a string.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ str: URL-encoded string
+ </li>
+
+ <li>
+ no_plus: Don't decode + to " "
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+URL-decoded string
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#urlencode">
+ urlencode
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="urldecode_message_body"></a><strong>urldecode_message_body</strong>&nbsp;(src, msg)</dt>
+<dd>
+
+
+Decode an urlencoded http message body with application/x-www-urlencoded
+Content-Type.
+
+Stores all extracted data associated with its parameter name in the params
+table within the given message object. Multiple parameter values are stored
+as tables, ordinary ones as strings.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Ltn12 source function
+ </li>
+
+ <li>
+ msg: HTTP message object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Value indicating successful operation (not nil means "ok")
+
+ <li>String containing the error if unsuccessful
+
+</ol>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="">
+ parse_message_header
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="urldecode_params"></a><strong>urldecode_params</strong>&nbsp;(url, tbl)</dt>
+<dd>
+
+
+Extract and split urlencoded data pairs, separated bei either "&" or ";"
+from given url or string. Returns a table with urldecoded values.
+
+Simple parameters are stored as string values associated with the parameter
+name within the table. Parameters with multiple values are stored as array
+containing the corresponding values.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ url: The url or string which contains x-www-urlencoded form data
+ </li>
+
+ <li>
+ tbl: Use the given table for storing values (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing the urldecoded parameters
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#urlencode_params">
+ urlencode_params
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="urlencode"></a><strong>urlencode</strong>&nbsp;(str)</dt>
+<dd>
+
+
+Return the URL-encoded equivalent of a string.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ str: Source string
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+URL-encoded string
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#urldecode">
+ urldecode
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="urlencode_params"></a><strong>urlencode_params</strong>&nbsp;(tbl)</dt>
+<dd>
+
+
+Encode each key-value-pair in given table to x-www-urlencoded format,
+separated by "&".
+
+Tables are encoded as parameters with multiple values by repeating the
+parameter name with each value.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ tbl: Table with the values
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing encoded values
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#urldecode_params">
+ urldecode_params
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="write"></a><strong>write</strong>&nbsp;(content, src_err)</dt>
+<dd>
+
+
+Send a chunk of content data to the client.
+
+This function is as a valid LTN12 sink.
+If the content chunk is nil this function will automatically invoke close.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ content: Content chunk
+ </li>
+
+ <li>
+ src_err: Error object from source (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#close">
+ close
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="write_json"></a><strong>write_json</strong>&nbsp;(data)</dt>
+<dd>
+
+
+Send the given data as JSON encoded string.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ data: Data to send
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.http.mime.html b/docs/api/modules/luci.http.mime.html
new file mode 100644
index 000000000..85eaf53ab
--- /dev/null
+++ b/docs/api/modules/luci.http.mime.html
@@ -0,0 +1,322 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li><strong>luci.http.mime</strong></li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.http.mime</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#to_ext">to_ext</a>&nbsp;(mimetype)</td>
+ <td class="summary">
+
+Return corresponding extension for a given mime type or nil if the
+
+given mime-type is unknown.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#to_mime">to_mime</a>&nbsp;(filename)</td>
+ <td class="summary">
+
+Extract extension from a filename and return corresponding mime-type or
+
+"application/octet-stream" if the extension is unknown.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="to_ext"></a><strong>to_ext</strong>&nbsp;(mimetype)</dt>
+<dd>
+
+
+Return corresponding extension for a given mime type or nil if the
+
+given mime-type is unknown.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mimetype: The mimetype to retrieve the extension from
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String with the extension or nil for unknown type
+
+
+
+</dd>
+
+
+
+
+<dt><a name="to_mime"></a><strong>to_mime</strong>&nbsp;(filename)</dt>
+<dd>
+
+
+Extract extension from a filename and return corresponding mime-type or
+
+"application/octet-stream" if the extension is unknown.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ filename: The filename for which the mime type is guessed
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containign the determined mime type
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.i18n.html b/docs/api/modules/luci.i18n.html
new file mode 100644
index 000000000..0f315bebd
--- /dev/null
+++ b/docs/api/modules/luci.i18n.html
@@ -0,0 +1,391 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li><strong>luci.i18n</strong></li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.i18n</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#dump">dump</a>&nbsp;()</td>
+ <td class="summary">
+
+Return all currently loaded translation strings as a key-value table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#setlanguage">setlanguage</a>&nbsp;(lang)</td>
+ <td class="summary">
+
+Set the context default translation language.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#translate">translate</a>&nbsp;(key)</td>
+ <td class="summary">
+
+Return the translated value for a specific translation key.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#translatef">translatef</a>&nbsp;(key, ...)</td>
+ <td class="summary">
+
+Return the translated value for a specific translation key and use it as sprintf pattern.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="dump"></a><strong>dump</strong>&nbsp;()</dt>
+<dd>
+
+
+Return all currently loaded translation strings as a key-value table. The key is the
+hexadecimal representation of the translation key while the value is the translated
+text content.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Key-value translation string table.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="setlanguage"></a><strong>setlanguage</strong>&nbsp;(lang)</dt>
+<dd>
+
+
+Set the context default translation language.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ lang: An IETF/BCP 47 language tag or ISO3166 country code, e.g. "en-US" or "de"
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+The effective loaded language, e.g. "en" for "en-US" - or nil on failure
+
+
+
+</dd>
+
+
+
+
+<dt><a name="translate"></a><strong>translate</strong>&nbsp;(key)</dt>
+<dd>
+
+
+Return the translated value for a specific translation key.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ key: Default translation text
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Translated string
+
+
+
+</dd>
+
+
+
+
+<dt><a name="translatef"></a><strong>translatef</strong>&nbsp;(key, ...)</dt>
+<dd>
+
+
+Return the translated value for a specific translation key and use it as sprintf pattern.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ key: Default translation text
+ </li>
+
+ <li>
+ ...: Format parameters
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Translated and formatted string
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.ip.cidr.html b/docs/api/modules/luci.ip.cidr.html
new file mode 100644
index 000000000..ae6c61dc5
--- /dev/null
+++ b/docs/api/modules/luci.ip.cidr.html
@@ -0,0 +1,1511 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li><strong>luci.ip.cidr</strong></li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>luci.ip.cidr</code></h1>
+
+<p>
+ IP CIDR Object.
+ Represents an IPv4 or IPv6 address range.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.is4">cidr:is4</a>&nbsp;()</td>
+ <td class="summary">
+
+Checks whether the CIDR instance is an IPv4 address range
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.is4rfc1918">cidr:is4rfc1918</a>&nbsp;()</td>
+ <td class="summary">
+
+Checks whether the CIDR instance is within the private RFC1918 address space
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.is4linklocal">cidr:is4linklocal</a>&nbsp;()</td>
+ <td class="summary">
+
+Checks whether the CIDR instance is an IPv4 link local (Zeroconf) address
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.is6">cidr:is6</a>&nbsp;()</td>
+ <td class="summary">
+
+Checks whether the CIDR instance is an IPv6 address range
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.is6linklocal">cidr:is6linklocal</a>&nbsp;()</td>
+ <td class="summary">
+
+Checks whether the CIDR instance is an IPv6 link local address
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.is6mapped4">cidr:is6mapped4</a>&nbsp;()</td>
+ <td class="summary">
+
+Checks whether the CIDR instance is an IPv6 mapped IPv4 address
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.ismac">cidr:ismac</a>&nbsp;()</td>
+ <td class="summary">
+
+Checks whether the CIDR instance is an ethernet MAC address range
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.ismaclocal">cidr:ismaclocal</a>&nbsp;()</td>
+ <td class="summary">
+
+Checks whether the CIDR instance is a locally administered (LAA) MAC address
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.ismacmcast">cidr:ismacmcast</a>&nbsp;()</td>
+ <td class="summary">
+
+Checks whether the CIDR instance is a multicast MAC address
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.lower">cidr:lower</a>&nbsp;(addr)</td>
+ <td class="summary">
+
+Checks whether this CIDR instance is lower than the given argument.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.higher">cidr:higher</a>&nbsp;(addr)</td>
+ <td class="summary">
+
+Checks whether this CIDR instance is higher than the given argument.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.equal">cidr:equal</a>&nbsp;(addr)</td>
+ <td class="summary">
+
+Checks whether this CIDR instance is equal to the given argument.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.prefix">cidr:prefix</a>&nbsp;(mask)</td>
+ <td class="summary">
+
+Get or set prefix size of CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.network">cidr:network</a>&nbsp;(mask)</td>
+ <td class="summary">
+
+Derive network address of CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.host">cidr:host</a>&nbsp;()</td>
+ <td class="summary">
+
+Derive host address of CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.mask">cidr:mask</a>&nbsp;(mask)</td>
+ <td class="summary">
+
+Derive netmask of CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.broadcast">cidr:broadcast</a>&nbsp;(mask)</td>
+ <td class="summary">
+
+Derive broadcast address of CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.mapped4">cidr:mapped4</a>&nbsp;()</td>
+ <td class="summary">
+
+Derive mapped IPv4 address of CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.tomac">cidr:tomac</a>&nbsp;()</td>
+ <td class="summary">
+
+Derive MAC address of IPv6 link local CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.tolinklocal">cidr:tolinklocal</a>&nbsp;()</td>
+ <td class="summary">
+
+Derive IPv6 link local address from MAC address CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.contains">cidr:contains</a>&nbsp;(addr)</td>
+ <td class="summary">
+
+Test whether CIDR contains given range.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.add">cidr:add</a>&nbsp;(amount, inplace)</td>
+ <td class="summary">
+
+Add given amount to CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.sub">cidr:sub</a>&nbsp;(amount, inplace)</td>
+ <td class="summary">
+
+Subtract given amount from CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.minhost">cidr:minhost</a>&nbsp;()</td>
+ <td class="summary">
+
+Calculate the lowest possible host address within this CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.maxhost">cidr:maxhost</a>&nbsp;()</td>
+ <td class="summary">
+
+Calculate the highest possible host address within this CIDR instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cidr.string">cidr:string</a>&nbsp;()</td>
+ <td class="summary">
+
+Convert CIDR instance into string representation.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="cidr.is4"></a><strong>cidr:is4</strong>&nbsp;()</dt>
+<dd>
+
+
+Checks whether the CIDR instance is an IPv4 address range
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if the CIDR is an IPv4 range, else <code>false</code>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#cidr.is6">
+ cidr:is6
+ </a>
+
+ <li><a href="#cidr.ismac">
+ cidr:ismac
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="cidr.is4rfc1918"></a><strong>cidr:is4rfc1918</strong>&nbsp;()</dt>
+<dd>
+
+
+Checks whether the CIDR instance is within the private RFC1918 address space
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.45.2/24")
+if addr:is4rfc1918() then
+ print("Is a private address")
+end</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if the entire range of this CIDR lies within one of
+ the ranges <code>10.0.0.0-10.255.255.255</code>,
+ <code>172.16.0.0-172.31.0.0</code> or
+ <code>192.168.0.0-192.168.255.255</code>, else <code>false</code>.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.is4linklocal"></a><strong>cidr:is4linklocal</strong>&nbsp;()</dt>
+<dd>
+
+
+Checks whether the CIDR instance is an IPv4 link local (Zeroconf) address
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("169.254.34.125")
+if addr:is4linklocal() then
+ print("Is a zeroconf address")
+end</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if the entire range of this CIDR lies within the range
+ the range <code>169.254.0.0-169.254.255.255</code>, else <code>false</code>.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.is6"></a><strong>cidr:is6</strong>&nbsp;()</dt>
+<dd>
+
+
+Checks whether the CIDR instance is an IPv6 address range
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if the CIDR is an IPv6 range, else <code>false</code>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#cidr.is4">
+ cidr:is4
+ </a>
+
+ <li><a href="#cidr.ismac">
+ cidr:ismac
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="cidr.is6linklocal"></a><strong>cidr:is6linklocal</strong>&nbsp;()</dt>
+<dd>
+
+
+Checks whether the CIDR instance is an IPv6 link local address
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("fe92:53a:3216:af01:221:63ff:fe75:aa17/64")
+if addr:is6linklocal() then
+ print("Is a linklocal address")
+end</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if the entire range of this CIDR lies within the range
+ the <code>fe80::/10</code> range, else <code>false</code>.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.is6mapped4"></a><strong>cidr:is6mapped4</strong>&nbsp;()</dt>
+<dd>
+
+
+Checks whether the CIDR instance is an IPv6 mapped IPv4 address
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("::ffff:192.168.1.1")
+if addr:is6mapped4() then
+ print("Is a mapped IPv4 address")
+end</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if the address is an IPv6 mapped IPv4 address in the
+ form <code>::ffff:1.2.3.4</code>.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.ismac"></a><strong>cidr:ismac</strong>&nbsp;()</dt>
+<dd>
+
+
+Checks whether the CIDR instance is an ethernet MAC address range
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if the CIDR is a MAC address range, else <code>false</code>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#cidr.is4">
+ cidr:is4
+ </a>
+
+ <li><a href="#cidr.is6">
+ cidr:is6
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="cidr.ismaclocal"></a><strong>cidr:ismaclocal</strong>&nbsp;()</dt>
+<dd>
+
+
+Checks whether the CIDR instance is a locally administered (LAA) MAC address
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local mac = luci.ip.new("02:C0:FF:EE:00:01")
+if mac:ismaclocal() then
+ print("Is an LAA MAC address")
+end</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if the MAC address sets the locally administered bit.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.ismacmcast"></a><strong>cidr:ismacmcast</strong>&nbsp;()</dt>
+<dd>
+
+
+Checks whether the CIDR instance is a multicast MAC address
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local mac = luci.ip.new("01:00:5E:7F:00:10")
+if addr:ismacmcast() then
+ print("Is a multicast MAC address")
+end</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if the MAC address sets the multicast bit.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.lower"></a><strong>cidr:lower</strong>&nbsp;(addr)</dt>
+<dd>
+
+
+Checks whether this CIDR instance is lower than the given argument.
+The comparisation follows these rules:
+<ul><li>An IPv4 address is always lower than an IPv6 address and IPv6 addresses
+are considered lower than MAC addresses</li>
+<li>Prefix sizes are ignored</li></ul>
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ addr: A <code>luci.ip.cidr</code> instance or a string convertible by
+ <code>luci.ip.new()</code> to compare against.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.1.1")
+print(addr:lower(addr)) -- false
+print(addr:lower("10.10.10.10/24")) -- false
+print(addr:lower(luci.ip.new("::1"))) -- true
+print(addr:lower(luci.ip.new("192.168.200.1"))) -- true
+print(addr:lower(luci.ip.new("00:14:22:01:23:45"))) -- true</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if this CIDR is lower than the given address,
+ else <code>false</code>.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#cidr.higher">
+ cidr:higher
+ </a>
+
+ <li><a href="#cidr.equal">
+ cidr:equal
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="cidr.higher"></a><strong>cidr:higher</strong>&nbsp;(addr)</dt>
+<dd>
+
+
+Checks whether this CIDR instance is higher than the given argument.
+The comparisation follows these rules:
+<ul><li>An IPv4 address is always lower than an IPv6 address and IPv6 addresses
+are considered lower than MAC addresses</li>
+<li>Prefix sizes are ignored</li></ul>
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ addr: A <code>luci.ip.cidr</code> instance or a string convertible by
+ <code>luci.ip.new()</code> to compare against.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.1.1")
+print(addr:higher(addr)) -- false
+print(addr:higher("10.10.10.10/24")) -- true
+print(addr:higher(luci.ip.new("::1"))) -- false
+print(addr:higher(luci.ip.new("192.168.200.1"))) -- false
+print(addr:higher(luci.ip.new("00:14:22:01:23:45"))) -- false</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if this CIDR is higher than the given address,
+ else <code>false</code>.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#cidr.lower">
+ cidr:lower
+ </a>
+
+ <li><a href="#cidr.equal">
+ cidr:equal
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="cidr.equal"></a><strong>cidr:equal</strong>&nbsp;(addr)</dt>
+<dd>
+
+
+Checks whether this CIDR instance is equal to the given argument.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ addr: A <code>luci.ip.cidr</code> instance or a string convertible by
+ <code>luci.ip.new()</code> to compare against.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.1.1")
+print(addr:equal(addr)) -- true
+print(addr:equal("192.168.1.1")) -- true
+print(addr:equal(luci.ip.new("::1"))) -- false
+
+local addr6 = luci.ip.new("::1")
+print(addr6:equal("0:0:0:0:0:0:0:1/64")) -- true
+print(addr6:equal(luci.ip.new("fe80::221:63ff:fe75:aa17"))) -- false
+
+local mac = luci.ip.new("00:14:22:01:23:45")
+print(mac:equal("0:14:22:1:23:45")) -- true
+print(mac:equal(luci.ip.new("01:23:45:67:89:AB")) -- false</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if this CIDR is equal to the given address,
+ else <code>false</code>.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#cidr.lower">
+ cidr:lower
+ </a>
+
+ <li><a href="#cidr.higher">
+ cidr:higher
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="cidr.prefix"></a><strong>cidr:prefix</strong>&nbsp;(mask)</dt>
+<dd>
+
+
+Get or set prefix size of CIDR instance.
+If the optional mask parameter is given, the prefix size of this CIDR is altered
+else the current prefix size is returned.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mask: Either a number containing the number of bits (<code>0..32</code>
+ for IPv4, <code>0..128</code> for IPv6 or <code>0..48</code> for MAC addresses) or a string
+ containing a valid netmask (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local range = luci.ip.new("192.168.1.1/255.255.255.0")
+print(range:prefix()) -- 24
+
+range:prefix(16)
+print(range:prefix()) -- 16
+
+range:prefix("255.255.255.255")
+print(range:prefix()) -- 32</pre>
+
+
+
+<h3>Return value:</h3>
+Bit count of the current prefix size
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.network"></a><strong>cidr:network</strong>&nbsp;(mask)</dt>
+<dd>
+
+
+Derive network address of CIDR instance.
+
+Returns a new CIDR instance representing the network address of this instance
+with all host parts masked out. The used prefix size can be overridden by the
+optional mask parameter.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mask: Either a number containing the number of bits (<code>0..32</code>
+ for IPv4, <code>0..128</code> for IPv6 or <code>0..48</code> for MAC addresses) or a string
+ containing a valid netmask (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local range = luci.ip.new("192.168.62.243/255.255.0.0")
+print(range:network()) -- "192.168.0.0"
+print(range:network(24)) -- "192.168.62.0"
+print(range:network("255.255.255.0")) -- "192.168.62.0"
+
+local range6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64")
+print(range6:network()) -- "fd9b:62b3:9cc5::"</pre>
+
+
+
+<h3>Return value:</h3>
+CIDR instance representing the network address
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.host"></a><strong>cidr:host</strong>&nbsp;()</dt>
+<dd>
+
+
+Derive host address of CIDR instance.
+
+This function essentially constructs a copy of this CIDR with the prefix size
+set to <code>32</code> for IPv4, <code>128</code> for IPv6 or <code>48</code> for MAC addresses.
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local range = luci.ip.new("172.19.37.45/16")
+print(range) -- "172.19.37.45/16"
+print(range:host()) -- "172.19.37.45"</pre>
+
+
+
+<h3>Return value:</h3>
+CIDR instance representing the host address
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.mask"></a><strong>cidr:mask</strong>&nbsp;(mask)</dt>
+<dd>
+
+
+Derive netmask of CIDR instance.
+
+Constructs a CIDR instance representing the netmask of this instance. The used
+prefix size can be overridden by the optional mask parameter.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mask: Either a number containing the number of bits (<code>0..32</code>
+ for IPv4, <code>0..128</code> for IPv6 or <code>0..48</code> for MAC addresses) or a string
+ containing a valid netmask (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local range = luci.ip.new("172.19.37.45/16")
+print(range:mask()) -- "255.255.0.0"
+print(range:mask(24)) -- "255.255.255.0"
+print(range:mask("255.0.0.0")) -- "255.0.0.0"</pre>
+
+
+
+<h3>Return value:</h3>
+CIDR instance representing the netmask
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.broadcast"></a><strong>cidr:broadcast</strong>&nbsp;(mask)</dt>
+<dd>
+
+
+Derive broadcast address of CIDR instance.
+
+Constructs a CIDR instance representing the broadcast address of this instance.
+The used prefix size can be overridden by the optional mask parameter.
+
+This function has no effect on IPv6 or MAC address instances, it will return
+nothing in this case.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mask: Either a number containing the number of bits (<code>0..32</code> for IPv4) or
+ a string containing a valid netmask (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local range = luci.ip.new("172.19.37.45/16")
+print(range:broadcast()) -- "172.19.255.255"
+print(range:broadcast(24)) -- "172.19.37.255"
+print(range:broadcast("255.0.0.0")) -- "172.255.255.255"</pre>
+
+
+
+<h3>Return value:</h3>
+Return a new CIDR instance representing the broadcast address if this
+ instance is an IPv4 range, else return nothing.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.mapped4"></a><strong>cidr:mapped4</strong>&nbsp;()</dt>
+<dd>
+
+
+Derive mapped IPv4 address of CIDR instance.
+
+Constructs a CIDR instance representing the IPv4 address of the IPv6 mapped
+IPv4 address in this instance.
+
+This function has no effect on IPv4 instances, MAC address instances or IPv6
+instances which are not a mapped address, it will return nothing in this case.
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("::ffff:172.16.19.1")
+print(addr:mapped4()) -- "172.16.19.1"</pre>
+
+
+
+<h3>Return value:</h3>
+Return a new CIDR instance representing the IPv4 address if this
+ instance is an IPv6 mapped IPv4 address, else return nothing.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.tomac"></a><strong>cidr:tomac</strong>&nbsp;()</dt>
+<dd>
+
+
+Derive MAC address of IPv6 link local CIDR instance.
+
+Constructs a CIDR instance representing the MAC address contained in the IPv6
+link local address of this instance.
+
+This function has no effect on IPv4 instances, MAC address instances or IPv6
+instances which are not a link local address, it will return nothing in this
+case.
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("fe80::6666:b3ff:fe47:e1b9")
+print(addr:tomac()) -- "64:66:B3:47:E1:B9"</pre>
+
+
+
+<h3>Return value:</h3>
+Return a new CIDR instance representing the MAC address if this
+ instance is an IPv6 link local address, else return nothing.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.tolinklocal"></a><strong>cidr:tolinklocal</strong>&nbsp;()</dt>
+<dd>
+
+
+Derive IPv6 link local address from MAC address CIDR instance.
+
+Constructs a CIDR instance representing the IPv6 link local address of the
+MAC address represented by this instance.
+
+This function has no effect on IPv4 instances or IPv6 instances, it will return
+nothing in this case.
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local mac = luci.ip.new("64:66:B3:47:E1:B9")
+print(mac:tolinklocal()) -- "fe80::6666:b3ff:fe47:e1b9"</pre>
+
+
+
+<h3>Return value:</h3>
+Return a new CIDR instance representing the IPv6 link local address.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.contains"></a><strong>cidr:contains</strong>&nbsp;(addr)</dt>
+<dd>
+
+
+Test whether CIDR contains given range.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ addr: A <code>luci.ip.cidr</code> instance or a string convertible by
+ <code>luci.ip.new()</code> to test.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local range = luci.ip.new("10.24.0.0/255.255.0.0")
+print(range:contains("10.24.5.1")) -- true
+print(range:contains("::1")) -- false
+print(range:contains("10.0.0.0/8")) -- false
+
+local range6 = luci.ip.new("fe80::/10")
+print(range6:contains("fe80::221:63f:fe75:aa17/64")) -- true
+print(range6:contains("fd9b:6b3:c5:0:221:63f:fe75:aa17/64")) -- false
+
+local intel_macs = luci.ip.MAC("C0:B6:F9:00:00:00/24")
+print(intel_macs:contains("C0:B6:F9:A3:C:11")) -- true
+print(intel_macs:contains("64:66:B3:47:E1:B9")) -- false</pre>
+
+
+
+<h3>Return value:</h3>
+<code>true</code> if this instance fully contains the given address else
+ <code>false</code>.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.add"></a><strong>cidr:add</strong>&nbsp;(amount, inplace)</dt>
+<dd>
+
+
+Add given amount to CIDR instance. If the result would overflow the maximum
+address space, the result is set to the highest possible address.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ amount: A numeric value between 0 and 0xFFFFFFFF, a
+ <code>luci.ip.cidr</code> instance or a string convertible by
+ <code>luci.ip.new()</code>.
+ </li>
+
+ <li>
+ inplace: If <code>true</code>, modify this instance instead of returning
+ a new derived CIDR instance.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.1.1/24")
+print(addr:add(250)) -- "192.168.1.251/24"
+print(addr:add("0.0.99.0")) -- "192.168.100.1/24"
+
+addr:add(256, true) -- true
+print(addr) -- "192.168.2.1/24
+
+addr:add("255.0.0.0", true) -- false (overflow)
+print(addr) -- "255.255.255.255/24
+
+local addr6 = luci.ip.new("fe80::221:63f:fe75:aa17/64")
+print(addr6:add(256)) -- "fe80::221:63f:fe75:ab17/64"
+print(addr6:add("::ffff:0")) -- "fe80::221:640:fe74:aa17/64"
+
+addr6:add(256, true) -- true
+print(addr6) -- "fe80::221:63f:fe75:ab17/64
+
+addr6:add("ffff::", true) -- false (overflow)
+print(addr6) -- "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/64"
+
+local mac = luci.ip.new("00:14:22:01:23:45")
+print(mac:add(256)) -- "00:14:22:01:24:45"
+print(mac:add("0:0:0:0:FF:0") -- "00:14:22:02:22:45"
+
+mac:add(256, true) -- true
+print(mac) -- "00:14:22:01:24:45"
+
+mac:add("FF:FF:0:0:0:0", true) -- false (overflow)
+print(mac) -- "FF:FF:FF:FF:FF:FF"</pre>
+
+
+
+<h3>Return value:</h3>
+<ul>
+ <li>When adding inplace: Return <code>true</code> if the addition succeeded
+ or <code>false</code> when the addition overflowed.</li>
+ <li>When deriving new CIDR: Return new instance representing the value of
+ this instance plus the added amount or the highest possible address if
+ the addition overflowed the available address space.</li></ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.sub"></a><strong>cidr:sub</strong>&nbsp;(amount, inplace)</dt>
+<dd>
+
+
+Subtract given amount from CIDR instance. If the result would under, the lowest
+possible address is returned.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ amount: A numeric value between 0 and 0xFFFFFFFF, a
+ <code>luci.ip.cidr</code> instance or a string convertible by
+ <code>luci.ip.new()</code>.
+ </li>
+
+ <li>
+ inplace: If <code>true</code>, modify this instance instead of returning
+ a new derived CIDR instance.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.1.1/24")
+print(addr:sub(256)) -- "192.168.0.1/24"
+print(addr:sub("0.168.0.0")) -- "192.0.1.1/24"
+
+addr:sub(256, true) -- true
+print(addr) -- "192.168.0.1/24
+
+addr:sub("255.0.0.0", true) -- false (underflow)
+print(addr) -- "0.0.0.0/24
+
+local addr6 = luci.ip.new("fe80::221:63f:fe75:aa17/64")
+print(addr6:sub(256)) -- "fe80::221:63f:fe75:a917/64"
+print(addr6:sub("::ffff:0")) -- "fe80::221:63e:fe76:aa17/64"
+
+addr:sub(256, true) -- true
+print(addr) -- "fe80::221:63f:fe75:a917/64"
+
+addr:sub("ffff::", true) -- false (underflow)
+print(addr) -- "::/64"
+
+local mac = luci.ip.new("00:14:22:01:23:45")
+print(mac:sub(256)) -- "00:14:22:01:22:45"
+print(mac:sub("0:0:0:0:FF:0") -- "00:14:22:00:24:45"
+
+mac:sub(256, true) -- true
+print(mac) -- "00:14:22:01:22:45"
+
+mac:sub("FF:FF:0:0:0:0", true) -- false (overflow)
+print(mac) -- "00:00:00:00:00:00"</pre>
+
+
+
+<h3>Return value:</h3>
+<ul>
+ <li>When subtracting inplace: Return <code>true</code> if the subtraction
+ succeeded or <code>false</code> when the subtraction underflowed.</li>
+ <li>When deriving new CIDR: Return new instance representing the value of
+ this instance minus the subtracted amount or the lowest address if
+ the subtraction underflowed.</li></ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.minhost"></a><strong>cidr:minhost</strong>&nbsp;()</dt>
+<dd>
+
+
+Calculate the lowest possible host address within this CIDR instance.
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.123.56/24")
+print(addr:minhost()) -- "192.168.123.1"
+
+local addr6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64")
+print(addr6:minhost()) -- "fd9b:62b3:9cc5::1"
+
+local mac = luci.ip.new("00:14:22:01:22:45/32")
+print(mac:minhost()) -- "00:14:22:01:00:01"</pre>
+
+
+
+<h3>Return value:</h3>
+Returns a new CIDR instance representing the lowest host address
+ within this range.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.maxhost"></a><strong>cidr:maxhost</strong>&nbsp;()</dt>
+<dd>
+
+
+Calculate the highest possible host address within this CIDR instance.
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>local addr = luci.ip.new("192.168.123.56/24")
+print(addr:maxhost()) -- "192.168.123.254" (.255 is broadcast)
+
+local addr6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64")
+print(addr6:maxhost()) -- "fd9b:62b3:9cc5:0:ffff:ffff:ffff:ffff"
+
+local mac = luci.ip.new("00:14:22:01:22:45/32")
+print(mac:maxhost()) -- "00:14:22:01:FF:FF"</pre>
+
+
+
+<h3>Return value:</h3>
+Returns a new CIDR instance representing the highest host address
+ within this range.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cidr.string"></a><strong>cidr:string</strong>&nbsp;()</dt>
+<dd>
+
+
+Convert CIDR instance into string representation.
+
+If the prefix size of instance is less than 32 for IPv4, 128 for IPv6 or 48 for
+MACs, the address is returned in the form "address/prefix" otherwise just
+"address".
+
+It is usually not required to call this function directly as CIDR objects
+define it as __tostring function in the associated metatable.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Returns a string representing the range or address of this CIDR instance
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.ip.html b/docs/api/modules/luci.ip.html
new file mode 100644
index 000000000..0599396b6
--- /dev/null
+++ b/docs/api/modules/luci.ip.html
@@ -0,0 +1,1217 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li><strong>luci.ip</strong></li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.ip</code></h1>
+
+<p>
+ LuCI IP calculation and netlink access library.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#new">new</a>&nbsp;(address, netmask)</td>
+ <td class="summary">
+
+Construct a new luci.ip.cidr instance and autodetect the address family.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#IPv4">IPv4</a>&nbsp;(address, netmask)</td>
+ <td class="summary">
+
+Construct a new IPv4 luci.ip.cidr instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#IPv6">IPv6</a>&nbsp;(address, netmask)</td>
+ <td class="summary">
+
+Construct a new IPv6 luci.ip.cidr instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#MAC">MAC</a>&nbsp;(address, netmask)</td>
+ <td class="summary">
+
+Construct a new MAC luci.ip.cidr instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#checkip4">checkip4</a>&nbsp;(address)</td>
+ <td class="summary">
+
+Verify an IPv4 address.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#checkip6">checkip6</a>&nbsp;(address)</td>
+ <td class="summary">
+
+Verify an IPv6 address.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#checkmac">checkmac</a>&nbsp;(address)</td>
+ <td class="summary">
+
+Verify an ethernet MAC address.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#route">route</a>&nbsp;(address, source)</td>
+ <td class="summary">
+
+Determine the route leading to the given destination.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#routes">routes</a>&nbsp;(filter, callback)</td>
+ <td class="summary">
+
+Fetch all routes, optionally matching the given criteria.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#neighbors">neighbors</a>&nbsp;(filter, callback)</td>
+ <td class="summary">
+
+Fetches entries from the IPv4 ARP and IPv6 neighbour kernel table </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#link">link</a>&nbsp;(device)</td>
+ <td class="summary">
+
+Fetch basic device information </td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="new"></a><strong>new</strong>&nbsp;(address, netmask)</dt>
+<dd>
+
+
+Construct a new luci.ip.cidr instance and autodetect the address family.
+Throws an error if the given strings do not represent a valid address or
+if the given optional netmask is of a different family.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ address: String containing a valid IPv4 or IPv6 address, optionally
+with prefix size (CIDR notation) or netmask separated by slash.
+ </li>
+
+ <li>
+ netmask: String containing a valid IPv4 or IPv6 netmask or number
+containing a prefix size in bits (<code>0..32</code> for IPv4,
+<code>0..128</code> for IPv6). Overrides mask embedded in the first argument
+if specified. (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>addr = luci.ip.new("10.24.0.1/24")
+addr = luci.ip.new("10.24.0.1/255.255.255.0")
+addr = luci.ip.new("10.24.0.1", "255.255.255.0") -- separate netmask
+addr = luci.ip.new("10.24.0.1/24", 16) -- override netmask
+
+addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/64")
+addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/ffff:ffff:ffff:ffff::")
+addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17", "ffff:ffff:ffff:ffff::")
+addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/64", 128) -- override netmask</pre>
+
+
+
+<h3>Return value:</h3>
+A <code>luci.ip.cidr</code> object representing the given
+address/mask range.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#IPv4">
+ IPv4
+ </a>
+
+ <li><a href="#IPv6">
+ IPv6
+ </a>
+
+ <li><a href="#MAC">
+ MAC
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="IPv4"></a><strong>IPv4</strong>&nbsp;(address, netmask)</dt>
+<dd>
+
+
+Construct a new IPv4 luci.ip.cidr instance.
+Throws an error if the given string does not represent a valid IPv4 address or
+if the given optional netmask is of a different family.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ address: String containing a valid IPv4, optionally with prefix size
+(CIDR notation) or netmask separated by slash.
+ </li>
+
+ <li>
+ netmask: String containing a valid IPv4 netmask or number
+containing a prefix size between <code>0</code> and <code>32</code> bit.
+Overrides mask embedded in the first argument if specified. (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>addr = luci.ip.IPv4("10.24.0.1/24")
+addr = luci.ip.IPv4("10.24.0.1/255.255.255.0")
+addr = luci.ip.IPv4("10.24.0.1", "255.255.255.0") -- separate netmask
+addr = luci.ip.IPv4("10.24.0.1/24", 16) -- override netmask</pre>
+
+
+
+<h3>Return value:</h3>
+A <code>luci.ip.cidr</code> object representing the given IPv4 range.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#IPv6">
+ IPv6
+ </a>
+
+ <li><a href="#MAC">
+ MAC
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="IPv6"></a><strong>IPv6</strong>&nbsp;(address, netmask)</dt>
+<dd>
+
+
+Construct a new IPv6 luci.ip.cidr instance.
+Throws an error if the given string does not represent a valid IPv6 address or
+if the given optional netmask is of a different family.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ address: String containing a valid IPv6, optionally with prefix size
+(CIDR notation) or netmask separated by slash.
+ </li>
+
+ <li>
+ netmask: String containing a valid IPv4 netmask or number
+containing a prefix size between <code>0</code> and <code>128</code> bit.
+Overrides mask embedded in the first argument if specified. (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/64")
+addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/ffff:ffff:ffff:ffff::")
+addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17", "ffff:ffff:ffff:ffff::")
+addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/64", 128) -- override netmask</pre>
+
+
+
+<h3>Return value:</h3>
+A <code>luci.ip.cidr</code> object representing the given IPv6 range.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#IPv4">
+ IPv4
+ </a>
+
+ <li><a href="#MAC">
+ MAC
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="MAC"></a><strong>MAC</strong>&nbsp;(address, netmask)</dt>
+<dd>
+
+
+Construct a new MAC luci.ip.cidr instance.
+Throws an error if the given string does not represent a valid ethernet MAC
+address or if the given optional mask is of a different family.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ address: String containing a valid ethernet MAC address, optionally with
+prefix size (CIDR notation) or mask separated by slash.
+ </li>
+
+ <li>
+ netmask: String containing a valid MAC address mask or number
+containing a prefix size between <code>0</code> and <code>48</code> bit.
+Overrides mask embedded in the first argument if specified. (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>intel_macs = luci.ip.MAC("C0:B6:F9:00:00:00/24")
+intel_macs = luci.ip.MAC("C0:B6:F9:00:00:00/FF:FF:FF:0:0:0")
+intel_macs = luci.ip.MAC("C0:B6:F9:00:00:00", "FF:FF:FF:0:0:0")
+intel_macs = luci.ip.MAC("C0:B6:F9:00:00:00/24", 48) -- override mask</pre>
+
+
+
+<h3>Return value:</h3>
+A <code>luci.ip.cidr</code> object representing the given MAC address range.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#IPv4">
+ IPv4
+ </a>
+
+ <li><a href="#IPv6">
+ IPv6
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="checkip4"></a><strong>checkip4</strong>&nbsp;(address)</dt>
+<dd>
+
+
+Verify an IPv4 address.
+
+Checks whether given argument is a preexisting luci.ip.cidr IPv4 address
+instance or a string literal convertible to an IPv4 address and returns a
+plain Lua string containing the canonical representation of the address.
+
+If the argument is not a valid address, returns nothing. This function is
+intended to aid in safely verifying address literals without having to deal
+with exceptions.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ address: String containing a valid IPv4 address or existing
+luci.ip.cidr IPv4 instance.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>ipv4 = luci.ip.checkip4(luci.ip.new("127.0.0.1")) -- "127.0.0.1"
+ipv4 = luci.ip.checkip4("127.0.0.1") -- "127.0.0.1"
+ipv4 = luci.ip.checkip4("nonesense") -- nothing
+ipv4 = luci.ip.checkip4(123) -- nothing
+ipv4 = luci.ip.checkip4(nil) -- nothing
+ipv4 = luci.ip.checkip4() -- nothing</pre>
+
+
+
+<h3>Return value:</h3>
+A string representing the given IPv4 address.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#checkip6">
+ checkip6
+ </a>
+
+ <li><a href="#checkmac">
+ checkmac
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="checkip6"></a><strong>checkip6</strong>&nbsp;(address)</dt>
+<dd>
+
+
+Verify an IPv6 address.
+
+Checks whether given argument is a preexisting luci.ip.cidr IPv6 address
+instance or a string literal convertible to an IPv6 address and returns a
+plain Lua string containing the canonical representation of the address.
+
+If the argument is not a valid address, returns nothing. This function is
+intended to aid in safely verifying address literals without having to deal
+with exceptions.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ address: String containing a valid IPv6 address or existing
+luci.ip.cidr IPv6 instance.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>ipv6 = luci.ip.checkip6(luci.ip.new("0:0:0:0:0:0:0:1")) -- "::1"
+ipv6 = luci.ip.checkip6("0:0:0:0:0:0:0:1") -- "::1"
+ipv6 = luci.ip.checkip6("nonesense") -- nothing
+ipv6 = luci.ip.checkip6(123) -- nothing
+ipv6 = luci.ip.checkip6(nil) -- nothing
+ipv6 = luci.ip.checkip6() -- nothing</pre>
+
+
+
+<h3>Return value:</h3>
+A string representing the given IPv6 address.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#checkip4">
+ checkip4
+ </a>
+
+ <li><a href="#checkmac">
+ checkmac
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="checkmac"></a><strong>checkmac</strong>&nbsp;(address)</dt>
+<dd>
+
+
+Verify an ethernet MAC address.
+
+Checks whether given argument is a preexisting luci.ip.cidr MAC address
+instance or a string literal convertible to an ethernet MAC and returns a
+plain Lua string containing the canonical representation of the address.
+
+If the argument is not a valid address, returns nothing. This function is
+intended to aid in safely verifying address literals without having to deal
+with exceptions.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ address: String containing a valid MAC address or existing luci.ip.cidr
+MAC address instance.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>mac = luci.ip.checkmac(luci.ip.new("00-11-22-cc-dd-ee")) -- "00:11:22:CC:DD:EE"
+mac = luci.ip.checkmac("00:11:22:cc:dd:ee") -- "00:11:22:CC:DD:EE"
+mac = luci.ip.checkmac("nonesense") -- nothing
+mac = luci.ip.checkmac(123) -- nothing
+mac = luci.ip.checkmac(nil) -- nothing
+mac = luci.ip.checkmac() -- nothing</pre>
+
+
+
+<h3>Return value:</h3>
+A string representing the given MAC address.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#checkip4">
+ checkip4
+ </a>
+
+ <li><a href="#checkip6">
+ checkip6
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="route"></a><strong>route</strong>&nbsp;(address, source)</dt>
+<dd>
+
+
+Determine the route leading to the given destination.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ address: A <code>luci.ip.cidr</code> instance or a string containing
+a valid IPv4 or IPv6 range as specified by <code>luci.ip.new()</code>.
+ </li>
+
+ <li>
+ source: A <code>luci.ip.cidr</code> instance or a string containing
+the preferred source address for route selection (optional).
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<ul>
+<li>Find default gateway by getting route to Google's public NS server
+<pre>rt = luci.ip.route("8.8.8.8")
+if rt ~= nil then
+ print("gateway is", rt.gw)
+end</pre></li>
+<li>Determine IPv6 upstream interface <pre>rt = luci.ip.route("2001::/7")
+if rt ~= nil then
+ print("ipv6 upstream device is", rt.dev)
+end</pre></li>
+</ul>
+
+
+
+<h3>Return value:</h3>
+<p>Table containing the fields described below.</p>
+<table id="routetable">
+<tr><th>Field</th><th>Description</th></tr>
+<tr><td><code>type</code><td>
+ <p>Route type with one of the following numeric values:</p>
+ <table>
+ <tr>
+ <td><code>1</code></td>
+ <td><code>RTN_UNICAST</code> - Gateway or direct route</td>
+ </tr>
+ <tr>
+ <td><code>2</code></td>
+ <td><code>RTN_LOCAL</code> - Accept locally</td>
+ </tr>
+ <tr>
+ <td><code>3</code></td>
+ <td><code>RTN_BROADCAST</code> -
+ Accept locally as broadcast send as broadcast</td>
+ </tr>
+ <tr>
+ <td><code>4</code></td>
+ <td><code>RTN_ANYCAST</code> -
+ Accept locally as broadcast but send as unicast</td>
+ </tr>
+ <tr>
+ <td><code>5</code></td>
+ <td><code>RTN_MULTICAST</code> - Multicast route</td>
+ </tr>
+ </table>
+</td></tr>
+<tr>
+ <td><code>family</code></td>
+ <td>Number containing the route family, <code>4</code> for IPv4 or
+ <code>6</code> for IPv6</td>
+</tr>
+<tr>
+ <td><code>dest</code></td>
+ <td>Destination <code>luci.ip.cidr</code> instance</td>
+</tr>
+<tr>
+ <td><code>gw</code></td>
+ <td>Gateway <code>luci.ip.cidr</code> instance (optional)</td>
+</tr>
+<tr>
+ <td><code>from</code></td>
+ <td>Source address <code>luci.ip.cidr</code> instance (optional)</td>
+</tr>
+<tr>
+ <td><code>src</code></td>
+ <td>Preferred source <code>luci.ip.cidr</code> instance (optional)</td>
+</tr>
+<tr>
+ <td><code>dev</code></td>
+ <td>String containing the name of the outgoing interface</td>
+</tr>
+<tr>
+ <td><code>iif</code></td>
+ <td>String containing the name of the incoming interface (optional)</td>
+</tr>
+<tr>
+ <td><code>table</code></td>
+ <td>Number of the associated routing table (<code>0..65535</code>)</td>
+</tr>
+<tr>
+ <td><code>proto</code></td>
+ <td>Number of the associated routing protocol</td>
+</tr>
+<tr>
+ <td><code>scope</code></td>
+ <td>Number describing the scope of the route, most commonly
+ <code>0</code> for global or <code>253</code> for on-link</td>
+</tr>
+<tr>
+ <td><code>metric</code></td>
+ <td>Number describing the route metric (optional)</td>
+</tr>
+<tr>
+ <td><code>expires</code></td>
+ <td>Number of seconds the prefix is valid (IPv6 only, optional)</td>
+</tr>
+<tr>
+ <td><code>error</code></td>
+ <td>Route destination error code (optional)</td>
+</tr>
+</table>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#routes">
+ routes
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="routes"></a><strong>routes</strong>&nbsp;(filter, callback)</dt>
+<dd>
+
+
+Fetch all routes, optionally matching the given criteria.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ filter: <p>Table containing one or more of the possible filter
+criteria described below (optional)</p><table>
+<tr><th>Field</th><th>Description</th></tr>
+<tr><td><code>family</code></td><td>
+ Number describing the address family to return - <code>4</code> selects
+ IPv4 routes, <code>6</code> IPv6 ones. Any other value selects both.
+</td></tr>
+<tr><td><code>iif</code></td><td>
+ String containing the incoming route interface to match.
+</td></tr>
+<tr><td><code>oif</code></td><td>
+ String containing the outgoing route interface to match.
+</td></tr>
+<tr><td><code>type</code></td><td>
+ Numeric type to match, e.g. <code>1</code> for unicast.
+</td></tr>
+<tr><td><code>scope</code></td><td>
+ Numeric scope to match, e.g. <code>253</code> for onlink.
+</td></tr>
+<tr><td><code>proto</code></td><td>
+ Numeric protocol to match, e.g. <code>2</code> for boot.
+</td></tr>
+<tr><td><code>table</code></td><td>
+ Numeric routing table to match (<code>0..65535</code>).
+</td></tr>
+<tr><td><code>gw</code></td><td>
+ String containing the gateway address to match. Can be in any notation
+ specified by <code>luci.ip.new()</code>. Prefix matching is performed when
+ comparing the routes, e.g. "192.168.1.0/24" would select routes with gateway
+ addresses <code>192.168.1.1 .. 192.168.1.255</code>.
+</td></tr>
+<tr><td><code>dest</code></td><td>
+ String containing the destination to match. Prefix matching is performed.
+</td></tr>
+<tr><td><code>from</code></td><td>
+ String containing the source address to match. Prefix matching is performed.
+</td></tr>
+<tr><td><code>src</code></td><td>
+ String containing the preferred source address to match.
+ Prefix matching is performed.
+</td></tr>
+<tr><td><code>dest_exact</code></td><td>
+ String containing the destination to match. Exact matching is performed,
+ e.g. <code>dest = "0.0.0.0/0"</code> would match <em>any</em> IPv4 route
+ while <code>dest_exact = "0.0.0.0/0"</code> will <em>only</em> match the
+ default route.
+</td></tr>
+<tr><td><code>from_exact</code></td><td>
+ String containing the source address to match. Exact matching is performed.
+</td></tr>
+</table>
+ </li>
+
+ <li>
+ callback: <p>Callback function to invoke for each found route
+instead of returning one table of route objects (optional)</p>
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<ul>
+<li>Find all IPv4 default routes:
+<pre>luci.ip.routes({ dest_exact = "0.0.0.0/0" }, function(rt)
+ print(rt.type, rt.gw, rt.dev)
+end)</pre></li>
+<li>Find all global IPv6 prefixes on the current system:
+<pre>luci.ip.routes({ from = "2001::/7" }, function(rt)
+ print(rt.from)
+end)</pre></li>
+<li>Fetch all IPv4 routes:
+<pre>routes = luci.ip.routes({ family = 4 })
+for _, rt in ipairs(routes) do
+ print(rt.dest, rt.gw, rt.dev)
+end</pre></li>
+</ul>
+
+
+
+<h3>Return value:</h3>
+If no callback function is provided, a table of routes
+<a href="#routetable">as specified by <code>luci.ip.route()</code></a>
+is returned. If a callback function is given, it is invoked for each route
+and nothing is returned.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#route">
+ route
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="neighbors"></a><strong>neighbors</strong>&nbsp;(filter, callback)</dt>
+<dd>
+
+
+Fetches entries from the IPv4 ARP and IPv6 neighbour kernel table
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ filter: <p>Table containing one or more of the possible filter
+criteria described below (optional)</p><table>
+<tr><th>Field</th><th>Description</th></tr>
+<tr><td><code>family</code></td><td>
+ Number describing the address family to return - <code>4</code> selects
+ IPv4 ARP, <code>6</code> select IPv6 neighbour entries. Any other value
+ selects both.
+</td></tr>
+<tr><td><code>dev</code></td><td>
+ String containing the associated interface to match.
+</td></tr>
+<tr><td><code>dest</code></td><td>
+ String containing the associated address to match. Can be in any notation
+ specified by <code>luci.ip.new()</code>. Prefix matching is performed when
+ comparing the addresses, e.g. "192.168.1.0/24" would select ARP entries
+ for <code>192.168.1.1 .. 192.168.1.255</code>.
+</td></tr>
+<tr><td><code>mac</code></td><td>
+ String containing MAC address to match.
+</td></tr>
+</table>
+ </li>
+
+ <li>
+ callback: <p>Callback function to invoke for each found neighbour
+entry instead of returning one table of neighbour entries (optional)</p>
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<ul>
+<li>Find all ARP neighbours in the LAN:
+<pre>luci.ip.neighbors({ dest = "192.168.0.0/16" }, function(n)
+ print(n.dest, n.mac)
+end)</pre></li>
+<li>Find all active IPv6 addresses of host with given MAC:
+<pre>luci.ip.neighbors({ family = 6, mac = "00:21:63:75:aa:17" },
+ function(n)
+ print(n.dest)
+ end)</pre></li>
+</ul>
+
+
+
+<h3>Return value:</h3>
+If no callback function is provided, a table of neighbour entries
+is returned. If a callback function is given, it is invoked for each entry
+and nothing is returned.
+
+A neighbour entry is a table containing the following fields:
+
+<table>
+<tr><th>Field</th><th>Description</th></tr>
+<tr>
+ <td><code>family</code></td>
+ <td>Number containing the neighbour entry family, <code>4</code> for IPv4
+ ARP or <code>6</code> for IPv6 NDP</td>
+</tr>
+<tr>
+ <td><code>dev</code></td>
+ <td>String containing the associated device of the neighbour entry</td>
+</tr>
+<tr>
+ <td><code>dest</code></td>
+ <td>IP address <code>luci.ip.cidr</code> instance</td>
+</tr>
+<tr>
+ <td><code>mac</code></td>
+ <td>MAC address <code>luci.ip.cidr</code> instance</td>
+</tr>
+<tr>
+ <td><code>router</code></td>
+ <td>Boolean "true" if the neighbour entry is a router (IPv6, optional)</td>
+</tr>
+<tr>
+ <td><code>proxy</code></td>
+ <td>Boolean "true" if this is a proxy entry (optional)</td>
+</tr>
+<tr>
+ <td><code>incomplete</code></td>
+ <td>Boolean "true" if the entry is in incomplete state (optional)</td>
+</tr>
+<tr>
+ <td><code>reachable</code></td>
+ <td>Boolean "true" if the entry is in reachable state (optional)</td>
+</tr>
+<tr>
+ <td><code>stale</code></td>
+ <td>Boolean "true" if the entry is stale (optional)</td>
+</tr>
+<tr>
+ <td><code>delay</code></td>
+ <td>Boolean "true" if the entry is delayed (optional)</td>
+</tr>
+<tr>
+ <td><code>probe</code></td>
+ <td>Boolean "true" if the entry is in probe state (optional)</td>
+</tr>
+<tr>
+ <td><code>failed</code></td>
+ <td>Boolean "true" if the entry is in failed state (optional)</td>
+</tr>
+<tr>
+ <td><code>noarp</code></td>
+ <td>Boolean "true" if the entry is not caused by NDP or
+ ARP (optional)</td>
+</tr>
+<tr>
+ <td><code>permanent</code></td>
+ <td>Boolean "true" if the entry was statically configured from
+ userspace (optional)</td>
+</tr>
+</table>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="link"></a><strong>link</strong>&nbsp;(device)</dt>
+<dd>
+
+
+Fetch basic device information
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ device: String containing the network device to query
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<ul>
+<li>Test whether device br-lan exists:
+<pre>print(luci.ip.link("br-lan").name ~= nil)
+</pre></li>
+<li>Query MAC address of eth0:
+<pre>print(luci.ip.link("eth0").mac)
+</pre></li>
+</ul>
+
+
+
+<h3>Return value:</h3>
+If the given interface is found, a table containing the fields
+described below is returned, else an empty table.
+
+<table>
+<tr><th>Field</th><th>Description</th></tr>
+<tr>
+ <td><code>up</code></td>
+ <td>Boolean indicating whether the device is in IFF_RUNNING state</td>
+</tr>
+<tr>
+ <td><code>type</code></td>
+ <td>Numeric value indicating the type of the device, e.g. <code>1</code>
+ for ethernet.</td>
+</tr>
+<tr>
+ <td><code>name</code></td>
+ <td>String containing the name of the device</td>
+</tr>
+<tr>
+ <td><code>master</code></td>
+ <td>If queried device is a bridge port, string containing the name of
+ parent bridge device (optional)</td>
+</tr>
+<tr>
+ <td><code>mtu</code></td>
+ <td>Number containing the current MTU of the device</td>
+</tr>
+<tr>
+ <td><code>qlen</code></td>
+ <td>Number containing the TX queue length of the device</td>
+</tr>
+<tr>
+ <td><code>mac</code></td>
+ <td>MAC address <code>luci.ip.cidr</code> instance representing the device ethernet
+ address</td>
+</tr>
+</table>
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.json.html b/docs/api/modules/luci.json.html
new file mode 100644
index 000000000..db2d1da3f
--- /dev/null
+++ b/docs/api/modules/luci.json.html
@@ -0,0 +1,594 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li><strong>luci.json</strong></li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>luci.json</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#ActiveDecoder">ActiveDecoder</a>&nbsp;(customnull)</td>
+ <td class="summary">
+
+Create a new Active JSON-Decoder.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#ActiveDecoder.get">ActiveDecoder:get</a>&nbsp;()</td>
+ <td class="summary">
+
+Fetches one JSON-object from given source
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Decoder">Decoder</a>&nbsp;(customnull)</td>
+ <td class="summary">
+
+Create a new JSON-Decoder.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Decoder.get">Decoder:get</a>&nbsp;()</td>
+ <td class="summary">
+
+Get the decoded data packets after the rawdata has been sent to the sink.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Decoder.sink">Decoder:sink</a>&nbsp;()</td>
+ <td class="summary">
+
+Create an LTN12 sink from the decoder object which accepts the JSON-Data.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Encoder">Encoder</a>&nbsp;(data, buffersize, fastescape)</td>
+ <td class="summary">
+
+Create a new JSON-Encoder.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Encoder.source">Encoder:source</a>&nbsp;()</td>
+ <td class="summary">
+
+Create an LTN12 source providing the encoded JSON-Data.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#decode">decode</a>&nbsp;(json)</td>
+ <td class="summary">
+
+Directly decode a JSON string
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#encode">encode</a>&nbsp;(obj)</td>
+ <td class="summary">
+
+Direcly encode a Lua object into a JSON string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#null">null</a>&nbsp;()</td>
+ <td class="summary">
+
+Null replacement function
+ </td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="ActiveDecoder"></a><strong>ActiveDecoder</strong>&nbsp;(customnull)</dt>
+<dd>
+
+
+Create a new Active JSON-Decoder.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ customnull: Use luci.json.null instead of nil for decoding null
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Active JSON-Decoder
+
+
+
+</dd>
+
+
+
+
+<dt><a name="ActiveDecoder.get"></a><strong>ActiveDecoder:get</strong>&nbsp;()</dt>
+<dd>
+
+
+Fetches one JSON-object from given source
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Decoded object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Decoder"></a><strong>Decoder</strong>&nbsp;(customnull)</dt>
+<dd>
+
+
+Create a new JSON-Decoder.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ customnull: Use luci.json.null instead of nil for decoding null
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+JSON-Decoder
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Decoder.get"></a><strong>Decoder:get</strong>&nbsp;()</dt>
+<dd>
+
+
+Get the decoded data packets after the rawdata has been sent to the sink.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Decoded data
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Decoder.sink"></a><strong>Decoder:sink</strong>&nbsp;()</dt>
+<dd>
+
+
+Create an LTN12 sink from the decoder object which accepts the JSON-Data.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+LTN12 sink
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Encoder"></a><strong>Encoder</strong>&nbsp;(data, buffersize, fastescape)</dt>
+<dd>
+
+
+Create a new JSON-Encoder.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ data: Lua-Object to be encoded.
+ </li>
+
+ <li>
+ buffersize: Blocksize of returned data source.
+ </li>
+
+ <li>
+ fastescape: Use non-standard escaping (don't escape control chars)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+JSON-Encoder
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Encoder.source"></a><strong>Encoder:source</strong>&nbsp;()</dt>
+<dd>
+
+
+Create an LTN12 source providing the encoded JSON-Data.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+LTN12 source
+
+
+
+</dd>
+
+
+
+
+<dt><a name="decode"></a><strong>decode</strong>&nbsp;(json)</dt>
+<dd>
+
+
+Directly decode a JSON string
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ json: JSON-String
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Lua object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="encode"></a><strong>encode</strong>&nbsp;(obj)</dt>
+<dd>
+
+
+Direcly encode a Lua object into a JSON string.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ obj: Lua Object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+JSON string
+
+
+
+</dd>
+
+
+
+
+<dt><a name="null"></a><strong>null</strong>&nbsp;()</dt>
+<dd>
+
+
+Null replacement function
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+null
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.jsonc.html b/docs/api/modules/luci.jsonc.html
new file mode 100644
index 000000000..79deb933d
--- /dev/null
+++ b/docs/api/modules/luci.jsonc.html
@@ -0,0 +1,393 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li><strong>luci.jsonc</strong></li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.jsonc</code></h1>
+
+<p>
+ LuCI JSON parsing and serialization library.
+ The luci.jsonc class is a high level Lua binding to the JSON-C library to
+ allow reading and writing JSON data with minimal overhead.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#new">new</a>&nbsp;()</td>
+ <td class="summary">
+
+Construct a new luci.jsonc.parser instance.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#parse">parse</a>&nbsp;(json)</td>
+ <td class="summary">
+
+Parse a complete JSON string and convert it into a Lua data structure.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#stringify">stringify</a>&nbsp;(data, pretty)</td>
+ <td class="summary">
+
+Convert given Lua data into a JSON string.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="new"></a><strong>new</strong>&nbsp;()</dt>
+<dd>
+
+
+Construct a new luci.jsonc.parser instance.
+
+
+
+
+
+<h3>Usage:</h3>
+<code>parser = luci.jsonc.new()</code>
+
+
+
+<h3>Return value:</h3>
+A <code>luci.jsonc.parser</code> object representing a JSON-C tokener.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="parse"></a><strong>parse</strong>&nbsp;(json)</dt>
+<dd>
+
+
+Parse a complete JSON string and convert it into a Lua data structure.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ json: A string containing the JSON data to parse, must be either a
+ JSON array or a JSON object.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>data = luci.jsonc.parse('{ "name": "John", "age": 34 }')
+print(data.name) -- "John"</pre>
+
+
+
+<h3>Return value:</h3>
+On success, a table containing the parsed JSON data is returned, on
+ failure the function returns <code>nil</code> and a string containing the reason of
+ the parse error.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#stringify">
+ stringify
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="stringify"></a><strong>stringify</strong>&nbsp;(data, pretty)</dt>
+<dd>
+
+
+Convert given Lua data into a JSON string.
+
+This function recursively converts the given Lua data into a JSON string,
+ignoring any unsupported data. Lua tables are converted into JSON arrays if they
+only contain integer keys, mixed tables are turned into JSON objects with any
+existing numeric keys converted into strings.
+
+Lua functions, coroutines and userdata objects are ignored and Lua numbers are
+converted to integers if they do not contain fractional values.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ data: The Lua data to convert, can be a table, string, boolean or number.
+ </li>
+
+ <li>
+ pretty: A boolean value indicating whether the resulting JSON should be
+ pretty printed.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>json = luci.jsonc.stringify({ item = true, values = { 1, 2, 3 } })
+print(json) -- '{"item":true,"values":[1,2,3]}'</pre>
+
+
+
+<h3>Return value:</h3>
+Returns a string containing the JSON representation of the given Lua
+ data.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#parse">
+ parse
+ </a>
+
+</ul>
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.jsonc.parser.html b/docs/api/modules/luci.jsonc.parser.html
new file mode 100644
index 000000000..709cb9afc
--- /dev/null
+++ b/docs/api/modules/luci.jsonc.parser.html
@@ -0,0 +1,491 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li><strong>luci.jsonc.parser</strong></li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>luci.jsonc.parser</code></h1>
+
+<p>
+ LuCI JSON parser instance.
+ A JSON parser instance is useful to parse JSON data chunk by chunk, without
+ the need to assemble all data in advance.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#parser.parse">parser:parse</a>&nbsp;(json)</td>
+ <td class="summary">
+
+Parses one chunk of JSON data.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#parser.get">parser:get</a>&nbsp;()</td>
+ <td class="summary">
+
+Convert parsed JSON data into Lua table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#parser.set">parser:set</a>&nbsp;(data)</td>
+ <td class="summary">
+
+Put Lua data into the parser.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#parser.sink">parser:sink</a>&nbsp;()</td>
+ <td class="summary">
+
+Generate an ltn12-compatible sink.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#parser.stringify">parser:stringify</a>&nbsp;(pretty)</td>
+ <td class="summary">
+
+Serialize current parser state as JSON.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="parser.parse"></a><strong>parser:parse</strong>&nbsp;(json)</dt>
+<dd>
+
+
+Parses one chunk of JSON data.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ json: String containing the JSON fragment to parse
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>parser = luci.jsonc.new()
+
+while true do
+ chunk = ... -- fetch a cunk of data, e.g. from a socket
+ finish, errmsg = <b>parser.parse(chunk)</b>
+
+ if finish == nil then
+ error("Cannot parse JSON: " .. errmsg)
+ end
+
+ if finish == true then
+ break
+ end
+end</pre>
+
+
+
+<h3>Return value:</h3>
+<ul>
+ <li><code>true</code> if a complete JSON object has been parsed and no further input is
+ expected.</li>
+ <li><code>false</code> if further input is required</li>
+ <li><code>nil</code> if an error was encountered while parsing the current chunk.
+ In this case a string describing the parse error is returned as second
+ value.</li></ul>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#parser.get">
+ parser:get
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="parser.get"></a><strong>parser:get</strong>&nbsp;()</dt>
+<dd>
+
+
+Convert parsed JSON data into Lua table.
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>parser = luci.jsonc.new()
+parser:parse('{ "example": "test" }')
+
+data = parser:get()
+print(data.example) -- "test"</pre>
+
+
+
+<h3>Return value:</h3>
+Parsed JSON object converted into a Lua table or <code>nil</code> if the parser
+ didn't finish or encountered an error.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#parser.parse">
+ parser:parse
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="parser.set"></a><strong>parser:set</strong>&nbsp;(data)</dt>
+<dd>
+
+
+Put Lua data into the parser.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ data: Lua data to put into the parser object. The data is converted to an
+ internal JSON representation that can be dumped with <code>stringify()</code>.
+ The conversion follows the rules described in <code>luci.jsonc.stringify</code>.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>parser = luci.jsonc.new()
+parser:set({ "some", "data" })</pre>
+
+
+
+<h3>Return value:</h3>
+Nothing is returned.
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#parser.stringify">
+ parser:stringify
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="parser.sink"></a><strong>parser:sink</strong>&nbsp;()</dt>
+<dd>
+
+
+Generate an ltn12-compatible sink.
+
+
+
+
+
+
+<h3>Usage:</h3>
+<pre>parser = luci.jsonc.new()
+ltn12.pump.all(ltn12.source.file(io.input()), parser:sink())
+print(parser:get())</pre>
+
+
+
+<h3>Return value:</h3>
+Returns a function that can be used as an ltn12 sink.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="parser.stringify"></a><strong>parser:stringify</strong>&nbsp;(pretty)</dt>
+<dd>
+
+
+Serialize current parser state as JSON.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pretty: A boolean value indicating whether the resulting JSON should be pretty printed.
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+<pre>parser = luci.jsonc.new()
+parser:parse('{ "example": "test" }')
+print(parser:serialize()) -- '{"example":"test"}'</pre>
+
+
+
+<h3>Return value:</h3>
+Returns the serialized JSON data of this parser instance.
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.model.ipkg.html b/docs/api/modules/luci.model.ipkg.html
new file mode 100644
index 000000000..a0af3187b
--- /dev/null
+++ b/docs/api/modules/luci.model.ipkg.html
@@ -0,0 +1,730 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li><strong>luci.model.ipkg</strong></li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.model.ipkg</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#compare_versions">compare_versions</a>&nbsp;(ver1, ver2, comp)</td>
+ <td class="summary">
+
+lua version of opkg compare-versions
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#find">find</a>&nbsp;(pat, cb)</td>
+ <td class="summary">
+
+Find packages that match the given pattern.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#info">info</a>&nbsp;(pkg)</td>
+ <td class="summary">
+
+Return information about installed and available packages.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#install">install</a>&nbsp;(...)</td>
+ <td class="summary">
+
+Install one or more packages.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#installed">installed</a>&nbsp;(pkg)</td>
+ <td class="summary">
+
+Determine whether a given package is installed.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#list_all">list_all</a>&nbsp;(pat, cb)</td>
+ <td class="summary">
+
+List all packages known to opkg.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#list_installed">list_installed</a>&nbsp;(pat, cb)</td>
+ <td class="summary">
+
+List installed packages.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#overlay_root">overlay_root</a>&nbsp;()</td>
+ <td class="summary">
+
+Determines the overlay root used by opkg.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#remove">remove</a>&nbsp;(...)</td>
+ <td class="summary">
+
+Remove one or more packages.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#status">status</a>&nbsp;(pkg)</td>
+ <td class="summary">
+
+Return the package status of one or more packages.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#update">update</a>&nbsp;()</td>
+ <td class="summary">
+
+Update package lists.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#upgrade">upgrade</a>&nbsp;()</td>
+ <td class="summary">
+
+Upgrades all installed packages.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="compare_versions"></a><strong>compare_versions</strong>&nbsp;(ver1, ver2, comp)</dt>
+<dd>
+
+
+lua version of opkg compare-versions
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ver1: string version 1
+ </li>
+
+ <li>
+ ver2: string version 2
+ </li>
+
+ <li>
+ comp: string compare versions using
+ "<=" or "<" lower-equal
+ ">" or ">=" greater-equal
+ "=" equal
+ "<<" lower
+ ">>" greater
+ "~=" not equal
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating the status of the compare
+
+
+
+</dd>
+
+
+
+
+<dt><a name="find"></a><strong>find</strong>&nbsp;(pat, cb)</dt>
+<dd>
+
+
+Find packages that match the given pattern.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pat: Find packages whose names or descriptions match this pattern, nil results in zero results
+ </li>
+
+ <li>
+ cb: Callback function invoked for each patckage, receives name, version and description as arguments
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+nothing
+
+
+
+</dd>
+
+
+
+
+<dt><a name="info"></a><strong>info</strong>&nbsp;(pkg)</dt>
+<dd>
+
+
+Return information about installed and available packages.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pkg: Limit output to a (set of) packages
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing package information
+
+
+
+</dd>
+
+
+
+
+<dt><a name="install"></a><strong>install</strong>&nbsp;(...)</dt>
+<dd>
+
+
+Install one or more packages.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ...: List of packages to install
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating the status of the action
+
+ <li>OPKG return code, STDOUT and STDERR
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="installed"></a><strong>installed</strong>&nbsp;(pkg)</dt>
+<dd>
+
+
+Determine whether a given package is installed.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pkg: Package
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean
+
+
+
+</dd>
+
+
+
+
+<dt><a name="list_all"></a><strong>list_all</strong>&nbsp;(pat, cb)</dt>
+<dd>
+
+
+List all packages known to opkg.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pat: Only find packages matching this pattern, nil lists all packages
+ </li>
+
+ <li>
+ cb: Callback function invoked for each package, receives name, version and description as arguments
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+nothing
+
+
+
+</dd>
+
+
+
+
+<dt><a name="list_installed"></a><strong>list_installed</strong>&nbsp;(pat, cb)</dt>
+<dd>
+
+
+List installed packages.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pat: Only find packages matching this pattern, nil lists all packages
+ </li>
+
+ <li>
+ cb: Callback function invoked for each package, receives name, version and description as arguments
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+nothing
+
+
+
+</dd>
+
+
+
+
+<dt><a name="overlay_root"></a><strong>overlay_root</strong>&nbsp;()</dt>
+<dd>
+
+
+Determines the overlay root used by opkg.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the directory path of the overlay root.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="remove"></a><strong>remove</strong>&nbsp;(...)</dt>
+<dd>
+
+
+Remove one or more packages.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ...: List of packages to install
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating the status of the action
+
+ <li>OPKG return code, STDOUT and STDERR
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="status"></a><strong>status</strong>&nbsp;(pkg)</dt>
+<dd>
+
+
+Return the package status of one or more packages.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pkg: Limit output to a (set of) packages
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing package status information
+
+
+
+</dd>
+
+
+
+
+<dt><a name="update"></a><strong>update</strong>&nbsp;()</dt>
+<dd>
+
+
+Update package lists.
+
+
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating the status of the action
+
+ <li>OPKG return code, STDOUT and STDERR
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="upgrade"></a><strong>upgrade</strong>&nbsp;()</dt>
+<dd>
+
+
+Upgrades all installed packages.
+
+
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating the status of the action
+
+ <li>OPKG return code, STDOUT and STDERR
+
+</ol>
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.model.uci.html b/docs/api/modules/luci.model.uci.html
new file mode 100644
index 000000000..c1eaf5f81
--- /dev/null
+++ b/docs/api/modules/luci.model.uci.html
@@ -0,0 +1,1631 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li><strong>luci.model.uci</strong></li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>luci.model.uci</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.add">Cursor:add</a>&nbsp;(config, type)</td>
+ <td class="summary">
+
+Add an anonymous section.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.apply">Cursor:apply</a>&nbsp;(rollback)</td>
+ <td class="summary">
+
+Applies UCI configuration changes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.changes">Cursor:changes</a>&nbsp;(config)</td>
+ <td class="summary">
+
+Get a table of saved but uncommitted changes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.commit">Cursor:commit</a>&nbsp;(config)</td>
+ <td class="summary">
+
+Commit saved changes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.confirm">Cursor:confirm</a>&nbsp;()</td>
+ <td class="summary">
+
+Confirms UCI apply process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.delete">Cursor:delete</a>&nbsp;(config, section, option)</td>
+ <td class="summary">
+
+Deletes a section or an option.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.delete_all">Cursor:delete_all</a>&nbsp;(config, type, comparator)</td>
+ <td class="summary">
+
+Delete all sections of a given type that match certain criteria.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.foreach">Cursor:foreach</a>&nbsp;(config, type, callback)</td>
+ <td class="summary">
+
+Call a function for every section of a certain type.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.get">Cursor:get</a>&nbsp;(config, section, option)</td>
+ <td class="summary">
+
+Get a section type or an option
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.get_all">Cursor:get_all</a>&nbsp;(config, section)</td>
+ <td class="summary">
+
+Get all sections of a config or all values of a section.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.get_bool">Cursor:get_bool</a>&nbsp;(config, section, option)</td>
+ <td class="summary">
+
+Get a boolean option and return it's value as true or false.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.get_confdir">Cursor:get_confdir</a>&nbsp;()</td>
+ <td class="summary">
+
+Get the configuration directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.get_first">Cursor:get_first</a>&nbsp;(config, type, option, default)</td>
+ <td class="summary">
+
+Get the given option from the first section with the given type.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.get_list">Cursor:get_list</a>&nbsp;(config, section, option)</td>
+ <td class="summary">
+
+Get an option or list and return values as table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.get_savedir">Cursor:get_savedir</a>&nbsp;()</td>
+ <td class="summary">
+
+Get the directory for uncomitted changes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.get_session_id">Cursor:get_session_id</a>&nbsp;()</td>
+ <td class="summary">
+
+Get the effective session ID.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.load">Cursor:load</a>&nbsp;(config)</td>
+ <td class="summary">
+
+Manually load a config.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.revert">Cursor:revert</a>&nbsp;(config)</td>
+ <td class="summary">
+
+Revert saved but uncommitted changes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.rollback">Cursor:rollback</a>&nbsp;()</td>
+ <td class="summary">
+
+Cancels UCI apply process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.rollback_pending">Cursor:rollback_pending</a>&nbsp;()</td>
+ <td class="summary">
+
+Checks whether a pending rollback is scheduled.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.save">Cursor:save</a>&nbsp;(config)</td>
+ <td class="summary">
+
+Saves changes made to a config to make them committable.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.section">Cursor:section</a>&nbsp;(config, type, name, values)</td>
+ <td class="summary">
+
+Create a new section and initialize it with data.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.set">Cursor:set</a>&nbsp;(config, section, option, value)</td>
+ <td class="summary">
+
+Set a value or create a named section.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.set_confdir">Cursor:set_confdir</a>&nbsp;(directory)</td>
+ <td class="summary">
+
+Set the configuration directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.set_list">Cursor:set_list</a>&nbsp;(config, section, option, value)</td>
+ <td class="summary">
+
+Set given values as list.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.set_savedir">Cursor:set_savedir</a>&nbsp;(directory)</td>
+ <td class="summary">
+
+Set the directory for uncommitted changes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.set_session_id">Cursor:set_session_id</a>&nbsp;(id)</td>
+ <td class="summary">
+
+Set the effective session ID.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.substate">Cursor:substate</a>&nbsp;()</td>
+ <td class="summary">
+
+Create a sub-state of this cursor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.tset">Cursor:tset</a>&nbsp;(config, section, values)</td>
+ <td class="summary">
+
+Updated the data of a section using data from a table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Cursor.unload">Cursor:unload</a>&nbsp;(config)</td>
+ <td class="summary">
+
+Discard changes made to a config.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cursor">cursor</a>&nbsp;()</td>
+ <td class="summary">
+
+Create a new UCI-Cursor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cursor_state">cursor_state</a>&nbsp;()</td>
+ <td class="summary">
+
+Create a new Cursor initialized to the state directory.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="Cursor.add"></a><strong>Cursor:add</strong>&nbsp;(config, type)</dt>
+<dd>
+
+
+Add an anonymous section.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ type: UCI section type
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Name of created section
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.apply"></a><strong>Cursor:apply</strong>&nbsp;(rollback)</dt>
+<dd>
+
+
+Applies UCI configuration changes.
+
+If the rollback parameter is set to true, the apply function will invoke the
+rollback mechanism which causes the configuration to be automatically reverted
+if no confirm() call occurs within a certain timeout.
+
+The current default timeout is 30s and can be increased using the
+"luci.apply.timeout" uci configuration key.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ rollback: Enable rollback mechanism
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.changes"></a><strong>Cursor:changes</strong>&nbsp;(config)</dt>
+<dd>
+
+
+Get a table of saved but uncommitted changes.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of changes
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Cursor.save">
+ Cursor:save
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.commit"></a><strong>Cursor:commit</strong>&nbsp;(config)</dt>
+<dd>
+
+
+Commit saved changes.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Cursor.revert">
+ Cursor:revert
+ </a>
+
+ <li><a href="#Cursor.save">
+ Cursor:save
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.confirm"></a><strong>Cursor:confirm</strong>&nbsp;()</dt>
+<dd>
+
+
+Confirms UCI apply process.
+
+If a previous UCI apply with rollback has been invoked using apply(true),
+this function confirms the process and cancels the pending rollback timer.
+
+If no apply with rollback session is active, the function has no effect and
+returns with a "No data" error.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.delete"></a><strong>Cursor:delete</strong>&nbsp;(config, section, option)</dt>
+<dd>
+
+
+Deletes a section or an option.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name
+ </li>
+
+ <li>
+ option: UCI option (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.delete_all"></a><strong>Cursor:delete_all</strong>&nbsp;(config, type, comparator)</dt>
+<dd>
+
+
+Delete all sections of a given type that match certain criteria.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ type: UCI section type
+ </li>
+
+ <li>
+ comparator: Function that will be called for each section and returns
+ a boolean whether to delete the current section (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.foreach"></a><strong>Cursor:foreach</strong>&nbsp;(config, type, callback)</dt>
+<dd>
+
+
+Call a function for every section of a certain type.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ type: UCI section type
+ </li>
+
+ <li>
+ callback: Function to be called
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.get"></a><strong>Cursor:get</strong>&nbsp;(config, section, option)</dt>
+<dd>
+
+
+Get a section type or an option
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name
+ </li>
+
+ <li>
+ option: UCI option (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+UCI value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.get_all"></a><strong>Cursor:get_all</strong>&nbsp;(config, section)</dt>
+<dd>
+
+
+Get all sections of a config or all values of a section.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of UCI sections or table of UCI values
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.get_bool"></a><strong>Cursor:get_bool</strong>&nbsp;(config, section, option)</dt>
+<dd>
+
+
+Get a boolean option and return it's value as true or false.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name
+ </li>
+
+ <li>
+ option: UCI option
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.get_confdir"></a><strong>Cursor:get_confdir</strong>&nbsp;()</dt>
+<dd>
+
+
+Get the configuration directory.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Configuration directory
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.get_first"></a><strong>Cursor:get_first</strong>&nbsp;(config, type, option, default)</dt>
+<dd>
+
+
+Get the given option from the first section with the given type.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ type: UCI section type
+ </li>
+
+ <li>
+ option: UCI option (optional)
+ </li>
+
+ <li>
+ default: Default value (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+UCI value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.get_list"></a><strong>Cursor:get_list</strong>&nbsp;(config, section, option)</dt>
+<dd>
+
+
+Get an option or list and return values as table.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name
+ </li>
+
+ <li>
+ option: UCI option
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+table. If the option was not found, you will simply get an empty
+ table.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.get_savedir"></a><strong>Cursor:get_savedir</strong>&nbsp;()</dt>
+<dd>
+
+
+Get the directory for uncomitted changes.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Save directory
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.get_session_id"></a><strong>Cursor:get_session_id</strong>&nbsp;()</dt>
+<dd>
+
+
+Get the effective session ID.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the session ID
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.load"></a><strong>Cursor:load</strong>&nbsp;(config)</dt>
+<dd>
+
+
+Manually load a config.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Cursor.save">
+ Cursor:save
+ </a>
+
+ <li><a href="#Cursor.unload">
+ Cursor:unload
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.revert"></a><strong>Cursor:revert</strong>&nbsp;(config)</dt>
+<dd>
+
+
+Revert saved but uncommitted changes.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Cursor.commit">
+ Cursor:commit
+ </a>
+
+ <li><a href="#Cursor.save">
+ Cursor:save
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.rollback"></a><strong>Cursor:rollback</strong>&nbsp;()</dt>
+<dd>
+
+
+Cancels UCI apply process.
+
+If a previous UCI apply with rollback has been invoked using apply(true),
+this function cancels the process and rolls back the configuration to the
+pre-apply state.
+
+If no apply with rollback session is active, the function has no effect and
+returns with a "No data" error.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.rollback_pending"></a><strong>Cursor:rollback_pending</strong>&nbsp;()</dt>
+<dd>
+
+
+Checks whether a pending rollback is scheduled.
+
+If a previous UCI apply with rollback has been invoked using apply(true),
+and has not been confirmed or rolled back yet, this function returns true
+and the remaining time until rollback in seconds. If no rollback is pending,
+the function returns false. On error, the function returns false and an
+additional string describing the error.
+
+
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean whether rollback is pending
+
+ <li>Remaining time in seconds
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.save"></a><strong>Cursor:save</strong>&nbsp;(config)</dt>
+<dd>
+
+
+Saves changes made to a config to make them committable.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Cursor.load">
+ Cursor:load
+ </a>
+
+ <li><a href="#Cursor.unload">
+ Cursor:unload
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.section"></a><strong>Cursor:section</strong>&nbsp;(config, type, name, values)</dt>
+<dd>
+
+
+Create a new section and initialize it with data.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ type: UCI section type
+ </li>
+
+ <li>
+ name: UCI section name (optional)
+ </li>
+
+ <li>
+ values: Table of key - value pairs to initialize the section with
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Name of created section
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.set"></a><strong>Cursor:set</strong>&nbsp;(config, section, option, value)</dt>
+<dd>
+
+
+Set a value or create a named section.
+
+When invoked with three arguments <code>config</code>, <code>sectionname</code>, <code>sectiontype</code>,
+then a named section of the given type is created.
+
+When invoked with four arguments <code>config</code>, <code>sectionname</code>, <code>optionname</code> and
+<code>optionvalue</code> then the value of the specified option is set to the given value.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name
+ </li>
+
+ <li>
+ option: UCI option or UCI section type
+ </li>
+
+ <li>
+ value: UCI value or nothing if you want to create a section
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.set_confdir"></a><strong>Cursor:set_confdir</strong>&nbsp;(directory)</dt>
+<dd>
+
+
+Set the configuration directory.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ directory: UCI configuration directory
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.set_list"></a><strong>Cursor:set_list</strong>&nbsp;(config, section, option, value)</dt>
+<dd>
+
+
+Set given values as list. Setting a list option to an empty list
+has the same effect as deleting the option.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name
+ </li>
+
+ <li>
+ option: UCI option
+ </li>
+
+ <li>
+ value: Value or table. Non-table values will be set as single
+ item UCI list.
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.set_savedir"></a><strong>Cursor:set_savedir</strong>&nbsp;(directory)</dt>
+<dd>
+
+
+Set the directory for uncommitted changes.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ directory: UCI changes directory
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.set_session_id"></a><strong>Cursor:set_session_id</strong>&nbsp;(id)</dt>
+<dd>
+
+
+Set the effective session ID.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ id: String containing the session ID to set
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.substate"></a><strong>Cursor:substate</strong>&nbsp;()</dt>
+<dd>
+
+
+Create a sub-state of this cursor.
+
+The sub-state is tied to the parent cursor, means it the parent unloads or
+loads configs, the sub state will do so as well.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+UCI state cursor tied to the parent cursor
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.tset"></a><strong>Cursor:tset</strong>&nbsp;(config, section, values)</dt>
+<dd>
+
+
+Updated the data of a section using data from a table.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+ <li>
+ section: UCI section name (optional)
+ </li>
+
+ <li>
+ values: Table of key - value pairs to update the section with
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Cursor.unload"></a><strong>Cursor:unload</strong>&nbsp;(config)</dt>
+<dd>
+
+
+Discard changes made to a config.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ config: UCI config
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean whether operation succeeded
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Cursor.load">
+ Cursor:load
+ </a>
+
+ <li><a href="#Cursor.save">
+ Cursor:save
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="cursor"></a><strong>cursor</strong>&nbsp;()</dt>
+<dd>
+
+
+Create a new UCI-Cursor.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+UCI-Cursor
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cursor_state"></a><strong>cursor_state</strong>&nbsp;()</dt>
+<dd>
+
+
+Create a new Cursor initialized to the state directory.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+UCI cursor
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.rpcc.html b/docs/api/modules/luci.rpcc.html
new file mode 100644
index 000000000..18065788b
--- /dev/null
+++ b/docs/api/modules/luci.rpcc.html
@@ -0,0 +1,324 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li><strong>luci.rpcc</strong></li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>luci.rpcc</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#Client.proxy">Client:proxy</a>&nbsp;(prefix)</td>
+ <td class="summary">
+
+Create a transparent RPC proxy.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Client.request">Client:request</a>&nbsp;(method, params, notification)</td>
+ <td class="summary">
+
+Request an RP call and get the response.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="Client.proxy"></a><strong>Client:proxy</strong>&nbsp;(prefix)</dt>
+<dd>
+
+
+Create a transparent RPC proxy.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ prefix: Method prefix
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+RPC Proxy object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Client.request"></a><strong>Client:request</strong>&nbsp;(method, params, notification)</dt>
+<dd>
+
+
+Request an RP call and get the response.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ method: Remote method
+ </li>
+
+ <li>
+ params: Parameters
+ </li>
+
+ <li>
+ notification: Notification only?
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+response
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.rpcc.ruci.html b/docs/api/modules/luci.rpcc.ruci.html
new file mode 100644
index 000000000..7348f1932
--- /dev/null
+++ b/docs/api/modules/luci.rpcc.ruci.html
@@ -0,0 +1,277 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li><strong>luci.rpcc.ruci</strong></li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>luci.rpcc.ruci</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#factory">factory</a>&nbsp;(rpccl)</td>
+ <td class="summary">
+
+Create a new UCI over RPC proxy.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="factory"></a><strong>factory</strong>&nbsp;(rpccl)</dt>
+<dd>
+
+
+Create a new UCI over RPC proxy.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ rpccl: RPC client
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Network transparent UCI module
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.sys.html b/docs/api/modules/luci.sys.html
new file mode 100644
index 000000000..b86d280fb
--- /dev/null
+++ b/docs/api/modules/luci.sys.html
@@ -0,0 +1,641 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li><strong>luci.sys</strong></li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.sys</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#call">call</a>&nbsp;(...)</td>
+ <td class="summary">
+
+Execute a given shell command and return the error code
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#dmesg">dmesg</a>&nbsp;()</td>
+ <td class="summary">
+
+Retrieves the output of the "dmesg" command.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#exec">exec</a>&nbsp;(command)</td>
+ <td class="summary">
+
+Execute a given shell command and capture its standard output
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#getenv">getenv</a>&nbsp;(var)</td>
+ <td class="summary">
+
+Retrieve environment variables.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#hostname">hostname</a>&nbsp;(String)</td>
+ <td class="summary">
+
+Get or set the current hostname.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#httpget">httpget</a>&nbsp;(url, stream, target)</td>
+ <td class="summary">
+
+Returns the contents of a documented referred by an URL.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#mounts">mounts</a>&nbsp;()</td>
+ <td class="summary">
+
+Retrieve information about currently mounted file systems.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#reboot">reboot</a>&nbsp;()</td>
+ <td class="summary">
+
+Initiate a system reboot.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#syslog">syslog</a>&nbsp;()</td>
+ <td class="summary">
+
+Retrieves the output of the "logread" command.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#uniqueid">uniqueid</a>&nbsp;(bytes)</td>
+ <td class="summary">
+
+Generates a random id with specified length.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#uptime">uptime</a>&nbsp;()</td>
+ <td class="summary">
+
+Returns the current system uptime stats.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="call"></a><strong>call</strong>&nbsp;(...)</dt>
+<dd>
+
+
+Execute a given shell command and return the error code
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ...: Command to call
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Error code of the command
+
+
+
+</dd>
+
+
+
+
+<dt><a name="dmesg"></a><strong>dmesg</strong>&nbsp;()</dt>
+<dd>
+
+
+Retrieves the output of the "dmesg" command.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the current log buffer
+
+
+
+</dd>
+
+
+
+
+<dt><a name="exec"></a><strong>exec</strong>&nbsp;(command)</dt>
+<dd>
+
+
+Execute a given shell command and capture its standard output
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ command: Command to call
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the return the output of the command
+
+
+
+</dd>
+
+
+
+
+<dt><a name="getenv"></a><strong>getenv</strong>&nbsp;(var)</dt>
+<dd>
+
+
+Retrieve environment variables. If no variable is given then a table
+
+containing the whole environment is returned otherwise this function returns
+the corresponding string value for the given name or nil if no such variable
+exists.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ var: Name of the environment variable to retrieve (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>String containing the value of the specified variable
+
+ <li>Table containing all variables if no variable name is given
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="hostname"></a><strong>hostname</strong>&nbsp;(String)</dt>
+<dd>
+
+
+Get or set the current hostname.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ String: containing a new hostname to set (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the system hostname
+
+
+
+</dd>
+
+
+
+
+<dt><a name="httpget"></a><strong>httpget</strong>&nbsp;(url, stream, target)</dt>
+<dd>
+
+
+Returns the contents of a documented referred by an URL.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ url: The URL to retrieve
+ </li>
+
+ <li>
+ stream: Return a stream instead of a buffer
+ </li>
+
+ <li>
+ target: Directly write to target file name
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the contents of given the URL
+
+
+
+</dd>
+
+
+
+
+<dt><a name="mounts"></a><strong>mounts</strong>&nbsp;()</dt>
+<dd>
+
+
+Retrieve information about currently mounted file systems.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing mount information
+
+
+
+</dd>
+
+
+
+
+<dt><a name="reboot"></a><strong>reboot</strong>&nbsp;()</dt>
+<dd>
+
+
+Initiate a system reboot.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Return value of os.execute()
+
+
+
+</dd>
+
+
+
+
+<dt><a name="syslog"></a><strong>syslog</strong>&nbsp;()</dt>
+<dd>
+
+
+Retrieves the output of the "logread" command.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the current log buffer
+
+
+
+</dd>
+
+
+
+
+<dt><a name="uniqueid"></a><strong>uniqueid</strong>&nbsp;(bytes)</dt>
+<dd>
+
+
+Generates a random id with specified length.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ bytes: Number of bytes for the unique id
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing hex encoded id
+
+
+
+</dd>
+
+
+
+
+<dt><a name="uptime"></a><strong>uptime</strong>&nbsp;()</dt>
+<dd>
+
+
+Returns the current system uptime stats.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing total uptime in seconds
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.sys.init.html b/docs/api/modules/luci.sys.init.html
new file mode 100644
index 000000000..e2c51f953
--- /dev/null
+++ b/docs/api/modules/luci.sys.init.html
@@ -0,0 +1,512 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li><strong>luci.sys.init</strong></li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.sys.init</code></h1>
+
+<p>
+
+LuCI system utilities / init related functions.
+</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#init.disable">disable</a>&nbsp;(name)</td>
+ <td class="summary">
+
+Disable the given init script
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#init.enable">enable</a>&nbsp;(name)</td>
+ <td class="summary">
+
+Enable the given init script
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#init.enabled">enabled</a>&nbsp;(name)</td>
+ <td class="summary">
+
+Test whether the given init script is enabled
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#init.index">index</a>&nbsp;(name)</td>
+ <td class="summary">
+
+Get the index of he given init script
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#init.names">names</a>&nbsp;()</td>
+ <td class="summary">
+
+Get the names of all installed init scripts
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#init.start">start</a>&nbsp;(name)</td>
+ <td class="summary">
+
+Start the given init script
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#init.stop">stop</a>&nbsp;(name)</td>
+ <td class="summary">
+
+Stop the given init script
+ </td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="init.disable"></a><strong>disable</strong>&nbsp;(name)</dt>
+<dd>
+
+
+Disable the given init script
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Name of the init script
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating success
+
+
+
+</dd>
+
+
+
+
+<dt><a name="init.enable"></a><strong>enable</strong>&nbsp;(name)</dt>
+<dd>
+
+
+Enable the given init script
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Name of the init script
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating success
+
+
+
+</dd>
+
+
+
+
+<dt><a name="init.enabled"></a><strong>enabled</strong>&nbsp;(name)</dt>
+<dd>
+
+
+Test whether the given init script is enabled
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Name of the init script
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating whether init is enabled
+
+
+
+</dd>
+
+
+
+
+<dt><a name="init.index"></a><strong>index</strong>&nbsp;(name)</dt>
+<dd>
+
+
+Get the index of he given init script
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Name of the init script
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Numeric index value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="init.names"></a><strong>names</strong>&nbsp;()</dt>
+<dd>
+
+
+Get the names of all installed init scripts
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing the names of all inistalled init scripts
+
+
+
+</dd>
+
+
+
+
+<dt><a name="init.start"></a><strong>start</strong>&nbsp;(name)</dt>
+<dd>
+
+
+Start the given init script
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Name of the init script
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating success
+
+
+
+</dd>
+
+
+
+
+<dt><a name="init.stop"></a><strong>stop</strong>&nbsp;(name)</dt>
+<dd>
+
+
+Stop the given init script
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: Name of the init script
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating success
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.sys.iptparser.html b/docs/api/modules/luci.sys.iptparser.html
new file mode 100644
index 000000000..5928281cf
--- /dev/null
+++ b/docs/api/modules/luci.sys.iptparser.html
@@ -0,0 +1,462 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li><strong>luci.sys.iptparser</strong></li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>luci.sys.iptparser</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#IptParser">IptParser</a>&nbsp;(family)</td>
+ <td class="summary">
+
+Create a new iptables parser object.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#IptParser.chain">IptParser:chain</a>&nbsp;(table, chain)</td>
+ <td class="summary">
+
+Return the given firewall chain within the given table name.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#IptParser.chains">IptParser:chains</a>&nbsp;(table)</td>
+ <td class="summary">
+
+Find the names of all chains within the given table name.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#IptParser.is_custom_target">IptParser:is_custom_target</a>&nbsp;(target)</td>
+ <td class="summary">
+
+Test whether the given target points to a custom chain.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#IptParser.resync">IptParser:resync</a>&nbsp;()</td>
+ <td class="summary">
+
+Rebuild the internal lookup table, for example when rules have changed
+
+through external commands.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#IptParser.tables">IptParser:tables</a>&nbsp;()</td>
+ <td class="summary">
+
+Find the names of all tables.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="IptParser"></a><strong>IptParser</strong>&nbsp;(family)</dt>
+<dd>
+
+
+Create a new iptables parser object.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ family: Number specifying the address family. 4 for IPv4, 6 for IPv6
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+IptParser instance
+
+
+
+</dd>
+
+
+
+
+<dt><a name="IptParser.chain"></a><strong>IptParser:chain</strong>&nbsp;(table, chain)</dt>
+<dd>
+
+
+Return the given firewall chain within the given table name.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ table: String containing the table name
+ </li>
+
+ <li>
+ chain: String containing the chain name
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing the fields "policy", "packets", "bytes"
+ and "rules". The "rules" field is a table of rule tables.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="IptParser.chains"></a><strong>IptParser:chains</strong>&nbsp;(table)</dt>
+<dd>
+
+
+Find the names of all chains within the given table name.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ table: String containing the table name
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of chain names in the order they occur.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="IptParser.is_custom_target"></a><strong>IptParser:is_custom_target</strong>&nbsp;(target)</dt>
+<dd>
+
+
+Test whether the given target points to a custom chain.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ target: String containing the target action
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating whether target is a custom chain.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="IptParser.resync"></a><strong>IptParser:resync</strong>&nbsp;()</dt>
+<dd>
+
+
+Rebuild the internal lookup table, for example when rules have changed
+
+through external commands.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+nothing
+
+
+
+</dd>
+
+
+
+
+<dt><a name="IptParser.tables"></a><strong>IptParser:tables</strong>&nbsp;()</dt>
+<dd>
+
+
+Find the names of all tables.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of table names.
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.sys.net.html b/docs/api/modules/luci.sys.net.html
new file mode 100644
index 000000000..e7802bb24
--- /dev/null
+++ b/docs/api/modules/luci.sys.net.html
@@ -0,0 +1,597 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li><strong>luci.sys.net</strong></li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.sys.net</code></h1>
+
+<p>
+
+LuCI system utilities / network related functions.
+</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#net.arptable">arptable</a>&nbsp;()</td>
+ <td class="summary">
+
+Returns the current arp-table entries as two-dimensional table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.conntrack">conntrack</a>&nbsp;()</td>
+ <td class="summary">
+
+Returns conntrack information
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.deviceinfo">deviceinfo</a>&nbsp;()</td>
+ <td class="summary">
+
+Return information about available network interfaces.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.devices">devices</a>&nbsp;()</td>
+ <td class="summary">
+
+Determine the names of available network interfaces.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.host_hints">host_hints</a>&nbsp;()</td>
+ <td class="summary">
+
+Returns a two-dimensional table of host hints.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.ipv4_hints">ipv4_hints</a>&nbsp;()</td>
+ <td class="summary">
+
+Returns a two-dimensional table of IPv4 address hints.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.ipv6_hints">ipv6_hints</a>&nbsp;()</td>
+ <td class="summary">
+
+Returns a two-dimensional table of IPv6 address hints.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.mac_hints">mac_hints</a>&nbsp;()</td>
+ <td class="summary">
+
+Returns a two-dimensional table of mac address hints.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.pingtest">pingtest</a>&nbsp;(host)</td>
+ <td class="summary">
+
+Tests whether the given host responds to ping probes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.routes">routes</a>&nbsp;()</td>
+ <td class="summary">
+
+Returns the current kernel routing table entries.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#net.routes6">routes6</a>&nbsp;()</td>
+ <td class="summary">
+
+Returns the current ipv6 kernel routing table entries.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="net.arptable"></a><strong>arptable</strong>&nbsp;()</dt>
+<dd>
+
+
+Returns the current arp-table entries as two-dimensional table.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of table containing the current arp entries.
+ The following fields are defined for arp entry objects:
+ { "IP address", "HW address", "HW type", "Flags", "Mask", "Device" }
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.conntrack"></a><strong>conntrack</strong>&nbsp;()</dt>
+<dd>
+
+
+Returns conntrack information
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table with the currently tracked IP connections
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.deviceinfo"></a><strong>deviceinfo</strong>&nbsp;()</dt>
+<dd>
+
+
+Return information about available network interfaces.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing all current interface names and their information
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.devices"></a><strong>devices</strong>&nbsp;()</dt>
+<dd>
+
+
+Determine the names of available network interfaces.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing all current interface names
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.host_hints"></a><strong>host_hints</strong>&nbsp;()</dt>
+<dd>
+
+
+Returns a two-dimensional table of host hints.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of table containing known hosts from various sources,
+ indexed by mac address. Each subtable contains at least one
+ of the fields "name", "ipv4" or "ipv6".
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.ipv4_hints"></a><strong>ipv4_hints</strong>&nbsp;()</dt>
+<dd>
+
+
+Returns a two-dimensional table of IPv4 address hints.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of table containing known hosts from various sources.
+ Each entry contains the values in the following order:
+ [ "ip", "name" ]
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.ipv6_hints"></a><strong>ipv6_hints</strong>&nbsp;()</dt>
+<dd>
+
+
+Returns a two-dimensional table of IPv6 address hints.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of table containing known hosts from various sources.
+ Each entry contains the values in the following order:
+ [ "ip", "name" ]
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.mac_hints"></a><strong>mac_hints</strong>&nbsp;()</dt>
+<dd>
+
+
+Returns a two-dimensional table of mac address hints.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of table containing known hosts from various sources.
+ Each entry contains the values in the following order:
+ [ "mac", "name" ]
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.pingtest"></a><strong>pingtest</strong>&nbsp;(host)</dt>
+<dd>
+
+
+Tests whether the given host responds to ping probes.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ host: String containing a hostname or IPv4 address
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Number containing 0 on success and >= 1 on error
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.routes"></a><strong>routes</strong>&nbsp;()</dt>
+<dd>
+
+
+Returns the current kernel routing table entries.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of tables with properties of the corresponding routes.
+ The following fields are defined for route entry tables:
+ { "dest", "gateway", "metric", "refcount", "usecount", "irtt",
+ "flags", "device" }
+
+
+
+</dd>
+
+
+
+
+<dt><a name="net.routes6"></a><strong>routes6</strong>&nbsp;()</dt>
+<dd>
+
+
+Returns the current ipv6 kernel routing table entries.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table of tables with properties of the corresponding routes.
+ The following fields are defined for route entry tables:
+ { "source", "dest", "nexthop", "metric", "refcount", "usecount",
+ "flags", "device" }
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.sys.process.html b/docs/api/modules/luci.sys.process.html
new file mode 100644
index 000000000..d3664817c
--- /dev/null
+++ b/docs/api/modules/luci.sys.process.html
@@ -0,0 +1,519 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li><strong>luci.sys.process</strong></li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.sys.process</code></h1>
+
+<p>
+
+LuCI system utilities / process related functions.
+</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#process.exec">exec</a>&nbsp;(commend, stdout, stderr, nowait)</td>
+ <td class="summary">
+
+Execute a process, optionally capturing stdio.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#process.info">info</a>&nbsp;()</td>
+ <td class="summary">
+
+Get the current process id.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#process.list">list</a>&nbsp;()</td>
+ <td class="summary">
+
+Retrieve information about currently running processes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#process.setgroup">setgroup</a>&nbsp;(gid)</td>
+ <td class="summary">
+
+Set the gid of a process identified by given pid.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#process.setuser">setuser</a>&nbsp;(uid)</td>
+ <td class="summary">
+
+Set the uid of a process identified by given pid.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#process.signal">signal</a>&nbsp;(pid, sig)</td>
+ <td class="summary">
+
+Send a signal to a process identified by given pid.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="process.exec"></a><strong>exec</strong>&nbsp;(commend, stdout, stderr, nowait)</dt>
+<dd>
+
+
+Execute a process, optionally capturing stdio.
+
+Executes the process specified by the given argv vector, e.g.
+<code>{ "/bin/sh", "-c", "echo 1" }</code> and waits for it to terminate unless a true
+value has been passed for the "nowait" parameter.
+
+When a function value is passed for the stdout or stderr arguments, the passed
+function is repeatedly called for each chunk read from the corresponding stdio
+stream. The read data is passed as string containing at most 4096 bytes at a
+time.
+
+When a true, non-function value is passed for the stdout or stderr arguments,
+the data of the corresponding stdio stream is read into an internal string
+buffer and returned as "stdout" or "stderr" field respectively in the result
+table.
+
+When a true value is passed to the nowait parameter, the function does not
+await process termination but returns as soon as all captured stdio streams
+have been closed or - if no streams are captured - immediately after launching
+the process.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ commend: Table containing the argv vector to execute
+ </li>
+
+ <li>
+ stdout: Callback function or boolean to indicate capturing (optional)
+ </li>
+
+ <li>
+ stderr: Callback function or boolean to indicate capturing (optional)
+ </li>
+
+ <li>
+ nowait: Don't wait for process termination when true (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing at least the fields "code" which holds the exit
+ status of the invoked process or "-1" on error and "pid", which
+ contains the process id assigned to the spawned process. When
+ stdout and/or stderr capturing has been requested, it additionally
+ contains "stdout" and "stderr" fields respectively, holding the
+ captured stdio data as string.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="process.info"></a><strong>info</strong>&nbsp;()</dt>
+<dd>
+
+
+Get the current process id.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Number containing the current pid
+
+
+
+</dd>
+
+
+
+
+<dt><a name="process.list"></a><strong>list</strong>&nbsp;()</dt>
+<dd>
+
+
+Retrieve information about currently running processes.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing process information
+
+
+
+</dd>
+
+
+
+
+<dt><a name="process.setgroup"></a><strong>setgroup</strong>&nbsp;(gid)</dt>
+<dd>
+
+
+Set the gid of a process identified by given pid.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ gid: Number containing the Unix group id
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating successful operation
+
+ <li>String containing the error message if failed
+
+ <li>Number containing the error code if failed
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="process.setuser"></a><strong>setuser</strong>&nbsp;(uid)</dt>
+<dd>
+
+
+Set the uid of a process identified by given pid.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ uid: Number containing the Unix user id
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating successful operation
+
+ <li>String containing the error message if failed
+
+ <li>Number containing the error code if failed
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="process.signal"></a><strong>signal</strong>&nbsp;(pid, sig)</dt>
+<dd>
+
+
+Send a signal to a process identified by given pid.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pid: Number containing the process id
+ </li>
+
+ <li>
+ sig: Signal to send (default: 15 [SIGTERM])
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Boolean indicating successful operation
+
+ <li>Number containing the error code if failed
+
+</ol>
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.sys.user.html b/docs/api/modules/luci.sys.user.html
new file mode 100644
index 000000000..b2307ad38
--- /dev/null
+++ b/docs/api/modules/luci.sys.user.html
@@ -0,0 +1,412 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li><strong>luci.sys.user</strong></li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.sys.user</code></h1>
+
+<p>
+
+LuCI system utilities / user related functions.
+</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#getuser">getuser</a>&nbsp;(uid)</td>
+ <td class="summary">
+
+Retrieve user information for given uid.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#user.checkpasswd">checkpasswd</a>&nbsp;(username, pass)</td>
+ <td class="summary">
+
+Test whether given string matches the password of a given system user.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#user.getpasswd">getpasswd</a>&nbsp;(username)</td>
+ <td class="summary">
+
+Retrieve the current user password hash.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#user.setpasswd">setpasswd</a>&nbsp;(username, password)</td>
+ <td class="summary">
+
+Change the password of given user.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="getuser"></a><strong>getuser</strong>&nbsp;(uid)</dt>
+<dd>
+
+
+Retrieve user information for given uid.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ uid: Number containing the Unix user id
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing the following fields:
+ { "uid", "gid", "name", "passwd", "dir", "shell", "gecos" }
+
+
+
+</dd>
+
+
+
+
+<dt><a name="user.checkpasswd"></a><strong>checkpasswd</strong>&nbsp;(username, pass)</dt>
+<dd>
+
+
+Test whether given string matches the password of a given system user.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ username: String containing the Unix user name
+ </li>
+
+ <li>
+ pass: String containing the password to compare
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating whether the passwords are equal
+
+
+
+</dd>
+
+
+
+
+<dt><a name="user.getpasswd"></a><strong>getpasswd</strong>&nbsp;(username)</dt>
+<dd>
+
+
+Retrieve the current user password hash.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ username: String containing the username to retrieve the password for
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>String containing the hash or nil if no password is set.
+
+ <li>Password database entry
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="user.setpasswd"></a><strong>setpasswd</strong>&nbsp;(username, password)</dt>
+<dd>
+
+
+Change the password of given user.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ username: String containing the Unix user name
+ </li>
+
+ <li>
+ password: String containing the password to compare
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Number containing 0 on success and >= 1 on error
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.sys.wifi.html b/docs/api/modules/luci.sys.wifi.html
new file mode 100644
index 000000000..6c893244c
--- /dev/null
+++ b/docs/api/modules/luci.sys.wifi.html
@@ -0,0 +1,280 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li><strong>luci.sys.wifi</strong></li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.sys.wifi</code></h1>
+
+<p>
+
+LuCI system utilities / wifi related functions.
+</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#wifi.getiwinfo">getiwinfo</a>&nbsp;(ifname)</td>
+ <td class="summary">
+
+Get wireless information for given interface.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="wifi.getiwinfo"></a><strong>getiwinfo</strong>&nbsp;(ifname)</dt>
+<dd>
+
+
+Get wireless information for given interface.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ifname: String containing the interface name
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+A wrapped iwinfo object instance
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/luci.util.html b/docs/api/modules/luci.util.html
new file mode 100644
index 000000000..f8baddf41
--- /dev/null
+++ b/docs/api/modules/luci.util.html
@@ -0,0 +1,1830 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li><strong>luci.util</strong></li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>luci.util</code></h1>
+
+<p></p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#append">append</a>&nbsp;(src, ...)</td>
+ <td class="summary">
+
+Appends numerically indexed tables or single objects to a given table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#bigendian">bigendian</a>&nbsp;()</td>
+ <td class="summary">
+
+Test whether the current system is operating in big endian mode.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#class">class</a>&nbsp;(base)</td>
+ <td class="summary">
+
+Create a Class object (Python-style object model).</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#clone">clone</a>&nbsp;(object, deep)</td>
+ <td class="summary">
+
+Clones the given object and return it's copy.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cmatch">cmatch</a>&nbsp;(str, pattern)</td>
+ <td class="summary">
+
+Count the occurrences of given substring in given string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#combine">combine</a>&nbsp;(tbl1, tbl2, ...)</td>
+ <td class="summary">
+
+Combines two or more numerically indexed tables and single objects into one table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#contains">contains</a>&nbsp;(table, value)</td>
+ <td class="summary">
+
+Checks whether the given table contains the given value.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#copcall">copcall</a>&nbsp;(f, ...)</td>
+ <td class="summary">
+
+This is a coroutine-safe drop-in replacement for Lua's "pcall"-function
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#coxpcall">coxpcall</a>&nbsp;(f, err, ...)</td>
+ <td class="summary">
+
+This is a coroutine-safe drop-in replacement for Lua's "xpcall"-function
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#dumptable">dumptable</a>&nbsp;(t, maxdepth)</td>
+ <td class="summary">
+
+Recursively dumps a table to stdout, useful for testing and debugging.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#exec">exec</a>&nbsp;(command)</td>
+ <td class="summary">
+
+Execute given commandline and gather stdout.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#execi">execi</a>&nbsp;(command)</td>
+ <td class="summary">
+
+Return a line-buffered iterator over the output of given command.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#get_bytecode">get_bytecode</a>&nbsp;(val)</td>
+ <td class="summary">
+
+Return the current runtime bytecode of the given data.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#imatch">imatch</a>&nbsp;(val)</td>
+ <td class="summary">
+
+Return a matching iterator for the given value.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#instanceof">instanceof</a>&nbsp;(object, class)</td>
+ <td class="summary">
+
+Test whether the given object is an instance of the given class.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#keys">keys</a>&nbsp;(t)</td>
+ <td class="summary">
+
+Retrieve all keys of given associative table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#kspairs">kspairs</a>&nbsp;(t)</td>
+ <td class="summary">
+
+Return a key, value iterator for the given table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#libpath">libpath</a>&nbsp;()</td>
+ <td class="summary">
+
+Returns the absolute path to LuCI base directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#parse_units">parse_units</a>&nbsp;(ustr)</td>
+ <td class="summary">
+
+Parse certain units from the given string and return the canonical integer
+value or 0 if the unit is unknown.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#pcdata">pcdata</a>&nbsp;(value)</td>
+ <td class="summary">
+
+Create valid XML PCDATA from given string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#perror">perror</a>&nbsp;(obj)</td>
+ <td class="summary">
+
+Write given object to stderr.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#restore_data">restore_data</a>&nbsp;(str)</td>
+ <td class="summary">
+
+Restore data previously serialized with serialize_data().</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#serialize_data">serialize_data</a>&nbsp;(val)</td>
+ <td class="summary">
+
+Recursively serialize given data to lua code, suitable for restoring
+with loadstring().</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#serialize_json">serialize_json</a>&nbsp;(data, writer)</td>
+ <td class="summary">
+
+Convert data structure to JSON
+ </td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#shellquote">shellquote</a>&nbsp;(value)</td>
+ <td class="summary">
+
+Safely quote value for use in shell commands.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#spairs">spairs</a>&nbsp;(t, f)</td>
+ <td class="summary">
+
+Return a key, value iterator which returns the values sorted according to
+the provided callback function.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#split">split</a>&nbsp;(str, pat, max, regex)</td>
+ <td class="summary">
+
+Splits given string on a defined separator sequence and return a table
+containing the resulting substrings.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#strip_bytecode">strip_bytecode</a>&nbsp;(code)</td>
+ <td class="summary">
+
+Strips unnecessary lua bytecode from given string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#striptags">striptags</a>&nbsp;(value)</td>
+ <td class="summary">
+
+Strip HTML tags from given string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#threadlocal">threadlocal</a>&nbsp;()</td>
+ <td class="summary">
+
+Create a new or get an already existing thread local store associated with
+the current active coroutine.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#trim">trim</a>&nbsp;(str)</td>
+ <td class="summary">
+
+Remove leading and trailing whitespace from given string value.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#ubus">ubus</a>&nbsp;(object, method, values)</td>
+ <td class="summary">
+
+Issue an ubus call.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#update">update</a>&nbsp;(t, updates)</td>
+ <td class="summary">
+
+Update values in given table with the values from the second given table.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#urldecode">urldecode</a>&nbsp;(str, decode_plus)</td>
+ <td class="summary">
+
+Decode an URL-encoded string - optionally decoding the "+" sign to space.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#urlencode">urlencode</a>&nbsp;(str)</td>
+ <td class="summary">
+
+URL-encode given string.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#vspairs">vspairs</a>&nbsp;(t)</td>
+ <td class="summary">
+
+Return a key, value iterator for the given table.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="append"></a><strong>append</strong>&nbsp;(src, ...)</dt>
+<dd>
+
+
+Appends numerically indexed tables or single objects to a given table.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Target table
+ </li>
+
+ <li>
+ ...: Objects to insert
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Target table
+
+
+
+</dd>
+
+
+
+
+<dt><a name="bigendian"></a><strong>bigendian</strong>&nbsp;()</dt>
+<dd>
+
+
+Test whether the current system is operating in big endian mode.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean value indicating whether system is big endian
+
+
+
+</dd>
+
+
+
+
+<dt><a name="class"></a><strong>class</strong>&nbsp;(base)</dt>
+<dd>
+
+
+Create a Class object (Python-style object model).
+
+The class object can be instantiated by calling itself.
+Any class functions or shared parameters can be attached to this object.
+Attaching a table to the class object makes this table shared between
+all instances of this class. For object parameters use the __init__ function.
+Classes can inherit member functions and values from a base class.
+Class can be instantiated by calling them. All parameters will be passed
+to the __init__ function of this class - if such a function exists.
+The __init__ function must be used to set any object parameters that are not shared
+with other objects of this class. Any return values will be ignored.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ base: The base class to inherit from (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+A class object
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#instanceof">
+ instanceof
+ </a>
+
+ <li><a href="#clone">
+ clone
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="clone"></a><strong>clone</strong>&nbsp;(object, deep)</dt>
+<dd>
+
+
+Clones the given object and return it's copy.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ object: Table value to clone
+ </li>
+
+ <li>
+ deep: Boolean indicating whether to do recursive cloning
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Cloned table value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cmatch"></a><strong>cmatch</strong>&nbsp;(str, pattern)</dt>
+<dd>
+
+
+Count the occurrences of given substring in given string.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ str: String to search in
+ </li>
+
+ <li>
+ pattern: String containing pattern to find
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Number of found occurrences
+
+
+
+</dd>
+
+
+
+
+<dt><a name="combine"></a><strong>combine</strong>&nbsp;(tbl1, tbl2, ...)</dt>
+<dd>
+
+
+Combines two or more numerically indexed tables and single objects into one table.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ tbl1: Table value to combine
+ </li>
+
+ <li>
+ tbl2: Table value to combine
+ </li>
+
+ <li>
+ ...: More tables to combine
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table value containing all values of given tables
+
+
+
+</dd>
+
+
+
+
+<dt><a name="contains"></a><strong>contains</strong>&nbsp;(table, value)</dt>
+<dd>
+
+
+Checks whether the given table contains the given value.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ table: Table value
+ </li>
+
+ <li>
+ value: Value to search within the given table
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Number indicating the first index at which the given value occurs
+ within table or false.
+
+
+
+</dd>
+
+
+
+
+<dt><a name="copcall"></a><strong>copcall</strong>&nbsp;(f, ...)</dt>
+<dd>
+
+
+This is a coroutine-safe drop-in replacement for Lua's "pcall"-function
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ f: Lua function to be called protected
+ </li>
+
+ <li>
+ ...: Parameters passed to the function
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+A boolean whether the function call succeeded and the returns
+ values of the function or the error object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="coxpcall"></a><strong>coxpcall</strong>&nbsp;(f, err, ...)</dt>
+<dd>
+
+
+This is a coroutine-safe drop-in replacement for Lua's "xpcall"-function
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ f: Lua function to be called protected
+ </li>
+
+ <li>
+ err: Custom error handler
+ </li>
+
+ <li>
+ ...: Parameters passed to the function
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+A boolean whether the function call succeeded and the return
+ values of either the function or the error handler
+
+
+
+</dd>
+
+
+
+
+<dt><a name="dumptable"></a><strong>dumptable</strong>&nbsp;(t, maxdepth)</dt>
+<dd>
+
+
+Recursively dumps a table to stdout, useful for testing and debugging.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ t: Table value to dump
+ </li>
+
+ <li>
+ maxdepth: Maximum depth
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Always nil
+
+
+
+</dd>
+
+
+
+
+<dt><a name="exec"></a><strong>exec</strong>&nbsp;(command)</dt>
+<dd>
+
+
+Execute given commandline and gather stdout.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ command: String containing command to execute
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the command's stdout
+
+
+
+</dd>
+
+
+
+
+<dt><a name="execi"></a><strong>execi</strong>&nbsp;(command)</dt>
+<dd>
+
+
+Return a line-buffered iterator over the output of given command.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ command: String containing the command to execute
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Iterator
+
+
+
+</dd>
+
+
+
+
+<dt><a name="get_bytecode"></a><strong>get_bytecode</strong>&nbsp;(val)</dt>
+<dd>
+
+
+Return the current runtime bytecode of the given data. The byte code
+will be stripped before it is returned.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ val: Value to return as bytecode
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String value containing the bytecode of the given data
+
+
+
+</dd>
+
+
+
+
+<dt><a name="imatch"></a><strong>imatch</strong>&nbsp;(val)</dt>
+<dd>
+
+
+Return a matching iterator for the given value.
+
+The iterator will return one token per invocation, the tokens are separated by
+whitespace. If the input value is a table, it is transformed into a string first.
+A nil value will result in a valid iterator which aborts with the first invocation.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ val: The value to scan (table, string or nil)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Iterator which returns one token per call
+
+
+
+</dd>
+
+
+
+
+<dt><a name="instanceof"></a><strong>instanceof</strong>&nbsp;(object, class)</dt>
+<dd>
+
+
+Test whether the given object is an instance of the given class.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ object: Object instance
+ </li>
+
+ <li>
+ class: Class object to test against
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating whether the object is an instance
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#class">
+ class
+ </a>
+
+ <li><a href="#clone">
+ clone
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="keys"></a><strong>keys</strong>&nbsp;(t)</dt>
+<dd>
+
+
+Retrieve all keys of given associative table.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ t: Table to extract keys from
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Sorted table containing the keys
+
+
+
+</dd>
+
+
+
+
+<dt><a name="kspairs"></a><strong>kspairs</strong>&nbsp;(t)</dt>
+<dd>
+
+
+Return a key, value iterator for the given table.
+
+The table pairs are sorted by key.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ t: The table to iterate
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Function value containing the corresponding iterator
+
+
+
+</dd>
+
+
+
+
+<dt><a name="libpath"></a><strong>libpath</strong>&nbsp;()</dt>
+<dd>
+
+
+Returns the absolute path to LuCI base directory.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the directory path
+
+
+
+</dd>
+
+
+
+
+<dt><a name="parse_units"></a><strong>parse_units</strong>&nbsp;(ustr)</dt>
+<dd>
+
+
+Parse certain units from the given string and return the canonical integer
+value or 0 if the unit is unknown.
+
+Upper- or lower case is irrelevant.
+Recognized units are:
+
+ o "y" - one year (60*60*24*366)
+ o "m" - one month (60*60*24*31)
+ o "w" - one week (60*60*24*7)
+ o "d" - one day (60*60*24)
+ o "h" - one hour (60*60)
+ o "min" - one minute (60)
+ o "kb" - one kilobyte (1024)
+ o "mb" - one megabyte (1024*1024)
+ o "gb" - one gigabyte (1024*1024*1024)
+ o "kib" - one si kilobyte (1000)
+ o "mib" - one si megabyte (1000*1000)
+ o "gib" - one si gigabyte (1000*1000*1000)
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ustr: String containing a numerical value with trailing unit
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Number containing the canonical value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="pcdata"></a><strong>pcdata</strong>&nbsp;(value)</dt>
+<dd>
+
+
+Create valid XML PCDATA from given string.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ value: String value containing the data to escape
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String value containing the escaped data
+
+
+
+</dd>
+
+
+
+
+<dt><a name="perror"></a><strong>perror</strong>&nbsp;(obj)</dt>
+<dd>
+
+
+Write given object to stderr.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ obj: Value to write to stderr
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Boolean indicating whether the write operation was successful
+
+
+
+</dd>
+
+
+
+
+<dt><a name="restore_data"></a><strong>restore_data</strong>&nbsp;(str)</dt>
+<dd>
+
+
+Restore data previously serialized with serialize_data().
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ str: String containing the data to restore
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Value containing the restored data structure
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#serialize_data">
+ serialize_data
+ </a>
+
+ <li><a href="#get_bytecode">
+ get_bytecode
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="serialize_data"></a><strong>serialize_data</strong>&nbsp;(val)</dt>
+<dd>
+
+
+Recursively serialize given data to lua code, suitable for restoring
+with loadstring().
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ val: Value containing the data to serialize
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String value containing the serialized code
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#restore_data">
+ restore_data
+ </a>
+
+ <li><a href="#get_bytecode">
+ get_bytecode
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="serialize_json"></a><strong>serialize_json</strong>&nbsp;(data, writer)</dt>
+<dd>
+
+
+Convert data structure to JSON
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ data: The data to serialize
+ </li>
+
+ <li>
+ writer: A function to write a chunk of JSON data (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the JSON if called without write callback
+
+
+
+</dd>
+
+
+
+
+<dt><a name="shellquote"></a><strong>shellquote</strong>&nbsp;(value)</dt>
+<dd>
+
+
+Safely quote value for use in shell commands.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ value: String containing the value to quote
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Single-quote enclosed string with embedded quotes escaped
+
+
+
+</dd>
+
+
+
+
+<dt><a name="spairs"></a><strong>spairs</strong>&nbsp;(t, f)</dt>
+<dd>
+
+
+Return a key, value iterator which returns the values sorted according to
+the provided callback function.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ t: The table to iterate
+ </li>
+
+ <li>
+ f: A callback function to decide the order of elements
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Function value containing the corresponding iterator
+
+
+
+</dd>
+
+
+
+
+<dt><a name="split"></a><strong>split</strong>&nbsp;(str, pat, max, regex)</dt>
+<dd>
+
+
+Splits given string on a defined separator sequence and return a table
+containing the resulting substrings.
+
+The optional max parameter specifies the number of bytes to process,
+regardless of the actual length of the given string. The optional last
+parameter, regex, specifies whether the separator sequence is
+nterpreted as regular expression.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ str: String value containing the data to split up
+ </li>
+
+ <li>
+ pat: String with separator pattern (optional, defaults to "\n")
+ </li>
+
+ <li>
+ max: Maximum times to split (optional)
+ </li>
+
+ <li>
+ regex: Boolean indicating whether to interpret the separator
+ pattern as regular expression (optional, default is false)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing the resulting substrings
+
+
+
+</dd>
+
+
+
+
+<dt><a name="strip_bytecode"></a><strong>strip_bytecode</strong>&nbsp;(code)</dt>
+<dd>
+
+
+Strips unnecessary lua bytecode from given string.
+
+Information like line numbers and debugging numbers will be discarded.
+Original version by Peter Cawley (http://lua-users.org/lists/lua-l/2008-02/msg01158.html)
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ code: String value containing the original lua byte code
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String value containing the stripped lua byte code
+
+
+
+</dd>
+
+
+
+
+<dt><a name="striptags"></a><strong>striptags</strong>&nbsp;(value)</dt>
+<dd>
+
+
+Strip HTML tags from given string.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ value: String containing the HTML text
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String with HTML tags stripped of
+
+
+
+</dd>
+
+
+
+
+<dt><a name="threadlocal"></a><strong>threadlocal</strong>&nbsp;()</dt>
+<dd>
+
+
+Create a new or get an already existing thread local store associated with
+the current active coroutine.
+
+A thread local store is private a table object
+whose values can't be accessed from outside of the running coroutine.
+
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table value representing the corresponding thread local store
+
+
+
+</dd>
+
+
+
+
+<dt><a name="trim"></a><strong>trim</strong>&nbsp;(str)</dt>
+<dd>
+
+
+Remove leading and trailing whitespace from given string value.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ str: String value containing whitespace padded data
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String value with leading and trailing space removed
+
+
+
+</dd>
+
+
+
+
+<dt><a name="ubus"></a><strong>ubus</strong>&nbsp;(object, method, values)</dt>
+<dd>
+
+
+Issue an ubus call.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ object: String containing the ubus object to call
+ </li>
+
+ <li>
+ method: String containing the ubus method to call
+ </li>
+
+ <li>
+ values: Table containing the values to pass
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containin the ubus result
+
+
+
+</dd>
+
+
+
+
+<dt><a name="update"></a><strong>update</strong>&nbsp;(t, updates)</dt>
+<dd>
+
+
+Update values in given table with the values from the second given table.
+
+Both table are - in fact - merged together.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ t: Table which should be updated
+ </li>
+
+ <li>
+ updates: Table containing the values to update
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Always nil
+
+
+
+</dd>
+
+
+
+
+<dt><a name="urldecode"></a><strong>urldecode</strong>&nbsp;(str, decode_plus)</dt>
+<dd>
+
+
+Decode an URL-encoded string - optionally decoding the "+" sign to space.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ str: Input string in x-www-urlencoded format
+ </li>
+
+ <li>
+ decode_plus: Decode "+" signs to spaces if true (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+The decoded string
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#urlencode">
+ urlencode
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="urlencode"></a><strong>urlencode</strong>&nbsp;(str)</dt>
+<dd>
+
+
+URL-encode given string.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ str: String to encode
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+String containing the encoded data
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#urldecode">
+ urldecode
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="vspairs"></a><strong>vspairs</strong>&nbsp;(t)</dt>
+<dd>
+
+
+Return a key, value iterator for the given table.
+
+The table pairs are sorted by value.
+
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ t: The table to iterate
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Function value containing the corresponding iterator
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/nixio.CHANGELOG.html b/docs/api/modules/nixio.CHANGELOG.html
new file mode 100644
index 000000000..94b44a5ca
--- /dev/null
+++ b/docs/api/modules/nixio.CHANGELOG.html
@@ -0,0 +1,286 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li><strong>nixio.CHANGELOG</strong></li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>nixio.CHANGELOG</code></h1>
+
+<p>
+ Changes and improvements.</p>
+
+
+
+
+
+
+
+
+
+
+<h2>Tables</h2>
+<table class="table_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#0.2">0.2</a></td>
+ <td class="summary">
+ Initial Release.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#0.3">0.3</a></td>
+ <td class="summary">
+ Service Release.</td>
+ </tr>
+
+</table>
+
+
+
+<br/>
+<br/>
+
+
+
+
+<h2><a name="tables"></a>Tables</h2>
+<dl class="table">
+
+<dt><a name="0.2"></a><strong>0.2</strong></dt>
+<dd>
+ Initial Release.
+ <ul>
+ <li>Initial Release</li>
+ </ul>
+
+
+
+</dd>
+
+
+<dt><a name="0.3"></a><strong>0.3</strong></dt>
+<dd>
+ Service Release.
+ <ul>
+ <li>Added getifaddrs() function.</li>
+ <li>Added getsockopt(), setsockopt(), getsockname() and getpeername()
+ directly to TLS-socket objects unifying the socket interface.</li>
+ <li>Added support for CyaSSL as cryptographical backend.</li>
+ <li>Added support for x509 certificates in DER format.</li>
+ <li>Added support for splice() in UnifiedIO.copyz().</li>
+ <li>Added interface to inject chunks into UnifiedIO.linesource() buffer.</li>
+ <li>Changed TLS behaviour to explicitly separate servers and clients.</li>
+ <li>Fixed usage of signed datatype breaking Base64 decoding.</li>
+ <li>Fixed namespace clashes for nixio.fs.</li>
+ <li>Fixed splice() support for some exotic C libraries.</li>
+ <li>Reconfigure axTLS cryptographical provider and mark it as obsolete.</li>
+ </ul>
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/nixio.CryptoHash.html b/docs/api/modules/nixio.CryptoHash.html
new file mode 100644
index 000000000..7d2f48b1e
--- /dev/null
+++ b/docs/api/modules/nixio.CryptoHash.html
@@ -0,0 +1,312 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li><strong>nixio.CryptoHash</strong></li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>nixio.CryptoHash</code></h1>
+
+<p>
+ Cryptographical Hash and HMAC object.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#CryptoHash.final">CryptoHash:final</a>&nbsp;()</td>
+ <td class="summary">
+ Finalize the hash and return the digest.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#CryptoHash.update">CryptoHash:update</a>&nbsp;(chunk)</td>
+ <td class="summary">
+ Add another chunk of data to be hashed.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="CryptoHash.final"></a><strong>CryptoHash:final</strong>&nbsp;()</dt>
+<dd>
+
+ Finalize the hash and return the digest.
+
+
+
+
+
+<h3>Usage:</h3>
+You cannot call update on a hash object that was already finalized
+ you can however call final multiple times to get the digest.
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>hexdigest
+
+ <li>buffer containing binary digest
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="CryptoHash.update"></a><strong>CryptoHash:update</strong>&nbsp;(chunk)</dt>
+<dd>
+
+ Add another chunk of data to be hashed.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ chunk: Chunk of data
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+CryptoHash object (self)
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/nixio.File.html b/docs/api/modules/nixio.File.html
new file mode 100644
index 000000000..7a7500a77
--- /dev/null
+++ b/docs/api/modules/nixio.File.html
@@ -0,0 +1,669 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li><strong>nixio.File</strong></li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>nixio.File</code></h1>
+
+<p>
+ Large File Object.
+ Large file operations are supported up to 52 bits if the Lua number type is
+ double (default).</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#File.close">File:close</a>&nbsp;()</td>
+ <td class="summary">
+ Close the file descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.fileno">File:fileno</a>&nbsp;()</td>
+ <td class="summary">
+ Get the number of the filedescriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.lock">File:lock</a>&nbsp;(command, length)</td>
+ <td class="summary">
+ Apply or test a lock on the file.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.read">File:read</a>&nbsp;(length)</td>
+ <td class="summary">
+ Read from a file descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.seek">File:seek</a>&nbsp;(offset, whence)</td>
+ <td class="summary">
+ Reposition read / write offset of the file descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.setblocking">File:setblocking</a>&nbsp;(blocking)</td>
+ <td class="summary">
+ (POSIX) Set the blocking mode of the file descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.stat">File:stat</a>&nbsp;(field)</td>
+ <td class="summary">
+ Get file status and attributes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.sync">File:sync</a>&nbsp;(data_only)</td>
+ <td class="summary">
+ Synchronizes the file with the storage device.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.tell">File:tell</a>&nbsp;()</td>
+ <td class="summary">
+ Return the current read / write offset of the file descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#File.write">File:write</a>&nbsp;(buffer, offset, length)</td>
+ <td class="summary">
+ Write to the file descriptor.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="File.close"></a><strong>File:close</strong>&nbsp;()</dt>
+<dd>
+
+ Close the file descriptor.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.fileno"></a><strong>File:fileno</strong>&nbsp;()</dt>
+<dd>
+
+ Get the number of the filedescriptor.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+file descriptor number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.lock"></a><strong>File:lock</strong>&nbsp;(command, length)</dt>
+<dd>
+
+ Apply or test a lock on the file.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ command: Locking Command ["lock", "tlock", "ulock", "test"]
+ </li>
+
+ <li>
+ length: Amount of Bytes to lock from current offset (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls lockf() on POSIX and _locking() on Windows.
+
+ <li>The "lock" command is blocking, "tlock" is non-blocking,
+ "ulock" unlocks and "test" only tests for the lock.
+
+ <li>The "test" command is not available on Windows.
+
+ <li>Locks are by default advisory on POSIX, but mandatory on Windows.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.read"></a><strong>File:read</strong>&nbsp;(length)</dt>
+<dd>
+
+ Read from a file descriptor.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ length: Amount of data to read (in Bytes).
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li><strong>Warning:</strong> It is not guaranteed that all requested data
+ is read at once especially when dealing with pipes.
+ You have to check the return value - the length of the buffer actually read -
+ or use the safe IO functions in the high-level IO utility module.
+
+ <li>The length of the return buffer is limited by the (compile time)
+ nixio buffersize which is <em>nixio.const.buffersize</em> (8192 by default).
+ Any read request greater than that will be safely truncated to this value.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+buffer containing data successfully read
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.seek"></a><strong>File:seek</strong>&nbsp;(offset, whence)</dt>
+<dd>
+
+ Reposition read / write offset of the file descriptor.
+ The seek will be done either from the beginning of the file or relative
+ to the current position or relative to the end.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ offset: File Offset
+ </li>
+
+ <li>
+ whence: Starting point [<strong>"set"</strong>, "cur", "end"]
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls lseek().
+
+
+
+<h3>Return value:</h3>
+new (absolute) offset position
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.setblocking"></a><strong>File:setblocking</strong>&nbsp;(blocking)</dt>
+<dd>
+
+ (POSIX) Set the blocking mode of the file descriptor.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ blocking: (boolean)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.stat"></a><strong>File:stat</strong>&nbsp;(field)</dt>
+<dd>
+
+ Get file status and attributes.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ field: Only return a specific field, not the whole table (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls fstat().
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>atime = Last access timestamp</li>
+ <li>blksize = Blocksize (POSIX only)</li>
+ <li>blocks = Blocks used (POSIX only)</li>
+ <li>ctime = Creation timestamp</li>
+ <li>dev = Device ID</li>
+ <li>gid = Group ID</li>
+ <li>ino = Inode</li>
+ <li>modedec = Mode converted into a decimal number</li>
+ <li>modestr = Mode as string as returned by <code>ls -l</code></li>
+ <li>mtime = Last modification timestamp</li>
+ <li>nlink = Number of links</li>
+ <li>rdev = Device ID (if special file)</li>
+ <li>size = Size in bytes</li>
+ <li>type = ["reg", "dir", "chr", "blk", "fifo", "lnk", "sock"]</li>
+ <li>uid = User ID</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.sync"></a><strong>File:sync</strong>&nbsp;(data_only)</dt>
+<dd>
+
+ Synchronizes the file with the storage device.
+ Returns when the file is successfully written to the disk.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ data_only: Do not synchronize the metadata. (optional, boolean)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls fsync() when data_only equals false
+ otherwise fdatasync(), on Windows _commit() is used instead.
+
+ <li>fdatasync() is only supported by Linux and Solaris. For other systems
+ the <em>data_only</em> parameter is ignored and fsync() is always called.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.tell"></a><strong>File:tell</strong>&nbsp;()</dt>
+<dd>
+
+ Return the current read / write offset of the file descriptor.
+
+
+
+
+
+<h3>Usage:</h3>
+This function calls lseek() with offset 0 from the current position.
+
+
+
+<h3>Return value:</h3>
+offset position
+
+
+
+</dd>
+
+
+
+
+<dt><a name="File.write"></a><strong>File:write</strong>&nbsp;(buffer, offset, length)</dt>
+<dd>
+
+ Write to the file descriptor.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer holding the data to be written.
+ </li>
+
+ <li>
+ offset: Offset to start reading the buffer from. (optional)
+ </li>
+
+ <li>
+ length: Length of chunk to read from the buffer. (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li><strong>Warning:</strong> It is not guaranteed that all data
+ in the buffer is written at once especially when dealing with pipes.
+ You have to check the return value - the number of bytes actually written -
+ or use the safe IO functions in the high-level IO utility module.
+
+ <li>Unlike standard Lua indexing the lowest offset and default is 0.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+number of bytes written
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/nixio.README.html b/docs/api/modules/nixio.README.html
new file mode 100644
index 000000000..e140659cc
--- /dev/null
+++ b/docs/api/modules/nixio.README.html
@@ -0,0 +1,370 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li><strong>nixio.README</strong></li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>nixio.README</code></h1>
+
+<p>
+ General Information.</p>
+
+
+
+
+
+
+
+
+
+
+<h2>Tables</h2>
+<table class="table_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#Errorhandling">Errorhandling</a></td>
+ <td class="summary">
+ General error handling information.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Functions">Functions</a></td>
+ <td class="summary">
+ Function conventions.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Platforms">Platforms</a></td>
+ <td class="summary">
+ Platform information.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLS-Crypto">TLS-Crypto</a></td>
+ <td class="summary">
+ Cryptography and TLS libraries.</td>
+ </tr>
+
+</table>
+
+
+
+<br/>
+<br/>
+
+
+
+
+<h2><a name="tables"></a>Tables</h2>
+<dl class="table">
+
+<dt><a name="Errorhandling"></a><strong>Errorhandling</strong></dt>
+<dd>
+ General error handling information.
+ <ul>
+ <li> Most of the functions available in this library may fail. If any error
+ occurs the function returns <strong>nil or false</strong>, an error code
+ (usually errno) and an additional error message text (if avaialable).</li>
+ <li>At the moment false is only returned when a non-blocking I/O function
+ fails with EAGAIN, EWOULDBLOCK or WSAEWOULDBLOCK for any others nil is
+ returned as first parameter. Therefore you can use false to write portable
+ non-blocking I/O applications.</li>
+ <li>Note that the function documentation does only mention the return values
+ in case of a successful operation.</li>
+ <li>You can find a table of common error numbers and other useful constants
+ like signal numbers in <strong>nixio.const</strong> e.g. nixio.const.EINVAL,
+ nixio.const.SIGTERM, etc. For portability there is a second error constant
+ table <strong>nixio.const_sock</strong> for socket error codes. This might
+ be important if you are dealing with Windows applications, on POSIX however
+ const_sock is just an alias for const.</li>
+ <li>With some exceptions - which are explicitly stated in the function
+ documentation - all blocking functions are signal-protected and will not fail
+ with EINTR.</li>
+ <li>On POSIX the SIGPIPE signal will be set to ignore upon initialization.
+ You should restore the default behaviour or set a custom signal handler
+ in your program after loading nixio if you need this behaviour.</li>
+ </ul>
+
+
+
+</dd>
+
+
+<dt><a name="Functions"></a><strong>Functions</strong></dt>
+<dd>
+ Function conventions.
+ <br />In general all functions are namend and behave like their POSIX API
+ counterparts - where applicable - applying the following rules:
+ <ul>
+ <li>Functions should be named like the underlying POSIX API function omitting
+ prefixes or suffixes - especially when placed in an object-context (
+ lockf -> File:lock, fsync -> File:sync, dup2 -> dup, ...)</li>
+ <li>If you are unclear about the behaviour of a function you should consult
+ your OS API documentation (e.g. the manpages).</li>
+ <li>If the name is significantly different from the POSIX-function, the
+ underlying function(s) are stated in the documentation.</li>
+ <li>Parameters should reflect those of the C-API, buffer length arguments and
+ by-reference parameters should be omitted for practical purposes.</li>
+ <li>If a C function accepts a bitfield as parameter, it should be translated
+ into lower case string flags representing the flags if the bitfield is the
+ last parameter and also omitting prefixes or suffixes. (e.g. waitpid
+ (pid, &s, WNOHANG | WUNTRACED) -> waitpid(pid, "nohang", "untraced"),
+ getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) ->
+ Socket:getopt("socket", "reuseaddr"), etc.) </li>
+ <li>If it is not applicable to provide a string representation of the
+ bitfield a bitfield generator helper is provided. It is named FUNCTION_flags.
+ (open("/tmp/test", O_RDONLY | O_NONBLOCK) -> open("/tmp/test", open_flags(
+ "rdonly", "nonblock")))</li>
+ </ul>
+
+
+
+</dd>
+
+
+<dt><a name="Platforms"></a><strong>Platforms</strong></dt>
+<dd>
+ Platform information.
+ <ul>
+ <li>The minimum platform requirements are a decent POSIX 2001 support.
+ Builds are more or less tested on Linux, Solaris and FreeBSD. Builds for
+ Windows XP SP1 and later can be compiled with MinGW either from Windows
+ itself or using the MinGW cross-compiler. Earlier versions of Windows are not
+ supported.</li>
+ <li>In general all functions which don't have any remarks
+ in their documentation are available on all platforms.</li>
+ <li>Functions with a (POSIX), (Linux) or similar prefix are only available
+ on these specific platforms. Same appplies to parameters of functions
+ with a similar suffix.</li>
+ <li>Some functions might have limitations on some platforms. This should
+ be stated in the documentation. Please also consult your OS API
+ documentation.</li>
+ </ul>
+
+
+
+</dd>
+
+
+<dt><a name="TLS-Crypto"></a><strong>TLS-Crypto</strong></dt>
+<dd>
+ Cryptography and TLS libraries.
+ <ul>
+ <li>Currently 3 underlying cryptography libraries are supported: openssl,
+ cyassl and axTLS. The name of the library in use is written to
+ <strong>nixio.tls_provider</strong></li>
+ <li>You should whenever possible use openssl or cyassl as axTLS has only
+ limited support. It does not provide support for non-blocking sockets and
+ is probably less audited than the other ones.</li>
+ <li>As the supported Windows versions are not suitable for embedded devices
+ axTLS is at the moment not supported on Windows.</li>
+ </ul>
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/nixio.Socket.html b/docs/api/modules/nixio.Socket.html
new file mode 100644
index 000000000..185099125
--- /dev/null
+++ b/docs/api/modules/nixio.Socket.html
@@ -0,0 +1,1029 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li><strong>nixio.Socket</strong></li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>nixio.Socket</code></h1>
+
+<p>
+ Socket Object.
+ Supports IPv4, IPv6 and UNIX (POSIX only) families.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.accept">Socket:accept</a>&nbsp;()</td>
+ <td class="summary">
+ Accept a connection on the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.bind">Socket:bind</a>&nbsp;(host, port)</td>
+ <td class="summary">
+ Bind the socket to a network address.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.close">Socket:close</a>&nbsp;()</td>
+ <td class="summary">
+ Close the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.connect">Socket:connect</a>&nbsp;(host, port)</td>
+ <td class="summary">
+ Connect the socket to a network address.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.fileno">Socket:fileno</a>&nbsp;()</td>
+ <td class="summary">
+ Get the number of the filedescriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.getopt">Socket:getopt</a>&nbsp;(level, option)</td>
+ <td class="summary">
+ Get a socket option.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.getpeername">Socket:getpeername</a>&nbsp;()</td>
+ <td class="summary">
+ Get the peer address of a socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.getsockname">Socket:getsockname</a>&nbsp;()</td>
+ <td class="summary">
+ Get the local address of a socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.listen">Socket:listen</a>&nbsp;(backlog)</td>
+ <td class="summary">
+ Listen for connections on the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.read ">Socket:read </a>&nbsp;(length)</td>
+ <td class="summary">
+ Receive a message on the socket (This is an alias for recv).</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.recv ">Socket:recv </a>&nbsp;(length)</td>
+ <td class="summary">
+ Receive a message on the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.recvfrom">Socket:recvfrom</a>&nbsp;(length)</td>
+ <td class="summary">
+ Receive a message on the socket including the senders source address.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.send">Socket:send</a>&nbsp;(buffer, offset, length)</td>
+ <td class="summary">
+ Send a message on the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.sendto">Socket:sendto</a>&nbsp;(buffer, host, port, offset, length)</td>
+ <td class="summary">
+ Send a message on the socket specifying the destination.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.setblocking">Socket:setblocking</a>&nbsp;(blocking)</td>
+ <td class="summary">
+ Set the blocking mode of the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.setopt">Socket:setopt</a>&nbsp;(level, option, value)</td>
+ <td class="summary">
+ Set a socket option.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.shutdown">Socket:shutdown</a>&nbsp;(how)</td>
+ <td class="summary">
+ Shut down part of a full-duplex connection.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#Socket.write">Socket:write</a>&nbsp;(buffer, offset, length)</td>
+ <td class="summary">
+ Send a message on the socket (This is an alias for send).</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="Socket.accept"></a><strong>Socket:accept</strong>&nbsp;()</dt>
+<dd>
+
+ Accept a connection on the socket.
+
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>Socket Object
+
+ <li>Peer IP-Address
+
+ <li>Peer Port
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.bind"></a><strong>Socket:bind</strong>&nbsp;(host, port)</dt>
+<dd>
+
+ Bind the socket to a network address.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ host: Host (optional, default: all addresses)
+ </li>
+
+ <li>
+ port: Port or service description
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls getaddrinfo() and bind() but NOT listen().
+
+ <li>If <em>host</em> is a domain name it will be looked up and bind()
+ tries the IP-Addresses in the order returned by the DNS resolver
+ until the bind succeeds.
+
+ <li>UNIX sockets ignore the <em>port</em>,
+ and interpret <em>host</em> as a socket path.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.close"></a><strong>Socket:close</strong>&nbsp;()</dt>
+<dd>
+
+ Close the socket.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.connect"></a><strong>Socket:connect</strong>&nbsp;(host, port)</dt>
+<dd>
+
+ Connect the socket to a network address.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ host: Hostname or IP-Address (optional, default: localhost)
+ </li>
+
+ <li>
+ port: Port or service description
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls getaddrinfo() and connect().
+
+ <li>If <em>host</em> is a domain name it will be looked up and connect()
+ tries the IP-Addresses in the order returned by the DNS resolver
+ until the connect succeeds.
+
+ <li>UNIX sockets ignore the <em>port</em>,
+ and interpret <em>host</em> as a socket path.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.fileno"></a><strong>Socket:fileno</strong>&nbsp;()</dt>
+<dd>
+
+ Get the number of the filedescriptor.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+file descriptor number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.getopt"></a><strong>Socket:getopt</strong>&nbsp;(level, option)</dt>
+<dd>
+
+ Get a socket option.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ level: Level ["socket", "tcp", "ip", "ipv6"]
+ </li>
+
+ <li>
+ option: Option ["keepalive", "reuseaddr", "sndbuf", "rcvbuf",
+ "priority", "broadcast", "linger", "sndtimeo", "rcvtimeo", "dontroute",
+ "bindtodevice", "error", "oobinline", "cork" (TCP), "nodelay" (TCP),
+ "mtu" (IP, IPv6), "hdrincl" (IP), "multicast_ttl" (IP), "multicast_loop"
+ (IP, IPv6), "multicast_if" (IP, IPv6), "v6only" (IPv6), "multicast_hops"
+ (IPv6), "add_membership" (IP, IPv6), "drop_membership" (IP, IPv6)]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.getpeername"></a><strong>Socket:getpeername</strong>&nbsp;()</dt>
+<dd>
+
+ Get the peer address of a socket.
+
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>IP-Address
+
+ <li>Port
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.getsockname"></a><strong>Socket:getsockname</strong>&nbsp;()</dt>
+<dd>
+
+ Get the local address of a socket.
+
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>IP-Address
+
+ <li>Port
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.listen"></a><strong>Socket:listen</strong>&nbsp;(backlog)</dt>
+<dd>
+
+ Listen for connections on the socket.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ backlog: Length of queue for pending connections
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.read "></a><strong>Socket:read </strong>&nbsp;(length)</dt>
+<dd>
+
+ Receive a message on the socket (This is an alias for recv).
+ See the recvfrom description for more details.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ length: Amount of data to read (in Bytes).
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+buffer containing data successfully read
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Socket.recvfrom">
+ Socket:recvfrom
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Socket.recv "></a><strong>Socket:recv </strong>&nbsp;(length)</dt>
+<dd>
+
+ Receive a message on the socket.
+ This function is identical to recvfrom except that it does not return
+ the sender's source address. See the recvfrom description for more details.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ length: Amount of data to read (in Bytes).
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+buffer containing data successfully read
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Socket.recvfrom">
+ Socket:recvfrom
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Socket.recvfrom"></a><strong>Socket:recvfrom</strong>&nbsp;(length)</dt>
+<dd>
+
+ Receive a message on the socket including the senders source address.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ length: Amount of data to read (in Bytes).
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li><strong>Warning:</strong> It is not guaranteed that all requested data
+ is read at once.
+ You have to check the return value - the length of the buffer actually read -
+ or use the safe IO functions in the high-level IO utility module.
+
+ <li>The length of the return buffer is limited by the (compile time)
+ nixio buffersize which is <em>nixio.const.buffersize</em> (8192 by default).
+ Any read request greater than that will be safely truncated to this value.
+
+</ul>
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>buffer containing data successfully read
+
+ <li>host IP-Address of the sender
+
+ <li>port Port of the sender
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.send"></a><strong>Socket:send</strong>&nbsp;(buffer, offset, length)</dt>
+<dd>
+
+ Send a message on the socket.
+ This function is identical to sendto except for the missing destination
+ parameters. See the sendto description for a detailed description.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer holding the data to be written.
+ </li>
+
+ <li>
+ offset: Offset to start reading the buffer from. (optional)
+ </li>
+
+ <li>
+ length: Length of chunk to read from the buffer. (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number of bytes written
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Socket.sendto">
+ Socket:sendto
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="Socket.sendto"></a><strong>Socket:sendto</strong>&nbsp;(buffer, host, port, offset, length)</dt>
+<dd>
+
+ Send a message on the socket specifying the destination.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer holding the data to be written.
+ </li>
+
+ <li>
+ host: Target IP-Address
+ </li>
+
+ <li>
+ port: Target Port
+ </li>
+
+ <li>
+ offset: Offset to start reading the buffer from. (optional)
+ </li>
+
+ <li>
+ length: Length of chunk to read from the buffer. (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li><strong>Warning:</strong> It is not guaranteed that all data
+ in the buffer is written at once.
+ You have to check the return value - the number of bytes actually written -
+ or use the safe IO functions in the high-level IO utility module.
+
+ <li>Unlike standard Lua indexing the lowest offset and default is 0.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+number of bytes written
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.setblocking"></a><strong>Socket:setblocking</strong>&nbsp;(blocking)</dt>
+<dd>
+
+ Set the blocking mode of the socket.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ blocking: (boolean)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.setopt"></a><strong>Socket:setopt</strong>&nbsp;(level, option, value)</dt>
+<dd>
+
+ Set a socket option.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ level: Level ["socket", "tcp", "ip", "ipv6"]
+ </li>
+
+ <li>
+ option: Option ["keepalive", "reuseaddr", "sndbuf", "rcvbuf",
+ "priority", "broadcast", "linger", "sndtimeo", "rcvtimeo", "dontroute",
+ "bindtodevice", "error", "oobinline", "cork" (TCP), "nodelay" (TCP),
+ "mtu" (IP, IPv6), "hdrincl" (IP), "multicast_ttl" (IP), "multicast_loop"
+ (IP, IPv6), "multicast_if" (IP, IPv6), "v6only" (IPv6), "multicast_hops"
+ (IPv6), "add_membership" (IP, IPv6), "drop_membership" (IP, IPv6)]
+ </li>
+
+ <li>
+ value: Value
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.shutdown"></a><strong>Socket:shutdown</strong>&nbsp;(how)</dt>
+<dd>
+
+ Shut down part of a full-duplex connection.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ how: (optional, default: rdwr) ["rdwr", "rd", "wr"]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="Socket.write"></a><strong>Socket:write</strong>&nbsp;(buffer, offset, length)</dt>
+<dd>
+
+ Send a message on the socket (This is an alias for send).
+ See the sendto description for a detailed description.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer holding the data to be written.
+ </li>
+
+ <li>
+ offset: Offset to start reading the buffer from. (optional)
+ </li>
+
+ <li>
+ length: Length of chunk to read from the buffer. (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number of bytes written
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#Socket.sendto">
+ Socket:sendto
+ </a>
+
+</ul>
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/nixio.TLSContext.html b/docs/api/modules/nixio.TLSContext.html
new file mode 100644
index 000000000..c84d31895
--- /dev/null
+++ b/docs/api/modules/nixio.TLSContext.html
@@ -0,0 +1,475 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li><strong>nixio.TLSContext</strong></li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>nixio.TLSContext</code></h1>
+
+<p>
+ Transport Layer Security Context Object.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSContext.create">TLSContext:create</a>&nbsp;(socket)</td>
+ <td class="summary">
+ Create a TLS Socket from a socket descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSContext.set_cert">TLSContext:set_cert</a>&nbsp;(path)</td>
+ <td class="summary">
+ Assign a PEM certificate to this context.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSContext.set_ciphers">TLSContext:set_ciphers</a>&nbsp;(cipherlist)</td>
+ <td class="summary">
+ Set the available ciphers for this context.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSContext.set_key">TLSContext:set_key</a>&nbsp;(path)</td>
+ <td class="summary">
+ Assign a PEM private key to this context.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSContext.set_verify">TLSContext:set_verify</a>&nbsp;(flag1, ...)</td>
+ <td class="summary">
+ Set the verification flags of this context.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSContext.set_verify_depth">TLSContext:set_verify_depth</a>&nbsp;(depth)</td>
+ <td class="summary">
+ Set the verification depth of this context.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="TLSContext.create"></a><strong>TLSContext:create</strong>&nbsp;(socket)</dt>
+<dd>
+
+ Create a TLS Socket from a socket descriptor.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ socket: Socket Object
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+TLSSocket Object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSContext.set_cert"></a><strong>TLSContext:set_cert</strong>&nbsp;(path)</dt>
+<dd>
+
+ Assign a PEM certificate to this context.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Certificate File path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls SSL_CTX_use_certificate_chain_file().
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSContext.set_ciphers"></a><strong>TLSContext:set_ciphers</strong>&nbsp;(cipherlist)</dt>
+<dd>
+
+ Set the available ciphers for this context.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ cipherlist: String containing a list of ciphers
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls SSL_CTX_set_cipher_list().
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSContext.set_key"></a><strong>TLSContext:set_key</strong>&nbsp;(path)</dt>
+<dd>
+
+ Assign a PEM private key to this context.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Private Key File path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls SSL_CTX_use_PrivateKey_file().
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSContext.set_verify"></a><strong>TLSContext:set_verify</strong>&nbsp;(flag1, ...)</dt>
+<dd>
+
+ Set the verification flags of this context.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ flag1: First Flag ["none", "peer", "verify_fail_if_no_peer_cert",
+ "client_once"]
+ </li>
+
+ <li>
+ ...: More Flags [-"-]
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls SSL_CTX_set_verify().
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSContext.set_verify_depth"></a><strong>TLSContext:set_verify_depth</strong>&nbsp;(depth)</dt>
+<dd>
+
+ Set the verification depth of this context.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ depth: Depth
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls SSL_CTX_set_verify_depth().
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/nixio.TLSSocket.html b/docs/api/modules/nixio.TLSSocket.html
new file mode 100644
index 000000000..5d6098a9f
--- /dev/null
+++ b/docs/api/modules/nixio.TLSSocket.html
@@ -0,0 +1,571 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li><strong>nixio.TLSSocket</strong></li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>nixio.TLSSocket</code></h1>
+
+<p>
+ TLS Socket Object.
+ TLS Sockets contain the underlying socket and context in the fields
+ "socket" and "context".</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSSocket.accept">TLSSocket:accept</a>&nbsp;()</td>
+ <td class="summary">
+ Wait for a TLS handshake from a client.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSSocket.connect">TLSSocket:connect</a>&nbsp;()</td>
+ <td class="summary">
+ Initiate the TLS handshake as client with the server.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSSocket.read ">TLSSocket:read </a>&nbsp;(length)</td>
+ <td class="summary">
+ Receive a message on the socket (This is an alias for recv).</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSSocket.recv">TLSSocket:recv</a>&nbsp;(length)</td>
+ <td class="summary">
+ Receive a message on the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSSocket.send">TLSSocket:send</a>&nbsp;(buffer, offset, length)</td>
+ <td class="summary">
+ Send a message to the socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSSocket.shutdown">TLSSocket:shutdown</a>&nbsp;()</td>
+ <td class="summary">
+ Shut down the TLS connection.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#TLSSocket.write">TLSSocket:write</a>&nbsp;(buffer, offset, length)</td>
+ <td class="summary">
+ Send a message on the socket (This is an alias for send).</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="TLSSocket.accept"></a><strong>TLSSocket:accept</strong>&nbsp;()</dt>
+<dd>
+
+ Wait for a TLS handshake from a client.
+
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls SSL_accept().
+
+ <li>You have to call either connect or accept before transmitting data.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#TLSSocket.connect">
+ TLSSocket:connect
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="TLSSocket.connect"></a><strong>TLSSocket:connect</strong>&nbsp;()</dt>
+<dd>
+
+ Initiate the TLS handshake as client with the server.
+
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls SSL_connect().
+
+ <li>You have to call either connect or accept before transmitting data.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#TLSSocket.accept">
+ TLSSocket:accept
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="TLSSocket.read "></a><strong>TLSSocket:read </strong>&nbsp;(length)</dt>
+<dd>
+
+ Receive a message on the socket (This is an alias for recv).
+ See the recv description for more details.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ length: Amount of data to read (in Bytes).
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+buffer containing data successfully read
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#TLSSocket.recv">
+ TLSSocket:recv
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="TLSSocket.recv"></a><strong>TLSSocket:recv</strong>&nbsp;(length)</dt>
+<dd>
+
+ Receive a message on the socket.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ length: Amount of data to read (in Bytes).
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls SSL_read().
+
+ <li><strong>Warning:</strong> It is not guaranteed that all requested data
+ is read at once.
+ You have to check the return value - the length of the buffer actually read -
+ or use the safe IO functions in the high-level IO utility module.
+
+ <li>The length of the return buffer is limited by the (compile time)
+ nixio buffersize which is <em>nixio.const.buffersize</em> (8192 by default).
+ Any read request greater than that will be safely truncated to this value.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+buffer containing data successfully read
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSSocket.send"></a><strong>TLSSocket:send</strong>&nbsp;(buffer, offset, length)</dt>
+<dd>
+
+ Send a message to the socket.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer holding the data to be written.
+ </li>
+
+ <li>
+ offset: Offset to start reading the buffer from. (optional)
+ </li>
+
+ <li>
+ length: Length of chunk to read from the buffer. (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function calls SSL_write().
+
+ <li><strong>Warning:</strong> It is not guaranteed that all data
+ in the buffer is written at once.
+ You have to check the return value - the number of bytes actually written -
+ or use the safe IO functions in the high-level IO utility module.
+
+ <li>Unlike standard Lua indexing the lowest offset and default is 0.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+number of bytes written
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSSocket.shutdown"></a><strong>TLSSocket:shutdown</strong>&nbsp;()</dt>
+<dd>
+
+ Shut down the TLS connection.
+
+
+
+
+
+<h3>Usage:</h3>
+This function calls SSL_shutdown().
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="TLSSocket.write"></a><strong>TLSSocket:write</strong>&nbsp;(buffer, offset, length)</dt>
+<dd>
+
+ Send a message on the socket (This is an alias for send).
+ See the send description for a detailed description.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer holding the data to be written.
+ </li>
+
+ <li>
+ offset: Offset to start reading the buffer from. (optional)
+ </li>
+
+ <li>
+ length: Length of chunk to read from the buffer. (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number of bytes written
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#TLSSocket.send">
+ TLSSocket:send
+ </a>
+
+</ul>
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/nixio.UnifiedIO.html b/docs/api/modules/nixio.UnifiedIO.html
new file mode 100644
index 000000000..6410ffb42
--- /dev/null
+++ b/docs/api/modules/nixio.UnifiedIO.html
@@ -0,0 +1,763 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li><strong>nixio.UnifiedIO</strong></li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Object Instance <code>nixio.UnifiedIO</code></h1>
+
+<p>
+ Unified high-level I/O utility API for Files, Sockets and TLS-Sockets.
+ These functions are added to the object function tables by doing <strong>
+ require "nixio.util"</strong>, can be used on all nixio IO Descriptors and
+ are based on the shared low-level read() and write() functions.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.blocksource">UnifiedIO:blocksource</a>&nbsp;(blocksize, limit)</td>
+ <td class="summary">
+ Create a block-based iterator.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.close">UnifiedIO:close</a>&nbsp;()</td>
+ <td class="summary">
+ Close the descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.copy">UnifiedIO:copy</a>&nbsp;(fdout, size)</td>
+ <td class="summary">
+ Copy data from the current descriptor to another one.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.copyz">UnifiedIO:copyz</a>&nbsp;(fdout, size)</td>
+ <td class="summary">
+ Copy data from the current descriptor to another one using kernel-space
+ copying if possible.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.is_file">UnifiedIO:is_file</a>&nbsp;()</td>
+ <td class="summary">
+ Test whether the I/O-Descriptor is a file.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.is_socket">UnifiedIO:is_socket</a>&nbsp;()</td>
+ <td class="summary">
+ Test whether the I/O-Descriptor is a socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.is_tls_socket">UnifiedIO:is_tls_socket</a>&nbsp;()</td>
+ <td class="summary">
+ Test whether the I/O-Descriptor is a TLS socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.linesource">UnifiedIO:linesource</a>&nbsp;(limit)</td>
+ <td class="summary">
+ Create a line-based iterator.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.readall">UnifiedIO:readall</a>&nbsp;(length)</td>
+ <td class="summary">
+ Read a block of data and wait until all data is available.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.sink">UnifiedIO:sink</a>&nbsp;(close_when_done)</td>
+ <td class="summary">
+ Create a sink.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#UnifiedIO.writeall">UnifiedIO:writeall</a>&nbsp;(block)</td>
+ <td class="summary">
+ Write a block of data and wait until all data is written.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="UnifiedIO.blocksource"></a><strong>UnifiedIO:blocksource</strong>&nbsp;(blocksize, limit)</dt>
+<dd>
+
+ Create a block-based iterator.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ blocksize: Advisory blocksize (optional)
+ </li>
+
+ <li>
+ limit: Amount of data to consume (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function uses the low-level read function of the descriptor.
+
+ <li>The blocksize given is only advisory and to be seen as an upper limit,
+ if an underlying read returns less bytes the chunk is nevertheless returned.
+
+ <li>If the limit parameter is omitted, the iterator returns data
+ until an end-of-file, end-of-stream, connection shutdown or similar happens.
+
+ <li>The iterator will not buffer so it is safe to mix with calls to read.
+
+ <li>If the descriptor is non-blocking the iterator may fail with EAGAIN.
+
+ <li>The iterator can be used as an LTN12 source.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+Block-based Iterator
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.close"></a><strong>UnifiedIO:close</strong>&nbsp;()</dt>
+<dd>
+
+ Close the descriptor.
+
+
+
+
+
+<h3>Usage:</h3>
+If the descriptor is a TLS-socket the underlying descriptor is
+ closed without touching the TLS connection.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.copy"></a><strong>UnifiedIO:copy</strong>&nbsp;(fdout, size)</dt>
+<dd>
+
+ Copy data from the current descriptor to another one.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ fdout: Target Descriptor
+ </li>
+
+ <li>
+ size: Bytes to copy (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function uses the blocksource function of the source descriptor
+ and the sink function of the target descriptor.
+
+ <li>If the limit parameter is omitted, data is copied
+ until an end-of-file, end-of-stream, connection shutdown or similar happens.
+
+ <li>If the descriptor is non-blocking the function may fail with EAGAIN.
+
+</ul>
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>bytes that were successfully written if no error occurred
+
+ <li>- reserved for error code -
+
+ <li>- reserved for error message -
+
+ <li>bytes that were successfully written even if an error occurred
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.copyz"></a><strong>UnifiedIO:copyz</strong>&nbsp;(fdout, size)</dt>
+<dd>
+
+ Copy data from the current descriptor to another one using kernel-space
+ copying if possible.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ fdout: Target Descriptor
+ </li>
+
+ <li>
+ size: Bytes to copy (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function uses the sendfile() syscall to copy the data or the
+ blocksource function of the source descriptor and the sink function
+ of the target descriptor as a fallback mechanism.
+
+ <li>If the limit parameter is omitted, data is copied
+ until an end-of-file, end-of-stream, connection shutdown or similar happens.
+
+ <li>If the descriptor is non-blocking the function may fail with EAGAIN.
+
+</ul>
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>bytes that were successfully written if no error occurred
+
+ <li>- reserved for error code -
+
+ <li>- reserved for error message -
+
+ <li>bytes that were successfully written even if an error occurred
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.is_file"></a><strong>UnifiedIO:is_file</strong>&nbsp;()</dt>
+<dd>
+
+ Test whether the I/O-Descriptor is a file.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+boolean
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.is_socket"></a><strong>UnifiedIO:is_socket</strong>&nbsp;()</dt>
+<dd>
+
+ Test whether the I/O-Descriptor is a socket.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+boolean
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.is_tls_socket"></a><strong>UnifiedIO:is_tls_socket</strong>&nbsp;()</dt>
+<dd>
+
+ Test whether the I/O-Descriptor is a TLS socket.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+boolean
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.linesource"></a><strong>UnifiedIO:linesource</strong>&nbsp;(limit)</dt>
+<dd>
+
+ Create a line-based iterator.
+ Lines may end with either \n or \r\n, these control chars are not included
+ in the return value.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ limit: Line limit
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function uses the low-level read function of the descriptor.
+
+ <li><strong>Note:</strong> This function uses an internal buffer to read
+ ahead. Do NOT mix calls to read(all) and the returned iterator. If you want
+ to stop reading line-based and want to use the read(all) functions instead
+ you can pass "true" to the iterator which will flush the buffer
+ and return the bufferd data.
+
+ <li>If the limit parameter is omitted, this function uses the nixio
+ buffersize (8192B by default).
+
+ <li>If the descriptor is non-blocking the iterator may fail with EAGAIN.
+
+ <li>The iterator can be used as an LTN12 source.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+Line-based Iterator
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.readall"></a><strong>UnifiedIO:readall</strong>&nbsp;(length)</dt>
+<dd>
+
+ Read a block of data and wait until all data is available.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ length: Bytes to read (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function uses the low-level read function of the descriptor.
+
+ <li>If the length parameter is omitted, this function returns all data
+ that can be read before an end-of-file, end-of-stream, connection shutdown
+ or similar happens.
+
+ <li>If the descriptor is non-blocking this function may fail with EAGAIN.
+
+</ul>
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>data that was successfully read if no error occurred
+
+ <li>- reserved for error code -
+
+ <li>- reserved for error message -
+
+ <li>data that was successfully read even if an error occurred
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.sink"></a><strong>UnifiedIO:sink</strong>&nbsp;(close_when_done)</dt>
+<dd>
+
+ Create a sink.
+ This sink will simply write all data that it receives and optionally
+ close the descriptor afterwards.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ close_when_done: (optional, boolean)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function uses the writeall function of the descriptor.
+
+ <li>If the descriptor is non-blocking the sink may fail with EAGAIN.
+
+ <li>The iterator can be used as an LTN12 sink.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+Sink
+
+
+
+</dd>
+
+
+
+
+<dt><a name="UnifiedIO.writeall"></a><strong>UnifiedIO:writeall</strong>&nbsp;(block)</dt>
+<dd>
+
+ Write a block of data and wait until all data is written.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ block: Bytes to write
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function uses the low-level write function of the descriptor.
+
+ <li>If the descriptor is non-blocking this function may fail with EAGAIN.
+
+</ul>
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>bytes that were successfully written if no error occurred
+
+ <li>- reserved for error code -
+
+ <li>- reserved for error message -
+
+ <li>bytes that were successfully written even if an error occurred
+
+</ol>
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/nixio.bin.html b/docs/api/modules/nixio.bin.html
new file mode 100644
index 000000000..48e6fcd8b
--- /dev/null
+++ b/docs/api/modules/nixio.bin.html
@@ -0,0 +1,423 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li><strong>nixio.bin</strong></li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>nixio.bin</code></h1>
+
+<p>
+ Binary operations and conversion.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#b64decode">b64decode</a>&nbsp;(buffer)</td>
+ <td class="summary">
+ Base64 decode a given buffer.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#b64encode">b64encode</a>&nbsp;(buffer)</td>
+ <td class="summary">
+ Base64 encode a given buffer.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#crc32">crc32</a>&nbsp;(buffer, initial)</td>
+ <td class="summary">
+ Calculate the CRC32 value of a buffer.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#hexlify">hexlify</a>&nbsp;(buffer)</td>
+ <td class="summary">
+ Return a hexadecimal ASCII represantation of the content of a buffer.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#unhexlify">unhexlify</a>&nbsp;(hexvalue)</td>
+ <td class="summary">
+ Return a binary buffer from a hexadecimal ASCII representation.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="b64decode"></a><strong>b64decode</strong>&nbsp;(buffer)</dt>
+<dd>
+
+ Base64 decode a given buffer.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Base 64 Encoded data
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+binary data
+
+
+
+</dd>
+
+
+
+
+<dt><a name="b64encode"></a><strong>b64encode</strong>&nbsp;(buffer)</dt>
+<dd>
+
+ Base64 encode a given buffer.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+base64 encoded buffer
+
+
+
+</dd>
+
+
+
+
+<dt><a name="crc32"></a><strong>crc32</strong>&nbsp;(buffer, initial)</dt>
+<dd>
+
+ Calculate the CRC32 value of a buffer.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer
+ </li>
+
+ <li>
+ initial: Initial CRC32 value (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+crc32 value
+
+
+
+</dd>
+
+
+
+
+<dt><a name="hexlify"></a><strong>hexlify</strong>&nbsp;(buffer)</dt>
+<dd>
+
+ Return a hexadecimal ASCII represantation of the content of a buffer.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ buffer: Buffer
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+representation using characters [0-9a-f]
+
+
+
+</dd>
+
+
+
+
+<dt><a name="unhexlify"></a><strong>unhexlify</strong>&nbsp;(hexvalue)</dt>
+<dd>
+
+ Return a binary buffer from a hexadecimal ASCII representation.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ hexvalue: representation using characters [0-9a-f]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+binary data
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/nixio.bit.html b/docs/api/modules/nixio.bit.html
new file mode 100644
index 000000000..419736363
--- /dev/null
+++ b/docs/api/modules/nixio.bit.html
@@ -0,0 +1,740 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li><strong>nixio.bit</strong></li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>nixio.bit</code></h1>
+
+<p>
+ Bitfield operators and mainpulation functions.
+ Can be used as a drop-in replacement for bitlib.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#arshift">arshift</a>&nbsp;(oper, shift)</td>
+ <td class="summary">
+ Arithmetically right shift a number.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#band">band</a>&nbsp;(oper1, oper2, ...)</td>
+ <td class="summary">
+ Bitwise AND several numbers.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#bnot">bnot</a>&nbsp;(oper)</td>
+ <td class="summary">
+ Invert given number.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#bor">bor</a>&nbsp;(oper1, oper2, ...)</td>
+ <td class="summary">
+ Bitwise OR several numbers.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#bxor">bxor</a>&nbsp;(oper1, oper2, ...)</td>
+ <td class="summary">
+ Bitwise XOR several numbers.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#cast">cast</a>&nbsp;(oper)</td>
+ <td class="summary">
+ Cast a number to the bit-operating range.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#check">check</a>&nbsp;(bitfield, flag1, ...)</td>
+ <td class="summary">
+ Checks whether given flags are set in a bitfield.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#div">div</a>&nbsp;(oper1, oper2, ...)</td>
+ <td class="summary">
+ Integer division of 2 or more numbers.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#lshift">lshift</a>&nbsp;(oper, shift)</td>
+ <td class="summary">
+ Left shift a number.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#rshift">rshift</a>&nbsp;(oper, shift)</td>
+ <td class="summary">
+ Right shift a number.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#set">set</a>&nbsp;(bitfield, flag1, ...)</td>
+ <td class="summary">
+ Sets one or more flags of a bitfield.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#unset">unset</a>&nbsp;(bitfield, flag1, ...)</td>
+ <td class="summary">
+ Unsets one or more flags of a bitfield.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="arshift"></a><strong>arshift</strong>&nbsp;(oper, shift)</dt>
+<dd>
+
+ Arithmetically right shift a number.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper: number
+ </li>
+
+ <li>
+ shift: bits to shift
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="band"></a><strong>band</strong>&nbsp;(oper1, oper2, ...)</dt>
+<dd>
+
+ Bitwise AND several numbers.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper1: First Operand
+ </li>
+
+ <li>
+ oper2: Second Operand
+ </li>
+
+ <li>
+ ...: More Operands
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="bnot"></a><strong>bnot</strong>&nbsp;(oper)</dt>
+<dd>
+
+ Invert given number.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper: Operand
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="bor"></a><strong>bor</strong>&nbsp;(oper1, oper2, ...)</dt>
+<dd>
+
+ Bitwise OR several numbers.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper1: First Operand
+ </li>
+
+ <li>
+ oper2: Second Operand
+ </li>
+
+ <li>
+ ...: More Operands
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="bxor"></a><strong>bxor</strong>&nbsp;(oper1, oper2, ...)</dt>
+<dd>
+
+ Bitwise XOR several numbers.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper1: First Operand
+ </li>
+
+ <li>
+ oper2: Second Operand
+ </li>
+
+ <li>
+ ...: More Operands
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="cast"></a><strong>cast</strong>&nbsp;(oper)</dt>
+<dd>
+
+ Cast a number to the bit-operating range.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper: number
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="check"></a><strong>check</strong>&nbsp;(bitfield, flag1, ...)</dt>
+<dd>
+
+ Checks whether given flags are set in a bitfield.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ bitfield: Bitfield
+ </li>
+
+ <li>
+ flag1: First Flag
+ </li>
+
+ <li>
+ ...: More Flags
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true when all flags are set, otherwise false
+
+
+
+</dd>
+
+
+
+
+<dt><a name="div"></a><strong>div</strong>&nbsp;(oper1, oper2, ...)</dt>
+<dd>
+
+ Integer division of 2 or more numbers.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper1: Operand 1
+ </li>
+
+ <li>
+ oper2: Operand 2
+ </li>
+
+ <li>
+ ...: More Operands
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="lshift"></a><strong>lshift</strong>&nbsp;(oper, shift)</dt>
+<dd>
+
+ Left shift a number.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper: number
+ </li>
+
+ <li>
+ shift: bits to shift
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="rshift"></a><strong>rshift</strong>&nbsp;(oper, shift)</dt>
+<dd>
+
+ Right shift a number.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oper: number
+ </li>
+
+ <li>
+ shift: bits to shift
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+number
+
+
+
+</dd>
+
+
+
+
+<dt><a name="set"></a><strong>set</strong>&nbsp;(bitfield, flag1, ...)</dt>
+<dd>
+
+ Sets one or more flags of a bitfield.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ bitfield: Bitfield
+ </li>
+
+ <li>
+ flag1: First Flag
+ </li>
+
+ <li>
+ ...: More Flags
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+altered bitfield
+
+
+
+</dd>
+
+
+
+
+<dt><a name="unset"></a><strong>unset</strong>&nbsp;(bitfield, flag1, ...)</dt>
+<dd>
+
+ Unsets one or more flags of a bitfield.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ bitfield: Bitfield
+ </li>
+
+ <li>
+ flag1: First Flag
+ </li>
+
+ <li>
+ ...: More Flags
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+altered bitfield
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/nixio.crypto.html b/docs/api/modules/nixio.crypto.html
new file mode 100644
index 000000000..b91fe28c1
--- /dev/null
+++ b/docs/api/modules/nixio.crypto.html
@@ -0,0 +1,315 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li><strong>nixio.crypto</strong></li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>nixio.crypto</code></h1>
+
+<p>
+ Cryptographical library.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.crypto.hash">hash</a>&nbsp;(algo)</td>
+ <td class="summary">
+ Create a hash object.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.crypto.hmac">hmac</a>&nbsp;(algo, key)</td>
+ <td class="summary">
+ Create a HMAC object.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="nixio.crypto.hash"></a><strong>hash</strong>&nbsp;(algo)</dt>
+<dd>
+
+ Create a hash object.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ algo: Algorithm ["sha1", "md5"]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+CryptoHash Object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.crypto.hmac"></a><strong>hmac</strong>&nbsp;(algo, key)</dt>
+<dd>
+
+ Create a HMAC object.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ algo: Algorithm ["sha1", "md5"]
+ </li>
+
+ <li>
+ key: HMAC-Key
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+CryptoHash Object
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/nixio.fs.html b/docs/api/modules/nixio.fs.html
new file mode 100644
index 000000000..c9d34591c
--- /dev/null
+++ b/docs/api/modules/nixio.fs.html
@@ -0,0 +1,1558 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.html">nixio</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li><strong>nixio.fs</strong></li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>nixio.fs</code></h1>
+
+<p>
+ Low-level and high-level filesystem manipulation library.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.access">access</a>&nbsp;(path, mode1, ...)</td>
+ <td class="summary">
+ Check user's permission on a file.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.basename">basename</a>&nbsp;(path)</td>
+ <td class="summary">
+ Strip the directory part from a path.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.chmod">chmod</a>&nbsp;(path, mode)</td>
+ <td class="summary">
+ Change the file mode.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.chown">chown</a>&nbsp;(path, user, group)</td>
+ <td class="summary">
+ (POSIX) Change owner and group of a file.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.copy">copy</a>&nbsp;(src, dest)</td>
+ <td class="summary">
+ Copy a file, directory or symlink non-recursively preserving file mode,
+ timestamps, owner and group.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.copyr">copyr</a>&nbsp;(src, dest)</td>
+ <td class="summary">
+ Copy a file, directory or symlink recursively preserving file mode,
+ timestamps, owner and group.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.datacopy">datacopy</a>&nbsp;(src, dest, limit)</td>
+ <td class="summary">
+ Copy data between files.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.dir">dir</a>&nbsp;(path)</td>
+ <td class="summary">
+ Iterate over the entries of a directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.dirname">dirname</a>&nbsp;(path)</td>
+ <td class="summary">
+ Strip the base from a path.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.glob">glob</a>&nbsp;(pattern)</td>
+ <td class="summary">
+ (POSIX) Find pathnames matching a pattern.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.lchown">lchown</a>&nbsp;(path, user, group)</td>
+ <td class="summary">
+ (POSIX) Change owner and group of a file and do not resolve
+ if target is a symlink.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.link">link</a>&nbsp;(oldpath, newpath)</td>
+ <td class="summary">
+ Create a hard link.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.lstat">lstat</a>&nbsp;(path, field)</td>
+ <td class="summary">
+ Get file status and attributes and do not resolve if target is a symlink.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.mkdir">mkdir</a>&nbsp;(path, mode)</td>
+ <td class="summary">
+ Create a new directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.mkdirr">mkdirr</a>&nbsp;(dest, mode)</td>
+ <td class="summary">
+ Create a directory and all needed parent directories recursively.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.mkfifo">mkfifo</a>&nbsp;(path, mode)</td>
+ <td class="summary">
+ (POSIX) Create a FIFO (named pipe).</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.move">move</a>&nbsp;(src, dest)</td>
+ <td class="summary">
+ Rename a file, directory or symlink non-recursively across filesystems.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.mover">mover</a>&nbsp;(src, dest)</td>
+ <td class="summary">
+ Rename a file, directory or symlink recursively across filesystems.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.readfile">readfile</a>&nbsp;(path, limit)</td>
+ <td class="summary">
+ Read the contents of a file into a buffer.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.readlink">readlink</a>&nbsp;(path)</td>
+ <td class="summary">
+ (POSIX) Read the target of a symbolic link.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.realpath">realpath</a>&nbsp;(path)</td>
+ <td class="summary">
+ Return the cannonicalized absolute pathname.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.remove">remove</a>&nbsp;(path)</td>
+ <td class="summary">
+ Remove a file or directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.rename">rename</a>&nbsp;(src, dest)</td>
+ <td class="summary">
+ Renames a file or directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.rmdir">rmdir</a>&nbsp;(path)</td>
+ <td class="summary">
+ Remove an empty directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.stat">stat</a>&nbsp;(path, field)</td>
+ <td class="summary">
+ Get file status and attributes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.statvfs">statvfs</a>&nbsp;(path)</td>
+ <td class="summary">
+ (POSIX) Get filesystem statistics.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.symlink">symlink</a>&nbsp;(oldpath, newpath)</td>
+ <td class="summary">
+ (POSIX) Create a symbolic link.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.unlink">unlink</a>&nbsp;(path)</td>
+ <td class="summary">
+ Delete a name and - if no links are left - the associated file.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.utimes">utimes</a>&nbsp;(path, actime, mtime)</td>
+ <td class="summary">
+ Change file last access and last modification time.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fs.writefile">writefile</a>&nbsp;(path, data)</td>
+ <td class="summary">
+ Write a buffer into a file truncating the file first.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="nixio.fs.access"></a><strong>access</strong>&nbsp;(path, mode1, ...)</dt>
+<dd>
+
+ Check user's permission on a file.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ mode1: First Mode to check ["f", "r", "w", "x"]
+ </li>
+
+ <li>
+ ...: More Modes to check [-"-]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.basename"></a><strong>basename</strong>&nbsp;(path)</dt>
+<dd>
+
+ Strip the directory part from a path.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function cannot fail and will never return nil.
+
+
+
+<h3>Return value:</h3>
+basename
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.chmod"></a><strong>chmod</strong>&nbsp;(path, mode)</dt>
+<dd>
+
+ Change the file mode.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ mode: File mode
+ [decimal mode number, "[-r][-w][-xsS][-r][-w][-xsS][-r][-w][-xtT]"]
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>Windows only supports setting the write-protection through the
+ "Writable to others" bit.
+
+ <li><strong>Notice:</strong> The mode-flag for the functions
+ open, mkdir, mkfifo are affected by the umask.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="">
+ umask
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.chown"></a><strong>chown</strong>&nbsp;(path, user, group)</dt>
+<dd>
+
+ (POSIX) Change owner and group of a file.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ user: User ID or Username (optional)
+ </li>
+
+ <li>
+ group: Group ID or Groupname (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.copy"></a><strong>copy</strong>&nbsp;(src, dest)</dt>
+<dd>
+
+ Copy a file, directory or symlink non-recursively preserving file mode,
+ timestamps, owner and group.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Source path
+ </li>
+
+ <li>
+ dest: Destination path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+The destination must always be a full destination path e.g. do not
+ omit the basename even if source and destination basename are equal.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.copyr"></a><strong>copyr</strong>&nbsp;(src, dest)</dt>
+<dd>
+
+ Copy a file, directory or symlink recursively preserving file mode,
+ timestamps, owner and group.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Source path
+ </li>
+
+ <li>
+ dest: Destination path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+The destination must always be a full destination path e.g. do not
+ omit the basename even if source and destination basename are equal.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.datacopy"></a><strong>datacopy</strong>&nbsp;(src, dest, limit)</dt>
+<dd>
+
+ Copy data between files.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Source file path
+ </li>
+
+ <li>
+ dest: Destination file path
+ </li>
+
+ <li>
+ limit: Maximum bytes to copy (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.dir"></a><strong>dir</strong>&nbsp;(path)</dt>
+<dd>
+
+ Iterate over the entries of a directory.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+The special entries "." and ".." are omitted.
+
+
+
+<h3>Return value:</h3>
+directory iterator returning one entry per call
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.dirname"></a><strong>dirname</strong>&nbsp;(path)</dt>
+<dd>
+
+ Strip the base from a path.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function cannot fail and will never return nil.
+
+
+
+<h3>Return value:</h3>
+dirname
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.glob"></a><strong>glob</strong>&nbsp;(pattern)</dt>
+<dd>
+
+ (POSIX) Find pathnames matching a pattern.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pattern: Pattern
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>path iterator
+
+ <li>number of matches
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.lchown"></a><strong>lchown</strong>&nbsp;(path, user, group)</dt>
+<dd>
+
+ (POSIX) Change owner and group of a file and do not resolve
+ if target is a symlink.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ user: User ID or Username (optional)
+ </li>
+
+ <li>
+ group: Group ID or Groupname (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.link"></a><strong>link</strong>&nbsp;(oldpath, newpath)</dt>
+<dd>
+
+ Create a hard link.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oldpath: Path
+ </li>
+
+ <li>
+ newpath: Path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function calls link() on POSIX and CreateHardLink() on Windows.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.lstat"></a><strong>lstat</strong>&nbsp;(path, field)</dt>
+<dd>
+
+ Get file status and attributes and do not resolve if target is a symlink.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ field: Only return a specific field, not the whole table (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing attributes (see stat for a detailed description)
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.fs.stat">
+ stat
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.mkdir"></a><strong>mkdir</strong>&nbsp;(path, mode)</dt>
+<dd>
+
+ Create a new directory.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ mode: File mode (optional, see chmod and umask)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.fs.chmod">
+ chmod
+ </a>
+
+ <li><a href="">
+ umask
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.mkdirr"></a><strong>mkdirr</strong>&nbsp;(dest, mode)</dt>
+<dd>
+
+ Create a directory and all needed parent directories recursively.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ dest: Destination path
+ </li>
+
+ <li>
+ mode: File mode (optional, see chmod and umask)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.fs.chmod">
+ chmod
+ </a>
+
+ <li><a href="">
+ umask
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.mkfifo"></a><strong>mkfifo</strong>&nbsp;(path, mode)</dt>
+<dd>
+
+ (POSIX) Create a FIFO (named pipe).
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ mode: File mode (optional, see chmod and umask)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.fs.chmod">
+ chmod
+ </a>
+
+ <li><a href="">
+ umask
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.move"></a><strong>move</strong>&nbsp;(src, dest)</dt>
+<dd>
+
+ Rename a file, directory or symlink non-recursively across filesystems.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Source path
+ </li>
+
+ <li>
+ dest: Destination path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+The destination must always be a full destination path e.g. do not
+ omit the basename even if source and destination basename are equal.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.mover"></a><strong>mover</strong>&nbsp;(src, dest)</dt>
+<dd>
+
+ Rename a file, directory or symlink recursively across filesystems.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Source path
+ </li>
+
+ <li>
+ dest: Destination path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+The destination must always be a full destination path e.g. do not
+ omit the basename even if source and destination basename are equal.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.readfile"></a><strong>readfile</strong>&nbsp;(path, limit)</dt>
+<dd>
+
+ Read the contents of a file into a buffer.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ limit: Maximum bytes to read (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+file contents
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.readlink"></a><strong>readlink</strong>&nbsp;(path)</dt>
+<dd>
+
+ (POSIX) Read the target of a symbolic link.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+target path
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.realpath"></a><strong>realpath</strong>&nbsp;(path)</dt>
+<dd>
+
+ Return the cannonicalized absolute pathname.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+absolute path
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.remove"></a><strong>remove</strong>&nbsp;(path)</dt>
+<dd>
+
+ Remove a file or directory.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.rename"></a><strong>rename</strong>&nbsp;(src, dest)</dt>
+<dd>
+
+ Renames a file or directory.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ src: Source path
+ </li>
+
+ <li>
+ dest: Destination path
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+It is normally not possible to rename files across filesystems.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.rmdir"></a><strong>rmdir</strong>&nbsp;(path)</dt>
+<dd>
+
+ Remove an empty directory.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.stat"></a><strong>stat</strong>&nbsp;(path, field)</dt>
+<dd>
+
+ Get file status and attributes.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ field: Only return a specific field, not the whole table (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>atime = Last access timestamp</li>
+ <li>blksize = Blocksize (POSIX only)</li>
+ <li>blocks = Blocks used (POSIX only)</li>
+ <li>ctime = Creation timestamp</li>
+ <li>dev = Device ID</li>
+ <li>gid = Group ID</li>
+ <li>ino = Inode</li>
+ <li>modedec = Mode converted into a decimal number</li>
+ <li>modestr = Mode as string as returned by <code>ls -l</code></li>
+ <li>mtime = Last modification timestamp</li>
+ <li>nlink = Number of links</li>
+ <li>rdev = Device ID (if special file)</li>
+ <li>size = Size in bytes</li>
+ <li>type = ["reg", "dir", "chr", "blk", "fifo", "lnk", "sock"]</li>
+ <li>uid = User ID</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.statvfs"></a><strong>statvfs</strong>&nbsp;(path)</dt>
+<dd>
+
+ (POSIX) Get filesystem statistics.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path to any file within the filesystem.
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>bavail = available blocks</li>
+ <li>bfree = free blocks</li>
+ <li>blocks = number of fragments</li>
+ <li>frsize = fragment size</li>
+ <li>favail = available inodes</li>
+ <li>ffree = free inodes</li>
+ <li>files = inodes</li>
+ <li>flag = flags</li>
+ <li>fsid = filesystem ID</li>
+ <li>namemax = maximum filename length</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.symlink"></a><strong>symlink</strong>&nbsp;(oldpath, newpath)</dt>
+<dd>
+
+ (POSIX) Create a symbolic link.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oldpath: Path
+ </li>
+
+ <li>
+ newpath: Path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.unlink"></a><strong>unlink</strong>&nbsp;(path)</dt>
+<dd>
+
+ Delete a name and - if no links are left - the associated file.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.utimes"></a><strong>utimes</strong>&nbsp;(path, actime, mtime)</dt>
+<dd>
+
+ Change file last access and last modification time.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ actime: Last access timestamp (optional, default: current time)
+ </li>
+
+ <li>
+ mtime: Last modification timestamp (optional, default: actime)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fs.writefile"></a><strong>writefile</strong>&nbsp;(path, data)</dt>
+<dd>
+
+ Write a buffer into a file truncating the file first.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Path
+ </li>
+
+ <li>
+ data: Data to write
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>
diff --git a/docs/api/modules/nixio.html b/docs/api/modules/nixio.html
new file mode 100644
index 000000000..bf93619c9
--- /dev/null
+++ b/docs/api/modules/nixio.html
@@ -0,0 +1,2401 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>Reference</title>
+ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
+ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
+</head>
+
+<body>
+<div id="container">
+
+<div id="product">
+ <div id="product_logo"></div>
+ <div id="product_name"><big><b></b></big></div>
+ <div id="product_description"></div>
+</div> <!-- id="product" -->
+
+<div id="main">
+
+<div id="navigation">
+
+
+<h1>LuaDoc</h1>
+<ul>
+
+ <li><a href="../index.html">Index</a></li>
+
+</ul>
+
+
+<!-- Module list -->
+
+<h1>Modules</h1>
+<ul>
+
+ <li>
+ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.html">luci.http</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.conditionals.html">luci.http.conditionals</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.date.html">luci.http.date</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.http.mime.html">luci.http.mime</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.i18n.html">luci.i18n</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.html">luci.ip</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.json.html">luci.json</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.html">luci.sys</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
+ </li>
+
+ <li>
+ <a href="../modules/luci.util.html">luci.util</a>
+ </li>
+
+ <li><strong>nixio</strong></li>
+
+ <li>
+ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.File.html">nixio.File</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.README.html">nixio.README</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bin.html">nixio.bin</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.bit.html">nixio.bit</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
+ </li>
+
+ <li>
+ <a href="../modules/nixio.fs.html">nixio.fs</a>
+ </li>
+
+</ul>
+
+
+
+<!-- File list -->
+
+
+
+
+
+
+
+</div><!-- id="navigation" -->
+
+<div id="content">
+
+<h1>Class <code>nixio</code></h1>
+
+<p>
+ General POSIX IO library.</p>
+
+
+
+
+
+
+
+<h2>Functions</h2>
+<table class="function_list">
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.bind">bind</a>&nbsp;(host, port, family, socktype)</td>
+ <td class="summary">
+ Create a new socket and bind it to a network address.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.chdir">chdir</a>&nbsp;(path)</td>
+ <td class="summary">
+ Change the working directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.closelog">closelog</a>&nbsp;()</td>
+ <td class="summary">
+ (POSIX) Close the connection to the system logger.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.connect">connect</a>&nbsp;(host, port, family, socktype)</td>
+ <td class="summary">
+ Create a new socket and connect to a network address.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.crypt">crypt</a>&nbsp;(key, salt)</td>
+ <td class="summary">
+ (POSIX) Encrypt a user password.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.dup">dup</a>&nbsp;(oldfd, newfd)</td>
+ <td class="summary">
+ Duplicate a file descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.errno">errno</a>&nbsp;()</td>
+ <td class="summary">
+ Get the last system error code.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.exec">exec</a>&nbsp;(executable, ...)</td>
+ <td class="summary">
+ Execute a file to replace the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.exece">exece</a>&nbsp;(executable, arguments, environment)</td>
+ <td class="summary">
+ Execute a file with a custom environment to replace the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.execp">execp</a>&nbsp;(executable, ...)</td>
+ <td class="summary">
+ Invoke the shell and execute a file to replace the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.fork">fork</a>&nbsp;()</td>
+ <td class="summary">
+ (POSIX) Clone the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getaddrinfo">getaddrinfo</a>&nbsp;(host, family, service)</td>
+ <td class="summary">
+ Look up a hostname and service via DNS.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getcwd">getcwd</a>&nbsp;()</td>
+ <td class="summary">
+ Get the current working directory.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getenv">getenv</a>&nbsp;(variable)</td>
+ <td class="summary">
+ Get the current environment table or a specific environment variable.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getgid">getgid</a>&nbsp;()</td>
+ <td class="summary">
+ (POSIX) Get the group id of the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getgr">getgr</a>&nbsp;(group)</td>
+ <td class="summary">
+ (POSIX) Get all or a specific user group.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getifaddrs">getifaddrs</a>&nbsp;()</td>
+ <td class="summary">
+ (Linux, BSD) Get a list of available network interfaces and their addresses.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getnameinfo">getnameinfo</a>&nbsp;(ipaddr)</td>
+ <td class="summary">
+ Reverse look up an IP-Address via DNS.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getpid">getpid</a>&nbsp;()</td>
+ <td class="summary">
+ Get the ID of the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getppid">getppid</a>&nbsp;()</td>
+ <td class="summary">
+ (POSIX) Get the parent process id of the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getproto">getproto</a>&nbsp;(proto)</td>
+ <td class="summary">
+ Get all or a specific proto entry.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getprotobyname">getprotobyname</a>&nbsp;(name)</td>
+ <td class="summary">
+ Get protocol entry by name.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getprotobynumber">getprotobynumber</a>&nbsp;(proto)</td>
+ <td class="summary">
+ Get protocol entry by number.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getpw">getpw</a>&nbsp;(user)</td>
+ <td class="summary">
+ (POSIX) Get all or a specific user account.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getsp">getsp</a>&nbsp;(user)</td>
+ <td class="summary">
+ (Linux, Solaris) Get all or a specific shadow password entry.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.getuid">getuid</a>&nbsp;()</td>
+ <td class="summary">
+ (POSIX) Get the user id of the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.kill">kill</a>&nbsp;(target, signal)</td>
+ <td class="summary">
+ (POSIX) Send a signal to one or more processes.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.nanosleep">nanosleep</a>&nbsp;(seconds, nanoseconds)</td>
+ <td class="summary">
+ Sleep for a specified amount of time.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.nice">nice</a>&nbsp;(nice)</td>
+ <td class="summary">
+ (POSIX) Change priority of current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.open">open</a>&nbsp;(path, flags, mode)</td>
+ <td class="summary">
+ Open a file.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.open_flags">open_flags</a>&nbsp;(flag1, ...)</td>
+ <td class="summary">
+ Generate flags for a call to open().</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.openlog">openlog</a>&nbsp;(ident, flag1, ...)</td>
+ <td class="summary">
+ (POSIX) Open a connection to the system logger.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.pipe">pipe</a>&nbsp;()</td>
+ <td class="summary">
+ Create a pipe.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.poll">poll</a>&nbsp;(fds, timeout)</td>
+ <td class="summary">
+ Wait for some event on a file descriptor.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.poll_flags">poll_flags</a>&nbsp;(mode1, ...)</td>
+ <td class="summary">
+ Generate events-bitfield or parse revents-bitfield for poll.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.sendfile">sendfile</a>&nbsp;(socket, file, length)</td>
+ <td class="summary">
+ (POSIX) Send data from a file to a socket in kernel-space.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.setenv">setenv</a>&nbsp;(variable, value)</td>
+ <td class="summary">
+ Set or unset a environment variable.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.setgid">setgid</a>&nbsp;(gid)</td>
+ <td class="summary">
+ (POSIX) Set the group id of the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.setlogmask">setlogmask</a>&nbsp;(priority)</td>
+ <td class="summary">
+ (POSIX) Set the logmask of the system logger for current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.setsid">setsid</a>&nbsp;()</td>
+ <td class="summary">
+ (POSIX) Create a new session and set the process group ID.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.setuid">setuid</a>&nbsp;(gid)</td>
+ <td class="summary">
+ (POSIX) Set the user id of the current process.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.signal">signal</a>&nbsp;(signal, handler)</td>
+ <td class="summary">
+ Ignore or use set the default handler for a signal.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.socket">socket</a>&nbsp;(domain, type)</td>
+ <td class="summary">
+ Create a new socket.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.splice">splice</a>&nbsp;(fdin, fdout, length, flags)</td>
+ <td class="summary">
+ (Linux) Send data from / to a pipe in kernel-space.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.splice_flags">splice_flags</a>&nbsp;(flag1, ...)</td>
+ <td class="summary">
+ (Linux) Generate a flag bitfield for a call to splice.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.strerror">strerror</a>&nbsp;(errno)</td>
+ <td class="summary">
+ Get the error message for the corresponding error code.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.sysinfo">sysinfo</a>&nbsp;()</td>
+ <td class="summary">
+ (Linux) Get overall system statistics.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.syslog">syslog</a>&nbsp;(priority)</td>
+ <td class="summary">
+ (POSIX) Write a message to the system logger.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.times">times</a>&nbsp;()</td>
+ <td class="summary">
+ (POSIX) Get process times.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.tls">tls</a>&nbsp;(mode)</td>
+ <td class="summary">
+ Create a new TLS context.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.umask">umask</a>&nbsp;(mask)</td>
+ <td class="summary">
+ Sets the file mode creation mask.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.uname">uname</a>&nbsp;()</td>
+ <td class="summary">
+ (POSIX) Get information about current system and kernel.</td>
+ </tr>
+
+ <tr>
+ <td class="name" nowrap><a href="#nixio.waitpid">waitpid</a>&nbsp;(pid, flag1, ...)</td>
+ <td class="summary">
+ (POSIX) Wait for a process to change state.</td>
+ </tr>
+
+</table>
+
+
+
+
+
+
+<br/>
+<br/>
+
+
+<h2><a name="functions"></a>Functions</h2>
+<dl class="function">
+
+
+
+<dt><a name="nixio.bind"></a><strong>bind</strong>&nbsp;(host, port, family, socktype)</dt>
+<dd>
+
+ Create a new socket and bind it to a network address.
+ This function is a shortcut for calling nixio.socket and then bind()
+ on the socket object.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ host: Hostname or IP-Address (optional, default: all addresses)
+ </li>
+
+ <li>
+ port: Port or service description
+ </li>
+
+ <li>
+ family: Address family [<strong>"any"</strong>, "inet", "inet6"]
+ </li>
+
+ <li>
+ socktype: Socket Type [<strong>"stream"</strong>, "dgram"]
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This functions calls getaddrinfo(), socket(),
+ setsockopt() and bind() but NOT listen().
+
+ <li>The <em>reuseaddr</em>-option is automatically set before binding.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+Socket Object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.chdir"></a><strong>chdir</strong>&nbsp;(path)</dt>
+<dd>
+
+ Change the working directory.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: New working directory
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.closelog"></a><strong>closelog</strong>&nbsp;()</dt>
+<dd>
+
+ (POSIX) Close the connection to the system logger.
+
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.connect"></a><strong>connect</strong>&nbsp;(host, port, family, socktype)</dt>
+<dd>
+
+ Create a new socket and connect to a network address.
+ This function is a shortcut for calling nixio.socket and then connect()
+ on the socket object.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ host: Hostname or IP-Address (optional, default: localhost)
+ </li>
+
+ <li>
+ port: Port or service description
+ </li>
+
+ <li>
+ family: Address family [<strong>"any"</strong>, "inet", "inet6"]
+ </li>
+
+ <li>
+ socktype: Socket Type [<strong>"stream"</strong>, "dgram"]
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This functions calls getaddrinfo(), socket() and connect().
+
+
+
+<h3>Return value:</h3>
+Socket Object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.crypt"></a><strong>crypt</strong>&nbsp;(key, salt)</dt>
+<dd>
+
+ (POSIX) Encrypt a user password.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ key: Key
+ </li>
+
+ <li>
+ salt: Salt
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+password hash
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.dup"></a><strong>dup</strong>&nbsp;(oldfd, newfd)</dt>
+<dd>
+
+ Duplicate a file descriptor.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ oldfd: Old descriptor [File Object, Socket Object (POSIX only)]
+ </li>
+
+ <li>
+ newfd: New descriptor to serve as copy (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This funcation calls dup2() if <em>newfd</em> is set, otherwise dup().
+
+
+
+<h3>Return value:</h3>
+File Object of new descriptor
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.errno"></a><strong>errno</strong>&nbsp;()</dt>
+<dd>
+
+ Get the last system error code.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Error code
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.exec"></a><strong>exec</strong>&nbsp;(executable, ...)</dt>
+<dd>
+
+ Execute a file to replace the current process.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ executable: Executable
+ </li>
+
+ <li>
+ ...: Parameters
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>The name of the executable is automatically passed as argv[0]
+
+ <li>This function does not return on success.
+
+</ul>
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.exece"></a><strong>exece</strong>&nbsp;(executable, arguments, environment)</dt>
+<dd>
+
+ Execute a file with a custom environment to replace the current process.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ executable: Executable
+ </li>
+
+ <li>
+ arguments: Argument Table
+ </li>
+
+ <li>
+ environment: Environment Table (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>The name of the executable is automatically passed as argv[0]
+
+ <li>This function does not return on success.
+
+</ul>
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.execp"></a><strong>execp</strong>&nbsp;(executable, ...)</dt>
+<dd>
+
+ Invoke the shell and execute a file to replace the current process.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ executable: Executable
+ </li>
+
+ <li>
+ ...: Parameters
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>The name of the executable is automatically passed as argv[0]
+
+ <li>This function does not return on success.
+
+</ul>
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.fork"></a><strong>fork</strong>&nbsp;()</dt>
+<dd>
+
+ (POSIX) Clone the current process.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+the child process id for the parent process, 0 for the child process
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getaddrinfo"></a><strong>getaddrinfo</strong>&nbsp;(host, family, service)</dt>
+<dd>
+
+ Look up a hostname and service via DNS.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ host: hostname to lookup (optional)
+ </li>
+
+ <li>
+ family: address family [<strong>"any"</strong>, "inet", "inet6"]
+ </li>
+
+ <li>
+ service: service name or port (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing one or more tables containing: <ul>
+ <li>family = ["inet", "inet6"]</li>
+ <li>socktype = ["stream", "dgram", "raw"]</li>
+ <li>address = Resolved IP-Address</li>
+ <li>port = Resolved Port (if service was given)</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getcwd"></a><strong>getcwd</strong>&nbsp;()</dt>
+<dd>
+
+ Get the current working directory.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+workign directory
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getenv"></a><strong>getenv</strong>&nbsp;(variable)</dt>
+<dd>
+
+ Get the current environment table or a specific environment variable.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ variable: Variable (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+environment table or single environment variable
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getgid"></a><strong>getgid</strong>&nbsp;()</dt>
+<dd>
+
+ (POSIX) Get the group id of the current process.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+process group id
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getgr"></a><strong>getgr</strong>&nbsp;(group)</dt>
+<dd>
+
+ (POSIX) Get all or a specific user group.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ group: Group ID or groupname (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>name = Group Name</li>
+ <li>gid = Group ID</li>
+ <li>passwd = Password</li>
+ <li>mem = {Member #1, Member #2, ...}</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getifaddrs"></a><strong>getifaddrs</strong>&nbsp;()</dt>
+<dd>
+
+ (Linux, BSD) Get a list of available network interfaces and their addresses.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing one or more tables containing: <ul>
+ <li>name = Interface Name</li>
+ <li>family = ["inet", "inet6", "packet"]</li>
+ <li>addr = Interface Address (IPv4, IPv6, MAC, ...)</li>
+ <li>broadaddr = Broadcast Address</li>
+ <li>dstaddr = Destination Address (Point-to-Point)</li>
+ <li>netmask = Netmask (if available)</li>
+ <li>prefix = Prefix (if available)</li>
+ <li>flags = Table of interface flags (up, multicast, loopback, ...)</li>
+ <li>data = Statistics (Linux, "packet"-family)</li>
+ <li>hatype = Hardware Type Identifier (Linix, "packet"-family)</li>
+ <li>ifindex = Interface Index (Linux, "packet"-family)</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getnameinfo"></a><strong>getnameinfo</strong>&nbsp;(ipaddr)</dt>
+<dd>
+
+ Reverse look up an IP-Address via DNS.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ipaddr: IPv4 or IPv6-Address
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+FQDN
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getpid"></a><strong>getpid</strong>&nbsp;()</dt>
+<dd>
+
+ Get the ID of the current process.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+process id
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getppid"></a><strong>getppid</strong>&nbsp;()</dt>
+<dd>
+
+ (POSIX) Get the parent process id of the current process.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+parent process id
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getproto"></a><strong>getproto</strong>&nbsp;(proto)</dt>
+<dd>
+
+ Get all or a specific proto entry.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ proto: protocol number or name to lookup (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table (or if no parameter is given, a table of tables)
+ containing the following fields: <ul>
+ <li>name = Protocol Name</li>
+ <li>proto = Protocol Number</li>
+ <li>aliases = Table of alias names</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getprotobyname"></a><strong>getprotobyname</strong>&nbsp;(name)</dt>
+<dd>
+
+ Get protocol entry by name.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ name: protocol name to lookup
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function returns nil if the given protocol is unknown.
+
+
+
+<h3>Return value:</h3>
+Table containing the following fields: <ul>
+ <li>name = Protocol Name</li>
+ <li>proto = Protocol Number</li>
+ <li>aliases = Table of alias names</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getprotobynumber"></a><strong>getprotobynumber</strong>&nbsp;(proto)</dt>
+<dd>
+
+ Get protocol entry by number.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ proto: protocol number to lookup
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+This function returns nil if the given protocol is unknown.
+
+
+
+<h3>Return value:</h3>
+Table containing the following fields: <ul>
+ <li>name = Protocol Name</li>
+ <li>proto = Protocol Number</li>
+ <li>aliases = Table of alias names</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getpw"></a><strong>getpw</strong>&nbsp;(user)</dt>
+<dd>
+
+ (POSIX) Get all or a specific user account.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ user: User ID or username (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>name = Name</li>
+ <li>uid = ID</li>
+ <li>gid = Group ID</li>
+ <li>passwd = Password</li>
+ <li>dir = Home directory</li>
+ <li>gecos = Information</li>
+ <li>shell = Shell</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getsp"></a><strong>getsp</strong>&nbsp;(user)</dt>
+<dd>
+
+ (Linux, Solaris) Get all or a specific shadow password entry.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ user: username (optional)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>namp = Name</li>
+ <li>expire = Expiration Date</li>
+ <li>flag = Flags</li>
+ <li>inact = Inactivity Date</li>
+ <li>lstchg = Last change</li>
+ <li>max = Maximum</li>
+ <li>min = Minimum</li>
+ <li>warn = Warning</li>
+ <li>pwdp = Password Hash</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.getuid"></a><strong>getuid</strong>&nbsp;()</dt>
+<dd>
+
+ (POSIX) Get the user id of the current process.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+process user id
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.kill"></a><strong>kill</strong>&nbsp;(target, signal)</dt>
+<dd>
+
+ (POSIX) Send a signal to one or more processes.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ target: Target process of process group.
+ </li>
+
+ <li>
+ signal: Signal to send
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.nanosleep"></a><strong>nanosleep</strong>&nbsp;(seconds, nanoseconds)</dt>
+<dd>
+
+ Sleep for a specified amount of time.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ seconds: Seconds to wait (optional)
+ </li>
+
+ <li>
+ nanoseconds: Nanoseconds to wait (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>Not all systems support nanosecond precision but you can expect
+ to have at least maillisecond precision.
+
+ <li>This function is not signal-protected and may fail with EINTR.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.nice"></a><strong>nice</strong>&nbsp;(nice)</dt>
+<dd>
+
+ (POSIX) Change priority of current process.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ nice: Nice Value
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.open"></a><strong>open</strong>&nbsp;(path, flags, mode)</dt>
+<dd>
+
+ Open a file.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ path: Filesystem path to open
+ </li>
+
+ <li>
+ flags: Flag string or number (see open_flags).
+ [<strong>"r"</strong>, "r+", "w", "w+", "a", "a+"]
+ </li>
+
+ <li>
+ mode: File mode for newly created files (see chmod, umask).
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+Although this function also supports the traditional fopen()
+ file flags it does not create a file stream but uses the open() syscall.
+
+
+
+<h3>Return value:</h3>
+File Object
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.umask">
+ umask
+ </a>
+
+ <li><a href="#nixio.open_flags">
+ open_flags
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.open_flags"></a><strong>open_flags</strong>&nbsp;(flag1, ...)</dt>
+<dd>
+
+ Generate flags for a call to open().
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ flag1: First Flag ["append", "creat", "excl", "nonblock", "ndelay",
+ "sync", "trunc", "rdonly", "wronly", "rdwr"]
+ </li>
+
+ <li>
+ ...: More Flags [-"-]
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function cannot fail and will never return nil.
+
+ <li>The "nonblock" and "ndelay" flags are aliases.
+
+ <li>The "nonblock", "ndelay" and "sync" flags are no-ops on Windows.
+
+</ul>
+
+
+
+<h3>Return value:</h3>
+flag to be used as second parameter to open
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.openlog"></a><strong>openlog</strong>&nbsp;(ident, flag1, ...)</dt>
+<dd>
+
+ (POSIX) Open a connection to the system logger.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ ident: Identifier
+ </li>
+
+ <li>
+ flag1: Flag 1 ["cons", "nowait", "pid", "perror", "ndelay", "odelay"]
+ </li>
+
+ <li>
+ ...: More flags [-"-]
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.pipe"></a><strong>pipe</strong>&nbsp;()</dt>
+<dd>
+
+ Create a pipe.
+
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>File Object of the read end
+
+ <li>File Object of the write end
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.poll"></a><strong>poll</strong>&nbsp;(fds, timeout)</dt>
+<dd>
+
+ Wait for some event on a file descriptor.
+ poll() sets the revents-field of the tables provided by fds to a bitfield
+ indicating the events that occurred.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ fds: Table containing one or more tables containing <ul>
+ <li> fd = I/O Descriptor [Socket Object, File Object (POSIX)]</li>
+ <li> events = events to wait for (bitfield generated with poll_flags)</li>
+ </ul>
+ </li>
+
+ <li>
+ timeout: Timeout in milliseconds
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage</h3>
+<ul>
+
+ <li>This function works in-place on the provided table and only
+ writes the revents field, you can use other fields on your demand.
+
+ <li>All metamethods on the tables provided as fds are ignored.
+
+ <li>The revents-fields are not reset when the call times out.
+ You have to check the first return value to be 0 to handle this case.
+
+ <li>If you want to wait on a TLS-Socket you have to use the underlying
+ socket instead.
+
+ <li>On Windows poll is emulated through select(), can only be used
+ on socket descriptors and cannot take more than 64 descriptors per call.
+
+ <li>This function is not signal-protected and may fail with EINTR.
+
+</ul>
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>number of ready IO descriptors
+
+ <li>the fds-table with revents-fields set
+
+</ol>
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.poll_flags">
+ poll_flags
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.poll_flags"></a><strong>poll_flags</strong>&nbsp;(mode1, ...)</dt>
+<dd>
+
+ Generate events-bitfield or parse revents-bitfield for poll.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mode1: revents-Flag bitfield returned from poll to parse OR
+ ["in", "out", "err", "pri" (POSIX), "hup" (POSIX), "nval" (POSIX)]
+ </li>
+
+ <li>
+ ...: More mode strings for generating the flag [-"-]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+table with boolean fields reflecting the mode parameter
+ <strong>OR</strong> bitfield to use for the events-Flag field
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.poll">
+ poll
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.sendfile"></a><strong>sendfile</strong>&nbsp;(socket, file, length)</dt>
+<dd>
+
+ (POSIX) Send data from a file to a socket in kernel-space.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ socket: Socket Object
+ </li>
+
+ <li>
+ file: File Object
+ </li>
+
+ <li>
+ length: Amount of data to send (in Bytes).
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+bytes sent
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.setenv"></a><strong>setenv</strong>&nbsp;(variable, value)</dt>
+<dd>
+
+ Set or unset a environment variable.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ variable: Variable
+ </li>
+
+ <li>
+ value: Value (optional)
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+The environment variable will be unset if value is omitted.
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.setgid"></a><strong>setgid</strong>&nbsp;(gid)</dt>
+<dd>
+
+ (POSIX) Set the group id of the current process.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ gid: New Group ID
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.setlogmask"></a><strong>setlogmask</strong>&nbsp;(priority)</dt>
+<dd>
+
+ (POSIX) Set the logmask of the system logger for current process.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ priority: Priority ["emerg", "alert", "crit", "err", "warning",
+ "notice", "info", "debug"]
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.setsid"></a><strong>setsid</strong>&nbsp;()</dt>
+<dd>
+
+ (POSIX) Create a new session and set the process group ID.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+session id
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.setuid"></a><strong>setuid</strong>&nbsp;(gid)</dt>
+<dd>
+
+ (POSIX) Set the user id of the current process.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ gid: New User ID
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.signal"></a><strong>signal</strong>&nbsp;(signal, handler)</dt>
+<dd>
+
+ Ignore or use set the default handler for a signal.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ signal: Signal
+ </li>
+
+ <li>
+ handler: ["ign", "dfl"]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+true
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.socket"></a><strong>socket</strong>&nbsp;(domain, type)</dt>
+<dd>
+
+ Create a new socket.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ domain: Domain ["inet", "inet6", "unix"]
+ </li>
+
+ <li>
+ type: Type ["stream", "dgram", "raw"]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Socket Object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.splice"></a><strong>splice</strong>&nbsp;(fdin, fdout, length, flags)</dt>
+<dd>
+
+ (Linux) Send data from / to a pipe in kernel-space.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ fdin: Input I/O descriptor
+ </li>
+
+ <li>
+ fdout: Output I/O descriptor
+ </li>
+
+ <li>
+ length: Amount of data to send (in Bytes).
+ </li>
+
+ <li>
+ flags: (optional, bitfield generated by splice_flags)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+bytes sent
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.splice_flags">
+ splice_flags
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.splice_flags"></a><strong>splice_flags</strong>&nbsp;(flag1, ...)</dt>
+<dd>
+
+ (Linux) Generate a flag bitfield for a call to splice.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ flag1: First Flag ["move", "nonblock", "more"]
+ </li>
+
+ <li>
+ ...: More flags [-"-]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Flag bitfield
+
+
+
+<h3>See also:</h3>
+<ul>
+
+ <li><a href="#nixio.splice">
+ splice
+ </a>
+
+</ul>
+
+</dd>
+
+
+
+
+<dt><a name="nixio.strerror"></a><strong>strerror</strong>&nbsp;(errno)</dt>
+<dd>
+
+ Get the error message for the corresponding error code.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ errno: System error code
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+Error message
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.sysinfo"></a><strong>sysinfo</strong>&nbsp;()</dt>
+<dd>
+
+ (Linux) Get overall system statistics.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>uptime = system uptime in seconds</li>
+ <li>loads = {loadavg1, loadavg5, loadavg15}</li>
+ <li>totalram = total RAM</li>
+ <li>freeram = free RAM</li>
+ <li>sharedram = shared RAM</li>
+ <li>bufferram = buffered RAM</li>
+ <li>totalswap = total SWAP</li>
+ <li>freeswap = free SWAP</li>
+ <li>procs = number of running processes</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.syslog"></a><strong>syslog</strong>&nbsp;(priority)</dt>
+<dd>
+
+ (POSIX) Write a message to the system logger.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ priority: Priority ["emerg", "alert", "crit", "err", "warning",
+ "notice", "info", "debug"]
+ </li>
+
+</ul>
+
+
+
+
+
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.times"></a><strong>times</strong>&nbsp;()</dt>
+<dd>
+
+ (POSIX) Get process times.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>utime = user time</li>
+ <li>utime = system time</li>
+ <li>cutime = children user time</li>
+ <li>cstime = children system time</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.tls"></a><strong>tls</strong>&nbsp;(mode)</dt>
+<dd>
+
+ Create a new TLS context.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mode: TLS-Mode ["client", "server"]
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return value:</h3>
+TLSContext Object
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.umask"></a><strong>umask</strong>&nbsp;(mask)</dt>
+<dd>
+
+ Sets the file mode creation mask.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ mask: New creation mask (see chmod for format specifications)
+ </li>
+
+</ul>
+
+
+
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>the old umask as decimal mode number
+
+ <li>the old umask as mode string
+
+</ol>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.uname"></a><strong>uname</strong>&nbsp;()</dt>
+<dd>
+
+ (POSIX) Get information about current system and kernel.
+
+
+
+
+
+
+
+<h3>Return value:</h3>
+Table containing: <ul>
+ <li>sysname = operating system</li>
+ <li>nodename = network name (usually hostname)</li>
+ <li>release = OS release</li>
+ <li>version = OS version</li>
+ <li>machine = hardware identifier</li>
+ </ul>
+
+
+
+</dd>
+
+
+
+
+<dt><a name="nixio.waitpid"></a><strong>waitpid</strong>&nbsp;(pid, flag1, ...)</dt>
+<dd>
+
+ (POSIX) Wait for a process to change state.
+
+
+<h3>Parameters</h3>
+<ul>
+
+ <li>
+ pid: Process ID (optional, default: any childprocess)
+ </li>
+
+ <li>
+ flag1: Flag (optional) ["nohang", "untraced", "continued"]
+ </li>
+
+ <li>
+ ...: More Flags [-"-]
+ </li>
+
+</ul>
+
+
+
+
+<h3>Usage:</h3>
+If the "nohang" is given this function becomes non-blocking.
+
+
+
+<h3>Return values:</h3>
+<ol>
+
+ <li>process id of child or 0 if no child has changed state
+
+ <li>["exited", "signaled", "stopped"]
+
+ <li>[exit code, terminate signal, stop signal]
+
+</ol>
+
+
+
+</dd>
+
+
+</dl>
+
+
+
+
+
+</div> <!-- id="content" -->
+
+</div> <!-- id="main" -->
+
+<div id="about">
+ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
+</div> <!-- id="about" -->
+
+</div> <!-- id="container" -->
+</body>
+</html>