1
0
mirror of https://github.com/elua/elua.git synced 2025-01-08 20:56:17 +08:00
elua/rfs_server/client.c
Bogdan Marinescu e7702bb0e2 Manual merge of remotefs/ into trunk. Tested with the simulator and (partially) on a ET-STM32 board. Other changes:
- FAT changed to support the new opendir/readdir/closedir mechanism, and to use lseek directly instead of ioctl (also fixed a bug in FAT's lseek that always returned 0 instead of file position).
- ET-STM32 console moved to UART2@19200bps (to allow RFS to run on UART0). If UART0 is needee for console, remember to disable RFS.
- freed 700+ bytes of RAM by changing the devman implementation to keep pointers instead of actual DM_DEVICE structures
- other minor code changes and fixes
2010-02-01 18:47:41 +00:00

140 lines
3.5 KiB
C

// Remote filesystem client
#include <string.h>
#include "remotefs.h"
#include "client.h"
#include "os_io.h"
// ****************************************************************************
// Client local data
static u8 *rfsc_buffer;
static p_rfsc_send rfsc_send;
static p_rfsc_recv rfsc_recv;
static u32 rfsc_timeout;
// ****************************************************************************
// Client helpers
static int rfsch_send_request_read_response()
{
u16 temp16;
// Send request
if( remotefs_get_packet_size( rfsc_buffer, &temp16 ) == REMOTEFS_ERR )
return CLIENT_ERR;
if( rfsc_send( rfsc_buffer, temp16 ) != temp16 )
return CLIENT_ERR;
// Get response
// First the length, then the rest of the data
if( rfsc_recv( rfsc_buffer, RFS_START_OFFSET, rfsc_timeout ) != RFS_START_OFFSET )
return CLIENT_ERR;
if( remotefs_get_packet_size( rfsc_buffer, &temp16 ) == REMOTEFS_ERR )
return CLIENT_ERR;
if( rfsc_recv( rfsc_buffer + RFS_START_OFFSET, temp16 - RFS_START_OFFSET, rfsc_timeout ) != temp16 - RFS_START_OFFSET )
return CLIENT_ERR;
return CLIENT_OK;
}
// ****************************************************************************
// Client public interface
void rfsc_setup( u8 *pbuf, p_rfsc_send rfsc_send_func, p_rfsc_recv rfsc_recv_func, u32 timeout )
{
rfsc_buffer = pbuf;
rfsc_send = rfsc_send_func;
rfsc_recv = rfsc_recv_func;
rfsc_timeout = timeout;
}
void rfsc_set_timeout( u32 timeout )
{
rfsc_timeout = timeout;
}
int rfsc_open( const char* pathname, int flags, int mode )
{
int fd;
// Make the request
remotefs_open_write_request( rfsc_buffer, pathname, os_open_sys_flags_to_rfs_flags( flags ), mode );
// Send the request / get the respone
if( rfsch_send_request_read_response() == CLIENT_ERR )
return -1;
// Interpret the response
if( remotefs_open_read_response( rfsc_buffer, &fd ) == REMOTEFS_ERR )
return -1;
return fd;
}
s32 rfsc_write( int fd, const void *buf, u32 count )
{
// Make the request
remotefs_write_write_request( rfsc_buffer, fd, buf, count );
// Send the request / get the response
if( rfsch_send_request_read_response() == CLIENT_ERR )
return -1;
// Interpret the response
if( remotefs_write_read_response( rfsc_buffer, &count ) == REMOTEFS_ERR )
return -1;
return ( s32 )count;
}
s32 rfsc_read( int fd, void *buf, u32 count )
{
const u8 *resbuf;
// Make the request
remotefs_read_write_request( rfsc_buffer, fd, count );
// Send the request / get the response
if( rfsch_send_request_read_response() == CLIENT_ERR )
return -1;
// Interpret the response
if( remotefs_read_read_response( rfsc_buffer, &resbuf, &count ) == REMOTEFS_ERR )
return -1;
memcpy( buf, resbuf, count );
return ( s32 )count;
}
s32 rfsc_lseek( int fd, s32 offset, int whence )
{
s32 res;
// Make the request
remotefs_lseek_write_request( rfsc_buffer, fd, offset, os_lseek_sys_whence_to_rfs_whence( whence ) );
// Send the request / get the response
if( rfsch_send_request_read_response() == CLIENT_ERR )
return -1;
// Interpret the response
if( remotefs_lseek_read_response( rfsc_buffer, &res ) == REMOTEFS_ERR )
return -1;
return res;
}
int rfsc_close( int fd )
{
int res;
// Make the request
remotefs_close_write_request( rfsc_buffer, fd );
// Send the request / get the response
if( rfsch_send_request_read_response() == CLIENT_ERR )
return -1;
// Interpret the response
if( remotefs_close_read_response( rfsc_buffer, &res ) == REMOTEFS_ERR )
return -1;
return res;
}