move unyaffs into external/yaffs2
This commit is contained in:
		| @@ -10,21 +10,3 @@ ADDITIONAL_RECOVERY_EXECUTABLES += recovery_nandroid | ||||
| include $(BUILD_PREBUILT) | ||||
|  | ||||
| include $(CLEAR_VARS) | ||||
| LOCAL_MODULE := recovery_unyaffs | ||||
| LOCAL_MODULE_STEM := unyaffs | ||||
| LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES | ||||
| LOCAL_MODULE_TAGS := eng | ||||
| LOCAL_FORCE_STATIC_EXECUTABLE := true | ||||
| LOCAL_SRC_FILES := unyaffs.c | ||||
| LOCAL_STATIC_LIBRARIES := libc libcutils | ||||
| LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin | ||||
| ADDITIONAL_RECOVERY_EXECUTABLES += recovery_unyaffs | ||||
| include $(BUILD_EXECUTABLE) | ||||
|  | ||||
| include $(CLEAR_VARS) | ||||
| LOCAL_MODULE := unyaffs | ||||
| LOCAL_SRC_FILES := unyaffs.c | ||||
| LOCAL_MODULE_TAGS := eng | ||||
| include $(BUILD_EXECUTABLE) | ||||
|  | ||||
| include $(CLEAR_VARS) | ||||
|   | ||||
| @@ -1,118 +0,0 @@ | ||||
| /* | ||||
|  * unyaffs: extract files from yaffs2 file system image to current directory | ||||
|  * | ||||
|  * Created by Kai Wei <kai.wei.cn@gmail.com> | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License version 2 as | ||||
|  * published by the Free Software Foundation. | ||||
|  */ | ||||
|  | ||||
| #include <sys/types.h> | ||||
| #include <sys/stat.h> | ||||
| #include <fcntl.h> | ||||
| #include <unistd.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include "unyaffs.h" | ||||
|  | ||||
| #define CHUNK_SIZE 2048 | ||||
| #define SPARE_SIZE 64 | ||||
| #define MAX_OBJECTS 10000 | ||||
| #define YAFFS_OBJECTID_ROOT     1 | ||||
|  | ||||
|  | ||||
| unsigned char data[CHUNK_SIZE + SPARE_SIZE]; | ||||
| unsigned char *chunk_data = data; | ||||
| unsigned char *spare_data = data + CHUNK_SIZE; | ||||
| int img_file; | ||||
|  | ||||
| char *obj_list[MAX_OBJECTS]; | ||||
| void process_chunk() | ||||
| { | ||||
| 	int out_file, remain, s; | ||||
| 	char *full_path_name; | ||||
|  | ||||
| 	yaffs_PackedTags2 *pt = (yaffs_PackedTags2 *)spare_data; | ||||
| 	if (pt->t.byteCount == 0xffff)  {	//a new object  | ||||
|  | ||||
| 		yaffs_ObjectHeader *oh = (yaffs_ObjectHeader *)malloc(sizeof(yaffs_ObjectHeader)); | ||||
| 		memcpy(oh, chunk_data, sizeof(yaffs_ObjectHeader)); | ||||
|  | ||||
| 		full_path_name = (char *)malloc(strlen(oh->name) + strlen(obj_list[oh->parentObjectId]) + 2); | ||||
| 		if (full_path_name == NULL) { | ||||
| 			perror("malloc full path name\n"); | ||||
| 		} | ||||
| 		strcpy(full_path_name, obj_list[oh->parentObjectId]); | ||||
| 		strcat(full_path_name, "/"); | ||||
| 		strcat(full_path_name, oh->name); | ||||
| 		obj_list[pt->t.objectId] = full_path_name; | ||||
|  | ||||
| 		switch(oh->type) { | ||||
| 			case YAFFS_OBJECT_TYPE_FILE: | ||||
| 				remain = oh->fileSize; | ||||
| 				out_file = creat(full_path_name, oh->yst_mode); | ||||
| 				while(remain > 0) { | ||||
| 					if (read_chunk()) | ||||
| 						return -1; | ||||
| 					s = (remain < pt->t.byteCount) ? remain : pt->t.byteCount;	 | ||||
| 					if (write(out_file, chunk_data, s) == -1) | ||||
| 						return -1; | ||||
| 					remain -= s; | ||||
| 				} | ||||
| 				close(out_file); | ||||
| 				break; | ||||
| 			case YAFFS_OBJECT_TYPE_SYMLINK: | ||||
| 				symlink(oh->alias, full_path_name); | ||||
| 				break; | ||||
| 			case YAFFS_OBJECT_TYPE_DIRECTORY: | ||||
| 				mkdir(full_path_name, 0777); | ||||
| 				break; | ||||
| 			case YAFFS_OBJECT_TYPE_HARDLINK: | ||||
| 				link(obj_list[oh->equivalentObjectId], full_path_name); | ||||
| 				break; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| int read_chunk() | ||||
| { | ||||
| 	ssize_t s; | ||||
| 	int ret = -1; | ||||
| 	memset(chunk_data, 0xff, sizeof(chunk_data)); | ||||
| 	s = read(img_file, data, CHUNK_SIZE + SPARE_SIZE); | ||||
| 	if (s == -1) { | ||||
| 		perror("read image file\n"); | ||||
| 	} else if (s == 0) { | ||||
| 		printf("end of image\n"); | ||||
| 	} else if ((s == (CHUNK_SIZE + SPARE_SIZE))) { | ||||
| 		ret = 0; | ||||
| 	} else { | ||||
| 		fprintf(stderr, "broken image file\n"); | ||||
| 	} | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
| 	if (argc != 2) { | ||||
| 		printf("Usage: unyaffs image_file_name\n"); | ||||
| 		exit(1); | ||||
| 	} | ||||
| 	img_file = open(argv[1], O_RDONLY); | ||||
| 	if (img_file == -1) { | ||||
| 		printf("open image file failed\n"); | ||||
| 		exit(1); | ||||
| 	} | ||||
|  | ||||
| 	obj_list[YAFFS_OBJECTID_ROOT] = "."; | ||||
| 	while(1) { | ||||
| 		if (read_chunk() == -1) | ||||
| 			break; | ||||
| 		process_chunk(); | ||||
| 	} | ||||
| 	close(img_file); | ||||
| 	return 0; | ||||
| } | ||||
| @@ -1,144 +0,0 @@ | ||||
| /* | ||||
|  * definition copied from yaffs project | ||||
|  */ | ||||
|  | ||||
| #ifndef __UNYAFFS_H__ | ||||
| #define __UNYAFFS_H__ | ||||
|  | ||||
|  | ||||
| #define YAFFS_MAX_NAME_LENGTH       255 | ||||
| #define YAFFS_MAX_ALIAS_LENGTH      159 | ||||
|  | ||||
| #include <sys/types.h> | ||||
|  | ||||
| /* Definition of types */ | ||||
| #ifndef __ASM_ARM_TYPES_H | ||||
| typedef unsigned char __u8; | ||||
| typedef unsigned short __u16; | ||||
| typedef unsigned __u32; | ||||
| #endif  | ||||
| typedef struct { | ||||
|     unsigned sequenceNumber; | ||||
|     unsigned objectId; | ||||
|     unsigned chunkId; | ||||
|     unsigned byteCount; | ||||
| } yaffs_PackedTags2TagsPart; | ||||
|  | ||||
| typedef struct { | ||||
|     unsigned char colParity; | ||||
|     unsigned lineParity; | ||||
|     unsigned lineParityPrime;  | ||||
| } yaffs_ECCOther; | ||||
|  | ||||
| typedef struct { | ||||
|     yaffs_PackedTags2TagsPart t; | ||||
|     yaffs_ECCOther ecc; | ||||
| } yaffs_PackedTags2; | ||||
|  | ||||
| typedef enum { | ||||
|     YAFFS_ECC_RESULT_UNKNOWN, | ||||
|     YAFFS_ECC_RESULT_NO_ERROR, | ||||
|     YAFFS_ECC_RESULT_FIXED, | ||||
|     YAFFS_ECC_RESULT_UNFIXED | ||||
| } yaffs_ECCResult; | ||||
|  | ||||
| typedef enum { | ||||
|     YAFFS_OBJECT_TYPE_UNKNOWN, | ||||
|     YAFFS_OBJECT_TYPE_FILE, | ||||
|     YAFFS_OBJECT_TYPE_SYMLINK, | ||||
|     YAFFS_OBJECT_TYPE_DIRECTORY, | ||||
|     YAFFS_OBJECT_TYPE_HARDLINK, | ||||
|     YAFFS_OBJECT_TYPE_SPECIAL | ||||
| } yaffs_ObjectType; | ||||
|  | ||||
|  | ||||
| typedef struct { | ||||
|  | ||||
|     unsigned validMarker0; | ||||
|     unsigned chunkUsed; /*  Status of the chunk: used or unused */ | ||||
|     unsigned objectId;  /* If 0 then this is not part of an object (unused) */ | ||||
|     unsigned chunkId;   /* If 0 then this is a header, else a data chunk */ | ||||
|     unsigned byteCount; /* Only valid for data chunks */ | ||||
|  | ||||
|     /* The following stuff only has meaning when we read */ | ||||
|     yaffs_ECCResult eccResult; | ||||
|     unsigned blockBad; | ||||
|  | ||||
|     /* YAFFS 1 stuff */ | ||||
|     unsigned chunkDeleted;  /* The chunk is marked deleted */ | ||||
|     unsigned serialNumber;  /* Yaffs1 2-bit serial number */ | ||||
|  | ||||
|     /* YAFFS2 stuff */ | ||||
|     unsigned sequenceNumber;    /* The sequence number of this block */ | ||||
|  | ||||
|     /* Extra info if this is an object header (YAFFS2 only) */ | ||||
|  | ||||
|     unsigned extraHeaderInfoAvailable;  /* There is extra info available if this is not zero */ | ||||
|     unsigned extraParentObjectId;   /* The parent object */ | ||||
|     unsigned extraIsShrinkHeader;   /* Is it a shrink header? */ | ||||
|     unsigned extraShadows;      /* Does this shadow another object? */ | ||||
|  | ||||
|     yaffs_ObjectType extraObjectType;   /* What object type? */ | ||||
|  | ||||
|     unsigned extraFileLength;       /* Length if it is a file */ | ||||
|     unsigned extraEquivalentObjectId;   /* Equivalent object Id if it is a hard link */ | ||||
|  | ||||
|     unsigned validMarker1; | ||||
|  | ||||
| } yaffs_ExtendedTags; | ||||
|  | ||||
| /* -------------------------- Object structure -------------------------------*/ | ||||
| /* This is the object structure as stored on NAND */ | ||||
|  | ||||
| typedef struct { | ||||
|     yaffs_ObjectType type; | ||||
|  | ||||
|     /* Apply to everything  */ | ||||
|     int parentObjectId; | ||||
| 	__u16 sum__NoLongerUsed;        /* checksum of name. No longer used */ | ||||
| 	char name[YAFFS_MAX_NAME_LENGTH + 1]; | ||||
|  | ||||
| 	/* The following apply to directories, files, symlinks - not hard links */ | ||||
| 	__u32 yst_mode;         /* protection */ | ||||
|  | ||||
| #ifdef CONFIG_YAFFS_WINCE | ||||
|     __u32 notForWinCE[5]; | ||||
| #else | ||||
|     __u32 yst_uid; | ||||
|     __u32 yst_gid; | ||||
|     __u32 yst_atime; | ||||
|     __u32 yst_mtime; | ||||
|     __u32 yst_ctime; | ||||
| #endif | ||||
|  | ||||
|     /* File size  applies to files only */ | ||||
|     int fileSize; | ||||
|  | ||||
|     /* Equivalent object id applies to hard links only. */ | ||||
|     int equivalentObjectId; | ||||
|  | ||||
|     /* Alias is for symlinks only. */ | ||||
|     char alias[YAFFS_MAX_ALIAS_LENGTH + 1]; | ||||
|  | ||||
|     __u32 yst_rdev;     /* device stuff for block and char devices (major/min) */ | ||||
|  | ||||
| #ifdef CONFIG_YAFFS_WINCE | ||||
|     __u32 win_ctime[2]; | ||||
|     __u32 win_atime[2]; | ||||
|     __u32 win_mtime[2]; | ||||
| #else | ||||
|     __u32 roomToGrow[6]; | ||||
|  | ||||
| #endif | ||||
|     __u32 inbandShadowsObject; | ||||
|     __u32 inbandIsShrink; | ||||
|  | ||||
|     __u32 reservedSpace[2]; | ||||
|     int shadowsObject;  /* This object header shadows the specified object if > 0 */ | ||||
|  | ||||
|     /* isShrink applies to object headers written when we shrink the file (ie resize) */ | ||||
|     __u32 isShrink; | ||||
|  | ||||
| } yaffs_ObjectHeader; | ||||
|  | ||||
| #endif | ||||
		Reference in New Issue
	
	Block a user