FreeCalypso > hg > freecalypso-sw
changeset 283:88eed3327682
fc-fsio: ll command implemented
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Fri, 28 Feb 2014 04:54:47 +0000 |
parents | 517e8a428fde |
children | 7b4d4e3e610a |
files | rvinterf/etmsync/Makefile rvinterf/etmsync/fscmdtab.c rvinterf/etmsync/fsread.c |
diffstat | 3 files changed, 96 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/rvinterf/etmsync/Makefile Tue Feb 25 07:42:21 2014 +0000 +++ b/rvinterf/etmsync/Makefile Fri Feb 28 04:54:47 2014 +0000 @@ -3,8 +3,8 @@ PROGS= fc-fsio INSTBIN=/usr/local/bin -FSIO_OBJS= connect.o dispatch.o fsbasics.o fscmdtab.o fsiomain.o interf.o \ - launchrvif.o +FSIO_OBJS= connect.o dispatch.o fsbasics.o fscmdtab.o fsiomain.o fsread.o \ + interf.o launchrvif.o all: ${PROGS}
--- a/rvinterf/etmsync/fscmdtab.c Tue Feb 25 07:42:21 2014 +0000 +++ b/rvinterf/etmsync/fscmdtab.c Fri Feb 28 04:54:47 2014 +0000 @@ -7,6 +7,7 @@ extern int cmd_exec(); extern int cmd_exit(); extern int cmd_ffs2ver(); +extern int cmd_ll(); extern int cmd_ls(); extern int cmd_stat(); @@ -14,6 +15,7 @@ {"exec", 1, 1, cmd_exec}, {"exit", 0, 0, cmd_exit}, {"ffs2ver", 0, 0, cmd_ffs2ver}, + {"ll", 1, 1, cmd_ll}, {"ls", 1, 1, cmd_ls}, {"stat", 1, 1, cmd_stat}, {0, 0, 0, 0}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/etmsync/fsread.c Fri Feb 28 04:54:47 2014 +0000 @@ -0,0 +1,92 @@ +/* + * Commands for reading the content of a GSM device's file system + */ + +#include <sys/types.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include "etm.h" +#include "ffs.h" +#include "tmffs2.h" +#include "limits.h" +#include "localtypes.h" +#include "localstruct.h" +#include "exitcodes.h" + +void +ll_print_line(pathname, stat) + char *pathname; + struct stat_info *stat; +{ + char readonly; + + if (stat->flags & OF_READONLY) + readonly = 'r'; + else + readonly = ' '; + switch (stat->type) { + case OT_FILE: + printf("f%c %7u %s\n", readonly, stat->size, pathname); + return; + case OT_DIR: + printf("d%c %s\n", readonly, pathname); + return; + case OT_LINK: + printf("l%c %s\n", readonly, pathname); + return; + default: + printf("?%c %s\n", readonly, pathname); + } +} + +void +mk_ffs_child_path_from_readdir(dirpath, rdname, buf) + char *dirpath, *rdname, *buf; +{ + char *tailp; + + tailp = index(dirpath, '\0') - 1; + if (*tailp == '/') + sprintf(buf, "%s%s", dirpath, rdname); + else + sprintf(buf, "%s/%s", dirpath, rdname); +} + +cmd_ll(argc, argv) + char **argv; +{ + struct stat_info stat; + u_char rdstate[4]; + char rdbuf[TMFFS_STRING_SIZE], childpath[TMFFS_STRING_SIZE*2]; + int nument, i, rc; + + rc = do_xlstat(argv[1], &stat); + if (rc) + return(rc); + if (stat.type != OT_DIR) { + ll_print_line(argv[1], &stat); + return(0); + } + rc = do_opendir(argv[1], rdstate, &nument); + if (rc) + return(rc); + if (!nument) { + printf("<empty dir>\n"); + return(0); + } + for (i = 0; i < nument; i++) { + rc = do_readdir(rdstate, rdbuf); + if (rc) + return(rc); + mk_ffs_child_path_from_readdir(argv[1], rdbuf, childpath); + rc = do_xlstat(childpath, &stat); + if (rc) { + printf("xlstat failed on %s\n", childpath); + return(rc); + } + ll_print_line(childpath, &stat); + } + return(0); +}