view 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 source

/*
 * 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);
}