diff rvinterf/etmsync/fsread.c @ 288:e33d71e9033f

fc-fsio: cpout directory recursion implemented
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Fri, 28 Feb 2014 08:46:14 +0000
parents 211b35db427c
children 3dd74b16df82
line wrap: on
line diff
--- a/rvinterf/etmsync/fsread.c	Fri Feb 28 08:22:50 2014 +0000
+++ b/rvinterf/etmsync/fsread.c	Fri Feb 28 08:46:14 2014 +0000
@@ -3,10 +3,13 @@
  */
 
 #include <sys/types.h>
+#include <sys/param.h>
+#include <sys/stat.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <strings.h>
+#include <unistd.h>
 #include "etm.h"
 #include "ffs.h"
 #include "tmffs2.h"
@@ -147,8 +150,7 @@
 	case OT_FILE:
 		return cpout_file(ffspath, &stat, hostpath);
 	case OT_DIR:
-		printf("cpout dir handling not yet implemented\n");
-		return(ERROR_BUG);
+		return cpout_dir(ffspath, hostpath);
 	case OT_LINK:
 		printf("skipping FFS symlink %s\n", ffspath);
 		return(0);
@@ -192,6 +194,71 @@
 	return fd_close(tfd);
 }
 
+host_mkdir(pathname)
+	char *pathname;
+{
+	int rc;
+	struct stat st;
+
+	rc = stat(pathname, &st);
+	if (rc < 0) {
+		rc = mkdir(pathname, 0777);
+		if (rc < 0) {
+			perror(pathname);
+			return(ERROR_UNIX);
+		}
+		return(0);
+	} else {
+		if (S_ISDIR(st.st_mode))
+			return(0);
+		else {
+			fprintf(stderr,
+			"error: %s already exists and is not a directory\n",
+				pathname);
+			return(ERROR_UNIX);
+		}
+	}
+}
+
+cpout_dir(ffspath_dir, hostpath_dir)
+	char *ffspath_dir, *hostpath_dir;
+{
+	u_char rdstate[4];
+	char rdbuf[TMFFS_STRING_SIZE], ffspath_child[TMFFS_STRING_SIZE*2];
+	char hostpath_child[MAXPATHLEN];
+	int nument, i, rc;
+
+	printf("dir %s\n", ffspath_dir);
+	rc = host_mkdir(hostpath_dir);
+	if (rc)
+		return(rc);
+	rc = do_opendir(ffspath_dir, rdstate, &nument);
+	if (rc)
+		return(rc);
+	for (i = 0; i < nument; i++) {
+		rc = do_readdir(rdstate, rdbuf);
+		if (rc)
+			return(rc);
+		mk_ffs_child_path_from_readdir(ffspath_dir, rdbuf,
+						ffspath_child);
+		if (rdbuf[0] == '.') {
+			printf("skipping %s\n", ffspath_child);
+			return(0);
+		}
+		if (strlen(hostpath_dir) + strlen(rdbuf) + 2 >
+		    sizeof hostpath_child) {
+			fprintf(stderr,
+				"error: host side pathname buffer overflow\n");
+			return(ERROR_UNIX);
+		}
+		sprintf(hostpath_child, "%s/%s", hostpath_dir, rdbuf);
+		rc = cpout_object(ffspath_child, hostpath_child);
+		if (rc)
+			return(rc);
+	}
+	return(0);
+}
+
 cmd_cpout(argc, argv)
 	char **argv;
 {