FreeCalypso > hg > freecalypso-sw
diff rvinterf/etmsync/fileio.c @ 285:bb28ba9e82c5
fc-fsio: file read primitive and hd command implemented
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Fri, 28 Feb 2014 06:16:02 +0000 |
parents | 7b4d4e3e610a |
children | 146e7bf3fa4e |
line wrap: on
line diff
--- a/rvinterf/etmsync/fileio.c Fri Feb 28 05:50:01 2014 +0000 +++ b/rvinterf/etmsync/fileio.c Fri Feb 28 06:16:02 2014 +0000 @@ -110,3 +110,49 @@ } return(0); } + +do_file_read(pathname, databuf, rdsize, rdret) + char *pathname; + u_char *databuf; + int rdsize, *rdret; +{ + u_char cmdpkt[MAX_PKT_TO_TARGET], *dp; + int rc, slen, sz; + + slen = strlen(pathname); + if (slen >= TMFFS_STRING_SIZE) { + printf("error: pathname arg exceeds string length limit\n"); + return(ERROR_USAGE); + } + if (rdsize > MAX_READ_DATA) { + fprintf(stderr, + "BUG: attempt to read more than possible per TMFFS2 protocol\n"); + exit(ERROR_BUG); + } + dp = cmdpkt + 1; + *dp++ = ETM_FFS2; + *dp++ = TMFFS_FILE_READ; + *dp++ = slen + 1; + strcpy(dp, pathname); + dp += slen + 1; + *dp++ = rdsize; + rc = etm_pkt_exch(cmdpkt, dp - cmdpkt - 1); + if (rc) + return(rc); + if (rvi_msg[3]) { + printf("read file: FFS error %d\n", rvi_msg[3]); + return(ERROR_TARGET); + } + if (rvi_msg_len < 6) { + *rdret = 0; + return(0); + } + sz = rvi_msg[4]; + if (rvi_msg_len != sz + 6 || sz > rdsize) { + printf("error: read file response has wrong length\n"); + return(ERROR_TARGET); + } + bcopy(rvi_msg + 5, databuf, sz); + *rdret = sz; + return(0); +}