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, | ||||
| 		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 */ | ||||
| 
 | ||||
|  |  | |||
|  | @ -427,7 +427,7 @@ err_out: | |||
|  *	ENAMETOOLONG	Destination buffer is too small for input string. | ||||
|  *	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; | ||||
| 	char *s; | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /**
 | ||||
|  * 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. | ||||
|  * | ||||
|  | @ -111,13 +111,20 @@ int wiped_timestamp_data = 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) | ||||
| 
 | ||||
| /* 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(Vprintf, msg_out, &opt.verbose, TRUE) | ||||
| GEN_PRINTF(Qprintf, msg_out, &opt.quiet,   FALSE) | ||||
| GEN_PRINTF(Printf,  msg_out, NULL,         FALSE) | ||||
| 
 | ||||
| 
 | ||||
| void perr_printf(const char *fmt, ...) | ||||
| static void perr_printf(const char *fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 	int eo = errno; | ||||
|  | @ -130,7 +137,7 @@ void perr_printf(const char *fmt, ...) | |||
| 	fflush(msg_out); | ||||
| } | ||||
| 
 | ||||
| void err_printf(const char *fmt, ...) | ||||
| static void err_printf(const char *fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 
 | ||||
|  | @ -141,7 +148,7 @@ void err_printf(const char *fmt, ...) | |||
| 	fflush(msg_out); | ||||
| } | ||||
| 
 | ||||
| int err_exit(const char *fmt, ...) | ||||
| static int err_exit(const char *fmt, ...) | ||||
| { | ||||
| 	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; | ||||
| 	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" | ||||
| 		"    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 struct option lopt[] = { | ||||
|  | @ -292,7 +299,7 @@ void parse_options(int argc, char **argv) | |||
| 			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->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; | ||||
| 
 | ||||
|  | @ -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. | ||||
|  * 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; | ||||
| 
 | ||||
|  | @ -333,7 +340,7 @@ s64 nr_clusters_to_bitmap_byte_size(s64 nr_clusters) | |||
| 	return bm_bsize; | ||||
| } | ||||
| 
 | ||||
| int is_critical_metadata(ntfs_walk_clusters_ctx *image) | ||||
| static int is_critical_metadata(ntfs_walk_clusters_ctx *image) | ||||
| { | ||||
| 	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; | ||||
| 	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 */ | ||||
| 
 | ||||
|  | @ -383,7 +390,7 @@ void copy_cluster(void) | |||
| 		perr_exit("write_all"); | ||||
| } | ||||
| 
 | ||||
| void lseek_to_cluster(s64 lcn) | ||||
| static void lseek_to_cluster(s64 lcn) | ||||
| { | ||||
| 	off_t pos; | ||||
| 	 | ||||
|  | @ -399,7 +406,7 @@ void lseek_to_cluster(s64 lcn) | |||
| 		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; | ||||
| 	 | ||||
|  | @ -416,7 +423,7 @@ void dump_clusters(ntfs_walk_clusters_ctx *image, runlist *rl) | |||
| 		copy_cluster(); | ||||
| } | ||||
| 
 | ||||
| void clone_ntfs(u64 nr_clusters) | ||||
| static void clone_ntfs(u64 nr_clusters) | ||||
| { | ||||
| 	s64 i, pos, count; | ||||
| 	u8 bm[NTFS_BUF_SIZE]; | ||||
|  | @ -480,7 +487,7 @@ do {								\ | |||
| 								\ | ||||
| } 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; | ||||
| 	 | ||||
|  | @ -494,7 +501,7 @@ void wipe_timestamps(ntfs_walk_clusters_ctx *image) | |||
| 		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; | ||||
| 	u32 i; | ||||
|  | @ -520,7 +527,7 @@ void wipe_resident_data(ntfs_walk_clusters_ctx *image) | |||
| 	wiped_resident_data += n; | ||||
| } | ||||
| 
 | ||||
| void walk_runs(struct ntfs_walk_cluster *walk) | ||||
| static void walk_runs(struct ntfs_walk_cluster *walk) | ||||
| { | ||||
| 	int i, j; | ||||
| 	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; | ||||
| 
 | ||||
|  | @ -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; | ||||
| 	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; | ||||
| 	 | ||||
|  | @ -662,7 +669,7 @@ int wipe_data(char *p, int pos, int len) | |||
| 	return wiped; | ||||
| } | ||||
| 
 | ||||
| void wipe_unused_mft_data(ntfs_inode *ni) | ||||
| static void wipe_unused_mft_data(ntfs_inode *ni) | ||||
| { | ||||
| 	int unused; | ||||
| 	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); | ||||
| } | ||||
| 
 | ||||
| void wipe_unused_mft(ntfs_inode *ni) | ||||
| static void wipe_unused_mft(ntfs_inode *ni) | ||||
| { | ||||
| 	int unused; | ||||
| 	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 last_mft_rec; | ||||
|  | @ -699,7 +706,7 @@ int walk_clusters(ntfs_volume *vol, struct ntfs_walk_cluster *walk) | |||
| 
 | ||||
| 	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); | ||||
| 
 | ||||
| 	for (; inode <= last_mft_rec; inode++) { | ||||
|  | @ -715,9 +722,9 @@ int walk_clusters(ntfs_volume *vol, struct ntfs_walk_cluster *walk) | |||
| 		if (!ni) | ||||
| 			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) { | ||||
| 			free(ni); | ||||
| 			continue; | ||||
|  | @ -731,7 +738,7 @@ int walk_clusters(ntfs_volume *vol, struct ntfs_walk_cluster *walk) | |||
| 			if (wipe) { | ||||
| 				wipe_unused_mft(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"); | ||||
| 			}		 | ||||
| 		} | ||||
|  | @ -743,7 +750,7 @@ int walk_clusters(ntfs_volume *vol, struct ntfs_walk_cluster *walk) | |||
| 	        if (deleted_inode)  | ||||
| 			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.
 | ||||
| 			   MFT record not in use based on $MFT bitmap */ | ||||
| 			if (errno == EIO || errno == ENOENT) | ||||
|  | @ -762,7 +769,7 @@ int walk_clusters(ntfs_volume *vol, struct ntfs_walk_cluster *walk) | |||
| out:		 | ||||
| 		if (wipe) { | ||||
| 			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"); | ||||
| 		}		 | ||||
| 
 | ||||
|  | @ -778,7 +785,7 @@ out: | |||
|  * $Bitmap can overlap the end of the volume. Any bits in this region | ||||
|  * 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++) | ||||
| 		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 | ||||
|  * end of the disk. | ||||
|  */ | ||||
| void setup_lcn_bitmap(void) | ||||
| static void setup_lcn_bitmap(void) | ||||
| { | ||||
| 	/* Determine lcn bitmap byte size and allocate it. */ | ||||
| 	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", | ||||
| 	       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; | ||||
| 
 | ||||
|  | @ -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 | ||||
|  * 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; | ||||
| 	 | ||||
|  | @ -883,7 +890,7 @@ void mount_volume(unsigned long new_mntflag) | |||
| 
 | ||||
| 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; | ||||
| 
 | ||||
|  | @ -892,7 +899,7 @@ int device_offset_valid(int fd, s64 ofs) | |||
| 	return -1; | ||||
| } | ||||
| 
 | ||||
| s64 device_size_get(int fd) | ||||
| static s64 device_size_get(int fd) | ||||
| { | ||||
| 	s64 high, low; | ||||
| #ifdef BLKGETSIZE | ||||
|  | @ -933,6 +940,12 @@ s64 device_size_get(int fd) | |||
| 	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) | ||||
| { | ||||
|  | @ -1016,14 +1029,15 @@ int main(int argc, char **argv) | |||
| 		s64 nr_clusters = opt.stdout ? vol->nr_clusters : image.inuse; | ||||
| 		 | ||||
| 		clone_ntfs(nr_clusters); | ||||
| 		Printf("Syncing ...\n"); | ||||
| 		if (fsync(fd_out) && errno != EINVAL) | ||||
| 			perr_exit("fsync"); | ||||
| 		fsync_clone(fd_out); | ||||
| 		exit(0); | ||||
| 	} | ||||
| 	 | ||||
| 	wipe = 1;	 | ||||
| 	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); | ||||
| 
 | ||||
| 	setup_lcn_bitmap(); | ||||
|  | @ -1046,6 +1060,7 @@ int main(int argc, char **argv) | |||
| 	wiped_total += wiped_timestamp_data; | ||||
| 	Printf("Wiped totally            = %8d\n", wiped_total); | ||||
| 	 | ||||
| 	fsync_clone(fd_out); | ||||
| 	exit(0); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /**
 | ||||
|  * 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 Richard Russon | ||||
|  * | ||||
|  | @ -126,6 +126,11 @@ struct bitmap lcn_bitmap; | |||
| 
 | ||||
| #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 (Vprintf, stdout, &opt.verbose, TRUE) | ||||
| GEN_PRINTF (Qprintf, stdout, &opt.quiet,   FALSE) | ||||
|  | @ -135,7 +140,7 @@ GEN_PRINTF (Qprintf, stdout, &opt.quiet,   FALSE) | |||
|  * | ||||
|  * Print an error message. | ||||
|  */ | ||||
| void perr_printf(const char *fmt, ...) | ||||
| static void perr_printf(const char *fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 	int eo = errno; | ||||
|  | @ -154,7 +159,7 @@ void perr_printf(const char *fmt, ...) | |||
|  * | ||||
|  * Print and error message and exit the program. | ||||
|  */ | ||||
| int err_exit(const char *fmt, ...) | ||||
| static int err_exit(const char *fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 
 | ||||
|  | @ -172,7 +177,7 @@ int err_exit(const char *fmt, ...) | |||
|  * | ||||
|  * Print and error message and exit the program | ||||
|  */ | ||||
| int perr_exit(const char *fmt, ...) | ||||
| static int perr_exit(const char *fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 	int eo = errno; | ||||
|  | @ -194,7 +199,7 @@ int perr_exit(const char *fmt, ...) | |||
|  * | ||||
|  * Return:  none | ||||
|  */ | ||||
| void usage(void) | ||||
| static void usage(void) | ||||
| { | ||||
| 
 | ||||
| 	printf ("\nUsage: %s [options] device\n" | ||||
|  | @ -227,7 +232,7 @@ void usage(void) | |||
|  * Force the user to confirm an action before performing it. | ||||
|  * Copy-paste from e2fsprogs | ||||
|  */ | ||||
| void proceed_question(void) | ||||
| static void proceed_question(void) | ||||
| { | ||||
| 	char buf[256]; | ||||
| 	const char *short_yes = "yY"; | ||||
|  | @ -251,7 +256,7 @@ void proceed_question(void) | |||
|  * | ||||
|  * Return:  none | ||||
|  */ | ||||
| void version (void) | ||||
| static void version (void) | ||||
| { | ||||
| 	printf ("\nResize an NTFS Volume, without data loss.\n\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 scaled up by 1000, 1000000, or 1000000000. | ||||
|  */ | ||||
| s64 get_new_volume_size(char *s) | ||||
| static s64 get_new_volume_size(char *s) | ||||
| { | ||||
| 	s64 size; | ||||
| 	char *suffix; | ||||
|  | @ -322,7 +327,7 @@ s64 get_new_volume_size(char *s) | |||
|  * Return:  1 Success | ||||
|  *	    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 struct option lopt[] = { | ||||
|  | @ -438,28 +443,13 @@ int parse_options(int argc, char **argv) | |||
| 	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 | ||||
|  * | ||||
|  * Take the number of clusters in the volume and calculate the size of $Bitmap. | ||||
|  * 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; | ||||
| 
 | ||||
|  | @ -472,7 +462,7 @@ s64 nr_clusters_to_bitmap_byte_size(s64 nr_clusters) | |||
| 	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)) | ||||
| 		return -1; | ||||
|  | @ -485,7 +475,7 @@ int str2unicode(char *aname, uchar_t **ustr, int *len) | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int has_bad_sectors(ntfs_resize_t *resize) | ||||
| static int has_bad_sectors(ntfs_resize_t *resize) | ||||
| { | ||||
| 	int len, ret = 0; | ||||
| 	uchar_t *ustr = NULL; | ||||
|  | @ -508,7 +498,7 @@ int has_bad_sectors(ntfs_resize_t *resize) | |||
| 	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; | ||||
| 	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; | ||||
| 	 | ||||
|  | @ -589,7 +579,7 @@ void collect_shrink_info(ntfs_resize_t *resize, runlist *rl) | |||
|  * | ||||
|  * 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; | ||||
| 	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 | ||||
|  * 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; | ||||
| 
 | ||||
|  | @ -670,7 +660,7 @@ void walk_attributes(ntfs_resize_t *resize) | |||
|  * Compare two bitmaps.  In this case, $Bitmap as read from the disk and | ||||
|  * 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; | ||||
| 	int mismatch = 0; | ||||
|  | @ -739,7 +729,7 @@ void compare_bitmaps(struct bitmap *a) | |||
|  * | ||||
|  * 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->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. | ||||
|  */ | ||||
| void progress_update(struct progress_bar *p, u64 current) | ||||
| static void progress_update(struct progress_bar *p, u64 current) | ||||
| { | ||||
| 	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 | ||||
|  * 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 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; | ||||
| 	 | ||||
|  | @ -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 | ||||
|  * 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 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 | ||||
|  */ | ||||
| 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->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 | ||||
|  * 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++) | ||||
| 		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 | ||||
|  * "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; | ||||
| 	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 | ||||
|  * 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; | ||||
| 	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 | ||||
|  * 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; | ||||
| 	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 | ||||
|  */ | ||||
| void truncate_bitmap_data_attr(ntfs_resize_t *resize) | ||||
| static void truncate_bitmap_data_attr(ntfs_resize_t *resize) | ||||
| { | ||||
| 	ATTR_RECORD *a; | ||||
| 	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 | ||||
|  * (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; | ||||
| 	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 | ||||
|  * 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)) | ||||
| 		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. | ||||
|  */ | ||||
| void truncate_badclust_file(s64 nr_clusters) | ||||
| static void truncate_badclust_file(s64 nr_clusters) | ||||
| { | ||||
| 	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. | ||||
|  */ | ||||
| void truncate_bitmap_file(ntfs_resize_t *resize) | ||||
| static void truncate_bitmap_file(ntfs_resize_t *resize) | ||||
| { | ||||
| 	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 | ||||
|  * end of the disk. | ||||
|  */ | ||||
| void setup_lcn_bitmap(void) | ||||
| static void setup_lcn_bitmap(void) | ||||
| { | ||||
| 	/* Determine lcn bitmap byte size and allocate it. */ | ||||
| 	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 | ||||
|  */ | ||||
| void update_bootsector(s64 nr_clusters) | ||||
| static void update_bootsector(s64 nr_clusters) | ||||
| { | ||||
| 	NTFS_BOOT_SECTOR bs; | ||||
| 
 | ||||
|  | @ -1248,9 +1238,9 @@ void update_bootsector(s64 nr_clusters) | |||
| /**
 | ||||
|  * 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. | ||||
|  */ | ||||
| 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", | ||||
| 	       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. | ||||
|  */ | ||||
| void print_disk_usage(ntfs_resize_t *resize) | ||||
| static void print_disk_usage(ntfs_resize_t *resize) | ||||
| { | ||||
| 	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 | ||||
|  * the volume (load the metadata into memory). | ||||
|  */ | ||||
| void mount_volume(void) | ||||
| static void mount_volume(void) | ||||
| { | ||||
| 	unsigned long mntflag; | ||||
| 
 | ||||
|  | @ -1348,7 +1338,7 @@ void mount_volume(void) | |||
|  * 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. | ||||
|  */ | ||||
| void prepare_volume_fixup(void) | ||||
| static void prepare_volume_fixup(void) | ||||
| { | ||||
| 	u16 flags; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue