{{ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ Autor: Jörg Deckert │ │ Copyright (c) 2013 Jörg Deckert │ │ See end of file for terms of use. │ │ Die Nutzungsbedingungen befinden sich am Ende der Datei │ └──────────────────────────────────────────────────────────────────────────────────────────────────────┘ Informationen : hive-project.de Kontakt : joergd@bitquell.de System : TriOS Name : flash Chip : Regnatix Typ : Programm Version : Subversion : Funktion : FTP-Client Komponenten : - COG's : - Logbuch : 22.12.2013-joergd - erste Version 05.01.2014-joergd - Defaultwerte gesetzt - Speichern auf SD-Card - Parameter für Benutzer und Paßwort Kommandoliste : Notizen : }} OBJ ios: "reg-ios" str: "glob-string" num: "glob-numbers" 'Number Engine CON _CLKMODE = XTAL1 + PLL16X _XINFREQ = 5_000_000 LANMASK = %00000000_00000000_00000000_00100000 CON 'NVRAM Konstanten -------------------------------------------------------------------------- #4, NVRAM_IPADDR #8, NVRAM_IPMASK #12, NVRAM_IPGW #16, NVRAM_IPDNS #20, NVRAM_IPBOOT #24, NVRAM_HIVE ' 4 Bytes DAT strNVRAMFile byte "nvram.sav",0 'contains the 56 bytes of NVRAM, if RTC is not available VAR long ip_addr byte parastr[64] byte remdir[64] byte filename[64] byte username[64] byte password[64] byte strTemp[128] byte addrset byte save2card byte handleidx_control 'Handle FTP Control Verbindung byte handleidx_data 'Handle FTP Data Verbindung PUB main ip_addr := 0 save2card := FALSE remdir[0] := 0 filename[0] := 0 username[0] := 0 password[0] := 0 ios.start ifnot (ios.admgetspec & LANMASK) ios.print(@strNoNetwork) ios.stop ios.printnl ios.parastart 'parameterübergabe starten repeat while ios.paranext(@parastr) 'parameter einlesen if byte[@parastr][0] == "/" 'option? case byte[@parastr][1] "?": ios.print(@help) "h": if ios.paranext(@parastr) setaddr(@parastr) "d": ios.paranext(@remdir) "f": ios.paranext(@filename) "u": ios.paranext(@username) "p": ios.paranext(@password) "s": save2card := TRUE other: ios.print(@help) ifnot byte[@filename][0] == 0 ifnot ftpconnect ifnot ftplogin ifnot ftpcwd if ftppasv ftpretr else ios.print(@strNoFile) ftpclose ios.stop PRI ftpconnect ifnot (ip_addr) ' Adresse 0.0.0.0 ios.print(@strNoHost) if ios.rtcTest 'RTC chip available? ip_addr := ios.getNVSRAM(NVRAM_IPBOOT) << 24 ip_addr += ios.getNVSRAM(NVRAM_IPBOOT+1) << 16 ip_addr += ios.getNVSRAM(NVRAM_IPBOOT+2) << 8 ip_addr += ios.getNVSRAM(NVRAM_IPBOOT+3) else ios.sddmset(ios#DM_USER) 'u-marker setzen ios.sddmact(ios#DM_SYSTEM) 's-marker aktivieren ifnot ios.sdopen("R",@strNVRAMFile) ios.sdseek(NVRAM_IPBOOT) ip_addr := ios.sdgetc << 24 ip_addr += ios.sdgetc << 16 ip_addr += ios.sdgetc << 8 ip_addr += ios.sdgetc ios.sdclose ios.sddmact(ios#DM_USER) 'u-marker aktivieren if (ip_addr) ios.print(@strUseBoot) else return(-1) #ifdef __DEBUG ios.print(@strStartLAN) #endif ios.lanstart ios.print(@strConnect) if (handleidx_control := ios.lan_connect(ip_addr, 21)) == $FF ios.print(@strErrorNoSock) return(-1) ifnot (ios.lan_waitconntimeout(handleidx_control, 2000)) ios.print(@strErrorConnect) return(-1) #ifdef __DEBUG ios.print(@strConnected) #endif ifnot getResponse(string("220 ")) ios.print(@strError220) return(-1) return(0) PRI ftpclose ifnot handleidx_control == $FF ios.lan_close(handleidx_control) handleidx_control := $FF ifnot handleidx_data == $FF ios.lan_close(handleidx_data) handleidx_data := $FF PRI ftplogin | pwreq, respOK, hiveid pwreq := FALSE respOK := FALSE sendStr(string("USER ")) if strsize(@username) sendStr(@username) sendStr(string(13,10)) else sendStr(string("anonymous",13,10)) repeat until readLine == -1 #ifdef __DEBUG ios.print(string(" < ")) ios.print(@strTemp) ios.printnl #endif strTemp[4] := 0 if strcomp(@strTemp, string("230 ")) respOk := TRUE quit elseif strcomp(@strTemp, string("331 ")) pwreq := TRUE respOk := TRUE quit ifnot respOK ios.print(@strErrorLogin) return(-1) ifnot pwreq return(0) sendStr(string("PASS ")) if strsize(@password) sendStr(@password) sendStr(string(13,10)) else if ios.rtcTest 'RTC chip available? hiveid := ios.getNVSRAM(NVRAM_HIVE) hiveid += ios.getNVSRAM(NVRAM_HIVE+1) << 8 hiveid += ios.getNVSRAM(NVRAM_HIVE+2) << 16 hiveid += ios.getNVSRAM(NVRAM_HIVE+3) << 24 else ios.sddmset(ios#DM_USER) 'u-marker setzen ios.sddmact(ios#DM_SYSTEM) 's-marker aktivieren ifnot ios.sdopen("R",@strNVRAMFile) ios.sdseek(NVRAM_HIVE) hiveid := ios.sdgetc hiveid += ios.sdgetc << 8 hiveid += ios.sdgetc << 16 hiveid += ios.sdgetc << 24 ios.sdclose ios.sddmact(ios#DM_USER) 'u-marker aktivieren sendStr(string("anonymous@hive")) sendStr(str.trimCharacters(num.ToStr(hiveid, num#DEC))) sendStr(string(13,10)) ifnot getResponse(string("230 ")) ios.print(@strErrorPass) return(-1) return(0) PRI ftpcwd | i if byte[@remdir][0] == 0 i := sendStr(string("CWD ")) || sendStr(@defdir) || sendStr(string(13,10)) else i := sendStr(string("CWD ")) || sendStr(@remdir) || sendStr(string(13,10)) if i ios.print(@strErrorCWD) return(-1) ifnot getResponse(string("250 ")) ios.print(@strError250) ios.printchar("(") ios.print(@strTemp+4) ios.print(string(")",13)) return(-1) return(0) PRI ftppasv : port | i, k, port256, port1 port := 0 port256 := 0 port1 := 0 k := 0 if sendStr(string("PASV",13,10)) return(0) repeat until readLine == -1 #ifdef __DEBUG ios.print(string(" < ")) ios.print(@strTemp) ios.printnl #endif strTemp[4] := 0 if strcomp(@strTemp, string("227 ")) repeat i from 5 to 126 if (strTemp[i] == 0) OR (strTemp[i] == 13) OR (strTemp[i] == 10) quit if strTemp[i] == 44 'Komma strTemp[i] := 0 k++ if k == 4 '4. Komma, Port Teil 1 folgt port256 := i + 1 if k == 5 '5. Komma, Port Teil 2 folgt port1 := i + 1 if strTemp[i] == 41 'Klammer zu strTemp[i] := 0 if (port256 & port1) port := (num.FromStr(@strTemp+port256, num#DEC) * 256) + num.FromStr(@strTemp+port1, num#DEC) quit if (port == 0) ios.print(@strErrorPasvPort) return(0) #ifdef __DEBUG ios.print(@strOpenPasv) ios.print(num.ToStr(port, num#DEC)) ios.printnl #endif if (handleidx_data := ios.lan_connect(ip_addr, port)) == $FF ios.print(@strErrorSockPasv) return(0) ifnot (ios.lan_waitconntimeout(handleidx_data, 2000)) ios.print(@strErrorPasvConn) return(0) PRI ftpretr | len, respOK if sendStr(string("TYPE I",13,10)) ios.print(@strErrorSendType) return(-1) ifnot getResponse(string("200 ")) ios.print(@strErrorChType) return(-1) if sendStr(string("SIZE ")) || sendStr(@filename) || sendStr(string(13,10)) ios.print(@strErrorSendSize) return(-1) ifnot getResponse(string("213")) ios.print(@strErrorSize) ios.printchar("(") ios.print(@strTemp+4) ios.print(string(")",13)) return(-1) ifnot(len := num.FromStr(@strTemp+4, num#DEC)) ios.print(@strErrorGetSize) return(-1) ios.print(@strGetFile) if sendStr(string("RETR ")) || sendStr(@filename) || sendStr(string(13,10)) ios.print(@strErrorSendFN) return -1 respOK := FALSE repeat until readLine == -1 #ifdef __DEBUG ios.print(string(" < ")) ios.print(@strTemp) ios.printnl #endif strTemp[4] := 0 if strcomp(@strTemp, string("150 ")) respOk := TRUE quit elseif strcomp(@strTemp, string("125 ")) respOk := TRUE quit ifnot respOK ios.print(@strErrorRetr) ios.printchar("(") ios.print(@strTemp+4) ios.print(string(")",13)) return(-1) if ios.lan_rxdata(handleidx_data, @filename, len) ios.print(@strErrorRXData) return(-1) ifnot getResponse(string("226 ")) ios.print(@strErrorRetrOK) return(-1) if save2card ios.print(@strWrite2SD) writeToSDCard PRI writeToSDCard | fnr, len, i fnr := ios.rd_open(@filename) ifnot fnr == -1 len := ios.rd_len(fnr) ios.sddel(@filename) 'falls alte Datei auf SD-Card vorhanden, diese löschen ifnot ios.sdnewfile(@filename) ifnot ios.sdopen("W",@filename) i := 0 ios.sdxputblk(fnr,len) 'Daten als Block schreiben ios.sdclose ios.rd_del(@filename) ios.rd_close(fnr) PRI setaddr (ipaddr) | pos, count 'IP-Adresse in Variable schreiben count := 3 repeat while ipaddr pos := str.findCharacter(ipaddr, ".") if(pos) byte[pos++] := 0 ip_addr += num.FromStr(ipaddr, num#DEC) << (8*count--) ipaddr := pos if(count == -1) quit PRI getResponse (strOk) : respOk | len respOk := FALSE repeat until readLine == -1 #ifdef __DEBUG ios.print(string(" < ")) ios.print(@strTemp) ios.printnl #endif strTemp[strsize(strOk)] := 0 if strcomp(@strTemp, strOk) respOk := TRUE quit return respOk PRI readLine | i, ch repeat i from 0 to 126 ch := ios.lan_rxtime(handleidx_control, 2000) if ch == 13 ch := ios.lan_rxtime(handleidx_control, 2000) if ch == -1 or ch == 10 quit strTemp[i] := ch strTemp[i] := 0 return ch 'letztes Zeichen oder -1, wenn keins mehr empfangen PRI sendStr (strSend) : error #ifdef __DEBUG ios.print(string(" > ")) ios.print(strSend) ios.printnl #endif error := ios.lan_txdata(handleidx_control, strSend, strsize(strSend)) DAT ' Locale #ifdef __LANG_EN 'locale: english defdir byte "/hive/sdcard/system",0 strNoNetwork byte 13,"Administra doesn't provide network functions!",13,"Please load admnet.",13,0 strNoFile byte "No file to download specified, exit...",13,0 strNoHost byte "No host (ftp server) specified (parameter /h)",13,0 strUseBoot byte "Using boot server (set with ipconfig).",13,0 strStartLAN byte "Starting LAN...",13,0 strConnect byte "Connecting to ftp server...",13,0 strErrorNoSock byte "No free socket.",13,0 strErrorConnect byte "Couldn't connect to ftp server.",13,0 strConnected byte "Connected to ftp server, waiting for answer...",13,0 strError220 byte "Ftp server doesn't acknowledge the connection (220).",13,0 strErrorLogin byte "Ftp server doesn't acknowledge the login (230/331)",13,0 strErrorPass byte "Ftp server doesn't acknowledge the password (230)",13,0 strErrorCWD byte "Error sendig remote directory",13,0 strError250 byte "Ftp server doesn't acknowledge the directory change (250).",13,0 strErrorPasvPort byte "Couldn't get the passive port.",13,0 strOpenPasv byte "Open Connection to passive port ",0 strErrorSockPasv byte "No free socket fpr passive connection.",13,0 strErrorPasvConn byte "Couldn't connect to passive port.",13,0 strErrorSendType byte "Error sending file type",13,0 strErrorChType byte "Ftp serve couldn't change file type (200).",13,0 strErrorSendSize byte "Error sending SIZE command",13,0 strErrorSize byte "Ftp server couldn't send file size (213).",13,"File not found? SIZE not supported?",13,0 strErrorGetSize byte "Couldn't get file size.",13,0 strGetFile byte "Retrieve file, please wait...",13,0 strErrorSendFN byte "Error sending file name.",13,0 strErrorRetr byte "Ftp server couldn't send file (150/125).",13,0 strErrorRXData byte "Error retrieving file.",13,0 strErrorRetrOK byte "Ftp server doesn't acknowledge sending of file (226).",13,0 strWrite2SD byte "Saving to sd card...",13,0 help byte "/? : Help",13 byte "/h : host ip address (ftp server)",13 byte " (default: boot server from ipconfig)",13 byte "/d : change to remote directory",13 byte " (default: /hive/sdcard/system)",13 byte "/f : download ",13 byte "/u : Username at ftp server",13 byte " (default: anonymous)",13 byte "/p : password at ftp server",13 byte " (default: anonymous@hive)",13 byte "/s : save file to sd card",13 byte 0 #else 'default locale: german defdir byte "/hive/sdcard/system",0 strNoNetwork byte 13,"Administra stellt keine Netzwerk-Funktionen zur Verfügung!",13,"Bitte admnet laden.",13,0 strNoFile byte "Keine Datei zum Downloaden angegeben, beende...",13,0 strNoHost byte "FTP-Server nicht angegeben (Parameter /h)",13,0 strUseBoot byte "Verwende Boot-Server (mit ipconfig gesetzt).",13,0 strStartLAN byte "Starte LAN...",13,0 strConnect byte "Verbinde mit FTP-Server...",13,0 strErrorNoSock byte "Kein Socket frei...",13,0 strErrorConnect byte "Verbindung mit FTP-Server konnte nicht aufgebaut werden.",13,0 strConnected byte "Verbindung mit FTP-Server hergestellt, warte auf Antwort...",13,0 strError220 byte "FTP-Server bestätigt den Verbindungsaufbau nicht (220).",13,0 strErrorLogin byte "FTP-Server hat Login nicht bestätigt (230/331)",13,0 strErrorPass byte "FTP-Server hat das Paßwort nicht bestätigt (230)",13,0 strErrorCWD byte "Fehler beim Senden des Verzeichnisses",13,0 strError250 byte "FTP-Server hat den Verzeichniswechsel nicht bestätigt (250).",13,0 strErrorPasvPort byte "Konnte zu öffnenden Passiv-Port nicht ermitteln.",13,0 strOpenPasv byte "Öffne Verbindung zu Passiv-Port ",0 strErrorSockPasv byte "Kein Socket für Passiv-Verbindung frei...",13,0 strErrorPasvConn byte "Passiv-Verbindung mit FTP-Server konnte nicht aufgebaut werden.",13,0 strErrorSendType byte "Fehler beim Senden des Types",13,0 strErrorChType byte "FTP-Server konnte Übertragungs-Typ nicht ändern (200).",13,0 strErrorSendSize byte "Fehler beim Senden des SIZE-Kommandos",13,0 strErrorSize byte "FTP-Server kann die Datei-Größe nicht übermitteln (213).",13,"Datei nicht vorhanden? SIZE nicht unterstützt?",13,0 strErrorGetSize byte "Konnte Filegröße nicht ermitteln.",13,0 strGetFile byte "Empfange Datei, bitte warten...",13,0 strErrorSendFN byte "Fehler beim Senden des Filenamens.",13,0 strErrorRetr byte "FTP-Server kann die Datei nicht senden (150/125).",13,0 strErrorRXData byte "Fehler beim Empfang der Datei.",13,0 strErrorRetrOK byte "FTP-Server hat den Empfang durch den Client nicht bestätigt (226).",13,0 strWrite2SD byte "Speichere auf SD-Card...",13,0 help byte "/? : Hilfe",13 byte "/h : FTP-Server-Adresse (Host)",13 byte " (default: mit ipconfig gesetzter Boot-Server)",13 byte "/d : in entferntes Verzeichnis wechseln",13 byte " (default: /hive/sdcard/system)",13 byte "/f : Download ",13 byte "/u : Benutzername am FTP-Server",13 byte " (default: anonymous)",13 byte "/p : Paßwort am FTP-Server",13 byte " (default: anonymous@hive)",13 byte "/s : Datei auf SD-Card speichern",13 byte 0 #endif DAT 'lizenz {{ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ TERMS OF USE: MIT License │ ├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │ │files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │ │modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│ │is furnished to do so, subject to the following conditions: │ │ │ │The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│ │ │ │THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │ │WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │ │COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │ │ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ }}