apply patch from Szaka:
- all warnings fixed for maintainer mode for ntfsresize and ntfsclone - added 'const' to ntfs_ucstombs()'s first parameter - 'fsync' also after metadata-only cloning - fixed forced metadata-only, dirty ntfs cloning (only one -f needed) (Logical change 1.264)edge.strict_endians
							parent
							
								
									f67f495e28
								
							
						
					
					
						commit
						401c8ebf7d
					
				|  | @ -57,7 +57,7 @@ extern int ntfs_file_values_compare(FILE_NAME_ATTR *file_name_attr1, | ||||||
| 
 | 
 | ||||||
| extern int ntfs_ucstombs(const uchar_t *ins, const int ins_len, char **outs, | extern int ntfs_ucstombs(const uchar_t *ins, const int ins_len, char **outs, | ||||||
| 		int outs_len); | 		int outs_len); | ||||||
| extern int ntfs_mbstoucs(char *ins, uchar_t **outs, int outs_len); | extern int ntfs_mbstoucs(const char *ins, uchar_t **outs, int outs_len); | ||||||
| 
 | 
 | ||||||
| #endif /* defined _NTFS_UNISTR_H */ | #endif /* defined _NTFS_UNISTR_H */ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -427,7 +427,7 @@ err_out: | ||||||
|  *	ENAMETOOLONG	Destination buffer is too small for input string. |  *	ENAMETOOLONG	Destination buffer is too small for input string. | ||||||
|  *	ENOMEM		Not enough memory to allocate destination buffer. |  *	ENOMEM		Not enough memory to allocate destination buffer. | ||||||
|  */ |  */ | ||||||
| int ntfs_mbstoucs(char *ins, uchar_t **outs, int outs_len) | int ntfs_mbstoucs(const char *ins, uchar_t **outs, int outs_len) | ||||||
| { | { | ||||||
| 	uchar_t *ucs; | 	uchar_t *ucs; | ||||||
| 	char *s; | 	char *s; | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| /**
 | /**
 | ||||||
|  * ntfsclone - Part of the Linux-NTFS project. |  * ntfsclone - Part of the Linux-NTFS project. | ||||||
|  * |  * | ||||||
|  * Copyright (c) 2003 Szabolcs Szakacsits |  * Copyright (c) 2003-2004 Szabolcs Szakacsits | ||||||
|  * |  * | ||||||
|  * Clone NTFS data and/or metadata to a sparse file, device or stdout. |  * Clone NTFS data and/or metadata to a sparse file, device or stdout. | ||||||
|  * |  * | ||||||
|  | @ -111,13 +111,20 @@ int wiped_timestamp_data = 0; | ||||||
| #define read_all(f, p, n)  io_all((f), (p), (n), 0) | #define read_all(f, p, n)  io_all((f), (p), (n), 0) | ||||||
| #define write_all(f, p, n) io_all((f), (p), (n), 1) | #define write_all(f, p, n) io_all((f), (p), (n), 1) | ||||||
| 
 | 
 | ||||||
|  | /* FIXME: They should be #included but Eprintf conflicts with mkntfs's Eprintf */ | ||||||
|  | extern int Eprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2))); | ||||||
|  | extern int Vprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2))); | ||||||
|  | extern int Qprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2))); | ||||||
|  | /* FIXME: should be 'static' */ | ||||||
|  | extern int Printf (const char *format, ...) __attribute__ ((format (printf, 1, 2))); | ||||||
|  | 
 | ||||||
| GEN_PRINTF(Eprintf, stderr,  NULL,         FALSE) | GEN_PRINTF(Eprintf, stderr,  NULL,         FALSE) | ||||||
| GEN_PRINTF(Vprintf, msg_out, &opt.verbose, TRUE) | GEN_PRINTF(Vprintf, msg_out, &opt.verbose, TRUE) | ||||||
| GEN_PRINTF(Qprintf, msg_out, &opt.quiet,   FALSE) | GEN_PRINTF(Qprintf, msg_out, &opt.quiet,   FALSE) | ||||||
| GEN_PRINTF(Printf,  msg_out, NULL,         FALSE) | GEN_PRINTF(Printf,  msg_out, NULL,         FALSE) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void perr_printf(const char *fmt, ...) | static void perr_printf(const char *fmt, ...) | ||||||
| { | { | ||||||
| 	va_list ap; | 	va_list ap; | ||||||
| 	int eo = errno; | 	int eo = errno; | ||||||
|  | @ -130,7 +137,7 @@ void perr_printf(const char *fmt, ...) | ||||||
| 	fflush(msg_out); | 	fflush(msg_out); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void err_printf(const char *fmt, ...) | static void err_printf(const char *fmt, ...) | ||||||
| { | { | ||||||
| 	va_list ap; | 	va_list ap; | ||||||
| 
 | 
 | ||||||
|  | @ -141,7 +148,7 @@ void err_printf(const char *fmt, ...) | ||||||
| 	fflush(msg_out); | 	fflush(msg_out); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int err_exit(const char *fmt, ...) | static int err_exit(const char *fmt, ...) | ||||||
| { | { | ||||||
| 	va_list ap; | 	va_list ap; | ||||||
| 
 | 
 | ||||||
|  | @ -154,7 +161,7 @@ int err_exit(const char *fmt, ...) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| int perr_exit(const char *fmt, ...) | static int perr_exit(const char *fmt, ...) | ||||||
| { | { | ||||||
| 	va_list ap; | 	va_list ap; | ||||||
| 	int eo = errno; | 	int eo = errno; | ||||||
|  | @ -169,7 +176,7 @@ int perr_exit(const char *fmt, ...) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void usage(void) | static void usage(void) | ||||||
| { | { | ||||||
| 	Eprintf("\nUsage: %s [options] device\n" | 	Eprintf("\nUsage: %s [options] device\n" | ||||||
| 		"    Efficiently clone NTFS to a sparse file, device or standard output.\n" | 		"    Efficiently clone NTFS to a sparse file, device or standard output.\n" | ||||||
|  | @ -191,7 +198,7 @@ void usage(void) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void parse_options(int argc, char **argv) | static void parse_options(int argc, char **argv) | ||||||
| { | { | ||||||
| 	static const char *sopt = "-dfhmo:O:"; | 	static const char *sopt = "-dfhmo:O:"; | ||||||
| 	static const struct option lopt[] = { | 	static const struct option lopt[] = { | ||||||
|  | @ -292,7 +299,7 @@ void parse_options(int argc, char **argv) | ||||||
| 			perr_exit("Couldn't open /dev/null"); | 			perr_exit("Couldn't open /dev/null"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void progress_init(struct progress_bar *p, u64 start, u64 stop, int res) | static void progress_init(struct progress_bar *p, u64 start, u64 stop, int res) | ||||||
| { | { | ||||||
| 	p->start = start; | 	p->start = start; | ||||||
| 	p->stop = stop; | 	p->stop = stop; | ||||||
|  | @ -301,7 +308,7 @@ void progress_init(struct progress_bar *p, u64 start, u64 stop, int res) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void progress_update(struct progress_bar *p, u64 current) | static void progress_update(struct progress_bar *p, u64 current) | ||||||
| { | { | ||||||
| 	float percent = p->unit * current; | 	float percent = p->unit * current; | ||||||
| 
 | 
 | ||||||
|  | @ -320,7 +327,7 @@ void progress_update(struct progress_bar *p, u64 current) | ||||||
|  * Take the number of clusters in the volume and calculate the size of $Bitmap. |  * Take the number of clusters in the volume and calculate the size of $Bitmap. | ||||||
|  * The size will always be a multiple of 8 bytes. |  * The size will always be a multiple of 8 bytes. | ||||||
|  */ |  */ | ||||||
| s64 nr_clusters_to_bitmap_byte_size(s64 nr_clusters) | static s64 nr_clusters_to_bitmap_byte_size(s64 nr_clusters) | ||||||
| { | { | ||||||
| 	s64 bm_bsize; | 	s64 bm_bsize; | ||||||
| 
 | 
 | ||||||
|  | @ -333,7 +340,7 @@ s64 nr_clusters_to_bitmap_byte_size(s64 nr_clusters) | ||||||
| 	return bm_bsize; | 	return bm_bsize; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int is_critical_metadata(ntfs_walk_clusters_ctx *image) | static int is_critical_metadata(ntfs_walk_clusters_ctx *image) | ||||||
| { | { | ||||||
| 	s64 inode; | 	s64 inode; | ||||||
| 	 | 	 | ||||||
|  | @ -350,7 +357,7 @@ int is_critical_metadata(ntfs_walk_clusters_ctx *image) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| int io_all(void *fd, void *buf, int count, int do_write) | static int io_all(void *fd, void *buf, int count, int do_write) | ||||||
| { | { | ||||||
| 	int i; | 	int i; | ||||||
| 	struct ntfs_device *dev = (struct ntfs_device *)fd; | 	struct ntfs_device *dev = (struct ntfs_device *)fd; | ||||||
|  | @ -372,7 +379,7 @@ int io_all(void *fd, void *buf, int count, int do_write) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void copy_cluster(void) | static void copy_cluster(void) | ||||||
| { | { | ||||||
| 	char buff[NTFS_MAX_CLUSTER_SIZE]; /* overflow checked at mount time */ | 	char buff[NTFS_MAX_CLUSTER_SIZE]; /* overflow checked at mount time */ | ||||||
| 
 | 
 | ||||||
|  | @ -383,7 +390,7 @@ void copy_cluster(void) | ||||||
| 		perr_exit("write_all"); | 		perr_exit("write_all"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void lseek_to_cluster(s64 lcn) | static void lseek_to_cluster(s64 lcn) | ||||||
| { | { | ||||||
| 	off_t pos; | 	off_t pos; | ||||||
| 	 | 	 | ||||||
|  | @ -399,7 +406,7 @@ void lseek_to_cluster(s64 lcn) | ||||||
| 		perr_exit("lseek output"); | 		perr_exit("lseek output"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void dump_clusters(ntfs_walk_clusters_ctx *image, runlist *rl) | static void dump_clusters(ntfs_walk_clusters_ctx *image, runlist *rl) | ||||||
| { | { | ||||||
| 	int i; | 	int i; | ||||||
| 	 | 	 | ||||||
|  | @ -416,7 +423,7 @@ void dump_clusters(ntfs_walk_clusters_ctx *image, runlist *rl) | ||||||
| 		copy_cluster(); | 		copy_cluster(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void clone_ntfs(u64 nr_clusters) | static void clone_ntfs(u64 nr_clusters) | ||||||
| { | { | ||||||
| 	s64 i, pos, count; | 	s64 i, pos, count; | ||||||
| 	u8 bm[NTFS_BUF_SIZE]; | 	u8 bm[NTFS_BUF_SIZE]; | ||||||
|  | @ -480,7 +487,7 @@ do {								\ | ||||||
| 								\ | 								\ | ||||||
| } while(0) | } while(0) | ||||||
| 
 | 
 | ||||||
| void wipe_timestamps(ntfs_walk_clusters_ctx *image) | static void wipe_timestamps(ntfs_walk_clusters_ctx *image) | ||||||
| { | { | ||||||
| 	ATTR_RECORD *a = image->ctx->attr; | 	ATTR_RECORD *a = image->ctx->attr; | ||||||
| 	 | 	 | ||||||
|  | @ -494,7 +501,7 @@ void wipe_timestamps(ntfs_walk_clusters_ctx *image) | ||||||
| 		WIPE_TIMESTAMPS(STANDARD_INFORMATION, a); | 		WIPE_TIMESTAMPS(STANDARD_INFORMATION, a); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void wipe_resident_data(ntfs_walk_clusters_ctx *image) | static void wipe_resident_data(ntfs_walk_clusters_ctx *image) | ||||||
| { | { | ||||||
| 	ATTR_RECORD *a; | 	ATTR_RECORD *a; | ||||||
| 	u32 i; | 	u32 i; | ||||||
|  | @ -520,7 +527,7 @@ void wipe_resident_data(ntfs_walk_clusters_ctx *image) | ||||||
| 	wiped_resident_data += n; | 	wiped_resident_data += n; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void walk_runs(struct ntfs_walk_cluster *walk) | static void walk_runs(struct ntfs_walk_cluster *walk) | ||||||
| { | { | ||||||
| 	int i, j; | 	int i, j; | ||||||
| 	runlist *rl; | 	runlist *rl; | ||||||
|  | @ -572,7 +579,7 @@ void walk_runs(struct ntfs_walk_cluster *walk) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void walk_attributes(struct ntfs_walk_cluster *walk) | static void walk_attributes(struct ntfs_walk_cluster *walk) | ||||||
| { | { | ||||||
| 	ntfs_attr_search_ctx *ctx; | 	ntfs_attr_search_ctx *ctx; | ||||||
| 
 | 
 | ||||||
|  | @ -592,7 +599,7 @@ void walk_attributes(struct ntfs_walk_cluster *walk) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void compare_bitmaps(struct bitmap *a) | static void compare_bitmaps(struct bitmap *a) | ||||||
| { | { | ||||||
| 	s64 i, pos, count; | 	s64 i, pos, count; | ||||||
| 	int mismatch = 0; | 	int mismatch = 0; | ||||||
|  | @ -647,7 +654,7 @@ void compare_bitmaps(struct bitmap *a) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| int wipe_data(char *p, int pos, int len) | static int wipe_data(char *p, int pos, int len) | ||||||
| { | { | ||||||
| 	int wiped = 0; | 	int wiped = 0; | ||||||
| 	 | 	 | ||||||
|  | @ -662,7 +669,7 @@ int wipe_data(char *p, int pos, int len) | ||||||
| 	return wiped; | 	return wiped; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void wipe_unused_mft_data(ntfs_inode *ni) | static void wipe_unused_mft_data(ntfs_inode *ni) | ||||||
| { | { | ||||||
| 	int unused; | 	int unused; | ||||||
| 	MFT_RECORD *m = ni->mrec; | 	MFT_RECORD *m = ni->mrec; | ||||||
|  | @ -675,7 +682,7 @@ void wipe_unused_mft_data(ntfs_inode *ni) | ||||||
| 	wiped_unused_mft_data += wipe_data((char *)m, m->bytes_in_use, unused); | 	wiped_unused_mft_data += wipe_data((char *)m, m->bytes_in_use, unused); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void wipe_unused_mft(ntfs_inode *ni) | static void wipe_unused_mft(ntfs_inode *ni) | ||||||
| { | { | ||||||
| 	int unused; | 	int unused; | ||||||
| 	MFT_RECORD *m = ni->mrec; | 	MFT_RECORD *m = ni->mrec; | ||||||
|  | @ -690,7 +697,7 @@ void wipe_unused_mft(ntfs_inode *ni) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| int walk_clusters(ntfs_volume *vol, struct ntfs_walk_cluster *walk) | static int walk_clusters(ntfs_volume *volume, struct ntfs_walk_cluster *walk) | ||||||
| { | { | ||||||
| 	s64 inode = 0; | 	s64 inode = 0; | ||||||
| 	s64 last_mft_rec; | 	s64 last_mft_rec; | ||||||
|  | @ -699,7 +706,7 @@ int walk_clusters(ntfs_volume *vol, struct ntfs_walk_cluster *walk) | ||||||
| 
 | 
 | ||||||
| 	Printf("Scanning volume ...\n"); | 	Printf("Scanning volume ...\n"); | ||||||
| 
 | 
 | ||||||
| 	last_mft_rec = vol->nr_mft_records - 1; | 	last_mft_rec = volume->nr_mft_records - 1; | ||||||
| 	progress_init(&progress, inode, last_mft_rec, 100); | 	progress_init(&progress, inode, last_mft_rec, 100); | ||||||
| 
 | 
 | ||||||
| 	for (; inode <= last_mft_rec; inode++) { | 	for (; inode <= last_mft_rec; inode++) { | ||||||
|  | @ -715,9 +722,9 @@ int walk_clusters(ntfs_volume *vol, struct ntfs_walk_cluster *walk) | ||||||
| 		if (!ni) | 		if (!ni) | ||||||
| 			perr_exit("walk_clusters"); | 			perr_exit("walk_clusters"); | ||||||
| 		 | 		 | ||||||
| 		ni->vol = vol; | 		ni->vol = volume; | ||||||
| 
 | 
 | ||||||
| 		err = ntfs_file_record_read(vol, mref, &ni->mrec, NULL); | 		err = ntfs_file_record_read(volume, mref, &ni->mrec, NULL); | ||||||
| 		if (err == -1) { | 		if (err == -1) { | ||||||
| 			free(ni); | 			free(ni); | ||||||
| 			continue; | 			continue; | ||||||
|  | @ -731,7 +738,7 @@ int walk_clusters(ntfs_volume *vol, struct ntfs_walk_cluster *walk) | ||||||
| 			if (wipe) { | 			if (wipe) { | ||||||
| 				wipe_unused_mft(ni); | 				wipe_unused_mft(ni); | ||||||
| 				wipe_unused_mft_data(ni); | 				wipe_unused_mft_data(ni); | ||||||
| 				if (ntfs_mft_record_write(vol, ni->mft_no, ni->mrec)) | 				if (ntfs_mft_record_write(volume, ni->mft_no, ni->mrec)) | ||||||
| 					perr_exit("ntfs_mft_record_write"); | 					perr_exit("ntfs_mft_record_write"); | ||||||
| 			}		 | 			}		 | ||||||
| 		} | 		} | ||||||
|  | @ -743,7 +750,7 @@ int walk_clusters(ntfs_volume *vol, struct ntfs_walk_cluster *walk) | ||||||
| 	        if (deleted_inode)  | 	        if (deleted_inode)  | ||||||
| 			continue; | 			continue; | ||||||
| 		 | 		 | ||||||
| 		if ((ni = ntfs_inode_open(vol, mref)) == NULL) { | 		if ((ni = ntfs_inode_open(volume, mref)) == NULL) { | ||||||
| 			/* FIXME: continue only if it make sense, e.g.
 | 			/* FIXME: continue only if it make sense, e.g.
 | ||||||
| 			   MFT record not in use based on $MFT bitmap */ | 			   MFT record not in use based on $MFT bitmap */ | ||||||
| 			if (errno == EIO || errno == ENOENT) | 			if (errno == EIO || errno == ENOENT) | ||||||
|  | @ -762,7 +769,7 @@ int walk_clusters(ntfs_volume *vol, struct ntfs_walk_cluster *walk) | ||||||
| out:		 | out:		 | ||||||
| 		if (wipe) { | 		if (wipe) { | ||||||
| 			wipe_unused_mft_data(ni); | 			wipe_unused_mft_data(ni); | ||||||
| 			if (ntfs_mft_record_write(vol, ni->mft_no, ni->mrec)) | 			if (ntfs_mft_record_write(volume, ni->mft_no, ni->mrec)) | ||||||
| 				perr_exit("ntfs_mft_record_write"); | 				perr_exit("ntfs_mft_record_write"); | ||||||
| 		}		 | 		}		 | ||||||
| 
 | 
 | ||||||
|  | @ -778,7 +785,7 @@ out: | ||||||
|  * $Bitmap can overlap the end of the volume. Any bits in this region |  * $Bitmap can overlap the end of the volume. Any bits in this region | ||||||
|  * must be set. This region also encompasses the backup boot sector. |  * must be set. This region also encompasses the backup boot sector. | ||||||
|  */ |  */ | ||||||
| void bitmap_file_data_fixup(s64 cluster, struct bitmap *bm) | static void bitmap_file_data_fixup(s64 cluster, struct bitmap *bm) | ||||||
| { | { | ||||||
| 	for (; cluster < bm->size << 3; cluster++) | 	for (; cluster < bm->size << 3; cluster++) | ||||||
| 		ntfs_bit_set(bm->bm, (u64)cluster, 1); | 		ntfs_bit_set(bm->bm, (u64)cluster, 1); | ||||||
|  | @ -790,7 +797,7 @@ void bitmap_file_data_fixup(s64 cluster, struct bitmap *bm) | ||||||
|  * All the bits are set to 0, except those representing the region beyond the |  * All the bits are set to 0, except those representing the region beyond the | ||||||
|  * end of the disk. |  * end of the disk. | ||||||
|  */ |  */ | ||||||
| void setup_lcn_bitmap(void) | static void setup_lcn_bitmap(void) | ||||||
| { | { | ||||||
| 	/* Determine lcn bitmap byte size and allocate it. */ | 	/* Determine lcn bitmap byte size and allocate it. */ | ||||||
| 	lcn_bitmap.size = nr_clusters_to_bitmap_byte_size(vol->nr_clusters); | 	lcn_bitmap.size = nr_clusters_to_bitmap_byte_size(vol->nr_clusters); | ||||||
|  | @ -802,20 +809,20 @@ void setup_lcn_bitmap(void) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| s64 volume_size(ntfs_volume *vol, s64 nr_clusters) | static s64 volume_size(ntfs_volume *volume, s64 nr_clusters) | ||||||
| { | { | ||||||
| 	return nr_clusters * vol->cluster_size; | 	return nr_clusters * volume->cluster_size; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void print_volume_size(char *str, s64 bytes) | static void print_volume_size(const char *str, s64 bytes) | ||||||
| { | { | ||||||
| 	Printf("%s: %lld bytes (%lld MB)\n", | 	Printf("%s: %lld bytes (%lld MB)\n", | ||||||
| 	       str, bytes, rounded_up_division(bytes, NTFS_MBYTE)); | 	       str, bytes, rounded_up_division(bytes, NTFS_MBYTE)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void print_disk_usage(ntfs_walk_clusters_ctx *image) | static void print_disk_usage(ntfs_walk_clusters_ctx *image) | ||||||
| { | { | ||||||
| 	s64 total, used; | 	s64 total, used; | ||||||
| 
 | 
 | ||||||
|  | @ -834,7 +841,7 @@ void print_disk_usage(ntfs_walk_clusters_ctx *image) | ||||||
|  * is dirty (Windows wasn't shutdown properly).  If everything is OK, then mount |  * is dirty (Windows wasn't shutdown properly).  If everything is OK, then mount | ||||||
|  * the volume (load the metadata into memory). |  * the volume (load the metadata into memory). | ||||||
|  */ |  */ | ||||||
| void mount_volume(unsigned long new_mntflag) | static void mount_volume(unsigned long new_mntflag) | ||||||
| { | { | ||||||
| 	unsigned long mntflag; | 	unsigned long mntflag; | ||||||
| 	 | 	 | ||||||
|  | @ -883,7 +890,7 @@ void mount_volume(unsigned long new_mntflag) | ||||||
| 
 | 
 | ||||||
| struct ntfs_walk_cluster backup_clusters = { NULL, NULL };  | struct ntfs_walk_cluster backup_clusters = { NULL, NULL };  | ||||||
| 
 | 
 | ||||||
| int device_offset_valid(int fd, s64 ofs) | static int device_offset_valid(int fd, s64 ofs) | ||||||
| { | { | ||||||
| 	char ch; | 	char ch; | ||||||
| 
 | 
 | ||||||
|  | @ -892,7 +899,7 @@ int device_offset_valid(int fd, s64 ofs) | ||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| s64 device_size_get(int fd) | static s64 device_size_get(int fd) | ||||||
| { | { | ||||||
| 	s64 high, low; | 	s64 high, low; | ||||||
| #ifdef BLKGETSIZE | #ifdef BLKGETSIZE | ||||||
|  | @ -933,6 +940,12 @@ s64 device_size_get(int fd) | ||||||
| 	return (low + 1LL); | 	return (low + 1LL); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void fsync_clone(int fd) | ||||||
|  | { | ||||||
|  | 	Printf("Syncing ...\n"); | ||||||
|  | 	if (fsync(fd) && errno != EINVAL) | ||||||
|  | 		perr_exit("fsync"); | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| int main(int argc, char **argv) | int main(int argc, char **argv) | ||||||
| { | { | ||||||
|  | @ -1016,14 +1029,15 @@ int main(int argc, char **argv) | ||||||
| 		s64 nr_clusters = opt.stdout ? vol->nr_clusters : image.inuse; | 		s64 nr_clusters = opt.stdout ? vol->nr_clusters : image.inuse; | ||||||
| 		 | 		 | ||||||
| 		clone_ntfs(nr_clusters); | 		clone_ntfs(nr_clusters); | ||||||
| 		Printf("Syncing ...\n"); | 		fsync_clone(fd_out); | ||||||
| 		if (fsync(fd_out) && errno != EINVAL) |  | ||||||
| 			perr_exit("fsync"); |  | ||||||
| 		exit(0); | 		exit(0); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	wipe = 1;	 | 	wipe = 1;	 | ||||||
| 	opt.volume = opt.output; | 	opt.volume = opt.output; | ||||||
|  | 	/* 'force' again mount for dirty volumes (e.g. after resize). 
 | ||||||
|  | 	   FIXME: use mount flags to avoid potential side-effects in future */ | ||||||
|  | 	opt.force++; | ||||||
| 	mount_volume(0); | 	mount_volume(0); | ||||||
| 
 | 
 | ||||||
| 	setup_lcn_bitmap(); | 	setup_lcn_bitmap(); | ||||||
|  | @ -1046,6 +1060,7 @@ int main(int argc, char **argv) | ||||||
| 	wiped_total += wiped_timestamp_data; | 	wiped_total += wiped_timestamp_data; | ||||||
| 	Printf("Wiped totally            = %8d\n", wiped_total); | 	Printf("Wiped totally            = %8d\n", wiped_total); | ||||||
| 	 | 	 | ||||||
|  | 	fsync_clone(fd_out); | ||||||
| 	exit(0); | 	exit(0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| /**
 | /**
 | ||||||
|  * ntfsresize - Part of the Linux-NTFS project. |  * ntfsresize - Part of the Linux-NTFS project. | ||||||
|  * |  * | ||||||
|  * Copyright (c) 2002-2003 Szabolcs Szakacsits |  * Copyright (c) 2002-2004 Szabolcs Szakacsits | ||||||
|  * Copyright (c) 2002-2003 Anton Altaparmakov |  * Copyright (c) 2002-2003 Anton Altaparmakov | ||||||
|  * Copyright (c) 2002-2003 Richard Russon |  * Copyright (c) 2002-2003 Richard Russon | ||||||
|  * |  * | ||||||
|  | @ -126,6 +126,11 @@ struct bitmap lcn_bitmap; | ||||||
| 
 | 
 | ||||||
| #define rounded_up_division(a, b) (((a) + (b - 1)) / (b)) | #define rounded_up_division(a, b) (((a) + (b - 1)) / (b)) | ||||||
| 
 | 
 | ||||||
|  | /* FIXME: They should be included but Eprintf conflicts with mkntfs's Eprintf */ | ||||||
|  | extern int Eprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2))); | ||||||
|  | extern int Vprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2))); | ||||||
|  | extern int Qprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2))); | ||||||
|  | 
 | ||||||
| GEN_PRINTF (Eprintf, stderr, NULL,         FALSE) | GEN_PRINTF (Eprintf, stderr, NULL,         FALSE) | ||||||
| GEN_PRINTF (Vprintf, stdout, &opt.verbose, TRUE) | GEN_PRINTF (Vprintf, stdout, &opt.verbose, TRUE) | ||||||
| GEN_PRINTF (Qprintf, stdout, &opt.quiet,   FALSE) | GEN_PRINTF (Qprintf, stdout, &opt.quiet,   FALSE) | ||||||
|  | @ -135,7 +140,7 @@ GEN_PRINTF (Qprintf, stdout, &opt.quiet,   FALSE) | ||||||
|  * |  * | ||||||
|  * Print an error message. |  * Print an error message. | ||||||
|  */ |  */ | ||||||
| void perr_printf(const char *fmt, ...) | static void perr_printf(const char *fmt, ...) | ||||||
| { | { | ||||||
| 	va_list ap; | 	va_list ap; | ||||||
| 	int eo = errno; | 	int eo = errno; | ||||||
|  | @ -154,7 +159,7 @@ void perr_printf(const char *fmt, ...) | ||||||
|  * |  * | ||||||
|  * Print and error message and exit the program. |  * Print and error message and exit the program. | ||||||
|  */ |  */ | ||||||
| int err_exit(const char *fmt, ...) | static int err_exit(const char *fmt, ...) | ||||||
| { | { | ||||||
| 	va_list ap; | 	va_list ap; | ||||||
| 
 | 
 | ||||||
|  | @ -172,7 +177,7 @@ int err_exit(const char *fmt, ...) | ||||||
|  * |  * | ||||||
|  * Print and error message and exit the program |  * Print and error message and exit the program | ||||||
|  */ |  */ | ||||||
| int perr_exit(const char *fmt, ...) | static int perr_exit(const char *fmt, ...) | ||||||
| { | { | ||||||
| 	va_list ap; | 	va_list ap; | ||||||
| 	int eo = errno; | 	int eo = errno; | ||||||
|  | @ -194,7 +199,7 @@ int perr_exit(const char *fmt, ...) | ||||||
|  * |  * | ||||||
|  * Return:  none |  * Return:  none | ||||||
|  */ |  */ | ||||||
| void usage(void) | static void usage(void) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 	printf ("\nUsage: %s [options] device\n" | 	printf ("\nUsage: %s [options] device\n" | ||||||
|  | @ -227,7 +232,7 @@ void usage(void) | ||||||
|  * Force the user to confirm an action before performing it. |  * Force the user to confirm an action before performing it. | ||||||
|  * Copy-paste from e2fsprogs |  * Copy-paste from e2fsprogs | ||||||
|  */ |  */ | ||||||
| void proceed_question(void) | static void proceed_question(void) | ||||||
| { | { | ||||||
| 	char buf[256]; | 	char buf[256]; | ||||||
| 	const char *short_yes = "yY"; | 	const char *short_yes = "yY"; | ||||||
|  | @ -251,7 +256,7 @@ void proceed_question(void) | ||||||
|  * |  * | ||||||
|  * Return:  none |  * Return:  none | ||||||
|  */ |  */ | ||||||
| void version (void) | static void version (void) | ||||||
| { | { | ||||||
| 	printf ("\nResize an NTFS Volume, without data loss.\n\n"); | 	printf ("\nResize an NTFS Volume, without data loss.\n\n"); | ||||||
| 	printf ("Copyright (c) 2002-2003  Szabolcs Szakacsits\n"); | 	printf ("Copyright (c) 2002-2003  Szabolcs Szakacsits\n"); | ||||||
|  | @ -267,7 +272,7 @@ void version (void) | ||||||
|  * will be assumed to be in bytes.  If the number has a suffix of k, M or G it |  * will be assumed to be in bytes.  If the number has a suffix of k, M or G it | ||||||
|  * will be scaled up by 1000, 1000000, or 1000000000. |  * will be scaled up by 1000, 1000000, or 1000000000. | ||||||
|  */ |  */ | ||||||
| s64 get_new_volume_size(char *s) | static s64 get_new_volume_size(char *s) | ||||||
| { | { | ||||||
| 	s64 size; | 	s64 size; | ||||||
| 	char *suffix; | 	char *suffix; | ||||||
|  | @ -322,7 +327,7 @@ s64 get_new_volume_size(char *s) | ||||||
|  * Return:  1 Success |  * Return:  1 Success | ||||||
|  *	    0 Error, one or more problems |  *	    0 Error, one or more problems | ||||||
|  */ |  */ | ||||||
| int parse_options(int argc, char **argv) | static int parse_options(int argc, char **argv) | ||||||
| { | { | ||||||
| 	static const char *sopt = "-dfhinPs:vV"; | 	static const char *sopt = "-dfhinPs:vV"; | ||||||
| 	static const struct option lopt[] = { | 	static const struct option lopt[] = { | ||||||
|  | @ -438,28 +443,13 @@ int parse_options(int argc, char **argv) | ||||||
| 	return (!err && !help && !ver); | 	return (!err && !help && !ver); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 |  | ||||||
|  * runlist_extent_number |  | ||||||
|  * |  | ||||||
|  * Count the runs in a runlist. |  | ||||||
|  */ |  | ||||||
| int runlist_extent_number(runlist *rl) |  | ||||||
| { |  | ||||||
| 	int i; |  | ||||||
| 
 |  | ||||||
| 	for (i = 0; rl[i].length; i++) |  | ||||||
| 		; |  | ||||||
| 
 |  | ||||||
| 	return i; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 | /**
 | ||||||
|  * nr_clusters_to_bitmap_byte_size |  * nr_clusters_to_bitmap_byte_size | ||||||
|  * |  * | ||||||
|  * Take the number of clusters in the volume and calculate the size of $Bitmap. |  * Take the number of clusters in the volume and calculate the size of $Bitmap. | ||||||
|  * The size will always be a multiple of 8 bytes. |  * The size will always be a multiple of 8 bytes. | ||||||
|  */ |  */ | ||||||
| s64 nr_clusters_to_bitmap_byte_size(s64 nr_clusters) | static s64 nr_clusters_to_bitmap_byte_size(s64 nr_clusters) | ||||||
| { | { | ||||||
| 	s64 bm_bsize; | 	s64 bm_bsize; | ||||||
| 
 | 
 | ||||||
|  | @ -472,7 +462,7 @@ s64 nr_clusters_to_bitmap_byte_size(s64 nr_clusters) | ||||||
| 	return bm_bsize; | 	return bm_bsize; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int str2unicode(char *aname, uchar_t **ustr, int *len) | static int str2unicode(const char *aname, uchar_t **ustr, int *len) | ||||||
| { | { | ||||||
| 	if (aname && ((*len = ntfs_mbstoucs(aname, ustr, 0)) == -1)) | 	if (aname && ((*len = ntfs_mbstoucs(aname, ustr, 0)) == -1)) | ||||||
| 		return -1; | 		return -1; | ||||||
|  | @ -485,7 +475,7 @@ int str2unicode(char *aname, uchar_t **ustr, int *len) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int has_bad_sectors(ntfs_resize_t *resize) | static int has_bad_sectors(ntfs_resize_t *resize) | ||||||
| { | { | ||||||
| 	int len, ret = 0; | 	int len, ret = 0; | ||||||
| 	uchar_t *ustr = NULL; | 	uchar_t *ustr = NULL; | ||||||
|  | @ -508,7 +498,7 @@ int has_bad_sectors(ntfs_resize_t *resize) | ||||||
| 	return ret;	 | 	return ret;	 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void collect_shrink_constraints(ntfs_resize_t *resize, s64 last_lcn) | static void collect_shrink_constraints(ntfs_resize_t *resize, s64 last_lcn) | ||||||
| { | { | ||||||
| 	s64 inode; | 	s64 inode; | ||||||
| 	ATTR_FLAGS flags; | 	ATTR_FLAGS flags; | ||||||
|  | @ -551,7 +541,7 @@ void collect_shrink_constraints(ntfs_resize_t *resize, s64 last_lcn) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void collect_shrink_info(ntfs_resize_t *resize, runlist *rl) | static void collect_shrink_info(ntfs_resize_t *resize, runlist *rl) | ||||||
| { | { | ||||||
| 	s64 new_volume_size, lcn, lcn_length; | 	s64 new_volume_size, lcn, lcn_length; | ||||||
| 	 | 	 | ||||||
|  | @ -589,7 +579,7 @@ void collect_shrink_info(ntfs_resize_t *resize, runlist *rl) | ||||||
|  * |  * | ||||||
|  * This serves as a rudimentary "chkdsk" operation. |  * This serves as a rudimentary "chkdsk" operation. | ||||||
|  */ |  */ | ||||||
| void build_lcn_usage_bitmap(ntfs_resize_t *resize) | static void build_lcn_usage_bitmap(ntfs_resize_t *resize) | ||||||
| { | { | ||||||
| 	s64 inode; | 	s64 inode; | ||||||
| 	ATTR_RECORD *a; | 	ATTR_RECORD *a; | ||||||
|  | @ -647,7 +637,7 @@ void build_lcn_usage_bitmap(ntfs_resize_t *resize) | ||||||
|  * For a given MFT Record, iterate through all its attributes.  Any non-resident |  * For a given MFT Record, iterate through all its attributes.  Any non-resident | ||||||
|  * data runs will be marked in lcn_bitmap. |  * data runs will be marked in lcn_bitmap. | ||||||
|  */ |  */ | ||||||
| void walk_attributes(ntfs_resize_t *resize) | static void walk_attributes(ntfs_resize_t *resize) | ||||||
| { | { | ||||||
| 	ntfs_attr_search_ctx *ctx; | 	ntfs_attr_search_ctx *ctx; | ||||||
| 
 | 
 | ||||||
|  | @ -670,7 +660,7 @@ void walk_attributes(ntfs_resize_t *resize) | ||||||
|  * Compare two bitmaps.  In this case, $Bitmap as read from the disk and |  * Compare two bitmaps.  In this case, $Bitmap as read from the disk and | ||||||
|  * lcn_bitmap which we built from the MFT Records. |  * lcn_bitmap which we built from the MFT Records. | ||||||
|  */ |  */ | ||||||
| void compare_bitmaps(struct bitmap *a) | static void compare_bitmaps(struct bitmap *a) | ||||||
| { | { | ||||||
| 	s64 i, pos, count; | 	s64 i, pos, count; | ||||||
| 	int mismatch = 0; | 	int mismatch = 0; | ||||||
|  | @ -739,7 +729,7 @@ void compare_bitmaps(struct bitmap *a) | ||||||
|  * |  * | ||||||
|  * Create and scale our progress bar. |  * Create and scale our progress bar. | ||||||
|  */ |  */ | ||||||
| void progress_init(struct progress_bar *p, u64 start, u64 stop, int res) | static void progress_init(struct progress_bar *p, u64 start, u64 stop, int res) | ||||||
| { | { | ||||||
| 	p->start = start; | 	p->start = start; | ||||||
| 	p->stop = stop; | 	p->stop = stop; | ||||||
|  | @ -752,7 +742,7 @@ void progress_init(struct progress_bar *p, u64 start, u64 stop, int res) | ||||||
|  * |  * | ||||||
|  * Update the progress bar and tell the user. |  * Update the progress bar and tell the user. | ||||||
|  */ |  */ | ||||||
| void progress_update(struct progress_bar *p, u64 current) | static void progress_update(struct progress_bar *p, u64 current) | ||||||
| { | { | ||||||
| 	float percent; | 	float percent; | ||||||
| 	 | 	 | ||||||
|  | @ -775,7 +765,7 @@ void progress_update(struct progress_bar *p, u64 current) | ||||||
|  * Read each record in the MFT, skipping the unused ones, and build up a bitmap |  * Read each record in the MFT, skipping the unused ones, and build up a bitmap | ||||||
|  * from all the non-resident attributes. |  * from all the non-resident attributes. | ||||||
|  */ |  */ | ||||||
| void walk_inodes(ntfs_resize_t *resize) | static void walk_inodes(ntfs_resize_t *resize) | ||||||
| { | { | ||||||
| 	s64 inode = 0; | 	s64 inode = 0; | ||||||
| 	s64 last_mft_rec; | 	s64 last_mft_rec; | ||||||
|  | @ -809,7 +799,7 @@ close_inode: | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void print_hint(const char *s, struct llcn_t llcn) | static void print_hint(const char *s, struct llcn_t llcn) | ||||||
| { | { | ||||||
| 	s64 runs_b, runs_mb; | 	s64 runs_b, runs_mb; | ||||||
| 	 | 	 | ||||||
|  | @ -828,7 +818,7 @@ void print_hint(const char *s, struct llcn_t llcn) | ||||||
|  * already been read into lcn_bitmap.  By looking for the last used cluster on |  * already been read into lcn_bitmap.  By looking for the last used cluster on | ||||||
|  * the disk, we can work out by how much we can shrink the volume. |  * the disk, we can work out by how much we can shrink the volume. | ||||||
|  */ |  */ | ||||||
| void advise_on_resize(ntfs_resize_t *resize) | static void advise_on_resize(ntfs_resize_t *resize) | ||||||
| { | { | ||||||
| 	s64 old_b, new_b, g_b, old_mb, new_mb, g_mb; | 	s64 old_b, new_b, g_b, old_mb, new_mb, g_mb; | ||||||
| 	s64 supp_lcn = 0; /* smallest size supported in LCN */  | 	s64 supp_lcn = 0; /* smallest size supported in LCN */  | ||||||
|  | @ -884,7 +874,7 @@ void advise_on_resize(ntfs_resize_t *resize) | ||||||
|  * |  * | ||||||
|  * Helper to set up a runlist object |  * Helper to set up a runlist object | ||||||
|  */ |  */ | ||||||
| void rl_set(runlist *rl, VCN vcn, LCN lcn, s64 len) | static void rl_set(runlist *rl, VCN vcn, LCN lcn, s64 len) | ||||||
| { | { | ||||||
| 	rl->vcn = vcn; | 	rl->vcn = vcn; | ||||||
| 	rl->lcn = lcn; | 	rl->lcn = lcn; | ||||||
|  | @ -897,7 +887,7 @@ void rl_set(runlist *rl, VCN vcn, LCN lcn, s64 len) | ||||||
|  * $Bitmap can overlap the end of the volume. Any bits in this region |  * $Bitmap can overlap the end of the volume. Any bits in this region | ||||||
|  * must be set. This region also encompasses the backup boot sector. |  * must be set. This region also encompasses the backup boot sector. | ||||||
|  */ |  */ | ||||||
| void bitmap_file_data_fixup(s64 cluster, struct bitmap *bm) | static void bitmap_file_data_fixup(s64 cluster, struct bitmap *bm) | ||||||
| { | { | ||||||
| 	for (; cluster < bm->size << 3; cluster++) | 	for (; cluster < bm->size << 3; cluster++) | ||||||
| 		ntfs_bit_set(bm->bm, (u64)cluster, 1); | 		ntfs_bit_set(bm->bm, (u64)cluster, 1); | ||||||
|  | @ -911,7 +901,7 @@ void bitmap_file_data_fixup(s64 cluster, struct bitmap *bm) | ||||||
|  * FIXME: this function should go away and instead using a generalized |  * FIXME: this function should go away and instead using a generalized | ||||||
|  * "truncate_bitmap_data_attr()" |  * "truncate_bitmap_data_attr()" | ||||||
|  */ |  */ | ||||||
| void truncate_badclust_bad_attr(ATTR_RECORD *a, s64 nr_clusters) | static void truncate_badclust_bad_attr(ATTR_RECORD *a, s64 nr_clusters) | ||||||
| { | { | ||||||
| 	runlist *rl_bad; | 	runlist *rl_bad; | ||||||
| 	int mp_size; | 	int mp_size; | ||||||
|  | @ -955,7 +945,7 @@ void truncate_badclust_bad_attr(ATTR_RECORD *a, s64 nr_clusters) | ||||||
|  * Shrink the metadata file $Bitmap.  It must be large enough for one bit per |  * Shrink the metadata file $Bitmap.  It must be large enough for one bit per | ||||||
|  * cluster of the shrunken volume.  Also it must be a of 8 bytes in size. |  * cluster of the shrunken volume.  Also it must be a of 8 bytes in size. | ||||||
|  */ |  */ | ||||||
| void shrink_bitmap_data_attr(runlist **rlist, s64 nr_bm_clusters, s64 new_size) | static void shrink_bitmap_data_attr(runlist **rlist, s64 nr_bm_clusters, s64 new_size) | ||||||
| { | { | ||||||
| 	runlist *rl = *rlist; | 	runlist *rl = *rlist; | ||||||
| 	int i, j; | 	int i, j; | ||||||
|  | @ -1000,7 +990,7 @@ void shrink_bitmap_data_attr(runlist **rlist, s64 nr_bm_clusters, s64 new_size) | ||||||
|  * Enlarge the metadata file $Bitmap.  It must be large enough for one bit per |  * Enlarge the metadata file $Bitmap.  It must be large enough for one bit per | ||||||
|  * cluster of the shrunken volume.  Also it must be a of 8 bytes in size. |  * cluster of the shrunken volume.  Also it must be a of 8 bytes in size. | ||||||
|  */ |  */ | ||||||
| void enlarge_bitmap_data_attr(runlist **rlist, s64 nr_bm_clusters, s64 new_size) | static void enlarge_bitmap_data_attr(runlist **rlist, s64 nr_bm_clusters, s64 new_size) | ||||||
| { | { | ||||||
| 	runlist *rl = *rlist; | 	runlist *rl = *rlist; | ||||||
| 	s64 i, j, free_zone = 0; | 	s64 i, j, free_zone = 0; | ||||||
|  | @ -1037,7 +1027,7 @@ void enlarge_bitmap_data_attr(runlist **rlist, s64 nr_bm_clusters, s64 new_size) | ||||||
| /**
 | /**
 | ||||||
|  * truncate_bitmap_data_attr |  * truncate_bitmap_data_attr | ||||||
|  */ |  */ | ||||||
| void truncate_bitmap_data_attr(ntfs_resize_t *resize) | static void truncate_bitmap_data_attr(ntfs_resize_t *resize) | ||||||
| { | { | ||||||
| 	ATTR_RECORD *a; | 	ATTR_RECORD *a; | ||||||
| 	runlist *rl; | 	runlist *rl; | ||||||
|  | @ -1116,7 +1106,7 @@ void truncate_bitmap_data_attr(ntfs_resize_t *resize) | ||||||
|  * Find the $DATA attribute (with or without a name) for the given MFT reference |  * Find the $DATA attribute (with or without a name) for the given MFT reference | ||||||
|  * (inode number). |  * (inode number). | ||||||
|  */ |  */ | ||||||
| void lookup_data_attr(MFT_REF mref, char *aname, ntfs_attr_search_ctx **ctx) | static void lookup_data_attr(MFT_REF mref, const char *aname, ntfs_attr_search_ctx **ctx) | ||||||
| { | { | ||||||
| 	ntfs_inode *ni; | 	ntfs_inode *ni; | ||||||
| 	uchar_t *ustr = NULL; | 	uchar_t *ustr = NULL; | ||||||
|  | @ -1147,7 +1137,7 @@ void lookup_data_attr(MFT_REF mref, char *aname, ntfs_attr_search_ctx **ctx) | ||||||
|  * Write an MFT Record back to the disk.  If the read-only command line option |  * Write an MFT Record back to the disk.  If the read-only command line option | ||||||
|  * was given, this function will do nothing. |  * was given, this function will do nothing. | ||||||
|  */ |  */ | ||||||
| int write_mft_record(ntfs_attr_search_ctx *ctx) | static int write_mft_record(ntfs_attr_search_ctx *ctx) | ||||||
| { | { | ||||||
| 	if (ntfs_mft_record_write(vol, ctx->ntfs_ino->mft_no, ctx->mrec)) | 	if (ntfs_mft_record_write(vol, ctx->ntfs_ino->mft_no, ctx->mrec)) | ||||||
| 		perr_exit("ntfs_mft_record_write"); | 		perr_exit("ntfs_mft_record_write"); | ||||||
|  | @ -1163,7 +1153,7 @@ int write_mft_record(ntfs_attr_search_ctx *ctx) | ||||||
|  * |  * | ||||||
|  * Shrink the $BadClus file to match the new volume size. |  * Shrink the $BadClus file to match the new volume size. | ||||||
|  */ |  */ | ||||||
| void truncate_badclust_file(s64 nr_clusters) | static void truncate_badclust_file(s64 nr_clusters) | ||||||
| { | { | ||||||
| 	ntfs_attr_search_ctx *ctx = NULL; | 	ntfs_attr_search_ctx *ctx = NULL; | ||||||
| 
 | 
 | ||||||
|  | @ -1184,7 +1174,7 @@ void truncate_badclust_file(s64 nr_clusters) | ||||||
|  * |  * | ||||||
|  * Shrink the $Bitmap file to match the new volume size. |  * Shrink the $Bitmap file to match the new volume size. | ||||||
|  */ |  */ | ||||||
| void truncate_bitmap_file(ntfs_resize_t *resize) | static void truncate_bitmap_file(ntfs_resize_t *resize) | ||||||
| { | { | ||||||
| 	printf("Updating $Bitmap file ...\n"); | 	printf("Updating $Bitmap file ...\n"); | ||||||
| 
 | 
 | ||||||
|  | @ -1204,7 +1194,7 @@ void truncate_bitmap_file(ntfs_resize_t *resize) | ||||||
|  * All the bits are set to 0, except those representing the region beyond the |  * All the bits are set to 0, except those representing the region beyond the | ||||||
|  * end of the disk. |  * end of the disk. | ||||||
|  */ |  */ | ||||||
| void setup_lcn_bitmap(void) | static void setup_lcn_bitmap(void) | ||||||
| { | { | ||||||
| 	/* Determine lcn bitmap byte size and allocate it. */ | 	/* Determine lcn bitmap byte size and allocate it. */ | ||||||
| 	lcn_bitmap.size = nr_clusters_to_bitmap_byte_size(vol->nr_clusters); | 	lcn_bitmap.size = nr_clusters_to_bitmap_byte_size(vol->nr_clusters); | ||||||
|  | @ -1220,7 +1210,7 @@ void setup_lcn_bitmap(void) | ||||||
|  * |  * | ||||||
|  * FIXME: should be done using ntfs_* functions |  * FIXME: should be done using ntfs_* functions | ||||||
|  */ |  */ | ||||||
| void update_bootsector(s64 nr_clusters) | static void update_bootsector(s64 nr_clusters) | ||||||
| { | { | ||||||
| 	NTFS_BOOT_SECTOR bs; | 	NTFS_BOOT_SECTOR bs; | ||||||
| 
 | 
 | ||||||
|  | @ -1248,9 +1238,9 @@ void update_bootsector(s64 nr_clusters) | ||||||
| /**
 | /**
 | ||||||
|  * volume_size |  * volume_size | ||||||
|  */ |  */ | ||||||
| s64 volume_size(ntfs_volume *vol, s64 nr_clusters) | static s64 volume_size(ntfs_volume *v, s64 nr_clusters) | ||||||
| { | { | ||||||
| 	return nr_clusters * vol->cluster_size; | 	return nr_clusters * v->cluster_size; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | @ -1258,7 +1248,7 @@ s64 volume_size(ntfs_volume *vol, s64 nr_clusters) | ||||||
|  * |  * | ||||||
|  * Print the volume size in bytes and decimal megabytes. |  * Print the volume size in bytes and decimal megabytes. | ||||||
|  */ |  */ | ||||||
| void print_volume_size(char *str, s64 bytes) | static void print_volume_size(const char *str, s64 bytes) | ||||||
| { | { | ||||||
| 	printf("%s: %lld bytes (%lld MB)\n", | 	printf("%s: %lld bytes (%lld MB)\n", | ||||||
| 	       str, bytes, rounded_up_division(bytes, NTFS_MBYTE)); | 	       str, bytes, rounded_up_division(bytes, NTFS_MBYTE)); | ||||||
|  | @ -1269,7 +1259,7 @@ void print_volume_size(char *str, s64 bytes) | ||||||
|  * |  * | ||||||
|  * Display the amount of disk space in use. |  * Display the amount of disk space in use. | ||||||
|  */ |  */ | ||||||
| void print_disk_usage(ntfs_resize_t *resize) | static void print_disk_usage(ntfs_resize_t *resize) | ||||||
| { | { | ||||||
| 	s64 total, used, relocations; | 	s64 total, used, relocations; | ||||||
| 
 | 
 | ||||||
|  | @ -1294,7 +1284,7 @@ void print_disk_usage(ntfs_resize_t *resize) | ||||||
|  * is dirty (Windows wasn't shutdown properly).  If everything is OK, then mount |  * is dirty (Windows wasn't shutdown properly).  If everything is OK, then mount | ||||||
|  * the volume (load the metadata into memory). |  * the volume (load the metadata into memory). | ||||||
|  */ |  */ | ||||||
| void mount_volume(void) | static void mount_volume(void) | ||||||
| { | { | ||||||
| 	unsigned long mntflag; | 	unsigned long mntflag; | ||||||
| 
 | 
 | ||||||
|  | @ -1348,7 +1338,7 @@ void mount_volume(void) | ||||||
|  * boots it will automatically run chkdsk to check for any problems.  If the |  * boots it will automatically run chkdsk to check for any problems.  If the | ||||||
|  * read-only command line option was given, this function will do nothing. |  * read-only command line option was given, this function will do nothing. | ||||||
|  */ |  */ | ||||||
| void prepare_volume_fixup(void) | static void prepare_volume_fixup(void) | ||||||
| { | { | ||||||
| 	u16 flags; | 	u16 flags; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue