/** cat <file> [<offset>] [<size>] */ static int cmd_cat(int argc, char *argv[]) { int fd; const char *name = NULL; char buf[100]; int start = 0, size = 0, printed = 0, n, len; int ret = -1; CHK_ARGC(2, 4); name = argv[1]; if ((fd = uffs_open(name, UO_RDONLY)) < 0) { MSGLN("Can't open %s", name); goto fail; } if (argc > 2) { start = strtol(argv[2], NULL, 10); if (argc > 3) size = strtol(argv[3], NULL, 10); } if (start >= 0) uffs_seek(fd, start, USEEK_SET); else uffs_seek(fd, -start, USEEK_END); while (uffs_eof(fd) == 0) { len = uffs_read(fd, buf, sizeof(buf) - 1); if (len == 0) break; if (len > 0) { if (size == 0 || printed < size) { n = (size == 0 ? len : (size - printed > len ? len : size - printed)); buf[n] = 0; MSG("%s", buf); printed += n; } else { break; } } } MSG(TENDSTR); uffs_close(fd); ret = 0; fail: return ret; }
static URET test_verify_file(const char *file_name, UBOOL noecc) { int fd; int ret = U_FAIL; unsigned char buf[100]; int i, pos, len; u8 x; if ((fd = uffs_open(file_name, (noecc ? UO_RDONLY|UO_NOECC : UO_RDONLY))) < 0) { MSGLN("Can't open file %s for read.", file_name); goto test_exit; } pos = 0; while (!uffs_eof(fd)) { len = uffs_read(fd, buf, sizeof(buf)); if (len <= 0) goto test_failed; for (i = 0; i < len; i++) { x = (SEQ_INIT + pos + i) % SEQ_MOD_LEN; if (buf[i] != x) { MSGLN("Verify file %s failed at: %d, expect 0x%02x but got 0x%02x", file_name, pos + i, x, buf[i]); goto test_failed; } } pos += len; } if (pos != uffs_seek(fd, 0, USEEK_END)) { MSGLN("Verify file %s failed. invalid file length.", file_name); goto test_failed; } MSGLN("Verify file %s succ.", file_name); ret = U_SUCC; test_failed: uffs_close(fd); test_exit: return ret; }
static URET test_verify_file(const char *file_name) { int fd; int ret = U_FAIL; unsigned char buf[100]; int i, pos, len; if ((fd = uffs_open(file_name, UO_RDONLY)) < 0) { MSGLN("Can't open file %s for read.", file_name); goto test_exit; } pos = 0; while (!uffs_eof(fd)) { len = uffs_read(fd, buf, sizeof(buf)); if (len <= 0) goto test_failed; for (i = 0; i < len; i++) { if (buf[i] != (pos++ & 0xFF)) { pos--; MSGLN("Verify file %s failed at: %d, expect %x but got %x", file_name, pos, pos & 0xFF, buf[i]); goto test_failed; } } } if (pos != uffs_seek(fd, 0, USEEK_END)) { MSGLN("Verify file %s failed. invalid file length.", file_name); goto test_failed; } MSGLN("Verify file %s succ.", file_name); ret = U_SUCC; test_failed: uffs_close(fd); test_exit: return ret; }
/** cp <src> <des> */ static int cmd_cp(int argc, char *argv[]) { const char *src; const char *des; char buf[100]; int fd1 = -1, fd2 = -1; int len; BOOL src_local = FALSE, des_local = FALSE; FILE *fp1 = NULL, *fp2 = NULL; int ret = -1; CHK_ARGC(3, 3); src = argv[1]; des = argv[2]; if (memcmp(src, "::", 2) == 0) { src += 2; src_local = TRUE; } if (memcmp(des, "::", 2) == 0) { des += 2; des_local = TRUE; } if (src_local) { if ((fp1 = fopen(src, "rb")) == NULL) { MSGLN("Can't open %s for copy.", src); goto fail_ext; } } else { if ((fd1 = uffs_open(src, UO_RDONLY)) < 0) { MSGLN("Can't open %s for copy.", src); goto fail_ext; } } if (des_local) { if ((fp2 = fopen(des, "wb")) == NULL) { MSGLN("Can't open %s for copy.", des); goto fail_ext; } } else { if ((fd2 = uffs_open(des, UO_RDWR|UO_CREATE|UO_TRUNC)) < 0) { MSGLN("Can't open %s for copy.", des); goto fail_ext; } } ret = 0; while ( (src_local ? (feof(fp1) == 0) : (uffs_eof(fd1) == 0)) ) { ret = -1; if (src_local) { len = fread(buf, 1, sizeof(buf), fp1); } else { len = uffs_read(fd1, buf, sizeof(buf)); } if (len == 0) { ret = -1; break; } if (len < 0) { MSGLN("read file %s fail ?", src); break; } if (des_local) { if ((int)fwrite(buf, 1, len, fp2) != len) { MSGLN("write file %s fail ? ", des); break; } } else { if (uffs_write(fd2, buf, len) != len) { MSGLN("write file %s fail ? ", des); break; } } ret = 0; } fail_ext: if (fd1 > 0) uffs_close(fd1); if (fd2 > 0) uffs_close(fd2); if (fp1) fclose(fp1); if (fp2) fclose(fp2); return ret; }
//uffs拷贝函数,参数之间加空格 //需要从elm拷贝到uffs时(跨文件系统),参数名称前加:: //例如uffs_copy("::/01.hdc /dir1/01.hdc") //上例从SD卡拷贝一个文件01.hdc到flash中, //也可用dfs的函数,那样就不用考虑是否跨文件系统了. int uffs_copy(const char *tail) { const char *src; const char *des; char buf[100]; int fd1=-1, fd2=-1; int len; int src_local = FALSE, des_local = FALSE; int fd3=-1, fd4=-1; if(!tail) return FALSE; src = cli_getparam(tail, &des); if(!des) return FALSE; if(memcmp(src, "::", 2) == 0) { src += 2; src_local = TRUE; } if(memcmp(des, "::", 2) == 0) { des += 2; des_local = TRUE; } if(src_local) { //if((fp1 = fopen(src, "rb")) == NULL) if((fd3 = open(src,O_RDONLY,0)) < 0) { uffs_Perror(UFFS_ERR_NORMAL, "Can't open %s for copy.", src); goto fail_ext; } } else { if((fd1 = uffs_open(src, UO_RDONLY)) < 0) { uffs_Perror(UFFS_ERR_NORMAL, "Can't open %s for copy.", src); goto fail_ext; } } if(des_local) { if((fd4 = open(des,O_WRONLY | O_CREAT,0)) < 0) { uffs_Perror(UFFS_ERR_NORMAL, "Can't open %s for copy.", des); goto fail_ext; } } else { if((fd2 = uffs_open(des, UO_RDWR|UO_CREATE|UO_TRUNC)) < 0) { uffs_Perror(UFFS_ERR_NORMAL, "Can't open %s for copy.", des); goto fail_ext; } } uffs_Perror(UFFS_ERR_NORMAL, "copy %s to %s... ",src,des); while((src_local ? (1) : (uffs_eof(fd1) == 0))) { if(src_local) { len = read(fd3, buf, sizeof(buf)); } else { len = uffs_read(fd1, buf, sizeof(buf)); } if(len == 0) break; if(len < 0) { uffs_Perror(UFFS_ERR_NORMAL, "read file %s fail!", src); break; } if(des_local) { if(write(fd4, buf, len) != len) { uffs_Perror(UFFS_ERR_NORMAL, "write file %s fail!", des); break; } } else { if(uffs_write(fd2, buf, len) != len) { uffs_Perror(UFFS_ERR_NORMAL, "write file %s fail ?", des); break; } } } uffs_Perror(UFFS_ERR_NORMAL, "succ."); fail_ext: if(fd1 > 0) uffs_close(fd1); if(fd2 > 0) uffs_close(fd2); if(fd3 > 0) close(fd3); if(fd4 > 0) close(fd4); return TRUE; }