/**
* ntfscluster - Part of the Linux-NTFS project.
*
* Copyright (c) 2002-2003 Richard Russon
* Copyright (c) 2005 Anton Altaparmakov
* Copyright (c) 2005-2006 Szabolcs Szakacsits
*
* This utility will locate the owner of any given sector or cluster.
*
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (in the main directory of the Linux-NTFS
* distribution in the file COPYING); if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "config.h"
#ifdef HAVE_STDIO_H
#include <stdio.h>
#endif
#ifdef HAVE_GETOPT_H
#include <getopt.h>
#endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
#include "compat.h"
#include "ntfscluster.h"
#include "types.h"
#include "attrib.h"
#include "utils.h"
#include "volume.h"
#include "debug.h"
#include "dir.h"
#include "cluster.h"
#include "version.h"
#include "logging.h"
/**
* version - Print version information about the program
*
* Print a copyright statement and a brief description of the program.
*
* Return: none
*/
static void version(void)
{
ntfs_log_info("\n%s v%s (libntfs %s) - Find the owner of any given sector or "
ntfs_log_info("Copyright (c) 2002-2003 Richard Russon\n");
ntfs_log_info("Copyright (c) 2005 Anton Altaparmakov\n");
ntfs_log_info("Copyright (c) 2005-2006 Szabolcs Szakacsits\n");
}
/**
* usage - Print a list of the parameters to the program
*
* Print a list of the parameters and options for the program.
*
* Return: none
*/
static void usage(void)
{
ntfs_log_info("\nUsage: %s [options] device\n"
" -i, --info Print information about the volume (default)\n"
"\n"
" -c, --cluster RANGE Look for objects in this range of clusters\n"
" -s, --sector RANGE Look for objects in this range of sectors\n"
" -I, --inode NUM Show information about this inode\n"
" -F, --filename NAME Show information about this file\n"
/* " -l, --last Find the last file on the volume\n" */
"\n"
" -f, --force Use less caution\n"
" -q, --quiet Less output\n"
" -v, --verbose More output\n"
" -V, --version Version information\n"
" -h, --help Print this help\n\n",
}
/**
* parse_options - Read and validate the programs command line
*
* Read the command line, verify the syntax and parse the options.
* This function is very long, but quite simple.
*
* Return: 1 Success
* 0 Error, one or more problems
*/
{
};
int c = -1;
int err = 0;
int ver = 0;
int help = 0;
int levels = 0;
opterr = 0; /* We'll handle the errors, thank you. */
switch (c) {
case 1: /* A non-option argument */
} else {
err++;
}
break;
case 'c':
else
break;
case 'F':
} else {
}
break;
case 'f':
break;
case 'h':
case '?':
err++;
break;
}
help++;
break;
case 'I':
err++;
} else {
}
break;
case 'i':
else
break;
case 'l':
else
break;
case 'q':
break;
case 's':
else
break;
case 'v':
break;
case 'V':
ver++;
break;
default:
else
err++;
break;
}
}
/* Make sure we're in sync with the log levels */
if (levels & NTFS_LOG_LEVEL_VERBOSE)
if (!(levels & NTFS_LOG_LEVEL_QUIET))
} else {
if (argc > 1)
ntfs_log_error("You must specify exactly one device.\n");
err++;
}
ntfs_log_error("You may not use --quiet and --verbose at the same time.\n");
err++;
}
ntfs_log_error("You may only specify one action: --info, --cluster, --sector or --last.\n");
err++;
ntfs_log_error("The range must be in ascending order.\n");
err++;
}
}
if (ver)
version();
usage();
}
/**
* info
*/
{
u64 a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u;
int z;
int inuse = 0;
while (mft_next_record(m_ctx) == 0) {
continue;
inuse++;
if (!rec->non_resident)
continue;
{
else
}
}
}
}
a = vol->sector_size;
b = vol->cluster_size;
c = 1 << cps;
e = vol->nr_clusters;
h = inuse;
i = h * 100 / g;
j = fc;
m = fc * 100 / b / e;
n = uc;
q = uc * 100 / b / e;
r = mc;
u = mc * 100 / b / e;
ntfs_log_info("bytes per sector : %llu\n", (unsigned long long)a);
ntfs_log_info("bytes per cluster : %llu\n", (unsigned long long)b);
ntfs_log_info("sectors per cluster : %llu\n", (unsigned long long)c);
ntfs_log_info("bytes per volume : %llu\n", (unsigned long long)d);
ntfs_log_info("sectors per volume : %llu\n", (unsigned long long)e);
ntfs_log_info("clusters per volume : %llu\n", (unsigned long long)f);
ntfs_log_info("initialized mft records : %llu\n", (unsigned long long)g);
ntfs_log_info("mft records in use : %llu\n", (unsigned long long)h);
ntfs_log_info("mft records percentage : %llu\n", (unsigned long long)i);
ntfs_log_info("bytes of free space : %llu\n", (unsigned long long)j);
ntfs_log_info("sectors of free space : %llu\n", (unsigned long long)k);
ntfs_log_info("clusters of free space : %llu\n", (unsigned long long)l);
ntfs_log_info("percentage free space : %llu\n", (unsigned long long)m);
ntfs_log_info("bytes of user data : %llu\n", (unsigned long long)n);
ntfs_log_info("sectors of user data : %llu\n", (unsigned long long)o);
ntfs_log_info("clusters of user data : %llu\n", (unsigned long long)p);
ntfs_log_info("percentage user data : %llu\n", (unsigned long long)q);
ntfs_log_info("bytes of metadata : %llu\n", (unsigned long long)r);
ntfs_log_info("sectors of metadata : %llu\n", (unsigned long long)s);
ntfs_log_info("clusters of metadata : %llu\n", (unsigned long long)t);
ntfs_log_info("percentage metadata : %llu\n", (unsigned long long)u);
return 0;
}
/**
* dump_file
*/
{
int i;
if (rec->non_resident) {
ntfs_log_info("non-resident\n");
if (runs) {
ntfs_log_info(" VCN LCN Length\n");
ntfs_log_info(" %8lld %8lld %8lld\n",
(long long)
}
}
} else {
ntfs_log_info("resident\n");
}
}
return 0;
}
/**
* print_match
*/
{
char *buffer;
return 1;
if (!buffer) {
ntfs_log_error("!buffer\n");
return 1;
}
return 0;
}
/**
* find_last
*/
void *data)
{
struct match *m;
return 1;
m = data;
}
return 0;
}
/**
* main - Begin here
*
* Start from here.
*
* Return: 0 Success, the program worked
* 1 Error, something went wrong
*/
{
struct match m;
return 1;
if (!vol)
return 1;
case act_sector:
ntfs_log_quiet("Searching for sector %llu\n",
(unsigned long long)opts.range_begin);
else
ntfs_log_quiet("Searching for sector range %llu-%llu\n", (unsigned long long)opts.range_begin, (unsigned long long)opts.range_end);
/* Convert to clusters */
break;
case act_cluster:
ntfs_log_quiet("Searching for cluster %llu\n",
(unsigned long long)opts.range_begin);
else
ntfs_log_quiet("Searching for cluster range %llu-%llu\n", (unsigned long long)opts.range_begin, (unsigned long long)opts.range_end);
break;
case act_file:
if (ino)
break;
case act_inode:
if (ino) {
} else {
ntfs_log_error("Cannot open inode %llu\n",
}
break;
case act_last:
memset(&m, 0, sizeof(m));
m.lcn = -1;
if (m.lcn >= 0) {
if (ino) {
} else {
ntfs_log_error("Cannot open inode %llu\n",
(unsigned long long)
}
result = 0;
} else {
result = 1;
}
break;
case act_info:
default:
break;
}
return result;
}