<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.ethernut.de/nutwiki/index.php?action=history&amp;feed=atom&amp;title=Httpd.c</id>
		<title>Httpd.c - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://www.ethernut.de/nutwiki/index.php?action=history&amp;feed=atom&amp;title=Httpd.c"/>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=Httpd.c&amp;action=history"/>
		<updated>2026-04-28T22:50:26Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://www.ethernut.de/nutwiki/index.php?title=Httpd.c&amp;diff=120&amp;oldid=prev</id>
		<title>Harald: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=Httpd.c&amp;diff=120&amp;oldid=prev"/>
				<updated>2016-10-27T16:02:56Z</updated>
		
		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;tr style='vertical-align: top;' lang='en'&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 16:02, 27 October 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan='2' style='text-align: center;' lang='en'&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Harald</name></author>	</entry>

	<entry>
		<id>http://www.ethernut.de/nutwiki/index.php?title=Httpd.c&amp;diff=119&amp;oldid=prev</id>
		<title>Steinwedel at 20:09, 2 May 2007</title>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=Httpd.c&amp;diff=119&amp;oldid=prev"/>
				<updated>2007-05-02T20:09:10Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Ein HTTP-Server. Falls das Netzwerk DHCP unterstützt, wird die IP-Adresse von dem DHCP-Server bezogen. Andernfalls wird die IP-Adresse 192.168.192.35 verwendet. Da ein HTTP-Server grundsätzlich Dateien ausliefert, wird ein Dateisystem im Flash-Speicher abgebildet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* &lt;br /&gt;
 * Unique MAC address of the Ethernut Board. &lt;br /&gt;
 *&lt;br /&gt;
 * Ignored if EEPROM contains a valid configuration.&lt;br /&gt;
 */&lt;br /&gt;
#define MY_MAC  &amp;quot;\x00\x06\x98\x30\x00\x35&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/* &lt;br /&gt;
 * Unique IP address of the Ethernut Board. &lt;br /&gt;
 *&lt;br /&gt;
 * Ignored if DHCP is used. &lt;br /&gt;
 */&lt;br /&gt;
#define MY_IPADDR &amp;quot;192.168.192.35&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/* &lt;br /&gt;
 * IP network mask of the Ethernut Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Ignored if DHCP is used. &lt;br /&gt;
 */&lt;br /&gt;
#define MY_IPMASK &amp;quot;255.255.255.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/* &lt;br /&gt;
 * Gateway IP address for the Ethernut Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Ignored if DHCP is used. &lt;br /&gt;
 */&lt;br /&gt;
#define MY_IPGATE &amp;quot;192.168.192.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/* ICCAVR Demo is limited. Try to use the bare minimum. */&lt;br /&gt;
#if !defined(__IMAGECRAFT__)&lt;br /&gt;
&lt;br /&gt;
/* Wether we should use DHCP. */&lt;br /&gt;
#define USE_DHCP&lt;br /&gt;
/* Wether we should run a discovery responder. */&lt;br /&gt;
#define USE_DISCOVERY&lt;br /&gt;
/* Wether to use PHAT file system. */&lt;br /&gt;
//#define USE_PHAT&lt;br /&gt;
&lt;br /&gt;
#endif /* __IMAGECRAFT__ */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#ifdef USE_PHAT&lt;br /&gt;
&lt;br /&gt;
#if defined(ETHERNUT3)&lt;br /&gt;
&lt;br /&gt;
/* Ethernut 3 file system. */&lt;br /&gt;
#define MY_FSDEV       devPhat0&lt;br /&gt;
#define MY_FSDEV_NAME  &amp;quot;PHAT0&amp;quot; &lt;br /&gt;
&lt;br /&gt;
/* Ethernut 3 block device interface. */&lt;br /&gt;
#define MY_BLKDEV      devNplMmc0&lt;br /&gt;
#define MY_BLKDEV_NAME &amp;quot;MMC0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#elif defined(AT91SAM7X_EK)&lt;br /&gt;
&lt;br /&gt;
/* SAM7X-EK file system. */&lt;br /&gt;
#define MY_FSDEV       devPhat0&lt;br /&gt;
#define MY_FSDEV_NAME  &amp;quot;PHAT0&amp;quot; &lt;br /&gt;
&lt;br /&gt;
/* SAM7X-EK block device interface. */&lt;br /&gt;
#define MY_BLKDEV      devAt91SpiMmc0&lt;br /&gt;
#define MY_BLKDEV_NAME &amp;quot;MMC0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#elif defined(AT91SAM9260_EK)&lt;br /&gt;
&lt;br /&gt;
/* SAM9260-EK file system. */&lt;br /&gt;
#define MY_FSDEV       devPhat0&lt;br /&gt;
#define MY_FSDEV_NAME  &amp;quot;PHAT0&amp;quot; &lt;br /&gt;
&lt;br /&gt;
/* SAM9260-EK block device interface. */&lt;br /&gt;
#define MY_BLKDEV      devAt91Mci0&lt;br /&gt;
#define MY_BLKDEV_NAME &amp;quot;MCI0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
#endif /* USE_PHAT */&lt;br /&gt;
&lt;br /&gt;
#ifndef MY_FSDEV&lt;br /&gt;
#define MY_FSDEV        devUrom&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef MY_FSDEV_NAME&lt;br /&gt;
#define MY_HTTPROOT     MY_FSDEV_NAME &amp;quot;:/&amp;quot; &lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cfg/os.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;dev/board.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dev/urom.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dev/nplmmc.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dev/sbimmc.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fs/phatfs.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;sys/version.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/thread.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/timer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/heap.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/confnet.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;arpa/inet.h&amp;gt;&lt;br /&gt;
#include &amp;lt;net/route.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;pro/httpd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pro/dhcp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pro/ssi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pro/asp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pro/discover.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifdef NUTDEBUG&lt;br /&gt;
#include &amp;lt;sys/osdebug.h&amp;gt;&lt;br /&gt;
#include &amp;lt;net/netdebug.h&amp;gt;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
static char *html_mt = &amp;quot;text/html&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**************************************************************/&lt;br /&gt;
/*  ASPCallback                                               */&lt;br /&gt;
/*                                                            */&lt;br /&gt;
/* This routine must have been registered by                  */&lt;br /&gt;
/* NutRegisterAspCallback() and is automatically called by    */&lt;br /&gt;
/* NutHttpProcessFileRequest() when the server process a page */&lt;br /&gt;
/* with an asp function.                                      */&lt;br /&gt;
/*                                                            */&lt;br /&gt;
/* Return 0 on success, -1 otherwise.                         */&lt;br /&gt;
/**************************************************************/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
static int ASPCallback (char *pASPFunction, FILE *stream)&lt;br /&gt;
{&lt;br /&gt;
    if (strcmp(pASPFunction, &amp;quot;usr_date&amp;quot;) == 0) {&lt;br /&gt;
        fprintf(stream, &amp;quot;Dummy example: 01.01.2005&amp;quot;);&lt;br /&gt;
        return(0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (strcmp(pASPFunction, &amp;quot;usr_time&amp;quot;) == 0) {&lt;br /&gt;
        fprintf(stream, &amp;quot;Dummy example: 12:15:02&amp;quot;);&lt;br /&gt;
        return(0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return (-1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * CGI Sample: Show request parameters.&lt;br /&gt;
 *&lt;br /&gt;
 * See httpd.h for REQUEST structure.&lt;br /&gt;
 *&lt;br /&gt;
 * This routine must have been registered by NutRegisterCgi() and is&lt;br /&gt;
 * automatically called by NutHttpProcessRequest() when the client&lt;br /&gt;
 * request the URL 'cgi-bin/test.cgi'.&lt;br /&gt;
 */&lt;br /&gt;
static int ShowQuery(FILE * stream, REQUEST * req)&lt;br /&gt;
{&lt;br /&gt;
    char *cp;&lt;br /&gt;
    /*&lt;br /&gt;
     * This may look a little bit weird if you are not used to C programming&lt;br /&gt;
     * for flash microcontrollers. The special type 'prog_char' forces the&lt;br /&gt;
     * string literals to be placed in flash ROM. This saves us a lot of&lt;br /&gt;
     * precious RAM.&lt;br /&gt;
     */&lt;br /&gt;
    static prog_char head[] = &amp;quot;&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;&amp;lt;TITLE&amp;gt;Parameters&amp;lt;/TITLE&amp;gt;&amp;lt;/HEAD&amp;gt;&amp;lt;BODY&amp;gt;&amp;lt;H1&amp;gt;Parameters&amp;lt;/H1&amp;gt;&amp;quot;;&lt;br /&gt;
    static prog_char foot[] = &amp;quot;&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&amp;quot;;&lt;br /&gt;
    static prog_char req_fmt[] = &amp;quot;Method: %s&amp;lt;BR&amp;gt;\r\nVersion: HTTP/%d.%d&amp;lt;BR&amp;gt;\r\nContent length: %d&amp;lt;BR&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    static prog_char url_fmt[] = &amp;quot;URL: %s&amp;lt;BR&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    static prog_char query_fmt[] = &amp;quot;Argument: %s&amp;lt;BR&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    static prog_char type_fmt[] = &amp;quot;Content type: %s&amp;lt;BR&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    static prog_char cookie_fmt[] = &amp;quot;Cookie: %s&amp;lt;BR&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    static prog_char auth_fmt[] = &amp;quot;Auth info: %s&amp;lt;BR&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    static prog_char agent_fmt[] = &amp;quot;User agent: %s&amp;lt;BR&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    /* These useful API calls create a HTTP response for us. */&lt;br /&gt;
    NutHttpSendHeaderTop(stream, req, 200, &amp;quot;Ok&amp;quot;);&lt;br /&gt;
    NutHttpSendHeaderBot(stream, html_mt, -1);&lt;br /&gt;
&lt;br /&gt;
    /* Send HTML header. */&lt;br /&gt;
    fputs_P(head, stream);&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Send request parameters.&lt;br /&gt;
     */&lt;br /&gt;
    switch (req-&amp;gt;req_method) {&lt;br /&gt;
    case METHOD_GET:&lt;br /&gt;
        cp = &amp;quot;GET&amp;quot;;&lt;br /&gt;
        break;&lt;br /&gt;
    case METHOD_POST:&lt;br /&gt;
        cp = &amp;quot;POST&amp;quot;;&lt;br /&gt;
        break;&lt;br /&gt;
    case METHOD_HEAD:&lt;br /&gt;
        cp = &amp;quot;HEAD&amp;quot;;&lt;br /&gt;
        break;&lt;br /&gt;
    default:&lt;br /&gt;
        cp = &amp;quot;UNKNOWN&amp;quot;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
    fprintf_P(stream, req_fmt, cp, req-&amp;gt;req_version / 10, req-&amp;gt;req_version % 10, req-&amp;gt;req_length);&lt;br /&gt;
    if (req-&amp;gt;req_url)&lt;br /&gt;
        fprintf_P(stream, url_fmt, req-&amp;gt;req_url);&lt;br /&gt;
    if (req-&amp;gt;req_query)&lt;br /&gt;
        fprintf_P(stream, query_fmt, req-&amp;gt;req_query);&lt;br /&gt;
    if (req-&amp;gt;req_type)&lt;br /&gt;
        fprintf_P(stream, type_fmt, req-&amp;gt;req_type);&lt;br /&gt;
    if (req-&amp;gt;req_cookie)&lt;br /&gt;
        fprintf_P(stream, cookie_fmt, req-&amp;gt;req_cookie);&lt;br /&gt;
    if (req-&amp;gt;req_auth)&lt;br /&gt;
        fprintf_P(stream, auth_fmt, req-&amp;gt;req_auth);&lt;br /&gt;
    if (req-&amp;gt;req_agent)&lt;br /&gt;
        fprintf_P(stream, agent_fmt, req-&amp;gt;req_agent);&lt;br /&gt;
&lt;br /&gt;
    /* Send HTML footer and flush output buffer. */&lt;br /&gt;
    fputs_P(foot, stream);&lt;br /&gt;
    fflush(stream);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * CGI Sample: Show list of threads.&lt;br /&gt;
 *&lt;br /&gt;
 * This routine must have been registered by NutRegisterCgi() and is&lt;br /&gt;
 * automatically called by NutHttpProcessRequest() when the client&lt;br /&gt;
 * request the URL 'cgi-bin/threads.cgi'.&lt;br /&gt;
 */&lt;br /&gt;
static int ShowThreads(FILE * stream, REQUEST * req)&lt;br /&gt;
{&lt;br /&gt;
    static prog_char head[] = &amp;quot;&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;&amp;lt;TITLE&amp;gt;Threads&amp;lt;/TITLE&amp;gt;&amp;lt;/HEAD&amp;gt;&amp;lt;BODY&amp;gt;&amp;lt;H1&amp;gt;Threads&amp;lt;/H1&amp;gt;\r\n&amp;quot;&lt;br /&gt;
        &amp;quot;&amp;lt;TABLE BORDER&amp;gt;&amp;lt;TR&amp;gt;&amp;lt;TH&amp;gt;Handle&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Name&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Priority&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Status&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Event&amp;lt;BR&amp;gt;Queue&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Timer&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Stack-&amp;lt;BR&amp;gt;pointer&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Free&amp;lt;BR&amp;gt;Stack&amp;lt;/TH&amp;gt;&amp;lt;/TR&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
#if defined(__AVR__)&lt;br /&gt;
    static prog_char tfmt[] =&lt;br /&gt;
        &amp;quot;&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;%04X&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%s&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%u&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%s&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%04X&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%04X&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%04X&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%u&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%s&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
#else&lt;br /&gt;
    static prog_char tfmt[] =&lt;br /&gt;
        &amp;quot;&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;%08lX&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%s&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%u&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%s&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%08lX&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%08lX&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%08lX&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%lu&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%s&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
#endif&lt;br /&gt;
    static prog_char foot[] = &amp;quot;&amp;lt;/TABLE&amp;gt;&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&amp;quot;;&lt;br /&gt;
    static char *thread_states[] = { &amp;quot;TRM&amp;quot;, &amp;quot;&amp;lt;FONT COLOR=#CC0000&amp;gt;RUN&amp;lt;/FONT&amp;gt;&amp;quot;, &amp;quot;&amp;lt;FONT COLOR=#339966&amp;gt;RDY&amp;lt;/FONT&amp;gt;&amp;quot;, &amp;quot;SLP&amp;quot; };&lt;br /&gt;
    NUTTHREADINFO *tdp = nutThreadList;&lt;br /&gt;
&lt;br /&gt;
    /* Send HTTP response. */&lt;br /&gt;
    NutHttpSendHeaderTop(stream, req, 200, &amp;quot;Ok&amp;quot;);&lt;br /&gt;
    NutHttpSendHeaderBot(stream, html_mt, -1);&lt;br /&gt;
&lt;br /&gt;
    /* Send HTML header. */&lt;br /&gt;
    fputs_P(head, stream);&lt;br /&gt;
    for (tdp = nutThreadList; tdp; tdp = tdp-&amp;gt;td_next) {&lt;br /&gt;
        fprintf_P(stream, tfmt, (uptr_t) tdp, tdp-&amp;gt;td_name, tdp-&amp;gt;td_priority,&lt;br /&gt;
                  thread_states[tdp-&amp;gt;td_state], (uptr_t) tdp-&amp;gt;td_queue, (uptr_t) tdp-&amp;gt;td_timer,&lt;br /&gt;
                  (uptr_t) tdp-&amp;gt;td_sp, (uptr_t) tdp-&amp;gt;td_sp - (uptr_t) tdp-&amp;gt;td_memory,&lt;br /&gt;
                  *((u_long *) tdp-&amp;gt;td_memory) != DEADBEEF ? &amp;quot;Corr&amp;quot; : &amp;quot;OK&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    fputs_P(foot, stream);&lt;br /&gt;
    fflush(stream);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * CGI Sample: Show list of timers.&lt;br /&gt;
 *&lt;br /&gt;
 * This routine must have been registered by NutRegisterCgi() and is&lt;br /&gt;
 * automatically called by NutHttpProcessRequest() when the client&lt;br /&gt;
 * request the URL 'cgi-bin/timers.cgi'.&lt;br /&gt;
 */&lt;br /&gt;
static int ShowTimers(FILE * stream, REQUEST * req)&lt;br /&gt;
{&lt;br /&gt;
    static prog_char head[] = &amp;quot;&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;&amp;lt;TITLE&amp;gt;Timers&amp;lt;/TITLE&amp;gt;&amp;lt;/HEAD&amp;gt;&amp;lt;BODY&amp;gt;&amp;lt;H1&amp;gt;Timers&amp;lt;/H1&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
    static prog_char thead[] =&lt;br /&gt;
        &amp;quot;&amp;lt;TABLE BORDER&amp;gt;&amp;lt;TR&amp;gt;&amp;lt;TH&amp;gt;Handle&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Countdown&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Tick Reload&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Callback&amp;lt;BR&amp;gt;Address&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Callback&amp;lt;BR&amp;gt;Argument&amp;lt;/TH&amp;gt;&amp;lt;/TR&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
#if defined(__AVR__)&lt;br /&gt;
    static prog_char tfmt[] = &amp;quot;&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;%04X&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%lu&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%lu&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%04X&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%04X&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
#else&lt;br /&gt;
    static prog_char tfmt[] = &amp;quot;&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;%08lX&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%lu&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%lu&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%08lX&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%08lX&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
#endif&lt;br /&gt;
    static prog_char foot[] = &amp;quot;&amp;lt;/TABLE&amp;gt;&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&amp;quot;;&lt;br /&gt;
    NUTTIMERINFO *tnp;&lt;br /&gt;
    u_long ticks_left;&lt;br /&gt;
&lt;br /&gt;
    NutHttpSendHeaderTop(stream, req, 200, &amp;quot;Ok&amp;quot;);&lt;br /&gt;
    NutHttpSendHeaderBot(stream, html_mt, -1);&lt;br /&gt;
&lt;br /&gt;
    /* Send HTML header. */&lt;br /&gt;
    fputs_P(head, stream);&lt;br /&gt;
    if ((tnp = nutTimerList) != 0) {&lt;br /&gt;
        fputs_P(thead, stream);&lt;br /&gt;
        ticks_left = 0;&lt;br /&gt;
        while (tnp) {&lt;br /&gt;
            ticks_left += tnp-&amp;gt;tn_ticks_left;&lt;br /&gt;
            fprintf_P(stream, tfmt, (uptr_t) tnp, ticks_left, tnp-&amp;gt;tn_ticks, (uptr_t) tnp-&amp;gt;tn_callback, (uptr_t) tnp-&amp;gt;tn_arg);&lt;br /&gt;
            tnp = tnp-&amp;gt;tn_next;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    fputs_P(foot, stream);&lt;br /&gt;
    fflush(stream);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * CGI Sample: Show list of sockets.&lt;br /&gt;
 *&lt;br /&gt;
 * This routine must have been registered by NutRegisterCgi() and is&lt;br /&gt;
 * automatically called by NutHttpProcessRequest() when the client&lt;br /&gt;
 * request the URL 'cgi-bin/sockets.cgi'.&lt;br /&gt;
 */&lt;br /&gt;
static int ShowSockets(FILE * stream, REQUEST * req)&lt;br /&gt;
{&lt;br /&gt;
    /* String literals are kept in flash ROM. */&lt;br /&gt;
    static prog_char head[] = &amp;quot;&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;&amp;lt;TITLE&amp;gt;Sockets&amp;lt;/TITLE&amp;gt;&amp;lt;/HEAD&amp;gt;&amp;quot;&lt;br /&gt;
        &amp;quot;&amp;lt;BODY&amp;gt;&amp;lt;H1&amp;gt;Sockets&amp;lt;/H1&amp;gt;\r\n&amp;quot;&lt;br /&gt;
        &amp;quot;&amp;lt;TABLE BORDER&amp;gt;&amp;lt;TR&amp;gt;&amp;lt;TH&amp;gt;Handle&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Type&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Local&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Remote&amp;lt;/TH&amp;gt;&amp;lt;TH&amp;gt;Status&amp;lt;/TH&amp;gt;&amp;lt;/TR&amp;gt;\r\n&amp;quot;;&lt;br /&gt;
#if defined(__AVR__)&lt;br /&gt;
    static prog_char tfmt1[] = &amp;quot;&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;%04X&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;TCP&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%s:%u&amp;lt;/TD&amp;gt;&amp;quot;;&lt;br /&gt;
#else&lt;br /&gt;
    static prog_char tfmt1[] = &amp;quot;&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;%08lX&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;TCP&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;%s:%u&amp;lt;/TD&amp;gt;&amp;quot;;&lt;br /&gt;
#endif&lt;br /&gt;
    static prog_char tfmt2[] = &amp;quot;&amp;lt;TD&amp;gt;%s:%u&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt;&amp;quot;;&lt;br /&gt;
    static prog_char foot[] = &amp;quot;&amp;lt;/TABLE&amp;gt;&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&amp;quot;;&lt;br /&gt;
    static prog_char st_listen[] = &amp;quot;LISTEN&amp;quot;;&lt;br /&gt;
    static prog_char st_synsent[] = &amp;quot;SYNSENT&amp;quot;;&lt;br /&gt;
    static prog_char st_synrcvd[] = &amp;quot;SYNRCVD&amp;quot;;&lt;br /&gt;
    static prog_char st_estab[] = &amp;quot;&amp;lt;FONT COLOR=#CC0000&amp;gt;ESTABL&amp;lt;/FONT&amp;gt;&amp;quot;;&lt;br /&gt;
    static prog_char st_finwait1[] = &amp;quot;FINWAIT1&amp;quot;;&lt;br /&gt;
    static prog_char st_finwait2[] = &amp;quot;FINWAIT2&amp;quot;;&lt;br /&gt;
    static prog_char st_closewait[] = &amp;quot;CLOSEWAIT&amp;quot;;&lt;br /&gt;
    static prog_char st_closing[] = &amp;quot;CLOSING&amp;quot;;&lt;br /&gt;
    static prog_char st_lastack[] = &amp;quot;LASTACK&amp;quot;;&lt;br /&gt;
    static prog_char st_timewait[] = &amp;quot;TIMEWAIT&amp;quot;;&lt;br /&gt;
    static prog_char st_closed[] = &amp;quot;CLOSED&amp;quot;;&lt;br /&gt;
    static prog_char st_unknown[] = &amp;quot;UNKNOWN&amp;quot;;&lt;br /&gt;
    prog_char *st_P;&lt;br /&gt;
    extern TCPSOCKET *tcpSocketList;&lt;br /&gt;
    TCPSOCKET *ts;&lt;br /&gt;
&lt;br /&gt;
    NutHttpSendHeaderTop(stream, req, 200, &amp;quot;Ok&amp;quot;);&lt;br /&gt;
    NutHttpSendHeaderBot(stream, html_mt, -1);&lt;br /&gt;
&lt;br /&gt;
    /* Send HTML header. */&lt;br /&gt;
    fputs_P(head, stream);&lt;br /&gt;
    for (ts = tcpSocketList; ts; ts = ts-&amp;gt;so_next) {&lt;br /&gt;
        switch (ts-&amp;gt;so_state) {&lt;br /&gt;
        case TCPS_LISTEN:&lt;br /&gt;
            st_P = (prog_char *) st_listen;&lt;br /&gt;
            break;&lt;br /&gt;
        case TCPS_SYN_SENT:&lt;br /&gt;
            st_P = (prog_char *) st_synsent;&lt;br /&gt;
            break;&lt;br /&gt;
        case TCPS_SYN_RECEIVED:&lt;br /&gt;
            st_P = (prog_char *) st_synrcvd;&lt;br /&gt;
            break;&lt;br /&gt;
        case TCPS_ESTABLISHED:&lt;br /&gt;
            st_P = (prog_char *) st_estab;&lt;br /&gt;
            break;&lt;br /&gt;
        case TCPS_FIN_WAIT_1:&lt;br /&gt;
            st_P = (prog_char *) st_finwait1;&lt;br /&gt;
            break;&lt;br /&gt;
        case TCPS_FIN_WAIT_2:&lt;br /&gt;
            st_P = (prog_char *) st_finwait2;&lt;br /&gt;
            break;&lt;br /&gt;
        case TCPS_CLOSE_WAIT:&lt;br /&gt;
            st_P = (prog_char *) st_closewait;&lt;br /&gt;
            break;&lt;br /&gt;
        case TCPS_CLOSING:&lt;br /&gt;
            st_P = (prog_char *) st_closing;&lt;br /&gt;
            break;&lt;br /&gt;
        case TCPS_LAST_ACK:&lt;br /&gt;
            st_P = (prog_char *) st_lastack;&lt;br /&gt;
            break;&lt;br /&gt;
        case TCPS_TIME_WAIT:&lt;br /&gt;
            st_P = (prog_char *) st_timewait;&lt;br /&gt;
            break;&lt;br /&gt;
        case TCPS_CLOSED:&lt;br /&gt;
            st_P = (prog_char *) st_closed;&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            st_P = (prog_char *) st_unknown;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        /*&lt;br /&gt;
         * Fixed a bug reported by Zhao Weigang.&lt;br /&gt;
         */&lt;br /&gt;
        fprintf_P(stream, tfmt1, (uptr_t) ts, inet_ntoa(ts-&amp;gt;so_local_addr), ntohs(ts-&amp;gt;so_local_port));&lt;br /&gt;
        fprintf_P(stream, tfmt2, inet_ntoa(ts-&amp;gt;so_remote_addr), ntohs(ts-&amp;gt;so_remote_port));&lt;br /&gt;
        fputs_P(st_P, stream);&lt;br /&gt;
        fputs(&amp;quot;&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;\r\n&amp;quot;, stream);&lt;br /&gt;
        fflush(stream);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    fputs_P(foot, stream);&lt;br /&gt;
    fflush(stream);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * CGI Sample: Proccessing a form.&lt;br /&gt;
 *&lt;br /&gt;
 * This routine must have been registered by NutRegisterCgi() and is&lt;br /&gt;
 * automatically called by NutHttpProcessRequest() when the client&lt;br /&gt;
 * request the URL 'cgi-bin/form.cgi'.&lt;br /&gt;
 *&lt;br /&gt;
 * Thanks to Tom Boettger, who provided this sample for ICCAVR.&lt;br /&gt;
 */&lt;br /&gt;
int ShowForm(FILE * stream, REQUEST * req)&lt;br /&gt;
{&lt;br /&gt;
    static prog_char html_head[] = &amp;quot;&amp;lt;HTML&amp;gt;&amp;lt;BODY&amp;gt;&amp;lt;BR&amp;gt;&amp;lt;H1&amp;gt;Form Result&amp;lt;/H1&amp;gt;&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;&amp;quot;;&lt;br /&gt;
    static prog_char html_body[] = &amp;quot;&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;&amp;lt;p&amp;gt;&amp;lt;a href=\&amp;quot;../index.html\&amp;quot;&amp;gt;return to main&amp;lt;/a&amp;gt;&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    NutHttpSendHeaderTop(stream, req, 200, &amp;quot;Ok&amp;quot;);&lt;br /&gt;
    NutHttpSendHeaderBot(stream, html_mt, -1);&lt;br /&gt;
&lt;br /&gt;
    /* Send HTML header. */&lt;br /&gt;
    fputs_P(html_head, stream);&lt;br /&gt;
&lt;br /&gt;
    if (req-&amp;gt;req_query) {&lt;br /&gt;
        char *name;&lt;br /&gt;
        char *value;&lt;br /&gt;
        int i;&lt;br /&gt;
        int count;&lt;br /&gt;
&lt;br /&gt;
        count = NutHttpGetParameterCount(req);&lt;br /&gt;
        /* Extract count parameters. */&lt;br /&gt;
        for (i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
            name = NutHttpGetParameterName(req, i);&lt;br /&gt;
            value = NutHttpGetParameterValue(req, i);&lt;br /&gt;
&lt;br /&gt;
            /* Send the parameters back to the client. */&lt;br /&gt;
&lt;br /&gt;
#ifdef __IMAGECRAFT__&lt;br /&gt;
            fprintf(stream, &amp;quot;%s: %s&amp;lt;BR&amp;gt;\r\n&amp;quot;, name, value);&lt;br /&gt;
#else&lt;br /&gt;
            fprintf_P(stream, PSTR(&amp;quot;%s: %s&amp;lt;BR&amp;gt;\r\n&amp;quot;), name, value);&lt;br /&gt;
#endif&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    fputs_P(html_body, stream);&lt;br /&gt;
    fflush(stream);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
THREAD(Service, arg)&lt;br /&gt;
{&lt;br /&gt;
    TCPSOCKET *sock;&lt;br /&gt;
    FILE *stream;&lt;br /&gt;
    u_char id = (u_char) ((uptr_t) arg);&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Now loop endless for connections.&lt;br /&gt;
     */&lt;br /&gt;
    for (;;) {&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * Create a socket.&lt;br /&gt;
         */&lt;br /&gt;
        if ((sock = NutTcpCreateSocket()) == 0) {&lt;br /&gt;
            printf(&amp;quot;[%u] Creating socket failed\n&amp;quot;, id);&lt;br /&gt;
            NutSleep(5000);&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * Listen on port 80. This call will block until we get a connection&lt;br /&gt;
         * from a client.&lt;br /&gt;
         */&lt;br /&gt;
        NutTcpAccept(sock, 80);&lt;br /&gt;
#if defined(__AVR__)&lt;br /&gt;
        printf(&amp;quot;[%u] Connected, %u bytes free\n&amp;quot;, id, NutHeapAvailable());&lt;br /&gt;
#else&lt;br /&gt;
        printf(&amp;quot;[%u] Connected, %lu bytes free\n&amp;quot;, id, NutHeapAvailable());&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * Wait until at least 8 kByte of free RAM is available. This will&lt;br /&gt;
         * keep the client connected in low memory situations.&lt;br /&gt;
         */&lt;br /&gt;
#if defined(__AVR__)&lt;br /&gt;
        while (NutHeapAvailable() &amp;lt; 8192) {&lt;br /&gt;
#else&lt;br /&gt;
        while (NutHeapAvailable() &amp;lt; 4096) {&lt;br /&gt;
#endif&lt;br /&gt;
            printf(&amp;quot;[%u] Low mem\n&amp;quot;, id);&lt;br /&gt;
            NutSleep(1000);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * Associate a stream with the socket so we can use standard I/O calls.&lt;br /&gt;
         */&lt;br /&gt;
        if ((stream = _fdopen((int) ((uptr_t) sock), &amp;quot;r+b&amp;quot;)) == 0) {&lt;br /&gt;
            printf(&amp;quot;[%u] Creating stream device failed\n&amp;quot;, id);&lt;br /&gt;
        } else {&lt;br /&gt;
            /*&lt;br /&gt;
             * This API call saves us a lot of work. It will parse the&lt;br /&gt;
             * client's HTTP request, send any requested file from the&lt;br /&gt;
             * registered file system or handle CGI requests by calling&lt;br /&gt;
             * our registered CGI routine.&lt;br /&gt;
             */&lt;br /&gt;
            NutHttpProcessRequest(stream);&lt;br /&gt;
&lt;br /&gt;
            /*&lt;br /&gt;
             * Destroy the virtual stream device.&lt;br /&gt;
             */&lt;br /&gt;
            fclose(stream);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * Close our socket.&lt;br /&gt;
         */&lt;br /&gt;
        NutTcpCloseSocket(sock);&lt;br /&gt;
        printf(&amp;quot;[%u] Disconnected\n&amp;quot;, id);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    u_long baud = 115200;&lt;br /&gt;
    u_char i;&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Initialize the uart device.&lt;br /&gt;
     */&lt;br /&gt;
    NutRegisterDevice(&amp;amp;DEV_DEBUG, 0, 0);&lt;br /&gt;
    freopen(DEV_DEBUG_NAME, &amp;quot;w&amp;quot;, stdout);&lt;br /&gt;
    _ioctl(_fileno(stdout), UART_SETSPEED, &amp;amp;baud);&lt;br /&gt;
    NutSleep(200);&lt;br /&gt;
    printf(&amp;quot;\n\nNut/OS %s HTTP Daemon...&amp;quot;, NutVersionString());&lt;br /&gt;
&lt;br /&gt;
#ifdef NUTDEBUG&lt;br /&gt;
    NutTraceTcp(stdout, 0);&lt;br /&gt;
    NutTraceOs(stdout, 0);&lt;br /&gt;
    NutTraceHeap(stdout, 0);&lt;br /&gt;
    NutTracePPP(stdout, 0);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Register Ethernet controller.&lt;br /&gt;
     */&lt;br /&gt;
    if (NutRegisterDevice(&amp;amp;DEV_ETHER, 0, 0)) {&lt;br /&gt;
        puts(&amp;quot;Registering device failed&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Configure %s...&amp;quot;, DEV_ETHER_NAME);&lt;br /&gt;
    if (NutNetLoadConfig(DEV_ETHER_NAME)) {&lt;br /&gt;
        u_char mac[] = MY_MAC;&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;initial boot...&amp;quot;);&lt;br /&gt;
#ifdef USE_DHCP&lt;br /&gt;
        if (NutDhcpIfConfig(DEV_ETHER_NAME, mac, 60000)) &lt;br /&gt;
#endif&lt;br /&gt;
        {&lt;br /&gt;
            u_long ip_addr = inet_addr(MY_IPADDR);&lt;br /&gt;
            u_long ip_mask = inet_addr(MY_IPMASK);&lt;br /&gt;
            u_long ip_gate = inet_addr(MY_IPGATE);&lt;br /&gt;
&lt;br /&gt;
            printf(&amp;quot;No DHCP...&amp;quot;);&lt;br /&gt;
            if (NutNetIfConfig(DEV_ETHER_NAME, mac, ip_addr, ip_mask) == 0) {&lt;br /&gt;
                /* Without DHCP we had to set the default gateway manually.*/&lt;br /&gt;
                if(ip_gate) {&lt;br /&gt;
                    printf(&amp;quot;hard coded gate...&amp;quot;);&lt;br /&gt;
                    NutIpRouteAdd(0, 0, ip_gate, &amp;amp;DEV_ETHER);&lt;br /&gt;
                }&lt;br /&gt;
                puts(&amp;quot;OK&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                puts(&amp;quot;failed&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
#ifdef USE_DHCP&lt;br /&gt;
        if (NutDhcpIfConfig(DEV_ETHER_NAME, 0, 60000)) {&lt;br /&gt;
            puts(&amp;quot;failed&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            puts(&amp;quot;OK&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
#else&lt;br /&gt;
        if (NutNetIfConfig(DEV_ETHER_NAME, 0, 0, confnet.cdn_ip_mask)) {&lt;br /&gt;
            puts(&amp;quot;failed&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            puts(&amp;quot;OK&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;%s ready\n&amp;quot;, inet_ntoa(confnet.cdn_ip_addr));&lt;br /&gt;
&lt;br /&gt;
#ifdef USE_DISCOVERY&lt;br /&gt;
    NutRegisterDiscovery((u_long)-1, 0, DISF_INITAL_ANN);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Register our device for the file system.&lt;br /&gt;
     */&lt;br /&gt;
    NutRegisterDevice(&amp;amp;MY_FSDEV, 0, 0);&lt;br /&gt;
&lt;br /&gt;
#ifdef MY_BLKDEV&lt;br /&gt;
    /* Register block device. */&lt;br /&gt;
    printf(&amp;quot;Registering block device '&amp;quot; MY_BLKDEV_NAME &amp;quot;'...&amp;quot;);&lt;br /&gt;
    if (NutRegisterDevice(&amp;amp;MY_BLKDEV, 0, 0)) {&lt;br /&gt;
        puts(&amp;quot;failed&amp;quot;);&lt;br /&gt;
        for (;;);&lt;br /&gt;
    }&lt;br /&gt;
    puts(&amp;quot;OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    /* Mount partition. */&lt;br /&gt;
    printf(&amp;quot;Mounting block device '&amp;quot; MY_BLKDEV_NAME &amp;quot;:1/&amp;quot; MY_FSDEV_NAME &amp;quot;'...&amp;quot;);&lt;br /&gt;
    if (_open(MY_BLKDEV_NAME &amp;quot;:1/&amp;quot; MY_FSDEV_NAME, _O_RDWR | _O_BINARY) == -1) {&lt;br /&gt;
        puts(&amp;quot;failed&amp;quot;);&lt;br /&gt;
        for (;;);&lt;br /&gt;
    }&lt;br /&gt;
    puts(&amp;quot;OK&amp;quot;);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef MY_HTTPROOT&lt;br /&gt;
    /* Register root path. */&lt;br /&gt;
    printf(&amp;quot;Registering HTTP root '&amp;quot; MY_HTTPROOT &amp;quot;'...&amp;quot;);&lt;br /&gt;
    if (NutRegisterHttpRoot(MY_HTTPROOT)) {&lt;br /&gt;
        puts(&amp;quot;failed&amp;quot;);&lt;br /&gt;
        for (;;);&lt;br /&gt;
    }&lt;br /&gt;
    puts(&amp;quot;OK&amp;quot;);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Register our CGI sample. This will be called&lt;br /&gt;
     * by http://host/cgi-bin/test.cgi?anyparams&lt;br /&gt;
     */&lt;br /&gt;
    NutRegisterCgi(&amp;quot;test.cgi&amp;quot;, ShowQuery);&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Register some CGI samples, which display interesting&lt;br /&gt;
     * system informations.&lt;br /&gt;
     */&lt;br /&gt;
    NutRegisterCgi(&amp;quot;threads.cgi&amp;quot;, ShowThreads);&lt;br /&gt;
    NutRegisterCgi(&amp;quot;timers.cgi&amp;quot;, ShowTimers);&lt;br /&gt;
    NutRegisterCgi(&amp;quot;sockets.cgi&amp;quot;, ShowSockets);&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Finally a CGI example to process a form.&lt;br /&gt;
     */&lt;br /&gt;
    NutRegisterCgi(&amp;quot;form.cgi&amp;quot;, ShowForm);&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Protect the cgi-bin directory with&lt;br /&gt;
     * user and password.&lt;br /&gt;
     */&lt;br /&gt;
    NutRegisterAuth(&amp;quot;cgi-bin&amp;quot;, &amp;quot;root:root&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * Register SSI and ASP handler&lt;br /&gt;
     */&lt;br /&gt;
    NutRegisterSsi();&lt;br /&gt;
    NutRegisterAsp();&lt;br /&gt;
    NutRegisterAspCallback(ASPCallback);&lt;br /&gt;
    /*&lt;br /&gt;
     * Start four server threads.&lt;br /&gt;
     */&lt;br /&gt;
    for (i = 1; i &amp;lt;= 4; i++) {&lt;br /&gt;
        char *thname = &amp;quot;httpd0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        thname[5] = '0' + i;&lt;br /&gt;
        NutThreadCreate(thname, Service, (void *) (uptr_t) i, NUT_THREAD_MAINSTACK);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * We could do something useful here, like serving a watchdog.&lt;br /&gt;
     */&lt;br /&gt;
    NutThreadSetPriority(254);&lt;br /&gt;
    for (;;) {&lt;br /&gt;
        NutSleep(60000);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
httpd.c [[Copyright]] by egnite Software GmbH&lt;/div&gt;</summary>
		<author><name>Steinwedel</name></author>	</entry>

	</feed>