<?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=Ftp.c</id>
		<title>Ftp.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=Ftp.c"/>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=Ftp.c&amp;action=history"/>
		<updated>2026-04-28T22:51:21Z</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=Ftp.c&amp;diff=102&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=Ftp.c&amp;diff=102&amp;oldid=prev"/>
				<updated>2016-10-27T16:02:55Z</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=Ftp.c&amp;diff=101&amp;oldid=prev</id>
		<title>Harald at 18:06, 2 October 2007</title>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=Ftp.c&amp;diff=101&amp;oldid=prev"/>
				<updated>2007-10-02T18:06:41Z</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 FTP-Server. Sofern Ihr Netzwerk einen DHCP-Server hat, wird automatisch eine IP-Adresse bezogen. Solte kein DHCP-Server vorhanden sein, so wird die IP-Adresse 192.168.192.35 verwendet. Daten werden von der SD/MMC-Karte gelsen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;dev/board.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dev/lanc111.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dev/debug.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dev/pnut.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;dev/spimmc_at91.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dev/at91_mci.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dev/x12rtc.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fs/phatfs.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;sys/confnet.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/version.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/heap.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/thread.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;netinet/tcp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;net/route.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pro/dhcp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pro/ftpd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pro/wins.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pro/sntp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;pro/discover.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Determine the compiler. */&lt;br /&gt;
#if defined(__IMAGECRAFT__)&lt;br /&gt;
#if defined(__AVR__)&lt;br /&gt;
#define CC_STRING   &amp;quot;ICCAVR&amp;quot;&lt;br /&gt;
#else&lt;br /&gt;
#define CC_STRING   &amp;quot;ICC&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
#elif defined(__GNUC__)&lt;br /&gt;
#if defined(__AVR__)&lt;br /&gt;
#define CC_STRING   &amp;quot;AVRGCC&amp;quot;&lt;br /&gt;
#elif defined(__arm__)&lt;br /&gt;
#define CC_STRING   &amp;quot;ARMGCC&amp;quot;&lt;br /&gt;
#else&lt;br /&gt;
#define CC_STRING   &amp;quot;GCC&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
#else&lt;br /&gt;
#define CC_STRING   &amp;quot;Compiler unknown&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* &lt;br /&gt;
 * Baudrate for debug output. &lt;br /&gt;
 */&lt;br /&gt;
#ifndef DBG_BAUDRATE&lt;br /&gt;
#define DBG_BAUDRATE 115200&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Wether we should use DHCP.&lt;br /&gt;
 */&lt;br /&gt;
#define USE_DHCP&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Wether we should run a discovery responder.&lt;br /&gt;
 */&lt;br /&gt;
#if defined(__arm__)&lt;br /&gt;
#define USE_DISCOVERY&lt;br /&gt;
#endif&lt;br /&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 { 0x00, 0x06, 0x98, 0x30, 0x00, 0x35 }&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;
/* &lt;br /&gt;
 * NetBIOS name.&lt;br /&gt;
 *&lt;br /&gt;
 * Use a symbolic name with Win32 Explorer.&lt;br /&gt;
 */&lt;br /&gt;
//#define MY_WINSNAME &amp;quot;ETHERNUT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * FTP port number.&lt;br /&gt;
 */&lt;br /&gt;
#define FTP_PORTNUM 21&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * FTP timeout.&lt;br /&gt;
 *&lt;br /&gt;
 * The server will terminate the session, if no new command is received&lt;br /&gt;
 * within the specified number of milliseconds.&lt;br /&gt;
 */&lt;br /&gt;
#define FTPD_TIMEOUT 600000&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * TCP buffer size.&lt;br /&gt;
 */&lt;br /&gt;
#define TCPIP_BUFSIZ 5840&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Maximum segment size. &lt;br /&gt;
 *&lt;br /&gt;
 * Choose 536 up to 1460. Note, that segment sizes above 536 may result &lt;br /&gt;
 * in fragmented packets. Remember, that Ethernut doesn't support TCP &lt;br /&gt;
 * fragmentation.&lt;br /&gt;
 */&lt;br /&gt;
#define TCPIP_MSS 1460&lt;br /&gt;
&lt;br /&gt;
#if defined(ETHERNUT3)&lt;br /&gt;
&lt;br /&gt;
/* Ethernut 3 file system. */&lt;br /&gt;
#define FSDEV       devPhat0&lt;br /&gt;
#define FSDEV_NAME  &amp;quot;PHAT0&amp;quot; &lt;br /&gt;
&lt;br /&gt;
/* Ethernut 3 block device interface. */&lt;br /&gt;
#define BLKDEV      devNplMmc0&lt;br /&gt;
#define 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 FSDEV       devPhat0&lt;br /&gt;
#define FSDEV_NAME  &amp;quot;PHAT0&amp;quot; &lt;br /&gt;
&lt;br /&gt;
/* SAM7X-EK block device interface. */&lt;br /&gt;
#define BLKDEV      devAt91SpiMmc0&lt;br /&gt;
#define 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 FSDEV       devPhat0&lt;br /&gt;
#define FSDEV_NAME  &amp;quot;PHAT0&amp;quot; &lt;br /&gt;
&lt;br /&gt;
/* SAM9260-EK block device interface. */&lt;br /&gt;
#define BLKDEV      devAt91Mci0&lt;br /&gt;
#define BLKDEV_NAME &amp;quot;MCI0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#elif defined(ETHERNUT2)&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Ethernut 2 File system&lt;br /&gt;
 */&lt;br /&gt;
#define FSDEV       devPnut&lt;br /&gt;
#define FSDEV_NAME  &amp;quot;PNUT&amp;quot; &lt;br /&gt;
&lt;br /&gt;
#else&lt;br /&gt;
&lt;br /&gt;
#define FSDEV_NAME  &amp;quot;NONE&amp;quot; &lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define MYTZ    -1&lt;br /&gt;
&lt;br /&gt;
#define MYTIMED &amp;quot;130.149.17.21&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#ifdef ETHERNUT3&lt;br /&gt;
&lt;br /&gt;
#define X12RTC_DEV&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * FTP service.&lt;br /&gt;
 *&lt;br /&gt;
 * This function waits for client connect, processes the FTP request &lt;br /&gt;
 * and disconnects. Nut/Net doesn't support a server backlog. If one &lt;br /&gt;
 * client has established a connection, further connect attempts will &lt;br /&gt;
 * be rejected. &lt;br /&gt;
 *&lt;br /&gt;
 * Some FTP clients, like the Win32 Explorer, open more than one &lt;br /&gt;
 * connection for background processing. So we run this routine by&lt;br /&gt;
 * several threads.&lt;br /&gt;
 */&lt;br /&gt;
void FtpService(void)&lt;br /&gt;
{&lt;br /&gt;
    TCPSOCKET *sock;&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;
&lt;br /&gt;
        /* &lt;br /&gt;
         * Set specified socket options. &lt;br /&gt;
         */&lt;br /&gt;
#ifdef TCPIP_MSS&lt;br /&gt;
        {&lt;br /&gt;
            u_short mss = TCPIP_MSS;&lt;br /&gt;
            NutTcpSetSockOpt(sock, TCP_MAXSEG, &amp;amp;mss, sizeof(mss));&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
#ifdef FTPD_TIMEOUT&lt;br /&gt;
        {&lt;br /&gt;
            u_long tmo = FTPD_TIMEOUT;&lt;br /&gt;
            NutTcpSetSockOpt(sock, SO_RCVTIMEO, &amp;amp;tmo, sizeof(tmo));&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
#ifdef TCPIP_BUFSIZ&lt;br /&gt;
        {&lt;br /&gt;
            u_short siz = TCPIP_BUFSIZ;&lt;br /&gt;
            NutTcpSetSockOpt(sock, SO_RCVBUF, &amp;amp;siz, sizeof(siz));&lt;br /&gt;
        }&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * Listen on our port. If we return, we got a client.&lt;br /&gt;
         */&lt;br /&gt;
        printf(&amp;quot;\nWaiting for an FTP client...&amp;quot;);&lt;br /&gt;
        if (NutTcpAccept(sock, FTP_PORTNUM) == 0) {&lt;br /&gt;
            printf(&amp;quot;%s connected, %u bytes free\n&amp;quot;, inet_ntoa(sock-&amp;gt;so_remote_addr), (u_int)NutHeapAvailable());&lt;br /&gt;
            NutFtpServerSession(sock);&lt;br /&gt;
            printf(&amp;quot;%s disconnected, %u bytes free\n&amp;quot;, inet_ntoa(sock-&amp;gt;so_remote_addr), (u_int)NutHeapAvailable());&lt;br /&gt;
        } else {&lt;br /&gt;
            puts(&amp;quot;Accept failed&amp;quot;);&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;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * FTP service thread.&lt;br /&gt;
 */&lt;br /&gt;
THREAD(FtpThread, arg)&lt;br /&gt;
{&lt;br /&gt;
    /* Loop endless for connections. */&lt;br /&gt;
    for (;;) {&lt;br /&gt;
        FtpService();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Assign stdout to the UART device.&lt;br /&gt;
 */&lt;br /&gt;
void InitDebugDevice(void)&lt;br /&gt;
{&lt;br /&gt;
    u_long baud = DBG_BAUDRATE;&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;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Setup the ethernet device. Try DHCP first. If this is&lt;br /&gt;
 * the first time boot with empty EEPROM and no DHCP server&lt;br /&gt;
 * was found, use hardcoded values.&lt;br /&gt;
 */&lt;br /&gt;
int InitEthernetDevice(void)&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;
    u_char mac[6] = MY_MAC;&lt;br /&gt;
&lt;br /&gt;
    if (NutRegisterDevice(&amp;amp;DEV_ETHER, 0x8300, 5)) {&lt;br /&gt;
        puts(&amp;quot;No Ethernet Device&amp;quot;);&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Configure %s...&amp;quot;, DEV_ETHER_NAME);&lt;br /&gt;
#ifdef USE_DHCP&lt;br /&gt;
    if (NutDhcpIfConfig(DEV_ETHER_NAME, 0, 60000) == 0) {&lt;br /&gt;
        puts(&amp;quot;OK&amp;quot;);&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;initial boot...&amp;quot;);&lt;br /&gt;
    if (NutDhcpIfConfig(DEV_ETHER_NAME, mac, 60000) == 0) {&lt;br /&gt;
        puts(&amp;quot;OK&amp;quot;);&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
#endif&lt;br /&gt;
    printf(&amp;quot;No DHCP...&amp;quot;);&lt;br /&gt;
    NutNetIfConfig(DEV_ETHER_NAME, mac, ip_addr, ip_mask);&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;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Query a time server and optionally update the hardware clock.&lt;br /&gt;
 */&lt;br /&gt;
static int QueryTimeServer(void)&lt;br /&gt;
{&lt;br /&gt;
    int rc = -1;&lt;br /&gt;
&lt;br /&gt;
#ifdef MYTIMED&lt;br /&gt;
    {&lt;br /&gt;
        time_t now;&lt;br /&gt;
        u_long timeserver = inet_addr(MYTIMED);&lt;br /&gt;
&lt;br /&gt;
        /* Query network time service and set the system time. */&lt;br /&gt;
        printf(&amp;quot;Query time from %s...&amp;quot;, MYTIMED);&lt;br /&gt;
        if(NutSNTPGetTime(&amp;amp;timeserver, &amp;amp;now) == 0) {&lt;br /&gt;
            puts(&amp;quot;OK&amp;quot;);&lt;br /&gt;
            rc = 0;&lt;br /&gt;
            stime(&amp;amp;now);&lt;br /&gt;
#ifdef X12RTC_DEV&lt;br /&gt;
            /* If RTC hardware is available, update it. */&lt;br /&gt;
            {&lt;br /&gt;
                struct _tm *gmt = gmtime(&amp;amp;now);&lt;br /&gt;
&lt;br /&gt;
                if (X12RtcSetClock(gmt)) {&lt;br /&gt;
                    puts(&amp;quot;RTC update failed&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
#endif&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;
#endif&lt;br /&gt;
&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Try to get initial date and time from the hardware clock or a time server.&lt;br /&gt;
 */&lt;br /&gt;
static int InitTimeAndDate(void)&lt;br /&gt;
{&lt;br /&gt;
    int rc = -1;&lt;br /&gt;
&lt;br /&gt;
    /* Set the local time zone. */&lt;br /&gt;
    _timezone = MYTZ * 60L * 60L;&lt;br /&gt;
&lt;br /&gt;
#ifdef X12RTC_DEV&lt;br /&gt;
    /* Query RTC hardware if available. */&lt;br /&gt;
    {&lt;br /&gt;
        u_long rs;&lt;br /&gt;
&lt;br /&gt;
        /* Query the status. If it fails, we do not have an RTC. */&lt;br /&gt;
        if (X12RtcGetStatus(&amp;amp;rs)) {&lt;br /&gt;
            puts(&amp;quot;No hardware RTC&amp;quot;);&lt;br /&gt;
            rc = QueryTimeServer();&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            /* RTC hardware seems to be available. Check for power failure. */&lt;br /&gt;
            //rs = RTC_STATUS_PF;&lt;br /&gt;
            if ((rs &amp;amp; RTC_STATUS_PF) == RTC_STATUS_PF) {&lt;br /&gt;
                puts(&amp;quot;RTC power fail detected&amp;quot;);&lt;br /&gt;
                rc = QueryTimeServer();&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            /* RTC hardware status is fine, update our system clock. */&lt;br /&gt;
            else {&lt;br /&gt;
                struct _tm gmt;&lt;br /&gt;
&lt;br /&gt;
                /* Assume that RTC is running at GMT. */&lt;br /&gt;
                if (X12RtcGetClock(&amp;amp;gmt) == 0) {&lt;br /&gt;
                    time_t now = _mkgmtime(&amp;amp;gmt);&lt;br /&gt;
&lt;br /&gt;
                    if (now != -1) {&lt;br /&gt;
                        stime(&amp;amp;now);&lt;br /&gt;
                        rc = 0;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
#else&lt;br /&gt;
    /* No hardware RTC, query the time server if available. */&lt;br /&gt;
    rc = QueryTimeServer();&lt;br /&gt;
#endif&lt;br /&gt;
    return rc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Main application routine. &lt;br /&gt;
 *&lt;br /&gt;
 * Nut/OS automatically calls this entry after initialization.&lt;br /&gt;
 */&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    int volid;&lt;br /&gt;
    u_long ipgate;&lt;br /&gt;
&lt;br /&gt;
    /* Initialize a debug output device and print a banner. */&lt;br /&gt;
    InitDebugDevice();&lt;br /&gt;
    printf(&amp;quot;\n\nFTP Server Sample - Nut/OS %s - &amp;quot; CC_STRING &amp;quot;\n&amp;quot;, NutVersionString());&lt;br /&gt;
&lt;br /&gt;
    /* Initialize the Ethernet device and print our IP address. */&lt;br /&gt;
    if (InitEthernetDevice()) {&lt;br /&gt;
        for(;;);&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;IP Addr: %s\n&amp;quot;, inet_ntoa(confnet.cdn_ip_addr));&lt;br /&gt;
    printf(&amp;quot;IP Mask: %s\n&amp;quot;, inet_ntoa(confnet.cdn_ip_mask));&lt;br /&gt;
    NutIpRouteQuery(0, &amp;amp;ipgate);&lt;br /&gt;
    printf(&amp;quot;IP Gate: %s\n&amp;quot;, inet_ntoa(ipgate));&lt;br /&gt;
&lt;br /&gt;
#ifdef USE_DISCOVERY&lt;br /&gt;
    /* Register a discovery responder. */&lt;br /&gt;
    printf(&amp;quot;Start Responder...&amp;quot;);&lt;br /&gt;
    if (NutRegisterDiscovery((u_long)-1, 0, DISF_INITAL_ANN)) {&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;
    /* Initialize system clock and calendar. */&lt;br /&gt;
    if (InitTimeAndDate() == 0) {&lt;br /&gt;
        time_t now = time(0);&lt;br /&gt;
        struct _tm *lot = localtime(&amp;amp;now);&lt;br /&gt;
        printf(&amp;quot;Date: %02u.%02u.%u\n&amp;quot;, lot-&amp;gt;tm_mday, lot-&amp;gt;tm_mon + 1, 1900 + lot-&amp;gt;tm_year);&lt;br /&gt;
        printf(&amp;quot;Time: %02u:%02u:%02u\n&amp;quot;, lot-&amp;gt;tm_hour, lot-&amp;gt;tm_min, lot-&amp;gt;tm_sec);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
#ifdef FSDEV&lt;br /&gt;
    /* Initialize the file system. */&lt;br /&gt;
    printf(&amp;quot;Register file system...&amp;quot;);&lt;br /&gt;
    if (NutRegisterDevice(&amp;amp;FSDEV, 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;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef BLKDEV&lt;br /&gt;
    /* Register block device. */&lt;br /&gt;
    printf(&amp;quot;Register block device...&amp;quot;);&lt;br /&gt;
    if (NutRegisterDevice(&amp;amp;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 partition...&amp;quot;);&lt;br /&gt;
    if ((volid = _open(BLKDEV_NAME &amp;quot;:1/&amp;quot; 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;
#else&lt;br /&gt;
    volid = 0;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
    /* Register root path. */&lt;br /&gt;
    printf(&amp;quot;Register FTP root...&amp;quot;);&lt;br /&gt;
    if (NutRegisterFtpRoot(FSDEV_NAME &amp;quot;:&amp;quot;)) {&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;
    /* Start two additional server threads. */&lt;br /&gt;
    NutThreadCreate(&amp;quot;ftpd0&amp;quot;, FtpThread, 0, 1640);&lt;br /&gt;
    NutThreadCreate(&amp;quot;ftpd1&amp;quot;, FtpThread, 0, 1640);&lt;br /&gt;
&lt;br /&gt;
    /* Main server thread. */&lt;br /&gt;
    for (;;) {&lt;br /&gt;
#ifdef MY_WINSNAME&lt;br /&gt;
        NutWinsNameQuery(MY_WINSNAME, confnet.cdn_ip_addr);&lt;br /&gt;
#endif&lt;br /&gt;
        FtpService();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
ftp.c [[Copyright]] by egnite Software GmbH&lt;/div&gt;</summary>
		<author><name>Harald</name></author>	</entry>

	</feed>