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);
+}