FreeCalypso > hg > freecalypso-tools
diff rvinterf/etmsync/fswrite.c @ 0:e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 11 Jun 2016 00:13:35 +0000 |
parents | |
children | 8136fb5eb292 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/etmsync/fswrite.c Sat Jun 11 00:13:35 2016 +0000 @@ -0,0 +1,163 @@ +/* + * FFS write operation commands + */ + +#include <sys/types.h> +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include "etm.h" +#include "ffs.h" +#include "ffserr.h" +#include "tmffs2.h" +#include "limits.h" +#include "localtypes.h" +#include "localstruct.h" +#include "exitcodes.h" + +extern u_char rvi_msg[]; +extern int rvi_msg_len; + +cmd_mkdir(argc, argv) + char **argv; +{ + return do_mkdir_existok(argv[1]); +} + +cmd_delete(argc, argv) + char **argv; +{ + u_char cmdpkt[MAX_PKT_TO_TARGET], *dp; + int rc, slen; + + slen = strlen(argv[1]); + if (slen >= TMFFS_STRING_SIZE) { + printf("error: pathname arg exceeds string length limit\n"); + return(ERROR_USAGE); + } + dp = cmdpkt + 1; + *dp++ = ETM_FFS2; + *dp++ = TMFFS_REMOVE; + *dp++ = slen + 1; + strcpy(dp, argv[1]); + dp += slen + 1; + rc = etm_pkt_exch(cmdpkt, dp - cmdpkt - 1); + if (rc) + return(rc); + if (rvi_msg_len != 5) { + printf("error: TMFFS_REMOVE response has wrong length\n"); + return(ERROR_TARGET); + } + if (rvi_msg[3]) { + report_ffs_err("ffs_remove", rvi_msg[3]); + return(ERROR_TARGET); + } + return(0); +} + +hexdigit(c) +{ + if (isdigit(c)) + return(c - '0'); + else if (isupper(c)) + return(c - 'A' + 10); + else + return(c - 'a' + 10); +} + +fwrite_hex_string(pathname, strarg) + char *pathname, *strarg; +{ + u_char buf[256]; + int maxlen, len; + char *cp; + + maxlen = max_short_file_write(pathname); + for (cp = strarg, len = 0; ; cp += 2) { + while (isspace(*cp)) + cp++; + if (!*cp) + break; + if (!isxdigit(cp[0]) || !isxdigit(cp[1])) { + fprintf(stderr, "error: invalid hex string argument\n"); + return(ERROR_USAGE); + } + if (len >= maxlen) { + fprintf(stderr, + "error: hex string exceeds write packet limit\n"); + return(ERROR_USAGE); + } + buf[len++] = hexdigit(cp[0]) << 4 | hexdigit(cp[1]); + } + return do_short_fwrite(pathname, buf, len); +} + +fwrite_from_file(pathname, srcfile) + char *pathname, *srcfile; +{ + u_char buf[240]; + FILE *srcf; + int rc, cc, first, tfd; + + srcf = fopen(srcfile, "r"); + if (!srcf) { + perror(srcfile); + return(ERROR_UNIX); + } + for (first = 1; cc = fread(buf, 1, sizeof buf, srcf); first = 0) { + if (first) { + if (cc < sizeof buf && + cc <= max_short_file_write(pathname)) { + fclose(srcf); + return do_short_fwrite(pathname, buf, cc); + } + rc = fd_open(pathname, + FFS_O_WRONLY | FFS_O_CREATE | FFS_O_TRUNC, + &tfd); + if (rc) { + fclose(srcf); + return(rc); + } + } + rc = fd_write(tfd, buf, cc); + if (rc) { + fclose(srcf); + fd_close(tfd); + return(rc); + } + } + fclose(srcf); + if (first) { + /* 0 length file: do an open-for-write to create it */ + rc = fd_open(pathname, + FFS_O_WRONLY | FFS_O_CREATE | FFS_O_TRUNC, + &tfd); + if (rc) + return(rc); + } + return fd_close(tfd); +} + +cmd_fwrite(argc, argv) + char **argv; +{ + if (strlen(argv[1]) >= TMFFS_STRING_SIZE) { + fprintf(stderr, + "error: pathname arg exceeds string length limit\n"); + return(ERROR_USAGE); + } + if (!strcmp(argv[2], "ascii")) + return do_short_fwrite(argv[1], argv[3], strlen(argv[3])); + else if (!strcmp(argv[2], "hex")) + return fwrite_hex_string(argv[1], argv[3]); + else if (!strcmp(argv[2], "file")) + return fwrite_from_file(argv[1], argv[3]); + else { + fprintf(stderr, +"error: middle argument to fwrite cmd must be \"ascii\", \"hex\" or \"file\"\n" + ); + return(ERROR_USAGE); + } +}