FreeCalypso > hg > freecalypso-sw
diff rvinterf/etmsync/fileio.c @ 291:69e8ae2b5ba2
fc-fsio: fwrite implementation started
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sat, 01 Mar 2014 02:36:25 +0000 |
parents | 244f08f58e51 |
children | ffeea2f9d149 |
line wrap: on
line diff
--- a/rvinterf/etmsync/fileio.c Fri Feb 28 23:41:53 2014 +0000 +++ b/rvinterf/etmsync/fileio.c Sat Mar 01 02:36:25 2014 +0000 @@ -156,3 +156,49 @@ *rdret = sz; return(0); } + +max_short_file_write(pathname) + char *pathname; +{ + return MAX_PKT_TO_TARGET - 3 - (strlen(pathname) + 2) - 3; +} + +do_short_fwrite(pathname, data, datalen) + char *pathname; + u_char *data; +{ + u_char cmdpkt[MAX_PKT_TO_TARGET], *dp; + int rc, slen; + + slen = strlen(pathname); + if (slen >= TMFFS_STRING_SIZE) { + printf("error: pathname arg exceeds string length limit\n"); + return(ERROR_USAGE); + } + if (datalen > max_short_file_write(pathname)) { + printf("error: short write data fails to fit in the packet\n"); + return(ERROR_USAGE); + } + dp = cmdpkt + 1; + *dp++ = ETM_FFS2; + *dp++ = TMFFS_FILE_WRITE; + *dp++ = slen + 1; + strcpy(dp, pathname); + dp += slen + 1; + *dp++ = datalen; + bcopy(data, dp, datalen); + dp += datalen; + *dp++ = FFS_O_CREATE | FFS_O_TRUNC; + rc = etm_pkt_exch(cmdpkt, dp - cmdpkt - 1); + if (rc) + return(rc); + if (rvi_msg_len != 5) { + printf("error: TMFFS_FILE_WRITE response has wrong length\n"); + return(ERROR_TARGET); + } + if (rvi_msg[3]) { + report_ffs_err("short file write", rvi_msg[3]); + return(ERROR_TARGET); + } + return(0); +}