⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nttools.c

📁 NTFS(NT文件系统) for Linux的一个实现源码
💻 C
字号:
/* *  nttools.c *  Helper functions for the tools * *  Copyright (C) 1995-1997, 1999 Martin von L鰓is *  Copyright (C) 1997 R間is Duchesne */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "ntfstypes.h"#include "struct.h"#include "nttools.h"#include <stdio.h>#ifdef HAVE_FCNTL_H#include <fcntl.h>#endif#ifdef HAVE_IO_H#include <io.h>#endif#include <errno.h>#ifdef HAVE_UNISTD_H#include <unistd.h>#endif#include <sys/stat.h>#include <sys/types.h>#include <stdarg.h>#include <time.h>#include <ctype.h>#include <stdlib.h>#include <string.h>#include "super.h"#include "inode.h"#include "dir.h"#include "macros.h"#include "support.h"#include "util.h"ntfs_size_t ntfs_lseek(int fd, ntfs_size_t offset, int whence){#ifdef __linux__        /* Linux should have llseek, although glibc does not have a prototype */	loff_t llseek(int,loff_t, int);	return llseek(fd,(loff_t)offset,whence);#else	return lseek(fd,(off_t)offset,whence);#endif}void ntfs_release_cluster(void *data){	free(data);}int open_volume(char *name){	/* binary for win32 support */#ifndef O_BINARY#define O_BINARY 0#endif	int fd=open(name,O_RDWR|O_BINARY);	if(fd==-1 && errno==EACCES){		fprintf(stderr,"RW denied, trying RO\n");		fd=open(name,O_RDONLY);	}	if(fd==-1)	{		perror("open");		exit(0);	}	return fd;}ntfs_volume *the_vol;ntfs_volume *ntfs_open_volume(char *file, int bias, int silent, int no_inodes){	int fd;	char cluster0[512];	ntfs_io io;	ntfs_volume *newvol;	char *debug;	/* Set debugging level. */	debug = getenv ("NTFSDEBUG");	if (debug) {		extern int ntdebug;		ntdebug = atoi (debug);	}	io.fn_put=0;	io.fn_get=0; /* we don't need copy functions here */	newvol=malloc(sizeof(ntfs_volume));        newvol->partition_bias=bias;#ifdef NTFS_VOLUME	NTFS_FD(newvol)=fd=open_volume(file=file?file:NTFS_VOLUME);#else	if(!file){		fprintf(stderr,"No volume specified or configured\n");		return 0;	}	NTFS_FD(newvol)=fd=open_volume(file);#endif	if(fd<0)	{			return 0;	}	/* read the boot sector */	io.do_read=1;	io.param=cluster0;	io.size=512;	ntfs_getput_clusters(newvol,0,0,&io);	if(!IS_NTFS_VOLUME(cluster0)){		fprintf(stderr,"Not a NTFS volume:%s\n",file);		the_vol = newvol;		the_vol->clustersize = 512;		return 0;	}	ntfs_init_volume(newvol,cluster0);	/* read the first mft record */	newvol->mft=malloc(newvol->mft_recordsize);	io.do_read=1;	io.param=newvol->mft;	io.size=newvol->mft_recordsize;	ntfs_getput_clusters(newvol,newvol->mft_cluster,0,&io);	/* fix it */	if(!ntfs_check_mft_record(newvol,newvol->mft)){		fprintf(stderr,"MFT record not at cluster 0x%X\n",newvol->mft_cluster);		return 0;	}	if(!silent)		fprintf(stderr,"MFT record at block 0x%X, offset 0x%X\n",newvol->mft_cluster,			newvol->mft_cluster*newvol->clustersize);	if(!no_inodes)		ntfs_load_special_files(newvol);	return newvol;}/* print a unicode string */void uniprint(char *first, int length){	while(length--){		putchar(*first++);		/* character above 255 or not a valid unicode string */		if(*first++){			printf("!!!!Error printing file name\n");			return;		}	}}void uniprint_lower(char *first,int length){	while(length--){		putchar(tolower(*first));		first++;		/* character above 255 or not a valid unicode string */		if(*first++){			printf("!!!!Error printing file name\n");			return;		}	}}/* unit of 100ns since 1.1.1601 */void print_time(ntfs_time64_t t){	ntfs_time64_t sec;	ntfs_time_t unix_utc;	char *str;	sec=t/10000000;	unix_utc=sec-((ntfs_time64_t)369*365+89)*24*3600;	str=ctime(&unix_utc);	/* remove \n */	str[strlen(str)-1]='\0';	printf("%s",str);}/* answer the MFT record number for file name in directory ino */int ntfs_find_file(ntfs_inode *ino, char *name){	char item[1000];	ntfs_iterate_s walk;	int error=ntfs_decodeuni(ino->vol,name,strlen(name),				 &walk.name,&walk.namelen);	if(error)		return -1;	walk.type=BY_NAME;	walk.dir=ino;	walk.result=item;	if(!ntfs_getdir_byname(&walk))return -1;	free(walk.name);	return *(int*)item;}/* * Local variables: * c-file-style: "linux" * End: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -