2025-05-19 14:50:19 +08:00

66 lines
2.1 KiB
C

#include "MMBasic_Includes.h"
#include "Hardware_Includes.h"
#include "lwip/apps/tftp_common.h"
#include "lwip/apps/tftp_server.h"
struct tftp_context ctx;
int tftp_fnbr;
void* tftp_open(const char* fname, const char* fmode, u8_t write){
if (!InitSDCard()) return NULL;
BYTE mode = 0;
tftp_fnbr=FindFreeFileNbr();
if (write){
mode = FA_WRITE | FA_CREATE_ALWAYS;
if(!optionsuppressstatus)MMPrintString("TFTP request to create ");
}
else {
mode = FA_READ;
if(!optionsuppressstatus)MMPrintString("TFTP request to read ");
}
if(!optionsuppressstatus)MMPrintString(strcmp(fmode,"octet")==0? "binary file : " : "ascii file : ");
if(!optionsuppressstatus)MMPrintString((char *)fname);
if(!optionsuppressstatus)PRet();
if (!BasicFileOpen((char *)fname, tftp_fnbr, mode))
return NULL;
return &tftp_fnbr;
}
void tftp_close(void* handle){
// int nbr;
int fnbr=*(int *)handle;
FileClose(fnbr);
if(!optionsuppressstatus)MMPrintString("TFTP transfer complete\r\n");
}
int tftp_read(void* handle, void* buf, int bytes){
int n_read;
int fnbr=*(int *)handle;
if(filesource[fnbr]==FATFSFILE) f_read(FileTable[fnbr].fptr, buf, bytes, (UINT *)&n_read);
else n_read=lfs_file_read(&lfs, FileTable[fnbr].lfsptr, buf, bytes);
return n_read;
}
int tftp_write(void* handle, struct pbuf* p){
int nbr;
int fnbr=*(int *)handle;
if(filesource[fnbr]==FATFSFILE) f_write(FileTable[fnbr].fptr, p->payload, p->tot_len, (UINT *)&nbr);
else {
nbr=FSerror=lfs_file_write(&lfs, FileTable[fnbr].lfsptr, p->payload, p->tot_len);
}
if(FSerror>0)FSerror=0;
ErrorCheck(tftp_fnbr);
return nbr;
}
void tftp_error(void* handle, int err, const char* msg, int size){
int fnbr=*(int *)handle;
ForceFileClose(fnbr);
MMPrintString("TFTP Error: ");
MMPrintString((char *)msg);
PRet();
}
int cmd_tftp_server_init(void){
ctx.open=tftp_open;
ctx.close=tftp_close;
ctx.error=tftp_error;
ctx.write=tftp_write;
ctx.read=tftp_read;
tftp_init_server(&ctx);
return 1;
}