📄 tmffs.c
字号:
if (error > 0)
error = 0; // ignore request id
tmffs_put8(error);
tw(tr(TR_FUNC, TrTmffs, "FPI_SYMLINK()\n"));
ttw(ttr(TTrTmffs, "tm_sym" NL));
break;
case FPI_READLINK:
// STRING, BUFFER -> ERROR, DATA
if ((error = tm_ffs_overflowck()) == EFFS_OK)
error = ffs_readlink(string, (char *) buffer, TMFFS1_BUFFER_SIZE);
// Because a 32-bit integer is returned, we have to saturate it
// into an 8-bit value.
if (error >= 0)
error = 0;
tmffs_put8(error);
tmffs1_putdata(outp, buffer, bufsize); // put link contents
tw(tr(TR_FUNC, TrTmffs, "FPI_READLINK()\n"));
ttw(ttr(TTrTmffs, "tm_rdl" NL));
break;
case FPI_QUERY:
// INT8 -> ERROR, DATA
error = ffs_query(i8[0], buffer);
tmffs_put8(error);
tmffs1_putdata(outp, buffer, 16);
tw(tr(TR_FUNC, TrTmffs, "FPI_QUERY()\n"));
ttw(ttr(TTrTmffs, "tm_q" NL));
break;
case FPI_FCONTROL:
// STRING INT8 INT32 -> ERROR
if ((error = tm_ffs_overflowck()) == EFFS_OK)
error = ffs_fcontrol_nb(string, i8[0], i32[0], 0);
if (error > 0)
error = 0; // ignore request id
tmffs_put8(error);
tw(tr(TR_FUNC, TrTmffs, "FPI_FCONTROL()\n"));
ttw(ttr(TTrTmffs, "tm_fc" NL));
break;
case FPI_INIT:
// NULL -> ERROR
error =ffs_initialize();
tmffs_put8(error);
tw(tr(TR_FUNC, TrTmffs, "FPI_INIT()\n"));
ttw(ttr(TTrTmffs, "tm_init" NL));
break;
case FPI_EXIT:
// NULL -> ERROR
error = ffs_exit();
tmffs_put8(error);
tw(tr(TR_FUNC, TrTmffs, "FPI_EXIT()\n"));
ttw(ttr(TTrTmffs, "tm_exit" NL));
break;
case FPI_TFFS:
{
// STRING -> ERROR
#if (WITH_TFFS == 1)
extern char ffs_test_string[]; // defined in task.c
memcpy(ffs_test_string, string, stringsize);
tw(tr(TR_FUNC, TrTmffs, "FPI_TFFS()\n"));
ttw(ttr(TTrTmffs, "tm_tffs" NL));
#else
tmffs_put8(EFFS_NOSYS);
#endif
break;
}
default:
tw(tr(TR_FUNC, TrTmffs, "ERROR: Unknown tmffs protocol code\n"));
ttw(ttr(TTrTmffs, "tm?" NL));
break;
}
// check if we read beyond buffer end
if (inp > inp_start + insize) {
tw(tr(TR_FUNC, TrTmffs, "ERROR: Read beyond end of input buffer\n"));
ttw(ttr(TTrTmffs, "tm_fatal" NL));
// NOTEME: We really should reset output buffer and put a return
// code that tells us what went wrong!
return 0;
}
}
tw(tr(TR_END, TrTmffs, ""));
return outp - outp_start;
}
int tmffs_bufsize(void)
{
return TMFFS1_BUFFER_SIZE;
}
unsigned char *tmffs_bufaddr(void)
{
return buffer;
}
#endif // TMFFS1
/******************************************************************************
* FFS2 protocol
******************************************************************************/
#ifndef TMFFS2
#if (TARGET == 1)
int etm_ffs2(T_ETM_PKT *pkt, unsigned char *inp, int insize)
{
int error;
tw(tr(TR_BEGIN, TrTmffs, "FFS2 protocol not represented in target\n"));
error = -1; // FIXME other error?
#if 0 // Note we can only use this if etm is in target
// We return a packet instead of waiting for timeout.
pkt->size = 0;
pkt->status = -error;
pkt->mid = ETM_FFS2;
etm_pkt_send(pkt);
#endif
target_free(pkt);
tw(tr(TR_END, TrTmffs, ""));
return error;
}
#endif // (TARGET == 1)
#else
#define TMFFS_BUFFER_SIZE 256 // FIXME change to packet size
#define TMFFS_STRING_SIZE 127
/******************************************************************************
* Macros
******************************************************************************/
#define tmffs_get8() inp[0]; inp += 1;
#define tmffs_get16() (inp[0]) | (inp[1] << 8); inp += 2;
#define tmffs_get32() inp[0] | (inp[1] << 8) | (inp[2] << 16)\
| (inp[3] << 24); inp += 4;
#define tmffs_getdata() bufsize = inp[0]; inp += 1; \
memcpy(buffer, inp, bufsize); inp += bufsize;
/******************************************************************************
* Helper function
******************************************************************************/
// If size is less than zero it is because of a error and we dont have to put any
// data if size is returned in status.
int tmffs_putdata(unsigned char **buf, unsigned char *src, int size)
{
unsigned char *p = *buf;
if (size > 0) {
*p++ = size;
memcpy(p, src, size);
*buf += 1 + size;
}
return size;
}
int tmffs_putstring(unsigned char **buf, char *src, int size)
{
unsigned char *p = *buf;
if (size > 0) {
*p++ = size;
memcpy(p, src, size);
*buf += 1 + size;
}
return size;
}
int tmffs_getstring(unsigned char ** buf, char *string)
{
unsigned char *p = *buf;
stringsize = *p++;
if (stringsize > TMFFS_STRING_SIZE)
return EFFS_TOOBIG;
memcpy(string, p, stringsize);
*buf += 1 + stringsize;
return stringsize;
}
/******************************************************************************
* tm_ffs
******************************************************************************/
// Parse input message and execute function. Then fill output buffer with
// return values from the called function and transmit the message. Return
// number of bytes inserted into output buffer. If return value is negative,
// it represents an error code.
int etm_ffs2(T_ETM_PKT *pkt, unsigned char *inp, int insize)
{
tmffs2_cid_t fid;
unsigned char buffer[TMFFS_BUFFER_SIZE];
char string[TMFFS_STRING_SIZE];
unsigned char *outp_start;
unsigned char *inp_start = inp;
unsigned char *outp;
int error = 0, i, fdi, size, param, flags;
uint8 type;
bufsize = stringsize = tmpsize = 0;
tw(tr(TR_BEGIN, TrTmffs, "TmFFS2\n"));
outp_start = outp = pkt->data;
fid = *inp++;
ttw(ttr(TTrTmffs, "etm_ffs2 0x%x" NL, fid));
switch(fid)
{
/**********************************************************
* Generic Protocol Functions
**********************************************************/
case TMFFS_VERSION:
tmffs_put16(TMFFS2_VERSION);
break;
/**********************************************************
* FFS Functions
**********************************************************/
case TMFFS_PREFORMAT:
param = tmffs_get16();
error = ffs_preformat(param);
tw(tr(TR_FUNC, TrTmffs, "TMFFS_PREFORMAT(0x%x)\n", param));
ttw(ttr(TTrTmffs, "tm_pfmt" NL));
break;
case TMFFS_FORMAT:
error = tmffs_getstring(&inp, string);
param = tmffs_get16();
if (error >= 0)
error = ffs_format(&string[0], param);
tw(tr(TR_FUNC, TrTmffs, "TMFFS_FORMAT(0x%x)\n", param));
ttw(ttr(TTrTmffs, "tm_fmt" NL));
break;
case TMFFS_FILE_WRITE:
error = tmffs_getstring(&inp, string);
tmffs_getdata();
flags = tmffs_get8();
if (error >= 0)
error = ffs_file_write(string, buffer, bufsize, flags);
ttw(ttr(TTrTmffs, "tm_fwr" NL));
break;
case TMFFS_FILE_READ:
error = tmffs_getstring(&inp, string);
bufsize = tmffs_get8();
if (error >= 0)
size = ffs_file_read(string, buffer, bufsize);
error = tmffs_putdata(&outp, &buffer[0], size);
tw(tr(TR_FUNC, TrTmffs, "TMFFS_FREAD('%s', 0x%x, %d/0x%x)\n",
string, buffer, bufsize, bufsize));
ttw(ttr(TTrTmffs, "tm_frd" NL));
break;
case TMFFS_REMOVE:
error = tmffs_getstring(&inp, string);
if (error >= 0)
error = ffs_remove(string);
tw(tr(TR_FUNC, TrTmffs, "TMFFS_REMOVE()\n"));
ttw(ttr(TTrTmffs, "tm_rm" NL));
break;
case TMFFS_OPEN:
error = tmffs_getstring(&inp, string);
flags = tmffs_get8();
if (error >= 0)
error = ffs_open(string, flags);
tmffs_put8(error); // fdi
tw(tr(TR_FUNC, TrTmffs, "TMFFS_OPEN('%s', %d)\n", string, flags));
ttw(ttr(TTrTmffs, "tm_open" NL));
break;
case TMFFS_CLOSE:
fdi = tmffs_get8();
error = ffs_close(fdi);
tw(tr(TR_FUNC, TrTmffs, "TMFFS_CLOSE(%d)\n", fdi));
ttw(ttr(TTrTmffs, "tm_close" NL));
break;
case TMFFS_WRITE:
fdi = tmffs_get8();
tmffs_getdata();
error = ffs_write(fdi, buffer, bufsize);
tmffs_put8(error); // put size
tw(tr(TR_FUNC, TrTmffs, "TMFFS_WRITE(%d, %d)\n", fdi, bufsize));
ttw(ttr(TTrTmffs, "tm_write" NL));
break;
case TMFFS_READ:
fdi = tmffs_get8();
size = tmffs_get8();
size = ffs_read(fdi, &buffer[0], size);
error = tmffs_putdata(&outp, &buffer[0], size);
tw(tr(TR_FUNC, TrTmffs, "TMFFS_READ(%d, %d)\n", fdi, size));
ttw(ttr(TTrTmffs, "tm_read" NL));
break;
case TMFFS_MKDIR:
error = tmffs_getstring(&inp, string);
if (error >= 0)
error = ffs_mkdir(string);
tw(tr(TR_FUNC, TrTmffs, "TMFFS_MKDIR()\n"));
ttw(ttr(TTrTmffs, "tm_mkd" NL));
break;
case TMFFS_OPENDIR:
error = tmffs_getstring(&inp, string);
if (error >= 0) {
error = ffs_opendir(string, (struct dir_s *) buffer);
tmffs_put8(error); // Note: we must put error/number of objects.
}
if (error >= 0)
tmffs_putdata(&outp, buffer, sizeof(struct dir_s));
tw(tr(TR_FUNC, TrTmffs, "TMFFS_OPENDIR()\n"));
ttw(ttr(TTrTmffs, "tm_od" NL));
break;
case TMFFS_READDIR:
tmffs_getdata();
stringsize = tmffs_get8();
error = ffs_readdir((struct dir_s *) buffer, string, stringsize);
tmffs_put8(error); // Note: we have to return bytes read.
if (error >= 0) {
tmffs_putdata(&outp, buffer, sizeof(struct dir_s));
stringsize = strlen(string) + 1;
tmffs_putstring(&outp, string, stringsize);
}
tw(tr(TR_FUNC, TrTmffs, "TMFFS_READDIR()\n"));
ttw(ttr(TTrTmffs, "tm_rdd" NL));
break;
case TMFFS_STAT:
error = tmffs_getstring(&inp, string);
if (error >= 0)
error = ffs_stat(string, (struct stat_s *) buffer);
if (error >= 0)
tmffs_putdata(&outp, buffer, sizeof(struct stat_s));
tw(tr(TR_FUNC, TrTmffs, "TMFFS_STAT()\n"));
ttw(ttr(TTrTmffs, "tm_st" NL));
break;
case TMFFS_XLSTAT:
error = tmffs_getstring(&inp, string);
if (error >= 0)
error = ffs_xlstat(&string[0], (struct xstat_s *) buffer);
if (error >= 0)
tmffs_putdata(&outp, buffer, sizeof(struct xstat_s));
tw(tr(TR_FUNC, TrTmffs, "TMFFS_()\n"));
ttw(ttr(TTrTmffs, "tm_xlst" NL));
break;
case TMFFS_SYMLINK:
error = tmffs_getstring(&inp, string);
tmffs_getdata();
if (error >= 0)
error = ffs_symlink(string, (char *) buffer);
tw(tr(TR_FUNC, TrTmffs, "TMFFS_SYMLINK()\n"));
ttw(ttr(TTrTmffs, "tm_sym" NL));
break;
case TMFFS_READLINK:
error = tmffs_getstring(&inp, string);
tmffs_getdata();
if (error >= 0) {
size = ffs_readlink(string, (char *) buffer, TMFFS_BUFFER_SIZE);
error = tmffs_putdata(&outp, buffer, size); // put link contents
}
tw(tr(TR_FUNC, TrTmffs, "TMFFS_READLINK()\n"));
ttw(ttr(TTrTmffs, "tm_rdl" NL));
break;
case TMFFS_QUERY:
param = tmffs_get8();
error = ffs_query(param, buffer);
if (error >= 0)
tmffs_putdata(&outp, buffer, 16);
tw(tr(TR_FUNC, TrTmffs, "TMFFS_QUERY(%d)\n", param));
ttw(ttr(TTrTmffs, "tm_q" NL));
break;
case TMFFS_FCONTROL:
error = tmffs_getstring(&inp, string);
type = tmffs_get8();
param = tmffs_get32();
if (error >= 0)
error = ffs_fcontrol(string, type, param);
tw(tr(TR_FUNC, TrTmffs, "TMFFS_FCONTROL()\n"));
ttw(ttr(TTrTmffs, "tm_fc" NL));
break;
case TMFFS_TFFS:
{
#if (WITH_TFFS == 1)
extern char ffs_test_string[]; // defined in task.c
error = tmffs_getstring(&inp, string);
memcpy(ffs_test_string, string, stringsize);
tw(tr(TR_FUNC, TrTmffs, "TMFFS_TFFS()\n"));
ttw(ttr(TTrTmffs, "tm_tffs" NL));
tmffs_put8(EFFS_OK);
#else
tmffs_put8(EFFS_NOSYS);
#endif
break;
}
default:
error = EFFS_NOSYS;
tmffs_put8(EFFS_NOSYS);
tw(tr(TR_FUNC, TrTmffs, "ERROR: Unknown tmffs protocol code\n"));
ttw(ttr(TTrTmffs, "tm?" NL));
break;
}
// check if we read beyond buffer end
if (inp > inp_start + insize) {
tw(tr(TR_FUNC, TrTmffs, "ERROR: Read beyond end of input buffer\n"));
ttw(ttr(TTrTmffs, "tm_fatal" NL));
ttw(ttr(TTrTmffs, "insize: %d, diff: %d" NL, insize,
inp - (inp_start + insize)));
// NOTEME: We really should reset output buffer and put a return
// code that tells us what went wrong!
error = ETM_PACKET; // FIXME find another error
}
ttw(ttr(TTrTmffs, "error %d" NL, error));
if (error > 0)
error = 0;
pkt->mid = ETM_FFS2;
pkt->size = outp - outp_start;
pkt->status = -error;
etm_pkt_send(pkt);
etm_free(pkt);
tw(tr(TR_END, TrTmffs, ""));
return ETM_OK;
}
#endif // TMFFS2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -