From: Timothy Manning Date: Fri, 15 Oct 2010 00:07:34 +0000 (+1300) Subject: yaffs Yaffs importer now works with hardlinks and symlink. X-Git-Tag: linux-mainline-rc-01~8^2~10 X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=commitdiff_plain;h=72762a62dab91fa7971e8d6ed2f00c5245ae464b;hp=3f1998726fc46fc97fa242981e7de7181b46fd8c yaffs Yaffs importer now works with hardlinks and symlink. Signed-off-by: Timothy Manning --- diff --git a/direct/python/yaffs_importer.py b/direct/python/yaffs_importer.py new file mode 100644 index 0000000..3444851 --- /dev/null +++ b/direct/python/yaffs_importer.py @@ -0,0 +1,266 @@ +import os +from yaffsfs import * +import sys + +yaffs_StartUp() +yaffs_mount("/yaffs2/") +absolute_path = os.path.abspath(os.path.curdir) +print "absolute path:", absolute_path + +dir_in_snapshot=[] +files_in_snapshot=[] +symlinks_in_snapshot=[] +unknown_in_snapshot=[] +is_mount_in_snapshot=[] + +def join_paths(path1, path2): + new_path=path1 + if path1[len(path1)-1]=="/"and path2[0]=="/": + new_path+=path2[1:] + elif path1[len(path1)-1]!="/"and path2[0]!="/": + new_path+="/" + new_path+=path2 + else: + new_path+=path2 + return new_path + +def subtract_paths(path1, path2): + if len(path1)>len(path2): + ##if the two paths are diretly subtractable + if path1[0:len (path2)-1]==path2: + new_path=path1[len(path2):] + elif path1[1:len (path2)-1]==path2: + new_path=path1[len(path2)+1:] + elif path1[1:len (path2)]==path2[1:]: + new_path=path1[len(path2)-1:] + else : + print "paths do not match:", path1, " ", path2 + return 0 + return new_path + else : + print "cannot subtract path2(:", path2, ") from path1(", path1, ")because path 2 is too long" + return 0 + + +def create_file(file): + print "\n \n \n" + file_path="/yaffs2/"+file["path"][len(path):] + print "creating file:", file_path + print "mode", file["mode"] + current_handle=yaffs_open(file_path, yaffs_O_CREAT | yaffs_O_TRUNC| yaffs_O_RDWR, file["mode"]) + data_file=open(file["path"], "r") + yaffs_lseek(current_handle, 0, 0) + data_to_be_written= data_file.read() + + + #print "data to be saved", data_to_be_written + length_of_file=len(data_to_be_written) + print "length of data to be written",length_of_file + output=yaffs_write(current_handle,data_to_be_written , length_of_file) + print "writing file:", output + yaffs_ftruncate(current_handle, length_of_file) + + output=yaffs_close(current_handle) + print "created a file", file["path"][len(path):], " ", output + + if output==-1: + print "ran out of space exiting" + return 0 + + +def remove_file_from_path(path): + slash_id=[] + for i in range(0, len(path)): + if path[i]=="/": + slash_id.append(i) + new_path=path[:slash_id[len(slash_id)-1]] + print "removed file from path", new_path + return new_path +def is_dir_hidden(dir): + """this code tests if a directory is hidden (has a ./ format) and returns true if it is hidden""" + slash_id=[] + for i in range(0, len(dir)): + if dir[i]=="/": + slash_id.append(i) + + if dir[slash_id[len(slash_id)-1]+1]==".": + return True + else : + return False + +def scan_dir(path): + """this function scans all of the files and directories in a directory. The function then calls its self on any of the directories that it found. this causes it to build up a tree of all the files and directories """ + global files_in_snapshot + global symlinks_in_snapshot + global search_hidden_directories + dir_in_current_dir=[] + if os.path.exists(path)==False: + print "error#############################" + print "path:", path, " doesnot exist" + return 0 + dir_snapshot=os.listdir(path) + for i in range(0, len(dir_snapshot)): + #print os.path.isdir(dir_snapshot[i]) + #print os.path.isfile(dir_snapshot[i]) + #print os.path.islink(dir_snapshot[i]) + current_snapshot=os.path.join(path, dir_snapshot[i]) + #print "current snapshot:", current_snapshot + isDir=os.path.isdir(current_snapshot) + isFile=os.path.isfile(current_snapshot) + isLink=os.path.islink(current_snapshot) + isMount=os.path.ismount(current_snapshot) + #print dir_snapshot[i] + + stat=os.lstat(current_snapshot) + + ##note the order of these if and elif statemens is importaint since a file can be symbloic link and a file + if isDir: + if search_hidden_directories==True or is_dir_hidden(current_snapshot) ==False : +# st_mode ##mode of the folder read/write ect + dir_in_snapshot.append({"path":current_snapshot, "mode":stat.st_mode}) + dir_in_current_dir.append(current_snapshot) + else : + print "file is hidden so it is ingored", current_snapshot + elif isLink: +# print "symlink:", current_snapshot +# print "inode", stat.st_ino +# print "symbloic link", stat.s_iflnk +# print "mode", stat.st_mode + ##for some reason the os.readlink only gives the target link realative to the directory which the symbloic link is in. change this into a absolute path + x=current_snapshot + x=remove_file_from_path(x) + print "removed file from path" + target=join_paths(x,os.readlink(current_snapshot) ) + symlinks_in_snapshot.append({"path":current_snapshot, "target":target}) + elif isFile: + +# stat.st_ino ##inode number +# st_nlink ##number of hard links to this file +# st_size ##size of file + files_in_snapshot.append({"path":current_snapshot, "inode": stat.st_ino, "size":stat.st_size, "num_of_hardlinks":stat.st_nlink, "mode":stat.st_mode}) + + elif isMount: + is_mount_in_snapshot.append(current_snapshot) + else: + unknown_in_snapshot.append(current_snapshot) + + for i in range(0, len(dir_in_current_dir)): + scan_dir(dir_in_current_dir[i]) + +def print_scanned_dir_list(): + global files_in_snapshot + global symlinks_in_snapshot + print "scanned dir" + + + for i in range(0, len(files_in_snapshot)): + if files_in_snapshot[i]["num_of_hardlinks"]>1: + print "inode",files_in_snapshot[i]["inode"],"size",files_in_snapshot[i]["size"],"path:", files_in_snapshot[i]["path"], " num of hard links", files_in_snapshot[i]["num_of_hardlinks"] + + else : + print "inode",files_in_snapshot[i]["inode"],"size",files_in_snapshot[i]["size"],"path:", files_in_snapshot[i]["path"] +# current_open_file=open(files_in_snapshot[i], "r") +# #current_open_file.f.read(3) +# lines_in_file=current_open_file.readlines() +# #use for loop to write code into yaffs file +# print "number of line of code:", len(lines_in_file) +# print current_open_file + for i in range(0, len(symlinks_in_snapshot)): + print "symlinks in snapshot:", symlinks_in_snapshot[i] + for i in range(0, len(dir_in_snapshot)): + print "directories in snapshot:", dir_in_snapshot[i] + for i in range(0, len(unknown_in_snapshot)): + print "unknown objects in snapshot:", unknown_in_snapshot[i] + +def copy_scanned_files_into_yaffs(): + global files_in_snapshot + global symlinks_in_snapshot + global path +#########################################copy directories into yaffs + print"making directories in yaffs" + for i in range(0, len(dir_in_snapshot)): + path2=dir_in_snapshot[i]["path"][len(path):] + print"path2", path2 + dir_path="/yaffs2"+path2 + output=yaffs_mkdir(dir_path,dir_in_snapshot[i]["mode"] ) + print"copied", dir_path, " output", output + print "mode" ,dir_in_snapshot[i]["mode"] + + + +#########################################coyp file into yaffs + print "copying scanned files into yaffs" + list=[] + inode_blacklist=[] + break_flag=0 + print "file in snapshot##############" + for a in range(0, len(files_in_snapshot)): + print files_in_snapshot[a] + print "\n\n\n" + for i in range(0, len(files_in_snapshot)): + list=[] + if files_in_snapshot[i]["num_of_hardlinks"]>1 and files_in_snapshot[i]["inode"] not in inode_blacklist : + print "found a hard link" + print "inode",files_in_snapshot[i]["inode"],"size",files_in_snapshot[i]["size"],"path:", files_in_snapshot[i]["path"], " num of hard links", files_in_snapshot[i]["num_of_hardlinks"] + for a in range(0, len(files_in_snapshot) ) : + if files_in_snapshot[a]["inode"] ==files_in_snapshot[i]["inode"] : + ##and os.path.isfile(files_in_snapshot[i]) + print "found this file which matches inode",files_in_snapshot[a] + list.append(files_in_snapshot[a]) + print "length of list", len(list) + if len(list)==files_in_snapshot[i]["num_of_hardlinks"]: + print "trying to break" + break_flag=1 + break + for a in range(0, len(list)): + print list[a] + ##add inode to blacklist. all of the indoes in the list should be the same. + inode_blacklist.append(list[0]["inode"]) + ##create a file from the first hardlink. + create_file(list[0]) + target_path="/yaffs2/"+list[0]["path"][len(path):] + for i in range(1, len(list)): + print "target path", target_path + hardlink_path="/yaffs2/"+list[i]["path"][len(path):] + print "hardlink path", hardlink_path + output=yaffs_link(target_path,hardlink_path) + print"creating hardlink:", list[i]["path"], "output:", output + elif files_in_snapshot[i]["inode"] not in inode_blacklist : + create_file(files_in_snapshot[i]) + + +############################copy symlinks into yaffs + + for i in range(0, len(symlinks_in_snapshot)): + print "symlinks in snapshot:", symlinks_in_snapshot[i] + target_path=join_paths("/yaffs2/", subtract_paths(symlinks_in_snapshot[i]["target"], path)) + new_path=join_paths("/yaffs2/", subtract_paths(symlinks_in_snapshot[i]["path"], path)) + output=yaffs_symlink(target_path, new_path) + print "created symlink",new_path , " > ", target_path, " output:", output + ##yaffs_symlink(const YCHAR *oldpath, const YCHAR *newpath); + + + for i in range(0, len(dir_in_snapshot)): + print "directories in snapshot:", dir_in_snapshot[i] + for i in range(0, len(unknown_in_snapshot)): + print "unknown objects in snapshot:", unknown_in_snapshot[i] + +if __name__=="__main__": + print sys.argv + path=sys.argv[1] +# +# +# path="/home/timothy/work/yaffs/git/yaffs2" +# path="/home/timothy/my_stuff/old_laptop/timothy/programming_lejos/" + + + x="n" + if x=="y" or x=="yes": + search_hidden_directories=True + else : + search_hidden_directories=False + scan_dir(path) + copy_scanned_files_into_yaffs() + #print_scanned_dir_list() + + print"unmounting yaffs:", yaffs_unmount("yaffs2/")