FreeCalypso > hg > freecalypso-sw
diff rvinterf/etmsync/fsread.c @ 283:88eed3327682
fc-fsio: ll command implemented
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Fri, 28 Feb 2014 04:54:47 +0000 |
parents | |
children | 7b4d4e3e610a |
line wrap: on
line diff
--- /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); +}