<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to Developers</title><link>https://sourceforge.net/p/c-icap/wiki/Developers/</link><description>Recent changes to Developers</description><atom:link href="https://sourceforge.net/p/c-icap/wiki/Developers/feed" rel="self"/><language>en</language><lastBuildDate>Fri, 29 Aug 2014 14:44:14 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/c-icap/wiki/Developers/feed" rel="self" type="application/rss+xml"/><item><title>Developers modified by chtsanti</title><link>https://sourceforge.net/p/c-icap/wiki/Developers/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v3
+++ v4
@@ -9,8 +9,7 @@

     make doc

-The documentation will be produced in HTML form  under the directory ''docs/html/''.
-The c-icap is still under development so some of its API interfaces are not complete and they are subject to change. However someone should not expect huge changes between different releases (0.x releases).
+The documentation will be produced in HTML form  under the directory ''docs/html/''. The c-icap is still under development so some of its API interfaces are not complete and they are subject to change. However someone should not expect huge changes between different releases (0.x releases).

 In this page also exist some sample code for the major tools provided by the c-icap server.

@@ -27,8 +26,7 @@
 - study the echo example service distributed with the c-icap server. This service implemented in **services/echo/srv_echo.c** file
 - install doxygen and produce documentation

-To modify/examine an HTTP objects (HTTP requests or responses) there is a number of utility functions. Most of them are documented with doxygen documentation system 
-in the following modules/sections:
+To modify/examine an HTTP objects (HTTP requests or responses) there is a number of utility functions. Most of them are documented with doxygen documentation system  in the following modules/sections:

 - Headers related API
 - ICAP request API
@@ -145,8 +143,7 @@

 ###How to use c-icap statistics subsystem###

-Visit this web page for an easy way to configure and view c-icap runtime statistics:
-[FAQ:How can I get some c-icap runtime statistics](faqcicap/#q-how-can-i-get-some-c-icap-runtime-statistics)
+Visit this web page for an easy way to configure and view c-icap runtime statistics: [FAQ:How can I get some c-icap runtime statistics](faqcicap/#q-how-can-i-get-some-c-icap-runtime-statistics)

     /* Create the REQUESTS_PROCCESSED and BYTES_PROCESSED counters.
        This part of code normally placed in ci_service_module::mod_post_init_service or 
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">chtsanti</dc:creator><pubDate>Fri, 29 Aug 2014 14:44:14 -0000</pubDate><guid>https://sourceforge.neta742e8a1957b1c03baa6ade7552d12778303272e</guid></item><item><title>Developers modified by chtsanti</title><link>https://sourceforge.net/p/c-icap/wiki/Developers/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v2
+++ v3
@@ -146,7 +146,7 @@
 ###How to use c-icap statistics subsystem###

 Visit this web page for an easy way to configure and view c-icap runtime statistics:
-[faqcicap/#q-how-can-i-get-some-c-icap-runtime-statistics]
+[FAQ:How can I get some c-icap runtime statistics](faqcicap/#q-how-can-i-get-some-c-icap-runtime-statistics)

     /* Create the REQUESTS_PROCCESSED and BYTES_PROCESSED counters.
        This part of code normally placed in ci_service_module::mod_post_init_service or 
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">chtsanti</dc:creator><pubDate>Wed, 27 Aug 2014 08:38:58 -0000</pubDate><guid>https://sourceforge.net96ff7531b2e1b0d938e1c996d4b3e7053e1e1425</guid></item><item><title>Developers modified by chtsanti</title><link>https://sourceforge.net/p/c-icap/wiki/Developers/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v1
+++ v2
@@ -17,22 +17,24 @@
 ### Writing  services ###

 Before start writing your own service you need to:
- - read the basics about ICAP protocol: 
-     - reqmod and respmod requests
-     - encapsulated objects (HTTP headers and body data)
-     - the ICAP preview mechanism
-     - the ''allow 204'' inside and outside preview responses
-     - the ''100 continue'' responses
- - study the echo example service distributed with the c-icap server. This service implemented in ''services/echo/srv_echo.c'' file
- - install doxygen and produce documentation
+
+- read the basics about ICAP protocol: 
+      * reqmod and respmod requests
+      * encapsulated objects (HTTP headers and body data)
+      * the ICAP preview mechanism
+      * the **allow 204** inside and outside preview responses
+      * the **100 continue** responses
+- study the echo example service distributed with the c-icap server. This service implemented in **services/echo/srv_echo.c** file
+- install doxygen and produce documentation

 To modify/examine an HTTP objects (HTTP requests or responses) there is a number of utility functions. Most of them are documented with doxygen documentation system 
 in the following modules/sections:
-    * Headers related API
-    * ICAP request API
-    * Services API
-    * API for HTTP object manipulation
-    * utility funtions
+
+- Headers related API
+- ICAP request API
+- Services API
+- API for HTTP object manipulation
+- utility funtions

 ### How to use c-icap configuration subsystem ###

@@ -111,7 +113,7 @@

 ### How to use templates ###

-The following code creates the ''ERROR_FOUND'' template for the ''my_srv'' error page. This template should stored in the TemplateDir/my_srv/en/ERROR_FOUND file. 
+The following code creates the **ERROR_FOUND** template for the **my_srv** error page. This template should stored in the **TemplateDir/my_srv/en/ERROR_FOUND** file. 

     ci_membuf_t *error_page;
     error_page = ci_txt_template_build_content(req, "my_srv", "ERROR_FOUND",
@@ -121,7 +123,7 @@
     ci_membuf_free(error_page);

-The following creates the template ''ERROR_FOUND'' for the service ''my_srv'' using custom formating codes: The ''%TT'' formating code produces the "TEST" string.
+The following creates the template **ERROR_FOUND** for the service **my_srv** using custom formating codes: The **%TT** formating code produces the "TEST" string.

     static int fmt_test(ci_request_t *req, char *buf, int len, char *param)
     {
@@ -144,7 +146,7 @@
 ###How to use c-icap statistics subsystem###

 Visit this web page for an easy way to configure and view c-icap runtime statistics:
-[faqcicap#Q.HowcanIgetsomec-icapruntimestatistics]
+[faqcicap/#q-how-can-i-get-some-c-icap-runtime-statistics]

     /* Create the REQUESTS_PROCCESSED and BYTES_PROCESSED counters.
        This part of code normally placed in ci_service_module::mod_post_init_service or 
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">chtsanti</dc:creator><pubDate>Tue, 26 Aug 2014 15:24:52 -0000</pubDate><guid>https://sourceforge.netd33337588cfcd495f84922c476ec9a531a39370e</guid></item><item><title>Developers modified by chtsanti</title><link>https://sourceforge.net/p/c-icap/wiki/Developers/</link><description>&lt;div class="markdown_content"&gt;&lt;h1 id="developers"&gt;Developers&lt;/h1&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#developers"&gt;Developers&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#notes-for-developers"&gt;Notes for developers&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#apis-documentation"&gt;APIs Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#writing-services"&gt;Writing  services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-to-use-c-icap-configuration-subsystem"&gt;How to use c-icap configuration subsystem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-to-use-c-icap-acls"&gt;How to use c-icap acls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-to-use-templates"&gt;How to use templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-to-use-c-icap-statistics-subsystem"&gt;How to use c-icap statistics subsystem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-to-use-lookup-tables"&gt;How to use lookup tables&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="notes-for-developers"&gt;Notes for developers&lt;/h2&gt;
&lt;h3 id="apis-documentation"&gt;APIs Documentation&lt;/h3&gt;
&lt;p&gt;C-icap uses the  doxygen documentation system to document API functions. To produce the API documentation you need to have doxygen installed. Then under the c-icap source distribution, just run:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The documentation will be produced in HTML form  under the directory ''docs/html/''.&lt;br /&gt;
The c-icap is still under development so some of its API interfaces are not complete and they are subject to change. However someone should not expect huge changes between different releases (0.x releases).&lt;/p&gt;
&lt;p&gt;In this page also exist some sample code for the major tools provided by the c-icap server.&lt;/p&gt;
&lt;h3 id="writing-services"&gt;Writing  services&lt;/h3&gt;
&lt;p&gt;Before start writing your own service you need to:&lt;br /&gt;
 - read the basics about ICAP protocol: &lt;br /&gt;
     - reqmod and respmod requests&lt;br /&gt;
     - encapsulated objects (HTTP headers and body data)&lt;br /&gt;
     - the ICAP preview mechanism&lt;br /&gt;
     - the ''allow 204'' inside and outside preview responses&lt;br /&gt;
     - the ''100 continue'' responses&lt;br /&gt;
 - study the echo example service distributed with the c-icap server. This service implemented in ''services/echo/srv_echo.c'' file&lt;br /&gt;
 - install doxygen and produce documentation&lt;/p&gt;
&lt;p&gt;To modify/examine an HTTP objects (HTTP requests or responses) there is a number of utility functions. Most of them are documented with doxygen documentation system &lt;br /&gt;
in the following modules/sections:&lt;br /&gt;
    * Headers related API&lt;br /&gt;
    * ICAP request API&lt;br /&gt;
    * Services API&lt;br /&gt;
    * API for HTTP object manipulation&lt;br /&gt;
    * utility funtions&lt;/p&gt;
&lt;h3 id="how-to-use-c-icap-configuration-subsystem"&gt;How to use c-icap configuration subsystem&lt;/h3&gt;
&lt;p&gt;The c-icap provides an easy way to allow developers define their own configuration parameters for services and modules. Example usage:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;CONF1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;CONF2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;MYCFG_PARAM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;my_cfg_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;directive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;setdata&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="cm"&gt;/*Configuration table, should attached to the related ci_service_t object .....*/&lt;/span&gt;
&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;ci_conf_entry&lt;/span&gt; &lt;span class="n"&gt;conf_variables&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Conf1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;CONF1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ci_cfg_set_str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="cm"&gt;/* use the ci_cfg_set_str predefined handler */&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Conf2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;CONF2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ci_cfg_onoff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="cm"&gt;/* use the ci_cfg_onoff predefined handler */&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Conf3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;my_cfg_handler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="cm"&gt;/* use a custom handler */&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="cm"&gt;/*example custom configuration handler*/&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;my_cfg_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;directive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;setdata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;MYCFG_PARAM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;atoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For the available configuration parameter handlers, look in the &lt;strong&gt;configuration API&lt;/strong&gt; module/section in c-icap documentation.&lt;/p&gt;
&lt;h3 id="how-to-use-c-icap-acls"&gt;How to use c-icap acls&lt;/h3&gt;
&lt;p&gt;To create an access list and add acls use the following code:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kt"&gt;ci_access_entry_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;My_Access_List&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="cm"&gt;/*Normally the following code exist inside a configuration parameter handler*/&lt;/span&gt;
&lt;span class="kt"&gt;ci_access_entry_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;access_entry&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;access_entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ci_access_entry_new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;My_Access_List&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
                   &lt;span class="n"&gt;CI_ACCESS_ALLOW&lt;/span&gt; &lt;span class="cm"&gt;/*or CI_ACCESS_DENY*/&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;acl_spec_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ci_access_entry_add_acl_by_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;access_entry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;acl_spec_name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="n"&gt;ci_debug_printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"Error adding acl spec: %s, (is it defined?)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;acl_spec_name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
         &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To check if an access list matches a request use :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="cm"&gt;/*My_Access_List is a global variable*/&lt;/span&gt;
&lt;span class="n"&gt;ci_access_entry_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;My_Access_List&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;ci_request_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;current_req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ci_access_entry_match_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;My_Access_List&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;current_req&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/*The request matches the accesslist*/&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="no"&gt;CI_ACCESS_ALLOW&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="cm"&gt;/*Allowed*/&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* CI_ACCESS_DENY or CI_ACCESS_UNKNOWN */&lt;/span&gt;
        &lt;span class="cm"&gt;/*denied*/&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="how-to-use-templates"&gt;How to use templates&lt;/h3&gt;
&lt;p&gt;The following code creates the ''ERROR_FOUND'' template for the ''my_srv'' error page. This template should stored in the TemplateDir/my_srv/en/ERROR_FOUND file. &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kt"&gt;ci_membuf_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;error_page&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;error_page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ci_txt_template_build_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"my_srv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ERROR_FOUND"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                       &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="cm"&gt;/*release error_page*/&lt;/span&gt;
&lt;span class="n"&gt;ci_membuf_free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error_page&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The following creates the template ''ERROR_FOUND'' for the service ''my_srv'' using custom formating codes: The ''%TT'' formating code produces the "TEST" string.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;fmt_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;ci_request_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;snprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"TEST"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;ci_fmt_entry&lt;/span&gt; &lt;span class="n"&gt;my_fmt_table&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"%TT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"A Test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fmt_test&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;ci_membuf_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;error_page&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;error_page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ci_txt_template_build_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"my_srv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"AN-ERROR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                         &lt;span class="n"&gt;my_fmt_table&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="cm"&gt;/*release error_page*/&lt;/span&gt;
&lt;span class="n"&gt;ci_membuf_free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error_page&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="how-to-use-c-icap-statistics-subsystem"&gt;How to use c-icap statistics subsystem&lt;/h3&gt;
&lt;p&gt;Visit this web page for an easy way to configure and view c-icap runtime statistics:&lt;br /&gt;
&lt;span&gt;[faqcicap#Q.HowcanIgetsomec-icapruntimestatistics]&lt;/span&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="cm"&gt;/* Create the REQUESTS_PROCCESSED and BYTES_PROCESSED counters.&lt;/span&gt;
&lt;span class="cm"&gt;   This part of code normally placed in ci_service_module::mod_post_init_service or &lt;/span&gt;
&lt;span class="cm"&gt;   ci_service_module::mod_init_service service handlers&lt;/span&gt;
&lt;span class="cm"&gt;*/&lt;/span&gt; 
&lt;span class="no"&gt;REQUESTS_PROCCESSED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ci_stat_entry_register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Requests processed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;STAT_INT64_T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="s"&gt;"My Service"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="no"&gt;BYTES_PROCESSED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="n"&gt;ci_stat_entry_register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Bytes processed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;STAT_KBS_T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="s"&gt;"My Service"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;REQUESTS_PROCCESSED&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mh"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="no"&gt;BYTES_PROCESSED&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mh"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="cm"&gt;/*an error*/&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;CI_ERROR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;....&lt;/span&gt;

&lt;span class="cm"&gt;/*Increase the REQUESTS_PROCCESSED and BYTES_PROCESSED counters:*/&lt;/span&gt;
&lt;span class="n"&gt;ci_stat_uint64_inc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;REQUESTS_PROCESSED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;ci_stat_kbs_inc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;BYTES_PROCESSED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="cm"&gt;/*bytes is the size of processed object*/&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="how-to-use-lookup-tables"&gt;How to use lookup tables&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="cm"&gt;/* Create a hash lookup table. Just fix the path variable to create file, bdb or ldap tables.&lt;/span&gt;
&lt;span class="cm"&gt;   This part of code normally placed in ci_service_module::mod_post_init_service or &lt;/span&gt;
&lt;span class="cm"&gt;   ci_service_module::mod_init_service service handlers&lt;/span&gt;
&lt;span class="cm"&gt;*/&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;ci_lookup_table&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;lt_db&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"hash:/path/to/file.txt"&lt;/span&gt;
&lt;span class="n"&gt;lt_db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ci_lookup_table_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lt_db&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;lt_db&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lt_db&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ci_lookup_table_destroy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lt_db&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;lt_db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="cm"&gt;/* To search in the lookup table for a record with key "chtsanti" use&lt;/span&gt;
&lt;span class="cm"&gt;   the following code. The record will be stored to a NULL terminated &lt;/span&gt;
&lt;span class="cm"&gt;   string array and will be set to vals..&lt;/span&gt;
&lt;span class="cm"&gt;*/&lt;/span&gt;
&lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;vals&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"chtsanti"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lt_db&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lt_db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="o"&gt;***&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;vals&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="cm"&gt;/* do something with vals */&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;vals&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Found the value:%s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vals&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;lt_db&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;release_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lt_db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vals&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="cm"&gt;/*The lookup table does not needed any more destroy it */&lt;/span&gt;
&lt;span class="n"&gt;ci_lookup_table_destroy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lt_db&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">chtsanti</dc:creator><pubDate>Tue, 26 Aug 2014 15:01:11 -0000</pubDate><guid>https://sourceforge.neteb191a3002b4fa5a10af5d355fbf0e92684e2f03</guid></item></channel></rss>