added utils_pathname_to_inode based on Lode's version from ntfsls
in __metadata the root directory is definitely metadata now (rationale: stuff the user cannot delete) check for extent inodes of metadata files (Logical change 1.192)edge.strict_endians
							parent
							
								
									127d183ef8
								
							
						
					
					
						commit
						904b95f03d
					
				|  | @ -1,8 +1,9 @@ | |||
| /**
 | ||||
|  * utils.c - Part of the Linux-NTFS project. | ||||
|  * | ||||
|  * Copyright (c) 2002 Richard Russon | ||||
|  * Copyright (c) 2002-2003 Richard Russon | ||||
|  * Copyright (c) 2003 Anton Altaparmakov | ||||
|  * Copyright (c) 2003 Lode Leroy | ||||
|  * | ||||
|  * A set of shared functions for ntfs utilities | ||||
|  * | ||||
|  | @ -39,6 +40,7 @@ | |||
| #include "types.h" | ||||
| #include "volume.h" | ||||
| #include "debug.h" | ||||
| #include "dir.h" | ||||
| 
 | ||||
| const char *ntfs_bugs = "Please report bugs to linux-ntfs-dev@lists.sourceforge.net\n"; | ||||
| const char *ntfs_home = "Linux NTFS homepage: http://linux-ntfs.sourceforge.net\n"; | ||||
|  | @ -672,14 +674,101 @@ int utils_mftrec_in_use (ntfs_volume *vol, MFT_REF mref) | |||
| 	return (buffer[byte] & bit); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * utils_pathname_to_inode - Find the inode which represents the given pathname | ||||
|  * @vol:       An ntfs volume obtained from ntfs_mount | ||||
|  * @parent:    A directory inode to begin the search (may be NULL) | ||||
|  * @pathname:  Pathname to be located | ||||
|  * | ||||
|  * Take an ASCII pathname and find the inode that represents it.  The function | ||||
|  * splits the path and then descends the directory tree.  If @parent is NULL, | ||||
|  * then the root directory '.' will be used as the base for the search. | ||||
|  * | ||||
|  * Return:  inode  Success, the pathname was valid | ||||
|  *	    NULL   Error, the pathname was invalid, or some other error occurred | ||||
|  */ | ||||
| ntfs_inode * utils_pathname_to_inode (ntfs_volume *vol, ntfs_inode *parent, const char *pathname) | ||||
| { | ||||
| 	u64 inum; | ||||
| 	int len; | ||||
| 	char *p, *q; | ||||
| 	ntfs_inode *ni; | ||||
| 	ntfs_inode *result  = NULL; | ||||
| 	uchar_t    *unicode = NULL; | ||||
| 	char       *ascii   = NULL; | ||||
| 
 | ||||
| 	if (!vol || !pathname) { | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	if (parent) { | ||||
| 		ni = parent; | ||||
| 	} else { | ||||
| 		ni = ntfs_inode_open (vol, FILE_root); | ||||
| 		if (!ni) { | ||||
| 			Eprintf ("Couldn't open the inode of the root directory.\n"); | ||||
| 			goto close; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	unicode = calloc (1, MAX_PATH); | ||||
| 	ascii   = strdup (pathname);		// Work with a r/w copy
 | ||||
| 	if (!unicode || !ascii) { | ||||
| 		Eprintf ("Out of memory.\n"); | ||||
| 		goto close; | ||||
| 	} | ||||
| 
 | ||||
| 	p = ascii; | ||||
| 	while (p && *p && *p == PATH_SEP)	// Remove leading /'s
 | ||||
| 		p++; | ||||
| 	while (p && *p) { | ||||
| 		q = strchr (p, PATH_SEP);	// Find the end of the first token
 | ||||
| 		if (q != NULL) { | ||||
| 			*q = '\0'; | ||||
| 			q++; | ||||
| 		} | ||||
| 
 | ||||
| 		len = ntfs_mbstoucs (p, &unicode, MAX_PATH); | ||||
| 		if (len < 0) { | ||||
| 			Eprintf ("Couldn't convert name to Unicode: %s.\n", p); | ||||
| 			goto close; | ||||
| 		} | ||||
| 
 | ||||
| 		inum = ntfs_inode_lookup_by_name (ni, unicode, len); | ||||
| 		if (inum == -1) { | ||||
| 			Eprintf ("Couldn't find name '%s' in pathname '%s'.\n", p, pathname); | ||||
| 			goto close; | ||||
| 		} | ||||
| 
 | ||||
| 		if (ni != parent) | ||||
| 			ntfs_inode_close (ni); | ||||
| 
 | ||||
| 		ni = ntfs_inode_open (vol, inum); | ||||
| 		if (!ni) { | ||||
| 			Eprintf ("Cannot open inode %lld: %s.\n", inum, p); | ||||
| 			goto close; | ||||
| 		} | ||||
| 
 | ||||
| 		p = q; | ||||
| 		while (p && *p && *p == PATH_SEP) | ||||
| 			p++; | ||||
| 	} | ||||
| 
 | ||||
| 	result = ni; | ||||
| 	ni = NULL; | ||||
| close: | ||||
| 	if (ni && (ni != parent)) | ||||
| 		ntfs_inode_close (ni); | ||||
| 	free (ascii); | ||||
| 	free (unicode); | ||||
| 	return result; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * __metadata | ||||
|  */ | ||||
| static int __metadata (ntfs_volume *vol, u64 num) | ||||
| { | ||||
| 	if (num == FILE_root) | ||||
| 		return 0; | ||||
| 	if (num <= FILE_UpCase) | ||||
| 		return 1; | ||||
| 	if (!vol) | ||||
|  | @ -707,10 +796,12 @@ int utils_is_metadata (ntfs_inode *inode) | |||
| 	ntfs_volume *vol; | ||||
| 	ATTR_RECORD *rec; | ||||
| 	FILE_NAME_ATTR *attr; | ||||
| 	MFT_RECORD *file; | ||||
| 	u64 num; | ||||
| 
 | ||||
| 	if (!inode) | ||||
| 		return -1; | ||||
| 
 | ||||
| 	vol = inode->vol; | ||||
| 	if (!vol) | ||||
| 		return -1; | ||||
|  | @ -719,6 +810,14 @@ int utils_is_metadata (ntfs_inode *inode) | |||
| 	if (__metadata (vol, num) == 1) | ||||
| 		return 1; | ||||
| 
 | ||||
| 	file = inode->mrec; | ||||
| 	if (file && (file->base_mft_record != 0)) { | ||||
| 		num = MREF (file->base_mft_record); | ||||
| 		if (__metadata (vol, num) == 1) | ||||
| 			return 1; | ||||
| 	} | ||||
| 	file = inode->mrec; | ||||
| 
 | ||||
| 	rec = find_first_attribute (AT_FILE_NAME, inode->mrec); | ||||
| 	if (!rec) | ||||
| 		return -1; | ||||
|  | @ -727,7 +826,7 @@ int utils_is_metadata (ntfs_inode *inode) | |||
| 	attr = (FILE_NAME_ATTR *) ((char *) rec + le16_to_cpu (rec->value_offset)); | ||||
| 
 | ||||
| 	num = MREF (attr->parent_directory); | ||||
| 	if (__metadata (vol, num) == 1) | ||||
| 	if ((num != FILE_root) && (__metadata (vol, num) == 1)) | ||||
| 		return 1; | ||||
| 
 | ||||
| 	return 0; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue