From cfacfc10a53fa3fed112de143048a7c0de025d1c Mon Sep 17 00:00:00 2001 From: "flatcap.org!ntfs" Date: Fri, 10 Oct 2003 23:22:23 +0000 Subject: [PATCH] (Logical change 1.195) --- ntfsprogs/ntfscat.8.in | 90 ++++++++++++++++ ntfsprogs/ntfscat.c | 237 +++++++++++++++++++++++++++++++++++++++++ ntfsprogs/ntfscat.h | 37 +++++++ 3 files changed, 364 insertions(+) create mode 100644 ntfsprogs/ntfscat.8.in create mode 100644 ntfsprogs/ntfscat.c create mode 100644 ntfsprogs/ntfscat.h diff --git a/ntfsprogs/ntfscat.8.in b/ntfsprogs/ntfscat.8.in new file mode 100644 index 00000000..64b76bdf --- /dev/null +++ b/ntfsprogs/ntfscat.8.in @@ -0,0 +1,90 @@ +.\" -*- nroff -*- +.\" Copyright (c) 2003 Richard Russon. All Rights Reserved. +.\" This file may be copied under the terms of the GNU Public License. +.\" +.TH NTFSCAT 8 "October 2003" "Linux-NTFS version @VERSION@" +.SH NAME +ntfscat \- concatenate files and print them on the standard output +.SH SYNOPSIS +.B ntfscat +[ +.I options +] +.B device file +.SH DESCRIPTION +.B ntfscat +will read a file from an NTFS volume and display the contents on the standard output. +.PP +The case of the filename passed to +.B ntfscat +is ignored. +.SH OPTIONS +Below is a summary of all the options that +.B ntfscat +accepts. All options have two equivalent names. The short name is preceded by +.BR \- +and the long name is preceded by +.BR \-\- . +Any single letter options, that don't take an argument, can be combined into a +single command, e.g. +.BR \-fv +is equivalent to +.BR "\-f \-v" . +Long named options can be abbreviated to any unique prefix of their name. +.TP +.B \-f +.br +.ns +.TP +.B \-\-force +This will override some sensible defaults, such as not working with a mounted +volume. Use this option with caution. +.TP +.B \-h +.br +.ns +.TP +.B \-\-help +Show a list of options with a brief description of each one. +.TP +.B \-V +.br +.ns +.TP +.B \-\-version +Show the version number, copyright and license +.BR ntfscat . +.SH EXAMPLES +Display the contents of a file in the root of an NTFS volume. +.RS +.sp +.B ntfscat /dev/hda1 boot.ini +.sp +.RE +Display the contents of a file in a subdirectory of an NTFS volume. +.RS +.sp +.B ntfscat /dev/hda1 /winnt/system32/drivers/etc/hosts +.SH BUGS +.B ntfscat +was written in a short time, to get something "out there". It needs a lot more work. +If you find any bugs, please send an email to +.nh + +.hy +.SH AUTHOR +.B ntfscat +was written by Richard Russon (FlatCap) +.br +If you find this tool useful, make FlatCap happy and send him an email. +.SH AVAILABILITY +.B ntfscat +is part of the linux\-ntfs package and is available from +.br +.nh +http://linux\-ntfs.sourceforge.net/downloads.html +.hy +.SH SEE ALSO +.BR ntfsls (8), +.BR ntfsprogs (8) + diff --git a/ntfsprogs/ntfscat.c b/ntfsprogs/ntfscat.c new file mode 100644 index 00000000..754f2409 --- /dev/null +++ b/ntfsprogs/ntfscat.c @@ -0,0 +1,237 @@ +/** + * ntfscat - Part of the Linux-NTFS project. + * + * Copyright (c) 2003 Richard Russon + * + * This utility will concatenate files and print on the standard output. + * + * This program is free software; you can redistribute it and/or modify + * 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" + +#include +#include +#include +#include + +#include "types.h" +#include "attrib.h" +#include "utils.h" +#include "volume.h" +#include "debug.h" +#include "dir.h" +#include "ntfscat.h" + +static const char *EXEC_NAME = "ntfscat"; +static struct options opts; +static int verbose = 0; +static int quiet = 0; + +GEN_PRINTF (Eprintf, stderr, NULL, FALSE) +GEN_PRINTF (Vprintf, stdout, &verbose, TRUE) +GEN_PRINTF (Qprintf, stdout, &quiet, FALSE) + +/** + * version - Print version information about the program + * + * Print a copyright statement and a brief description of the program. + * + * Return: none + */ +void version (void) +{ + printf ("\n%s v%s - Concatenate files and print on the standard output.\n\n", + EXEC_NAME, VERSION); + printf ("Copyright (c) 2003 Richard Russon\n"); + printf ("\n%s\n%s%s\n", ntfs_gpl, ntfs_bugs, ntfs_home); +} + +/** + * usage - Print a list of the parameters to the program + * + * Print a list of the parameters and options for the program. + * + * Return: none + */ +void usage (void) +{ + printf ("\nUsage: %s [options] device file\n" + " -f --force Use less caution\n" + " -V --version Version information\n" + " -h --help Print this help\n\n", + //" -A --attribute Display this attribute", + //" -I --file Display this file", + //" -F --inode Display this inode", + //" -N --name Display this attribute name", + //" -r --raw Display the compressed or encrypted file", + EXEC_NAME); + printf ("%s%s\n", ntfs_bugs, ntfs_home); +} + +/** + * 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 parse_options (int argc, char **argv) +{ + static const char *sopt = "-fh?V"; // A:F:I:N: + static const struct option lopt[] = { + { "force", no_argument, NULL, 'f' }, + { "help", no_argument, NULL, 'h' }, + { "version", no_argument, NULL, 'V' }, + // { "attribute", required_argument, NULL, 'A' }, + // { "file", required_argument, NULL, 'F' }, + // { "inode", required_argument, NULL, 'I' }, + // { "name", required_argument, NULL, 'N' }, + { NULL, 0, NULL, 0 } + }; + + char c = -1; + int err = 0; + int ver = 0; + int help = 0; + + opterr = 0; /* We'll handle the errors, thank you. */ + + while ((c = getopt_long (argc, argv, sopt, lopt, NULL)) != -1) { + switch (c) { + case 1: /* A non-option argument */ + if (!opts.device) { + opts.device = argv[optind-1]; + } else if (!opts.file) { + opts.file = argv[optind-1]; + } else { + opts.device = NULL; + opts.file = NULL; + err++; + } + break; + case 'f': + opts.force++; + break; + case 'h': + case '?': + help++; + break; + case 'V': + ver++; + break; + default: + Eprintf ("Unknown option '%s'.\n", argv[optind-1]); + err++; + break; + } + } + + if (help || ver) { + } else { + if ((opts.device == NULL) || + (opts.file == NULL)) { + if (argc > 1) + Eprintf ("You must specify one device and one file.\n"); + err++; + } + } + + if (ver) + version(); + if (help || err) + usage(); + + return (!err && !help && !ver); +} + +/** + * cat + */ +int cat (ntfs_volume *vol, ntfs_inode *inode) +{ + const int bufsize = 1024; + char *buffer; + ntfs_attr *attr; + s64 read; + s64 offset; + + buffer = malloc (bufsize); + if (!buffer) + return 1; + + attr = ntfs_attr_open (inode, AT_DATA, NULL, 0); + if (!attr) { + Eprintf ("Cannot cat a directory.\n"); + return 1; + } + + offset = 0; + do { + read = ntfs_attr_pread (attr, offset, bufsize, buffer); + fwrite (buffer, read, 1, stdout); + offset += read; + } while (read > 0); + + ntfs_attr_close (attr); + free (buffer); + return 0; +} + +/** + * main - Begin here + * + * Start from here. + * + * Return: 0 Success, the program worked + * 1 Error, something went wrong + */ +int main (int argc, char *argv[]) +{ + ntfs_volume *vol; + ntfs_inode *inode; + int result = 1; + + if (!parse_options (argc, argv)) + return 1; + + utils_set_locale(); + + vol = utils_mount_volume (opts.device, MS_RDONLY, opts.force); + if (!vol) { + printf ("!vol\n"); + return 1; + } + + inode = utils_pathname_to_inode (vol, NULL, opts.file); + if (!inode) { + printf ("!inode\n"); + return 1; + } + + result = cat (vol, inode); + + ntfs_inode_close (inode); + ntfs_umount (vol, FALSE); + if (result) + ;//printf ("failed\n"); + else + ;//printf ("success\n"); + return result; +} + diff --git a/ntfsprogs/ntfscat.h b/ntfsprogs/ntfscat.h new file mode 100644 index 00000000..81170d2a --- /dev/null +++ b/ntfsprogs/ntfscat.h @@ -0,0 +1,37 @@ +/* + * ntfscat - Part of the Linux-NTFS project. + * + * Copyright (c) 2003 Richard Russon + * + * This utility will concatenate files and print on the standard output. + * + * This program is free software; you can redistribute it and/or modify + * 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 + */ + +#ifndef _NTFSCAT_H_ +#define _NTFSCAT_H_ + +#include "types.h" + +struct options { + char *device; /* Device/File to work with */ + char *file; /* File to display */ + int force; /* Override common sense */ +}; + +#endif /* _NTFSCAT_H_ */ + +