TriOS/system/regnatix/ftp.spin

547 lines
20 KiB
Plaintext

{{
┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ 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
gc : "glob-con"
CON
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
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 & gc#A_LAN)
ios.sddmset(ios#DM_USER) 'u-marker setzen
ios.sddmact(ios#DM_SYSTEM) 's-marker aktivieren
ios.admload(string("admnet.adm")) 'versuche, admnet zu laden
ios.sddmact(ios#DM_USER) 'u-marker aktivieren
ifnot (ios.admgetspec & gc#A_LAN) 'wenn Laden fehlgeschlagen
ios.print(@strNoNetwork)
ios.stop 'Ende
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)
else
ByteMove(@filename, @parastr, strsize(@parastr))
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 <a.b.c.d> : host ip address (ftp server)",13
byte " (default: boot server from ipconfig)",13
byte " /d <directory>: change to remote directory",13
byte " (default: /hive/sdcard/system)",13
byte "[/f] <filename> : download <filename>",13
byte " /u <username> : Username at ftp server",13
byte " (default: anonymous)",13
byte " /p <password> : password at ftp server",13
byte " (default: anonymous@hive<hive id>)",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 <a.b.c.d> : FTP-Server-Adresse (Host)",13
byte " (default: mit ipconfig gesetzter Boot-Server)",13
byte " /d <verzeichnis>: in entferntes Verzeichnis wechseln",13
byte " (default: /hive/sdcard/system)",13
byte "[/f] <dateiname> : Download <dateiname>",13
byte " /u <username> : Benutzername am FTP-Server",13
byte " (default: anonymous)",13
byte " /p <password> : Paßwort am FTP-Server",13
byte " (default: anonymous@hive<Hive-Id>)",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. │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
}}